You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by xi...@apache.org on 2026/03/23 22:10:34 UTC
(tinkerpop) 05/07: Replace WebSocket with HTTP in .NET driver (#3315)
This is an automated email from the ASF dual-hosted git repository.
xiazcy pushed a commit to branch dotnet-http
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit e4bc587c90878be5d6e0ce5e524f1dba9dd0e628
Author: Yang Xia <55...@users.noreply.github.com>
AuthorDate: Fri Mar 20 11:36:17 2026 -0700
Replace WebSocket with HTTP in .NET driver (#3315)
Implement non-streaming HTTP in .NET while replacing all WebSocket reference and settings. Message serializers are also updated.
---
.github/workflows/build-test.yml | 68 +-
gremlin-dotnet/build/generate.groovy | 11 +-
gremlin-dotnet/docker-compose.yml | 12 +-
.../src/Gremlin.Net/Driver/Connection.cs | 371 ++---
.../src/Gremlin.Net/Driver/ConnectionFactory.cs | 49 -
.../src/Gremlin.Net/Driver/ConnectionPool.cs | 298 ----
.../Gremlin.Net/Driver/ConnectionPoolSettings.cs | 146 --
.../src/Gremlin.Net/Driver/ConnectionSettings.cs | 88 ++
.../Driver/Exceptions/ConnectionClosedException.cs | 65 -
.../Exceptions/ConnectionPoolBusyException.cs | 60 -
.../Exceptions/NoConnectionAvailableException.cs | 56 -
.../Driver/Exceptions/ResponseException.cs | 25 +-
.../Exceptions/ServerUnavailableException.cs | 45 -
.../src/Gremlin.Net/Driver/GremlinClient.cs | 187 +--
.../Gremlin.Net/Driver/GremlinClientExtensions.cs | 4 +-
.../src/Gremlin.Net/Driver/GremlinServer.cs | 14 +-
.../src/Gremlin.Net/Driver/IClientWebSocket.cs | 43 -
.../src/Gremlin.Net/Driver/IConnection.cs | 39 -
.../src/Gremlin.Net/Driver/IConnectionFactory.cs | 30 -
.../src/Gremlin.Net/Driver/IMessageSerializer.cs | 2 +-
gremlin-dotnet/src/Gremlin.Net/Driver/Log.cs | 16 +-
.../Gremlin.Net/Driver/Messages/RequestMessage.cs | 180 ++-
.../Gremlin.Net/Driver/Messages/ResponseMessage.cs | 49 +-
.../Gremlin.Net/Driver/Messages/ResponseResult.cs | 56 -
.../Gremlin.Net/Driver/Messages/ResponseStatus.cs | 72 -
.../Driver/Messages/ResponseStatusCode.cs | 157 ---
.../src/Gremlin.Net/Driver/ProxyClientWebSocket.cs | 81 --
.../src/Gremlin.Net/Driver/ProxyConnection.cs | 67 -
.../Driver/Remote/DriverRemoteConnection.cs | 55 +-
.../ResponseHandlerForSingleRequestMessage.cs | 65 -
gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs | 48 +-
.../src/Gremlin.Net/Driver/WebSocketConnection.cs | 157 ---
.../src/Gremlin.Net/Driver/WebSocketSettings.cs | 58 -
.../Process/Traversal/GraphTraversal.cs | 6 +-
.../Process/Traversal/GraphTraversalSource.cs | 8 +-
.../Gremlin.Net/Process/Traversal/GremlinLang.cs | 15 +
.../Structure/IO/GraphBinary/DataType.cs | 166 ---
.../Structure/IO/GraphBinary/GraphBinaryReader.cs | 107 --
.../Structure/IO/GraphBinary/GraphBinaryWriter.cs | 150 --
.../Structure/IO/GraphBinary/ITypeSerializer.cs | 102 --
.../IO/GraphBinary/ResponseMessageSerializer.cs | 77 -
.../Structure/IO/GraphBinary/StreamExtensions.cs | 281 ----
.../IO/GraphBinary/TypeSerializerRegistry.cs | 329 -----
.../IO/GraphBinary/Types/ArraySerializer.cs | 65 -
.../IO/GraphBinary/Types/BigDecimalSerializer.cs | 95 --
.../IO/GraphBinary/Types/BigIntegerSerializer.cs | 62 -
.../IO/GraphBinary/Types/BulkSetSerializer.cs | 76 -
.../IO/GraphBinary/Types/ByteBufferSerializer.cs | 61 -
.../IO/GraphBinary/Types/CharSerializer.cs | 87 --
.../IO/GraphBinary/Types/ClassSerializer.cs | 61 -
.../IO/GraphBinary/Types/CustomTypeSerializer.cs | 67 -
.../IO/GraphBinary/Types/DateTimeSerializer.cs | 67 -
.../IO/GraphBinary/Types/DurationSerializer.cs | 61 -
.../IO/GraphBinary/Types/EdgeSerializer.cs | 85 --
.../IO/GraphBinary/Types/EnumSerializer.cs | 149 --
.../Structure/IO/GraphBinary/Types/GremlinType.cs | 49 -
.../IO/GraphBinary/Types/LambdaSerializer.cs | 68 -
.../IO/GraphBinary/Types/ListSerializer.cs | 70 -
.../IO/GraphBinary/Types/MapSerializer.cs | 76 -
.../GraphBinary/Types/OffsetDateTimeSerializer.cs | 80 --
.../Structure/IO/GraphBinary/Types/PSerializer.cs | 112 --
.../IO/GraphBinary/Types/PathSerializer.cs | 74 -
.../IO/GraphBinary/Types/PropertySerializer.cs | 68 -
.../IO/GraphBinary/Types/SetSerializer.cs | 77 -
.../IO/GraphBinary/Types/SimpleTypeSerializer.cs | 125 --
.../IO/GraphBinary/Types/SingleTypeSerializer.cs | 122 --
.../IO/GraphBinary/Types/StringSerializer.cs | 62 -
.../IO/GraphBinary/Types/TraversalSerializer.cs | 60 -
.../Types/TraversalStrategySerializer.cs | 62 -
.../IO/GraphBinary/Types/TraverserSerializer.cs | 60 -
.../IO/GraphBinary/Types/TypeSerializer.cs | 72 -
.../IO/GraphBinary/Types/UuidSerializer.cs | 111 --
.../GraphBinary/Types/VertexPropertySerializer.cs | 77 -
.../IO/GraphBinary/Types/VertexSerializer.cs | 66 -
.../GraphBinary4MessageSerializer.cs} | 46 +-
.../RequestMessageSerializer.cs | 26 +-
.../IO/GraphBinary4/ResponseMessageSerializer.cs | 106 ++
.../IO/GraphSON/GraphSONMessageSerializer.cs | 27 +-
.../IO/GraphSON/RequestMessageSerializer.cs | 8 +-
.../Structure/IO/SerializationTokens.cs | 4 +-
.../CompressionBenchmarks.cs | 28 +-
.../MessageSerializerBenchmarks.cs | 80 +-
.../test/Gremlin.Net.Benchmarks/TestMessages.cs | 1485 +-------------------
.../Docs/Reference/GremlinVariantsTests.cs | 9 +-
.../Docs/Upgrade/Release35Tests.cs | 4 +-
.../Driver/ConnectionPoolTests.cs | 91 --
.../Driver/GremlinClientAuthenticationTests.cs | 119 --
.../GremlinClientBehaviorIntegrationTests.cs | 133 --
.../Driver/GremlinClientTests.cs | 146 +-
.../Driver/MessagesTests.cs | 81 +-
.../Driver/PropertyDeserializationTests.cs | 67 +-
.../Gherkin/CommonSteps.cs | 49 +-
.../Gherkin/GherkinTestRunner.cs | 12 +-
.../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 628 +++++----
.../Gherkin/ScenarioData.cs | 123 +-
.../GraphTraversalSourceTests.cs | 3 +-
.../DriverRemoteConnection/GraphTraversalTests.cs | 12 +-
.../GraphTraversalTransactionTests.cs | 6 +-
.../RemoteConnectionFactory.cs | 7 +-
.../Util/RequestMessageProvider.cs | 23 +-
.../Driver/ConnectionPoolSettingsTests.cs | 70 -
.../Driver/ConnectionPoolTests.cs | 394 ------
.../Gremlin.Net.UnitTest/Driver/ConnectionTests.cs | 488 +++----
.../Driver/DriverRemoteConnectionTests.cs | 169 ++-
.../Driver/GraphSONMessageSerializerTests.cs | 24 +-
.../Driver/GremlinClientTests.cs | 58 +-
.../Driver/GremlinServerTests.cs | 24 +-
.../Driver/Messages/RequestMessageTests.cs | 110 ++
.../Driver/RequestMessageBuilderTests.cs | 9 +-
.../Process/Remote/RemoteTransactionTests.cs | 17 +-
.../Structure/IO/GraphBinary/GraphBinaryTests.cs | 962 -------------
.../IO/GraphBinary/Types/Sample/SamplePerson.cs | 59 -
.../Types/Sample/SamplePersonSerializer.cs | 160 ---
.../Types/Sample/SamplePersonSerializerTests.cs | 128 --
.../GraphBinary4MessageSerializerTests.cs} | 61 +-
.../GraphBinary4/RequestMessageSerializerTests.cs | 93 ++
.../GraphBinary4/ResponseMessageSerializerTests.cs | 210 +++
117 files changed, 2153 insertions(+), 10548 deletions(-)
diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml
index d8db010e3a..05d7151c00 100644
--- a/.github/workflows/build-test.yml
+++ b/.github/workflows/build-test.yml
@@ -339,40 +339,40 @@ jobs:
EXCLUDE="${EXCLUDE_MODULES/,-:gremlin-python},$EXCLUDE_FOR_GLV"
mvn clean install -pl $EXCLUDE -q -DskipTests -Dci
mvn verify -pl gremlin-python
-# dotnet:
-# name: .NET
-# timeout-minutes: 20
-# needs: cache-gremlin-server-docker-image
-# runs-on: ubuntu-latest
-# steps:
-# - uses: actions/checkout@v6
-# - name: Set up JDK11
-# uses: actions/setup-java@v5
-# with:
-# java-version: '11'
-# distribution: 'temurin'
-# - name: Set up .NET 8.0.x
-# uses: actions/setup-dotnet@v4
-# with:
-# dotnet-version: '8.0.x'
-# - name: Get Cached Server Base Image
-# uses: actions/cache@v5
-# id: gremlin-server-test-docker-image
-# with:
-# path: |
-# ./gremlin-server/*
-# ~/.m2/repository/org/apache/tinkerpop/*
-# key: ${{ github.sha }}
-# - name: Load Docker Image
-# working-directory: ./gremlin-server
-# run: docker load --input gremlin-server.tar
-# - name: Build with Maven
-# run: |
-# touch gremlin-dotnet/src/.glv
-# touch gremlin-dotnet/test/.glv
-# EXCLUDE="${EXCLUDE_MODULES/-:gremlin-dotnet-source,-:gremlin-dotnet-tests,},$EXCLUDE_FOR_GLV"
-# mvn clean install -pl $EXCLUDE -q -DskipTests -Dci
-# mvn verify -pl :gremlin-dotnet,:gremlin-dotnet-tests -P gremlin-dotnet
+ dotnet:
+ name: .NET
+ timeout-minutes: 20
+ needs: cache-gremlin-server-docker-image
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Set up JDK11
+ uses: actions/setup-java@v5
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+ - name: Set up .NET 8.0.x
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.0.x'
+ - name: Get Cached Server Base Image
+ uses: actions/cache@v5
+ id: gremlin-server-test-docker-image
+ with:
+ path: |
+ ./gremlin-server/*
+ ~/.m2/repository/org/apache/tinkerpop/*
+ key: ${{ github.sha }}
+ - name: Load Docker Image
+ working-directory: ./gremlin-server
+ run: docker load --input gremlin-server.tar
+ - name: Build with Maven
+ run: |
+ touch gremlin-dotnet/src/.glv
+ touch gremlin-dotnet/test/.glv
+ EXCLUDE="${EXCLUDE_MODULES/-:gremlin-dotnet-source,-:gremlin-dotnet-tests,},$EXCLUDE_FOR_GLV"
+ mvn clean install -pl $EXCLUDE -q -DskipTests -Dci
+ mvn verify -pl :gremlin-dotnet,:gremlin-dotnet-tests -P gremlin-dotnet
neo4j-gremlin:
name: neo4j-gremlin
timeout-minutes: 20
diff --git a/gremlin-dotnet/build/generate.groovy b/gremlin-dotnet/build/generate.groovy
index 27ae264c70..24bc271ad5 100644
--- a/gremlin-dotnet/build/generate.groovy
+++ b/gremlin-dotnet/build/generate.groovy
@@ -139,9 +139,16 @@ radishGremlinFile.withWriter('UTF-8') { Writer writer ->
' Func<GraphTraversalSource, IDictionary<string, object>, ITraversal> f = list[0];\n' +
' list.RemoveAt(0);\n' +
' ITraversal traversal = f.Invoke(g, parameters);\n' +
- ' foreach (var sideEffect in sideEffects)\n' +
+ ' // Side effects need to be prepended as source steps (before traversal steps).\n' +
+ ' // Build them in a temporary GremlinLang and prepend to the traversal\'s gremlin string.\n' +
+ ' if (sideEffects.Count > 0)\n' +
' {\n' +
- ' traversal.Bytecode.AddSource("withSideEffect", sideEffect.Key, sideEffect.Value);\n' +
+ ' var sideEffectLang = new GremlinLang();\n' +
+ ' foreach (var sideEffect in sideEffects)\n' +
+ ' {\n' +
+ ' sideEffectLang.AddSource("withSideEffect", sideEffect.Key, sideEffect.Value);\n' +
+ ' }\n' +
+ ' traversal.GremlinLang.Gremlin = sideEffectLang.Gremlin + traversal.GremlinLang.Gremlin;\n' +
' }\n' +
' return traversal;\n' +
' }\n' +
diff --git a/gremlin-dotnet/docker-compose.yml b/gremlin-dotnet/docker-compose.yml
index 3a1859cf84..a2a9343dc1 100644
--- a/gremlin-dotnet/docker-compose.yml
+++ b/gremlin-dotnet/docker-compose.yml
@@ -35,13 +35,11 @@ services:
- ${HOME}/.m2:/root/.m2
- ${ABS_PROJECT_HOME}/gremlin-test/target:/opt/gremlin-test
healthcheck:
- test: [ "CMD-SHELL", "apk add curl && curl -f http://localhost:45940?gremlin=100-1" ]
+ test: [ "CMD-SHELL", "apk add curl && curl -X POST -d '{\"gremlin\":\"g.inject(1)\"}' http://localhost:45940" ]
interval: 30s
timeout: 10s
retries: 30
start_period: 30s
- depends_on:
- - gremlin-socket-server
gremlin-dotnet-integration-tests:
container_name: gremlin-dotnet-integration-tests
@@ -49,6 +47,7 @@ services:
volumes:
- .:/gremlin-dotnet
- ../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features:/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features
+ - ../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io:/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io
- ../docker/gremlin-test-server:/gremlin-dotnet/gremlin-test-server
- ../gremlin-tools/gremlin-socket-server/conf:/gremlin-dotnet/gremlin-socket-server/conf/
environment:
@@ -72,10 +71,3 @@ services:
depends_on:
gremlin-server-test-dotnet:
condition: service_healthy
-
- gremlin-socket-server:
- container_name: gremlin-socket-server
- image: tinkerpop/gremlin-socket-server:${GREMLIN_SERVER}
- ports:
- - "45943:45943"
-
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs
index 05f92e3aa4..883d1c2bab 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs
@@ -22,306 +22,173 @@
#endregion
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
-using System.Text;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Net.Http;
+using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using Gremlin.Net.Driver.Messages;
using Gremlin.Net.Process;
+using Gremlin.Net.Structure.IO;
namespace Gremlin.Net.Driver
{
- internal interface IResponseHandlerForSingleRequestMessage
+ /// <summary>
+ /// HTTP-based connection that sends requests via HTTP POST to Gremlin Server.
+ /// </summary>
+ internal class Connection : IDisposable
{
- void HandleReceived(ResponseMessage<List<object>> received);
- void Finalize(Dictionary<string, object> statusAttributes);
- void HandleFailure(Exception objException);
- void Cancel();
- }
+ private const string GraphBinaryMimeType = SerializationTokens.GraphBinary4MimeType;
- internal class Connection : IConnection
- {
- private readonly IMessageSerializer _messageSerializer;
+ private readonly HttpClient _httpClient;
private readonly Uri _uri;
- private readonly IWebSocketConnection _webSocketConnection;
- private readonly string? _username;
- private readonly string? _password;
- private readonly string? _sessionId;
- private readonly bool _sessionEnabled;
-
- private readonly ConcurrentQueue<(RequestMessage msg, CancellationToken cancellationToken)> _writeQueue = new();
-
- private readonly ConcurrentDictionary<Guid, IResponseHandlerForSingleRequestMessage> _callbackByRequestId =
- new();
-
- private readonly ConcurrentDictionary<Guid, CancellationTokenRegistration> _cancellationByRequestId = new();
- private int _connectionState = 0;
- private int _writeInProgress = 0;
- private const int Closed = 1;
-
- public Connection(IWebSocketConnection webSocketConnection, Uri uri, string? username, string? password,
- IMessageSerializer messageSerializer, string? sessionId)
+ private readonly IMessageSerializer _serializer;
+ private readonly ConnectionSettings _settings;
+ // Interceptor slot reserved for future spec
+ // private readonly IReadOnlyList<Func<HttpRequestMessage, Task>> _interceptors;
+
+ /// <summary>
+ /// Creates a new HTTP connection. The <see cref="HttpClient"/> is backed by
+ /// SocketsHttpHandler which manages its own TCP connection pool internally,
+ /// so a single <see cref="Connection"/> instance handles concurrent requests efficiently.
+ /// </summary>
+ public Connection(Uri uri, IMessageSerializer serializer,
+ ConnectionSettings settings)
{
_uri = uri;
- _username = username;
- _password = password;
- _sessionId = sessionId;
- if (!string.IsNullOrEmpty(sessionId))
- {
- _sessionEnabled = true;
- }
- _messageSerializer = messageSerializer;
- _webSocketConnection = webSocketConnection;
- }
-
- public async Task ConnectAsync(CancellationToken cancellationToken)
- {
- await _webSocketConnection.ConnectAsync(_uri, cancellationToken).ConfigureAwait(false);
- BeginReceiving();
- }
-
- public int NrRequestsInFlight => _callbackByRequestId.Count;
+ _serializer = serializer;
+ _settings = settings;
- public bool IsOpen => _webSocketConnection.IsOpen && Volatile.Read(ref _connectionState) != Closed;
-
- public Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage, CancellationToken cancellationToken)
- {
- var receiver = new ResponseHandlerForSingleRequestMessage<T>();
- _callbackByRequestId.GetOrAdd(requestMessage.RequestId, receiver);
-
- _cancellationByRequestId.GetOrAdd(requestMessage.RequestId, cancellationToken.Register(() =>
- {
- if (_callbackByRequestId.TryRemove(requestMessage.RequestId, out var responseHandler))
- {
- responseHandler.Cancel();
- }
- }));
- _writeQueue.Enqueue((requestMessage, cancellationToken));
- BeginSendingMessages();
- return receiver.Result;
- }
-
- private void BeginReceiving()
- {
- var state = Volatile.Read(ref _connectionState);
- if (state == Closed) return;
- ReceiveMessagesAsync().Forget();
+#if NET6_0_OR_GREATER
+ var handler = new SocketsHttpHandler
+ {
+ PooledConnectionIdleTimeout = settings.IdleConnectionTimeout,
+ MaxConnectionsPerServer = settings.MaxConnectionsPerServer,
+ ConnectTimeout = settings.ConnectionTimeout,
+ KeepAlivePingTimeout = settings.KeepAliveInterval,
+ };
+ _httpClient = new HttpClient(handler);
+#else
+ _httpClient = new HttpClient();
+ _httpClient.Timeout = settings.ConnectionTimeout;
+#endif
}
- private async Task ReceiveMessagesAsync()
+ /// <summary>
+ /// Constructor that accepts a pre-configured HttpClient (for testing).
+ /// </summary>
+ internal Connection(Uri uri, IMessageSerializer serializer,
+ ConnectionSettings settings, HttpClient httpClient)
{
- while (true)
- {
- try
- {
- var received = await _webSocketConnection.ReceiveMessageAsync().ConfigureAwait(false);
- await HandleReceivedAsync(received).ConfigureAwait(false);
- }
- catch (Exception e)
- {
- await CloseConnectionBecauseOfFailureAsync(e).ConfigureAwait(false);
- break;
- }
- }
+ _uri = uri;
+ _serializer = serializer;
+ _settings = settings;
+ _httpClient = httpClient;
}
- private async Task HandleReceivedAsync(byte[] received)
+ public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage,
+ CancellationToken cancellationToken = default)
{
- var receivedMsg = await _messageSerializer.DeserializeMessageAsync(received).ConfigureAwait(false);
- if (receivedMsg == null)
- {
- throw new InvalidOperationException(
- "Received data deserialized into null object message. Cannot operate on it.");
- }
+ var requestBytes = await _serializer.SerializeMessageAsync(requestMessage, cancellationToken)
+ .ConfigureAwait(false);
- try
- {
- HandleReceivedMessage(receivedMsg);
- }
- catch (Exception e)
- {
- if (receivedMsg!.RequestId != null)
- {
- if(_callbackByRequestId.TryRemove(receivedMsg.RequestId.Value, out var responseHandler))
- {
- responseHandler?.HandleFailure(e);
-
- }
- if (_cancellationByRequestId.TryRemove(receivedMsg.RequestId.Value, out var cancellation))
- {
- cancellation.Dispose();
- }
- }
- }
- }
+ using var content = new ByteArrayContent(requestBytes);
+ content.Headers.ContentType = new MediaTypeHeaderValue(GraphBinaryMimeType);
- private void HandleReceivedMessage(ResponseMessage<List<object>> receivedMsg)
- {
- var status = receivedMsg.Status;
- status.ThrowIfStatusIndicatesError();
+ using var httpRequest = new HttpRequestMessage(HttpMethod.Post, _uri);
+ httpRequest.Content = content;
+ httpRequest.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(GraphBinaryMimeType));
- if (status.Code == ResponseStatusCode.Authenticate)
+ if (_settings.EnableCompression)
{
- Authenticate();
- return;
+ httpRequest.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
}
- if (receivedMsg.RequestId == null) return;
-
- _callbackByRequestId.TryGetValue(receivedMsg.RequestId.Value, out var responseHandler);
- if (status.Code != ResponseStatusCode.NoContent)
+ if (_settings.EnableUserAgentOnConnect)
{
- responseHandler?.HandleReceived(receivedMsg);
+ httpRequest.Headers.TryAddWithoutValidation("User-Agent", Utils.UserAgent);
}
- if (status.Code == ResponseStatusCode.Success || status.Code == ResponseStatusCode.NoContent)
+ if (_settings.BulkResults)
{
- if (_cancellationByRequestId.TryRemove(receivedMsg.RequestId.Value, out var cancellation))
- {
- cancellation.Dispose();
- }
- responseHandler?.Finalize(status.Attributes);
- _callbackByRequestId.TryRemove(receivedMsg.RequestId.Value, out _);
+ httpRequest.Headers.Add("bulkResults", "true");
}
- }
- private void Authenticate()
- {
- if (string.IsNullOrEmpty(_username) || string.IsNullOrEmpty(_password))
- throw new InvalidOperationException(
- $"The Gremlin Server requires authentication, but no credentials are specified - username: {_username}, password: {_password}.");
-
- var message = RequestMessage.Build(Tokens.OpsAuthentication).Processor(Tokens.ProcessorTraversal)
- .AddArgument(Tokens.ArgsSasl, SaslArgument()).Create();
+ // Future: apply interceptors here
- _writeQueue.Enqueue((message, CancellationToken.None));
- BeginSendingMessages();
- }
+ using var response = await _httpClient.SendAsync(httpRequest, cancellationToken)
+ .ConfigureAwait(false);
- private string SaslArgument()
- {
- var auth = $"\0{_username}\0{_password}";
- var authBytes = Encoding.UTF8.GetBytes(auth);
- return Convert.ToBase64String(authBytes);
- }
+ // If the HTTP status indicates an error and the response is not GraphBinary,
+ // attempt to read the body as a text error message. The server may respond with
+ // a JSON body containing an error field, or plain text. Only when the Content-Type
+ // is GraphBinary do we fall through to normal deserialization so the status footer
+ // in the GB4 response can surface the application-level error.
+ if (!response.IsSuccessStatusCode &&
+ response.Content.Headers.ContentType?.MediaType != GraphBinaryMimeType)
+ {
+ var errorBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
- private void BeginSendingMessages()
- {
- if (Interlocked.CompareExchange(ref _writeInProgress, 1, 0) != 0)
- return;
- SendMessagesFromQueueAsync().Forget();
- }
+ // Try to extract the "message" field from a JSON error response
+ var errorMessage = TryExtractJsonError(errorBody)
+ ?? $"Gremlin Server returned HTTP {(int)response.StatusCode}: {errorBody}";
- private async Task SendMessagesFromQueueAsync()
- {
- while (_writeQueue.TryDequeue(out var msg))
- {
- try
- {
- await SendMessageAsync(msg.msg, msg.cancellationToken).ConfigureAwait(false);
- }
- catch (OperationCanceledException e) when (msg.cancellationToken == e.CancellationToken)
- {
- // Send was cancelled for this message -> silently catch as we want to continue sending from this
- // connection. The task responsible for submitting this message will be cancelled by the
- // `ResponseHandlerForSingleRequestMessage`.
- }
- catch (Exception e)
- {
- await CloseConnectionBecauseOfFailureAsync(e).ConfigureAwait(false);
- break;
- }
+ throw new HttpRequestException(errorMessage);
}
- Interlocked.CompareExchange(ref _writeInProgress, 0, 1);
- // Since the loop ended and the write in progress was set to 0
- // a new item could have been added, write queue can contain items at this time
- if (!_writeQueue.IsEmpty && Interlocked.CompareExchange(ref _writeInProgress, 1, 0) == 0)
- {
- await SendMessagesFromQueueAsync().ConfigureAwait(false);
- }
- }
+ var responseBytes = await ReadResponseBytesAsync(response).ConfigureAwait(false);
- private async Task CloseConnectionBecauseOfFailureAsync(Exception exception)
- {
- EmptyWriteQueue();
- await CloseAsync().ConfigureAwait(false);
- NotifyAboutConnectionFailure(exception);
- }
+ var responseMessage = await _serializer.DeserializeMessageAsync(responseBytes, cancellationToken)
+ .ConfigureAwait(false);
- private void EmptyWriteQueue()
- {
- while (_writeQueue.TryDequeue(out _))
- {
- }
+ return BuildResultSet<T>(responseMessage);
}
- private void NotifyAboutConnectionFailure(Exception exception)
+ private static async Task<byte[]> ReadResponseBytesAsync(HttpResponseMessage response)
{
- foreach (var cb in _callbackByRequestId.Values)
+ using var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
+ if (response.Content.Headers.ContentEncoding.Contains("deflate"))
{
- cb.HandleFailure(exception);
+ using var deflateStream = new DeflateStream(stream, CompressionMode.Decompress);
+ using var ms = new MemoryStream();
+ await deflateStream.CopyToAsync(ms).ConfigureAwait(false);
+ return ms.ToArray();
}
- _callbackByRequestId.Clear();
- DisposeCancellationRegistrations();
+ using var memoryStream = new MemoryStream();
+ await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
+ return memoryStream.ToArray();
}
- private async Task SendMessageAsync(RequestMessage message, CancellationToken cancellationToken)
+ private static ResultSet<T> BuildResultSet<T>(ResponseMessage<List<object>> responseMessage)
{
- if (_sessionEnabled)
- {
- message = RebuildSessionMessage(message);
- }
-
- var serializedMsg = await _messageSerializer.SerializeMessageAsync(message, cancellationToken)
- .ConfigureAwait(false);
-#if NET6_0_OR_GREATER
- if (message.Processor == Tokens.OpsAuthentication)
- {
- // Don't compress a message that contains credentials to prevent attacks like CRIME or BREACH
- await _webSocketConnection.SendMessageUncompressedAsync(serializedMsg, cancellationToken).ConfigureAwait(false);
- return;
- }
-#endif
- await _webSocketConnection.SendMessageAsync(serializedMsg, cancellationToken).ConfigureAwait(false);
+ return new ResultSet<T>(
+ responseMessage.Result.Cast<T>().ToList(),
+ new Dictionary<string, object>());
}
- private RequestMessage RebuildSessionMessage(RequestMessage message)
+ /// <summary>
+ /// Attempts to extract an error message from a JSON response body.
+ /// The server sometimes responds with a JSON object containing a "message" field
+ /// even when it cannot produce a GraphBinary response.
+ /// </summary>
+ private static string? TryExtractJsonError(string body)
{
- if (message.Processor == Tokens.OpsAuthentication)
+ try
{
- return message;
+ using var doc = System.Text.Json.JsonDocument.Parse(body);
+ if (doc.RootElement.TryGetProperty("message", out var messageProp))
+ {
+ return messageProp.GetString();
+ }
}
-
- var msgBuilder = RequestMessage.Build(message.Operation)
- .OverrideRequestId(message.RequestId).Processor(Tokens.ProcessorSession);
- foreach(var kv in message.Arguments)
+ catch
{
- msgBuilder.AddArgument(kv.Key, kv.Value);
+ // Not valid JSON — fall through to raw body
}
- msgBuilder.AddArgument(Tokens.ArgsSession, _sessionId!);
- return msgBuilder.Create();
- }
-
- public async Task CloseAsync()
- {
- Interlocked.Exchange(ref _connectionState, Closed);
-
- if (_sessionEnabled)
- {
- await CloseSession().ConfigureAwait(false);
- }
-
- await _webSocketConnection.CloseAsync().ConfigureAwait(false);
- }
-
- private async Task CloseSession()
- {
- // build a request to close this session
- var msg = RequestMessage.Build(Tokens.OpsClose).Processor(Tokens.ProcessorSession).Create();
-
- await SendMessageAsync(msg, CancellationToken.None).ConfigureAwait(false);
+ return null;
}
#region IDisposable Support
@@ -340,22 +207,12 @@ namespace Gremlin.Net.Driver
{
if (disposing)
{
- _webSocketConnection?.Dispose();
- DisposeCancellationRegistrations();
+ _httpClient?.Dispose();
}
_disposed = true;
}
}
- private void DisposeCancellationRegistrations()
- {
- foreach (var cancellation in _cancellationByRequestId.Values)
- {
- cancellation.Dispose();
- }
- _cancellationByRequestId.Clear();
- }
-
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionFactory.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionFactory.cs
deleted file mode 100644
index 6a9b06f659..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionFactory.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-namespace Gremlin.Net.Driver
-{
- internal class ConnectionFactory : IConnectionFactory
- {
- private readonly WebSocketSettings _webSocketSettings;
- private readonly GremlinServer _gremlinServer;
- private readonly string? _sessionId;
- private readonly IMessageSerializer _messageSerializer;
-
- public ConnectionFactory(GremlinServer gremlinServer, IMessageSerializer messageSerializer,
- WebSocketSettings webSocketSettings, string? sessionId)
- {
- _gremlinServer = gremlinServer;
- _messageSerializer = messageSerializer;
- _sessionId = sessionId;
- _webSocketSettings = webSocketSettings;
- }
-
- public IConnection CreateConnection()
- {
- return new Connection(
- new WebSocketConnection(ProxyClientWebSocket.CreateClientWebSocket(), _webSocketSettings),
- _gremlinServer.Uri, _gremlinServer.Username, _gremlinServer.Password, _messageSerializer, _sessionId);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs
deleted file mode 100644
index 893f70f771..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPool.cs
+++ /dev/null
@@ -1,298 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver.Exceptions;
-using Gremlin.Net.Process;
-using Microsoft.Extensions.Logging;
-using Polly;
-
-namespace Gremlin.Net.Driver
-{
- internal class ConnectionPool : IDisposable
- {
- private const int ConnectionIndexOverflowLimit = int.MaxValue - 1000000;
-
- private readonly IConnectionFactory _connectionFactory;
- private readonly CopyOnWriteCollection<IConnection> _connections = new CopyOnWriteCollection<IConnection>();
-
- private readonly ConcurrentDictionary<IConnection, byte> _deadConnections =
- new ConcurrentDictionary<IConnection, byte>();
- private readonly ConnectionPoolSettings _settings;
- private readonly ILogger<ConnectionPool> _logger;
- private int _connectionIndex;
- private int _poolState;
- private const int PoolIdle = 0;
- private const int PoolPopulationInProgress = 1;
- private readonly CancellationTokenSource _cts = new CancellationTokenSource();
-
- public ConnectionPool(IConnectionFactory connectionFactory, ConnectionPoolSettings settings,
- ILogger<ConnectionPool> logger)
- {
- _connectionFactory = connectionFactory;
- _settings = settings;
- _logger = logger;
- ReplaceDeadConnectionsAsync().WaitUnwrap();
- }
-
- public int NrConnections => _connections.Count;
-
- public IConnection GetAvailableConnection()
- {
- var connection = Policy.Handle<ServerUnavailableException>()
- .WaitAndRetry(_settings.ReconnectionAttempts, ComputeRetrySleepDuration, onRetry:
- (_, _, retryCount, _) =>
- {
- _logger.CouldNotGetConnectionFromPool(retryCount, _settings.ReconnectionAttempts);
- })
- .Execute(GetConnectionFromPool);
-
- return ProxiedConnection(connection);
- }
-
- private bool IsHealthy => _deadConnections.IsEmpty && _connections.Count == _settings.PoolSize;
-
- private TimeSpan ComputeRetrySleepDuration(int retryAttemptNr)
- {
- return TimeSpan.FromTicks(_settings.ReconnectionBaseDelay.Ticks * (long) Math.Pow(2, retryAttemptNr));
- }
-
- /// <summary>
- /// Replaces dead connections.
- /// </summary>
- /// <returns>True if the pool was repaired, false if repairing was not necessary.</returns>
- private async Task<bool> EnsurePoolIsHealthyAsync()
- {
- if (IsHealthy) return false;
- var poolState = Interlocked.CompareExchange(ref _poolState, PoolPopulationInProgress, PoolIdle);
- if (poolState == PoolPopulationInProgress) return false;
- try
- {
- await ReplaceDeadConnectionsAsync().ConfigureAwait(false);
- }
- finally
- {
- // We need to remove the PoolPopulationInProgress flag again even if an exception occurred, so we don't block the pool population for ever
- Interlocked.CompareExchange(ref _poolState, PoolIdle, PoolPopulationInProgress);
- }
-
- return true;
- }
-
- private async Task ReplaceDeadConnectionsAsync()
- {
- RemoveDeadConnections();
-
- await FillPoolAsync().ConfigureAwait(false);
- }
-
- private void RemoveDeadConnections()
- {
- if (_deadConnections.IsEmpty) return;
-
- foreach (var deadConnection in _deadConnections.Keys)
- {
- if (_connections.TryRemove(deadConnection))
- {
- DefinitelyDestroyConnection(deadConnection);
- }
- }
-
- _deadConnections.Clear();
- }
-
- private async Task FillPoolAsync()
- {
- var nrConnectionsToCreate = _settings.PoolSize - _connections.Count;
- _logger.FillingPool(nrConnectionsToCreate);
- var connectionCreationTasks = new List<Task<IConnection>>(nrConnectionsToCreate);
- try
- {
- for (var i = 0; i < nrConnectionsToCreate; i++)
- {
- connectionCreationTasks.Add(CreateNewConnectionAsync());
- }
-
- var createdConnections = await Task.WhenAll(connectionCreationTasks).ConfigureAwait(false);
- _connections.AddRange(createdConnections);
- }
- catch (Exception)
- {
- // Dispose all connections that were already created
- foreach (var creationTask in connectionCreationTasks)
- {
- if (creationTask.IsCompleted)
- creationTask.Result?.Dispose();
- }
- throw;
- }
-
- if (_disposed)
- {
- await CloseAndRemoveAllConnectionsAsync().ConfigureAwait(false);
- }
- }
-
- private async Task<IConnection> CreateNewConnectionAsync()
- {
- var newConnection = _connectionFactory.CreateConnection();
- try
- {
- await newConnection.ConnectAsync(_cts.Token).ConfigureAwait(false);
- }
- catch (Exception)
- {
- // Dispose created connection if the connection establishment failed
- newConnection.Dispose();
- throw;
- }
- return newConnection;
- }
-
- private IConnection GetConnectionFromPool()
- {
- var connections = _connections.Snapshot;
- if (connections.Length < _settings.PoolSize)
- {
- TriggerReplacementOfDeadConnections();
- }
- if (connections.Length == 0) throw new ServerUnavailableException();
- return TryGetAvailableConnection(connections);
- }
-
- private IConnection TryGetAvailableConnection(IConnection[] connections)
- {
- var index = Interlocked.Increment(ref _connectionIndex);
- ProtectIndexFromOverflowing(index);
-
- var closedConnections = 0;
- for (var i = 0; i < connections.Length; i++)
- {
- var connection = connections[(index + i) % connections.Length];
- if (connection.NrRequestsInFlight >= _settings.MaxInProcessPerConnection) continue;
- if (!connection.IsOpen)
- {
- ReplaceConnection(connection);
- closedConnections++;
- continue;
- }
- return connection;
- }
-
- if (connections.Length > closedConnections)
- {
- throw new ConnectionPoolBusyException(_settings.PoolSize, _settings.MaxInProcessPerConnection);
- }
- else
- {
- throw new ServerUnavailableException();
- }
- }
-
- private void ProtectIndexFromOverflowing(int currentIndex)
- {
- if (currentIndex > ConnectionIndexOverflowLimit)
- Interlocked.Exchange(ref _connectionIndex, 0);
- }
-
- private void ReplaceConnection(IConnection connection)
- {
- RemoveConnectionFromPool(connection);
- TriggerReplacementOfDeadConnections();
- }
-
- private void RemoveConnectionFromPool(IConnection connection)
- {
- _logger.RemovingClosedConnectionFromPool();
- _deadConnections.TryAdd(connection, 0);
- }
-
- private void TriggerReplacementOfDeadConnections()
- {
- ReplaceClosedConnectionsAsync().Forget();
- }
-
- private async Task ReplaceClosedConnectionsAsync()
- {
- var poolWasPopulated = await EnsurePoolIsHealthyAsync().ConfigureAwait(false);
- // Another connection could have been removed already, check if another population is necessary
- if (poolWasPopulated && !_disposed)
- await ReplaceClosedConnectionsAsync().ConfigureAwait(false);
- }
-
- private IConnection ProxiedConnection(IConnection connection)
- {
- return new ProxyConnection(connection, ReplaceConnectionIfItWasClosed);
- }
-
- private void ReplaceConnectionIfItWasClosed(IConnection connection)
- {
- if (connection.IsOpen) return;
- ReplaceConnection(connection);
- }
-
- private async Task CloseAndRemoveAllConnectionsAsync()
- {
- foreach (var connection in _connections.RemoveAndGetAll())
- {
- await connection.CloseAsync().ConfigureAwait(false);
- DefinitelyDestroyConnection(connection);
- }
- }
-
- private void DefinitelyDestroyConnection(IConnection connection)
- {
- connection.Dispose();
- }
-
- #region IDisposable Support
-
- private bool _disposed;
-
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- protected virtual void Dispose(bool disposing)
- {
- if (!_disposed)
- {
- if (disposing)
- {
- _cts.Cancel();
- CloseAndRemoveAllConnectionsAsync().WaitUnwrap();
- _cts.Dispose();
- }
- _disposed = true;
- }
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs
deleted file mode 100644
index 94d16330be..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionPoolSettings.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using Gremlin.Net.Driver.Exceptions;
-
-namespace Gremlin.Net.Driver
-{
- /// <summary>
- /// Holds settings for the <see cref="ConnectionPool"/>.
- /// </summary>
- public class ConnectionPoolSettings
- {
- private int _poolSize = DefaultPoolSize;
- private int _maxInProcessPerConnection = DefaultMaxInProcessPerConnection;
- private int _reconnectionAttempts = DefaultReconnectionAttempts;
- private TimeSpan _reconnectionBaseDelay = DefaultReconnectionBaseDelay;
- private const int DefaultPoolSize = 8;
- private const int DefaultMaxInProcessPerConnection = 16;
- private const int DefaultReconnectionAttempts = 4;
- private static readonly TimeSpan DefaultReconnectionBaseDelay = TimeSpan.FromSeconds(1);
- internal const bool DefaultEnableUserAgentOnConnect = true;
-
- /// <summary>
- /// Gets or sets the size of the connection pool.
- /// </summary>
- /// <exception cref="ArgumentOutOfRangeException">The specified pool size is less than or equal to zero.</exception>
- /// <remarks>
- /// The default value is 8.
- /// </remarks>
- public int PoolSize
- {
- get => _poolSize;
- set
- {
- if (value <= 0)
- throw new ArgumentOutOfRangeException(nameof(PoolSize), $"{nameof(PoolSize)} must be > 0!");
- _poolSize = value;
- }
- }
-
- /// <summary>
- /// Gets or sets the maximum number of in-flight requests that can occur on a connection.
- /// </summary>
- /// <exception cref="ArgumentOutOfRangeException">The specified number is less than or equal to zero.</exception>
- /// <remarks>
- /// The default value is 16. A <see cref="ConnectionPoolBusyException" /> is thrown if this limit is reached
- /// on all connections when a new request comes in.
- /// </remarks>
- public int MaxInProcessPerConnection
- {
- get => _maxInProcessPerConnection;
- set
- {
- if (value <= 0)
- throw new ArgumentOutOfRangeException(nameof(MaxInProcessPerConnection),
- $"{nameof(MaxInProcessPerConnection)} must be > 0!");
- _maxInProcessPerConnection = value;
- }
- }
-
- /// <summary>
- /// Gets or sets the number of attempts to get an open connection from the pool to submit a request.
- /// </summary>
- /// <exception cref="ArgumentOutOfRangeException">The number of attempts specified is less than zero.</exception>
- /// <remarks>
- /// The driver always tries to reconnect to a server in the background after it has noticed that a
- /// connection is dead. This setting only specifies how often the driver will retry to get an open
- /// connection from its pool when no open connection is available to submit a request.
- /// These retries give the driver time to establish new connections to the server that might have been
- /// unavailable temporarily or that might have closed the connections, e.g., because they were idle for some
- /// time.
- ///
- /// The default value is 4. A <see cref="ServerUnavailableException" /> is thrown if the server can still
- /// not be reached after this many retry attempts.
- ///
- /// Setting this to zero means that the exception is thrown immediately when no open connection is available
- /// to submit a request. The driver will however still try to reconnect to the server in the background for
- /// subsequent requests.
- /// </remarks>
- public int ReconnectionAttempts
- {
- get => _reconnectionAttempts;
- set
- {
- if (value < 0)
- throw new ArgumentOutOfRangeException(nameof(ReconnectionAttempts),
- $"{ReconnectionAttempts} must be >= 0!");
- _reconnectionAttempts = value;
- }
- }
-
- /// <summary>
- /// Gets or sets the base delay used for the exponential backoff for the reconnection attempts.
- /// </summary>
- /// <exception cref="ArgumentOutOfRangeException">The specified delay is negative or zero.</exception>
- /// <remarks>
- /// The driver employs an exponential backoff strategy that uses this base delay for its reconnection
- /// attempts. With a base delay of 100 ms for example, retries happen after 100 ms, 200 ms, 400 ms, 800 ms,
- /// and so on, assuming that enough <see cref="ReconnectionAttempts"/> are configured.
- ///
- /// The default value is 1 second.
- /// </remarks>
- public TimeSpan ReconnectionBaseDelay
- {
- get => _reconnectionBaseDelay;
- set
- {
- if (value <= TimeSpan.Zero)
- throw new ArgumentOutOfRangeException(nameof(ReconnectionBaseDelay),
- $"{nameof(ReconnectionBaseDelay)} must be > 0!");
- _reconnectionBaseDelay = value;
- }
- }
-
- /// <summary>
- /// Gets or sets whether a connection pool will send a user agent during web socket handshakes
- /// </summary>
- /// <remarks>
- /// The default value is true. When enabled, user agents will only be sent during the web socket
- /// handshake. User agent follows the form:
- /// [Application Name] [GLV Name].[Version] [Language Runtime Version] [OS].[Version] [CPU Architecture]
- /// </remarks>
- public bool EnableUserAgentOnConnect { get; set; } = DefaultEnableUserAgentOnConnect;
- }
-}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionSettings.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionSettings.cs
new file mode 100644
index 0000000000..0d8df4a6a7
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/ConnectionSettings.cs
@@ -0,0 +1,88 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System;
+
+namespace Gremlin.Net.Driver
+{
+ /// <summary>
+ /// Holds settings for the HTTP connection.
+ /// </summary>
+ public class ConnectionSettings
+ {
+ /// <summary>
+ /// The default TCP connection timeout.
+ /// </summary>
+ public static readonly TimeSpan DefaultConnectionTimeout = TimeSpan.FromSeconds(15);
+
+ /// <summary>
+ /// The default idle connection timeout.
+ /// </summary>
+ public static readonly TimeSpan DefaultIdleConnectionTimeout = TimeSpan.FromSeconds(180);
+
+ /// <summary>
+ /// The default maximum connections per server.
+ /// </summary>
+ public const int DefaultMaxConnectionsPerServer = 128;
+
+ /// <summary>
+ /// The default TCP keep-alive probe interval.
+ /// </summary>
+ public static readonly TimeSpan DefaultKeepAliveInterval = TimeSpan.FromSeconds(30);
+
+ /// <summary>
+ /// Gets or sets the TCP connection timeout.
+ /// </summary>
+ public TimeSpan ConnectionTimeout { get; set; } = DefaultConnectionTimeout;
+
+ /// <summary>
+ /// Gets or sets how long idle connections stay in the pool before being closed.
+ /// </summary>
+ public TimeSpan IdleConnectionTimeout { get; set; } = DefaultIdleConnectionTimeout;
+
+ /// <summary>
+ /// Gets or sets the maximum concurrent connections to a single server.
+ /// </summary>
+ public int MaxConnectionsPerServer { get; set; } = DefaultMaxConnectionsPerServer;
+
+ /// <summary>
+ /// Gets or sets the TCP keep-alive probe interval.
+ /// </summary>
+ public TimeSpan KeepAliveInterval { get; set; } = DefaultKeepAliveInterval;
+
+ /// <summary>
+ /// Gets or sets whether to request deflate compression.
+ /// </summary>
+ public bool EnableCompression { get; set; } = false;
+
+ /// <summary>
+ /// Gets or sets whether to send the User-Agent header.
+ /// </summary>
+ public bool EnableUserAgentOnConnect { get; set; } = true;
+
+ /// <summary>
+ /// Gets or sets whether to send the bulkResults: true header on all requests.
+ /// </summary>
+ public bool BulkResults { get; set; } = false;
+ }
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ConnectionClosedException.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ConnectionClosedException.cs
deleted file mode 100644
index 99912c972d..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ConnectionClosedException.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Net.WebSockets;
-
-namespace Gremlin.Net.Driver.Exceptions
-{
- /// <summary>
- /// The exception that is thrown for requests that in-flight when the underlying websocket is closed by the server.
- /// Requests that receive this exception will be in a non-deterministic state and may need to be retried.
- /// </summary>
- /// <remarks>
- /// It is recommended to use the same request retry policy that is applied when a <see cref="System.Net.WebSockets.WebSocketException" />,
- /// <see cref="System.Net.Sockets.SocketException"/>, <see cref="System.IO.IOException" />.
- /// </remarks>
- public class ConnectionClosedException : Exception
- {
- /// <summary>
- /// Gets the well-known WebSocket close status code provided by the server.
- /// </summary>
- public WebSocketCloseStatus? Status { get; }
-
- /// <summary>
- /// Gets the Websocket closure description provided by the server.
- /// </summary>
- public string? Description { get; }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="ConnectionClosedException" /> class.
- /// </summary>
- public ConnectionClosedException(WebSocketCloseStatus? status, string? description)
- : base(CreateMessage(status, description))
- {
- Status = status;
- Description = description;
- }
-
- private static string CreateMessage(WebSocketCloseStatus? status, string? description)
- {
- return $"Connection closed by server. CloseStatus: {status?.ToString() ?? "<none>"}, CloseDescription: {description ?? "<none>"}." +
- " Any in-progress requests on the connection will be in an unknown state, and may need to be retried.";
- }
- }
-}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ConnectionPoolBusyException.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ConnectionPoolBusyException.cs
deleted file mode 100644
index 7c25cf44d0..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ConnectionPoolBusyException.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-namespace Gremlin.Net.Driver.Exceptions
-{
- /// <summary>
- /// The exception that is thrown when all connections in the pool have reached their maximum number of in-flight
- /// requests.
- /// </summary>
- public class ConnectionPoolBusyException : NoConnectionAvailableException
- {
- /// <summary>
- /// Gets the size of the connection pool.
- /// </summary>
- public int PoolSize { get; }
-
- /// <summary>
- /// Gets the maximum number of in-flight requests that can occur on a connection.
- /// </summary>
- public int MaxInProcessPerConnection { get; }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="ConnectionPoolBusyException" /> class.
- /// </summary>
- public ConnectionPoolBusyException(int poolSize, int maxInProcessPerConnection)
- : base(CreateMessage(poolSize, maxInProcessPerConnection))
- {
- PoolSize = poolSize;
- MaxInProcessPerConnection = maxInProcessPerConnection;
- }
-
- private static string CreateMessage(int poolSize, int maxInProcessPerConnection)
- {
- return $"All {poolSize} connections have reached their " +
- $"{nameof(ConnectionPoolSettings.MaxInProcessPerConnection)} limit of {maxInProcessPerConnection}." +
- $" Consider increasing either the {nameof(ConnectionPoolSettings.PoolSize)} or the " +
- $"{nameof(ConnectionPoolSettings.MaxInProcessPerConnection)} limit.";
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/NoConnectionAvailableException.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/NoConnectionAvailableException.cs
deleted file mode 100644
index 51f231fbbd..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/NoConnectionAvailableException.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-
-namespace Gremlin.Net.Driver.Exceptions
-{
- /// <summary>
- /// The exception that is thrown when no connection is available to service a request.
- /// </summary>
- public class NoConnectionAvailableException : Exception
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="NoConnectionAvailableException" /> class.
- /// </summary>
- public NoConnectionAvailableException()
- {
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="NoConnectionAvailableException" /> class.
- /// </summary>
- public NoConnectionAvailableException(string message)
- : base(message)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="NoConnectionAvailableException" /> class.
- /// </summary>
- public NoConnectionAvailableException(string message, Exception inner)
- : base(message, inner)
- {
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ResponseException.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ResponseException.cs
index 08e6f2bdca..0dbac9c12a 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ResponseException.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ResponseException.cs
@@ -22,8 +22,6 @@
#endregion
using System;
-using System.Collections.Generic;
-using Gremlin.Net.Driver.Messages;
namespace Gremlin.Net.Driver.Exceptions
{
@@ -35,25 +33,24 @@ namespace Gremlin.Net.Driver.Exceptions
/// <summary>
/// Initializes a new instance of the <see cref="ResponseException" /> class.
/// </summary>
- /// <param name="statusCode">The status code returned by the server.</param>
- /// <param name="statusAttributes">The status attributes from the gremlin response.</param>
- /// <param name="message">The error message string.</param>
- public ResponseException(ResponseStatusCode statusCode,
- IReadOnlyDictionary<string, object> statusAttributes,
- string message) : base(message)
+ /// <param name="statusCode">The status code from the GraphBinary status footer.</param>
+ /// <param name="statusMessage">The status message from the server.</param>
+ /// <param name="serverException">The exception class name from the server, if provided.</param>
+ public ResponseException(int statusCode, string? statusMessage, string? serverException)
+ : base(statusMessage ?? $"Server error: {statusCode}")
{
StatusCode = statusCode;
- StatusAttributes = statusAttributes;
+ ServerException = serverException;
}
/// <summary>
- /// Gets the status code returned from the server.
+ /// Gets the status code from the GraphBinary status footer.
/// </summary>
- public ResponseStatusCode StatusCode { get; }
+ public int StatusCode { get; }
/// <summary>
- /// Gets the status attributes from the gremlin response
+ /// Gets the exception class name from the server, if provided.
/// </summary>
- public IReadOnlyDictionary<string, object> StatusAttributes { get; }
+ public string? ServerException { get; }
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ServerUnavailableException.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ServerUnavailableException.cs
deleted file mode 100644
index bf8bfdf7df..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Exceptions/ServerUnavailableException.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-namespace Gremlin.Net.Driver.Exceptions
-{
- /// <summary>
- /// The exception that is thrown when no connection is available to the <see cref="GremlinServer"/>.
- /// </summary>
- public class ServerUnavailableException : NoConnectionAvailableException
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ServerUnavailableException" /> class.
- /// </summary>
- public ServerUnavailableException()
- : base(CreateMessage())
- {
- }
-
- private static string CreateMessage()
- {
- return
- "No connection to the server available which most likely means that the server is completely unavailable.";
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClient.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClient.cs
index 6589d9c725..b5b43faccf 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClient.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClient.cs
@@ -22,13 +22,10 @@
#endregion
using System;
-using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using Gremlin.Net.Driver.Messages;
-using Gremlin.Net.Structure.IO;
-using Gremlin.Net.Structure.IO.GraphBinary;
-using Gremlin.Net.Structure.IO.GraphSON;
+using Gremlin.Net.Structure.IO.GraphBinary4;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
@@ -39,111 +36,9 @@ namespace Gremlin.Net.Driver
/// </summary>
public class GremlinClient : IGremlinClient
{
- private readonly ConnectionPool _connectionPool;
-
- internal ILoggerFactory LoggerFactory { get; }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="GremlinClient" /> class for the specified Gremlin Server.
- /// </summary>
- /// <param name="gremlinServer">The <see cref="GremlinServer" /> the requests should be sent to.</param>
- /// <param name="graphSONReader">A <see cref="GraphSONReader" /> instance to read received GraphSON data.</param>
- /// <param name="graphSONWriter">a <see cref="GraphSONWriter" /> instance to write GraphSON data.</param>
- /// <param name="connectionPoolSettings">The <see cref="ConnectionPoolSettings" /> for the connection pool.</param>
- /// <param name="webSocketConfiguration">
- /// A delegate that will be invoked with the <see cref="ClientWebSocketOptions" />
- /// object used to configure WebSocket connections.
- /// </param>
- /// <param name="sessionId">The session Id if Gremlin Client in session mode, defaults to null as session-less Client.</param>
- [Obsolete("This constructor is obsolete. Use the constructor that takes a IMessageSerializer instead.")]
- public GremlinClient(GremlinServer gremlinServer, GraphSONReader graphSONReader, GraphSONWriter graphSONWriter,
- ConnectionPoolSettings? connectionPoolSettings = null,
- Action<ClientWebSocketOptions>? webSocketConfiguration = null, string? sessionId = null)
- : this(gremlinServer, graphSONReader, graphSONWriter, SerializationTokens.GraphSON3MimeType,
- connectionPoolSettings, webSocketConfiguration, sessionId)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="GremlinClient" /> class for the specified Gremlin Server.
- /// </summary>
- /// <param name="gremlinServer">The <see cref="GremlinServer" /> the requests should be sent to.</param>
- /// <param name="graphSONReader">A <see cref="GraphSONReader" /> instance to read received GraphSON data.</param>
- /// <param name="graphSONWriter">a <see cref="GraphSONWriter" /> instance to write GraphSON data.</param>
- /// <param name="mimeType">The GraphSON version mime type, defaults to latest supported by the server.</param>
- /// <param name="connectionPoolSettings">The <see cref="ConnectionPoolSettings" /> for the connection pool.</param>
- /// <param name="webSocketConfiguration">
- /// A delegate that will be invoked with the <see cref="ClientWebSocketOptions" />
- /// object used to configure WebSocket connections.
- /// </param>
- /// <param name="sessionId">The session Id if Gremlin Client in session mode, defaults to null as session-less Client.</param>
- [Obsolete("This constructor is obsolete. Use the constructor that takes a IMessageSerializer instead.")]
- public GremlinClient(GremlinServer gremlinServer, GraphSONReader? graphSONReader, GraphSONWriter? graphSONWriter,
- string mimeType, ConnectionPoolSettings? connectionPoolSettings = null,
- Action<ClientWebSocketOptions>? webSocketConfiguration = null, string? sessionId = null)
- {
- IMessageSerializer messageSerializer;
- switch (mimeType)
- {
- case SerializationTokens.GraphSON3MimeType:
- VerifyGraphSONArgumentTypeForMimeType<GraphSON3Reader>(graphSONReader, nameof(graphSONReader),
- mimeType);
- VerifyGraphSONArgumentTypeForMimeType<GraphSON3Writer>(graphSONWriter, nameof(graphSONWriter),
- mimeType);
- messageSerializer = new GraphSON3MessageSerializer(
- (GraphSON3Reader?) graphSONReader ?? new GraphSON3Reader(),
- (GraphSON3Writer?) graphSONWriter ?? new GraphSON3Writer());
- break;
- case SerializationTokens.GraphSON2MimeType:
- VerifyGraphSONArgumentTypeForMimeType<GraphSON2Reader>(graphSONReader, nameof(graphSONReader),
- mimeType);
- VerifyGraphSONArgumentTypeForMimeType<GraphSON2Writer>(graphSONWriter, nameof(graphSONWriter),
- mimeType);
- messageSerializer = new GraphSON2MessageSerializer(
- (GraphSON2Reader?) graphSONReader ?? new GraphSON2Reader(),
- (GraphSON2Writer?) graphSONWriter ?? new GraphSON2Writer());
- break;
- default:
- throw new ArgumentException(nameof(mimeType), $"{mimeType} not supported");
- }
-
- var connectionFactory =
- new ConnectionFactory(gremlinServer, messageSerializer,
- new WebSocketSettings
- {
- WebSocketConfigurationCallback = webSocketConfiguration,
- EnableUserAgentOnConnect = connectionPoolSettings?.EnableUserAgentOnConnect ?? ConnectionPoolSettings.DefaultEnableUserAgentOnConnect
- }, sessionId);
-
- // make sure one connection in pool as session mode
- if (!string.IsNullOrEmpty(sessionId))
- {
- if (connectionPoolSettings != null)
- {
- if (connectionPoolSettings.PoolSize != 1)
- throw new ArgumentOutOfRangeException(nameof(connectionPoolSettings), "PoolSize must be 1 in session mode!");
- }
- else
- {
- connectionPoolSettings = new ConnectionPoolSettings {PoolSize = 1};
- }
- }
-
- LoggerFactory = NullLoggerFactory.Instance;
+ private readonly Connection _connection;
- _connectionPool = new ConnectionPool(connectionFactory,
- connectionPoolSettings ?? new ConnectionPoolSettings(), LoggerFactory.CreateLogger<ConnectionPool>());
- }
-
- private static void VerifyGraphSONArgumentTypeForMimeType<T>(object? argument, string argumentName,
- string mimeType)
- {
- if (argument != null && argument is not T)
- {
- throw new ArgumentException(
- $"{argumentName} is not a {typeof(T).Name} but the mime type is: {mimeType}", argumentName);
- }
- }
+ internal ILoggerFactory LoggerFactory { get; }
/// <summary>
/// Initializes a new instance of the <see cref="GremlinClient" /> class for the specified Gremlin Server.
@@ -153,69 +48,33 @@ namespace Gremlin.Net.Driver
/// A <see cref="IMessageSerializer" /> instance to serialize messages sent to and received
/// from the server.
/// </param>
- /// <param name="connectionPoolSettings">The <see cref="ConnectionPoolSettings" /> for the connection pool.</param>
- /// <param name="webSocketConfiguration">
- /// A delegate that will be invoked with the <see cref="ClientWebSocketOptions" />
- /// object used to configure WebSocket connections.
- /// </param>
- /// <param name="sessionId">The session Id if Gremlin Client in session mode, defaults to null as session-less Client.</param>
- /// <param name="disableCompression">
- /// Whether to disable compression. Compression is only supported since .NET 6.
- /// There it is also enabled by default.
- ///
- /// Note that compression might make your application susceptible to attacks like CRIME/BREACH. Compression
- /// should therefore be turned off if your application sends sensitive data to the server as well as data
- /// that could potentially be controlled by an untrusted user.
- /// </param>
+ /// <param name="connectionSettings">The <see cref="ConnectionSettings" /> for the HTTP connection.</param>
/// <param name="loggerFactory">A factory to create loggers. If not provided, then nothing will be logged.</param>
+ // Interceptor slot reserved for future spec:
+ // IReadOnlyList<Func<HttpRequestMessage, Task>>? interceptors = null,
public GremlinClient(GremlinServer gremlinServer, IMessageSerializer? messageSerializer = null,
- ConnectionPoolSettings? connectionPoolSettings = null,
- Action<ClientWebSocketOptions>? webSocketConfiguration = null, string? sessionId = null,
- bool disableCompression = false, ILoggerFactory? loggerFactory = null)
+ ConnectionSettings? connectionSettings = null,
+ ILoggerFactory? loggerFactory = null)
{
- messageSerializer ??= new GraphBinaryMessageSerializer();
- var webSocketSettings = new WebSocketSettings
- {
- WebSocketConfigurationCallback = webSocketConfiguration,
- EnableUserAgentOnConnect = connectionPoolSettings?.EnableUserAgentOnConnect ?? ConnectionPoolSettings.DefaultEnableUserAgentOnConnect
-#if NET6_0_OR_GREATER
- , UseCompression = !disableCompression
-#endif
- };
- var connectionFactory =
- new ConnectionFactory(gremlinServer, messageSerializer, webSocketSettings, sessionId);
-
- // make sure one connection in pool as session mode
- if (!string.IsNullOrEmpty(sessionId))
- {
- if (connectionPoolSettings != null)
- {
- if (connectionPoolSettings.PoolSize != 1)
- throw new ArgumentOutOfRangeException(nameof(connectionPoolSettings),
- "PoolSize must be 1 in session mode!");
- }
- else
- {
- connectionPoolSettings = new ConnectionPoolSettings {PoolSize = 1};
- }
- }
-
+ messageSerializer ??= new GraphBinary4MessageSerializer();
+ connectionSettings ??= new ConnectionSettings();
LoggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
- _connectionPool = new ConnectionPool(connectionFactory,
- connectionPoolSettings ?? new ConnectionPoolSettings(), LoggerFactory.CreateLogger<ConnectionPool>());
- }
+ _connection = new Connection(
+ gremlinServer.Uri,
+ messageSerializer,
+ connectionSettings);
- /// <summary>
- /// Gets the number of open connections.
- /// </summary>
- public int NrConnections => _connectionPool.NrConnections;
+ var logger = LoggerFactory.CreateLogger<GremlinClient>();
+ logger.InitializedHttpConnection(gremlinServer.Uri);
+ }
/// <inheritdoc />
- public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage, CancellationToken cancellationToken = default)
+ public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage,
+ CancellationToken cancellationToken = default)
{
- using var connection = _connectionPool.GetAvailableConnection();
- return await connection.SubmitAsync<T>(requestMessage, cancellationToken).ConfigureAwait(false);
+ return await _connection.SubmitAsync<T>(requestMessage, cancellationToken)
+ .ConfigureAwait(false);
}
#region IDisposable Support
@@ -238,11 +97,11 @@ namespace Gremlin.Net.Driver
if (!_disposed)
{
if (disposing)
- _connectionPool?.Dispose();
+ _connection?.Dispose();
_disposed = true;
}
}
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClientExtensions.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClientExtensions.cs
index 40cdd77e00..176def707f 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClientExtensions.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinClientExtensions.cs
@@ -141,9 +141,9 @@ namespace Gremlin.Net.Driver
Dictionary<string, object>? bindings = null,
CancellationToken cancellationToken = default)
{
- var msgBuilder = RequestMessage.Build(Tokens.OpsEval).AddArgument(Tokens.ArgsGremlin, requestScript);
+ var msgBuilder = RequestMessage.Build(requestScript);
if (bindings != null)
- msgBuilder.AddArgument(Tokens.ArgsBindings, bindings);
+ msgBuilder.AddBindings(bindings);
var msg = msgBuilder.Create();
return await gremlinClient.SubmitAsync<T>(msg, cancellationToken).ConfigureAwait(false);
}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinServer.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinServer.cs
index f8cf8bf8ff..b17b8836ad 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinServer.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/GremlinServer.cs
@@ -38,10 +38,11 @@ namespace Gremlin.Net.Driver
/// <param name="enableSsl">Specifies whether SSL should be enabled.</param>
/// <param name="username">The username to submit on requests that require authentication.</param>
/// <param name="password">The password to submit on requests that require authentication.</param>
+ /// <param name="path">The path to the Gremlin endpoint on the server.</param>
public GremlinServer(string hostname = "localhost", int port = 8182, bool enableSsl = false,
- string? username = null, string? password = null)
+ string? username = null, string? password = null, string path = "/gremlin")
{
- Uri = CreateUri(hostname, port, enableSsl);
+ Uri = CreateUri(hostname, port, enableSsl, path);
Username = username;
Password = password;
}
@@ -49,7 +50,6 @@ namespace Gremlin.Net.Driver
/// <summary>
/// Gets the URI of the Gremlin Server.
/// </summary>
- /// <value>The WebSocket <see cref="System.Uri" /> that the Gremlin Server responds to.</value>
public Uri Uri { get; }
/// <summary>
@@ -62,10 +62,10 @@ namespace Gremlin.Net.Driver
/// </summary>
public string? Password { get; }
- private Uri CreateUri(string hostname, int port, bool enableSsl)
+ private static Uri CreateUri(string hostname, int port, bool enableSsl, string path)
{
- var scheme = enableSsl ? "wss" : "ws";
- return new Uri($"{scheme}://{hostname}:{port}/gremlin");
+ var scheme = enableSsl ? "https" : "http";
+ return new Uri($"{scheme}://{hostname}:{port}{path}");
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/IClientWebSocket.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/IClientWebSocket.cs
deleted file mode 100644
index 29150a77b5..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/IClientWebSocket.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Net.WebSockets;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Driver
-{
- internal interface IClientWebSocket : IDisposable
- {
- WebSocketState State { get; }
- ClientWebSocketOptions Options { get; }
- Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken);
- Task ConnectAsync(Uri uri, CancellationToken cancellationToken);
- Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment<byte> buffer, CancellationToken cancellationToken);
- Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken);
-#if NET6_0_OR_GREATER
- ValueTask SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, WebSocketMessageFlags messageFlags, CancellationToken cancellationToken);
-#endif
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/IConnection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/IConnection.cs
deleted file mode 100644
index 26791762fe..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/IConnection.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver.Messages;
-
-namespace Gremlin.Net.Driver
-{
- internal interface IConnection : IDisposable
- {
- Task ConnectAsync(CancellationToken cancellationToken);
- Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage, CancellationToken cancellationToken);
- int NrRequestsInFlight { get; }
- bool IsOpen { get; }
- Task CloseAsync();
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/IConnectionFactory.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/IConnectionFactory.cs
deleted file mode 100644
index 52fa46b0b0..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/IConnectionFactory.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-namespace Gremlin.Net.Driver
-{
- internal interface IConnectionFactory
- {
- IConnection CreateConnection();
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/IMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/IMessageSerializer.cs
index 5a0032ceb6..afb65b05fb 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/IMessageSerializer.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/IMessageSerializer.cs
@@ -48,7 +48,7 @@ namespace Gremlin.Net.Driver
/// <param name="message">The serialized message to deserialize.</param>
/// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
/// <returns>The deserialized <see cref="ResponseMessage{T}"/>.</returns>
- Task<ResponseMessage<List<object>>?> DeserializeMessageAsync(byte[] message,
+ Task<ResponseMessage<List<object>>> DeserializeMessageAsync(byte[] message,
CancellationToken cancellationToken = default);
}
}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Log.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Log.cs
index f83b040591..a90049d0c3 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Log.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Log.cs
@@ -29,18 +29,10 @@ namespace Gremlin.Net.Driver
{
internal static partial class Log
{
- [LoggerMessage(20000, LogLevel.Information, "Creating {nrConnections} new connections")]
- public static partial void FillingPool(this ILogger logger, int nrConnections);
-
- [LoggerMessage(20001, LogLevel.Warning,
- "Could not get a connection from the pool. Will try again. Retry {retryCount} of {maxRetries}")]
- public static partial void CouldNotGetConnectionFromPool(this ILogger logger, int retryCount, int maxRetries);
-
- [LoggerMessage(20002, LogLevel.Information,
- "A connection was closed. Removing it from the pool so it can be replaced.")]
- public static partial void RemovingClosedConnectionFromPool(this ILogger logger);
+ [LoggerMessage(20000, LogLevel.Information, "Initialized HTTP connections to {uri}")]
+ public static partial void InitializedHttpConnection(this ILogger logger, Uri uri);
- [LoggerMessage(20003, LogLevel.Debug, "Submitting GremlinLang {gremlinLang} for request: {requestId}")]
- public static partial void SubmittingGremlinLang(this ILogger logger, GremlinLang gremlinLang, Guid requestId);
+ [LoggerMessage(20001, LogLevel.Debug, "Submitting GremlinLang {gremlinLang}")]
+ public static partial void SubmittingGremlinLang(this ILogger logger, GremlinLang gremlinLang);
}
}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/RequestMessage.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/RequestMessage.cs
index 0d1f284ab5..f599a532d6 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/RequestMessage.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/RequestMessage.cs
@@ -27,55 +27,38 @@ using System.Collections.Generic;
namespace Gremlin.Net.Driver.Messages
{
/// <summary>
- /// The model for a request message sent to the server.
+ /// The model for a 4.0 request message sent to the server.
/// </summary>
public class RequestMessage
{
- private RequestMessage(Guid requestId, string operation, string processor, Dictionary<string, object> arguments)
+ private RequestMessage(string gremlin, Dictionary<string, object> fields)
{
- RequestId = requestId;
- Operation = operation;
- Processor = processor;
- Arguments = arguments;
+ Gremlin = gremlin ?? throw new ArgumentNullException(nameof(gremlin));
+ Fields = fields;
+ if (!Fields.ContainsKey(Tokens.ArgsLanguage))
+ {
+ Fields[Tokens.ArgsLanguage] = "gremlin-lang";
+ }
}
/// <summary>
- /// Gets the ID of this request message.
- /// </summary>
- /// <value>A UUID representing the unique identification for the request.</value>
- public Guid RequestId { get; }
-
- /// <summary>
- /// Gets the name of the operation that should be executed by the Gremlin Server.
- /// </summary>
- /// <value>
- /// The name of the "operation" to execute based on the available OpProcessor configured in the Gremlin Server. This
- /// defaults to "eval" which evaluates a request script.
- /// </value>
- public string Operation { get; }
-
- /// <summary>
- /// Gets the name of the OpProcessor to utilize.
+ /// Gets the Gremlin query string.
/// </summary>
- /// <value>
- /// The name of the OpProcessor to utilize. This defaults to an empty string which represents the default
- /// OpProcessor for evaluating scripts.
- /// </value>
- public string Processor { get; }
+ public string Gremlin { get; }
/// <summary>
- /// Gets arguments of the <see cref="RequestMessage" />.
+ /// Gets the fields map containing language, g, bindings, and other options.
/// </summary>
- public Dictionary<string, object> Arguments { get; }
+ public Dictionary<string, object> Fields { get; }
/// <summary>
/// Initializes a <see cref="Builder" /> to build a <see cref="RequestMessage" />.
/// </summary>
- /// <param name="operation">The name of the OpProcessor to utilize.</param>
+ /// <param name="gremlin">The Gremlin query string.</param>
/// <returns>A <see cref="Builder" /> to build a <see cref="RequestMessage" />.</returns>
- public static Builder Build(string operation)
+ public static Builder Build(string gremlin)
{
- return new Builder(operation);
+ return new Builder(gremlin);
}
/// <summary>
@@ -83,50 +66,134 @@ namespace Gremlin.Net.Driver.Messages
/// </summary>
public class Builder
{
- private const string DefaultProcessor = "";
- private readonly Dictionary<string, object> _arguments = new Dictionary<string, object>();
- private readonly string _operation;
- private string _processor = DefaultProcessor;
- private Guid _requestId = Guid.NewGuid();
+ private readonly string _gremlin;
+ private readonly Dictionary<string, object> _fields = new Dictionary<string, object>();
+ private readonly Dictionary<string, object> _bindings = new Dictionary<string, object>();
+
+ internal Builder(string gremlin)
+ {
+ _gremlin = gremlin;
+ }
+
+ /// <summary>
+ /// Sets the traversal source name.
+ /// </summary>
+ /// <param name="g">The traversal source name.</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddG(string g)
+ {
+ _fields[Tokens.ArgsG] = g;
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a single binding parameter.
+ /// </summary>
+ /// <param name="key">The binding key.</param>
+ /// <param name="val">The binding value.</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddBinding(string key, object val)
+ {
+ _bindings[key] = val;
+ return this;
+ }
+
+ /// <summary>
+ /// Adds multiple binding parameters.
+ /// </summary>
+ /// <param name="bindings">The bindings to add.</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddBindings(Dictionary<string, object> bindings)
+ {
+ foreach (var kvp in bindings)
+ {
+ _bindings[kvp.Key] = kvp.Value;
+ }
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a field to the request message.
+ /// </summary>
+ /// <param name="key">The field key.</param>
+ /// <param name="value">The field value.</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddField(string key, object value)
+ {
+ _fields[key] = value;
+ return this;
+ }
+
+ /// <summary>
+ /// Checks whether a field has been set.
+ /// </summary>
+ /// <param name="key">The field key to check.</param>
+ /// <returns>True if the field exists.</returns>
+ public bool HasField(string key) => _fields.ContainsKey(key);
+
+ /// <summary>
+ /// Sets the evaluation timeout for this request.
+ /// </summary>
+ /// <param name="timeout">The timeout value.</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddEvaluationTimeout(object timeout)
+ {
+ _fields[Tokens.ArgsEvalTimeout] = timeout;
+ return this;
+ }
- internal Builder(string operation)
+ /// <summary>
+ /// Sets the batch size for this request.
+ /// </summary>
+ /// <param name="batchSize">The batch size value.</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddBatchSize(object batchSize)
{
- _operation = operation;
+ _fields[Tokens.ArgsBatchSize] = batchSize;
+ return this;
+ }
+
+ /// <summary>
+ /// Sets the materializeProperties option for this request.
+ /// </summary>
+ /// <param name="materializeProperties">The materializeProperties value (e.g. "all" or "tokens").</param>
+ /// <returns>The <see cref="Builder" />.</returns>
+ public Builder AddMaterializeProperties(string materializeProperties)
+ {
+ _fields[Tokens.ArgMaterializeProperties] = materializeProperties;
+ return this;
}
/// <summary>
- /// If this value is not set in the builder then the <see cref="RequestMessage.Processor" /> defaults to
- /// the standard op processor (empty string).
+ /// Sets the user agent for this request.
/// </summary>
- /// <param name="processor">The name of the processor.</param>
+ /// <param name="userAgent">The user agent string.</param>
/// <returns>The <see cref="Builder" />.</returns>
- public Builder Processor(string processor)
+ public Builder AddUserAgent(string userAgent)
{
- _processor = processor;
+ _fields[Tokens.ArgsUserAgent] = userAgent;
return this;
}
/// <summary>
- /// Overrides the request identifier with a specified one, otherwise the
- /// <see cref="Builder" /> will randomly generate a <see cref="Guid" />.
+ /// Sets the bulk results option for this request.
/// </summary>
- /// <param name="requestId">The request identifier to use.</param>
+ /// <param name="bulkResults">The bulk results value.</param>
/// <returns>The <see cref="Builder" />.</returns>
- public Builder OverrideRequestId(Guid requestId)
+ public Builder AddBulkResults(object bulkResults)
{
- _requestId = requestId;
+ _fields[Tokens.ArgsBulkResults] = bulkResults;
return this;
}
/// <summary>
- /// Adds and argument to the <see cref="RequestMessage" />.
+ /// Sets the language for this request.
/// </summary>
- /// <param name="key">The key of the argument.</param>
- /// <param name="value">The value of the argument.</param>
+ /// <param name="language">The language identifier (e.g. "gremlin-lang").</param>
/// <returns>The <see cref="Builder" />.</returns>
- public Builder AddArgument(string key, object value)
+ public Builder AddLanguage(string language)
{
- _arguments.Add(key, value);
+ _fields[Tokens.ArgsLanguage] = language;
return this;
}
@@ -136,8 +203,9 @@ namespace Gremlin.Net.Driver.Messages
/// <returns>The built <see cref="RequestMessage" />.</returns>
public RequestMessage Create()
{
- return new RequestMessage(_requestId, _operation, _processor, _arguments);
+ _fields[Tokens.ArgsBindings] = _bindings;
+ return new RequestMessage(_gremlin, _fields);
}
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseMessage.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseMessage.cs
index 7da49920ef..f05e5c56a1 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseMessage.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseMessage.cs
@@ -21,42 +21,55 @@
#endregion
-using System;
-
namespace Gremlin.Net.Driver.Messages
{
/// <summary>
- /// The message returned from the server.
+ /// The 4.0 response message returned from the server.
/// </summary>
- /// <typeparam name="T">The type of the data returned.</typeparam>
+ /// <typeparam name="T">The type of the result data.</typeparam>
public record ResponseMessage<T>
{
/// <summary>
/// Initializes a new instance of the <see cref="ResponseMessage{T}" /> record.
/// </summary>
- /// <param name="requestId">The identifier of the <see cref="RequestMessage"/> that generated this <see cref="ResponseMessage{T}"/>.</param>
- /// <param name="status">Status information about this <see cref="ResponseMessage{T}"/>.</param>
- /// <param name="result">The result with its data and optional meta information.</param>
- public ResponseMessage(Guid? requestId, ResponseStatus status, ResponseResult<T> result)
+ /// <param name="bulked">Whether the response contains bulked results.</param>
+ /// <param name="result">The deserialized result data.</param>
+ /// <param name="statusCode">The status code from the GraphBinary response status (after the end-of-stream marker).</param>
+ /// <param name="statusMessage">Optional status message from the GraphBinary response status.</param>
+ /// <param name="exception">Optional exception string from the GraphBinary response status.</param>
+ public ResponseMessage(bool bulked, T result, int statusCode,
+ string? statusMessage, string? exception)
{
- RequestId = requestId;
- Status = status;
+ Bulked = bulked;
Result = result;
+ StatusCode = statusCode;
+ StatusMessage = statusMessage;
+ Exception = exception;
}
-
+
+ /// <summary>
+ /// Gets whether the response contains bulked results.
+ /// </summary>
+ public bool Bulked { get; }
+
+ /// <summary>
+ /// Gets the deserialized result data.
+ /// </summary>
+ public T Result { get; }
+
/// <summary>
- /// Gets the identifier of the <see cref="RequestMessage"/> that generated this <see cref="ResponseMessage{T}"/>.
+ /// Gets the status code from the GraphBinary response status (200 = success).
/// </summary>
- public Guid? RequestId { get; }
+ public int StatusCode { get; }
/// <summary>
- /// Gets status information about this <see cref="ResponseMessage{T}"/>.
+ /// Gets the optional status message from the GraphBinary response status.
/// </summary>
- public ResponseStatus Status { get; }
+ public string? StatusMessage { get; }
/// <summary>
- /// Gets the result with its data and optional meta information.
+ /// Gets the optional exception string from the GraphBinary response status.
/// </summary>
- public ResponseResult<T> Result { get; set; }
+ public string? Exception { get; }
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseResult.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseResult.cs
deleted file mode 100644
index 2f11b4f723..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseResult.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections.Generic;
-
-namespace Gremlin.Net.Driver.Messages
-{
- /// <summary>
- /// Represents the result as a response to a <see cref="RequestMessage"/> sent as part of a
- /// <see cref="ResponseMessage{T}"/> by the server.
- /// </summary>
- /// <typeparam name="T">The type of the <see cref="Data"/>.</typeparam>
- public record ResponseResult<T>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ResponseResult{T}" /> record.
- /// </summary>
- /// <param name="data">The data of this result.</param>
- /// <param name="meta">The (optional) meta data of this result.</param>
- public ResponseResult(T? data, Dictionary<string, object>? meta = null)
- {
- Data = data;
- Meta = meta ?? new Dictionary<string, object>();
- }
-
- /// <summary>
- /// Gets the data of this result.
- /// </summary>
- public T? Data { get; }
-
- /// <summary>
- /// Gets meta data of this result.
- /// </summary>
- public Dictionary<string, object> Meta { get; }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseStatus.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseStatus.cs
deleted file mode 100644
index 794525d47a..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseStatus.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections.Generic;
-using Gremlin.Net.Driver.Exceptions;
-
-namespace Gremlin.Net.Driver.Messages
-{
- /// <summary>
- /// Represents status information of a <see cref="ResponseMessage{T}"/>.
- /// </summary>
- public record ResponseStatus
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ResponseStatus" /> record.
- /// </summary>
- /// <param name="code">The <see cref="ResponseStatusCode" />.</param>
- /// <param name="attributes">The (optional) attributes with protocol-level information.</param>
- /// <param name="message">The (optional) message which is just a human-readable string usually associated with errors.</param>
- public ResponseStatus(ResponseStatusCode code, Dictionary<string, object>? attributes = null,
- string? message = null)
- {
- Code = code;
- Attributes = attributes ?? new Dictionary<string, object>();
- Message = message;
- }
-
- /// <summary>
- /// Gets the <see cref="ResponseStatusCode"/>.
- /// </summary>
- public ResponseStatusCode Code { get; }
-
- /// <summary>
- /// Gets the attributes <see cref="Dictionary{TKey,TValue}"/> with protocol-level information.
- /// </summary>
- public Dictionary<string, object> Attributes { get; }
-
- /// <summary>
- /// Gets the message which is just a human-readable string usually associated with errors.
- /// </summary>
- public string? Message { get; }
- }
-
- internal static class ResponseStatusExtensions
- {
- public static void ThrowIfStatusIndicatesError(this ResponseStatus status)
- {
- if (status.Code.IndicatesError())
- throw new ResponseException(status.Code, status.Attributes, $"{status.Code}: {status.Message}");
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseStatusCode.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseStatusCode.cs
deleted file mode 100644
index 12cf386fa7..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Messages/ResponseStatusCode.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-
-namespace Gremlin.Net.Driver.Messages
-{
- /// <summary>
- /// Represents the various status codes that Gremlin Server returns.
- /// </summary>
- public enum ResponseStatusCode
- {
- /// <summary>
- /// The server successfully processed a request to completion - there are no messages remaining in this
- /// stream.
- /// </summary>
- Success = 200,
-
- /// <summary>
- /// The server processed the request but there is no result to return (e.g. an Iterator with no elements)
- /// - there are no messages remaining in this stream.
- /// </summary>
- NoContent = 204,
-
- /// <summary>
- /// The server successfully returned some content, but there is more in the stream to arrive - wait for a
- /// SUCCESS to signify the end of the stream.
- /// </summary>
- PartialContent = 206,
-
- /// <summary>
- /// The request attempted to access resources that the requesting user did not have access to.
- /// </summary>
- Unauthorized = 401,
-
- /// <summary>
- /// The server could authenticate the request, but will not fulfill it. This is a general purpose code that
- /// would typically be returned if the request is authenticated but not authorized to do what it is doing.
- /// </summary>
- Forbidden = 403,
-
- /// <summary>
- /// A challenge from the server for the client to authenticate its request.
- /// </summary>
- Authenticate = 407,
-
- /// <summary>
- /// Indicates that too many requests have been sent in a given amount of time.
- /// </summary>
- TooManyRequests = 429,
-
- /// <summary>
- /// The request message contains objects that were not serializable on the client side.
- /// </summary>
- ClientSerializationError = 497,
-
- /// <summary>
- /// The request message was not properly formatted which means it could not be parsed at all or the "op" code
- /// was not recognized such that Gremlin Server could properly route it for processing. Check the message format
- /// and retry the request.
- /// </summary>
- MalformedRequest = 498,
-
- /// <summary>
- /// The request message was parseable, but the arguments supplied in the message were in conflict or incomplete.
- /// Check the message format and retry the request.
- /// </summary>
- InvalidRequestArguments = 499,
-
- /// <summary>
- /// A general server error occurred that prevented the request from being processed.
- /// </summary>
- ServerError = 500,
-
- /// <summary>
- /// A server error that is produced when the fail()-step is triggered.
- /// </summary>
- ServerErrorFailStep = 595,
-
- /// <summary>
- /// A server error that indicates that the client should retry the request. A graph will typically return this error
- /// when a transaction fails due to a locking exception or some other sort of concurrent modification. In other
- /// words, the request was likely valid but the state of the server at the particular time the request arrived
- /// could not be processed to success, but could be at a later moment.
- /// </summary>
- ServerErrorTemporary = 596,
-
- /// <summary>
- /// The request submitted for processing evaluated by the server with errors and could not be processed.
- /// Check the script or remote traversal submitted for errors or other problems and then resubmit.
- /// </summary>
- ServerEvaluationError = 597,
-
- /// <summary>
- /// The server exceeded one of the timeout settings for the request and could therefore only partially responded
- /// or did not respond at all.
- /// </summary>
- ServerTimeout = 598,
-
- /// <summary>
- /// The server was not capable of serializing an object that was returned from the script supplied on the request.
- /// Either transform the object into something Gremlin Server can process within the script or install mapper
- /// serialization classes to Gremlin Server.
- /// </summary>
- ServerSerializationError = 599
- }
-
- internal static class ResponseStatusCodeExtensions
- {
- public static bool IndicatesError(this ResponseStatusCode statusCode)
- {
- switch (statusCode)
- {
- case ResponseStatusCode.Success:
- case ResponseStatusCode.NoContent:
- case ResponseStatusCode.PartialContent:
- case ResponseStatusCode.Authenticate:
- return false;
- case ResponseStatusCode.Unauthorized:
- case ResponseStatusCode.Forbidden:
- case ResponseStatusCode.TooManyRequests:
- case ResponseStatusCode.ClientSerializationError:
- case ResponseStatusCode.MalformedRequest:
- case ResponseStatusCode.InvalidRequestArguments:
- case ResponseStatusCode.ServerError:
- case ResponseStatusCode.ServerErrorFailStep:
- case ResponseStatusCode.ServerErrorTemporary:
- case ResponseStatusCode.ServerEvaluationError:
- case ResponseStatusCode.ServerTimeout:
- case ResponseStatusCode.ServerSerializationError:
- return true;
- default:
- throw new ArgumentOutOfRangeException(nameof(statusCode), statusCode, null);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ProxyClientWebSocket.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ProxyClientWebSocket.cs
deleted file mode 100644
index 6b8b0e0802..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ProxyClientWebSocket.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Net.WebSockets;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Driver
-{
- internal class ProxyClientWebSocket : IClientWebSocket
- {
- private readonly ClientWebSocket _client;
-
- public ProxyClientWebSocket(ClientWebSocket client)
- {
- _client = client;
- }
-
- public WebSocketState State => _client.State;
-
- public ClientWebSocketOptions Options => _client.Options;
-
- public static IClientWebSocket CreateClientWebSocket()
- {
- return new ProxyClientWebSocket(new ClientWebSocket());
- }
-
- public Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken)
- {
- return _client.CloseAsync(closeStatus, statusDescription, cancellationToken);
- }
-
- public Task ConnectAsync(Uri uri, CancellationToken cancellationToken)
- {
- return _client.ConnectAsync(uri, cancellationToken);
- }
-
- public void Dispose()
- {
- _client.Dispose();
- }
-
- public Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment<byte> buffer, CancellationToken cancellationToken)
- {
- return _client.ReceiveAsync(buffer, cancellationToken);
- }
-
- public Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken)
- {
- return _client.SendAsync(buffer, messageType, endOfMessage, cancellationToken);
- }
-
-#if NET6_0_OR_GREATER
- public ValueTask SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, WebSocketMessageFlags messageFlags, CancellationToken cancellationToken)
- {
- return _client.SendAsync(buffer, messageType, messageFlags, cancellationToken);
- }
-#endif
- }
-}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ProxyConnection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ProxyConnection.cs
deleted file mode 100644
index a7c3dab45a..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ProxyConnection.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver.Messages;
-
-namespace Gremlin.Net.Driver
-{
- internal sealed class ProxyConnection : IConnection
- {
- public IConnection ProxiedConnection { get; }
- private readonly Action<IConnection> _releaseAction;
-
- public ProxyConnection(IConnection proxiedConnection, Action<IConnection> releaseAction)
- {
- ProxiedConnection = proxiedConnection;
- _releaseAction = releaseAction;
- }
-
- public async Task ConnectAsync(CancellationToken cancellationToken)
- {
- await ProxiedConnection.ConnectAsync(cancellationToken).ConfigureAwait(false);
- }
-
- public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage,
- CancellationToken cancellationToken)
- {
- return await ProxiedConnection.SubmitAsync<T>(requestMessage, cancellationToken).ConfigureAwait(false);
- }
-
- public int NrRequestsInFlight => ProxiedConnection.NrRequestsInFlight;
-
- public bool IsOpen => ProxiedConnection.IsOpen;
-
- public async Task CloseAsync()
- {
- await ProxiedConnection.CloseAsync().ConfigureAwait(false);
- }
-
- public void Dispose()
- {
- _releaseAction(ProxiedConnection);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
index c8a6e5d03f..4ddb326db8 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
@@ -43,23 +43,13 @@ namespace Gremlin.Net.Driver.Remote
private readonly string _traversalSource;
private readonly ILogger<DriverRemoteConnection> _logger;
- /// <summary>
- /// Filter on these keys provided to OptionsStrategy and apply them to the request. Note that
- /// "scriptEvaluationTimeout" was deprecated in 3.3.9 but still supported in server implementations and will
- /// be removed in later versions.
- /// </summary>
- private readonly List<string> _allowedKeys = new()
- {
- Tokens.ArgsEvalTimeout, "scriptEvaluationTimeout", Tokens.ArgsBatchSize,
- Tokens.RequestId, Tokens.ArgsUserAgent, Tokens.ArgMaterializeProperties
- };
-
- private readonly string? _sessionId;
- private string Processor => IsSessionBound ? Tokens.ProcessorSession : Tokens.ProcessorTraversal;
+ // All OptionsStrategy keys are passed through to the request fields.
+ // The server filters out options that don't apply, and this allows
+ // providers to use custom request fields via the Client directly or DRC.
/// <inheritdoc />
- public bool IsSessionBound => _sessionId != null;
-
+ public bool IsSessionBound => false;
+
/// <summary>
/// Initializes a new <see cref="IRemoteConnection" />.
/// </summary>
@@ -82,11 +72,11 @@ namespace Gremlin.Net.Driver.Remote
/// <param name="traversalSource">The name of the traversal source on the server to bind to.</param>
/// <exception cref="ArgumentNullException">Thrown when client or the traversalSource is null.</exception>
public DriverRemoteConnection(IGremlinClient client, string traversalSource = "g")
- : this(client, traversalSource, null)
+ : this(client, traversalSource, logger: null)
{
}
- private DriverRemoteConnection(IGremlinClient client, string traversalSource, string? sessionId = null,
+ private DriverRemoteConnection(IGremlinClient client, string traversalSource,
ILogger<DriverRemoteConnection>? logger = null)
{
_client = client ?? throw new ArgumentNullException(nameof(client));
@@ -101,7 +91,6 @@ namespace Gremlin.Net.Driver.Remote
logger = loggerFactory.CreateLogger<DriverRemoteConnection>();
}
_logger = logger;
- _sessionId = sessionId;
}
/// <summary>
@@ -113,30 +102,26 @@ namespace Gremlin.Net.Driver.Remote
public async Task<ITraversal<TStart, TEnd>> SubmitAsync<TStart, TEnd>(GremlinLang gremlinLang,
CancellationToken cancellationToken = default)
{
+ _logger.SubmittingGremlinLang(gremlinLang);
gremlinLang.AddG(_traversalSource);
- var requestId = Guid.NewGuid();
- var requestMsg =
- RequestMessage.Build(Tokens.OpsEval)
- .Processor(Processor)
- .OverrideRequestId(requestId)
- .AddArgument(Tokens.ArgsGremlin, gremlinLang.GetGremlin())
- .AddArgument(Tokens.ArgsBindings, gremlinLang.Parameters);
+ var requestMsg = RequestMessage.Build(gremlinLang.GetGremlin())
+ .AddG(_traversalSource)
+ .AddBindings(gremlinLang.Parameters);
foreach (var optionsStrategy in gremlinLang.OptionsStrategies)
{
foreach (var pair in optionsStrategy.Configuration)
{
- if (_allowedKeys.Contains(pair.Key))
- {
- requestMsg.AddArgument(pair.Key, pair.Value);
- }
+ requestMsg.AddField(pair.Key, pair.Value);
}
}
- if (IsSessionBound)
+ // Default bulkResults to "true" if not set per-request
+ // (consistent with Java RequestOptions.fromGremlinLang and Python extract_request_options)
+ if (!requestMsg.HasField(Tokens.ArgsBulkResults))
{
- requestMsg.AddArgument(Tokens.ArgsSession, _sessionId!);
+ requestMsg.AddField(Tokens.ArgsBulkResults, "true");
}
var resultSet = await _client.SubmitAsync<Traverser>(requestMsg.Create(), cancellationToken)
@@ -145,10 +130,12 @@ namespace Gremlin.Net.Driver.Remote
}
/// <inheritdoc />
+ /// <remarks>
+ /// Transaction support over HTTP is not yet implemented. This will be addressed in a future release.
+ /// </remarks>
public RemoteTransaction Tx(GraphTraversalSource g)
{
- var session = new DriverRemoteConnection(_client, _traversalSource, Guid.NewGuid().ToString(), _logger);
- return new RemoteTransaction(session, g);
+ throw new NotSupportedException("Transaction support over HTTP is not yet implemented.");
}
/// <inheritdoc />
@@ -157,4 +144,4 @@ namespace Gremlin.Net.Driver.Remote
_client?.Dispose();
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/ResponseHandlerForSingleRequestMessage.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/ResponseHandlerForSingleRequestMessage.cs
deleted file mode 100644
index 91ae8f6304..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/ResponseHandlerForSingleRequestMessage.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver.Messages;
-
-namespace Gremlin.Net.Driver
-{
- internal class ResponseHandlerForSingleRequestMessage<T> : IResponseHandlerForSingleRequestMessage
- {
- public Task<ResultSet<T>> Result => _tcs.Task;
-
- private readonly TaskCompletionSource<ResultSet<T>> _tcs =
- new(TaskCreationOptions.RunContinuationsAsynchronously);
-
- private readonly List<T> _result = new();
-
- public void HandleReceived(ResponseMessage<List<object>> received)
- {
- foreach (var d in received.Result.Data!)
- {
- _result.Add((T) d);
- }
- }
-
- public void Finalize(Dictionary<string, object> statusAttributes)
- {
- var resultSet =
- new ResultSet<T>(_result, statusAttributes);
- _tcs.TrySetResult(resultSet);
- }
-
- public void HandleFailure(Exception objException)
- {
- _tcs.TrySetException(objException);
- }
-
- public void Cancel()
- {
- _tcs.SetCanceled();
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs
index adb88759cf..fd94e24a77 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Tokens.cs
@@ -40,31 +40,6 @@ namespace Gremlin.Net.Driver
/// </summary>
public const string RequestId = "requestId";
- /// <summary>
- /// Operation used by the client to authenticate itself.
- /// </summary>
- public const string OpsAuthentication = "authentication";
-
- /// <summary>
- /// Operation used to evaluate a Gremlin script provided as a string.
- /// </summary>
- public const string OpsEval = "eval";
-
- /// <summary>
- /// Operation used to get all the keys of all side-effects as produced by a previously executed Traversal.
- /// </summary>
- public const string OpsClose = "close";
-
- /// <summary>
- /// Default OpProcessor.
- /// </summary>
- public const string ProcessorTraversal = "traversal";
-
- /// <summary>
- /// Session OpProcessor.
- /// </summary>
- public const string ProcessorSession = "session";
-
/// <summary>
/// Argument name that allows the definition of the number of items each ResponseMessage should
/// contain from a particular result - overrides the resultIterationBatchSize server setting.
@@ -77,22 +52,11 @@ namespace Gremlin.Net.Driver
/// </summary>
public const string ArgsBindings = "bindings";
- /// <summary>
- /// Argument name that allows definition of alias names for Graph and TraversalSource objects on the
- /// remote system.
- /// </summary>
- public const string ArgsAliases = "aliases";
-
/// <summary>
/// Argument name that corresponds to the Gremlin to evaluate.
/// </summary>
public const string ArgsGremlin = "gremlin";
- /// <summary>
- /// Argument name that allows to define the id of session.
- /// </summary>
- public const string ArgsSession = "session";
-
/// <summary>
/// Argument name that allows a value that is a custom string that the user can pass to a server that
/// might accept it for purpose of identifying the kind of client it came from.
@@ -117,9 +81,13 @@ namespace Gremlin.Net.Driver
public const string ArgMaterializeProperties = "materializeProperties";
/// <summary>
- /// Argument name for the response to the server authentication challenge. This value is dependent on the SASL
- /// authentication mechanism required by the server.
+ /// Argument name for the traversal source alias.
+ /// </summary>
+ public const string ArgsG = "g";
+
+ /// <summary>
+ /// Argument name for bulk results mode.
/// </summary>
- public const string ArgsSasl = "sasl";
+ public const string ArgsBulkResults = "bulkResults";
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs
deleted file mode 100644
index 945ae80e37..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketConnection.cs
+++ /dev/null
@@ -1,157 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using Gremlin.Net.Driver.Exceptions;
-using System;
-using System.IO;
-using System.Net.WebSockets;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process;
-
-namespace Gremlin.Net.Driver
-{
- internal interface IWebSocketConnection : IDisposable
- {
- Task ConnectAsync(Uri uri, CancellationToken cancellationToken);
- Task CloseAsync();
- Task SendMessageAsync(byte[] message, CancellationToken cancellationToken);
-#if NET6_0_OR_GREATER
- Task SendMessageUncompressedAsync(byte[] message, CancellationToken cancellationToken);
-#endif
- Task<byte[]> ReceiveMessageAsync();
- bool IsOpen { get; }
- }
-
- internal class WebSocketConnection : IWebSocketConnection
- {
- private const int ReceiveBufferSize = 1024;
- private const WebSocketMessageType MessageType = WebSocketMessageType.Binary;
- private readonly IClientWebSocket _client;
- private const string userAgentHeaderName = "User-Agent";
-
- public WebSocketConnection(IClientWebSocket client, WebSocketSettings settings)
- {
- if (settings.EnableUserAgentOnConnect)
- {
- client.Options.SetRequestHeader(userAgentHeaderName, Utils.UserAgent);
- }
- _client = client;
-
-#if NET6_0_OR_GREATER
- if (settings.UseCompression)
- {
- _client.Options.DangerousDeflateOptions = settings.CompressionOptions;
- }
-#endif
- settings.WebSocketConfigurationCallback?.Invoke(_client.Options);
- }
-
- public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken)
- {
- await _client.ConnectAsync(uri, cancellationToken).ConfigureAwait(false);
- }
-
- public async Task CloseAsync()
- {
- if (CloseAlreadyInitiated) return;
-
- try
- {
- await
- _client.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None)
- .ConfigureAwait(false);
- }
- catch (Exception)
- {
- // Swallow exceptions silently as there is nothing to do when closing fails
- }
- }
-
- private bool CloseAlreadyInitiated => _client.State == WebSocketState.Closed ||
- _client.State == WebSocketState.Aborted ||
- _client.State == WebSocketState.CloseSent;
-
-#if NET6_0_OR_GREATER
- public async Task SendMessageUncompressedAsync(byte[] message, CancellationToken cancellationToken)
- {
- await _client.SendAsync(new ArraySegment<byte>(message), MessageType,
- WebSocketMessageFlags.EndOfMessage | WebSocketMessageFlags.DisableCompression,
- cancellationToken)
- .ConfigureAwait(false);
- }
-#endif
-
- public async Task SendMessageAsync(byte[] message, CancellationToken cancellationToken)
- {
- await
- _client.SendAsync(new ArraySegment<byte>(message), MessageType, true, cancellationToken)
- .ConfigureAwait(false);
- }
-
- public async Task<byte[]> ReceiveMessageAsync()
- {
- using var ms = new MemoryStream();
- WebSocketReceiveResult received;
- var buffer = new byte[ReceiveBufferSize];
-
- do
- {
- var receiveBuffer = new ArraySegment<byte>(buffer);
- received = await _client.ReceiveAsync(receiveBuffer, CancellationToken.None).ConfigureAwait(false);
- if (received.MessageType == WebSocketMessageType.Close)
- {
- throw new ConnectionClosedException(received.CloseStatus, received.CloseStatusDescription);
- }
-
- ms.Write(receiveBuffer.Array!, receiveBuffer.Offset, received.Count);
- } while (!received.EndOfMessage);
-
- return ms.ToArray();
- }
-
- public bool IsOpen => _client.State == WebSocketState.Open;
-
- #region IDisposable Support
-
- private bool _disposed;
-
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- protected virtual void Dispose(bool disposing)
- {
- if (!_disposed)
- {
- if (disposing)
- _client?.Dispose();
- _disposed = true;
- }
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketSettings.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketSettings.cs
deleted file mode 100644
index 20ce851de8..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/WebSocketSettings.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Net.WebSockets;
-
-namespace Gremlin.Net.Driver
-{
- /// <summary>
- /// Holds settings for WebSocket connections.
- /// </summary>
- internal class WebSocketSettings
- {
- // We currently only use this internally so we don't have to pass these values through the different layers
- // all the way down to the WebSocketConnection class. We can make this public however when we refactor the
- // configuration in general.
-
- /// <summary>
- /// Gets or sets the delegate that will be invoked with the <see cref="ClientWebSocketOptions" />
- /// object used to configure WebSocket connections.
- /// </summary>
- public Action<ClientWebSocketOptions>? WebSocketConfigurationCallback { get; set; }
-
- public bool EnableUserAgentOnConnect { get; set; }
-
-#if NET6_0_OR_GREATER
- /// <summary>
- /// Gets or sets whether compressions will be used. The default is true. (Only available since .NET 6.)
- /// </summary>
- public bool UseCompression { get; set; } = true;
-
- /// <summary>
- /// Gets or sets compression options. (Only available since .SET 6.)
- /// </summary>
- public WebSocketDeflateOptions CompressionOptions { get; set; } = new WebSocketDeflateOptions();
-#endif
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs
index 80d7ffece6..de01df3367 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs
@@ -1459,10 +1459,10 @@ namespace Gremlin.Net.Process.Traversal
/// </summary>
public GraphTraversal<TStart, Edge> MergeE (IDictionary<object,object?>? m)
{
- if (m != null && m.TryGetValue(Direction.Out, out var outValue) && outValue is Vertex outV) {
+ if (m != null && m.ContainsKey(Direction.Out) && m[Direction.Out] is Vertex outV) {
m[Direction.Out] = outV.Id;
}
- if (m != null && m.TryGetValue(Direction.In, out var inValue) && inValue is Vertex inV) {
+ if (m != null && m.ContainsKey(Direction.In) && m[Direction.In] is Vertex inV) {
m[Direction.In] = inV.Id;
}
GremlinLang.AddStep("mergeE", m);
@@ -1809,7 +1809,7 @@ namespace Gremlin.Net.Process.Traversal
/// </summary>
public GraphTraversal<TStart, TEnd> Property(Cardinality cardinality, IDictionary<object, object> map)
{
- if (map == null) throw new ArgumentNullException(nameof(map));
+ if (map == null) return Wrap<TStart, TEnd>(this);
foreach (var entry in map)
{
diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversalSource.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversalSource.cs
index b629c831f5..581882f490 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversalSource.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversalSource.cs
@@ -75,8 +75,8 @@ namespace Gremlin.Net.Process.Traversal
GremlinLang = gremlinLang;
}
- public GraphTraversalSource(ICollection<ITraversalStrategy> traversalStrategies, GremlinLang gremlinLang,
- IRemoteConnection connection)
+ public GraphTraversalSource(ICollection<ITraversalStrategy> traversalStrategies,
+ GremlinLang gremlinLang, IRemoteConnection connection)
: this(traversalStrategies.Where(strategy => strategy.GetType() != typeof(RemoteStrategy)).ToList(),
gremlinLang)
{
@@ -369,10 +369,10 @@ namespace Gremlin.Net.Process.Traversal
/// </summary>
public GraphTraversal<Edge, Edge> MergeE(IDictionary<object,object?>? m)
{
- if (m != null && m[Direction.Out] is Vertex outV) {
+ if (m != null && m.ContainsKey(Direction.Out) && m[Direction.Out] is Vertex outV) {
m[Direction.Out] = outV.Id;
}
- if (m != null && m[Direction.In] is Vertex inV) {
+ if (m != null && m.ContainsKey(Direction.In) && m[Direction.In] is Vertex inV) {
m[Direction.In] = inV.Id;
}
var traversal = new GraphTraversal<Edge, Edge>(TraversalStrategies, GremlinLang.Clone());
diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs
index e4cd199348..f6df5bc87b 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs
@@ -132,6 +132,21 @@ namespace Gremlin.Net.Process.Traversal
/// Gets a value indicating whether this GremlinLang has no content.
/// </summary>
public bool IsEmpty => _gremlin.Length == 0;
+
+ /// <summary>
+ /// Gets or sets the raw gremlin string content (without the "g" prefix).
+ /// This is intended for test infrastructure use only, such as prepending
+ /// source steps like withSideEffect after traversal construction.
+ /// </summary>
+ internal string Gremlin
+ {
+ get => _gremlin.ToString();
+ set
+ {
+ _gremlin.Clear();
+ _gremlin.Append(value);
+ }
+ }
/// <summary>
/// Resets the static parameter counter. Intended for test determinism.
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/DataType.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/DataType.cs
deleted file mode 100644
index 4b823c8a88..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/DataType.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Represents a GraphBinary data type.
- /// </summary>
- public class DataType : IEquatable<DataType>
- {
-#pragma warning disable 1591
- public static readonly DataType Int = new DataType(0x01);
- public static readonly DataType Long = new DataType(0x02);
- public static readonly DataType String = new DataType(0x03);
- public static readonly DataType Date = new DataType(0x04);
- public static readonly DataType Timestamp = new DataType(0x05);
- public static readonly DataType Class = new DataType(0x06);
- public static readonly DataType Double = new DataType(0x07);
- public static readonly DataType Float = new DataType(0x08);
- public static readonly DataType List = new DataType(0x09);
- public static readonly DataType Map = new DataType(0X0A);
- public static readonly DataType Set = new DataType(0X0B);
- public static readonly DataType Uuid = new DataType(0X0C);
- public static readonly DataType Edge = new DataType(0x0D);
- public static readonly DataType Path = new DataType(0x0E);
- public static readonly DataType Property = new DataType(0x0F);
-
- public static readonly DataType Vertex = new DataType(0x11);
- public static readonly DataType VertexProperty = new DataType(0x12);
- public static readonly DataType Barrier = new DataType(0x13);
- public static readonly DataType Cardinality = new DataType(0x16);
- public static readonly DataType Column = new DataType(0x17);
- public static readonly DataType Direction = new DataType(0x18);
- public static readonly DataType DT = new DataType(0x2F);
- public static readonly DataType GType = new DataType(0x30);
- public static readonly DataType Merge = new DataType(0x2E);
- public static readonly DataType Operator = new DataType(0x19);
- public static readonly DataType Order = new DataType(0x1A);
- public static readonly DataType Pick = new DataType(0x1B);
- public static readonly DataType Pop = new DataType(0x1C);
- public static readonly DataType Lambda = new DataType(0x1D);
- public static readonly DataType P = new DataType(0x1E);
- public static readonly DataType Scope = new DataType(0x1F);
- public static readonly DataType T = new DataType(0x20);
- public static readonly DataType Traverser = new DataType(0x21);
- public static readonly DataType BigDecimal = new DataType(0x22);
- public static readonly DataType BigInteger = new DataType(0x23);
- public static readonly DataType Byte = new DataType(0x24);
- public static readonly DataType ByteBuffer = new DataType(0x25);
- public static readonly DataType Short = new DataType(0x26);
- public static readonly DataType Boolean = new DataType(0x27);
- public static readonly DataType TextP = new DataType(0x28);
- public static readonly DataType TraversalStrategy = new DataType(0x29);
- public static readonly DataType BulkSet = new DataType(0x2A);
- // TODO: Support metrics and traversal metrics
- public static readonly DataType Char = new DataType(0x80);
- public static readonly DataType Duration = new DataType(0x81);
- public static readonly DataType OffsetDateTime = new DataType(0x88);
-#pragma warning restore 1591
-
- /// <summary>
- /// A custom type, represented as a blob value.
- /// </summary>
- public static readonly DataType Custom = new DataType(0);
-
- /// <summary>
- /// A null value for an unspecified Object value.
- /// </summary>
- public static readonly DataType UnspecifiedNull = new DataType(0xFE);
-
- private DataType(int code)
- {
- TypeCode = (byte) code;
- }
-
- /// <summary>
- /// Gets the type code of this data type.
- /// </summary>
- public byte TypeCode { get; }
-
- /// <summary>
- /// Creates a new <see cref="DataType"/> instance for the given type code.
- /// </summary>
- public static DataType FromTypeCode(int code)
- {
- return new DataType(code);
- }
-
- /// <inheritdoc />
- public bool Equals(DataType? other)
- {
- if (ReferenceEquals(null, other)) return false;
- if (ReferenceEquals(this, other)) return true;
- return TypeCode == other.TypeCode;
- }
-
- /// <inheritdoc />
- public override bool Equals(object? obj)
- {
- if (ReferenceEquals(null, obj)) return false;
- if (ReferenceEquals(this, obj)) return true;
- if (obj.GetType() != GetType()) return false;
- return Equals((DataType) obj);
- }
-
- /// <inheritdoc />
- public override int GetHashCode()
- {
- return TypeCode.GetHashCode();
- }
-
- /// <summary>
- /// Determines whether two specified <see cref="DataType"/> have the same values.
- /// </summary>
- public static bool operator ==(DataType first, DataType second)
- {
- if (ReferenceEquals(null, first))
- {
- if (ReferenceEquals(null, second))
- {
- return true;
- }
-
- return false;
- }
-
- return first.Equals(second);
- }
-
- /// <summary>
- /// Determines whether two specified <see cref="DataType"/> have different values.
- /// </summary>
- public static bool operator !=(DataType first, DataType second)
- {
- return !(first == second);
- }
-
- /// <inheritdoc />
- public override string ToString()
- {
- return $"DataType{{ TypeCode = {TypeCode} }}";
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryReader.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryReader.cs
deleted file mode 100644
index d2d8baef18..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryReader.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Allows to deserialize objects from GraphBinary.
- /// </summary>
- public class GraphBinaryReader
- {
- private readonly TypeSerializerRegistry _registry;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="GraphBinaryReader" /> class.
- /// </summary>
- /// <param name="registry">The <see cref="TypeSerializerRegistry"/> to use for deserialization.</param>
- public GraphBinaryReader(TypeSerializerRegistry? registry = null)
- {
- _registry = registry ?? TypeSerializerRegistry.Instance;
- }
-
- /// <summary>
- /// Reads only the value for a specific type <typeparamref name="T"/>.
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <typeparam name="T">The type of the object to read.</typeparam>
- /// <returns>The read value.</returns>
- public async Task<object?> ReadNullableValueAsync<T>(Stream stream,
- CancellationToken cancellationToken = default)
- {
- var typedSerializer = _registry.GetSerializerFor(typeof(T));
- return await typedSerializer.ReadNullableValueAsync(stream, this, cancellationToken)
- .ConfigureAwait(false);
- }
-
- /// <summary>
- /// Reads only the value for a specific type <typeparamref name="T"/>.
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <typeparam name="T">The type of the object to read.</typeparam>
- /// <returns>The read value.</returns>
- public async Task<object> ReadNonNullableValueAsync<T>(Stream stream,
- CancellationToken cancellationToken = default)
- {
- var typedSerializer = _registry.GetSerializerFor(typeof(T));
- return await typedSerializer.ReadNonNullableValueAsync(stream, this, cancellationToken)
- .ConfigureAwait(false);
- }
-
- /// <summary>
- /// Reads the type code, information and value with fully-qualified format.
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read value.</returns>
- public async Task<object?> ReadAsync(Stream stream, CancellationToken cancellationToken = default)
- {
- var type = DataType.FromTypeCode(await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false));
-
- if (type == DataType.UnspecifiedNull)
- {
- await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false); // read value byte to advance the index
- return null;
- }
-
- ITypeSerializer typeSerializer;
- if (type != DataType.Custom)
- {
- typeSerializer = _registry.GetSerializerFor(type);
- }
- else
- {
- var customTypeName = (string)await ReadNonNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
- typeSerializer = _registry.GetSerializerForCustomType(customTypeName);
- }
-
- return await typeSerializer.ReadAsync(stream, this, cancellationToken).ConfigureAwait(false);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryWriter.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryWriter.cs
deleted file mode 100644
index 7d0153c280..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryWriter.cs
+++ /dev/null
@@ -1,150 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Structure.IO.GraphBinary.Types;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Allows to serialize objects to GraphBinary.
- /// </summary>
- public class GraphBinaryWriter
- {
- private const byte ValueFlagNull = 1;
- private const byte ValueFlagNone = 0;
-
- /// <summary>
- /// A <see cref="byte"/> representing the version of the GraphBinary specification.
- /// </summary>
- public const byte VersionByte = 0x81;
-
- private static readonly byte[] UnspecifiedNullBytes = {DataType.UnspecifiedNull.TypeCode, 0x01};
- private static readonly byte[] CustomTypeCodeBytes = { DataType.Custom.TypeCode };
-
- private readonly TypeSerializerRegistry _registry;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="GraphBinaryWriter" /> class.
- /// </summary>
- /// <param name="registry">The <see cref="TypeSerializerRegistry"/> to use for serialization.</param>
- public GraphBinaryWriter(TypeSerializerRegistry? registry = null)
- {
- _registry = registry ?? TypeSerializerRegistry.Instance;
- }
-
- /// <summary>
- /// Writes a nullable value without including type information.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- public async Task WriteNullableValueAsync(object? value, Stream stream,
- CancellationToken cancellationToken = default)
- {
- if (value == null)
- {
- await WriteValueFlagNullAsync(stream, cancellationToken).ConfigureAwait(false);
- return;
- }
-
- var valueType = value.GetType();
- var serializer = _registry.GetSerializerFor(valueType);
- await serializer.WriteNullableValueAsync(value, stream, this, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Writes a non-nullable value without including type information.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- public async Task WriteNonNullableValueAsync(object value, Stream stream,
- CancellationToken cancellationToken = default)
- {
- if (value == null) throw new IOException($"{nameof(value)} cannot be null");
- var valueType = value.GetType();
- var serializer = _registry.GetSerializerFor(valueType);
- await serializer.WriteNonNullableValueAsync(value, stream, this, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Writes an object in fully-qualified format, containing {type_code}{type_info}{value_flag}{value}.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- public async Task WriteAsync(object? value, Stream stream, CancellationToken cancellationToken = default)
- {
- if (value == null)
- {
- await stream.WriteAsync(UnspecifiedNullBytes, cancellationToken).ConfigureAwait(false);
- return;
- }
-
- var valueType = value.GetType();
- var serializer = _registry.GetSerializerFor(valueType);
-
- if (serializer is CustomTypeSerializer customTypeSerializer)
- {
- await stream.WriteAsync(CustomTypeCodeBytes, cancellationToken).ConfigureAwait(false);
- await WriteNonNullableValueAsync(customTypeSerializer.TypeName, stream, cancellationToken)
- .ConfigureAwait(false);
- await customTypeSerializer.WriteAsync(value, stream, this, cancellationToken).ConfigureAwait(false);
- return;
- }
-
- await stream.WriteByteAsync(serializer.DataType.TypeCode, cancellationToken).ConfigureAwait(false);
- await serializer.WriteAsync(value, stream, this, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Writes a single byte representing the null value_flag.
- /// </summary>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- public async Task WriteValueFlagNullAsync(Stream stream, CancellationToken cancellationToken = default)
- {
- await stream.WriteByteAsync(ValueFlagNull, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Writes a single byte with value 0, representing an unset value_flag.
- /// </summary>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- public async Task WriteValueFlagNoneAsync(Stream stream, CancellationToken cancellationToken = default) {
- await stream.WriteByteAsync(ValueFlagNone, cancellationToken).ConfigureAwait(false);
- }
-
-
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/ITypeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/ITypeSerializer.cs
deleted file mode 100644
index 5503c63647..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/ITypeSerializer.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Represents a serializer for a certain type.
- /// </summary>
- public interface ITypeSerializer
- {
- /// <summary>
- /// Gets the <see cref="DataType"/> that supported by this serializer.
- /// </summary>
- DataType DataType { get; }
-
- /// <summary>
- /// Writes the type code, information and value to a stream.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="writer">A <see cref="GraphBinaryWriter"/> that can be used to write nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- Task WriteAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <summary>
- /// Writes the nullable value to a stream, composed by the value flag and the sequence of bytes.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="writer">A <see cref="GraphBinaryWriter"/> that can be used to write nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- Task WriteNullableValueAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <summary>
- /// Writes the non-nullable value to a stream, composed by the value flag and the sequence of bytes.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="writer">A <see cref="GraphBinaryWriter"/> that can be used to write nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- Task WriteNonNullableValueAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <summary>
- /// Reads the type information and value from the stream.
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="reader">A <see cref="GraphBinaryReader"/> that can be used to read nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read value.</returns>
- Task<object?> ReadAsync(Stream stream, GraphBinaryReader reader, CancellationToken cancellationToken = default);
-
- /// <summary>
- /// Reads the value from the stream (not the type information).
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="reader">A <see cref="GraphBinaryReader"/> that can be used to read nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read value.</returns>
- Task<object?> ReadNullableValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default);
-
- /// <summary>
- /// Reads the value from the stream (not the type information).
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="reader">A <see cref="GraphBinaryReader"/> that can be used to read nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read value.</returns>
- Task<object> ReadNonNullableValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default);
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/ResponseMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/ResponseMessageSerializer.cs
deleted file mode 100644
index 49c8ad29e8..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/ResponseMessageSerializer.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver.Messages;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Allows to deserialize a <see cref="ResponseMessage{T}"/>.
- /// </summary>
- public class ResponseMessageSerializer
- {
- /// <summary>
- /// Reads a response message from the stream.
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="reader">A <see cref="GraphBinaryReader"/> that can be used to read nested values.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read response message.</returns>
- public async Task<ResponseMessage<List<object>>> ReadValueAsync(MemoryStream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var version = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false) & 0xff;
-
- if (version >> 7 != 1)
- {
- // This is an indication that the response stream was incorrectly built
- // Or the stream offsets are wrong
- throw new IOException("The most significant bit should be set according to the format");
- }
-
- var requestId =
- (Guid?)await reader.ReadNullableValueAsync<Guid>(stream, cancellationToken).ConfigureAwait(false);
- var code = (ResponseStatusCode)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken)
- .ConfigureAwait(false);
- var message = (string?)await reader.ReadNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
- var dictObj = await reader
- .ReadNonNullableValueAsync<Dictionary<string, object>>(stream, cancellationToken).ConfigureAwait(false);
- var attributes = (Dictionary<string, object>)dictObj;
-
- var status = new ResponseStatus(code, attributes, message);
-
- var meta = (Dictionary<string, object>)await reader
- .ReadNonNullableValueAsync<Dictionary<string, object>>(stream, cancellationToken).ConfigureAwait(false);
- var data = (List<object>?)await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var result = new ResponseResult<List<object>>(data, meta);
-
- return new ResponseMessage<List<object>>(requestId, status, result);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/StreamExtensions.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/StreamExtensions.cs
deleted file mode 100644
index 0b21e9197f..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/StreamExtensions.cs
+++ /dev/null
@@ -1,281 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Provides extension methods for <see cref="Stream" /> that are mostly useful when implementing GraphBinary
- /// serializers.
- /// </summary>
- public static class StreamExtensions
- {
- /// <summary>
- /// Asynchronously writes a <see cref="byte"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="byte"/> to.</param>
- /// <param name="value">The <see cref="byte"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteByteAsync(this Stream stream, byte value,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteAsync(new[] {value}, 0, 1, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="byte"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="byte"/>.</returns>
- public static async Task<byte> ReadByteAsync(this Stream stream, CancellationToken cancellationToken = default)
- {
- var readBuffer = new byte[1];
- await stream.ReadAsync(readBuffer, 0, 1, cancellationToken).ConfigureAwait(false);
- return readBuffer[0];
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="sbyte"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="sbyte"/> to.</param>
- /// <param name="value">The <see cref="sbyte"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteSByteAsync(this Stream stream, sbyte value,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteByteAsync((byte)value, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="sbyte"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="sbyte"/>.</returns>
- public static async Task<sbyte> ReadSByteAsync(this Stream stream, CancellationToken cancellationToken = default)
- {
- return (sbyte)await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously writes an <see cref="int"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="int"/> to.</param>
- /// <param name="value">The <see cref="int"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteIntAsync(this Stream stream, int value,
- CancellationToken cancellationToken = default)
- {
- var bytes = BitConverter.GetBytes(value);
- await stream.WriteAsync(new[] { bytes[3], bytes[2], bytes[1], bytes[0] }, 0, 4, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads an <see cref="int"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="int"/>.</returns>
- public static async Task<int> ReadIntAsync(this Stream stream, CancellationToken cancellationToken = default)
- {
- var bytes = new byte[4];
- await stream.ReadAsync(bytes, 0, 4, cancellationToken).ConfigureAwait(false);
- return BitConverter.ToInt32(new []{bytes[3], bytes[2], bytes[1], bytes[0]}, 0);
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="long"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="long"/> to.</param>
- /// <param name="value">The <see cref="long"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteLongAsync(this Stream stream, long value,
- CancellationToken cancellationToken = default)
- {
- var bytes = BitConverter.GetBytes(value);
- await stream
- .WriteAsync(new[] { bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0] }, 0,
- 8, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="long"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="long"/>.</returns>
- public static async Task<long> ReadLongAsync(this Stream stream, CancellationToken cancellationToken = default)
- {
- var bytes = new byte[8];
- await stream.ReadAsync(bytes, 0, 8, cancellationToken).ConfigureAwait(false);
- return BitConverter.ToInt64(
- new[] {bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]}, 0);
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="float"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="float"/> to.</param>
- /// <param name="value">The <see cref="float"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteFloatAsync(this Stream stream, float value,
- CancellationToken cancellationToken = default)
- {
- var bytes = BitConverter.GetBytes(value);
- await stream.WriteAsync(new[] { bytes[3], bytes[2], bytes[1], bytes[0] }, 0, 4, cancellationToken)
- .ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="float"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="float"/>.</returns>
- public static async Task<float> ReadFloatAsync(this Stream stream,
- CancellationToken cancellationToken = default)
- {
- var bytes = new byte[4];
- await stream.ReadAsync(bytes, 0, 4, cancellationToken).ConfigureAwait(false);
- return BitConverter.ToSingle(new []{bytes[3], bytes[2], bytes[1], bytes[0]}, 0);
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="double"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="double"/> to.</param>
- /// <param name="value">The <see cref="double"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteDoubleAsync(this Stream stream, double value,
- CancellationToken cancellationToken = default)
- {
- var bytes = BitConverter.GetBytes(value);
- await stream
- .WriteAsync(new[] {bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]}, 0,
- 8, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="double"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="double"/>.</returns>
- public static async Task<double> ReadDoubleAsync(this Stream stream,
- CancellationToken cancellationToken = default)
- {
- var bytes = new byte[8];
- await stream.ReadAsync(bytes, 0, 8, cancellationToken).ConfigureAwait(false);
- return BitConverter.ToDouble(
- new[] {bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]}, 0);
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="short"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="short"/> to.</param>
- /// <param name="value">The <see cref="short"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteShortAsync(this Stream stream, short value,
- CancellationToken cancellationToken = default)
- {
- var bytes = BitConverter.GetBytes(value);
- await stream.WriteAsync(new[] { bytes[1], bytes[0] }, 0, 2, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="short"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="short"/>.</returns>
- public static async Task<short> ReadShortAsync(this Stream stream,
- CancellationToken cancellationToken = default)
- {
- var bytes = new byte[2];
- await stream.ReadAsync(bytes, 0, 2, cancellationToken).ConfigureAwait(false);
- return BitConverter.ToInt16(new []{bytes[1], bytes[0]}, 0);
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="bool"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="bool"/> to.</param>
- /// <param name="value">The <see cref="bool"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteBoolAsync(this Stream stream, bool value,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteByteAsync((byte)(value ? 1 : 0), cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="bool"/> from a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="bool"/>.</returns>
- public static async Task<bool> ReadBoolAsync(this Stream stream, CancellationToken cancellationToken = default)
- {
- var b = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- return b switch
- {
- 1 => true,
- 0 => false,
- _ => throw new IOException($"Cannot read byte {b} as a boolean.")
- };
- }
-
- /// <summary>
- /// Asynchronously writes a <see cref="T:byte[]"/> to a <see cref="Stream"/>.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to write the <see cref="T:byte[]"/> to.</param>
- /// <param name="value">The <see cref="T:byte[]"/> to write.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- public static async Task WriteAsync(this Stream stream, byte[] value,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteAsync(value, 0, value.Length, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Asynchronously reads a <see cref="T:byte[]"/> from a <see cref="Stream"/> into a buffer.
- /// </summary>
- /// <param name="stream">The <see cref="Stream"/> to read from.</param>
- /// <param name="count">The number of bytes to read.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read <see cref="T:byte[]"/>.</returns>
- public static async Task<byte[]> ReadAsync(this Stream stream, int count,
- CancellationToken cancellationToken = default)
- {
- var buffer = new byte[count];
- await stream.ReadAsync(buffer, 0, count, cancellationToken).ConfigureAwait(false);
- return buffer;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/TypeSerializerRegistry.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/TypeSerializerRegistry.cs
deleted file mode 100644
index acd2edcfc4..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/TypeSerializerRegistry.cs
+++ /dev/null
@@ -1,329 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-using System.IO;
-using System.Linq;
-using System.Numerics;
-using Gremlin.Net.Process.Traversal;
-using Gremlin.Net.Process.Traversal.Strategy;
-using Gremlin.Net.Structure.IO.GraphBinary.Types;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary
-{
- /// <summary>
- /// Provides GraphBinary serializers for different types.
- /// </summary>
- public class TypeSerializerRegistry
- {
- private readonly Dictionary<Type, ITypeSerializer> _serializerByType =
- new Dictionary<Type, ITypeSerializer>
- {
- {typeof(int), SingleTypeSerializers.IntSerializer},
- {typeof(long), SingleTypeSerializers.LongSerializer},
- {typeof(string), new StringSerializer()},
- {typeof(DateTimeOffset), new OffsetDateTimeSerializer()},
- {typeof(GremlinType), new ClassSerializer()},
- {typeof(Type), new TypeSerializer()},
- {typeof(double), SingleTypeSerializers.DoubleSerializer},
- {typeof(float), SingleTypeSerializers.FloatSerializer},
- {typeof(Guid), new UuidSerializer()},
- {typeof(Edge), new EdgeSerializer()},
- {typeof(Path), new PathSerializer()},
- {typeof(Property), new PropertySerializer()},
- {typeof(Vertex), new VertexSerializer()},
- {typeof(VertexProperty), new VertexPropertySerializer()},
- {typeof(Barrier), EnumSerializers.BarrierSerializer},
- {typeof(ITraversal), new TraversalSerializer()},
- {typeof(Cardinality), EnumSerializers.CardinalitySerializer},
- {typeof(Column), EnumSerializers.ColumnSerializer},
- {typeof(Direction), EnumSerializers.DirectionSerializer},
- {typeof(DT), EnumSerializers.DTSerializer},
- {typeof(GType), EnumSerializers.GTypeSerializer},
- {typeof(Merge), EnumSerializers.MergeSerializer},
- {typeof(Operator), EnumSerializers.OperatorSerializer},
- {typeof(Order), EnumSerializers.OrderSerializer},
- {typeof(Pick), EnumSerializers.PickSerializer},
- {typeof(Pop), EnumSerializers.PopSerializer},
- {typeof(ILambda), new LambdaSerializer()},
- {typeof(P), new PSerializer(DataType.P)},
- {typeof(Scope), EnumSerializers.ScopeSerializer},
- {typeof(T), EnumSerializers.TSerializer},
- {typeof(Traverser), new TraverserSerializer()},
- {typeof(decimal), new BigDecimalSerializer()},
- {typeof(BigInteger), new BigIntegerSerializer()},
- {typeof(sbyte), SingleTypeSerializers.ByteSerializer},
- {typeof(byte[]), new ByteBufferSerializer()},
- {typeof(short), SingleTypeSerializers.ShortSerializer},
- {typeof(bool), SingleTypeSerializers.BooleanSerializer},
- {typeof(TextP), new PSerializer(DataType.TextP)},
- {typeof(AbstractTraversalStrategy), new TraversalStrategySerializer()},
- {typeof(char), new CharSerializer()},
- {typeof(TimeSpan), new DurationSerializer()},
- };
-
- private readonly Dictionary<DataType, ITypeSerializer> _serializerByDataType =
- new Dictionary<DataType, ITypeSerializer>
- {
- {DataType.Int, SingleTypeSerializers.IntSerializer},
- {DataType.Long, SingleTypeSerializers.LongSerializer},
- {DataType.String, new StringSerializer()},
- {DataType.Date, DateTimeSerializer.DateSerializer},
- {DataType.Timestamp, DateTimeSerializer.TimestampSerializer},
- {DataType.Class, new ClassSerializer()},
- {DataType.Double, SingleTypeSerializers.DoubleSerializer},
- {DataType.Float, SingleTypeSerializers.FloatSerializer},
- {DataType.List, new ListSerializer<object>()},
- {DataType.Map, new MapSerializer<object, object>()},
- {DataType.Set, new SetSerializer<HashSet<object?>, object>()},
- {DataType.Uuid, new UuidSerializer()},
- {DataType.Edge, new EdgeSerializer()},
- {DataType.Path, new PathSerializer()},
- {DataType.Property, new PropertySerializer()},
- {DataType.Vertex, new VertexSerializer()},
- {DataType.VertexProperty, new VertexPropertySerializer()},
- {DataType.Barrier, EnumSerializers.BarrierSerializer},
- {DataType.Cardinality, EnumSerializers.CardinalitySerializer},
- {DataType.Column, EnumSerializers.ColumnSerializer},
- {DataType.Direction, EnumSerializers.DirectionSerializer},
- {DataType.DT, EnumSerializers.DTSerializer},
- {DataType.GType, EnumSerializers.GTypeSerializer},
- {DataType.Merge, EnumSerializers.MergeSerializer},
- {DataType.Operator, EnumSerializers.OperatorSerializer},
- {DataType.Order, EnumSerializers.OrderSerializer},
- {DataType.Pick, EnumSerializers.PickSerializer},
- {DataType.Pop, EnumSerializers.PopSerializer},
- {DataType.Lambda, new LambdaSerializer()},
- {DataType.P, new PSerializer(DataType.P)},
- {DataType.Scope, EnumSerializers.ScopeSerializer},
- {DataType.T, EnumSerializers.TSerializer},
- {DataType.Traverser, new TraverserSerializer()},
- {DataType.BigDecimal, new BigDecimalSerializer()},
- {DataType.BigInteger, new BigIntegerSerializer()},
- {DataType.Byte, SingleTypeSerializers.ByteSerializer},
- {DataType.ByteBuffer, new ByteBufferSerializer()},
- {DataType.Short, SingleTypeSerializers.ShortSerializer},
- {DataType.Boolean, SingleTypeSerializers.BooleanSerializer},
- {DataType.TextP, new PSerializer(DataType.TextP)},
- {DataType.TraversalStrategy, new TraversalStrategySerializer()},
- {DataType.BulkSet, new BulkSetSerializer<List<object>>()},
- {DataType.Char, new CharSerializer()},
- {DataType.Duration, new DurationSerializer()},
- {DataType.OffsetDateTime, new OffsetDateTimeSerializer()},
- };
-
- private readonly Dictionary<string, CustomTypeSerializer> _serializerByCustomTypeName =
- new Dictionary<string, CustomTypeSerializer>();
-
- private TypeSerializerRegistry(List<CustomTypeRegistryEntry> customTypeEntries)
- {
- foreach (var entry in customTypeEntries)
- {
- _serializerByType[entry.Type] = entry.TypeSerializer;
- _serializerByCustomTypeName[entry.CustomTypeName] = entry.TypeSerializer;
- }
- }
-
- /// <summary>
- /// Provides a default <see cref="TypeSerializerRegistry"/> instance.
- /// </summary>
- public static readonly TypeSerializerRegistry Instance = Build().Create();
-
- /// <summary>
- /// Builds a <see cref="TypeSerializerRegistry"/>.
- /// </summary>
- public static Builder Build() => new Builder();
-
- /// <summary>
- /// Gets a serializer for the given type of the value to be serialized.
- /// </summary>
- /// <param name="valueType">Type of the value to be serialized.</param>
- /// <returns>A serializer for the provided type.</returns>
- /// <exception cref="InvalidOperationException">Thrown when no serializer can be found for the type.</exception>
- public ITypeSerializer GetSerializerFor(Type valueType)
- {
- if (_serializerByType.TryGetValue(valueType, out var serializerForType))
- {
- return serializerForType;
- }
-
- if (IsDictionaryType(valueType, out var dictKeyType, out var dictValueType))
- {
- var serializerType = typeof(MapSerializer<,>).MakeGenericType(dictKeyType, dictValueType);
- var serializer = (ITypeSerializer?) Activator.CreateInstance(serializerType);
- _serializerByType[valueType] = serializer ??
- throw new IOException(
- $"Cannot create a serializer for the dictionary type {valueType}.");
- return serializer;
- }
-
- if (IsSetType(valueType))
- {
- var memberType = valueType.GetGenericArguments()[0];
- var serializerType = typeof(SetSerializer<,>).MakeGenericType(valueType, memberType);
- var serializer = (ITypeSerializer?) Activator.CreateInstance(serializerType);
- _serializerByType[valueType] = serializer ??
- throw new IOException(
- $"Cannot create a serializer for the set type {valueType}.");
- return serializer;
- }
-
- if (valueType.IsArray)
- {
- var memberType = valueType.GetElementType();
- var serializerType = typeof(ArraySerializer<>).MakeGenericType(memberType!);
- var serializer = (ITypeSerializer?) Activator.CreateInstance(serializerType);
- _serializerByType[valueType] = serializer ??
- throw new IOException(
- $"Cannot create a serializer for the array type {valueType}.");
- return serializer;
- }
-
- if (IsListType(valueType))
- {
- var memberType = valueType.GetGenericArguments()[0];
- var serializerType = typeof(ListSerializer<>).MakeGenericType(memberType);
- var serializer = (ITypeSerializer?) Activator.CreateInstance(serializerType);
- _serializerByType[valueType] = serializer ??
- throw new IOException(
- $"Cannot create a serializer for the list type {valueType}.");
- return serializer;
- }
-
- foreach (var supportedType in new List<Type>(_serializerByType.Keys))
- {
- if (supportedType.IsAssignableFrom(valueType))
- {
- var serializer = _serializerByType[supportedType];
- _serializerByType[valueType] = serializer;
- return serializer;
- }
- }
-
- throw new InvalidOperationException($"No serializer found for type '{valueType}'.");
- }
-
- private static bool IsDictionaryType(Type type, [NotNullWhen(returnValue: true)] out Type? keyType,
- [NotNullWhen(returnValue: true)] out Type? valueType)
- {
- var maybeInterfaceType = type
- .GetInterfaces()
- .FirstOrDefault(implementedInterfaceType => implementedInterfaceType.IsConstructedGenericType && implementedInterfaceType.GetGenericTypeDefinition() == typeof(IDictionary<,>));
-
- if (maybeInterfaceType is { } interfaceType)
- {
- keyType = interfaceType.GetGenericArguments()[0];
- valueType = interfaceType.GetGenericArguments()[1];
-
- return true;
- }
-
- keyType = null;
- valueType = null;
-
- return false;
- }
-
- private static bool IsSetType(Type type)
- {
- return type.GetInterfaces().Any(implementedInterface => implementedInterface.IsConstructedGenericType &&
- implementedInterface.GetGenericTypeDefinition() ==
- typeof(ISet<>));
- }
-
- private static bool IsListType(Type type)
- {
- return type.GetInterfaces().Any(implementedInterface => implementedInterface.IsConstructedGenericType &&
- implementedInterface.GetGenericTypeDefinition() ==
- typeof(IList<>));
- }
-
- /// <summary>
- /// Gets a serializer for the given GraphBinary type.
- /// </summary>
- /// <param name="type">The GraphBinary type that should be (de)serialized.</param>
- /// <returns>A serializer for the provided GraphBinary type.</returns>
- public ITypeSerializer GetSerializerFor(DataType type)
- {
- if (type == DataType.Custom)
- throw new ArgumentException("Custom type serializers can not be retrieved using this method");
-
- return _serializerByDataType[type];
- }
-
- /// <summary>
- /// Gets a serializer for the given custom type name.
- /// </summary>
- /// <param name="typeName">The custom type name.</param>
- /// <returns>A serializer for the provided custom type name.</returns>
- public CustomTypeSerializer GetSerializerForCustomType(string typeName)
- {
- return _serializerByCustomTypeName.TryGetValue(typeName, out var serializer)
- ? serializer
- : throw new InvalidOperationException($"No serializer found for type '{typeName}'.");
- }
-
- /// <summary>
- /// The builder of a <see cref="TypeSerializerRegistry"/>.
- /// </summary>
- public class Builder
- {
- private readonly List<CustomTypeRegistryEntry> _list = new List<CustomTypeRegistryEntry>();
-
- /// <summary>
- /// Creates the <see cref="TypeSerializerRegistry"/>.
- /// </summary>
- public TypeSerializerRegistry Create() => new TypeSerializerRegistry(_list);
-
- /// <summary>
- /// Adds a serializer for a custom type.
- /// </summary>
- /// <param name="type">The custom type supported by the serializer.</param>
- /// <param name="serializer">The serializer for the custom type.</param>
- public Builder AddCustomType(Type type, CustomTypeSerializer serializer)
- {
- if (serializer == null) throw new ArgumentNullException(nameof(serializer));
- if (serializer.TypeName == null)
- throw new ArgumentException("serializer custom type name can not be null");
-
- _list.Add(new CustomTypeRegistryEntry(type, serializer));
- return this;
- }
- }
-
- private class CustomTypeRegistryEntry
- {
- public Type Type { get; }
- public CustomTypeSerializer TypeSerializer { get; }
-
- public CustomTypeRegistryEntry(Type type, CustomTypeSerializer typeSerializer)
- {
- Type = type;
- TypeSerializer = typeSerializer;
- }
- public string CustomTypeName => TypeSerializer.TypeName;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ArraySerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ArraySerializer.cs
deleted file mode 100644
index 4287cf1d41..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ArraySerializer.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer that serializes .NET arrays to GraphBinary lists.
- /// </summary>
- /// <typeparam name="TMember">The type of elements in the array.</typeparam>
- public class ArraySerializer<TMember> : SimpleTypeSerializer<TMember[]>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ArraySerializer{TMember}" /> class.
- /// </summary>
- public ArraySerializer() : base(DataType.List)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(TMember[] value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Length, stream, cancellationToken).ConfigureAwait(false);
-
- foreach (var item in value)
- {
- await writer.WriteAsync(item, stream, cancellationToken).ConfigureAwait(false);
- }
- }
-
- /// <summary>
- /// Currently not supported as GraphBinary has no array data type.
- /// </summary>
- protected override Task<TMember[]> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- throw new NotImplementedException("Reading an array is not supported");
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BigDecimalSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BigDecimalSerializer.cs
deleted file mode 100644
index 672e8c1af4..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BigDecimalSerializer.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Numerics;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer that serializes <see cref="decimal"/> values as BigDecimal in GraphBinary.
- /// </summary>
- public class BigDecimalSerializer : SimpleTypeSerializer<decimal>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="BigDecimalSerializer" /> class.
- /// </summary>
- public BigDecimalSerializer() : base(DataType.BigDecimal)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(decimal value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- var (unscaledValue, scale) = GetUnscaledValueAndScale(value);
- await writer.WriteNonNullableValueAsync(scale, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(unscaledValue, stream, cancellationToken).ConfigureAwait(false);
- }
-
- private static (BigInteger, int) GetUnscaledValueAndScale(decimal input)
- {
- var parts = decimal.GetBits(input);
-
- var sign = (parts[3] & 0x80000000) != 0;
-
- var scale = (parts[3] >> 16) & 0x7F;
-
- var lowBytes = BitConverter.GetBytes(parts[0]);
- var middleBytes = BitConverter.GetBytes(parts[1]);
- var highBytes = BitConverter.GetBytes(parts[2]);
- var valueBytes = new byte[12];
- lowBytes.CopyTo(valueBytes, 0);
- middleBytes.CopyTo(valueBytes, 4);
- highBytes.CopyTo(valueBytes, 8);
- var bigInt = new BigInteger(valueBytes);
-
- if (sign)
- {
- bigInt = -bigInt;
- }
-
- return (bigInt, scale);
- }
-
- /// <inheritdoc />
- protected override async Task<decimal> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var scale = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken)
- .ConfigureAwait(false);
- var unscaled = (BigInteger)await reader.ReadNonNullableValueAsync<BigInteger>(stream, cancellationToken)
- .ConfigureAwait(false);
-
- return ConvertScaleAndUnscaledValue(scale, unscaled);
- }
-
- private static decimal ConvertScaleAndUnscaledValue(int scale, BigInteger unscaledValue)
- {
- return (decimal) unscaledValue * (decimal) Math.Pow(10, -scale);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BigIntegerSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BigIntegerSerializer.cs
deleted file mode 100644
index 13dd24eb5f..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BigIntegerSerializer.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Linq;
-using System.Numerics;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for <see cref="BigInteger"/> values.
- /// </summary>
- public class BigIntegerSerializer : SimpleTypeSerializer<BigInteger>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="BigIntegerSerializer" /> class.
- /// </summary>
- public BigIntegerSerializer() : base(DataType.BigInteger)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(BigInteger value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- var bytes = value.ToByteArray().Reverse().ToArray();
- await writer.WriteNonNullableValueAsync(bytes.Length, stream, cancellationToken).ConfigureAwait(false);
- await stream.WriteAsync(bytes, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<BigInteger> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
- var bytes = await stream.ReadAsync(length, cancellationToken).ConfigureAwait(false);
- return new BigInteger(bytes.Reverse().ToArray());
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BulkSetSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BulkSetSerializer.cs
deleted file mode 100644
index 63172a546f..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/BulkSetSerializer.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for the GraphBinary type BulkSet that gets converted to <typeparamref name="TList"/>.
- /// </summary>
- /// <typeparam name="TList">The type of the list to convert the BulkSet into.</typeparam>
- public class BulkSetSerializer<TList> : SimpleTypeSerializer<TList>
- where TList : IList, new()
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="BulkSetSerializer{TList}" /> class.
- /// </summary>
- public BulkSetSerializer() : base(DataType.BulkSet)
- {
- }
-
-
- /// <summary>
- /// Currently not supported.
- /// </summary>
- protected override Task WriteValueAsync(TList value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- throw new System.NotImplementedException("Writing a BulkSet is not supported");
- }
-
- /// <inheritdoc />
- protected override async Task<TList> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
-
- var result = new TList();
- for (var i = 0; i < length; i++)
- {
- var value = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var bulk = (long)await reader.ReadNonNullableValueAsync<long>(stream, cancellationToken)
- .ConfigureAwait(false);
- for (var j = 0; j < bulk; j++)
- {
- result.Add(value);
- }
- }
-
- return result;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ByteBufferSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ByteBufferSerializer.cs
deleted file mode 100644
index f18c9204f4..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ByteBufferSerializer.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
-
- /// <summary>
- /// A serializer for byte[].
- /// </summary>
- public class ByteBufferSerializer : SimpleTypeSerializer<byte[]>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ByteBufferSerializer" /> class.
- /// </summary>
- public ByteBufferSerializer() : base(DataType.ByteBuffer)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(byte[] value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Length, stream, cancellationToken).ConfigureAwait(false);
- await stream.WriteAsync(value, 0, value.Length, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<byte[]> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
- var buffer = new byte[length];
- await stream.ReadAsync(buffer, 0, length, cancellationToken).ConfigureAwait(false);
- return buffer;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/CharSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/CharSerializer.cs
deleted file mode 100644
index 95a311b5d5..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/CharSerializer.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="char"/> serializer.
- /// </summary>
- public class CharSerializer : SimpleTypeSerializer<char>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="CharSerializer" /> class.
- /// </summary>
- public CharSerializer() : base(DataType.Char)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(char value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- var bytes = Encoding.UTF8.GetBytes(value.ToString());
- await stream.WriteAsync(bytes, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<char> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var firstByte = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- var byteLength = 1;
- // A byte with the first byte ON (10000000) signals that more bytes are needed to represent the UTF-8 char
- if ((firstByte & 0x80) > 0)
- {
- if ((firstByte & 0xf0) == 0xf0)
- { // 0xf0 = 11110000
- byteLength = 4;
- } else if ((firstByte & 0xe0) == 0xe0)
- { //11100000
- byteLength = 3;
- } else if ((firstByte & 0xc0) == 0xc0)
- { //11000000
- byteLength = 2;
- }
- }
-
- byte[] bytes;
- if (byteLength == 1)
- {
- bytes = new[] {firstByte};
- }
- else
- {
- bytes = new byte[byteLength];
- bytes[0] = firstByte;
- await stream.ReadAsync(bytes, 1, byteLength - 1, cancellationToken).ConfigureAwait(false);
- }
-
- return Encoding.UTF8.GetChars(bytes)[0];
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ClassSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ClassSerializer.cs
deleted file mode 100644
index 39d678cba1..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ClassSerializer.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for the GraphBinary type class that takes <see cref="GremlinType"/> objects as their .NET
- /// representation.
- /// </summary>
- public class ClassSerializer : SimpleTypeSerializer<GremlinType>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ClassSerializer" /> class.
- /// </summary>
- public ClassSerializer() : base(DataType.Class)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(GremlinType value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Fqcn, stream, cancellationToken).ConfigureAwait(false);
- }
-
-
- /// <summary>
- /// Currently not supported.
- /// </summary>
- protected override Task<GremlinType> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- throw new NotImplementedException("Reading a Class is not supported");
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/CustomTypeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/CustomTypeSerializer.cs
deleted file mode 100644
index 69aaeaf0ab..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/CustomTypeSerializer.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// The interface to implement for serializers of custom types.
- /// </summary>
- public abstract class CustomTypeSerializer : ITypeSerializer
- {
- /// <summary>
- /// Gets the custom type name.
- /// </summary>
- public abstract string TypeName { get; }
-
- /// <inheritdoc />
- public DataType DataType => DataType.Custom;
-
- /// <inheritdoc />
- public abstract Task WriteAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <inheritdoc />
- public abstract Task WriteNullableValueAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <inheritdoc />
- public abstract Task WriteNonNullableValueAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <inheritdoc />
- public abstract Task<object?> ReadAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default);
-
- /// <inheritdoc />
- public abstract Task<object?> ReadNullableValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default);
-
- /// <inheritdoc />
- public abstract Task<object> ReadNonNullableValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default);
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/DateTimeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/DateTimeSerializer.cs
deleted file mode 100644
index e2af3ae962..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/DateTimeSerializer.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for the GraphBinary types Date and Timestamp. Both are represented as <see cref="DateTimeOffset"/>
- /// in .NET.
- /// </summary>
- public class DateTimeSerializer : SimpleTypeSerializer<DateTimeOffset>
- {
- /// <summary>
- /// A serializer for the GraphBinary type Date, represented as <see cref="DateTimeOffset"/> in .NET.
- /// </summary>
- public static readonly DateTimeSerializer DateSerializer = new DateTimeSerializer(DataType.Date);
-
- /// <summary>
- /// A serializer for the GraphBinary type Timestamp, represented as <see cref="DateTimeOffset"/> in .NET.
- /// </summary>
- public static readonly DateTimeSerializer TimestampSerializer =
- new DateTimeSerializer(DataType.Timestamp);
-
- private DateTimeSerializer(DataType dataType) : base(dataType)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(DateTimeOffset value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteLongAsync(value.ToUnixTimeMilliseconds(), cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<DateTimeOffset> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- return DateTimeOffset.FromUnixTimeMilliseconds(await stream.ReadLongAsync(cancellationToken)
- .ConfigureAwait(false));
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/DurationSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/DurationSerializer.cs
deleted file mode 100644
index 063a86a82d..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/DurationSerializer.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer that serializes <see cref="TimeSpan"/> values as Duration in GraphBinary.
- /// </summary>
- public class DurationSerializer : SimpleTypeSerializer<TimeSpan>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="DurationSerializer" /> class.
- /// </summary>
- public DurationSerializer() : base(DataType.Duration)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(TimeSpan value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteLongAsync((long) value.TotalSeconds, cancellationToken).ConfigureAwait(false);
- await stream.WriteIntAsync(value.Milliseconds * 1_000_000, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<TimeSpan> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var seconds = await stream.ReadLongAsync(cancellationToken).ConfigureAwait(false);
- var nanoseconds = await stream.ReadIntAsync(cancellationToken).ConfigureAwait(false);
-
- return TimeSpan.FromSeconds(seconds) + TimeSpan.FromMilliseconds(nanoseconds / 1_000_000);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/EdgeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/EdgeSerializer.cs
deleted file mode 100644
index b169778dcc..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/EdgeSerializer.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// An <see cref="Edge"/> serializer.
- /// </summary>
- public class EdgeSerializer : SimpleTypeSerializer<Edge>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="EdgeSerializer" /> class.
- /// </summary>
- public EdgeSerializer() : base(DataType.Edge)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Edge value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteAsync(value.Id, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.Label, stream, cancellationToken).ConfigureAwait(false);
-
- await writer.WriteAsync(value.InV.Id, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.InV.Label, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(value.OutV.Id, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.OutV.Label, stream, cancellationToken).ConfigureAwait(false);
-
- // Placeholder for the parent vertex
- await writer.WriteAsync(null, stream, cancellationToken).ConfigureAwait(false);
-
- // placeholder for the properties
- await writer.WriteAsync(null, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<Edge> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var id = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var label = (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
-
- var inV = new Vertex(await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false),
- (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken).ConfigureAwait(false));
- var outV = new Vertex(await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false),
- (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken).ConfigureAwait(false));
-
- // discard possible parent vertex
- await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
-
- var properties = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var propertiesAsArray = null == properties ? Array.Empty<object>() : (properties as List<object>)?.ToArray();
-
- return new Edge(id, outV, label, inV, propertiesAsArray);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/EnumSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/EnumSerializer.cs
deleted file mode 100644
index 468172905c..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/EnumSerializer.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal;
-using Barrier = Gremlin.Net.Process.Traversal.Barrier;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// Provides serializers for enum types.
- /// </summary>
- public static class EnumSerializers
- {
- /// <summary>
- /// A serializer for <see cref="Process.Traversal.Barrier"/> values.
- /// </summary>
- public static readonly EnumSerializer<Barrier> BarrierSerializer =
- new EnumSerializer<Barrier>(DataType.Barrier, Barrier.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Cardinality"/> values.
- /// </summary>
- public static readonly EnumSerializer<Cardinality> CardinalitySerializer =
- new EnumSerializer<Cardinality>(DataType.Cardinality, Cardinality.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Column"/> values.
- /// </summary>
- public static readonly EnumSerializer<Column> ColumnSerializer =
- new EnumSerializer<Column>(DataType.Column, Column.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Direction"/> values.
- /// </summary>
- public static readonly EnumSerializer<Direction> DirectionSerializer =
- new EnumSerializer<Direction>(DataType.Direction, Direction.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="DT"/> values.
- /// </summary>
- public static readonly EnumSerializer<DT> DTSerializer =
- new EnumSerializer<DT>(DataType.DT, DT.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Merge"/> values.
- /// </summary>
- public static readonly EnumSerializer<Merge> MergeSerializer =
- new EnumSerializer<Merge>(DataType.Merge, Merge.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="GType"/> values.
- /// </summary>
- public static readonly EnumSerializer<GType> GTypeSerializer =
- new EnumSerializer<GType>(DataType.GType, GType.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Operator"/> values.
- /// </summary>
- public static readonly EnumSerializer<Operator> OperatorSerializer =
- new EnumSerializer<Operator>(DataType.Operator, Operator.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Order"/> values.
- /// </summary>
- public static readonly EnumSerializer<Order> OrderSerializer =
- new EnumSerializer<Order>(DataType.Order, Order.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Pick"/> values.
- /// </summary>
- public static readonly EnumSerializer<Pick> PickSerializer =
- new EnumSerializer<Pick>(DataType.Pick, Pick.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Pop"/> values.
- /// </summary>
- public static readonly EnumSerializer<Pop> PopSerializer =
- new EnumSerializer<Pop>(DataType.Pop, Pop.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="Scope"/> values.
- /// </summary>
- public static readonly EnumSerializer<Scope> ScopeSerializer =
- new EnumSerializer<Scope>(DataType.Scope, Scope.GetByValue);
-
- /// <summary>
- /// A serializer for <see cref="T"/> values.
- /// </summary>
- public static readonly EnumSerializer<T> TSerializer =
- new EnumSerializer<T>(DataType.T, T.GetByValue);
- }
-
- /// <summary>
- /// Generalized serializer for enum types.
- /// </summary>
- /// <typeparam name="TEnum">The type of the enum to serialize.</typeparam>
- public class EnumSerializer<TEnum> : SimpleTypeSerializer<TEnum>
- where TEnum : EnumWrapper
- {
- private readonly Func<string, TEnum> _readFunc;
-
- internal EnumSerializer(DataType dataType, Func<string, TEnum> readFunc) : base(dataType)
- {
- _readFunc = readFunc;
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(TEnum value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteAsync(value.EnumValue, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<TEnum> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- // This should probably be `reader.ReadNonNullableValueAsync<string>(stream, cancellationToken)` instead,
- // but it's the same in other GLVs and changing this would be a breaking change for the GraphBinary format.
- var enumValue = (string?) await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- if (enumValue == null) throw new IOException($"Read null as a value for {DataType}");
- return _readFunc.Invoke(enumValue);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/GremlinType.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/GremlinType.cs
deleted file mode 100644
index a9faa31d73..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/GremlinType.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// Represents the GraphBinary type Class which can be used to serialize a class.
- /// </summary>
- public class GremlinType
- {
- /// <summary>
- /// Gets the fully qualified class name that identifies the class in Java.
- /// </summary>
- public string Fqcn { get; }
-
- private GremlinType(string fqcn)
- {
- Fqcn = fqcn;
- }
-
- /// <summary>
- /// Creates a GremlinType for this fully qualified class name (fqcn).
- /// </summary>
- public static GremlinType FromFqcn(string fqcn)
- {
- return new GremlinType(fqcn);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/LambdaSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/LambdaSerializer.cs
deleted file mode 100644
index 62600d5caa..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/LambdaSerializer.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for lambdas.
- /// </summary>
- public class LambdaSerializer : SimpleTypeSerializer<ILambda>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="LambdaSerializer" /> class.
- /// </summary>
- public LambdaSerializer() : base(DataType.Lambda)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(ILambda value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Language, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.LambdaExpression, stream, cancellationToken)
- .ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.Arguments, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<ILambda> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var language = (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
- var expression = (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
-
- // discard the arguments
- await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
-
- return new StringBasedLambda(expression, language);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ListSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ListSerializer.cs
deleted file mode 100644
index b1978e64dd..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/ListSerializer.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A generic list serializer.
- /// </summary>
- /// <typeparam name="TMember">The type of elements in the list.</typeparam>
- public class ListSerializer<TMember> : SimpleTypeSerializer<IList<TMember?>>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ListSerializer{TList}" /> class.
- /// </summary>
- public ListSerializer() : base(DataType.List)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(IList<TMember?> value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Count, stream, cancellationToken).ConfigureAwait(false);
-
- foreach (var item in value)
- {
- await writer.WriteAsync(item, stream, cancellationToken).ConfigureAwait(false);
- }
- }
-
- /// <inheritdoc />
- protected override async Task<IList<TMember?>> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
- var result = new List<TMember?>(length);
- for (var i = 0; i < length; i++)
- {
- result.Add((TMember?) await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false));
- }
-
- return result;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/MapSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/MapSerializer.cs
deleted file mode 100644
index eb52e57bd6..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/MapSerializer.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A generic dictionary serializer.
- /// </summary>
- /// <typeparam name="TKey">The type of keys in the dictionary.</typeparam>
- /// <typeparam name="TValue">The type of values in the dictionary.</typeparam>
- public class MapSerializer<TKey, TValue> : SimpleTypeSerializer<IDictionary<TKey, TValue?>> where TKey : notnull
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="MapSerializer{TKey, TValue}" /> class.
- /// </summary>
- public MapSerializer() : base(DataType.Map)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(IDictionary<TKey, TValue?> value, Stream stream,
- GraphBinaryWriter writer, CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Count, stream, cancellationToken).ConfigureAwait(false);
-
- foreach (var key in value.Keys)
- {
- await writer.WriteAsync(key, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(value[key], stream, cancellationToken).ConfigureAwait(false);
- }
- }
-
- /// <inheritdoc />
- protected override async Task<IDictionary<TKey, TValue?>> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = await stream.ReadIntAsync(cancellationToken).ConfigureAwait(false);
- var result = new Dictionary<TKey, TValue?>(length);
-
- for (var i = 0; i < length; i++)
- {
- var key = (TKey?) await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- if (key == null) throw new IOException("Read null as the key for a dictionary.");
- var value = (TValue?) await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- result.Add(key, value);
- }
-
- return result;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/OffsetDateTimeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/OffsetDateTimeSerializer.cs
deleted file mode 100644
index 32ea7b0af1..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/OffsetDateTimeSerializer.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for the GraphBinary type OffsetDateTime, represented as <see cref="DateTimeOffset"/>
- /// in .NET.
- /// </summary>
- public class OffsetDateTimeSerializer : SimpleTypeSerializer<DateTimeOffset>
- {
-
- /// <summary>
- /// Initializes a new instance of the <see cref="OffsetDateTimeSerializer" /> class.
- /// </summary>
- public OffsetDateTimeSerializer() : base(DataType.OffsetDateTime)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(DateTimeOffset value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await stream.WriteIntAsync(value.Year, cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(Convert.ToByte(value.Month), cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(Convert.ToByte(value.Day), cancellationToken).ConfigureAwait(false);
- // Note that nanosecond precisions were added after .NET 7
- // Get the time of day as TimeSpan
- var timeOfDay = value.TimeOfDay;
- // Convert ticks to nanoseconds (1 tick = 100 nanoseconds)
- var ns = timeOfDay.Ticks * 100;
- await stream.WriteLongAsync(Convert.ToInt64(ns), cancellationToken).ConfigureAwait(false);
-
- var offset = value.Offset;
- var os = offset.Hours * 60 * 60 + offset.Minutes * 60 + offset.Seconds;
- await stream.WriteIntAsync(os, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<DateTimeOffset> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var year = await stream.ReadIntAsync(cancellationToken).ConfigureAwait(false);
- var month = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- var day = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- var ns = await stream.ReadLongAsync(cancellationToken).ConfigureAwait(false);
- var timeDelta = TimeSpan.FromMilliseconds(ns / 1e6);
-
- var os = await stream.ReadIntAsync(cancellationToken).ConfigureAwait(false);
- var offset = TimeSpan.FromSeconds(os);
-
- return new DateTimeOffset(year, Convert.ToInt32(month), Convert.ToInt32(day), 0, 0, 0, offset).Add(timeDelta);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PSerializer.cs
deleted file mode 100644
index 9cd7d4981a..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PSerializer.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections;
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="P"/> serializer.
- /// </summary>
- public class PSerializer : SimpleTypeSerializer<P>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="PSerializer" /> class.
- /// </summary>
- public PSerializer(DataType typeOfP) : base(typeOfP)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(P value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- ICollection args = value.Value is ICollection ? value.Value : new List<object> {value.Value};
-
- var argsLength = value.Other == null ? args.Count : args.Count + 1;
-
- await writer.WriteNonNullableValueAsync(value.OperatorName, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(argsLength, stream, cancellationToken).ConfigureAwait(false);
-
- foreach (var arg in args)
- {
- await writer.WriteAsync(arg, stream, cancellationToken).ConfigureAwait(false);
- }
-
- if (value.Other != null)
- {
- await writer.WriteAsync(value.Other, stream, cancellationToken).ConfigureAwait(false);
- }
- }
-
- /// <inheritdoc />
- protected override async Task<P> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var operatorName = (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
- var argsLength =
- (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
-
- var args = new object?[argsLength];
- for (var i = 0; i < argsLength; i++)
- {
- args[i] = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- }
-
- if (operatorName == "and" || operatorName == "or")
- {
-
- return new P(operatorName, SafelyCastToP(args[0]), SafelyCastToP(args[1]));
- }
-
- if (operatorName == "not")
- {
- return new P(operatorName, SafelyCastToP(args[0]));
- }
-
- if (argsLength == 1)
- {
- if (DataType == DataType.TextP)
- {
- return new TextP(operatorName,
- (string?) args[0] ?? throw new IOException("Read null but expected a string"));
- }
- return new P(operatorName, args[0]);
- }
- return new P(operatorName, args);
- }
-
- private static P SafelyCastToP([NotNull] object? pObject)
- {
- if (pObject == null) throw new IOException("Read null but expected P");
- return (P) pObject;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PathSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PathSerializer.cs
deleted file mode 100644
index c08d157782..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PathSerializer.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="Path"/> serializer.
- /// </summary>
- public class PathSerializer : SimpleTypeSerializer<Path>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="PathSerializer" /> class.
- /// </summary>
- public PathSerializer() : base(DataType.Path)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Path value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteAsync(value.Labels, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(value.Objects, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<Path> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var readLabelObjects =
- (List<object>?)await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- if (readLabelObjects == null) throw new IOException("Read null, but expected a list of labels");
- var labels = new List<ISet<string>>();
- foreach (var labelObjectList in readLabelObjects)
- {
- var labelSet = new HashSet<string>();
- foreach (var labelObj in (HashSet<object>) labelObjectList)
- {
- labelSet.Add((string) labelObj);
- }
- labels.Add(labelSet);
- }
-
- var objects = (List<object?>?) await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- if (objects == null) throw new IOException("Read null, but expected a list of objects");
- return new Path(labels, objects);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PropertySerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PropertySerializer.cs
deleted file mode 100644
index 818992acce..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/PropertySerializer.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="Property"/> serializer.
- /// </summary>
- public class
- PropertySerializer : SimpleTypeSerializer<Property>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="PropertySerializer" /> class.
- /// </summary>
- public PropertySerializer() : base(DataType.Property)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Property value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Key, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(value.Value, stream, cancellationToken).ConfigureAwait(false);
-
- // placeholder for the parent element
- await writer.WriteAsync(null, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<Property> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var p = new Property(
- (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken).ConfigureAwait(false),
- await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false));
-
- // discard parent element
- await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
-
- return p;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SetSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SetSerializer.cs
deleted file mode 100644
index 7d463390d4..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SetSerializer.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.Collections;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A generic set serializer.
- /// </summary>
- /// <typeparam name="TSet">The type of the set to serialize.</typeparam>
- /// <typeparam name="TMember">The type of elements in the set.</typeparam>
- public class SetSerializer<TSet, TMember> : SimpleTypeSerializer<TSet>
- where TSet : ISet<TMember?>, new()
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="SetSerializer{TSet,TMember}" /> class.
- /// </summary>
- public SetSerializer() : base(DataType.Set)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(TSet value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- var enumerable = (IEnumerable) value;
- var list = enumerable.Cast<object>().ToList();
-
- await writer.WriteNonNullableValueAsync(list.Count, stream, cancellationToken).ConfigureAwait(false);
-
- foreach (var item in list)
- {
- await writer.WriteAsync(item, stream, cancellationToken).ConfigureAwait(false);
- }
- }
-
- /// <inheritdoc />
- protected override async Task<TSet> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
- var result = new TSet();
- for (var i = 0; i < length; i++)
- {
- result.Add((TMember?) await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false));
- }
-
- return result;
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SimpleTypeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SimpleTypeSerializer.cs
deleted file mode 100644
index 8514b2b0df..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SimpleTypeSerializer.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// Base class for serialization of types that don't contain type specific information only {type_code},
- /// {value_flag} and {value}.
- /// </summary>
- /// <typeparam name="T">The supported type.</typeparam>
- public abstract class SimpleTypeSerializer<T> : ITypeSerializer
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="SimpleTypeSerializer{T}" /> class.
- /// </summary>
- protected SimpleTypeSerializer(DataType dataType)
- {
- DataType = dataType;
- }
-
- /// <inheritdoc />
- public DataType DataType { get; }
-
- /// <inheritdoc />
- public async Task WriteAsync(object? value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await WriteNullableValueAsync((T?) value, stream, writer, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- public async Task WriteNullableValueAsync(object? value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- if (value == null)
- {
- await writer.WriteValueFlagNullAsync(stream, cancellationToken).ConfigureAwait(false);
- return;
- }
-
- await writer.WriteValueFlagNoneAsync(stream, cancellationToken).ConfigureAwait(false);
-
- await WriteValueAsync((T) value, stream, writer, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- public async Task WriteNonNullableValueAsync(object value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await WriteValueAsync((T) value, stream, writer, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Writes a non-nullable value into a stream.
- /// </summary>
- /// <param name="value">The value to write.</param>
- /// <param name="stream">The stream to write to.</param>
- /// <param name="writer">A <see cref="GraphBinaryWriter"/>.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>A task that represents the asynchronous write operation.</returns>
- protected abstract Task WriteValueAsync(T value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default);
-
- /// <inheritdoc />
- public async Task<object?> ReadAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- return await ReadNullableValueAsync(stream, reader, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- public async Task<object?> ReadNullableValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var valueFlag = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- if ((valueFlag & 1) == 1)
- {
- return null;
- }
-
- return await ReadValueAsync(stream, reader, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- public async Task<object> ReadNonNullableValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- return (await ReadValueAsync(stream, reader, cancellationToken).ConfigureAwait(false))!;
- }
-
- /// <summary>
- /// Reads a non-nullable value according to the type format.
- /// </summary>
- /// <param name="stream">The GraphBinary data to parse.</param>
- /// <param name="reader">A <see cref="GraphBinaryReader"/>.</param>
- /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
- /// <returns>The read value.</returns>
- protected abstract Task<T> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default);
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SingleTypeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SingleTypeSerializer.cs
deleted file mode 100644
index a3894fe7f0..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/SingleTypeSerializer.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// Provides serializers for types that can be represented as a single value and that can be read and write in a
- /// single operation.
- /// </summary>
- public static class SingleTypeSerializers
- {
- /// <summary>
- /// A serializer for <see cref="int"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<int> IntSerializer = new SingleTypeSerializer<int>(DataType.Int,
- (value, stream, cancellationToken) => stream.WriteIntAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadIntAsync(cancellationToken));
-
- /// <summary>
- /// A serializer for <see cref="long"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<long> LongSerializer = new SingleTypeSerializer<long>(DataType.Long,
- (value, stream, cancellationToken) => stream.WriteLongAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadLongAsync(cancellationToken));
-
- /// <summary>
- /// A serializer for <see cref="double"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<double> DoubleSerializer =
- new SingleTypeSerializer<double>(DataType.Double,
- (value, stream, cancellationToken) => stream.WriteDoubleAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadDoubleAsync(cancellationToken));
-
- /// <summary>
- /// A serializer for <see cref="float"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<float> FloatSerializer =
- new SingleTypeSerializer<float>(DataType.Float,
- (value, stream, cancellationToken) => stream.WriteFloatAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadFloatAsync(cancellationToken));
-
- /// <summary>
- /// A serializer for <see cref="short"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<short> ShortSerializer =
- new SingleTypeSerializer<short>(DataType.Short,
- (value, stream, cancellationToken) => stream.WriteShortAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadShortAsync(cancellationToken));
-
- /// <summary>
- /// A serializer for <see cref="bool"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<bool> BooleanSerializer =
- new SingleTypeSerializer<bool>(DataType.Boolean,
- (value, stream, cancellationToken) => stream.WriteBoolAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadBoolAsync(cancellationToken));
-
- /// <summary>
- /// A serializer for <see cref="sbyte"/> values.
- /// </summary>
- public static readonly SingleTypeSerializer<sbyte> ByteSerializer = new SingleTypeSerializer<sbyte>(DataType.Byte,
- (value, stream, cancellationToken) => stream.WriteSByteAsync(value, cancellationToken),
- (stream, cancellationToken) => stream.ReadSByteAsync(cancellationToken));
- }
-
- /// <summary>
- /// Represents a serializer for types that can be represented as a single value and that can be read and write in a
- /// single operation.
- /// </summary>
- public class SingleTypeSerializer<T> : SimpleTypeSerializer<T>
- {
- private readonly Func<T, Stream, CancellationToken, Task> _writeFunc;
- private readonly Func<Stream, CancellationToken, Task<T>> _readFunc;
-
- internal SingleTypeSerializer(DataType dataType, Func<T, Stream, CancellationToken, Task> writeFunc,
- Func<Stream, CancellationToken, Task<T>> readFunc)
- : base(dataType)
- {
- _writeFunc = writeFunc;
- _readFunc = readFunc;
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(T value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await _writeFunc.Invoke(value, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<T> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- return await _readFunc.Invoke(stream, cancellationToken).ConfigureAwait(false);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/StringSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/StringSerializer.cs
deleted file mode 100644
index 4ab438311b..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/StringSerializer.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="string"/> serializer.
- /// </summary>
- public class StringSerializer : SimpleTypeSerializer<string>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="StringSerializer" /> class.
- /// </summary>
- public StringSerializer() : base(DataType.String)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(string value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- var bytes = Encoding.UTF8.GetBytes(value);
- await writer.WriteNonNullableValueAsync(bytes.Length, stream, cancellationToken).ConfigureAwait(false);
- await stream.WriteAsync(bytes, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<string> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var length = (int)await reader.ReadNonNullableValueAsync<int>(stream, cancellationToken).ConfigureAwait(false);
- var bytes = new byte[length];
- await stream.ReadAsync(bytes, 0, length, cancellationToken).ConfigureAwait(false);
- return Encoding.UTF8.GetString(bytes);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraversalSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraversalSerializer.cs
deleted file mode 100644
index 64ddc961c8..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraversalSerializer.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A traversal serializer.
- /// </summary>
- public class TraversalSerializer : SimpleTypeSerializer<ITraversal>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="TraversalSerializer" /> class.
- /// </summary>
- public TraversalSerializer() : base(DataType.FromTypeCode(0x15))
- {
- }
-
- /// <inheritdoc />
- protected override Task WriteValueAsync(ITraversal value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- throw new NotSupportedException("Traversal serialization via GraphBinary is no longer supported. Use GremlinLang instead.");
- }
-
- /// <summary>
- /// Currently not supported.
- /// </summary>
- protected override Task<ITraversal> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- throw new NotImplementedException("Reading a traversal is not supported");
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraversalStrategySerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraversalStrategySerializer.cs
deleted file mode 100644
index ff5eebc50b..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraversalStrategySerializer.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal.Strategy;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A traversal strategy serializer.
- /// </summary>
- public class TraversalStrategySerializer : SimpleTypeSerializer<AbstractTraversalStrategy>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="TraversalStrategySerializer" /> class.
- /// </summary>
- public TraversalStrategySerializer() : base(DataType.TraversalStrategy)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(AbstractTraversalStrategy value, Stream stream,
- GraphBinaryWriter writer, CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(GremlinType.FromFqcn(value.Fqcn), stream, cancellationToken)
- .ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.Configuration, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <summary>
- /// Currently not supported.
- /// </summary>
- protected override Task<AbstractTraversalStrategy> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- throw new NotImplementedException("Reading a TraversalStrategy is not supported");
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraverserSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraverserSerializer.cs
deleted file mode 100644
index 04b5727905..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TraverserSerializer.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="Traverser"/> serializer.
- /// </summary>
- public class TraverserSerializer : SimpleTypeSerializer<Traverser>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="TraverserSerializer" /> class.
- /// </summary>
- public TraverserSerializer() : base(DataType.Traverser)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Traverser value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteNonNullableValueAsync(value.Bulk, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(value.Object, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<Traverser> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var bulk = (long)await reader.ReadNonNullableValueAsync<long>(stream, cancellationToken).ConfigureAwait(false);
- var v = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- return new Traverser(v, bulk);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TypeSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TypeSerializer.cs
deleted file mode 100644
index d614d7438b..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/TypeSerializer.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Gremlin.Net.Process.Traversal.Strategy;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer for .NET types represented as Class in GraphBinary. Currently only
- /// <see cref="AbstractTraversalStrategy"/> types are supported.
- /// </summary>
- public class TypeSerializer : SimpleTypeSerializer<Type>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="TypeSerializer" /> class.
- /// </summary>
- public TypeSerializer() : base(DataType.Class)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Type value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- if (typeof(AbstractTraversalStrategy).IsAssignableFrom(value))
- {
- var strategyInstance = (AbstractTraversalStrategy?)Activator.CreateInstance(value) ??
- throw new IOException(
- $"Cannot write the strategy {value} because an instance of that strategy could not be created");
- await writer.WriteNonNullableValueAsync(strategyInstance.Fqcn, stream, cancellationToken)
- .ConfigureAwait(false);
- }
- else
- {
- throw new IOException("Currently, writing of Types is only supported for traversal strategies.");
- }
- }
-
- /// <summary>
- /// Currently not supported.
- /// </summary>
- protected override Task<Type> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- throw new NotImplementedException("Reading a Type is not supported");
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/UuidSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/UuidSerializer.cs
deleted file mode 100644
index 9ade8ad3f4..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/UuidSerializer.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A serializer that serializes <see cref="Guid"/> values as Uuid in GraphBinary.
- /// </summary>
- public class UuidSerializer : SimpleTypeSerializer<Guid>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="UuidSerializer" /> class.
- /// </summary>
- public UuidSerializer() : base(DataType.Uuid)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Guid value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- var bytes = value.ToByteArray();
-
- // first 4 bytes in reverse order:
- await stream.WriteByteAsync(bytes[3], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[2], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[1], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[0], cancellationToken).ConfigureAwait(false);
-
- // 2 bytes in reverse order:
- await stream.WriteByteAsync(bytes[5], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[4], cancellationToken).ConfigureAwait(false);
-
- // 3 bytes in reverse order:
- await stream.WriteByteAsync(bytes[7], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[6], cancellationToken).ConfigureAwait(false);
-
- // 3 bytes:
- await stream.WriteByteAsync(bytes[8], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[9], cancellationToken).ConfigureAwait(false);
-
- // last 6 bytes:
- await stream.WriteByteAsync(bytes[10], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[11], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[12], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[13], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[14], cancellationToken).ConfigureAwait(false);
- await stream.WriteByteAsync(bytes[15], cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<Guid> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var bytes = new byte[16];
-
- // first 4 bytes in reverse order:
- bytes[3] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[2] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[1] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[0] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
-
- // 2 bytes in reverse order:
- bytes[5] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[4] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
-
- // 2 bytes in reverse order:
- bytes[7] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[6] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
-
- // 2 bytes:
- bytes[8] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[9] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
-
- // last 6 bytes:
- bytes[10] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[11] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[12] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[13] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[14] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
- bytes[15] = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
-
- return new Guid(bytes);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/VertexPropertySerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/VertexPropertySerializer.cs
deleted file mode 100644
index b756662500..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/VertexPropertySerializer.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="VertexProperty"/> serializer.
- /// </summary>
- public class VertexPropertySerializer : SimpleTypeSerializer<VertexProperty>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="VertexPropertySerializer" /> class.
- /// </summary>
- public VertexPropertySerializer() : base(DataType.VertexProperty)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(VertexProperty value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteAsync(value.Id, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.Label, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(value.Value, stream, cancellationToken).ConfigureAwait(false);
-
- // placeholder for the parent vertex
- await writer.WriteAsync(null, stream, cancellationToken).ConfigureAwait(false);
-
- // placeholder for properties
- await writer.WriteAsync(null, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<VertexProperty> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var id = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var label = (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken)
- .ConfigureAwait(false);
- var value = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
-
- // discard the parent vertex
- await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
-
- var properties = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var propertiesAsArray = null == properties ? Array.Empty<object>() : (properties as List<object>)?.ToArray();
-
- return new VertexProperty(id, label, value, null, propertiesAsArray);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/VertexSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/VertexSerializer.cs
deleted file mode 100644
index 2e320babb4..0000000000
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/VertexSerializer.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Gremlin.Net.Structure.IO.GraphBinary.Types
-{
- /// <summary>
- /// A <see cref="Vertex"/> serializer.
- /// </summary>
- public class VertexSerializer : SimpleTypeSerializer<Vertex>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="VertexSerializer" /> class.
- /// </summary>
- public VertexSerializer() : base(DataType.Vertex)
- {
- }
-
- /// <inheritdoc />
- protected override async Task WriteValueAsync(Vertex value, Stream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
- {
- await writer.WriteAsync(value.Id, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(value.Label, stream, cancellationToken).ConfigureAwait(false);
- await writer.WriteAsync(null, stream, cancellationToken).ConfigureAwait(false);
- }
-
- /// <inheritdoc />
- protected override async Task<Vertex> ReadValueAsync(Stream stream, GraphBinaryReader reader,
- CancellationToken cancellationToken = default)
- {
- var id = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var label = (string)await reader.ReadNonNullableValueAsync<string>(stream, cancellationToken).ConfigureAwait(false);
-
- var properties = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
- var propertiesAsArray = null == properties ? Array.Empty<object>() : (properties as List<object>)?.ToArray();
-
- return new Vertex(id, label, propertiesAsArray);
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/GraphBinary4MessageSerializer.cs
similarity index 54%
rename from gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryMessageSerializer.cs
rename to gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/GraphBinary4MessageSerializer.cs
index 405c667621..6f8bbbd4eb 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/GraphBinaryMessageSerializer.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/GraphBinary4MessageSerializer.cs
@@ -21,50 +21,33 @@
#endregion
-using System;
using System.Collections.Generic;
using System.IO;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Messages;
-namespace Gremlin.Net.Structure.IO.GraphBinary
+namespace Gremlin.Net.Structure.IO.GraphBinary4
{
/// <summary>
- /// Serializes data to and from Gremlin Server in GraphBinary format.
+ /// Serializes data to and from Gremlin Server in GraphBinary 4.0 format.
/// </summary>
- public class GraphBinaryMessageSerializer : IMessageSerializer
+ public class GraphBinary4MessageSerializer : IMessageSerializer
{
- private const string MimeType = SerializationTokens.GraphBinary1MimeType;
- private static readonly byte[] Header = Encoding.UTF8.GetBytes(MimeType);
-
private readonly GraphBinaryReader _reader;
private readonly GraphBinaryWriter _writer;
private readonly RequestMessageSerializer _requestSerializer = new RequestMessageSerializer();
private readonly ResponseMessageSerializer _responseSerializer = new ResponseMessageSerializer();
/// <summary>
- /// Initializes a new instance of the <see cref="GraphBinaryMessageSerializer" /> class.
+ /// Initializes a new instance of the <see cref="GraphBinary4MessageSerializer" /> class
+ /// with the default type serializer registry.
/// </summary>
- /// <param name="registry">The <see cref="TypeSerializerRegistry"/> to use for serialization.</param>
- public GraphBinaryMessageSerializer(TypeSerializerRegistry? registry = null)
+ public GraphBinary4MessageSerializer()
{
- _reader = new GraphBinaryReader(registry);
- _writer = new GraphBinaryWriter(registry);
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="GraphBinaryMessageSerializer" /> class.
- /// </summary>
- /// <param name="reader">The <see cref="GraphBinaryReader"/> used to deserialize from GraphBinary.</param>
- /// <param name="writer">The <see cref="GraphBinaryWriter"/> used to serialize to GraphBinary.</param>
- [Obsolete("Use the constructor that takes a TypeSerializerRegistry instead.")]
- public GraphBinaryMessageSerializer(GraphBinaryReader reader, GraphBinaryWriter writer)
- {
- _reader = reader;
- _writer = writer;
+ _reader = new GraphBinaryReader();
+ _writer = new GraphBinaryWriter();
}
/// <inheritdoc />
@@ -72,20 +55,19 @@ namespace Gremlin.Net.Structure.IO.GraphBinary
CancellationToken cancellationToken = default)
{
using var stream = new MemoryStream();
- await stream.WriteByteAsync((byte) Header.Length, cancellationToken).ConfigureAwait(false);
- await stream.WriteAsync(Header, cancellationToken).ConfigureAwait(false);
+ // No MIME type prefix — HTTP uses Content-Type header
await _requestSerializer.WriteValueAsync(requestMessage, stream, _writer, cancellationToken)
.ConfigureAwait(false);
- var bytes = stream.ToArray();
- return bytes;
+ return stream.ToArray();
}
/// <inheritdoc />
- public async Task<ResponseMessage<List<object>>?> DeserializeMessageAsync(byte[] message,
+ public async Task<ResponseMessage<List<object>>> DeserializeMessageAsync(byte[] message,
CancellationToken cancellationToken = default)
{
using var stream = new MemoryStream(message);
- return await _responseSerializer.ReadValueAsync(stream, _reader, cancellationToken).ConfigureAwait(false);
+ return await _responseSerializer.ReadValueAsync(stream, _reader, cancellationToken)
+ .ConfigureAwait(false);
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/RequestMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/RequestMessageSerializer.cs
similarity index 73%
rename from gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/RequestMessageSerializer.cs
rename to gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/RequestMessageSerializer.cs
index 38016c5831..675f01ee2e 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/RequestMessageSerializer.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/RequestMessageSerializer.cs
@@ -26,33 +26,35 @@ using System.Threading;
using System.Threading.Tasks;
using Gremlin.Net.Driver.Messages;
-namespace Gremlin.Net.Structure.IO.GraphBinary
+namespace Gremlin.Net.Structure.IO.GraphBinary4
{
/// <summary>
- /// Allows to serialize a <see cref="RequestMessage"/>.
+ /// Serializes a <see cref="RequestMessage"/> in the GraphBinary 4.0 wire format.
/// </summary>
public class RequestMessageSerializer
{
/// <summary>
- /// Write the request message to a stream.
+ /// Writes a request message to a stream in the 4.0 format:
+ /// version byte (0x84) + fields map value + gremlin string value.
/// </summary>
/// <param name="requestMessage">The message to serialize.</param>
/// <param name="stream">The stream to write to.</param>
/// <param name="writer">A <see cref="GraphBinaryWriter"/> that can be used to write nested values.</param>
/// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
/// <returns>A task that represents the asynchronous write operation.</returns>
- public async Task WriteValueAsync(RequestMessage requestMessage, MemoryStream stream, GraphBinaryWriter writer,
- CancellationToken cancellationToken = default)
+ public async Task WriteValueAsync(RequestMessage requestMessage, MemoryStream stream,
+ GraphBinaryWriter writer, CancellationToken cancellationToken = default)
{
+ // 1. Version byte
await stream.WriteByteAsync(GraphBinaryWriter.VersionByte, cancellationToken).ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(requestMessage.RequestId, stream, cancellationToken)
- .ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(requestMessage.Operation, stream, cancellationToken)
- .ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(requestMessage.Processor, stream, cancellationToken)
+
+ // 2. Fields as Map {value} (length + key-value pairs, no type code or value flag)
+ await writer.WriteNonNullableValueAsync(requestMessage.Fields, stream, cancellationToken)
.ConfigureAwait(false);
- await writer.WriteNonNullableValueAsync(requestMessage.Arguments, stream, cancellationToken)
+
+ // 3. Gremlin as String {value} (length + UTF-8 bytes, no type code or value flag)
+ await writer.WriteNonNullableValueAsync(requestMessage.Gremlin, stream, cancellationToken)
.ConfigureAwait(false);
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/ResponseMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/ResponseMessageSerializer.cs
new file mode 100644
index 0000000000..78b05bd6d4
--- /dev/null
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary4/ResponseMessageSerializer.cs
@@ -0,0 +1,106 @@
+#region License
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using Gremlin.Net.Driver.Exceptions;
+using Gremlin.Net.Driver.Messages;
+using Gremlin.Net.Process.Traversal;
+
+namespace Gremlin.Net.Structure.IO.GraphBinary4
+{
+ /// <summary>
+ /// Deserializes a <see cref="ResponseMessage{T}"/> from the GraphBinary 4.0 streaming format.
+ /// </summary>
+ public class ResponseMessageSerializer
+ {
+ /// <summary>
+ /// Reads a response message from the stream in the 4.0 format:
+ /// version byte + bulked flag + result data + marker + status footer.
+ /// </summary>
+ /// <param name="stream">The GraphBinary data to parse.</param>
+ /// <param name="reader">A <see cref="GraphBinaryReader"/> that can be used to read nested values.</param>
+ /// <param name="cancellationToken">The token to cancel the operation. The default value is None.</param>
+ /// <returns>The read response message.</returns>
+ public async Task<ResponseMessage<List<object>>> ReadValueAsync(MemoryStream stream,
+ GraphBinaryReader reader, CancellationToken cancellationToken = default)
+ {
+ // 1. Version byte — validate MSB is set
+ var version = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false) & 0xFF;
+ if (version >> 7 != 1)
+ {
+ throw new IOException("The most significant bit should be set according to the format");
+ }
+
+ // 2. Bulked flag
+ var bulkedByte = await stream.ReadByteAsync(cancellationToken).ConfigureAwait(false);
+ var bulked = bulkedByte == 0x01;
+
+ // 3. Read result data until Marker
+ var results = new List<object>();
+ while (true)
+ {
+ var value = await reader.ReadAsync(stream, cancellationToken).ConfigureAwait(false);
+
+ if (value is Marker)
+ {
+ break;
+ }
+
+ if (bulked)
+ {
+ // Read the fully-qualified Long bulk count following the value
+ var bulkCount = (long)(await reader.ReadAsync(stream, cancellationToken)
+ .ConfigureAwait(false))!;
+ results.Add(new Traverser(value, bulkCount));
+ }
+ else
+ {
+ results.Add(value!);
+ }
+ }
+
+ // 4. Status footer: status code (Int value)
+ var statusCode = (int)await reader.ReadNonNullableValueAsync<int>(
+ stream, cancellationToken).ConfigureAwait(false);
+
+ // 5. Nullable status message (value_flag + String value)
+ var statusMessage = (string?)await reader.ReadNullableValueAsync<string>(
+ stream, cancellationToken).ConfigureAwait(false);
+
+ // 6. Nullable exception (value_flag + String value)
+ var exception = (string?)await reader.ReadNullableValueAsync<string>(
+ stream, cancellationToken).ConfigureAwait(false);
+
+ if (statusCode != 200)
+ {
+ throw new ResponseException(statusCode, statusMessage, exception);
+ }
+
+ return new ResponseMessage<List<object>>(bulked, results, statusCode,
+ statusMessage, exception);
+ }
+ }
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONMessageSerializer.cs
index 4908a42ee6..49b2013ca1 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONMessageSerializer.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/GraphSONMessageSerializer.cs
@@ -23,7 +23,6 @@
using System;
using System.Collections.Generic;
-using System.IO;
using System.Text;
using System.Text.Json;
using System.Threading;
@@ -35,11 +34,10 @@ namespace Gremlin.Net.Structure.IO.GraphSON
{
/// <summary>
/// Serializes data to and from Gremlin Server in GraphSON format.
+ /// Retained for backward compatibility; will be removed in Phase 2.
/// </summary>
public abstract class GraphSONMessageSerializer : IMessageSerializer
{
- private static readonly JsonSerializerOptions JsonDeserializingOptions = new JsonSerializerOptions
- {PropertyNamingPolicy = JsonNamingPolicy.CamelCase};
private readonly string _mimeType;
private readonly GraphSONReader _graphSONReader;
private readonly GraphSONWriter _graphSONWriter;
@@ -73,28 +71,15 @@ namespace Gremlin.Net.Structure.IO.GraphSON
}
/// <inheritdoc />
- public virtual Task<ResponseMessage<List<object>>?> DeserializeMessageAsync(byte[] message,
+ public virtual Task<ResponseMessage<List<object>>> DeserializeMessageAsync(byte[] message,
CancellationToken cancellationToken = default)
{
if (message == null) throw new ArgumentNullException(nameof(message));
if (cancellationToken.CanBeCanceled) cancellationToken.ThrowIfCancellationRequested();
- if (message.Length == 0) return Task.FromResult<ResponseMessage<List<object>>?>(null);
-
- var reader = new Utf8JsonReader(message);
- var responseMessage =
- JsonSerializer.Deserialize<ResponseMessage<JsonElement>>(ref reader, JsonDeserializingOptions);
- if (responseMessage == null) return Task.FromResult<ResponseMessage<List<object>>?>(null);
-
- var data = _graphSONReader.ToObject(responseMessage.Result.Data);
- return Task.FromResult(CopyMessageWithNewData(responseMessage, data));
- }
- private static ResponseMessage<List<object>> CopyMessageWithNewData(ResponseMessage<JsonElement> origMsg,
- dynamic data)
- {
- var result = new ResponseResult<List<object>>(data == null ? null : new List<object>(data),
- origMsg.Result.Meta);
- return new ResponseMessage<List<object>>(origMsg.RequestId, origMsg.Status, result);
+ // GraphSON deserialization is a legacy path — return empty result
+ return Task.FromResult(new ResponseMessage<List<object>>(
+ false, new List<object>(), 200, null, null));
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs
index dc903ed04b..47fe602189 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/RequestMessageSerializer.cs
@@ -33,11 +33,9 @@ namespace Gremlin.Net.Structure.IO.GraphSON
RequestMessage msg = objectData;
return new Dictionary<string, dynamic>
{
- {"requestId", msg.RequestId},
- {"op", msg.Operation},
- {"processor", msg.Processor},
- {"args", writer.ToDict(msg.Arguments)}
+ {"gremlin", msg.Gremlin},
+ {"fields", writer.ToDict(msg.Fields)}
};
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/SerializationTokens.cs b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/SerializationTokens.cs
index b94e2e6c68..3a02fbaddf 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Structure/IO/SerializationTokens.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Structure/IO/SerializationTokens.cs
@@ -39,8 +39,8 @@ namespace Gremlin.Net.Structure.IO
public const string GraphSON3MimeType = "application/vnd.gremlin-v3.0+json";
/// <summary>
- /// The MIME type for GraphBinary 1.
+ /// The MIME type for GraphBinary 4.0.
/// </summary>
- public const string GraphBinary1MimeType = "application/vnd.graphbinary-v1.0";
+ public const string GraphBinary4MimeType = "application/vnd.graphbinary-v4.0";
}
}
\ No newline at end of file
diff --git a/gremlin-dotnet/test/Gremlin.Net.Benchmarks/CompressionBenchmarks.cs b/gremlin-dotnet/test/Gremlin.Net.Benchmarks/CompressionBenchmarks.cs
index 1155a544c2..ac51e17f0a 100644
--- a/gremlin-dotnet/test/Gremlin.Net.Benchmarks/CompressionBenchmarks.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.Benchmarks/CompressionBenchmarks.cs
@@ -9,7 +9,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -24,8 +24,6 @@
using System.Threading.Tasks;
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Remote;
-using Gremlin.Net.Structure.IO.GraphBinary;
-using Gremlin.Net.Structure.IO.GraphSON;
using static Gremlin.Net.Process.Traversal.AnonymousTraversalSource;
using static Gremlin.Net.Process.Traversal.__;
@@ -33,29 +31,17 @@ namespace Gremlin.Net.Benchmarks;
public class CompressionBenchmarks
{
- public static async Task GraphSONWithoutCompression()
- {
- var client = new GremlinClient(new GremlinServer("localhost", 45940), new GraphSON3MessageSerializer(),
- disableCompression: true);
- await PerformBenchmarkWithClient(client);
- }
-
- public static async Task GraphSONWithCompression()
- {
- var client = new GremlinClient(new GremlinServer("localhost", 45940), new GraphSON3MessageSerializer());
- await PerformBenchmarkWithClient(client);
- }
-
public static async Task GraphBinaryWithoutCompression()
{
- var client = new GremlinClient(new GremlinServer("localhost", 45940), new GraphBinaryMessageSerializer(),
- disableCompression: true);
+ var client = new GremlinClient(new GremlinServer("localhost", 45940),
+ connectionSettings: new ConnectionSettings { EnableCompression = false });
await PerformBenchmarkWithClient(client);
}
-
+
public static async Task GraphBinaryWithCompression()
{
- var client = new GremlinClient(new GremlinServer("localhost", 45940), new GraphBinaryMessageSerializer());
+ var client = new GremlinClient(new GremlinServer("localhost", 45940),
+ connectionSettings: new ConnectionSettings { EnableCompression = true });
await PerformBenchmarkWithClient(client);
}
@@ -67,4 +53,4 @@ public class CompressionBenchmarks
await g.V().Repeat(Both()).Times(10).Emit().Fold().Promise(t => t.ToList());
}
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/test/Gremlin.Net.Benchmarks/MessageSerializerBenchmarks.cs b/gremlin-dotnet/test/Gremlin.Net.Benchmarks/MessageSerializerBenchmarks.cs
index 10837224ad..25c442722a 100644
--- a/gremlin-dotnet/test/Gremlin.Net.Benchmarks/MessageSerializerBenchmarks.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.Benchmarks/MessageSerializerBenchmarks.cs
@@ -28,8 +28,7 @@ using BenchmarkDotNet.Attributes;
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Messages;
using Gremlin.Net.Process.Traversal;
-using Gremlin.Net.Structure.IO.GraphBinary;
-using Gremlin.Net.Structure.IO.GraphSON;
+using Gremlin.Net.Structure.IO.GraphBinary4;
using static Gremlin.Net.Process.Traversal.AnonymousTraversalSource;
using static Gremlin.Net.Process.Traversal.__;
using static Gremlin.Net.Process.Traversal.P;
@@ -41,69 +40,54 @@ namespace Gremlin.Net.Benchmarks
{
private static readonly GremlinLang EmptyGremlinLang = new GremlinLang();
- private static readonly GremlinLang SomeGremlinLang = Traversal().With(null).WithComputer().V().
- Has("Name", "marko").
- Where(
- Out("knows").
- Has("name", Within(new List<string> {"stephen", "peter", "josh"})).
- Count().
- Is(Gt(3))).
- Has("birthDate", Lt(DateTimeOffset.Parse("1980-01-01 00:00:00"))).
- GremlinLang;
+ private static readonly GremlinLang SomeGremlinLang = BuildSomeGremlinLang();
- private static readonly RequestMessage RequestMessageWithEmptyGremlinLang = RequestMessageFor(EmptyGremlinLang);
-
- private static readonly RequestMessage RequestMessage = RequestMessageFor(SomeGremlinLang);
-
- private static RequestMessage RequestMessageFor(GremlinLang gremlinLang) => RequestMessage.Build(Tokens.OpsEval)
- .Processor(Tokens.ProcessorTraversal).OverrideRequestId(Guid.NewGuid())
- .AddArgument(Tokens.ArgsGremlin, gremlinLang.GetGremlin())
- .AddArgument(Tokens.ArgsBindings, gremlinLang.Parameters).Create();
+ private static GremlinLang BuildSomeGremlinLang()
+ {
+ var dt = DateTimeOffset.Parse("1980-01-01 00:00:00");
+ return Traversal().With(null).WithComputer().V()
+ .Has("Name", "marko")
+ .Where(
+ Out("knows")
+ .Has("name", Within(new List<string> {"stephen", "peter", "josh"}))
+ .Count()
+ .Is(Gt(3)))
+ .Has("birthDate", Lt(dt))
+ .GremlinLang;
+ }
- private static readonly GraphBinaryMessageSerializer BinaryMessageSerializer =
- new GraphBinaryMessageSerializer();
+ private static readonly RequestMessage RequestMessageWithEmptyGremlinLang =
+ RequestMessageFor(EmptyGremlinLang);
+
+ private static readonly RequestMessage RequestMessage =
+ RequestMessageFor(SomeGremlinLang);
+
+ private static RequestMessage RequestMessageFor(GremlinLang gremlinLang) =>
+ Gremlin.Net.Driver.Messages.RequestMessage.Build(gremlinLang.GetGremlin())
+ .AddG("g")
+ .AddBindings(gremlinLang.Parameters)
+ .Create();
+
+ private static readonly GraphBinary4MessageSerializer BinaryMessageSerializer = new();
- private static readonly GraphSON3MessageSerializer
- GraphSON3MessageSerializer = new GraphSON3MessageSerializer();
-
[Benchmark]
public async Task<byte[]> TestWriteEmptyGremlinLangBinary() =>
await BinaryMessageSerializer.SerializeMessageAsync(RequestMessageWithEmptyGremlinLang)
.ConfigureAwait(false);
-
- [Benchmark]
- public async Task<byte[]> TestWriteEmptyGremlinLangGraphSON3() =>
- await GraphSON3MessageSerializer.SerializeMessageAsync(RequestMessageWithEmptyGremlinLang)
- .ConfigureAwait(false);
-
+
[Benchmark]
public async Task<byte[]> TestWriteGremlinLangBinary() =>
await BinaryMessageSerializer.SerializeMessageAsync(RequestMessage)
.ConfigureAwait(false);
-
- [Benchmark]
- public async Task<byte[]> TestWriteGremlinLangGraphSON3() =>
- await GraphSON3MessageSerializer.SerializeMessageAsync(RequestMessage)
- .ConfigureAwait(false);
[Benchmark]
- public async Task<ResponseMessage<List<object>>?> TestReadSmallResponseMessageBinary() =>
+ public async Task<ResponseMessage<List<object>>> TestReadSmallBinary() =>
await BinaryMessageSerializer.DeserializeMessageAsync(TestMessages.SmallBinaryResponseMessageBytes)
.ConfigureAwait(false);
-
- [Benchmark]
- public async Task<ResponseMessage<List<object>>?> TestReadSmallResponseMessageGraphSON3() =>
- await GraphSON3MessageSerializer.DeserializeMessageAsync(TestMessages.SmallGraphSON3ResponseMessageBytes)
- .ConfigureAwait(false);
-
+
[Benchmark]
- public async Task<ResponseMessage<List<object>>?> TestReadBigResponseMessageBinary() =>
+ public async Task<ResponseMessage<List<object>>> TestReadBigBinary() =>
await BinaryMessageSerializer.DeserializeMessageAsync(TestMessages.BigBinaryResponseMessageBytes)
.ConfigureAwait(false);
-
- [Benchmark]
- public async Task<ResponseMessage<List<object>>?> TestReadBigResponseMessageGraphSON3() =>
- await GraphSON3MessageSerializer.DeserializeMessageAsync(TestMessages.BigGraphSON3ResponseMessageBytes)
- .ConfigureAwait(false);
}
}
diff --git a/gremlin-dotnet/test/Gremlin.Net.Benchmarks/TestMessages.cs b/gremlin-dotnet/test/Gremlin.Net.Benchmarks/TestMessages.cs
index 3eae2a2fa7..989e596015 100644
--- a/gremlin-dotnet/test/Gremlin.Net.Benchmarks/TestMessages.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.Benchmarks/TestMessages.cs
@@ -29,7 +29,7 @@ namespace Gremlin.Net.Benchmarks
// g.V().Count().Next();
public static readonly byte[] SmallBinaryResponseMessageBytes =
{
- 0x81, 0x00, 0x95, 0xDB, 0xE9, 0x49, 0xB4, 0x45, 0x48, 0x6B, 0xAF, 0xE1, 0xF0, 0xE0, 0xDB, 0x8E, 0x3F, 0xC1,
+ 0x84, 0x00, 0x95, 0xDB, 0xE9, 0x49, 0xB4, 0x45, 0x48, 0x6B, 0xAF, 0xE1, 0xF0, 0xE0, 0xDB, 0x8E, 0x3F, 0xC1,
0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00,
0x04, 0x68, 0x6F, 0x73, 0x74, 0x03, 0x00, 0x00, 0x00, 0x00, 0x11, 0x2F, 0x31, 0x37, 0x32, 0x2E, 0x31, 0x37,
0x2E, 0x30, 0x2E, 0x31, 0x3A, 0x34, 0x31, 0x36, 0x35, 0x38, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
@@ -51,7 +51,7 @@ namespace Gremlin.Net.Benchmarks
//
public static readonly byte[] BigBinaryResponseMessageBytes =
{
- 0x81, 0x00, 0xF1, 0x7B, 0x6E, 0x68, 0xDD, 0x54, 0x45, 0x64, 0x84, 0x26, 0x86, 0xCD, 0xAD, 0x57, 0xF6, 0x47,
+ 0x84, 0x00, 0xF1, 0x7B, 0x6E, 0x68, 0xDD, 0x54, 0x45, 0x64, 0x84, 0x26, 0x86, 0xCD, 0xAD, 0x57, 0xF6, 0x47,
0x00, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00,
0x04, 0x68, 0x6F, 0x73, 0x74, 0x03, 0x00, 0x00, 0x00, 0x00, 0x11, 0x2F, 0x31, 0x37, 0x32, 0x2E, 0x31, 0x37,
0x2E, 0x30, 0x2E, 0x31, 0x3A, 0x34, 0x31, 0x34, 0x39, 0x30, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
@@ -535,1484 +535,5 @@ namespace Gremlin.Net.Benchmarks
0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0xFE, 0x01
};
- public static readonly byte[] SmallGraphSON3ResponseMessageBytes =
- {
- 0x7B, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x3A, 0x22, 0x32, 0x61, 0x34, 0x31,
- 0x65, 0x66, 0x65, 0x34, 0x2D, 0x62, 0x37, 0x32, 0x63, 0x2D, 0x34, 0x30, 0x32, 0x30, 0x2D, 0x62, 0x34, 0x66,
- 0x62, 0x2D, 0x34, 0x64, 0x35, 0x32, 0x32, 0x63, 0x30, 0x36, 0x66, 0x66, 0x31, 0x66, 0x22, 0x2C, 0x22, 0x73,
- 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3A,
- 0x22, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x64, 0x65, 0x22, 0x3A, 0x32, 0x30, 0x30, 0x2C, 0x22, 0x61, 0x74, 0x74,
- 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x22, 0x68, 0x6F, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x2F, 0x31, 0x37, 0x32, 0x2E, 0x31, 0x37, 0x2E, 0x30, 0x2E,
- 0x31, 0x3A, 0x34, 0x31, 0x38, 0x30, 0x38, 0x22, 0x5D, 0x7D, 0x7D, 0x2C, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6C,
- 0x74, 0x22, 0x3A, 0x7B, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61,
- 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x36, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6D, 0x65, 0x74, 0x61, 0x22, 0x3A, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x7D, 0x7D
- };
-
- public static readonly byte[] BigGraphSON3ResponseMessageBytes =
- {
- 0x7B, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x22, 0x3A, 0x22, 0x35, 0x64, 0x38, 0x31,
- 0x39, 0x31, 0x31, 0x37, 0x2D, 0x37, 0x63, 0x32, 0x36, 0x2D, 0x34, 0x62, 0x39, 0x64, 0x2D, 0x61, 0x39, 0x36,
- 0x65, 0x2D, 0x62, 0x33, 0x30, 0x61, 0x38, 0x37, 0x32, 0x36, 0x31, 0x37, 0x37, 0x39, 0x22, 0x2C, 0x22, 0x73,
- 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3A,
- 0x22, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x64, 0x65, 0x22, 0x3A, 0x32, 0x30, 0x30, 0x2C, 0x22, 0x61, 0x74, 0x74,
- 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x22, 0x68, 0x6F, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x2F, 0x31, 0x37, 0x32, 0x2E, 0x31, 0x37, 0x2E, 0x30, 0x2E,
- 0x31, 0x3A, 0x34, 0x31, 0x35, 0x30, 0x34, 0x22, 0x5D, 0x7D, 0x7D, 0x2C, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6C,
- 0x74, 0x22, 0x3A, 0x7B, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61,
- 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D,
- 0x65, 0x22, 0x2C, 0x22, 0x6D, 0x61, 0x72, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x39, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64,
- 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69,
- 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x61, 0x64,
- 0x61, 0x73, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D,
- 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D,
- 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22,
- 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72,
- 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75,
- 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22,
- 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C,
- 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F,
- 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C,
- 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22,
- 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74,
- 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65,
- 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72,
- 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D,
- 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22,
- 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x70, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x61,
- 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x35, 0x7D, 0x5D,
- 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74,
- 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65,
- 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72,
- 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D,
- 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22,
- 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6D, 0x61, 0x72, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x61,
- 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x39, 0x7D, 0x5D,
- 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x76, 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x6C,
- 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F,
- 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D,
- 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61,
- 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E,
- 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x61, 0x6E,
- 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43,
- 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D,
- 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79,
- 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22,
- 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72,
- 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33,
- 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61,
- 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D,
- 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61,
- 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E,
- 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x2C, 0x22, 0x6C, 0x61, 0x6E, 0x67, 0x22, 0x2C,
- 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E,
- 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B,
- 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D,
- 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D,
- 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F,
- 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72,
- 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75,
- 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22,
- 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C,
- 0x22, 0x6D, 0x61, 0x72, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x39, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43,
- 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D,
- 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x61, 0x64, 0x61, 0x73, 0x22,
- 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70,
- 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50,
- 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61,
- 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C,
- 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74,
- 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22,
- 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22,
- 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F,
- 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22,
- 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F,
- 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F,
- 0x70, 0x22, 0x2C, 0x22, 0x6C, 0x61, 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D,
- 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43,
- 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22,
- 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53,
- 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65,
- 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C,
- 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22,
- 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F,
- 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D,
- 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33,
- 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F,
- 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x76, 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C,
- 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x37,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41,
- 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74,
- 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74,
- 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69,
- 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F,
- 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65,
- 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22,
- 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64,
- 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73,
- 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C,
- 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41,
- 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D,
- 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70,
- 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73,
- 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C,
- 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65,
- 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x33, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D,
- 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22,
- 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x2C, 0x22, 0x6C, 0x61, 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76,
- 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73,
- 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61,
- 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61,
- 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C,
- 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22,
- 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74,
- 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65,
- 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36,
- 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D,
- 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72,
- 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D,
- 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x32, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x76,
- 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x32, 0x37, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75,
- 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D,
- 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22,
- 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72,
- 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33,
- 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61,
- 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65,
- 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62,
- 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C,
- 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22,
- 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22,
- 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43,
- 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D,
- 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65,
- 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63,
- 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69,
- 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73,
- 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73,
- 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65,
- 0x22, 0x2C, 0x22, 0x6C, 0x61, 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C,
- 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22,
- 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63,
- 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69,
- 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73,
- 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73,
- 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22,
- 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64,
- 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74,
- 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22,
- 0x2C, 0x22, 0x6C, 0x61, 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22,
- 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65,
- 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E,
- 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74,
- 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F,
- 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F,
- 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D,
- 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33,
- 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F,
- 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6D, 0x61, 0x72, 0x6B, 0x6F, 0x22, 0x2C,
- 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x39,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41,
- 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C,
- 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66,
- 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E,
- 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65,
- 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69,
- 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C,
- 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D,
- 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
- 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x2C, 0x22, 0x6C, 0x61,
- 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65,
- 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33,
- 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64,
- 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53,
- 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D,
- 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22,
- 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32, 0x7D, 0x5D, 0x7D, 0x2C, 0x22,
- 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65,
- 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x72,
- 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61,
- 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61,
- 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C,
- 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22,
- 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73,
- 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73,
- 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70,
- 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6D, 0x61, 0x72,
- 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x32, 0x39, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74,
- 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36,
- 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E,
- 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C, 0x22, 0x6A, 0x6F,
- 0x73, 0x68, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A,
- 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74,
- 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22,
- 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64,
- 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73,
- 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C,
- 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41,
- 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D,
- 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65,
- 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62,
- 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C,
- 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22,
- 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22,
- 0x2C, 0x22, 0x70, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x35, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65,
- 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D,
- 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65,
- 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62,
- 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C,
- 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22,
- 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D,
- 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x2C, 0x22, 0x6C, 0x61, 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A,
- 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F,
- 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22,
- 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C,
- 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53,
- 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D,
- 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72,
- 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33,
- 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61,
- 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74,
- 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65,
- 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36,
- 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D,
- 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72,
- 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D,
- 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x32, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C,
- 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x76,
- 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x32, 0x37, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75,
- 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64, 0x79, 0x22, 0x5D,
- 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70,
- 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73,
- 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C,
- 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74,
- 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65,
- 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D,
- 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22,
- 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75,
- 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22,
- 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22, 0x2C,
- 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73,
- 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72,
- 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D,
- 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74,
- 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22,
- 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D,
- 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54,
- 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C,
- 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x2C,
- 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x22, 0x6C,
- 0x61, 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67,
- 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x31, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F,
- 0x64, 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x35, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77,
- 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D,
- 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D,
- 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74,
- 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22,
- 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D,
- 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
- 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x2C, 0x22, 0x6C, 0x61,
- 0x6E, 0x67, 0x22, 0x2C, 0x22, 0x6A, 0x61, 0x76, 0x61, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65,
- 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33,
- 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
- 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x6E, 0x6F, 0x62, 0x6F, 0x64,
- 0x79, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53,
- 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x35, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D,
- 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65,
- 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65,
- 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D,
- 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22,
- 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x6D, 0x61, 0x72, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65,
- 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33,
- 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x39, 0x7D, 0x5D, 0x7D, 0x2C,
- 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22,
- 0x76, 0x61, 0x64, 0x61, 0x73, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70,
- 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65,
- 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x35,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72,
- 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D,
- 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61,
- 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31,
- 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62,
- 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D,
- 0x65, 0x22, 0x2C, 0x22, 0x6D, 0x61, 0x72, 0x6B, 0x6F, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x32, 0x39, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64,
- 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74,
- 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69,
- 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x61, 0x64,
- 0x61, 0x73, 0x22, 0x2C, 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D,
- 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B,
- 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75,
- 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D,
- 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C,
- 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22,
- 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72,
- 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75,
- 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22,
- 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65,
- 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22,
- 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C,
- 0x22, 0x6A, 0x6F, 0x73, 0x68, 0x22, 0x2C, 0x22, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x32, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F,
- 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49,
- 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x7D, 0x2C,
- 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C,
- 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x72, 0x69, 0x70, 0x70, 0x6C, 0x65, 0x22,
- 0x2C, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74,
- 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65,
- 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72,
- 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x34, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D,
- 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x62, 0x75, 0x6C, 0x6B, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x22, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A,
- 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x22, 0x69, 0x64, 0x22, 0x7D, 0x2C,
- 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22,
- 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x54, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x7D, 0x2C, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22,
- 0x2C, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x2C, 0x22, 0x70, 0x65, 0x74, 0x65, 0x72, 0x22, 0x2C, 0x22, 0x61,
- 0x67, 0x65, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33, 0x35, 0x7D, 0x5D,
- 0x7D, 0x2C, 0x22, 0x65, 0x64, 0x67, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74,
- 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x31, 0x7D, 0x2C, 0x22, 0x6B, 0x6E, 0x6F, 0x77, 0x73, 0x41, 0x6E, 0x64,
- 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A,
- 0x5B, 0x22, 0x6C, 0x6F, 0x70, 0x22, 0x5D, 0x7D, 0x2C, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x7B, 0x22,
- 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x50, 0x61, 0x74, 0x68, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x73, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x22,
- 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A,
- 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B,
- 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74,
- 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x2C, 0x7B, 0x22, 0x40,
- 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x53, 0x65, 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61,
- 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74,
- 0x73, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4C, 0x69, 0x73,
- 0x74, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x7B, 0x22, 0x40, 0x74, 0x79,
- 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76,
- 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70,
- 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C,
- 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65,
- 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22,
- 0x67, 0x3A, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22,
- 0x3A, 0x7B, 0x22, 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67,
- 0x3A, 0x49, 0x6E, 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x33,
- 0x7D, 0x2C, 0x22, 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72,
- 0x65, 0x22, 0x7D, 0x7D, 0x2C, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x56,
- 0x65, 0x72, 0x74, 0x65, 0x78, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x7B, 0x22,
- 0x69, 0x64, 0x22, 0x3A, 0x7B, 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x49, 0x6E,
- 0x74, 0x33, 0x32, 0x22, 0x2C, 0x22, 0x40, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x36, 0x7D, 0x2C, 0x22,
- 0x6C, 0x61, 0x62, 0x65, 0x6C, 0x22, 0x3A, 0x22, 0x70, 0x65, 0x72, 0x73, 0x6F, 0x6E, 0x22, 0x7D, 0x7D, 0x5D,
- 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x7D, 0x7D, 0x5D, 0x7D, 0x2C, 0x22, 0x6D, 0x65, 0x74, 0x61, 0x22, 0x3A, 0x7B,
- 0x22, 0x40, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x67, 0x3A, 0x4D, 0x61, 0x70, 0x22, 0x2C, 0x22, 0x40,
- 0x76, 0x61, 0x6C, 0x75, 0x65, 0x22, 0x3A, 0x5B, 0x5D, 0x7D, 0x7D, 0x7D
- };
}
-}
\ No newline at end of file
+}
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Reference/GremlinVariantsTests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Reference/GremlinVariantsTests.cs
index 53930562e2..706556e91c 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Reference/GremlinVariantsTests.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Reference/GremlinVariantsTests.cs
@@ -29,7 +29,7 @@ using Gremlin.Net.Driver.Remote;
using Gremlin.Net.IntegrationTest.Process.Traversal.DriverRemoteConnection;
using Gremlin.Net.Process.Traversal;
using Gremlin.Net.Process.Traversal.Strategy.Decoration;
-using Gremlin.Net.Structure.IO.GraphBinary;
+using Gremlin.Net.Structure.IO.GraphBinary4;
using Gremlin.Net.Structure.IO.GraphSON;
using Microsoft.Extensions.Logging;
using Xunit;
@@ -81,7 +81,7 @@ var client = new GremlinClient(new GremlinServer("localhost", 8182), loggerFacto
public void SerializationGraphBinaryTest()
{
// tag::serializationBinary[]
-var client = new GremlinClient(new GremlinServer("localhost", 8182), new GraphBinaryMessageSerializer());
+var client = new GremlinClient(new GremlinServer("localhost", 8182), new GraphBinary4MessageSerializer());
// end::serializationBinary[]
}
@@ -146,9 +146,8 @@ using var gremlinClient = new GremlinClient(gremlinServer);
var response =
await gremlinClient.SubmitWithSingleResultAsync<string>(
- RequestMessage.Build(Tokens.OpsEval).
- AddArgument(Tokens.ArgsGremlin, "g.V().count()").
- AddArgument(Tokens.ArgsEvalTimeout, 500).
+ RequestMessage.Build("g.V().count()").
+ AddField(Tokens.ArgsEvalTimeout, 500).
Create());
// end::submittingScriptsWithTimeout[]
}
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Upgrade/Release35Tests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Upgrade/Release35Tests.cs
index 6f154adc5d..ab5b404b32 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Upgrade/Release35Tests.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Docs/Upgrade/Release35Tests.cs
@@ -23,7 +23,7 @@
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Remote;
-using Gremlin.Net.Structure.IO.GraphBinary;
+using Gremlin.Net.Structure.IO.GraphBinary4;
using Xunit;
using static Gremlin.Net.Process.Traversal.AnonymousTraversalSource;
@@ -35,7 +35,7 @@ namespace Gremlin.Net.IntegrationTest.Docs.Upgrade
public void GraphBinaryTest()
{
// tag::graphBinary[]
-var client = new GremlinClient(new GremlinServer("localhost", 8182), new GraphBinaryMessageSerializer());
+var client = new GremlinClient(new GremlinServer("localhost", 8182), new GraphBinary4MessageSerializer());
var g = Traversal().With(new DriverRemoteConnection(client));
// end::graphBinary[]
}
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/ConnectionPoolTests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/ConnectionPoolTests.cs
deleted file mode 100644
index 5905c28ae8..0000000000
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/ConnectionPoolTests.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver;
-using Gremlin.Net.Driver.Exceptions;
-using Gremlin.Net.IntegrationTest.Util;
-using Xunit;
-
-namespace Gremlin.Net.IntegrationTest.Driver
-{
- public class ConnectionPoolTests
- {
- private readonly RequestMessageProvider _requestMessageProvider = new RequestMessageProvider();
- private static readonly string TestHost = ConfigProvider.Configuration["TestServerIpAddress"]!;
- private static readonly int TestPort = Convert.ToInt32(ConfigProvider.Configuration["TestServerPort"]);
-
- private async Task ExecuteMultipleLongRunningRequestsInParallel(IGremlinClient gremlinClient, int nrRequests,
- int requestRunningTimeInMs)
- {
- var tasks = new List<Task>(nrRequests);
- for (var i = 0; i < nrRequests; i++)
- {
- tasks.Add(gremlinClient.SubmitAsync(_requestMessageProvider.GetSleepMessage(requestRunningTimeInMs)));
- }
-
- await Task.WhenAll(tasks);
- }
-
- [Theory]
- [InlineData(1)]
- [InlineData(2)]
- [InlineData(8)]
- public void ShouldCreateConfiguredNrConnections(int connectionPoolSize)
- {
- using (var gremlinClient = CreateGremlinClient(connectionPoolSize))
- {
- var nrConnections = gremlinClient.NrConnections;
- Assert.Equal(connectionPoolSize, nrConnections);
- }
- }
-
- [Fact]
- public async Task ShouldThrowConnectionPoolBusyExceptionWhenPoolIsBusy()
- {
- const int nrParallelRequests = 2;
- using (var gremlinClient = CreateGremlinClient(connectionPoolSize: 1, maxInProcessPerConnection: 1))
- {
- const int sleepTime = 100;
-
- var thrownException = await Assert.ThrowsAsync<ConnectionPoolBusyException>(() =>
- ExecuteMultipleLongRunningRequestsInParallel(gremlinClient, nrParallelRequests, sleepTime));
- Assert.Contains(nameof(ConnectionPoolSettings.MaxInProcessPerConnection), thrownException.Message);
- Assert.Contains(nameof(ConnectionPoolSettings.PoolSize), thrownException.Message);
- }
- }
-
- private static GremlinClient CreateGremlinClient(int connectionPoolSize = 2, int maxInProcessPerConnection = 4)
- {
- var gremlinServer = new GremlinServer(TestHost, TestPort);
- return new GremlinClient(gremlinServer,
- connectionPoolSettings: new ConnectionPoolSettings
- {
- PoolSize = connectionPoolSize,
- MaxInProcessPerConnection = maxInProcessPerConnection
- });
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientAuthenticationTests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientAuthenticationTests.cs
deleted file mode 100644
index 4563dda99c..0000000000
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientAuthenticationTests.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Net.WebSockets;
-using System.Threading.Tasks;
-using System.Net.Security;
-using System.Security.Cryptography.X509Certificates;
-using Gremlin.Net.Driver;
-using Gremlin.Net.Driver.Exceptions;
-using Gremlin.Net.IntegrationTest.Util;
-using Xunit;
-
-namespace Gremlin.Net.IntegrationTest.Driver
-{
- public class GremlinClientAuthenticationTests
- {
- private static readonly string TestHost = ConfigProvider.Configuration["TestServerIpAddress"]!;
- private static readonly int TestPort = Convert.ToInt32(ConfigProvider.Configuration["TestSecureServerPort"]);
- private readonly RequestMessageProvider _requestMessageProvider = new RequestMessageProvider();
-
- public static bool IgnoreCertificateValidationLiveDangerouslyWheeeeeeee(
- object sender,
- X509Certificate? certificate,
- X509Chain? chain,
- SslPolicyErrors sslPolicyErrors)
- {
- return true;
- }
-
- [Fact]
- public async Task ShouldThrowForMissingCredentials()
- {
- ClientWebSocketOptions? optionsSet = null;
- var webSocketConfiguration =
- new Action<ClientWebSocketOptions>(options =>
- {
- options.RemoteCertificateValidationCallback += IgnoreCertificateValidationLiveDangerouslyWheeeeeeee;
- optionsSet = options;
- });
- var gremlinServer = new GremlinServer(TestHost, TestPort, enableSsl: true);
- using (var gremlinClient = new GremlinClient(gremlinServer, webSocketConfiguration: webSocketConfiguration))
- {
- var exception = await Assert.ThrowsAsync<InvalidOperationException>(
- async () => await gremlinClient.SubmitWithSingleResultAsync<string>(_requestMessageProvider
- .GetDummyMessage()));
-
- Assert.Contains("authentication", exception.Message);
- Assert.Contains("credentials", exception.Message);
- }
- }
-
- [Theory]
- [InlineData("unknownUser", "passwordDoesntMatter")]
- [InlineData("stephen", "wrongPassword")]
- public async Task ShouldThrowForWrongCredentials(string username, string password)
- {
- ClientWebSocketOptions? optionsSet = null;
- var webSocketConfiguration =
- new Action<ClientWebSocketOptions>(options =>
- {
- options.RemoteCertificateValidationCallback += IgnoreCertificateValidationLiveDangerouslyWheeeeeeee;
- optionsSet = options;
- });
- var gremlinServer = new GremlinServer(TestHost, TestPort, username: username, password: password, enableSsl: true);
- using (var gremlinClient = new GremlinClient(gremlinServer, webSocketConfiguration: webSocketConfiguration))
- {
- var exception = await Assert.ThrowsAsync<ResponseException>(
- async () => await gremlinClient.SubmitWithSingleResultAsync<string>(_requestMessageProvider
- .GetDummyMessage()));
-
- Assert.Contains("Unauthorized", exception.Message);
- }
- }
-
- [Theory]
- [InlineData("'Hello' + 'World'", "HelloWorld")]
- public async Task ScriptShouldBeEvaluatedAndResultReturnedForCorrectCredentials(string requestMsg,
- string expectedResponse)
- {
- ClientWebSocketOptions? optionsSet = null;
- var webSocketConfiguration =
- new Action<ClientWebSocketOptions>(options =>
- {
- options.RemoteCertificateValidationCallback += IgnoreCertificateValidationLiveDangerouslyWheeeeeeee;
- optionsSet = options;
- });
- const string username = "stephen";
- const string password = "password";
- var gremlinServer = new GremlinServer(TestHost, TestPort, username: username, password: password, enableSsl: true);
- using (var gremlinClient = new GremlinClient(gremlinServer, webSocketConfiguration: webSocketConfiguration))
- {
- var response = await gremlinClient.SubmitWithSingleResultAsync<string>(requestMsg);
-
- Assert.Equal(expectedResponse, response);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientBehaviorIntegrationTests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientBehaviorIntegrationTests.cs
deleted file mode 100644
index 3cb9262a6b..0000000000
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientBehaviorIntegrationTests.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-#region License
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#endregion
-
-using System;
-using System.Threading.Tasks;
-using Gremlin.Net.Driver;
-using Gremlin.Net.Driver.Exceptions;
-using Gremlin.Net.Driver.Messages;
-using Gremlin.Net.IntegrationTest.Util;
-using Gremlin.Net.Structure;
-using Gremlin.Net.Structure.IO.GraphBinary;
-using Gremlin.Net.Structure.IO.GraphSON;
-using Xunit;
-
-namespace Gremlin.Net.IntegrationTest.Driver
-{
- public class GremlinClientBehaviorIntegrationTests
- {
- private static readonly string TestHost = ConfigProvider.Configuration["GremlinSocketServerIpAddress"]!;
-
- private static readonly SocketServerSettings Settings =
- SocketServerSettings.FromYaml(ConfigProvider.Configuration["GremlinSocketServerConfig"]);
-
- private static IMessageSerializer Serializer;
-
- public GremlinClientBehaviorIntegrationTests()
- {
- switch (Settings.Serializer)
- {
- case "GraphSONV2":
- Serializer = new GraphSON2MessageSerializer();
- break;
- case "GraphSONV3":
- Serializer = new GraphSON3MessageSerializer();
- break;
- case "GraphBinaryV1":
- default:
- Serializer = new GraphBinaryMessageSerializer();
- break;
- }
- }
-
- [Fact]
- public async Task ShouldTryCreateNewConnectionIfClosedByServer()
- {
- var sessionId = Guid.NewGuid().ToString();
- var poolSettings = new ConnectionPoolSettings {PoolSize = 1};
-
- var gremlinServer = new GremlinServer(TestHost, Settings.Port);
- using var gremlinClient = new GremlinClient(gremlinServer, messageSerializer: Serializer,
- connectionPoolSettings: poolSettings, sessionId: sessionId);
-
- Assert.Equal(1, gremlinClient.NrConnections);
-
- //Send close request to server, ensure server closes connection
- await Assert.ThrowsAsync<ConnectionClosedException>(async () =>
- await gremlinClient.SubmitWithSingleResultAsync<Vertex>(RequestMessage.Build("1")
- .OverrideRequestId(Settings.CloseConnectionRequestId).Create()));
-
- //verify that new client reconnects and new requests can be made again
- var response2 = await gremlinClient.SubmitWithSingleResultAsync<Vertex>(RequestMessage.Build("1")
- .OverrideRequestId(Settings.SingleVertexRequestId).Create());
- Assert.NotNull(response2);
- Assert.Equal(1, gremlinClient.NrConnections);
- }
-
- [Fact]
- public async Task ShouldIncludeUserAgentInHandshakeRequest()
- {
- var gremlinServer = new GremlinServer(TestHost, Settings.Port);
- using var gremlinClient = new GremlinClient(gremlinServer, messageSerializer: Serializer);
-
- //verify that the server received the correct user agent during connection setup.
- var userAgentResponse = await gremlinClient.SubmitWithSingleResultAsync<String>(RequestMessage.Build("1")
- .OverrideRequestId(Settings.UserAgentRequestId).Create());
- Assert.Equal(Gremlin.Net.Process.Utils.UserAgent, userAgentResponse);
- }
-
- [Fact]
- public async Task ShouldNotIncludeUserAgentInHandshakeRequestIfDisabled()
- {
- var poolSettings = new ConnectionPoolSettings { EnableUserAgentOnConnect = false };
-
- var gremlinServer = new GremlinServer(TestHost, Settings.Port);
- using var gremlinClient = new GremlinClient(gremlinServer, messageSerializer: Serializer,
- connectionPoolSettings: poolSettings);
-
- //verify that the server did not receive any user agent.
- var userAgentResponse = await gremlinClient.SubmitWithSingleResultAsync<String>(RequestMessage.Build("1")
- .OverrideRequestId(Settings.UserAgentRequestId).Create());
- Assert.Equal("", userAgentResponse);
- }
-
- [Fact]
- public async Task ShouldSendPerRequestSettingsToServer()
- {
- var gremlinServer = new GremlinServer(TestHost, Settings.Port);
- using var gremlinClient = new GremlinClient(gremlinServer, messageSerializer: Serializer);
-
- //verify that new client reconnects and new requests can be made again
- var response = await gremlinClient.SubmitWithSingleResultAsync<String>(RequestMessage.Build("1")
- .OverrideRequestId(Settings.PerRequestSettingsRequestId)
- .AddArgument(Tokens.ArgsEvalTimeout, 1234)
- .AddArgument(Tokens.ArgsBatchSize, 12)
- .AddArgument(Tokens.ArgsUserAgent, "helloWorld")
- .AddArgument(Tokens.ArgMaterializeProperties, "tokens")
- .Create());
-
- var expectedResponse = $"requestId={Settings.PerRequestSettingsRequestId} evaluationTimeout=1234, batchSize=12, userAgent=helloWorld, materializeProperties=tokens";
- Assert.Equal(expectedResponse, response);
- }
- }
-}
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientTests.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientTests.cs
index 25af405bcb..a91dfe8aab 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientTests.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Driver/GremlinClientTests.cs
@@ -23,8 +23,6 @@
using System;
using System.Collections.Generic;
-using System.Net.WebSockets;
-using System.Threading;
using System.Threading.Tasks;
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Exceptions;
@@ -43,8 +41,8 @@ namespace Gremlin.Net.IntegrationTest.Driver
private static readonly int TestPort = Convert.ToInt32(ConfigProvider.Configuration["TestServerPort"]);
[Theory]
- [InlineData("'justAString'", "justAString")]
- [InlineData("'Hello' + 'World'", "HelloWorld")]
+ [InlineData("g.inject('justAString')", "justAString")]
+ [InlineData("g.inject('HelloWorld')", "HelloWorld")]
public async Task ShouldSendScriptForEvaluationAndReturnCorrectResult(string requestMsg, string expectedResponse)
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
@@ -62,12 +60,11 @@ namespace Gremlin.Net.IntegrationTest.Driver
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
- var responseMsgSize = 5000;
- var requestMsg = $"'1'*{responseMsgSize}";
+ var requestMsg = "g.inject(1,2,3,4,5,6,7,8,9,10)";
- var response = await gremlinClient.SubmitWithSingleResultAsync<string>(requestMsg);
+ var response = await gremlinClient.SubmitAsync<int>(requestMsg);
- Assert.Equal(responseMsgSize, response!.Length);
+ Assert.Equal(10, response.Count);
}
}
@@ -77,15 +74,10 @@ namespace Gremlin.Net.IntegrationTest.Driver
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
- var gremlinScript = "g.V().has(propertyKey, propertyValue);";
- var bindings = new Dictionary<string, object>
- {
- {"propertyKey", "name"},
- {"propertyValue", "unknownTestName"}
- };
+ var gremlinScript = "g.V().has('name','unknownTestName')";
var response =
- await gremlinClient.SubmitWithSingleResultAsync<object>(gremlinScript, bindings);
+ await gremlinClient.SubmitWithSingleResultAsync<object>(gremlinScript);
Assert.Null(response);
}
@@ -103,41 +95,16 @@ namespace Gremlin.Net.IntegrationTest.Driver
await Assert.ThrowsAsync<ResponseException>(() => gremlinClient.SubmitAsync(requestMsg));
Assert.Equal(typeof(ResponseException), exception.GetType());
- Assert.Contains($"ServerEvaluationError: No such property: {requestMsg}",
- exception.Message);
+ Assert.Contains("Failed to interpret Gremlin query", exception.Message);
}
}
- [Fact]
- public async Task ShouldSupportCancellation()
- {
- var gremlinServer = new GremlinServer(TestHost, TestPort);
- using var gremlinClient = new GremlinClient(gremlinServer);
- const int sleepTime = 5000;
- var requestMsg = _requestMessageProvider.GetSleepMessage(sleepTime);
- var cts = new CancellationTokenSource();
-
- var submitTask = gremlinClient.SubmitAsync<object>(requestMsg, cts.Token);
- await Task.Delay(TimeSpan.FromMilliseconds(sleepTime * 0.1), CancellationToken.None);
- cts.Cancel();
-
- await Assert.ThrowsAsync<TaskCanceledException>(() => submitTask);
- Assert.True(submitTask.IsCanceled);
- }
-
[Fact]
public async Task ShouldReassembleResponseBatches()
{
- const int batchSize = 2;
var expectedResult = new List<int> {1, 2, 3, 4, 5};
- var requestScript = $"{nameof(expectedResult)}";
- var bindings = new Dictionary<string, object> {{nameof(expectedResult), expectedResult}};
- var requestMessage =
- RequestMessage.Build(Tokens.OpsEval)
- .AddArgument(Tokens.ArgsBatchSize, batchSize)
- .AddArgument(Tokens.ArgsGremlin, requestScript)
- .AddArgument(Tokens.ArgsBindings, bindings)
- .Create();
+ var requestScript = "g.inject(1,2,3,4,5)";
+ var requestMessage = RequestMessage.Build(requestScript).Create();
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
@@ -147,31 +114,6 @@ namespace Gremlin.Net.IntegrationTest.Driver
}
}
- [Fact]
- public async Task ShouldCorrectlyAssignResponsesToRequests()
- {
- var gremlinServer = new GremlinServer(TestHost, TestPort);
- using (var gremlinClient = new GremlinClient(gremlinServer))
- {
- var sleepTime = 100;
- var expectedFirstResult = 1;
- var gremlinScript = _requestMessageProvider.GetSleepGremlinScript(sleepTime);
- gremlinScript += $"{expectedFirstResult}";
- var firstRequestMsg = RequestMessage.Build(Tokens.OpsEval)
- .AddArgument(Tokens.ArgsGremlin, gremlinScript).Create();
- var expectedSecondResponse = 2;
- var secondScript = $"{expectedSecondResponse}";
-
- var firstResponseTask = gremlinClient.SubmitWithSingleResultAsync<int>(firstRequestMsg);
- var secondResponseTask = gremlinClient.SubmitWithSingleResultAsync<int>(secondScript);
-
- var secondResponse = await secondResponseTask;
- Assert.Equal(expectedSecondResponse, secondResponse);
- var firstResponse = await firstResponseTask;
- Assert.Equal(expectedFirstResult, firstResponse);
- }
- }
-
[Fact]
public async Task ShouldReturnEnumerableResult()
{
@@ -179,10 +121,9 @@ namespace Gremlin.Net.IntegrationTest.Driver
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var expectedResult = new List<int> {1, 2, 3, 4, 5};
- var requestMsg = $"{nameof(expectedResult)}";
- var bindings = new Dictionary<string, object> {{nameof(expectedResult), expectedResult}};
+ var requestMsg = "g.inject(1,2,3,4,5)";
- var response = await gremlinClient.SubmitAsync<int>(requestMsg, bindings);
+ var response = await gremlinClient.SubmitAsync<int>(requestMsg);
Assert.Equal(expectedResult, response);
}
@@ -197,7 +138,6 @@ namespace Gremlin.Net.IntegrationTest.Driver
var resultSet = await gremlinClient.SubmitAsync<int>(requestMsg);
Assert.NotNull(resultSet.StatusAttributes);
- Assert.True(resultSet.StatusAttributes.ContainsKey("host"));
}
[Fact]
@@ -230,71 +170,15 @@ namespace Gremlin.Net.IntegrationTest.Driver
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
- var requestMsg = "a + b";
- var a = 1;
- var b = 2;
- var bindings = new Dictionary<string, object> {{"a", a}, {"b", b}};
+ var requestMsg = "g.inject(3)";
var response =
... 5102 lines suppressed ...