diff --git a/examples/node-js-basic/package.json b/examples/node-js-basic/package.json index 9b5518f..0f87b35 100644 --- a/examples/node-js-basic/package.json +++ b/examples/node-js-basic/package.json @@ -15,6 +15,6 @@ "author": "Qdrant Team", "license": "Apache-2.0", "dependencies": { - "@qdrant/qdrant-js": "^1.16.2" + "@qdrant/qdrant-js": "^1.17.0" } } diff --git a/packages/js-client-grpc/CHANGELOG.md b/packages/js-client-grpc/CHANGELOG.md index 6a64717..c6b618d 100644 --- a/packages/js-client-grpc/CHANGELOG.md +++ b/packages/js-client-grpc/CHANGELOG.md @@ -1,5 +1,11 @@ # @qdrant/js-client-grpc +## 1.17.0 + +### Minor Changes + +- Qdrant v1.17.0 API + ## 1.16.2 ### Patch Changes diff --git a/packages/js-client-grpc/package.json b/packages/js-client-grpc/package.json index 99298dc..a5b1a1f 100644 --- a/packages/js-client-grpc/package.json +++ b/packages/js-client-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@qdrant/js-client-grpc", - "version": "1.16.2", + "version": "1.17.0", "engines": { "node": ">=18.0.0", "pnpm": ">=8" diff --git a/packages/js-client-grpc/proto/collections.proto b/packages/js-client-grpc/proto/collections.proto index df9c27b..92bf455 100644 --- a/packages/js-client-grpc/proto/collections.proto +++ b/packages/js-client-grpc/proto/collections.proto @@ -4,7 +4,7 @@ package qdrant; option csharp_namespace = "Qdrant.Client.Grpc"; import "json_with_int.proto"; -import "common.proto"; +import "qdrant_common.proto"; enum Datatype { Default = 0; @@ -18,19 +18,34 @@ enum Datatype { // --------------------------------------------- message VectorParams { - uint64 size = 1; // Size of the vectors - Distance distance = 2; // Distance function used for comparing vectors - optional HnswConfigDiff hnsw_config = 3; // Configuration of vector HNSW graph. If omitted - the collection configuration will be used - optional QuantizationConfig quantization_config = 4; // Configuration of vector quantization config. If omitted - the collection configuration will be used - optional bool on_disk = 5; // If true - serve vectors from disk. If set to false, the vectors will be loaded in RAM. - optional Datatype datatype = 6; // Data type of the vectors - optional MultiVectorConfig multivector_config = 7; // Configuration for multi-vector search + // Size of the vectors + uint64 size = 1; + // Distance function used for comparing vectors + Distance distance = 2; + // Configuration of vector HNSW graph. + // If omitted - the collection configuration will be used + optional HnswConfigDiff hnsw_config = 3; + // Configuration of vector quantization config. + // If omitted - the collection configuration will be used + optional QuantizationConfig quantization_config = 4; + // If true - serve vectors from disk. + // If set to false, the vectors will be loaded in RAM. + optional bool on_disk = 5; + // Data type of the vectors + optional Datatype datatype = 6; + // Configuration for multi-vector search + optional MultiVectorConfig multivector_config = 7; } message VectorParamsDiff { - optional HnswConfigDiff hnsw_config = 1; // Update params for HNSW index. If empty object - it will be unset - optional QuantizationConfigDiff quantization_config = 2; // Update quantization params. If none - it is left unchanged. - optional bool on_disk = 3; // If true - serve vectors from disk. If set to false, the vectors will be loaded in RAM. + // Update params for HNSW index. + // If empty object - it will be unset + optional HnswConfigDiff hnsw_config = 1; + // Update quantization params. If none - it is left unchanged. + optional QuantizationConfigDiff quantization_config = 2; + // If true - serve vectors from disk. + // If set to false, the vectors will be loaded in RAM. + optional bool on_disk = 3; } message VectorParamsMap { @@ -57,12 +72,15 @@ message VectorsConfigDiff { enum Modifier { None = 0; - Idf = 1; // Apply Inverse Document Frequency + // Apply Inverse Document Frequency + Idf = 1; } message SparseVectorParams { - optional SparseIndexConfig index = 1; // Configuration of sparse index - optional Modifier modifier = 2; // If set - apply modifier to the vector values + // Configuration of sparse index + optional SparseIndexConfig index = 1; + // If set - apply modifier to the vector values + optional Modifier modifier = 2; } message SparseVectorConfig { @@ -74,11 +92,13 @@ enum MultiVectorComparator { } message MultiVectorConfig { - MultiVectorComparator comparator = 1; // Comparator for multi-vector search + // Comparator for multi-vector search + MultiVectorComparator comparator = 1; } message GetCollectionInfoRequest { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; } message CollectionExistsRequest { @@ -91,23 +111,27 @@ message CollectionExists { message CollectionExistsResponse { CollectionExists result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; } message ListCollectionsRequest {} message CollectionDescription { - string name = 1; // Name of the collection + // Name of the collection + string name = 1; } message GetCollectionInfoResponse { CollectionInfo result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; } message ListCollectionsResponse { repeated CollectionDescription collections = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; } enum Distance { @@ -120,10 +144,14 @@ enum Distance { enum CollectionStatus { UnknownCollectionStatus = 0; - Green = 1; // All segments are ready - Yellow = 2; // Optimization in process - Red = 3; // Something went wrong - Grey = 4; // Optimization is pending + // All segments are ready + Green = 1; + // Optimization in process + Yellow = 2; + // Something went wrong + Red = 3; + // Optimization is pending + Grey = 4; } enum PayloadSchemaType { @@ -172,149 +200,135 @@ message CollectionWarning { } message HnswConfigDiff { - /* - Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. - */ + // Number of edges per node in the index graph. + // Larger the value - more accurate the search, more space required. optional uint64 m = 1; - /* - Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build the index. - */ + // Number of neighbours to consider during the index building. + // Larger the value - more accurate the search, more time required to build the index. optional uint64 ef_construct = 2; - /* - Minimal size threshold (in KiloBytes) below which full-scan is preferred over HNSW search. - This measures the total size of vectors being queried against. - When the maximum estimated amount of points that a condition satisfies is smaller than - `full_scan_threshold`, the query planner will use full-scan search instead of HNSW index - traversal for better performance. - Note: 1Kb = 1 vector of size 256 - */ + // Minimal size threshold (in KiloBytes) below which full-scan is preferred over HNSW search. + // This measures the total size of vectors being queried against. + // When the maximum estimated amount of points that a condition satisfies is smaller than + // `full_scan_threshold`, the query planner will use full-scan search instead of HNSW index + // traversal for better performance. + // Note: 1Kb = 1 vector of size 256 optional uint64 full_scan_threshold = 3; - /* - Number of parallel threads used for background index building. - If 0 - automatically select from 8 to 16. - Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs. - On small CPUs, less threads are used. - */ + // Number of parallel threads used for background index building. + // If 0 - automatically select from 8 to 16. + // Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs. + // On small CPUs, less threads are used. optional uint64 max_indexing_threads = 4; - /* - Store HNSW index on disk. If set to false, the index will be stored in RAM. - */ + // Store HNSW index on disk. If set to false, the index will be stored in RAM. optional bool on_disk = 5; - /* - Number of additional payload-aware links per node in the index graph. If not set - regular M parameter will be used. - */ + // Number of additional payload-aware links per node in the index graph. + // If not set - regular M parameter will be used. optional uint64 payload_m = 6; - /* - Store copies of original and quantized vectors within the HNSW index file. Default: false. - Enabling this option will trade the search speed for disk usage by reducing amount of - random seeks during the search. - Requires quantized vectors to be enabled. Multi-vectors are not supported. - */ + // Store copies of original and quantized vectors within the HNSW index file. Default: false. + // Enabling this option will trade the search speed for disk usage by reducing amount of + // random seeks during the search. + // Requires quantized vectors to be enabled. Multi-vectors are not supported. optional bool inline_storage = 7; } message SparseIndexConfig { - /* - Prefer a full scan search upto (excluding) this number of vectors. - Note: this is number of vectors, not KiloBytes. - */ + // Prefer a full scan search upto (excluding) this number of vectors. + // Note: this is number of vectors, not KiloBytes. optional uint64 full_scan_threshold = 1; - /* - Store inverted index on disk. If set to false, the index will be stored in RAM. - */ + // Store inverted index on disk. If set to false, the index will be stored in RAM. optional bool on_disk = 2; - /* - Datatype used to store weights in the index. - */ + // Datatype used to store weights in the index. optional Datatype datatype = 3; } message WalConfigDiff { - optional uint64 wal_capacity_mb = 1; // Size of a single WAL block file - optional uint64 wal_segments_ahead = 2; // Number of segments to create in advance - optional uint64 wal_retain_closed = 3; // Number of closed segments to retain + // Size of a single WAL block file + optional uint64 wal_capacity_mb = 1; + // Number of segments to create in advance + optional uint64 wal_segments_ahead = 2; + // Number of closed segments to retain + optional uint64 wal_retain_closed = 3; } message OptimizersConfigDiff { - /* - The minimal fraction of deleted vectors in a segment, required to perform segment optimization - */ + // The minimal fraction of deleted vectors in a segment, required to perform + // segment optimization optional double deleted_threshold = 1; - /* - The minimal number of vectors in a segment, required to perform segment optimization - */ + // The minimal number of vectors in a segment, required to perform segment + // optimization optional uint64 vacuum_min_vector_number = 2; - /* - Target amount of segments the optimizer will try to keep. - Real amount of segments may vary depending on multiple parameters: - - - Amount of stored points. - - Current write RPS. - - It is recommended to select the default number of segments as a factor of the number of search threads, - so that each segment would be handled evenly by one of the threads. - */ + // Target amount of segments the optimizer will try to keep. + // Real amount of segments may vary depending on multiple parameters: + // + // - Amount of stored points. + // - Current write RPS. + // + // It is recommended to select the default number of segments as a factor of the number of search threads, + // so that each segment would be handled evenly by one of the threads. optional uint64 default_segment_number = 3; - /* - Deprecated: - - Do not create segments larger this size (in kilobytes). - Large segments might require disproportionately long indexation times, - therefore it makes sense to limit the size of segments. - - If indexing speed is more important - make this parameter lower. - If search speed is more important - make this parameter higher. - Note: 1Kb = 1 vector of size 256 - If not set, will be automatically selected considering the number of available CPUs. - */ + // Deprecated: + // + // Do not create segments larger this size (in kilobytes). + // Large segments might require disproportionately long indexation times, + // therefore it makes sense to limit the size of segments. + // + // If indexing speed is more important - make this parameter lower. + // If search speed is more important - make this parameter higher. + // Note: 1Kb = 1 vector of size 256 + // If not set, will be automatically selected considering the number of available CPUs. optional uint64 max_segment_size = 4; - /* - Maximum size (in kilobytes) of vectors to store in-memory per segment. - Segments larger than this threshold will be stored as read-only memmapped file. - - Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value. - - To disable memmap storage, set this to `0`. - - Note: 1Kb = 1 vector of size 256 - */ + // Maximum size (in kilobytes) of vectors to store in-memory per segment. + // Segments larger than this threshold will be stored as read-only memmapped file. + // + // Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value. + // + // To disable memmap storage, set this to `0`. + // + // Note: 1Kb = 1 vector of size 256 optional uint64 memmap_threshold = 5; - /* - Maximum size (in kilobytes) of vectors allowed for plain index, exceeding this threshold will enable vector indexing - - Default value is 20,000, based on . - - To disable vector indexing, set to `0`. - - Note: 1kB = 1 vector of size 256. - */ + // Maximum size (in kilobytes) of vectors allowed for plain index, exceeding + // this threshold will enable vector indexing + // + // Default value is 20,000, based on + // . + // + // To disable vector indexing, set to `0`. + // + // Note: 1kB = 1 vector of size 256. optional uint64 indexing_threshold = 6; - /* - Interval between forced flushes. - */ + // Interval between forced flushes. optional uint64 flush_interval_sec = 7; // Deprecated in favor of `max_optimization_threads` optional uint64 deprecated_max_optimization_threads = 8; - /* - Max number of threads (jobs) for running optimizations per shard. - Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. - If "auto" - have no limit and choose dynamically to saturate CPU. - If 0 - no optimization threads, optimizations will be disabled. - */ + // Max number of threads (jobs) for running optimizations per shard. + // Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. + // If "auto" - have no limit and choose dynamically to saturate CPU. + // If 0 - no optimization threads, optimizations will be disabled. optional MaxOptimizationThreads max_optimization_threads = 9; + + // If this option is set, service will try to prevent creation of large unoptimized segments. + // When enabled, updates may be blocked at request level if there are unoptimized segments larger than indexing threshold. + // Updates will be resumed when optimization is completed and segments are optimized below the threshold. + // Using this option may lead to increased delay between submitting an update and its application. + // Default is disabled. + optional bool prevent_unoptimized = 10; } message ScalarQuantization { - QuantizationType type = 1; // Type of quantization - optional float quantile = 2; // Number of bits to use for quantization - optional bool always_ram = 3; // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage + // Type of quantization + QuantizationType type = 1; + // Number of bits to use for quantization + optional float quantile = 2; + // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage + optional bool always_ram = 3; } message ProductQuantization { - CompressionRatio compression = 1; // Compression ratio - optional bool always_ram = 2; // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage + // Compression ratio + CompressionRatio compression = 1; + // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage + optional bool always_ram = 2; } enum BinaryQuantizationEncoding { @@ -324,25 +338,26 @@ enum BinaryQuantizationEncoding { } message BinaryQuantizationQueryEncoding { - enum Setting { - Default = 0; - Binary = 1; - Scalar4Bits = 2; - Scalar8Bits = 3; - } + enum Setting { + Default = 0; + Binary = 1; + Scalar4Bits = 2; + Scalar8Bits = 3; + } - oneof variant { - Setting setting = 4; - } + oneof variant { + Setting setting = 4; + } } message BinaryQuantization { - optional bool always_ram = 1; // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage - optional BinaryQuantizationEncoding encoding = 2; // Binary quantization encoding method - /* - Asymmetric quantization configuration allows a query to have different quantization than stored vectors. - It can increase the accuracy of search at the cost of performance. - */ + // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage + optional bool always_ram = 1; + // Binary quantization encoding method + optional BinaryQuantizationEncoding encoding = 2; + // Asymmetric quantization configuration allows a query to have different + // quantization than stored vectors. + // It can increase the accuracy of search at the cost of performance. optional BinaryQuantizationQueryEncoding query_encoding = 3; } @@ -366,30 +381,51 @@ message QuantizationConfigDiff { } enum ShardingMethod { - Auto = 0; // Auto-sharding based on record ids - Custom = 1; // Shard by user-defined key + // Auto-sharding based on record ids + Auto = 0; + // Shard by user-defined key + Custom = 1; } message StrictModeConfig { - optional bool enabled = 1; // Whether strict mode is enabled for a collection or not. - optional uint32 max_query_limit = 2; // Max allowed `limit` parameter for all APIs that don't have their own max limit. - optional uint32 max_timeout = 3; // Max allowed `timeout` parameter. - optional bool unindexed_filtering_retrieve = 4; // Allow usage of unindexed fields in retrieval based (e.g. search) filters. - optional bool unindexed_filtering_update = 5; // Allow usage of unindexed fields in filtered updates (e.g. delete by payload). - optional uint32 search_max_hnsw_ef = 6; // Max HNSW ef value allowed in search parameters. - optional bool search_allow_exact = 7; // Whether exact search is allowed. - optional float search_max_oversampling = 8; // Max oversampling value allowed in search - optional uint64 upsert_max_batchsize = 9; // Max batchsize when upserting - optional uint64 max_collection_vector_size_bytes = 10; // Max size of a collections vector storage in bytes, ignoring replicas. - optional uint32 read_rate_limit = 11; // Max number of read operations per minute per replica - optional uint32 write_rate_limit = 12; // Max number of write operations per minute per replica - optional uint64 max_collection_payload_size_bytes = 13; // Max size of a collections payload storage in bytes, ignoring replicas. - optional uint64 filter_max_conditions = 14; // Max conditions a filter can have. - optional uint64 condition_max_size = 15; // Max size of a condition, eg. items in `MatchAny`. - optional StrictModeMultivectorConfig multivector_config = 16; // Multivector strict mode configuration - optional StrictModeSparseConfig sparse_config = 17; // Sparse vector strict mode configuration - optional uint64 max_points_count = 18; // Max number of points estimated in a collection - optional uint64 max_payload_index_count = 19; // Max number of payload indexes in a collection + // Whether strict mode is enabled for a collection or not. + optional bool enabled = 1; + // Max allowed `limit` parameter for all APIs that don't have their own max limit. + optional uint32 max_query_limit = 2; + // Max allowed `timeout` parameter. + optional uint32 max_timeout = 3; + // Allow usage of unindexed fields in retrieval based (e.g. search) filters. + optional bool unindexed_filtering_retrieve = 4; + // Allow usage of unindexed fields in filtered updates (e.g. delete by payload). + optional bool unindexed_filtering_update = 5; + // Max HNSW ef value allowed in search parameters. + optional uint32 search_max_hnsw_ef = 6; + // Whether exact search is allowed. + optional bool search_allow_exact = 7; + // Max oversampling value allowed in search + optional float search_max_oversampling = 8; + // Max batchsize when upserting + optional uint64 upsert_max_batchsize = 9; + // Max size of a collections vector storage in bytes, ignoring replicas. + optional uint64 max_collection_vector_size_bytes = 10; + // Max number of read operations per minute per replica + optional uint32 read_rate_limit = 11; + // Max number of write operations per minute per replica + optional uint32 write_rate_limit = 12; + // Max size of a collections payload storage in bytes, ignoring replicas. + optional uint64 max_collection_payload_size_bytes = 13; + // Max conditions a filter can have. + optional uint64 filter_max_conditions = 14; + // Max size of a condition, eg. items in `MatchAny`. + optional uint64 condition_max_size = 15; + // Multivector strict mode configuration + optional StrictModeMultivectorConfig multivector_config = 16; + // Sparse vector strict mode configuration + optional StrictModeSparseConfig sparse_config = 17; + // Max number of points estimated in a collection + optional uint64 max_points_count = 18; + // Max number of payload indexes in a collection + optional uint64 max_payload_index_count = 19; } message StrictModeSparseConfig { @@ -397,7 +433,8 @@ message StrictModeSparseConfig { } message StrictModeSparse { - optional uint64 max_length = 10; // Max length of sparse vector + // Max length of sparse vector + optional uint64 max_length = 10; } message StrictModeMultivectorConfig { @@ -405,81 +442,146 @@ message StrictModeMultivectorConfig { } message StrictModeMultivector { - optional uint64 max_vectors = 1; // Max number of vectors in a multivector + // Max number of vectors in a multivector + optional uint64 max_vectors = 1; } message CreateCollection { - string collection_name = 1; // Name of the collection - reserved 2; // Deprecated - reserved 3; // Deprecated - optional HnswConfigDiff hnsw_config = 4; // Configuration of vector index - optional WalConfigDiff wal_config = 5; // Configuration of the Write-Ahead-Log - optional OptimizersConfigDiff optimizers_config = 6; // Configuration of the optimizers - optional uint32 shard_number = 7; // Number of shards in the collection, default is 1 for standalone, otherwise equal to the number of nodes. Minimum is 1 - optional bool on_disk_payload = 8; // If true - point's payload will not be stored in memory - optional uint64 timeout = 9; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied - optional VectorsConfig vectors_config = 10; // Configuration for vectors - optional uint32 replication_factor = 11; // Number of replicas of each shard that network tries to maintain, default = 1 - optional uint32 write_consistency_factor = 12; // How many replicas should apply the operation for us to consider it successful, default = 1 - reserved 13; // Deprecated: init_from - optional QuantizationConfig quantization_config = 14; // Quantization configuration of vector - optional ShardingMethod sharding_method = 15; // Sharding method - optional SparseVectorConfig sparse_vectors_config = 16; // Configuration for sparse vectors - optional StrictModeConfig strict_mode_config = 17; // Configuration for strict mode - map metadata = 18; // Arbitrary JSON metadata for the collection + // Name of the collection + string collection_name = 1; + // Deprecated + reserved 2; + // Deprecated + reserved 3; + // Configuration of vector index + optional HnswConfigDiff hnsw_config = 4; + // Configuration of the Write-Ahead-Log + optional WalConfigDiff wal_config = 5; + // Configuration of the optimizers + optional OptimizersConfigDiff optimizers_config = 6; + // Number of shards in the collection, default is 1 for standalone, otherwise + // equal to the number of nodes. Minimum is 1 + optional uint32 shard_number = 7; + // If true - point's payload will not be stored in memory + optional bool on_disk_payload = 8; + // Wait timeout for operation commit in seconds, if not specified - default + // value will be supplied + optional uint64 timeout = 9; + // Configuration for vectors + optional VectorsConfig vectors_config = 10; + // Number of replicas of each shard that network tries to maintain, default = 1 + optional uint32 replication_factor = 11; + // How many replicas should apply the operation for us to consider it successful, default = 1 + optional uint32 write_consistency_factor = 12; + // Deprecated: init_from + reserved 13; + // Quantization configuration of vector + optional QuantizationConfig quantization_config = 14; + // Sharding method + optional ShardingMethod sharding_method = 15; + // Configuration for sparse vectors + optional SparseVectorConfig sparse_vectors_config = 16; + // Configuration for strict mode + optional StrictModeConfig strict_mode_config = 17; + // Arbitrary JSON metadata for the collection + map metadata = 18; } message UpdateCollection { - string collection_name = 1; // Name of the collection - optional OptimizersConfigDiff optimizers_config = 2; // New configuration parameters for the collection. This operation is blocking, it will only proceed once all current optimizations are complete - optional uint64 timeout = 3; // Wait timeout for operation commit in seconds if blocking, if not specified - default value will be supplied - optional CollectionParamsDiff params = 4; // New configuration parameters for the collection - optional HnswConfigDiff hnsw_config = 5; // New HNSW parameters for the collection index - optional VectorsConfigDiff vectors_config = 6; // New vector parameters - optional QuantizationConfigDiff quantization_config = 7; // Quantization configuration of vector - optional SparseVectorConfig sparse_vectors_config = 8; // New sparse vector parameters - optional StrictModeConfig strict_mode_config = 9; // New strict mode configuration - map metadata = 10; // Arbitrary JSON-like metadata for the collection, will be merged with already stored metadata + // Name of the collection + string collection_name = 1; + // New configuration parameters for the collection. + // This operation is blocking, it will only proceed once all current + // optimizations are complete + optional OptimizersConfigDiff optimizers_config = 2; + // Wait timeout for operation commit in seconds if blocking. + // If not specified - default value will be supplied. + optional uint64 timeout = 3; + // New configuration parameters for the collection + optional CollectionParamsDiff params = 4; + // New HNSW parameters for the collection index + optional HnswConfigDiff hnsw_config = 5; + // New vector parameters + optional VectorsConfigDiff vectors_config = 6; + // Quantization configuration of vector + optional QuantizationConfigDiff quantization_config = 7; + // New sparse vector parameters + optional SparseVectorConfig sparse_vectors_config = 8; + // New strict mode configuration + optional StrictModeConfig strict_mode_config = 9; + // Arbitrary JSON-like metadata for the collection, will be merged with + // already stored metadata + map metadata = 10; } message DeleteCollection { - string collection_name = 1; // Name of the collection - optional uint64 timeout = 2; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + // Name of the collection + string collection_name = 1; + // Wait timeout for operation commit in seconds. + // If not specified - default value will be supplied. + optional uint64 timeout = 2; } message CollectionOperationResponse { - bool result = 1; // if operation made changes - double time = 2; // Time spent to process + // if operation made changes + bool result = 1; + // Time spent to process + double time = 2; } message CollectionParams { - reserved 1; // Deprecated - reserved 2; // Deprecated - uint32 shard_number = 3; // Number of shards in collection - bool on_disk_payload = 4; // If true - point's payload will not be stored in memory - optional VectorsConfig vectors_config = 5; // Configuration for vectors - optional uint32 replication_factor = 6; // Number of replicas of each shard that network tries to maintain - optional uint32 write_consistency_factor = 7; // How many replicas should apply the operation for us to consider it successful - optional uint32 read_fan_out_factor = 8; // Fan-out every read request to these many additional remote nodes (and return first available response) - optional ShardingMethod sharding_method = 9; // Sharding method - optional SparseVectorConfig sparse_vectors_config = 10; // Configuration for sparse vectors + // Deprecated + reserved 1; + // Deprecated + reserved 2; + // Number of shards in collection + uint32 shard_number = 3; + // If true - point's payload will not be stored in memory + bool on_disk_payload = 4; + // Configuration for vectors + optional VectorsConfig vectors_config = 5; + // Number of replicas of each shard that network tries to maintain + optional uint32 replication_factor = 6; + // How many replicas should apply the operation for us to consider it successful + optional uint32 write_consistency_factor = 7; + // Fan-out every read request to these many additional remote nodes (and return first available response) + optional uint32 read_fan_out_factor = 8; + // Sharding method + optional ShardingMethod sharding_method = 9; + // Configuration for sparse vectors + optional SparseVectorConfig sparse_vectors_config = 10; + // Define number of milliseconds to wait before attempting to read from another replica. + optional uint64 read_fan_out_delay_ms = 11; } message CollectionParamsDiff { - optional uint32 replication_factor = 1; // Number of replicas of each shard that network tries to maintain - optional uint32 write_consistency_factor = 2; // How many replicas should apply the operation for us to consider it successful - optional bool on_disk_payload = 3; // If true - point's payload will not be stored in memory - optional uint32 read_fan_out_factor = 4; // Fan-out every read request to these many additional remote nodes (and return first available response) + // Number of replicas of each shard that network tries to maintain + optional uint32 replication_factor = 1; + // How many replicas should apply the operation for us to consider it successful + optional uint32 write_consistency_factor = 2; + // If true - point's payload will not be stored in memory + optional bool on_disk_payload = 3; + // Fan-out every read request to these many additional remote nodes (and return first available response) + optional uint32 read_fan_out_factor = 4; + // Define number of milliseconds to wait before attempting to read from another replica. + optional uint64 read_fan_out_delay_ms = 5; } message CollectionConfig { - CollectionParams params = 1; // Collection parameters - HnswConfigDiff hnsw_config = 2; // Configuration of vector index - OptimizersConfigDiff optimizer_config = 3; // Configuration of the optimizers - WalConfigDiff wal_config = 4; // Configuration of the Write-Ahead-Log - optional QuantizationConfig quantization_config = 5; // Configuration of the vector quantization - optional StrictModeConfig strict_mode_config = 6; // Configuration of strict mode. - map metadata = 7; // Arbitrary JSON metadata for the collection + // Collection parameters + CollectionParams params = 1; + // Configuration of vector index + HnswConfigDiff hnsw_config = 2; + // Configuration of the optimizers + OptimizersConfigDiff optimizer_config = 3; + // Configuration of the Write-Ahead-Log + WalConfigDiff wal_config = 4; + // Configuration of the vector quantization + optional QuantizationConfig quantization_config = 5; + // Configuration of strict mode. + optional StrictModeConfig strict_mode_config = 6; + // Arbitrary JSON metadata for the collection + map metadata = 7; } enum TokenizerType { @@ -491,103 +593,199 @@ enum TokenizerType { } message KeywordIndexParams { - optional bool is_tenant = 1; // If true - used for tenant optimization. - optional bool on_disk = 2; // If true - store index on disk. + // If true - used for tenant optimization. + optional bool is_tenant = 1; + // If true - store index on disk. + optional bool on_disk = 2; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 3; } message IntegerIndexParams { - optional bool lookup = 1; // If true - support direct lookups. Default is true. - optional bool range = 2; // If true - support ranges filters. Default is true. - optional bool is_principal = 3; // If true - use this key to organize storage of the collection data. This option assumes that this key will be used in majority of filtered requests. Default is false. - optional bool on_disk = 4; // If true - store index on disk. Default is false. + // If true - support direct lookups. Default is true. + optional bool lookup = 1; + // If true - support ranges filters. Default is true. + optional bool range = 2; + // If true - use this key to organize storage of the collection data. + // This option assumes that this key will be used in majority of filtered requests. + // Default is false. + optional bool is_principal = 3; + // If true - store index on disk. Default is false. + optional bool on_disk = 4; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 5; } message FloatIndexParams { - optional bool on_disk = 1; // If true - store index on disk. - optional bool is_principal = 2; // If true - use this key to organize storage of the collection data. This option assumes that this key will be used in majority of filtered requests. + // If true - store index on disk. + optional bool on_disk = 1; + // If true - use this key to organize storage of the collection data. + // This option assumes that this key will be used in majority of filtered requests. + optional bool is_principal = 2; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 3; } message GeoIndexParams { - optional bool on_disk = 1; // If true - store index on disk. + // If true - store index on disk. + optional bool on_disk = 1; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 2; } message StopwordsSet { - repeated string languages = 1; // List of languages to use stopwords from - repeated string custom = 2; // List of custom stopwords + // List of languages to use stopwords from + repeated string languages = 1; + // List of custom stopwords + repeated string custom = 2; } message TextIndexParams { - TokenizerType tokenizer = 1; // Tokenizer type - optional bool lowercase = 2; // If true - all tokens will be lowercase - optional uint64 min_token_len = 3; // Minimal token length - optional uint64 max_token_len = 4; // Maximal token length - optional bool on_disk = 5; // If true - store index on disk. - optional StopwordsSet stopwords = 6; // Stopwords for the text index - optional bool phrase_matching = 7; // If true - support phrase matching. - optional StemmingAlgorithm stemmer = 8; // Set an algorithm for stemming. - optional bool ascii_folding = 9; // If true, normalize tokens by folding accented characters to ASCII (e.g., "ação" -> "acao"). Default: false. + // Tokenizer type + TokenizerType tokenizer = 1; + // If true - all tokens will be lowercase + optional bool lowercase = 2; + // Minimal token length + optional uint64 min_token_len = 3; + // Maximal token length + optional uint64 max_token_len = 4; + // If true - store index on disk. + optional bool on_disk = 5; + // Stopwords for the text index + optional StopwordsSet stopwords = 6; + // If true - support phrase matching. + optional bool phrase_matching = 7; + // Set an algorithm for stemming. + optional StemmingAlgorithm stemmer = 8; + // If true, normalize tokens by folding accented characters to ASCII (e.g., "ação" -> "acao"). + // Default: false. + optional bool ascii_folding = 9; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 10; } message StemmingAlgorithm { oneof stemming_params { - SnowballParams snowball = 1; // Parameters for snowball stemming + // Parameters for snowball stemming + SnowballParams snowball = 1; } } message SnowballParams { - string language = 1; // Which language the algorithm should stem. + // Which language the algorithm should stem. + string language = 1; } message BoolIndexParams { - optional bool on_disk = 1; // If true - store index on disk. + // If true - store index on disk. + optional bool on_disk = 1; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 2; } message DatetimeIndexParams { - optional bool on_disk = 1; // If true - store index on disk. - optional bool is_principal = 2; // If true - use this key to organize storage of the collection data. This option assumes that this key will be used in majority of filtered requests. + // If true - store index on disk. + optional bool on_disk = 1; + // If true - use this key to organize storage of the collection data. + // This option assumes that this key will be used in majority of filtered requests. + optional bool is_principal = 2; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 3; } message UuidIndexParams { - optional bool is_tenant = 1; // If true - used for tenant optimization. - optional bool on_disk = 2; // If true - store index on disk. + // If true - used for tenant optimization. + optional bool is_tenant = 1; + // If true - store index on disk. + optional bool on_disk = 2; + // Enable HNSW graph building for this payload field. + // If true, builds additional HNSW links (Need payload_m > 0). + // Default: true. + optional bool enable_hnsw = 3; } message PayloadIndexParams { oneof index_params { - KeywordIndexParams keyword_index_params = 3; // Parameters for keyword index - IntegerIndexParams integer_index_params = 2; // Parameters for integer index - FloatIndexParams float_index_params = 4; // Parameters for float index - GeoIndexParams geo_index_params = 5; // Parameters for geo index - TextIndexParams text_index_params = 1; // Parameters for text index - BoolIndexParams bool_index_params = 6; // Parameters for bool index - DatetimeIndexParams datetime_index_params = 7; // Parameters for datetime index - UuidIndexParams uuid_index_params = 8; // Parameters for uuid index + // Parameters for keyword index + KeywordIndexParams keyword_index_params = 3; + // Parameters for integer index + IntegerIndexParams integer_index_params = 2; + // Parameters for float index + FloatIndexParams float_index_params = 4; + // Parameters for geo index + GeoIndexParams geo_index_params = 5; + // Parameters for text index + TextIndexParams text_index_params = 1; + // Parameters for bool index + BoolIndexParams bool_index_params = 6; + // Parameters for datetime index + DatetimeIndexParams datetime_index_params = 7; + // Parameters for uuid index + UuidIndexParams uuid_index_params = 8; } } message PayloadSchemaInfo { - PayloadSchemaType data_type = 1; // Field data type - optional PayloadIndexParams params = 2; // Field index parameters - optional uint64 points = 3; // Number of points indexed within this field indexed + // Field data type + PayloadSchemaType data_type = 1; + // Field index parameters + optional PayloadIndexParams params = 2; + // Number of points indexed within this field + optional uint64 points = 3; +} + +message UpdateQueueInfo { + // Number of elements in the queue + uint64 length = 1; } message CollectionInfo { - CollectionStatus status = 1; // operating condition of the collection - OptimizerStatus optimizer_status = 2; // status of collection optimizers - reserved 3; // Deprecated - uint64 segments_count = 4; // Number of independent segments - reserved 5; // Deprecated - reserved 6; // Deprecated - CollectionConfig config = 7; // Configuration - map payload_schema = 8; // Collection data types - optional uint64 points_count = 9; // Approximate number of points in the collection - optional uint64 indexed_vectors_count = 10; // Approximate number of indexed vectors in the collection. - repeated CollectionWarning warnings = 11; // Warnings related to the collection + // operating condition of the collection + CollectionStatus status = 1; + // status of collection optimizers + OptimizerStatus optimizer_status = 2; + // Deprecated + reserved 3; + // Number of independent segments + uint64 segments_count = 4; + // Deprecated + reserved 5; + // Deprecated + reserved 6; + // Configuration + CollectionConfig config = 7; + // Collection data types + map payload_schema = 8; + // Approximate number of points in the collection + optional uint64 points_count = 9; + // Approximate number of indexed vectors in the collection. + optional uint64 indexed_vectors_count = 10; + // Warnings related to the collection + repeated CollectionWarning warnings = 11; + // Update queue info + UpdateQueueInfo update_queue = 12; } message ChangeAliases { - repeated AliasOperations actions = 1; // List of actions - optional uint64 timeout = 2; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + // List of actions + repeated AliasOperations actions = 1; + // Wait timeout for operation commit in seconds. + // If not specified - default value will be supplied. + optional uint64 timeout = 2; } message AliasOperations { @@ -599,79 +797,121 @@ message AliasOperations { } message CreateAlias { - string collection_name = 1; // Name of the collection - string alias_name = 2; // New name of the alias + // Name of the collection + string collection_name = 1; + // New name of the alias + string alias_name = 2; } message RenameAlias { - string old_alias_name = 1; // Name of the alias to rename - string new_alias_name = 2; // Name of the alias + // Name of the alias to rename + string old_alias_name = 1; + // Name of the alias + string new_alias_name = 2; } message DeleteAlias { - string alias_name = 1; // Name of the alias + // Name of the alias + string alias_name = 1; } message ListAliasesRequest {} message ListCollectionAliasesRequest { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; } message AliasDescription { - string alias_name = 1; // Name of the alias - string collection_name = 2; // Name of the collection + // Name of the alias + string alias_name = 1; + // Name of the collection + string collection_name = 2; } message ListAliasesResponse { repeated AliasDescription aliases = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; } message CollectionClusterInfoRequest { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; } enum ReplicaState { - Active = 0; // Active and sound - Dead = 1; // Failed for some reason - Partial = 2; // The shard is partially loaded and is currently receiving data from other shards - Initializing = 3; // Collection is being created - Listener = 4; // A shard which receives data, but is not used for search; Useful for backup shards - PartialSnapshot = 5; // Deprecated: snapshot shard transfer is in progress; Updates should not be sent to (and are ignored by) the shard - Recovery = 6; // Shard is undergoing recovered by an external node; Normally rejects updates, accepts updates if force is true - Resharding = 7; // Points are being migrated to this shard as part of scale-up resharding - ReshardingScaleDown = 8; // Points are being migrated to this shard as part of scale-down resharding - ActiveRead = 9; // Active for readers, Partial for writers + // Active and sound + Active = 0; + // Failed for some reason + Dead = 1; + // The shard is partially loaded and is currently receiving data from other shards + Partial = 2; + // Collection is being created + Initializing = 3; + // A shard which receives data, but is not used for search. + // Useful for backup shards. + Listener = 4; + // Deprecated: snapshot shard transfer is in progress. + // Updates should not be sent to (and are ignored by) the shard. + PartialSnapshot = 5; + // Shard is undergoing recovery by an external node. + // Normally rejects updates, accepts updates if force is true. + Recovery = 6; + // Points are being migrated to this shard as part of scale-up resharding + Resharding = 7; + // Points are being migrated to this shard as part of scale-down resharding + ReshardingScaleDown = 8; + // Active for readers, Partial for writers + ActiveRead = 9; + // State for manually creation/recovery of a shard. + // Usually when snapshot is uploaded. + // This state is equivalent to `Partial`, except: + // - it can't receive updates + // - it is not treated as broken on startup + ManualRecovery = 10; } message ShardKey { oneof key { - string keyword = 1; // String key - uint64 number = 2; // Number key + // String key + string keyword = 1; + // Number key + uint64 number = 2; } } message LocalShardInfo { - uint32 shard_id = 1; // Local shard id - uint64 points_count = 2; // Number of points in the shard - ReplicaState state = 3; // Is replica active - optional ShardKey shard_key = 4; // User-defined shard key + // Local shard id + uint32 shard_id = 1; + // Number of points in the shard + uint64 points_count = 2; + // Is replica active + ReplicaState state = 3; + // User-defined shard key + optional ShardKey shard_key = 4; } message RemoteShardInfo { - uint32 shard_id = 1; // Local shard id - uint64 peer_id = 2; // Remote peer id - ReplicaState state = 3; // Is replica active - optional ShardKey shard_key = 4; // User-defined shard key + // Local shard id + uint32 shard_id = 1; + // Remote peer id + uint64 peer_id = 2; + // Is replica active + ReplicaState state = 3; + // User-defined shard key + optional ShardKey shard_key = 4; } message ShardTransferInfo { - uint32 shard_id = 1; // Local shard id + // Local shard id + uint32 shard_id = 1; optional uint32 to_shard_id = 5; uint64 from = 2; uint64 to = 3; - bool sync = 4; // If `true` transfer is a synchronization of a replicas; If `false` transfer is a moving of a shard from one peer to another + // If `true` transfer is a synchronization of a replicas; + // If `false` transfer is a moving of a shard from one peer to another + bool sync = 4; } message ReshardingInfo { @@ -681,25 +921,32 @@ message ReshardingInfo { ReshardingDirection direction = 4; } -/* - Resharding direction, scale up or down in number of shards -*/ +// Resharding direction, scale up or down in number of shards enum ReshardingDirection { - Up = 0; // Scale up, add a new shard - Down = 1; // Scale down, remove a shard + // Scale up, add a new shard + Up = 0; + // Scale down, remove a shard + Down = 1; } message CollectionClusterInfoResponse { - uint64 peer_id = 1; // ID of this peer - uint64 shard_count = 2; // Total number of shards - repeated LocalShardInfo local_shards = 3; // Local shards - repeated RemoteShardInfo remote_shards = 4; // Remote shards - repeated ShardTransferInfo shard_transfers = 5; // Shard transfers - repeated ReshardingInfo resharding_operations = 6; // Resharding operations + // ID of this peer + uint64 peer_id = 1; + // Total number of shards + uint64 shard_count = 2; + // Local shards + repeated LocalShardInfo local_shards = 3; + // Remote shards + repeated RemoteShardInfo remote_shards = 4; + // Shard transfers + repeated ShardTransferInfo shard_transfers = 5; + // Resharding operations + repeated ReshardingInfo resharding_operations = 6; } message MoveShard { - uint32 shard_id = 1; // Local shard id + // Local shard id + uint32 shard_id = 1; optional uint32 to_shard_id = 5; uint64 from_peer_id = 2; uint64 to_peer_id = 3; @@ -707,7 +954,8 @@ message MoveShard { } message ReplicateShard { - uint32 shard_id = 1; // Local shard id + // Local shard id + uint32 shard_id = 1; optional uint32 to_shard_id = 5; uint64 from_peer_id = 2; uint64 to_peer_id = 3; @@ -715,14 +963,16 @@ message ReplicateShard { } message AbortShardTransfer { - uint32 shard_id = 1; // Local shard id + // Local shard id + uint32 shard_id = 1; optional uint32 to_shard_id = 4; uint64 from_peer_id = 2; uint64 to_peer_id = 3; } message RestartTransfer { - uint32 shard_id = 1; // Local shard id + // Local shard id + uint32 shard_id = 1; optional uint32 to_shard_id = 5; uint64 from_peer_id = 2; uint64 to_peer_id = 3; @@ -730,16 +980,23 @@ message RestartTransfer { } message ReplicatePoints { - ShardKey from_shard_key = 1; // Source shard key - ShardKey to_shard_key = 2; // Target shard key - optional Filter filter = 3; // If set - only points matching the filter will be replicated + // Source shard key + ShardKey from_shard_key = 1; + // Target shard key + ShardKey to_shard_key = 2; + // If set - only points matching the filter will be replicated + optional Filter filter = 3; } enum ShardTransferMethod { - StreamRecords = 0; // Stream shard records in batches - Snapshot = 1; // Snapshot the shard and recover it on the target peer - WalDelta = 2; // Resolve WAL delta between peers and transfer the difference - ReshardingStreamRecords = 3; // Stream shard records in batches for resharding + // Stream shard records in batches + StreamRecords = 0; + // Snapshot the shard and recover it on the target peer + Snapshot = 1; + // Resolve WAL delta between peers and transfer the difference + WalDelta = 2; + // Stream shard records in batches for resharding + ReshardingStreamRecords = 3; } message Replica { @@ -748,19 +1005,26 @@ message Replica { } message CreateShardKey { - ShardKey shard_key = 1; // User-defined shard key - optional uint32 shards_number = 2; // Number of shards to create per shard key - optional uint32 replication_factor = 3; // Number of replicas of each shard to create - repeated uint64 placement = 4; // List of peer ids, allowed to create shards. If empty - all peers are allowed - optional ReplicaState initial_state = 5; // Initial state of created replicas. Warning: use with care. + // User-defined shard key + ShardKey shard_key = 1; + // Number of shards to create per shard key + optional uint32 shards_number = 2; + // Number of replicas of each shard to create + optional uint32 replication_factor = 3; + // List of peer ids, allowed to create shards. If empty - all peers are allowed + repeated uint64 placement = 4; + // Initial state of created replicas. Warning: use with care. + optional ReplicaState initial_state = 5; } message DeleteShardKey { - ShardKey shard_key = 1; // Shard key to delete + // Shard key to delete + ShardKey shard_key = 1; } message UpdateCollectionClusterSetupRequest { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; oneof operation { MoveShard move_shard = 2; ReplicateShard replicate_shard = 3; @@ -771,7 +1035,9 @@ message UpdateCollectionClusterSetupRequest { RestartTransfer restart_transfer = 9; ReplicatePoints replicate_points = 10; } - optional uint64 timeout = 6; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + // Wait timeout for operation commit in seconds. + // If not specified - default value will be supplied. + optional uint64 timeout = 6; } message UpdateCollectionClusterSetupResponse { @@ -779,15 +1045,28 @@ message UpdateCollectionClusterSetupResponse { } message CreateShardKeyRequest { - string collection_name = 1; // Name of the collection - CreateShardKey request = 2; // Request to create shard key - optional uint64 timeout = 3; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + // Name of the collection + string collection_name = 1; + // Request to create shard key + CreateShardKey request = 2; + // Wait timeout for operation commit in seconds. + // If not specified - default value will be supplied. + optional uint64 timeout = 3; } message DeleteShardKeyRequest { - string collection_name = 1; // Name of the collection - DeleteShardKey request = 2; // Request to delete shard key - optional uint64 timeout = 3; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + // Name of the collection + string collection_name = 1; + // Request to delete shard key + DeleteShardKey request = 2; + // Wait timeout for operation commit in seconds. + // If not specified - default value will be supplied. + optional uint64 timeout = 3; +} + +message ListShardKeysRequest { + // Name of the collection + string collection_name = 1; } message CreateShardKeyResponse { @@ -797,3 +1076,13 @@ message CreateShardKeyResponse { message DeleteShardKeyResponse { bool result = 1; } + +message ShardKeyDescription { + ShardKey key = 1; +} + +message ListShardKeysResponse { + repeated ShardKeyDescription shard_keys = 1; + // Time spent to process + double time = 2; +} diff --git a/packages/js-client-grpc/proto/collections_service.proto b/packages/js-client-grpc/proto/collections_service.proto index 52caa8d..ddb9244 100644 --- a/packages/js-client-grpc/proto/collections_service.proto +++ b/packages/js-client-grpc/proto/collections_service.proto @@ -6,56 +6,36 @@ package qdrant; option csharp_namespace = "Qdrant.Client.Grpc"; service Collections { - /* - Get detailed information about specified existing collection - */ - rpc Get (GetCollectionInfoRequest) returns (GetCollectionInfoResponse) {} - /* - Get list name of all existing collections - */ - rpc List (ListCollectionsRequest) returns (ListCollectionsResponse) {} - /* - Create new collection with given parameters - */ - rpc Create (CreateCollection) returns (CollectionOperationResponse) {} - /* - Update parameters of the existing collection - */ - rpc Update (UpdateCollection) returns (CollectionOperationResponse) {} - /* - Drop collection and all associated data - */ - rpc Delete (DeleteCollection) returns (CollectionOperationResponse) {} - /* - Update Aliases of the existing collection - */ - rpc UpdateAliases (ChangeAliases) returns (CollectionOperationResponse) {} - /* - Get list of all aliases for a collection - */ - rpc ListCollectionAliases (ListCollectionAliasesRequest) returns (ListAliasesResponse) {} - /* - Get list of all aliases for all existing collections - */ - rpc ListAliases (ListAliasesRequest) returns (ListAliasesResponse) {} - /* - Get cluster information for a collection - */ - rpc CollectionClusterInfo (CollectionClusterInfoRequest) returns (CollectionClusterInfoResponse) {} - /* - Check the existence of a collection - */ - rpc CollectionExists (CollectionExistsRequest) returns (CollectionExistsResponse) {} - /* - Update cluster setup for a collection - */ - rpc UpdateCollectionClusterSetup (UpdateCollectionClusterSetupRequest) returns (UpdateCollectionClusterSetupResponse) {} - /* - Create shard key - */ - rpc CreateShardKey (CreateShardKeyRequest) returns (CreateShardKeyResponse) {} - /* - Delete shard key - */ - rpc DeleteShardKey (DeleteShardKeyRequest) returns (DeleteShardKeyResponse) {} + // Get detailed information about specified existing collection + rpc Get(GetCollectionInfoRequest) returns (GetCollectionInfoResponse) {} + // Get list of names of all existing collections + rpc List(ListCollectionsRequest) returns (ListCollectionsResponse) {} + // Create new collection with given parameters + rpc Create(CreateCollection) returns (CollectionOperationResponse) {} + // Update parameters of the existing collection + rpc Update(UpdateCollection) returns (CollectionOperationResponse) {} + // Drop collection and all associated data + rpc Delete(DeleteCollection) returns (CollectionOperationResponse) {} + // Update Aliases of the existing collection + rpc UpdateAliases(ChangeAliases) returns (CollectionOperationResponse) {} + // Get list of all aliases for a collection + rpc ListCollectionAliases(ListCollectionAliasesRequest) + returns (ListAliasesResponse) {} + // Get list of all aliases for all existing collections + rpc ListAliases(ListAliasesRequest) returns (ListAliasesResponse) {} + // Get cluster information for a collection + rpc CollectionClusterInfo(CollectionClusterInfoRequest) + returns (CollectionClusterInfoResponse) {} + // Check the existence of a collection + rpc CollectionExists(CollectionExistsRequest) + returns (CollectionExistsResponse) {} + // Update cluster setup for a collection + rpc UpdateCollectionClusterSetup(UpdateCollectionClusterSetupRequest) + returns (UpdateCollectionClusterSetupResponse) {} + // Create shard key + rpc CreateShardKey(CreateShardKeyRequest) returns (CreateShardKeyResponse) {} + // Delete shard key + rpc DeleteShardKey(DeleteShardKeyRequest) returns (DeleteShardKeyResponse) {} + // List shard keys + rpc ListShardKeys(ListShardKeysRequest) returns (ListShardKeysResponse) {} } diff --git a/packages/js-client-grpc/proto/common.proto b/packages/js-client-grpc/proto/common.proto deleted file mode 100644 index 70da917..0000000 --- a/packages/js-client-grpc/proto/common.proto +++ /dev/null @@ -1,142 +0,0 @@ -syntax = "proto3"; -package qdrant; - -option csharp_namespace = "Qdrant.Client.Grpc"; -option java_outer_classname = "Points"; - -import "google/protobuf/timestamp.proto"; - -message PointId { - oneof point_id_options { - uint64 num = 1; // Numerical ID of the point - string uuid = 2; // UUID - } -} - -message GeoPoint { - double lon = 1; - double lat = 2; -} - -message Filter { - repeated Condition should = 1; // At least one of those conditions should match - repeated Condition must = 2; // All conditions must match - repeated Condition must_not = 3; // All conditions must NOT match - optional MinShould min_should = 4; // At least minimum amount of given conditions should match -} - -message MinShould { - repeated Condition conditions = 1; - uint64 min_count = 2; -} - -message Condition { - oneof condition_one_of { - FieldCondition field = 1; - IsEmptyCondition is_empty = 2; - HasIdCondition has_id = 3; - Filter filter = 4; - IsNullCondition is_null = 5; - NestedCondition nested = 6; - HasVectorCondition has_vector = 7; - } -} - -message IsEmptyCondition { - string key = 1; -} - -message IsNullCondition { - string key = 1; -} - -message HasIdCondition { - repeated PointId has_id = 1; -} - -message HasVectorCondition { - string has_vector = 1; -} - -message NestedCondition { - string key = 1; // Path to nested object - Filter filter = 2; // Filter condition -} - -message FieldCondition { - string key = 1; - Match match = 2; // Check if point has field with a given value - Range range = 3; // Check if points value lies in a given range - GeoBoundingBox geo_bounding_box = 4; // Check if points geolocation lies in a given area - GeoRadius geo_radius = 5; // Check if geo point is within a given radius - ValuesCount values_count = 6; // Check number of values for a specific field - GeoPolygon geo_polygon = 7; // Check if geo point is within a given polygon - DatetimeRange datetime_range = 8; // Check if datetime is within a given range - optional bool is_empty = 9; // Check if field is empty - optional bool is_null = 10; // Check if field is null -} - -message Match { - oneof match_value { - string keyword = 1; // Match string keyword - int64 integer = 2; // Match integer - bool boolean = 3; // Match boolean - string text = 4; // Match text - RepeatedStrings keywords = 5; // Match multiple keywords - RepeatedIntegers integers = 6; // Match multiple integers - RepeatedIntegers except_integers = 7; // Match any other value except those integers - RepeatedStrings except_keywords = 8; // Match any other value except those keywords - string phrase = 9; // Match phrase text - string text_any = 10; // Match any word in the text - } -} - -message RepeatedStrings { - repeated string strings = 1; -} - -message RepeatedIntegers { - repeated int64 integers = 1; -} - -message Range { - optional double lt = 1; - optional double gt = 2; - optional double gte = 3; - optional double lte = 4; -} - -message DatetimeRange { - optional google.protobuf.Timestamp lt = 1; - optional google.protobuf.Timestamp gt = 2; - optional google.protobuf.Timestamp gte = 3; - optional google.protobuf.Timestamp lte = 4; -} - -message GeoBoundingBox { - GeoPoint top_left = 1; // north-west corner - GeoPoint bottom_right = 2; // south-east corner -} - -message GeoRadius { - GeoPoint center = 1; // Center of the circle - float radius = 2; // In meters -} - -message GeoLineString { - repeated GeoPoint points = 1; // Ordered sequence of GeoPoints representing the line -} - -// For a valid GeoPolygon, both the exterior and interior GeoLineStrings must consist of a minimum of 4 points. -// Additionally, the first and last points of each GeoLineString must be the same. -message GeoPolygon { - GeoLineString exterior = 1; // The exterior line bounds the surface - repeated GeoLineString interiors = 2; // Interior lines (if present) bound holes within the surface -} - -message ValuesCount { - optional uint64 lt = 1; - optional uint64 gt = 2; - optional uint64 gte = 3; - optional uint64 lte = 4; -} \ No newline at end of file diff --git a/packages/js-client-grpc/proto/points.proto b/packages/js-client-grpc/proto/points.proto index fd50fa9..b03adc3 100644 --- a/packages/js-client-grpc/proto/points.proto +++ b/packages/js-client-grpc/proto/points.proto @@ -4,31 +4,52 @@ package qdrant; option csharp_namespace = "Qdrant.Client.Grpc"; import "collections.proto"; -import "common.proto"; +import "qdrant_common.proto"; import "google/protobuf/timestamp.proto"; import "json_with_int.proto"; - enum WriteOrderingType { - Weak = 0; // Write operations may be reordered, works faster, default - Medium = 1; // Write operations go through dynamically selected leader, may be inconsistent for a short period of time in case of leader change - Strong = 2; // Write operations go through the permanent leader, consistent, but may be unavailable if leader is down + // Write operations may be reordered, works faster, default + Weak = 0; + // Write operations go through dynamically selected leader, + // may be inconsistent for a short period of time in case of leader change + Medium = 1; + // Write operations go through the permanent leader, consistent, + // but may be unavailable if leader is down + Strong = 2; +} + +// Defines the mode of the upsert operation +enum UpdateMode { + // Default mode - insert new points, update existing points + Upsert = 0; + // Only insert new points, do not update existing points + InsertOnly = 1; + // Only update existing points, do not insert new points + UpdateOnly = 2; } message WriteOrdering { - WriteOrderingType type = 1; // Write ordering guarantees + // Write ordering guarantees + WriteOrderingType type = 1; } enum ReadConsistencyType { - All = 0; // Send request to all nodes and return points which are present on all of them - Majority = 1; // Send requests to all nodes and return points which are present on majority of them - Quorum = 2; // Send requests to half + 1 nodes, return points which are present on all of them + // Send request to all nodes and return points which are present on all of them + All = 0; + // Send requests to all nodes and return points which are present on majority of them + Majority = 1; + // Send requests to half + 1 nodes, return points which are present on all of them + Quorum = 2; } message ReadConsistency { oneof value { - ReadConsistencyType type = 1; // Common read consistency configurations - uint64 factor = 2; // Send request to a specified number of nodes, and return points which are present on all of them + // Common read consistency configurations + ReadConsistencyType type = 1; + // Send request to a specified number of nodes, + // and return points which are present on all of them + uint64 factor = 2; } } @@ -37,31 +58,46 @@ message SparseIndices { } message Document { - string text = 1; // Text of the document - string model = 3; // Model name - map options = 4; // Model options + // Text of the document + string text = 1; + // Model name + string model = 3; + // Model options + map options = 4; } message Image { - Value image = 1; // Image data, either base64 encoded or URL - string model = 2; // Model name - map options = 3; // Model options + // Image data, either base64 encoded or URL + Value image = 1; + // Model name + string model = 2; + // Model options + map options = 3; } message InferenceObject { - Value object = 1; // Object to infer - string model = 2; // Model name - map options = 3; // Model options + // Object to infer + Value object = 1; + // Model name + string model = 2; + // Model options + map options = 3; } message Vector { - repeated float data = 1 [deprecated=true]; // Vector data (flatten for multi vectors), deprecated - optional SparseIndices indices = 2 [deprecated=true]; // Sparse indices for sparse vectors, deprecated - optional uint32 vectors_count = 3 [deprecated=true]; // Number of vectors per multi vector, deprecated + // Vector data (flatten for multi vectors), deprecated + repeated float data = 1 [deprecated = true]; + // Sparse indices for sparse vectors, deprecated + optional SparseIndices indices = 2 [deprecated = true]; + // Number of vectors per multi vector, deprecated + optional uint32 vectors_count = 3 [deprecated = true]; oneof vector { - DenseVector dense = 101; // Dense vector - SparseVector sparse = 102; // Sparse vector - MultiDenseVector multi_dense = 103; // Multi dense vector + // Dense vector + DenseVector dense = 101; + // Sparse vector + SparseVector sparse = 102; + // Multi dense vector + MultiDenseVector multi_dense = 103; Document document = 104; Image image = 105; InferenceObject object = 106; @@ -69,13 +105,19 @@ message Vector { } message VectorOutput { - repeated float data = 1 [deprecated=true]; // Vector data (flatten for multi vectors), deprecated - optional SparseIndices indices = 2 [deprecated=true]; // Sparse indices for sparse vectors, deprecated - optional uint32 vectors_count = 3 [deprecated=true]; // Number of vectors per multi vector, deprecated + // Vector data (flatten for multi vectors), deprecated + repeated float data = 1 [deprecated = true]; + // Sparse indices for sparse vectors, deprecated + optional SparseIndices indices = 2 [deprecated = true]; + // Number of vectors per multi vector, deprecated + optional uint32 vectors_count = 3 [deprecated = true]; oneof vector { - DenseVector dense = 101; // Dense vector - SparseVector sparse = 102; // Sparse vector - MultiDenseVector multi_dense = 103; // Multi dense vector + // Dense vector + DenseVector dense = 101; + // Sparse vector + SparseVector sparse = 102; + // Multi dense vector + MultiDenseVector multi_dense = 103; } } @@ -92,7 +134,8 @@ message MultiDenseVector { repeated DenseVector vectors = 1; } -// Vector type to be used in queries. Ids will be substituted with their corresponding vectors from the collection. +// Vector type to be used in queries. +// Ids will be substituted with their corresponding vectors from the collection. message VectorInput { oneof variant { PointId id = 1; @@ -110,93 +153,162 @@ message VectorInput { // --------------------------------------------- message ShardKeySelector { - repeated ShardKey shard_keys = 1; // List of shard keys which should be used in the request + // List of shard keys which should be used in the request + repeated ShardKey shard_keys = 1; optional ShardKey fallback = 2; } - // --------------------------------------------- // ---------------- RPC Requests --------------- // --------------------------------------------- message UpsertPoints { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; repeated PointStruct points = 3; - optional WriteOrdering ordering = 4; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 5; // Option for custom sharding to specify used shard keys - optional Filter update_filter = 6; // If specified, only points that match this filter will be updated, others will be inserted + // Write ordering guarantees + optional WriteOrdering ordering = 4; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 5; + // Filter to apply when updating existing points. Only points matching this filter will be updated. + // Points that don't match will keep their current state. New points will be inserted regardless of the filter. + optional Filter update_filter = 6; + // Timeout for the request in seconds + optional uint64 timeout = 7; + // Mode of the upsert operation: insert_only, upsert (default), update_only + optional UpdateMode update_mode = 8; } message DeletePoints { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - PointsSelector points = 3; // Affected points - optional WriteOrdering ordering = 4; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 5; // Option for custom sharding to specify used shard keys + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // Affected points + PointsSelector points = 3; + // Write ordering guarantees + optional WriteOrdering ordering = 4; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 5; + // Timeout for the request in seconds + optional uint64 timeout = 6; } message GetPoints { - string collection_name = 1; // name of the collection - repeated PointId ids = 2; // List of points to retrieve - reserved 3; // deprecated "with_vector" field - WithPayloadSelector with_payload = 4; // Options for specifying which payload to include or not - optional WithVectorsSelector with_vectors = 5; // Options for specifying which vectors to include into response - optional ReadConsistency read_consistency = 6; // Options for specifying read consistency guarantees - optional ShardKeySelector shard_key_selector = 7; // Specify in which shards to look for the points, if not specified - look in all shards - optional uint64 timeout = 8; // If set, overrides global timeout setting for this request. Unit is seconds. + // name of the collection + string collection_name = 1; + // List of points to retrieve + repeated PointId ids = 2; + // deprecated "with_vector" field + reserved 3; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 4; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 5; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 6; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 7; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 8; } message UpdatePointVectors { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - repeated PointVectors points = 3; // List of points and vectors to update - optional WriteOrdering ordering = 4; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 5; // Option for custom sharding to specify used shard keys - optional Filter update_filter = 6; // If specified, only points that match this filter will be updated + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // List of points and vectors to update + repeated PointVectors points = 3; + // Write ordering guarantees + optional WriteOrdering ordering = 4; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 5; + // If specified, only points that match this filter will be updated + optional Filter update_filter = 6; + // Timeout for the request in seconds + optional uint64 timeout = 7; } message PointVectors { - PointId id = 1; // ID to update vectors for - Vectors vectors = 2; // Named vectors to update, leave others intact + // ID to update vectors for + PointId id = 1; + // Named vectors to update, leave others intact + Vectors vectors = 2; } message DeletePointVectors { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - PointsSelector points_selector = 3; // Affected points - VectorsSelector vectors = 4; // List of vector names to delete - optional WriteOrdering ordering = 5; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 6; // Option for custom sharding to specify used shard keys + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // Affected points + PointsSelector points_selector = 3; + // List of vector names to delete + VectorsSelector vectors = 4; + // Write ordering guarantees + optional WriteOrdering ordering = 5; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 6; + // Timeout for the request in seconds + optional uint64 timeout = 7; } message SetPayloadPoints { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - map payload = 3; // New payload values - reserved 4; // List of point to modify, deprecated - optional PointsSelector points_selector = 5; // Affected points - optional WriteOrdering ordering = 6; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 7; // Option for custom sharding to specify used shard keys - optional string key = 8; // Option for indicate property of payload + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // New payload values + map payload = 3; + // List of point to modify, deprecated + reserved 4; + // Affected points + optional PointsSelector points_selector = 5; + // Write ordering guarantees + optional WriteOrdering ordering = 6; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 7; + // Option for indicate property of payload + optional string key = 8; + // Timeout for the request in seconds + optional uint64 timeout = 9; } message DeletePayloadPoints { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - repeated string keys = 3; // List of keys to delete - reserved 4; // Affected points, deprecated - optional PointsSelector points_selector = 5; // Affected points - optional WriteOrdering ordering = 6; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 7; // Option for custom sharding to specify used shard keys + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // List of keys to delete + repeated string keys = 3; + // Affected points, deprecated + reserved 4; + // Affected points + optional PointsSelector points_selector = 5; + // Write ordering guarantees + optional WriteOrdering ordering = 6; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 7; + // Timeout for the request in seconds + optional uint64 timeout = 8; } message ClearPayloadPoints { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - PointsSelector points = 3; // Affected points - optional WriteOrdering ordering = 4; // Write ordering guarantees - optional ShardKeySelector shard_key_selector = 5; // Option for custom sharding to specify used shard keys + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // Affected points + PointsSelector points = 3; + // Write ordering guarantees + optional WriteOrdering ordering = 4; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 5; + // Timeout for the request in seconds + optional uint64 timeout = 6; } enum FieldType { @@ -211,32 +323,49 @@ enum FieldType { } message CreateFieldIndexCollection { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - string field_name = 3; // Field name to index - optional FieldType field_type = 4; // Field type. - optional PayloadIndexParams field_index_params = 5; // Payload index params. - optional WriteOrdering ordering = 6; // Write ordering guarantees + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // Field name to index + string field_name = 3; + // Field type. + optional FieldType field_type = 4; + // Payload index params. + optional PayloadIndexParams field_index_params = 5; + // Write ordering guarantees + optional WriteOrdering ordering = 6; + // Timeout for the request in seconds + optional uint64 timeout = 7; } message DeleteFieldIndexCollection { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? - string field_name = 3; // Field name to delete - optional WriteOrdering ordering = 4; // Write ordering guarantees + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; + // Field name to delete + string field_name = 3; + // Write ordering guarantees + optional WriteOrdering ordering = 4; + // Timeout for the request in seconds + optional uint64 timeout = 5; } message PayloadIncludeSelector { - repeated string fields = 1; // List of payload keys to include into result + // List of payload keys to include into result + repeated string fields = 1; } message PayloadExcludeSelector { - repeated string fields = 1; // List of payload keys to exclude from the result + // List of payload keys to exclude from the result + repeated string fields = 1; } message WithPayloadSelector { oneof selector_options { - bool enable = 1; // If `true` - return all payload, if `false` - none + // If `true` - return all payload, if `false` - none + bool enable = 1; PayloadIncludeSelector include = 2; PayloadExcludeSelector exclude = 3; } @@ -265,138 +394,159 @@ message VectorsOutput { } message VectorsSelector { - repeated string names = 1; // List of vectors to include into result + // List of vectors to include into result + repeated string names = 1; } message WithVectorsSelector { oneof selector_options { - bool enable = 1; // If `true` - return all vectors, if `false` - none - VectorsSelector include = 2; // List of payload keys to include into result + // If `true` - return all vectors, if `false` - none + bool enable = 1; + // List of vectors to include into result + VectorsSelector include = 2; } } message QuantizationSearchParams { - /* - If set to true, search will ignore quantized vector data - */ + // If set to true, search will ignore quantized vector data optional bool ignore = 1; - /* - If true, use original vectors to re-score top-k results. If ignored, qdrant decides automatically does rescore enabled or not. - */ + // If true, use original vectors to re-score top-k results. + // If ignored, qdrant decides automatically does rescore enabled or not. optional bool rescore = 2; - /* - Oversampling factor for quantization. - - Defines how many extra vectors should be pre-selected using quantized index, - and then re-scored using original vectors. - - For example, if `oversampling` is 2.4 and `limit` is 100, then 240 vectors will be pre-selected using quantized index, - and then top-100 will be returned after re-scoring. - */ + // Oversampling factor for quantization. + // + // Defines how many extra vectors should be pre-selected using quantized index, + // and then re-scored using original vectors. + // + // For example, if `oversampling` is 2.4 and `limit` is 100, + // then 240 vectors will be pre-selected using quantized index, + // and then top-100 will be returned after re-scoring. optional double oversampling = 3; } message AcornSearchParams { - /* - If true, then ACORN may be used for the HNSW search based on filters - selectivity. - - Improves search recall for searches with multiple low-selectivity - payload filters, at cost of performance. - */ + // If true, then ACORN may be used for the HNSW search based on filters + // selectivity. + // + // Improves search recall for searches with multiple low-selectivity + // payload filters, at cost of performance. optional bool enable = 1; - /* - Maximum selectivity of filters to enable ACORN. - - If estimated filters selectivity is higher than this value, - ACORN will not be used. Selectivity is estimated as: - `estimated number of points satisfying the filters / total number of points`. - - 0.0 for never, 1.0 for always. Default is 0.4. - */ + // Maximum selectivity of filters to enable ACORN. + // + // If estimated filters selectivity is higher than this value, + // ACORN will not be used. Selectivity is estimated as: + // `estimated number of points satisfying the filters / total number of points`. + // + // 0.0 for never, 1.0 for always. Default is 0.4. optional double max_selectivity = 2; } message SearchParams { - /* - Params relevant to HNSW index. Size of the beam in a beam-search. - Larger the value - more accurate the result, more time required for search. - */ + // Params relevant to HNSW index. Size of the beam in a beam-search. + // Larger the value - more accurate the result, more time required for search. optional uint64 hnsw_ef = 1; - /* - Search without approximation. If set to true, search may run long but with exact results. - */ + // Search without approximation. If set to true, search may run long but with exact results. optional bool exact = 2; - /* - If set to true, search will ignore quantized vector data - */ + // If set to true, search will ignore quantized vector data optional QuantizationSearchParams quantization = 3; - /* - If enabled, the engine will only perform search among indexed or small segments. - Using this option prevents slow searches in case of delayed index, but does not - guarantee that all uploaded vectors will be included in search results - */ + // If enabled, the engine will only perform search among indexed or small segments. + // Using this option prevents slow searches in case of delayed index, but does not + // guarantee that all uploaded vectors will be included in search results optional bool indexed_only = 4; - /* - ACORN search params - */ + // ACORN search params optional AcornSearchParams acorn = 5; } message SearchPoints { - string collection_name = 1; // name of the collection - repeated float vector = 2; // vector - Filter filter = 3; // Filter conditions - return only those points that satisfy the specified conditions - uint64 limit = 4; // Max number of result - reserved 5; // deprecated "with_vector" field - WithPayloadSelector with_payload = 6; // Options for specifying which payload to include or not - SearchParams params = 7; // Search config - optional float score_threshold = 8; // If provided - cut off results with worse scores - optional uint64 offset = 9; // Offset of the result - optional string vector_name = 10; // Which vector to use for search, if not specified - use default vector - optional WithVectorsSelector with_vectors = 11; // Options for specifying which vectors to include into response - optional ReadConsistency read_consistency = 12; // Options for specifying read consistency guarantees - optional uint64 timeout = 13; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ShardKeySelector shard_key_selector = 14; // Specify in which shards to look for the points, if not specified - look in all shards + // name of the collection + string collection_name = 1; + // vector + repeated float vector = 2; + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 3; + // Max number of result + uint64 limit = 4; + // deprecated "with_vector" field + reserved 5; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 6; + // Search config + SearchParams params = 7; + // If provided - cut off results with worse scores + optional float score_threshold = 8; + // Offset of the result + optional uint64 offset = 9; + // Which vector to use for search, if not specified - use default vector + optional string vector_name = 10; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 11; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 12; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 13; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 14; optional SparseIndices sparse_indices = 15; } message SearchBatchPoints { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; repeated SearchPoints search_points = 2; - optional ReadConsistency read_consistency = 3; // Options for specifying read consistency guarantees - optional uint64 timeout = 4; // If set, overrides global timeout setting for this request. Unit is seconds. + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 3; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 4; } message WithLookup { - string collection = 1; // Name of the collection to use for points lookup - optional WithPayloadSelector with_payload = 2; // Options for specifying which payload to include (or not) - optional WithVectorsSelector with_vectors = 3; // Options for specifying which vectors to include (or not) + // Name of the collection to use for points lookup + string collection = 1; + // Options for specifying which payload to include (or not) + optional WithPayloadSelector with_payload = 2; + // Options for specifying which vectors to include (or not) + optional WithVectorsSelector with_vectors = 3; } - message SearchPointGroups { - string collection_name = 1; // Name of the collection - repeated float vector = 2; // Vector to compare against - Filter filter = 3; // Filter conditions - return only those points that satisfy the specified conditions - uint32 limit = 4; // Max number of result - WithPayloadSelector with_payload = 5; // Options for specifying which payload to include or not - SearchParams params = 6; // Search config - optional float score_threshold = 7; // If provided - cut off results with worse scores - optional string vector_name = 8; // Which vector to use for search, if not specified - use default vector - optional WithVectorsSelector with_vectors = 9; // Options for specifying which vectors to include into response - string group_by = 10; // Payload field to group by, must be a string or number field. If there are multiple values for the field, all of them will be used. One point can be in multiple groups. - uint32 group_size = 11; // Maximum amount of points to return per group - optional ReadConsistency read_consistency = 12; // Options for specifying read consistency guarantees - optional WithLookup with_lookup = 13; // Options for specifying how to use the group id to lookup points in another collection - optional uint64 timeout = 14; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ShardKeySelector shard_key_selector = 15; // Specify in which shards to look for the points, if not specified - look in all shards + // Name of the collection + string collection_name = 1; + // Vector to compare against + repeated float vector = 2; + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 3; + // Max number of result + uint32 limit = 4; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 5; + // Search config + SearchParams params = 6; + // If provided - cut off results with worse scores + optional float score_threshold = 7; + // Which vector to use for search, if not specified - use default vector + optional string vector_name = 8; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 9; + // Payload field to group by, must be a string or number field. + // If there are multiple values for the field, all of them will be used. + // One point can be in multiple groups. + string group_by = 10; + // Maximum amount of points to return per group + uint32 group_size = 11; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 12; + // Options for specifying how to use the group id to lookup points in another collection + optional WithLookup with_lookup = 13; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 14; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 15; optional SparseIndices sparse_indices = 16; } @@ -415,23 +565,36 @@ message StartFrom { } message OrderBy { - string key = 1; // Payload key to order by - optional Direction direction = 2; // Ascending or descending order - optional StartFrom start_from = 3; // Start from this value + // Payload key to order by + string key = 1; + // Ascending or descending order + optional Direction direction = 2; + // Start from this value + optional StartFrom start_from = 3; } message ScrollPoints { string collection_name = 1; - Filter filter = 2; // Filter conditions - return only those points that satisfy the specified conditions - optional PointId offset = 3; // Start with this ID - optional uint32 limit = 4; // Max number of result - reserved 5; // deprecated "with_vector" field - WithPayloadSelector with_payload = 6; // Options for specifying which payload to include or not - optional WithVectorsSelector with_vectors = 7; // Options for specifying which vectors to include into response - optional ReadConsistency read_consistency = 8; // Options for specifying read consistency guarantees - optional ShardKeySelector shard_key_selector = 9; // Specify in which shards to look for the points, if not specified - look in all shards - optional OrderBy order_by = 10; // Order the records by a payload field - optional uint64 timeout = 11; // If set, overrides global timeout setting for this request. Unit is seconds. + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 2; + // Start with this ID + optional PointId offset = 3; + // Max number of result + optional uint32 limit = 4; + // deprecated "with_vector" field + reserved 5; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 6; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 7; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 8; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 9; + // Order the records by a payload field + optional OrderBy order_by = 10; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 11; } // How to use positive and negative vectors to find the results, default is `AverageVector`. @@ -452,60 +615,106 @@ enum RecommendStrategy { message LookupLocation { string collection_name = 1; - optional string vector_name = 2; // Which vector to use for search, if not specified - use default vector - optional ShardKeySelector shard_key_selector = 3; // Specify in which shards to look for the points, if not specified - look in all shards + // Which vector to use for search, if not specified - use default vector + optional string vector_name = 2; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 3; } message RecommendPoints { - string collection_name = 1; // name of the collection - repeated PointId positive = 2; // Look for vectors closest to the vectors from these points - repeated PointId negative = 3; // Try to avoid vectors like the vector from these points - Filter filter = 4; // Filter conditions - return only those points that satisfy the specified conditions - uint64 limit = 5; // Max number of result - reserved 6; // deprecated "with_vector" field - WithPayloadSelector with_payload = 7; // Options for specifying which payload to include or not - SearchParams params = 8; // Search config - optional float score_threshold = 9; // If provided - cut off results with worse scores - optional uint64 offset = 10; // Offset of the result - optional string using = 11; // Define which vector to use for recommendation, if not specified - default vector - optional WithVectorsSelector with_vectors = 12; // Options for specifying which vectors to include into response - optional LookupLocation lookup_from = 13; // Name of the collection to use for points lookup, if not specified - use current collection - optional ReadConsistency read_consistency = 14; // Options for specifying read consistency guarantees - optional RecommendStrategy strategy = 16; // How to use the example vectors to find the results - repeated Vector positive_vectors = 17; // Look for vectors closest to those - repeated Vector negative_vectors = 18; // Try to avoid vectors like this - optional uint64 timeout = 19; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ShardKeySelector shard_key_selector = 20; // Specify in which shards to look for the points, if not specified - look in all shards + // name of the collection + string collection_name = 1; + // Look for vectors closest to the vectors from these points + repeated PointId positive = 2; + // Try to avoid vectors like the vector from these points + repeated PointId negative = 3; + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 4; + // Max number of result + uint64 limit = 5; + // deprecated "with_vector" field + reserved 6; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 7; + // Search config + SearchParams params = 8; + // If provided - cut off results with worse scores + optional float score_threshold = 9; + // Offset of the result + optional uint64 offset = 10; + // Define which vector to use for recommendation, if not specified - default vector + optional string using = 11; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 12; + // Name of the collection to use for points lookup, if not specified - use current collection + optional LookupLocation lookup_from = 13; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 14; + // How to use the example vectors to find the results + optional RecommendStrategy strategy = 16; + // Look for vectors closest to those + repeated Vector positive_vectors = 17; + // Try to avoid vectors like this + repeated Vector negative_vectors = 18; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 19; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 20; } message RecommendBatchPoints { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; repeated RecommendPoints recommend_points = 2; - optional ReadConsistency read_consistency = 3; // Options for specifying read consistency guarantees - optional uint64 timeout = 4; // If set, overrides global timeout setting for this request. Unit is seconds. + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 3; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 4; } message RecommendPointGroups { - string collection_name = 1; // Name of the collection - repeated PointId positive = 2; // Look for vectors closest to the vectors from these points - repeated PointId negative = 3; // Try to avoid vectors like the vector from these points - Filter filter = 4; // Filter conditions - return only those points that satisfy the specified conditions - uint32 limit = 5; // Max number of groups in result - WithPayloadSelector with_payload = 6; // Options for specifying which payload to include or not - SearchParams params = 7; // Search config - optional float score_threshold = 8; // If provided - cut off results with worse scores - optional string using = 9; // Define which vector to use for recommendation, if not specified - default vector - optional WithVectorsSelector with_vectors = 10; // Options for specifying which vectors to include into response - optional LookupLocation lookup_from = 11; // Name of the collection to use for points lookup, if not specified - use current collection - string group_by = 12; // Payload field to group by, must be a string or number field. If there are multiple values for the field, all of them will be used. One point can be in multiple groups. - uint32 group_size = 13; // Maximum amount of points to return per group - optional ReadConsistency read_consistency = 14; // Options for specifying read consistency guarantees - optional WithLookup with_lookup = 15; // Options for specifying how to use the group id to lookup points in another collection - optional RecommendStrategy strategy = 17; // How to use the example vectors to find the results - repeated Vector positive_vectors = 18; // Look for vectors closest to those - repeated Vector negative_vectors = 19; // Try to avoid vectors like this - optional uint64 timeout = 20; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ShardKeySelector shard_key_selector = 21; // Specify in which shards to look for the points, if not specified - look in all shards + // Name of the collection + string collection_name = 1; + // Look for vectors closest to the vectors from these points + repeated PointId positive = 2; + // Try to avoid vectors like the vector from these points + repeated PointId negative = 3; + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 4; + // Max number of groups in result + uint32 limit = 5; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 6; + // Search config + SearchParams params = 7; + // If provided - cut off results with worse scores + optional float score_threshold = 8; + // Define which vector to use for recommendation, if not specified - default vector + optional string using = 9; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 10; + // Name of the collection to use for points lookup, if not specified - use current collection + optional LookupLocation lookup_from = 11; + // Payload field to group by, must be a string or number field. + // If there are multiple values for the field, all of them will be used. + // One point can be in multiple groups. + string group_by = 12; + // Maximum amount of points to return per group + uint32 group_size = 13; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 14; + // Options for specifying how to use the group id to lookup points in another collection + optional WithLookup with_lookup = 15; + // How to use the example vectors to find the results + optional RecommendStrategy strategy = 17; + // Look for vectors closest to those + repeated Vector positive_vectors = 18; + // Try to avoid vectors like this + repeated Vector negative_vectors = 19; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 20; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 21; } message TargetVector { @@ -529,61 +738,121 @@ message ContextExamplePair { } message DiscoverPoints { - string collection_name = 1; // name of the collection - TargetVector target = 2; // Use this as the primary search objective - repeated ContextExamplePair context = 3; // Search will be constrained by these pairs of examples - Filter filter = 4; // Filter conditions - return only those points that satisfy the specified conditions - uint64 limit = 5; // Max number of result - WithPayloadSelector with_payload = 6; // Options for specifying which payload to include or not - SearchParams params = 7; // Search config - optional uint64 offset = 8; // Offset of the result - optional string using = 9; // Define which vector to use for recommendation, if not specified - default vector - optional WithVectorsSelector with_vectors = 10; // Options for specifying which vectors to include into response - optional LookupLocation lookup_from = 11; // Name of the collection to use for points lookup, if not specified - use current collection - optional ReadConsistency read_consistency = 12; // Options for specifying read consistency guarantees - optional uint64 timeout = 13; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ShardKeySelector shard_key_selector = 14; // Specify in which shards to look for the points, if not specified - look in all shards + // name of the collection + string collection_name = 1; + // Use this as the primary search objective + TargetVector target = 2; + // Search will be constrained by these pairs of examples + repeated ContextExamplePair context = 3; + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 4; + // Max number of result + uint64 limit = 5; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 6; + // Search config + SearchParams params = 7; + // Offset of the result + optional uint64 offset = 8; + // Define which vector to use for recommendation, if not specified - default vector + optional string using = 9; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 10; + // Name of the collection to use for points lookup, if not specified - use current collection + optional LookupLocation lookup_from = 11; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 12; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 13; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 14; } message DiscoverBatchPoints { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; repeated DiscoverPoints discover_points = 2; - optional ReadConsistency read_consistency = 3; // Options for specifying read consistency guarantees - optional uint64 timeout = 4; // If set, overrides global timeout setting for this request. Unit is seconds. + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 3; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 4; } message CountPoints { - string collection_name = 1; // Name of the collection - Filter filter = 2; // Filter conditions - return only those points that satisfy the specified conditions - optional bool exact = 3; // If `true` - return exact count, if `false` - return approximate count - optional ReadConsistency read_consistency = 4; // Options for specifying read consistency guarantees - optional ShardKeySelector shard_key_selector = 5; // Specify in which shards to look for the points, if not specified - look in all shards - optional uint64 timeout = 6; // If set, overrides global timeout setting for this request. Unit is seconds. + // Name of the collection + string collection_name = 1; + // Filter conditions - return only those points that satisfy the specified conditions + Filter filter = 2; + // If `true` - return exact count, if `false` - return approximate count + optional bool exact = 3; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 4; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 5; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 6; } message RecommendInput { - repeated VectorInput positive = 1; // Look for vectors closest to the vectors from these points - repeated VectorInput negative = 2; // Try to avoid vectors like the vector from these points - optional RecommendStrategy strategy = 3; // How to use the provided vectors to find the results + // Look for vectors closest to the vectors from these points + repeated VectorInput positive = 1; + // Try to avoid vectors like the vector from these points + repeated VectorInput negative = 2; + // How to use the provided vectors to find the results + optional RecommendStrategy strategy = 3; } message ContextInputPair { - VectorInput positive = 1; // A positive vector - VectorInput negative = 2; // Repel from this vector + // A positive vector + VectorInput positive = 1; + // Repel from this vector + VectorInput negative = 2; } message DiscoverInput { - VectorInput target = 1; // Use this as the primary search objective - ContextInput context = 2; // Search space will be constrained by these pairs of vectors + // Use this as the primary search objective + VectorInput target = 1; + // Search space will be constrained by these pairs of vectors + ContextInput context = 2; } message ContextInput { - repeated ContextInputPair pairs = 1; // Search space will be constrained by these pairs of vectors + // Search space will be constrained by these pairs of vectors + repeated ContextInputPair pairs = 1; +} + +message RelevanceFeedbackInput { + // The original query vector + VectorInput target = 1; + // Previous results scored by the feedback provider. + repeated FeedbackItem feedback = 2; + // Formula and trained coefficients to use. + FeedbackStrategy strategy = 3; +} + +message FeedbackItem { + VectorInput example = 1; // The id or vector from the original model + float score = 2; // Score for this vector as determined by the feedback provider +} + +message FeedbackStrategy { + oneof variant { + // a * score + sim(confidence^b * c * delta) + NaiveFeedbackStrategy naive = 1; + } +} + +message NaiveFeedbackStrategy { + float a = 1; + float b = 2; + float c = 3; } enum Fusion { - RRF = 0; // Reciprocal Rank Fusion (with default parameters) - DBSF = 1; // Distribution-Based Score Fusion + // Reciprocal Rank Fusion (with default parameters) + RRF = 0; + // Distribution-Based Score Fusion + DBSF = 1; } // Sample points from the collection @@ -592,278 +861,424 @@ enum Fusion { // // * `random` - Random sampling enum Sample { - Random = 0; + Random = 0; } message Formula { - Expression expression = 1; - map defaults = 2; + Expression expression = 1; + map defaults = 2; } message Expression { - oneof variant { - float constant = 1; - string variable = 2; // Payload key or reference to score. - Condition condition = 3; // Payload condition. If true, becomes 1.0; otherwise 0.0 - GeoDistance geo_distance = 4; // Geographic distance in meters - string datetime = 5; // Date-time constant - string datetime_key = 6; // Payload key with date-time values - MultExpression mult = 7; // Multiply - SumExpression sum = 8; // Sum - DivExpression div = 9; // Divide - Expression neg = 10; // Negate - Expression abs = 11; // Absolute value - Expression sqrt = 12; // Square root - PowExpression pow = 13; // Power - Expression exp = 14; // Exponential - Expression log10 = 15; // Logarithm - Expression ln = 16; // Natural logarithm - DecayParamsExpression exp_decay = 17; // Exponential decay - DecayParamsExpression gauss_decay = 18; // Gaussian decay - DecayParamsExpression lin_decay = 19; // Linear decay - } + oneof variant { + float constant = 1; + // Payload key or reference to score. + string variable = 2; + // Payload condition. If true, becomes 1.0; otherwise 0.0 + Condition condition = 3; + // Geographic distance in meters + GeoDistance geo_distance = 4; + // Date-time constant + string datetime = 5; + // Payload key with date-time values + string datetime_key = 6; + // Multiply + MultExpression mult = 7; + // Sum + SumExpression sum = 8; + // Divide + DivExpression div = 9; + // Negate + Expression neg = 10; + // Absolute value + Expression abs = 11; + // Square root + Expression sqrt = 12; + // Power + PowExpression pow = 13; + // Exponential + Expression exp = 14; + // Logarithm + Expression log10 = 15; + // Natural logarithm + Expression ln = 16; + // Exponential decay + DecayParamsExpression exp_decay = 17; + // Gaussian decay + DecayParamsExpression gauss_decay = 18; + // Linear decay + DecayParamsExpression lin_decay = 19; + } } message GeoDistance { - GeoPoint origin = 1; - string to = 2; + GeoPoint origin = 1; + string to = 2; } message MultExpression { - repeated Expression mult = 1; + repeated Expression mult = 1; } message SumExpression { - repeated Expression sum = 1; + repeated Expression sum = 1; } message DivExpression { - Expression left = 1; - Expression right = 2; - optional float by_zero_default = 3; + Expression left = 1; + Expression right = 2; + optional float by_zero_default = 3; } message PowExpression { - Expression base = 1; - Expression exponent = 2; + Expression base = 1; + Expression exponent = 2; } message DecayParamsExpression { - // The variable to decay - Expression x = 1; - // The target value to start decaying from. Defaults to 0. - optional Expression target = 2; - // The scale factor of the decay, in terms of `x`. Defaults to 1.0. Must be a non-zero positive number. - optional float scale = 3; - // The midpoint of the decay. Should be between 0 and 1. Defaults to 0.5. Output will be this value when `|x - target| == scale`. - optional float midpoint = 4; + // The variable to decay + Expression x = 1; + // The target value to start decaying from. Defaults to 0. + optional Expression target = 2; + // The scale factor of the decay, in terms of `x`. + // Defaults to 1.0. Must be a non-zero positive number. + optional float scale = 3; + // The midpoint of the decay. + // Should be between 0 and 1. Defaults to 0.5. + // Output will be this value when `|x - target| == scale`. + optional float midpoint = 4; } message NearestInputWithMmr { - // The vector to search for nearest neighbors. - VectorInput nearest = 1; + // The vector to search for nearest neighbors. + VectorInput nearest = 1; - // Perform MMR (Maximal Marginal Relevance) reranking after search, - // using the same vector in this query to calculate relevance. - Mmr mmr = 2; + // Perform MMR (Maximal Marginal Relevance) reranking after search, + // using the same vector in this query to calculate relevance. + Mmr mmr = 2; } // Maximal Marginal Relevance (MMR) algorithm for re-ranking the points. message Mmr { - // Tunable parameter for the MMR algorithm. - // Determines the balance between diversity and relevance. - // - // A higher value favors diversity (dissimilarity to selected results), - // while a lower value favors relevance (similarity to the query vector). - // - // Must be in the range [0, 1]. - // Default value is 0.5. - optional float diversity = 2; - - // The maximum number of candidates to consider for re-ranking. - // - // If not specified, the `limit` value is used. - optional uint32 candidates_limit = 3; + // Tunable parameter for the MMR algorithm. + // Determines the balance between diversity and relevance. + // + // A higher value favors diversity (dissimilarity to selected results), + // while a lower value favors relevance (similarity to the query vector). + // + // Must be in the range [0, 1]. + // Default value is 0.5. + optional float diversity = 2; + + // The maximum number of candidates to consider for re-ranking. + // + // If not specified, the `limit` value is used. + optional uint32 candidates_limit = 3; } // Parameterized reciprocal rank fusion message Rrf { - optional uint32 k = 1; // K parameter for reciprocal rank fusion + // K parameter for reciprocal rank fusion + optional uint32 k = 1; + + // Weights for each prefetch source. + // Higher weight gives more influence on the final ranking. + // If not specified, all prefetches are weighted equally. + // The number of weights should match the number of prefetches. + repeated float weights = 2; } message Query { oneof variant { - VectorInput nearest = 1; // Find the nearest neighbors to this vector. - RecommendInput recommend = 2; // Use multiple positive and negative vectors to find the results. - DiscoverInput discover = 3; // Search for nearest points, but constrain the search space with context - ContextInput context = 4; // Return points that live in positive areas. - OrderBy order_by = 5; // Order the points by a payload field. - Fusion fusion = 6; // Fuse the results of multiple prefetches. - Sample sample = 7; // Sample points from the collection. - Formula formula = 8; // Score boosting via an arbitrary formula - NearestInputWithMmr nearest_with_mmr = 9; // Search nearest neighbors, but re-rank based on the Maximal Marginal Relevance algorithm. - Rrf rrf = 10; // Parameterized reciprocal rank fusion + // Find the nearest neighbors to this vector. + VectorInput nearest = 1; + // Use multiple positive and negative vectors to find the results. + RecommendInput recommend = 2; + // Search for nearest points, but constrain the search space with context + DiscoverInput discover = 3; + // Return points that live in positive areas. + ContextInput context = 4; + // Order the points by a payload field. + OrderBy order_by = 5; + // Fuse the results of multiple prefetches. + Fusion fusion = 6; + // Sample points from the collection. + Sample sample = 7; + // Score boosting via an arbitrary formula + Formula formula = 8; + // Search nearest neighbors, but re-rank based on the Maximal Marginal Relevance algorithm. + NearestInputWithMmr nearest_with_mmr = 9; + // Parameterized reciprocal rank fusion + Rrf rrf = 10; + // Search with feedback from some oracle. + RelevanceFeedbackInput relevance_feedback = 11; } } message PrefetchQuery { - repeated PrefetchQuery prefetch = 1; // Sub-requests to perform first. If present, the query will be performed on the results of the prefetches. - optional Query query = 2; // Query to perform. If missing, returns points ordered by their IDs. - optional string using = 3; // Define which vector to use for querying. If missing, the default vector is is used. - optional Filter filter = 4; // Filter conditions - return only those points that satisfy the specified conditions. - optional SearchParams params = 5; // Search params for when there is no prefetch. - optional float score_threshold = 6; // Return points with scores better than this threshold. - optional uint64 limit = 7; // Max number of points. Default is 10 - optional LookupLocation lookup_from = 8; // The location to use for IDs lookup, if not specified - use the current collection and the 'using' vector + // Sub-requests to perform first. + // If present, the query will be performed on the results of the prefetches. + repeated PrefetchQuery prefetch = 1; + // Query to perform. + // If missing, returns points ordered by their IDs. + optional Query query = 2; + // Define which vector to use for querying. + // If missing, the default vector is used. + optional string using = 3; + // Filter conditions - return only those points that satisfy the specified conditions. + optional Filter filter = 4; + // Search params for when there is no prefetch. + optional SearchParams params = 5; + // Return points with scores better than this threshold. + optional float score_threshold = 6; + // Max number of points. Default is 10 + optional uint64 limit = 7; + // The location to use for IDs lookup. + // If not specified - use the current collection and the 'using' vector. + optional LookupLocation lookup_from = 8; } message QueryPoints { - string collection_name = 1; // Name of the collection - repeated PrefetchQuery prefetch = 2; // Sub-requests to perform first. If present, the query will be performed on the results of the prefetches. - optional Query query = 3; // Query to perform. If missing, returns points ordered by their IDs. - optional string using = 4; // Define which vector to use for querying. If missing, the default vector is used. - optional Filter filter = 5; // Filter conditions - return only those points that satisfy the specified conditions. - optional SearchParams params = 6; // Search params for when there is no prefetch. - optional float score_threshold = 7; // Return points with scores better than this threshold. - optional uint64 limit = 8; // Max number of points. Default is 10. - optional uint64 offset = 9; // Offset of the result. Skip this many points. Default is 0. - optional WithVectorsSelector with_vectors = 10; // Options for specifying which vectors to include into the response. - optional WithPayloadSelector with_payload = 11; // Options for specifying which payload to include or not. - optional ReadConsistency read_consistency = 12; // Options for specifying read consistency guarantees. - optional ShardKeySelector shard_key_selector = 13; // Specify in which shards to look for the points, if not specified - look in all shards. - optional LookupLocation lookup_from = 14; // The location to use for IDs lookup, if not specified - use the current collection and the 'using' vector - optional uint64 timeout = 15; // If set, overrides global timeout setting for this request. Unit is seconds. + // Name of the collection + string collection_name = 1; + // Sub-requests to perform first. + // If present, the query will be performed on the results of the prefetches. + repeated PrefetchQuery prefetch = 2; + // Query to perform. If missing, returns points ordered by their IDs. + optional Query query = 3; + // Define which vector to use for querying. + // If missing, the default vector is used. + optional string using = 4; + // Filter conditions - return only those points that satisfy the specified conditions. + optional Filter filter = 5; + // Search params for when there is no prefetch. + optional SearchParams params = 6; + // Return points with scores better than this threshold. + optional float score_threshold = 7; + // Max number of points. Default is 10. + optional uint64 limit = 8; + // Offset of the result. Skip this many points. Default is 0. + optional uint64 offset = 9; + // Options for specifying which vectors to include into the response. + optional WithVectorsSelector with_vectors = 10; + // Options for specifying which payload to include or not. + optional WithPayloadSelector with_payload = 11; + // Options for specifying read consistency guarantees. + optional ReadConsistency read_consistency = 12; + // Specify in which shards to look for the points. + // If not specified - look in all shards. + optional ShardKeySelector shard_key_selector = 13; + // The location to use for IDs lookup. + // If not specified - use the current collection and the 'using' vector. + optional LookupLocation lookup_from = 14; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 15; } message QueryBatchPoints { string collection_name = 1; repeated QueryPoints query_points = 2; - optional ReadConsistency read_consistency = 3; // Options for specifying read consistency guarantees - optional uint64 timeout = 4; // If set, overrides global timeout setting for this request. Unit is seconds. + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 3; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 4; } message QueryPointGroups { - string collection_name = 1; // Name of the collection - repeated PrefetchQuery prefetch = 2; // Sub-requests to perform first. If present, the query will be performed on the results of the prefetches. - optional Query query = 3; // Query to perform. If missing, returns points ordered by their IDs. - optional string using = 4; // Define which vector to use for querying. If missing, the default vector is used. - optional Filter filter = 5; // Filter conditions - return only those points that satisfy the specified conditions. - optional SearchParams params = 6; // Search params for when there is no prefetch. - optional float score_threshold = 7; // Return points with scores better than this threshold. - WithPayloadSelector with_payload = 8; // Options for specifying which payload to include or not - optional WithVectorsSelector with_vectors = 9; // Options for specifying which vectors to include into response - optional LookupLocation lookup_from = 10; // The location to use for IDs lookup, if not specified - use the current collection and the 'using' vector - optional uint64 limit = 11; // Max number of points. Default is 3. - optional uint64 group_size = 12; // Maximum amount of points to return per group. Default to 10. - string group_by = 13; // Payload field to group by, must be a string or number field. If there are multiple values for the field, all of them will be used. One point can be in multiple groups. - optional ReadConsistency read_consistency = 14; // Options for specifying read consistency guarantees - optional WithLookup with_lookup = 15; // Options for specifying how to use the group id to lookup points in another collection - optional uint64 timeout = 16; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ShardKeySelector shard_key_selector = 17; // Specify in which shards to look for the points, if not specified - look in all shards + // Name of the collection + string collection_name = 1; + // Sub-requests to perform first. + // If present, the query will be performed on the results of the prefetches. + repeated PrefetchQuery prefetch = 2; + // Query to perform. If missing, returns points ordered by their IDs. + optional Query query = 3; + // Define which vector to use for querying. + // If missing, the default vector is used. + optional string using = 4; + // Filter conditions - return only those points that satisfy the specified conditions. + optional Filter filter = 5; + // Search params for when there is no prefetch. + optional SearchParams params = 6; + // Return points with scores better than this threshold. + optional float score_threshold = 7; + // Options for specifying which payload to include or not + WithPayloadSelector with_payload = 8; + // Options for specifying which vectors to include into response + optional WithVectorsSelector with_vectors = 9; + // The location to use for IDs lookup. + // If not specified - use the current collection and the 'using' vector. + optional LookupLocation lookup_from = 10; + // Max number of points. Default is 3. + optional uint64 limit = 11; + // Maximum amount of points to return per group. Defaults to 10. + optional uint64 group_size = 12; + // Payload field to group by, must be a string or number field. + // If there are multiple values for the field, all of them will be used. + // One point can be in multiple groups. + string group_by = 13; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 14; + // Options for specifying how to use the group id to lookup points in another collection + optional WithLookup with_lookup = 15; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 16; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 17; } message FacetCounts { - string collection_name = 1; // Name of the collection - string key = 2; // Payload key of the facet - optional Filter filter = 3; // Filter conditions - return only those points that satisfy the specified conditions. - optional uint64 limit = 4; // Max number of facets. Default is 10. - optional bool exact = 5; // If true, return exact counts, slower but useful for debugging purposes. Default is false. - optional uint64 timeout = 6; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ReadConsistency read_consistency = 7; // Options for specifying read consistency guarantees - optional ShardKeySelector shard_key_selector = 8; // Specify in which shards to look for the points, if not specified - look in all shards + // Name of the collection + string collection_name = 1; + // Payload key of the facet + string key = 2; + // Filter conditions - return only those points that satisfy the specified conditions. + optional Filter filter = 3; + // Max number of facets. Default is 10. + optional uint64 limit = 4; + // If true, return exact counts, slower but useful for debugging purposes. Default is false. + optional bool exact = 5; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 6; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 7; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 8; } message FacetValue { - oneof variant { - string string_value = 1; // String value from the facet - int64 integer_value = 2; // Integer value from the facet - bool bool_value = 3; // Boolean value from the facet - } + oneof variant { + // String value from the facet + string string_value = 1; + // Integer value from the facet + int64 integer_value = 2; + // Boolean value from the facet + bool bool_value = 3; + } } message FacetHit { - FacetValue value = 1; // Value from the facet - uint64 count = 2; // Number of points with this value + // Value from the facet + FacetValue value = 1; + // Number of points with this value + uint64 count = 2; } message SearchMatrixPoints { - string collection_name = 1; // Name of the collection - optional Filter filter = 2; // Filter conditions - return only those points that satisfy the specified conditions. - optional uint64 sample = 3; // How many points to select and search within. Default is 10. - optional uint64 limit = 4; // How many neighbours per sample to find. Default is 3. - optional string using = 5; // Define which vector to use for querying. If missing, the default vector is is used. - optional uint64 timeout = 6; // If set, overrides global timeout setting for this request. Unit is seconds. - optional ReadConsistency read_consistency = 7; // Options for specifying read consistency guarantees - optional ShardKeySelector shard_key_selector = 8; // Specify in which shards to look for the points, if not specified - look in all shards + // Name of the collection + string collection_name = 1; + // Filter conditions - return only those points that satisfy the specified conditions. + optional Filter filter = 2; + // How many points to select and search within. Default is 10. + optional uint64 sample = 3; + // How many neighbours per sample to find. Default is 3. + optional uint64 limit = 4; + // Define which vector to use for querying. If missing, the default vector is used. + optional string using = 5; + // If set, overrides global timeout setting for this request. Unit is seconds. + optional uint64 timeout = 6; + // Options for specifying read consistency guarantees + optional ReadConsistency read_consistency = 7; + // Specify in which shards to look for the points, if not specified - look in all shards + optional ShardKeySelector shard_key_selector = 8; } message SearchMatrixPairs { - repeated SearchMatrixPair pairs = 1; // List of pairs of points with scores + // List of pairs of points with scores + repeated SearchMatrixPair pairs = 1; } message SearchMatrixPair { - PointId a = 1; // first id of the pair - PointId b = 2; // second id of the pair - float score = 3; // score of the pair + // first id of the pair + PointId a = 1; + // second id of the pair + PointId b = 2; + // score of the pair + float score = 3; } message SearchMatrixOffsets { - repeated uint64 offsets_row = 1; // Row indices of the matrix - repeated uint64 offsets_col = 2; // Column indices of the matrix - repeated float scores = 3; // Scores associated with matrix coordinates - repeated PointId ids = 4; // Ids of the points in order + // Row indices of the matrix + repeated uint64 offsets_row = 1; + // Column indices of the matrix + repeated uint64 offsets_col = 2; + // Scores associated with matrix coordinates + repeated float scores = 3; + // Ids of the points in order + repeated PointId ids = 4; } - message PointsUpdateOperation { message PointStructList { repeated PointStruct points = 1; - optional ShardKeySelector shard_key_selector = 2; // Option for custom sharding to specify used shard keys - optional Filter update_filter = 3; // If specified, only points that match this filter will be updated, others will be inserted + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 2; + // Filter to apply when updating existing points. Only points matching this filter will be updated. + // Points that don't match will keep their current state. New points will be inserted regardless of the filter. + optional Filter update_filter = 3; + // Mode of the upsert operation: insert_only, upsert (default), update_only + optional UpdateMode update_mode = 4; } message SetPayload { - map payload = 1; - optional PointsSelector points_selector = 2; // Affected points - optional ShardKeySelector shard_key_selector = 3; // Option for custom sharding to specify used shard keys - optional string key = 4; // Option for indicate property of payload + map payload = 1; + // Affected points + optional PointsSelector points_selector = 2; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 3; + // Option for indicate property of payload + optional string key = 4; } message OverwritePayload { - map payload = 1; - optional PointsSelector points_selector = 2; // Affected points - optional ShardKeySelector shard_key_selector = 3; // Option for custom sharding to specify used shard keys - optional string key = 4; // Option for indicate property of payload + map payload = 1; + // Affected points + optional PointsSelector points_selector = 2; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 3; + // Option for indicate property of payload + optional string key = 4; } message DeletePayload { - repeated string keys = 1; - optional PointsSelector points_selector = 2; // Affected points - optional ShardKeySelector shard_key_selector = 3; // Option for custom sharding to specify used shard keys + repeated string keys = 1; + // Affected points + optional PointsSelector points_selector = 2; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 3; } message UpdateVectors { - repeated PointVectors points = 1; // List of points and vectors to update - optional ShardKeySelector shard_key_selector = 2; // Option for custom sharding to specify used shard keys - optional Filter update_filter = 3; // If specified, only points that match this filter will be updated + // List of points and vectors to update + repeated PointVectors points = 1; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 2; + // If specified, only points that match this filter will be updated + optional Filter update_filter = 3; } message DeleteVectors { - PointsSelector points_selector = 1; // Affected points - VectorsSelector vectors = 2; // List of vector names to delete - optional ShardKeySelector shard_key_selector = 3; // Option for custom sharding to specify used shard keys + // Affected points + PointsSelector points_selector = 1; + // List of vector names to delete + VectorsSelector vectors = 2; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 3; } message DeletePoints { - PointsSelector points = 1; // Affected points - optional ShardKeySelector shard_key_selector = 2; // Option for custom sharding to specify used shard keys + // Affected points + PointsSelector points = 1; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 2; } message ClearPayload { - PointsSelector points = 1; // Affected points - optional ShardKeySelector shard_key_selector = 2; // Option for custom sharding to specify used shard keys + // Affected points + PointsSelector points = 1; + // Option for custom sharding to specify used shard keys + optional ShardKeySelector shard_key_selector = 2; } oneof operation { PointStructList upsert = 1; - PointsSelector delete_deprecated = 2 [deprecated=true]; + PointsSelector delete_deprecated = 2 [deprecated = true]; SetPayload set_payload = 3; OverwritePayload overwrite_payload = 4; DeletePayload delete_payload = 5; - PointsSelector clear_payload_deprecated = 6 [deprecated=true]; + PointsSelector clear_payload_deprecated = 6 [deprecated = true]; UpdateVectors update_vectors = 7; DeleteVectors delete_vectors = 8; DeletePoints delete_points = 9; @@ -872,10 +1287,15 @@ message PointsUpdateOperation { } message UpdateBatchPoints { - string collection_name = 1; // name of the collection - optional bool wait = 2; // Wait until the changes have been applied? + // name of the collection + string collection_name = 1; + // Wait until the changes have been applied? + optional bool wait = 2; repeated PointsUpdateOperation operations = 3; - optional WriteOrdering ordering = 4; // Write ordering guarantees + // Write ordering guarantees + optional WriteOrdering ordering = 4; + // Timeout for the operation in seconds + optional uint64 timeout = 5; } // --------------------------------------------- @@ -884,20 +1304,28 @@ message UpdateBatchPoints { message PointsOperationResponse { UpdateResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message UpdateResult { - optional uint64 operation_id = 1; // Number of operation - UpdateStatus status = 2; // Operation status + // Number of operation + optional uint64 operation_id = 1; + // Operation status + UpdateStatus status = 2; } enum UpdateStatus { UnknownUpdateStatus = 0; - Acknowledged = 1; // Update is received, but not processed yet - Completed = 2; // Update is applied and ready for search - ClockRejected = 3; // Internal: update is rejected due to an outdated clock + // Update is received, but not processed yet + Acknowledged = 1; + // Update is applied and ready for search + Completed = 2; + // Internal: update is rejected due to an outdated clock + ClockRejected = 3; + // Timeout of awaited operations + WaitTimeout = 4; } message OrderValue { @@ -908,19 +1336,27 @@ message OrderValue { } message ScoredPoint { - PointId id = 1; // Point id - map payload = 2; // Payload - float score = 3; // Similarity score - reserved 4; // deprecated "vector" field - uint64 version = 5; // Last update operation applied to this point - optional VectorsOutput vectors = 6; // Vectors to search - optional ShardKey shard_key = 7; // Shard key - optional OrderValue order_value = 8; // Order by value + // Point id + PointId id = 1; + // Payload + map payload = 2; + // Similarity score + float score = 3; + // deprecated "vector" field + reserved 4; + // Last update operation applied to this point + uint64 version = 5; + // Vectors to search + optional VectorsOutput vectors = 6; + // Shard key + optional ShardKey shard_key = 7; + // Order by value + optional OrderValue order_value = 8; } message GroupId { oneof kind { - // Represents a double value. + // Represents an unsigned integer value. uint64 unsigned_value = 1; // Represents an integer value int64 integer_value = 2; @@ -930,36 +1366,44 @@ message GroupId { } message PointGroup { - GroupId id = 1; // Group id - repeated ScoredPoint hits = 2; // Points in the group - RetrievedPoint lookup = 3; // Point(s) from the lookup collection that matches the group id + // Group id + GroupId id = 1; + // Points in the group + repeated ScoredPoint hits = 2; + // Point(s) from the lookup collection that matches the group id + RetrievedPoint lookup = 3; } message GroupsResult { - repeated PointGroup groups = 1; // Groups + // Groups + repeated PointGroup groups = 1; } message SearchResponse { repeated ScoredPoint result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message QueryResponse { repeated ScoredPoint result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message QueryBatchResponse { repeated BatchResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message QueryGroupsResponse { GroupsResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } @@ -969,26 +1413,31 @@ message BatchResult { message SearchBatchResponse { repeated BatchResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message SearchGroupsResponse { GroupsResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message CountResponse { CountResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message ScrollResponse { - optional PointId next_page_offset = 1; // Use this offset for the next query + // Use this offset for the next query + optional PointId next_page_offset = 1; repeated RetrievedPoint result = 2; - double time = 3; // Time spent to process + // Time spent to process + double time = 3; optional Usage usage = 4; } @@ -999,69 +1448,82 @@ message CountResult { message RetrievedPoint { PointId id = 1; map payload = 2; - reserved 3; // deprecated "vector" field + // deprecated "vector" field + reserved 3; optional VectorsOutput vectors = 4; - optional ShardKey shard_key = 5; // Shard key - optional OrderValue order_value = 6; // Order-by value + // Shard key + optional ShardKey shard_key = 5; + // Order-by value + optional OrderValue order_value = 6; } message GetResponse { repeated RetrievedPoint result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message RecommendResponse { repeated ScoredPoint result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message RecommendBatchResponse { repeated BatchResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message DiscoverResponse { repeated ScoredPoint result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message DiscoverBatchResponse { repeated BatchResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message RecommendGroupsResponse { GroupsResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message UpdateBatchResponse { repeated UpdateResult result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message FacetResponse { - repeated FacetHit hits = 1; - double time = 2; // Time spent to process - optional Usage usage = 3; + repeated FacetHit hits = 1; + // Time spent to process + double time = 2; + optional Usage usage = 3; } message SearchMatrixPairsResponse { SearchMatrixPairs result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } message SearchMatrixOffsetsResponse { SearchMatrixOffsets result = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; optional Usage usage = 3; } @@ -1084,10 +1546,10 @@ message PointsIdsList { // ------------------- Point ------------------- // --------------------------------------------- - message PointStruct { PointId id = 1; - reserved 2; // deprecated "vector" field + // deprecated "vector" field + reserved 2; map payload = 3; optional Vectors vectors = 4; } @@ -1100,7 +1562,6 @@ message Usage { optional InferenceUsage inference = 2; } - // --------------------------------------------- // ------------ Inference measurements ---------- // --------------------------------------------- diff --git a/packages/js-client-grpc/proto/points_service.proto b/packages/js-client-grpc/proto/points_service.proto index ef83007..860d4c7 100644 --- a/packages/js-client-grpc/proto/points_service.proto +++ b/packages/js-client-grpc/proto/points_service.proto @@ -6,131 +6,98 @@ package qdrant; option csharp_namespace = "Qdrant.Client.Grpc"; service Points { - /* - Perform insert + updates on points. If a point with a given ID already exists - it will be overwritten. - */ - rpc Upsert (UpsertPoints) returns (PointsOperationResponse) {} - /* - Delete points - */ - rpc Delete (DeletePoints) returns (PointsOperationResponse) {} - /* - Retrieve points - */ - rpc Get (GetPoints) returns (GetResponse) {} - /* - Update named vectors for point - */ - rpc UpdateVectors (UpdatePointVectors) returns (PointsOperationResponse) {} - /* - Delete named vectors for points - */ - rpc DeleteVectors (DeletePointVectors) returns (PointsOperationResponse) {} - /* - Set payload for points - */ - rpc SetPayload (SetPayloadPoints) returns (PointsOperationResponse) {} - /* - Overwrite payload for points - */ - rpc OverwritePayload (SetPayloadPoints) returns (PointsOperationResponse) {} - /* - Delete specified key payload for points - */ - rpc DeletePayload (DeletePayloadPoints) returns (PointsOperationResponse) {} - /* - Remove all payload for specified points - */ - rpc ClearPayload (ClearPayloadPoints) returns (PointsOperationResponse) {} - /* - Create index for field in collection - */ - rpc CreateFieldIndex (CreateFieldIndexCollection) returns (PointsOperationResponse) {} - /* - Delete field index for collection - */ - rpc DeleteFieldIndex (DeleteFieldIndexCollection) returns (PointsOperationResponse) {} - /* - Retrieve closest points based on vector similarity and given filtering conditions - */ - rpc Search (SearchPoints) returns (SearchResponse) {} - /* - Retrieve closest points based on vector similarity and given filtering conditions - */ - rpc SearchBatch (SearchBatchPoints) returns (SearchBatchResponse) {} - /* - Retrieve closest points based on vector similarity and given filtering conditions, grouped by a given field - */ - rpc SearchGroups (SearchPointGroups) returns (SearchGroupsResponse) {} - /* - Iterate over all or filtered points - */ - rpc Scroll (ScrollPoints) returns (ScrollResponse) {} - /* - Look for the points which are closer to stored positive examples and at the same time further to negative examples. - */ - rpc Recommend (RecommendPoints) returns (RecommendResponse) {} - /* - Look for the points which are closer to stored positive examples and at the same time further to negative examples. - */ - rpc RecommendBatch (RecommendBatchPoints) returns (RecommendBatchResponse) {} - /* - Look for the points which are closer to stored positive examples and at the same time further to negative examples, grouped by a given field - */ - rpc RecommendGroups (RecommendPointGroups) returns (RecommendGroupsResponse) {} - /* - Use context and a target to find the most similar points to the target, constrained by the context. + // Perform insert + updates on points. + // If a point with a given ID already exists - it will be overwritten. + rpc Upsert(UpsertPoints) returns (PointsOperationResponse) {} + // Delete points + rpc Delete(DeletePoints) returns (PointsOperationResponse) {} + // Retrieve points + rpc Get(GetPoints) returns (GetResponse) {} + // Update named vectors for point + rpc UpdateVectors(UpdatePointVectors) returns (PointsOperationResponse) {} + // Delete named vectors for points + rpc DeleteVectors(DeletePointVectors) returns (PointsOperationResponse) {} + // Set payload for points + rpc SetPayload(SetPayloadPoints) returns (PointsOperationResponse) {} + // Overwrite payload for points + rpc OverwritePayload(SetPayloadPoints) returns (PointsOperationResponse) {} + // Delete specified key payload for points + rpc DeletePayload(DeletePayloadPoints) returns (PointsOperationResponse) {} + // Remove all payload for specified points + rpc ClearPayload(ClearPayloadPoints) returns (PointsOperationResponse) {} + // Create index for field in collection + rpc CreateFieldIndex(CreateFieldIndexCollection) + returns (PointsOperationResponse) {} + // Delete field index for collection + rpc DeleteFieldIndex(DeleteFieldIndexCollection) + returns (PointsOperationResponse) {} + // Retrieve closest points based on vector similarity and given filtering + // conditions + rpc Search(SearchPoints) returns (SearchResponse) {} + // Retrieve closest points based on vector similarity and given filtering + // conditions + rpc SearchBatch(SearchBatchPoints) returns (SearchBatchResponse) {} + // Retrieve closest points based on vector similarity and given filtering + // conditions, grouped by a given field + rpc SearchGroups(SearchPointGroups) returns (SearchGroupsResponse) {} + // Iterate over all or filtered points + rpc Scroll(ScrollPoints) returns (ScrollResponse) {} + // Look for the points which are closer to stored positive examples and at + // the same time further to negative examples. + rpc Recommend(RecommendPoints) returns (RecommendResponse) {} + // Look for the points which are closer to stored positive examples and at + // the same time further to negative examples. + rpc RecommendBatch(RecommendBatchPoints) returns (RecommendBatchResponse) {} + // Look for the points which are closer to stored positive examples and at + // the same time further to negative examples, grouped by a given field + rpc RecommendGroups(RecommendPointGroups) returns (RecommendGroupsResponse) {} + // Use context and a target to find the most similar points to the target, + // constrained by the context. + // + // When using only the context (without a target), a special search - called + // context search - is performed where pairs of points are used to generate a + // loss that guides the search towards the zone where most positive examples + // overlap. This means that the score minimizes the scenario of finding a + // point closer to a negative than to a positive part of a pair. + // + // Since the score of a context relates to loss, the maximum score a point + // can get is 0.0, and it becomes normal that many points can have a score of + // 0.0. + // + // When using target (with or without context), the score behaves a little + // different: The integer part of the score represents the rank with respect + // to the context, while the decimal part of the score relates to the + // distance to the target. The context part of the score for each pair is + // calculated +1 if the point is closer to a positive than to a negative part + // of a pair, and -1 otherwise. + rpc Discover(DiscoverPoints) returns (DiscoverResponse) {} + // Batch request points based on { positive, negative } pairs of examples, and/or a target + rpc DiscoverBatch(DiscoverBatchPoints) returns (DiscoverBatchResponse) {} + // Count points in collection with given filtering conditions + rpc Count(CountPoints) returns (CountResponse) {} - When using only the context (without a target), a special search - called context search - is performed where - pairs of points are used to generate a loss that guides the search towards the zone where - most positive examples overlap. This means that the score minimizes the scenario of - finding a point closer to a negative than to a positive part of a pair. - - Since the score of a context relates to loss, the maximum score a point can get is 0.0, - and it becomes normal that many points can have a score of 0.0. - - When using target (with or without context), the score behaves a little different: The - integer part of the score represents the rank with respect to the context, while the - decimal part of the score relates to the distance to the target. The context part of the score for - each pair is calculated +1 if the point is closer to a positive than to a negative part of a pair, - and -1 otherwise. - */ - rpc Discover (DiscoverPoints) returns (DiscoverResponse) {} - /* - Batch request points based on { positive, negative } pairs of examples, and/or a target - */ - rpc DiscoverBatch (DiscoverBatchPoints) returns (DiscoverBatchResponse) {} - /* - Count points in collection with given filtering conditions - */ - rpc Count (CountPoints) returns (CountResponse) {} - - /* - Perform multiple update operations in one request - */ - rpc UpdateBatch (UpdateBatchPoints) returns (UpdateBatchResponse) {} - /* - Universally query points. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. - */ - rpc Query (QueryPoints) returns (QueryResponse) {} - /* - Universally query points in a batch fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. - */ - rpc QueryBatch (QueryBatchPoints) returns (QueryBatchResponse) {} - /* - Universally query points in a group fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. - */ - rpc QueryGroups (QueryPointGroups) returns (QueryGroupsResponse) {} - /* - Perform facet counts. For each value in the field, count the number of points that have this value and match the conditions. - */ - rpc Facet (FacetCounts) returns (FacetResponse) {} - /* - Compute distance matrix for sampled points with a pair based output format - */ - rpc SearchMatrixPairs (SearchMatrixPoints) returns (SearchMatrixPairsResponse) {} - /* - Compute distance matrix for sampled points with an offset based output format - */ - rpc SearchMatrixOffsets (SearchMatrixPoints) returns (SearchMatrixOffsetsResponse) {} + // Perform multiple update operations in one request + rpc UpdateBatch(UpdateBatchPoints) returns (UpdateBatchResponse) {} + // Universally query points. + // This endpoint covers all capabilities of search, recommend, discover, filters. + // But also enables hybrid and multi-stage queries. + rpc Query(QueryPoints) returns (QueryResponse) {} + // Universally query points in a batch fashion. + // This endpoint covers all capabilities of search, recommend, discover, filters. + // But also enables hybrid and multi-stage queries. + rpc QueryBatch(QueryBatchPoints) returns (QueryBatchResponse) {} + // Universally query points in a group fashion. + // This endpoint covers all capabilities of search, recommend, discover, filters. + // But also enables hybrid and multi-stage queries. + rpc QueryGroups(QueryPointGroups) returns (QueryGroupsResponse) {} + // Perform facet counts. + // For each value in the field, count the number of points that have this + // value and match the conditions. + rpc Facet(FacetCounts) returns (FacetResponse) {} + // Compute distance matrix for sampled points with a pair based output format + rpc SearchMatrixPairs(SearchMatrixPoints) + returns (SearchMatrixPairsResponse) {} + // Compute distance matrix for sampled points with an offset based output format + rpc SearchMatrixOffsets(SearchMatrixPoints) + returns (SearchMatrixOffsetsResponse) {} } diff --git a/packages/js-client-grpc/proto/qdrant.proto b/packages/js-client-grpc/proto/qdrant.proto index 723bb65..42545ff 100644 --- a/packages/js-client-grpc/proto/qdrant.proto +++ b/packages/js-client-grpc/proto/qdrant.proto @@ -8,7 +8,7 @@ package qdrant; option csharp_namespace = "Qdrant.Client.Grpc"; service Qdrant { - rpc HealthCheck (HealthCheckRequest) returns (HealthCheckReply) {} + rpc HealthCheck(HealthCheckRequest) returns (HealthCheckReply) {} } message HealthCheckRequest {} diff --git a/packages/js-client-grpc/proto/qdrant_common.proto b/packages/js-client-grpc/proto/qdrant_common.proto new file mode 100644 index 0000000..770fec2 --- /dev/null +++ b/packages/js-client-grpc/proto/qdrant_common.proto @@ -0,0 +1,177 @@ +syntax = "proto3"; +package qdrant; + +option csharp_namespace = "Qdrant.Client.Grpc"; +option java_outer_classname = "Common"; + +import "google/protobuf/timestamp.proto"; + +message PointId { + oneof point_id_options { + // Numerical ID of the point + uint64 num = 1; + // UUID + string uuid = 2; + } +} + +message GeoPoint { + double lon = 1; + double lat = 2; +} + +message Filter { + // At least one of those conditions should match + repeated Condition should = 1; + // All conditions must match + repeated Condition must = 2; + // All conditions must NOT match + repeated Condition must_not = 3; + // At least minimum amount of given conditions should match + optional MinShould min_should = 4; +} + +message MinShould { + repeated Condition conditions = 1; + uint64 min_count = 2; +} + +message Condition { + oneof condition_one_of { + FieldCondition field = 1; + IsEmptyCondition is_empty = 2; + HasIdCondition has_id = 3; + Filter filter = 4; + IsNullCondition is_null = 5; + NestedCondition nested = 6; + HasVectorCondition has_vector = 7; + } +} + +message IsEmptyCondition { + string key = 1; +} + +message IsNullCondition { + string key = 1; +} + +message HasIdCondition { + repeated PointId has_id = 1; +} + +message HasVectorCondition { + string has_vector = 1; +} + +message NestedCondition { + // Path to nested object + string key = 1; + // Filter condition + Filter filter = 2; +} + +message FieldCondition { + string key = 1; + // Check if point has field with a given value + Match match = 2; + // Check if points value lies in a given range + Range range = 3; + // Check if points geolocation lies in a given area + GeoBoundingBox geo_bounding_box = 4; + // Check if geo point is within a given radius + GeoRadius geo_radius = 5; + // Check number of values for a specific field + ValuesCount values_count = 6; + // Check if geo point is within a given polygon + GeoPolygon geo_polygon = 7; + // Check if datetime is within a given range + DatetimeRange datetime_range = 8; + // Check if field is empty + optional bool is_empty = 9; + // Check if field is null + optional bool is_null = 10; +} + +message Match { + oneof match_value { + // Match string keyword + string keyword = 1; + // Match integer + int64 integer = 2; + // Match boolean + bool boolean = 3; + // Match text + string text = 4; + // Match multiple keywords + RepeatedStrings keywords = 5; + // Match multiple integers + RepeatedIntegers integers = 6; + // Match any other value except those integers + RepeatedIntegers except_integers = 7; + // Match any other value except those keywords + RepeatedStrings except_keywords = 8; + // Match phrase text + string phrase = 9; + // Match any word in the text + string text_any = 10; + } +} + +message RepeatedStrings { + repeated string strings = 1; +} + +message RepeatedIntegers { + repeated int64 integers = 1; +} + +message Range { + optional double lt = 1; + optional double gt = 2; + optional double gte = 3; + optional double lte = 4; +} + +message DatetimeRange { + optional google.protobuf.Timestamp lt = 1; + optional google.protobuf.Timestamp gt = 2; + optional google.protobuf.Timestamp gte = 3; + optional google.protobuf.Timestamp lte = 4; +} + +message GeoBoundingBox { + // north-west corner + GeoPoint top_left = 1; + // south-east corner + GeoPoint bottom_right = 2; +} + +message GeoRadius { + // Center of the circle + GeoPoint center = 1; + // In meters + float radius = 2; +} + +message GeoLineString { + // Ordered sequence of GeoPoints representing the line + repeated GeoPoint points = 1; +} + +// For a valid GeoPolygon, both the exterior and interior GeoLineStrings must +// consist of a minimum of 4 points. +// Additionally, the first and last points of each GeoLineString must be the same. +message GeoPolygon { + // The exterior line bounds the surface + GeoLineString exterior = 1; + // Interior lines (if present) bound holes within the surface + repeated GeoLineString interiors = 2; +} + +message ValuesCount { + optional uint64 lt = 1; + optional uint64 gt = 2; + optional uint64 gte = 3; + optional uint64 lte = 4; +} diff --git a/packages/js-client-grpc/proto/snapshots_service.proto b/packages/js-client-grpc/proto/snapshots_service.proto index 63c9e51..df79fb9 100644 --- a/packages/js-client-grpc/proto/snapshots_service.proto +++ b/packages/js-client-grpc/proto/snapshots_service.proto @@ -6,30 +6,18 @@ option csharp_namespace = "Qdrant.Client.Grpc"; import "google/protobuf/timestamp.proto"; service Snapshots { - /* - Create collection snapshot - */ - rpc Create (CreateSnapshotRequest) returns (CreateSnapshotResponse) {} - /* - List collection snapshots - */ - rpc List (ListSnapshotsRequest) returns (ListSnapshotsResponse) {} - /* - Delete collection snapshot - */ - rpc Delete (DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} - /* - Create full storage snapshot - */ - rpc CreateFull (CreateFullSnapshotRequest) returns (CreateSnapshotResponse) {} - /* - List full storage snapshots - */ - rpc ListFull (ListFullSnapshotsRequest) returns (ListSnapshotsResponse) {} - /* - Delete full storage snapshot - */ - rpc DeleteFull (DeleteFullSnapshotRequest) returns (DeleteSnapshotResponse) {} + // Create collection snapshot + rpc Create(CreateSnapshotRequest) returns (CreateSnapshotResponse) {} + // List collection snapshots + rpc List(ListSnapshotsRequest) returns (ListSnapshotsResponse) {} + // Delete collection snapshot + rpc Delete(DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} + // Create full storage snapshot + rpc CreateFull(CreateFullSnapshotRequest) returns (CreateSnapshotResponse) {} + // List full storage snapshots + rpc ListFull(ListFullSnapshotsRequest) returns (ListSnapshotsResponse) {} + // Delete full storage snapshot + rpc DeleteFull(DeleteFullSnapshotRequest) returns (DeleteSnapshotResponse) {} } message CreateFullSnapshotRequest {} @@ -37,39 +25,51 @@ message CreateFullSnapshotRequest {} message ListFullSnapshotsRequest {} message DeleteFullSnapshotRequest { - string snapshot_name = 1; // Name of the full snapshot + // Name of the full snapshot + string snapshot_name = 1; } message CreateSnapshotRequest { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; } message ListSnapshotsRequest { - string collection_name = 1; // Name of the collection + // Name of the collection + string collection_name = 1; } message DeleteSnapshotRequest { - string collection_name = 1; // Name of the collection - string snapshot_name = 2; // Name of the collection snapshot + // Name of the collection + string collection_name = 1; + // Name of the collection snapshot + string snapshot_name = 2; } message SnapshotDescription { - string name = 1; // Name of the snapshot - google.protobuf.Timestamp creation_time = 2; // Creation time of the snapshot - int64 size = 3; // Size of the snapshot in bytes - optional string checksum = 4; // SHA256 digest of the snapshot file + // Name of the snapshot + string name = 1; + // Creation time of the snapshot + google.protobuf.Timestamp creation_time = 2; + // Size of the snapshot in bytes + int64 size = 3; + // SHA256 digest of the snapshot file + optional string checksum = 4; } message CreateSnapshotResponse { SnapshotDescription snapshot_description = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; } message ListSnapshotsResponse { repeated SnapshotDescription snapshot_descriptions = 1; - double time = 2; // Time spent to process + // Time spent to process + double time = 2; } message DeleteSnapshotResponse { - double time = 1; // Time spent to process + // Time spent to process + double time = 1; } diff --git a/packages/js-client-grpc/scripts/generate-grpc-sources.sh b/packages/js-client-grpc/scripts/generate-grpc-sources.sh index bd6bf46..d5852d5 100755 --- a/packages/js-client-grpc/scripts/generate-grpc-sources.sh +++ b/packages/js-client-grpc/scripts/generate-grpc-sources.sh @@ -26,6 +26,7 @@ rm $CLIENT_DIR/raft_service.proto rm $CLIENT_DIR/qdrant_internal_service.proto rm $CLIENT_DIR/health_check.proto rm $CLIENT_DIR/shard_snapshots_service.proto +rm $CLIENT_DIR/telemetry_internal.proto cat $CLIENT_DIR/qdrant.proto \ | grep -v 'collections_internal_service.proto' \ | grep -v 'points_internal_service.proto' \ @@ -33,6 +34,7 @@ cat $CLIENT_DIR/qdrant.proto \ | grep -v 'qdrant_internal_service.proto' \ | grep -v 'health_check.proto' \ | grep -v 'shard_snapshots_service.proto' \ + | grep -v 'telemetry_internal.proto' \ > $CLIENT_DIR/qdrant_tmp.proto mv $CLIENT_DIR/qdrant_tmp.proto $CLIENT_DIR/qdrant.proto diff --git a/packages/js-client-grpc/src/client-version.ts b/packages/js-client-grpc/src/client-version.ts index fd6c3fa..56aea71 100644 --- a/packages/js-client-grpc/src/client-version.ts +++ b/packages/js-client-grpc/src/client-version.ts @@ -1,4 +1,4 @@ -export const PACKAGE_VERSION = '1.16.2'; +export const PACKAGE_VERSION = '1.17.0'; interface Version { major: number; diff --git a/packages/js-client-grpc/src/proto/collections_pb.ts b/packages/js-client-grpc/src/proto/collections_pb.ts index 8474630..3c3ae21 100644 --- a/packages/js-client-grpc/src/proto/collections_pb.ts +++ b/packages/js-client-grpc/src/proto/collections_pb.ts @@ -6,15 +6,15 @@ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2" import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; import type { Value } from "./json_with_int_pb.js"; import { file_json_with_int } from "./json_with_int_pb.js"; -import type { Filter } from "./common_pb.js"; -import { file_common } from "./common_pb.js"; +import type { Filter } from "./qdrant_common_pb.js"; +import { file_qdrant_common } from "./qdrant_common_pb.js"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file collections.proto. */ export const file_collections: GenFile = /*@__PURE__*/ - fileDesc("ChFjb2xsZWN0aW9ucy5wcm90bxIGcWRyYW50IoMDCgxWZWN0b3JQYXJhbXMSDAoEc2l6ZRgBIAEoBBIiCghkaXN0YW5jZRgCIAEoDjIQLnFkcmFudC5EaXN0YW5jZRIwCgtobnN3X2NvbmZpZxgDIAEoCzIWLnFkcmFudC5IbnN3Q29uZmlnRGlmZkgAiAEBEjwKE3F1YW50aXphdGlvbl9jb25maWcYBCABKAsyGi5xZHJhbnQuUXVhbnRpemF0aW9uQ29uZmlnSAGIAQESFAoHb25fZGlzaxgFIAEoCEgCiAEBEicKCGRhdGF0eXBlGAYgASgOMhAucWRyYW50LkRhdGF0eXBlSAOIAQESOgoSbXVsdGl2ZWN0b3JfY29uZmlnGAcgASgLMhkucWRyYW50Lk11bHRpVmVjdG9yQ29uZmlnSASIAQFCDgoMX2huc3dfY29uZmlnQhYKFF9xdWFudGl6YXRpb25fY29uZmlnQgoKCF9vbl9kaXNrQgsKCV9kYXRhdHlwZUIVChNfbXVsdGl2ZWN0b3JfY29uZmlnItABChBWZWN0b3JQYXJhbXNEaWZmEjAKC2huc3dfY29uZmlnGAEgASgLMhYucWRyYW50Lkhuc3dDb25maWdEaWZmSACIAQESQAoTcXVhbnRpemF0aW9uX2NvbmZpZxgCIAEoCzIeLnFkcmFudC5RdWFudGl6YXRpb25Db25maWdEaWZmSAGIAQESFAoHb25fZGlzaxgDIAEoCEgCiAEBQg4KDF9obnN3X2NvbmZpZ0IWChRfcXVhbnRpemF0aW9uX2NvbmZpZ0IKCghfb25fZGlzayKCAQoPVmVjdG9yUGFyYW1zTWFwEi0KA21hcBgBIAMoCzIgLnFkcmFudC5WZWN0b3JQYXJhbXNNYXAuTWFwRW50cnkaQAoITWFwRW50cnkSCwoDa2V5GAEgASgJEiMKBXZhbHVlGAIgASgLMhQucWRyYW50LlZlY3RvclBhcmFtczoCOAEijgEKE1ZlY3RvclBhcmFtc0RpZmZNYXASMQoDbWFwGAEgAygLMiQucWRyYW50LlZlY3RvclBhcmFtc0RpZmZNYXAuTWFwRW50cnkaRAoITWFwRW50cnkSCwoDa2V5GAEgASgJEicKBXZhbHVlGAIgASgLMhgucWRyYW50LlZlY3RvclBhcmFtc0RpZmY6AjgBInAKDVZlY3RvcnNDb25maWcSJgoGcGFyYW1zGAEgASgLMhQucWRyYW50LlZlY3RvclBhcmFtc0gAEi0KCnBhcmFtc19tYXAYAiABKAsyFy5xZHJhbnQuVmVjdG9yUGFyYW1zTWFwSABCCAoGY29uZmlnInwKEVZlY3RvcnNDb25maWdEaWZmEioKBnBhcmFtcxgBIAEoCzIYLnFkcmFudC5WZWN0b3JQYXJhbXNEaWZmSAASMQoKcGFyYW1zX21hcBgCIAEoCzIbLnFkcmFudC5WZWN0b3JQYXJhbXNEaWZmTWFwSABCCAoGY29uZmlnIoMBChJTcGFyc2VWZWN0b3JQYXJhbXMSLQoFaW5kZXgYASABKAsyGS5xZHJhbnQuU3BhcnNlSW5kZXhDb25maWdIAIgBARInCghtb2RpZmllchgCIAEoDjIQLnFkcmFudC5Nb2RpZmllckgBiAEBQggKBl9pbmRleEILCglfbW9kaWZpZXIijgEKElNwYXJzZVZlY3RvckNvbmZpZxIwCgNtYXAYASADKAsyIy5xZHJhbnQuU3BhcnNlVmVjdG9yQ29uZmlnLk1hcEVudHJ5GkYKCE1hcEVudHJ5EgsKA2tleRgBIAEoCRIpCgV2YWx1ZRgCIAEoCzIaLnFkcmFudC5TcGFyc2VWZWN0b3JQYXJhbXM6AjgBIkYKEU11bHRpVmVjdG9yQ29uZmlnEjEKCmNvbXBhcmF0b3IYASABKA4yHS5xZHJhbnQuTXVsdGlWZWN0b3JDb21wYXJhdG9yIjMKGEdldENvbGxlY3Rpb25JbmZvUmVxdWVzdBIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkiMgoXQ29sbGVjdGlvbkV4aXN0c1JlcXVlc3QSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJIiIKEENvbGxlY3Rpb25FeGlzdHMSDgoGZXhpc3RzGAEgASgIIlIKGENvbGxlY3Rpb25FeGlzdHNSZXNwb25zZRIoCgZyZXN1bHQYASABKAsyGC5xZHJhbnQuQ29sbGVjdGlvbkV4aXN0cxIMCgR0aW1lGAIgASgBIhgKFkxpc3RDb2xsZWN0aW9uc1JlcXVlc3QiJQoVQ29sbGVjdGlvbkRlc2NyaXB0aW9uEgwKBG5hbWUYASABKAkiUQoZR2V0Q29sbGVjdGlvbkluZm9SZXNwb25zZRImCgZyZXN1bHQYASABKAsyFi5xZHJhbnQuQ29sbGVjdGlvbkluZm8SDAoEdGltZRgCIAEoASJbChdMaXN0Q29sbGVjdGlvbnNSZXNwb25zZRIyCgtjb2xsZWN0aW9ucxgBIAMoCzIdLnFkcmFudC5Db2xsZWN0aW9uRGVzY3JpcHRpb24SDAoEdGltZRgCIAEoASKEAQoWTWF4T3B0aW1pemF0aW9uVGhyZWFkcxIPCgV2YWx1ZRgBIAEoBEgAEjkKB3NldHRpbmcYAiABKA4yJi5xZHJhbnQuTWF4T3B0aW1pemF0aW9uVGhyZWFkcy5TZXR0aW5nSAAiEwoHU2V0dGluZxIICgRBdXRvEABCCQoHdmFyaWFudCIsCg9PcHRpbWl6ZXJTdGF0dXMSCgoCb2sYASABKAgSDQoFZXJyb3IYAiABKAkiJAoRQ29sbGVjdGlvbldhcm5pbmcSDwoHbWVzc2FnZRgBIAEoCSLAAgoOSG5zd0NvbmZpZ0RpZmYSDgoBbRgBIAEoBEgAiAEBEhkKDGVmX2NvbnN0cnVjdBgCIAEoBEgBiAEBEiAKE2Z1bGxfc2Nhbl90aHJlc2hvbGQYAyABKARIAogBARIhChRtYXhfaW5kZXhpbmdfdGhyZWFkcxgEIAEoBEgDiAEBEhQKB29uX2Rpc2sYBSABKAhIBIgBARIWCglwYXlsb2FkX20YBiABKARIBYgBARIbCg5pbmxpbmVfc3RvcmFnZRgHIAEoCEgGiAEBQgQKAl9tQg8KDV9lZl9jb25zdHJ1Y3RCFgoUX2Z1bGxfc2Nhbl90aHJlc2hvbGRCFwoVX21heF9pbmRleGluZ190aHJlYWRzQgoKCF9vbl9kaXNrQgwKCl9wYXlsb2FkX21CEQoPX2lubGluZV9zdG9yYWdlIqUBChFTcGFyc2VJbmRleENvbmZpZxIgChNmdWxsX3NjYW5fdGhyZXNob2xkGAEgASgESACIAQESFAoHb25fZGlzaxgCIAEoCEgBiAEBEicKCGRhdGF0eXBlGAMgASgOMhAucWRyYW50LkRhdGF0eXBlSAKIAQFCFgoUX2Z1bGxfc2Nhbl90aHJlc2hvbGRCCgoIX29uX2Rpc2tCCwoJX2RhdGF0eXBlIq8BCg1XYWxDb25maWdEaWZmEhwKD3dhbF9jYXBhY2l0eV9tYhgBIAEoBEgAiAEBEh8KEndhbF9zZWdtZW50c19haGVhZBgCIAEoBEgBiAEBEh4KEXdhbF9yZXRhaW5fY2xvc2VkGAMgASgESAKIAQFCEgoQX3dhbF9jYXBhY2l0eV9tYkIVChNfd2FsX3NlZ21lbnRzX2FoZWFkQhQKEl93YWxfcmV0YWluX2Nsb3NlZCLmBAoUT3B0aW1pemVyc0NvbmZpZ0RpZmYSHgoRZGVsZXRlZF90aHJlc2hvbGQYASABKAFIAIgBARIlChh2YWN1dW1fbWluX3ZlY3Rvcl9udW1iZXIYAiABKARIAYgBARIjChZkZWZhdWx0X3NlZ21lbnRfbnVtYmVyGAMgASgESAKIAQESHQoQbWF4X3NlZ21lbnRfc2l6ZRgEIAEoBEgDiAEBEh0KEG1lbW1hcF90aHJlc2hvbGQYBSABKARIBIgBARIfChJpbmRleGluZ190aHJlc2hvbGQYBiABKARIBYgBARIfChJmbHVzaF9pbnRlcnZhbF9zZWMYByABKARIBogBARIwCiNkZXByZWNhdGVkX21heF9vcHRpbWl6YXRpb25fdGhyZWFkcxgIIAEoBEgHiAEBEkUKGG1heF9vcHRpbWl6YXRpb25fdGhyZWFkcxgJIAEoCzIeLnFkcmFudC5NYXhPcHRpbWl6YXRpb25UaHJlYWRzSAiIAQFCFAoSX2RlbGV0ZWRfdGhyZXNob2xkQhsKGV92YWN1dW1fbWluX3ZlY3Rvcl9udW1iZXJCGQoXX2RlZmF1bHRfc2VnbWVudF9udW1iZXJCEwoRX21heF9zZWdtZW50X3NpemVCEwoRX21lbW1hcF90aHJlc2hvbGRCFQoTX2luZGV4aW5nX3RocmVzaG9sZEIVChNfZmx1c2hfaW50ZXJ2YWxfc2VjQiYKJF9kZXByZWNhdGVkX21heF9vcHRpbWl6YXRpb25fdGhyZWFkc0IbChlfbWF4X29wdGltaXphdGlvbl90aHJlYWRzIogBChJTY2FsYXJRdWFudGl6YXRpb24SJgoEdHlwZRgBIAEoDjIYLnFkcmFudC5RdWFudGl6YXRpb25UeXBlEhUKCHF1YW50aWxlGAIgASgCSACIAQESFwoKYWx3YXlzX3JhbRgDIAEoCEgBiAEBQgsKCV9xdWFudGlsZUINCgtfYWx3YXlzX3JhbSJsChNQcm9kdWN0UXVhbnRpemF0aW9uEi0KC2NvbXByZXNzaW9uGAEgASgOMhgucWRyYW50LkNvbXByZXNzaW9uUmF0aW8SFwoKYWx3YXlzX3JhbRgCIAEoCEgAiAEBQg0KC19hbHdheXNfcmFtIrYBCh9CaW5hcnlRdWFudGl6YXRpb25RdWVyeUVuY29kaW5nEkIKB3NldHRpbmcYBCABKA4yLy5xZHJhbnQuQmluYXJ5UXVhbnRpemF0aW9uUXVlcnlFbmNvZGluZy5TZXR0aW5nSAAiRAoHU2V0dGluZxILCgdEZWZhdWx0EAASCgoGQmluYXJ5EAESDwoLU2NhbGFyNEJpdHMQAhIPCgtTY2FsYXI4Qml0cxADQgkKB3ZhcmlhbnQi3QEKEkJpbmFyeVF1YW50aXphdGlvbhIXCgphbHdheXNfcmFtGAEgASgISACIAQESOQoIZW5jb2RpbmcYAiABKA4yIi5xZHJhbnQuQmluYXJ5UXVhbnRpemF0aW9uRW5jb2RpbmdIAYgBARJECg5xdWVyeV9lbmNvZGluZxgDIAEoCzInLnFkcmFudC5CaW5hcnlRdWFudGl6YXRpb25RdWVyeUVuY29kaW5nSAKIAQFCDQoLX2Fsd2F5c19yYW1CCwoJX2VuY29kaW5nQhEKD19xdWVyeV9lbmNvZGluZyKwAQoSUXVhbnRpemF0aW9uQ29uZmlnEiwKBnNjYWxhchgBIAEoCzIaLnFkcmFudC5TY2FsYXJRdWFudGl6YXRpb25IABIuCgdwcm9kdWN0GAIgASgLMhsucWRyYW50LlByb2R1Y3RRdWFudGl6YXRpb25IABIsCgZiaW5hcnkYAyABKAsyGi5xZHJhbnQuQmluYXJ5UXVhbnRpemF0aW9uSABCDgoMcXVhbnRpemF0aW9uIgoKCERpc2FibGVkItoBChZRdWFudGl6YXRpb25Db25maWdEaWZmEiwKBnNjYWxhchgBIAEoCzIaLnFkcmFudC5TY2FsYXJRdWFudGl6YXRpb25IABIuCgdwcm9kdWN0GAIgASgLMhsucWRyYW50LlByb2R1Y3RRdWFudGl6YXRpb25IABIkCghkaXNhYmxlZBgDIAEoCzIQLnFkcmFudC5EaXNhYmxlZEgAEiwKBmJpbmFyeRgEIAEoCzIaLnFkcmFudC5CaW5hcnlRdWFudGl6YXRpb25IAEIOCgxxdWFudGl6YXRpb24iuQkKEFN0cmljdE1vZGVDb25maWcSFAoHZW5hYmxlZBgBIAEoCEgAiAEBEhwKD21heF9xdWVyeV9saW1pdBgCIAEoDUgBiAEBEhgKC21heF90aW1lb3V0GAMgASgNSAKIAQESKQocdW5pbmRleGVkX2ZpbHRlcmluZ19yZXRyaWV2ZRgEIAEoCEgDiAEBEicKGnVuaW5kZXhlZF9maWx0ZXJpbmdfdXBkYXRlGAUgASgISASIAQESHwoSc2VhcmNoX21heF9obnN3X2VmGAYgASgNSAWIAQESHwoSc2VhcmNoX2FsbG93X2V4YWN0GAcgASgISAaIAQESJAoXc2VhcmNoX21heF9vdmVyc2FtcGxpbmcYCCABKAJIB4gBARIhChR1cHNlcnRfbWF4X2JhdGNoc2l6ZRgJIAEoBEgIiAEBEi0KIG1heF9jb2xsZWN0aW9uX3ZlY3Rvcl9zaXplX2J5dGVzGAogASgESAmIAQESHAoPcmVhZF9yYXRlX2xpbWl0GAsgASgNSAqIAQESHQoQd3JpdGVfcmF0ZV9saW1pdBgMIAEoDUgLiAEBEi4KIW1heF9jb2xsZWN0aW9uX3BheWxvYWRfc2l6ZV9ieXRlcxgNIAEoBEgMiAEBEiIKFWZpbHRlcl9tYXhfY29uZGl0aW9ucxgOIAEoBEgNiAEBEh8KEmNvbmRpdGlvbl9tYXhfc2l6ZRgPIAEoBEgOiAEBEkQKEm11bHRpdmVjdG9yX2NvbmZpZxgQIAEoCzIjLnFkcmFudC5TdHJpY3RNb2RlTXVsdGl2ZWN0b3JDb25maWdID4gBARI6Cg1zcGFyc2VfY29uZmlnGBEgASgLMh4ucWRyYW50LlN0cmljdE1vZGVTcGFyc2VDb25maWdIEIgBARIdChBtYXhfcG9pbnRzX2NvdW50GBIgASgESBGIAQESJAoXbWF4X3BheWxvYWRfaW5kZXhfY291bnQYEyABKARIEogBAUIKCghfZW5hYmxlZEISChBfbWF4X3F1ZXJ5X2xpbWl0Qg4KDF9tYXhfdGltZW91dEIfCh1fdW5pbmRleGVkX2ZpbHRlcmluZ19yZXRyaWV2ZUIdChtfdW5pbmRleGVkX2ZpbHRlcmluZ191cGRhdGVCFQoTX3NlYXJjaF9tYXhfaG5zd19lZkIVChNfc2VhcmNoX2FsbG93X2V4YWN0QhoKGF9zZWFyY2hfbWF4X292ZXJzYW1wbGluZ0IXChVfdXBzZXJ0X21heF9iYXRjaHNpemVCIwohX21heF9jb2xsZWN0aW9uX3ZlY3Rvcl9zaXplX2J5dGVzQhIKEF9yZWFkX3JhdGVfbGltaXRCEwoRX3dyaXRlX3JhdGVfbGltaXRCJAoiX21heF9jb2xsZWN0aW9uX3BheWxvYWRfc2l6ZV9ieXRlc0IYChZfZmlsdGVyX21heF9jb25kaXRpb25zQhUKE19jb25kaXRpb25fbWF4X3NpemVCFQoTX211bHRpdmVjdG9yX2NvbmZpZ0IQCg5fc3BhcnNlX2NvbmZpZ0ITChFfbWF4X3BvaW50c19jb3VudEIaChhfbWF4X3BheWxvYWRfaW5kZXhfY291bnQisAEKFlN0cmljdE1vZGVTcGFyc2VDb25maWcSRwoNc3BhcnNlX2NvbmZpZxgBIAMoCzIwLnFkcmFudC5TdHJpY3RNb2RlU3BhcnNlQ29uZmlnLlNwYXJzZUNvbmZpZ0VudHJ5Gk0KEVNwYXJzZUNvbmZpZ0VudHJ5EgsKA2tleRgBIAEoCRInCgV2YWx1ZRgCIAEoCzIYLnFkcmFudC5TdHJpY3RNb2RlU3BhcnNlOgI4ASI6ChBTdHJpY3RNb2RlU3BhcnNlEhcKCm1heF9sZW5ndGgYCiABKARIAIgBAUINCgtfbWF4X2xlbmd0aCLOAQobU3RyaWN0TW9kZU11bHRpdmVjdG9yQ29uZmlnElYKEm11bHRpdmVjdG9yX2NvbmZpZxgBIAMoCzI6LnFkcmFudC5TdHJpY3RNb2RlTXVsdGl2ZWN0b3JDb25maWcuTXVsdGl2ZWN0b3JDb25maWdFbnRyeRpXChZNdWx0aXZlY3RvckNvbmZpZ0VudHJ5EgsKA2tleRgBIAEoCRIsCgV2YWx1ZRgCIAEoCzIdLnFkcmFudC5TdHJpY3RNb2RlTXVsdGl2ZWN0b3I6AjgBIkEKFVN0cmljdE1vZGVNdWx0aXZlY3RvchIYCgttYXhfdmVjdG9ycxgBIAEoBEgAiAEBQg4KDF9tYXhfdmVjdG9ycyKbCAoQQ3JlYXRlQ29sbGVjdGlvbhIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSMAoLaG5zd19jb25maWcYBCABKAsyFi5xZHJhbnQuSG5zd0NvbmZpZ0RpZmZIAIgBARIuCgp3YWxfY29uZmlnGAUgASgLMhUucWRyYW50LldhbENvbmZpZ0RpZmZIAYgBARI8ChFvcHRpbWl6ZXJzX2NvbmZpZxgGIAEoCzIcLnFkcmFudC5PcHRpbWl6ZXJzQ29uZmlnRGlmZkgCiAEBEhkKDHNoYXJkX251bWJlchgHIAEoDUgDiAEBEhwKD29uX2Rpc2tfcGF5bG9hZBgIIAEoCEgEiAEBEhQKB3RpbWVvdXQYCSABKARIBYgBARIyCg52ZWN0b3JzX2NvbmZpZxgKIAEoCzIVLnFkcmFudC5WZWN0b3JzQ29uZmlnSAaIAQESHwoScmVwbGljYXRpb25fZmFjdG9yGAsgASgNSAeIAQESJQoYd3JpdGVfY29uc2lzdGVuY3lfZmFjdG9yGAwgASgNSAiIAQESPAoTcXVhbnRpemF0aW9uX2NvbmZpZxgOIAEoCzIaLnFkcmFudC5RdWFudGl6YXRpb25Db25maWdICYgBARI0Cg9zaGFyZGluZ19tZXRob2QYDyABKA4yFi5xZHJhbnQuU2hhcmRpbmdNZXRob2RICogBARI+ChVzcGFyc2VfdmVjdG9yc19jb25maWcYECABKAsyGi5xZHJhbnQuU3BhcnNlVmVjdG9yQ29uZmlnSAuIAQESOQoSc3RyaWN0X21vZGVfY29uZmlnGBEgASgLMhgucWRyYW50LlN0cmljdE1vZGVDb25maWdIDIgBARI4CghtZXRhZGF0YRgSIAMoCzImLnFkcmFudC5DcmVhdGVDb2xsZWN0aW9uLk1ldGFkYXRhRW50cnkaPgoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQg4KDF9obnN3X2NvbmZpZ0INCgtfd2FsX2NvbmZpZ0IUChJfb3B0aW1pemVyc19jb25maWdCDwoNX3NoYXJkX251bWJlckISChBfb25fZGlza19wYXlsb2FkQgoKCF90aW1lb3V0QhEKD192ZWN0b3JzX2NvbmZpZ0IVChNfcmVwbGljYXRpb25fZmFjdG9yQhsKGV93cml0ZV9jb25zaXN0ZW5jeV9mYWN0b3JCFgoUX3F1YW50aXphdGlvbl9jb25maWdCEgoQX3NoYXJkaW5nX21ldGhvZEIYChZfc3BhcnNlX3ZlY3RvcnNfY29uZmlnQhUKE19zdHJpY3RfbW9kZV9jb25maWdKBAgCEANKBAgDEARKBAgNEA4i7AUKEFVwZGF0ZUNvbGxlY3Rpb24SFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEjwKEW9wdGltaXplcnNfY29uZmlnGAIgASgLMhwucWRyYW50Lk9wdGltaXplcnNDb25maWdEaWZmSACIAQESFAoHdGltZW91dBgDIAEoBEgBiAEBEjEKBnBhcmFtcxgEIAEoCzIcLnFkcmFudC5Db2xsZWN0aW9uUGFyYW1zRGlmZkgCiAEBEjAKC2huc3dfY29uZmlnGAUgASgLMhYucWRyYW50Lkhuc3dDb25maWdEaWZmSAOIAQESNgoOdmVjdG9yc19jb25maWcYBiABKAsyGS5xZHJhbnQuVmVjdG9yc0NvbmZpZ0RpZmZIBIgBARJAChNxdWFudGl6YXRpb25fY29uZmlnGAcgASgLMh4ucWRyYW50LlF1YW50aXphdGlvbkNvbmZpZ0RpZmZIBYgBARI+ChVzcGFyc2VfdmVjdG9yc19jb25maWcYCCABKAsyGi5xZHJhbnQuU3BhcnNlVmVjdG9yQ29uZmlnSAaIAQESOQoSc3RyaWN0X21vZGVfY29uZmlnGAkgASgLMhgucWRyYW50LlN0cmljdE1vZGVDb25maWdIB4gBARI4CghtZXRhZGF0YRgKIAMoCzImLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uLk1ldGFkYXRhRW50cnkaPgoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQhQKEl9vcHRpbWl6ZXJzX2NvbmZpZ0IKCghfdGltZW91dEIJCgdfcGFyYW1zQg4KDF9obnN3X2NvbmZpZ0IRCg9fdmVjdG9yc19jb25maWdCFgoUX3F1YW50aXphdGlvbl9jb25maWdCGAoWX3NwYXJzZV92ZWN0b3JzX2NvbmZpZ0IVChNfc3RyaWN0X21vZGVfY29uZmlnIk0KEERlbGV0ZUNvbGxlY3Rpb24SFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhQKB3RpbWVvdXQYAiABKARIAIgBAUIKCghfdGltZW91dCI7ChtDb2xsZWN0aW9uT3BlcmF0aW9uUmVzcG9uc2USDgoGcmVzdWx0GAEgASgIEgwKBHRpbWUYAiABKAEi7gMKEENvbGxlY3Rpb25QYXJhbXMSFAoMc2hhcmRfbnVtYmVyGAMgASgNEhcKD29uX2Rpc2tfcGF5bG9hZBgEIAEoCBIyCg52ZWN0b3JzX2NvbmZpZxgFIAEoCzIVLnFkcmFudC5WZWN0b3JzQ29uZmlnSACIAQESHwoScmVwbGljYXRpb25fZmFjdG9yGAYgASgNSAGIAQESJQoYd3JpdGVfY29uc2lzdGVuY3lfZmFjdG9yGAcgASgNSAKIAQESIAoTcmVhZF9mYW5fb3V0X2ZhY3RvchgIIAEoDUgDiAEBEjQKD3NoYXJkaW5nX21ldGhvZBgJIAEoDjIWLnFkcmFudC5TaGFyZGluZ01ldGhvZEgEiAEBEj4KFXNwYXJzZV92ZWN0b3JzX2NvbmZpZxgKIAEoCzIaLnFkcmFudC5TcGFyc2VWZWN0b3JDb25maWdIBYgBAUIRCg9fdmVjdG9yc19jb25maWdCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvckIbChlfd3JpdGVfY29uc2lzdGVuY3lfZmFjdG9yQhYKFF9yZWFkX2Zhbl9vdXRfZmFjdG9yQhIKEF9zaGFyZGluZ19tZXRob2RCGAoWX3NwYXJzZV92ZWN0b3JzX2NvbmZpZ0oECAEQAkoECAIQAyL+AQoUQ29sbGVjdGlvblBhcmFtc0RpZmYSHwoScmVwbGljYXRpb25fZmFjdG9yGAEgASgNSACIAQESJQoYd3JpdGVfY29uc2lzdGVuY3lfZmFjdG9yGAIgASgNSAGIAQESHAoPb25fZGlza19wYXlsb2FkGAMgASgISAKIAQESIAoTcmVhZF9mYW5fb3V0X2ZhY3RvchgEIAEoDUgDiAEBQhUKE19yZXBsaWNhdGlvbl9mYWN0b3JCGwoZX3dyaXRlX2NvbnNpc3RlbmN5X2ZhY3RvckISChBfb25fZGlza19wYXlsb2FkQhYKFF9yZWFkX2Zhbl9vdXRfZmFjdG9yIu4DChBDb2xsZWN0aW9uQ29uZmlnEigKBnBhcmFtcxgBIAEoCzIYLnFkcmFudC5Db2xsZWN0aW9uUGFyYW1zEisKC2huc3dfY29uZmlnGAIgASgLMhYucWRyYW50Lkhuc3dDb25maWdEaWZmEjYKEG9wdGltaXplcl9jb25maWcYAyABKAsyHC5xZHJhbnQuT3B0aW1pemVyc0NvbmZpZ0RpZmYSKQoKd2FsX2NvbmZpZxgEIAEoCzIVLnFkcmFudC5XYWxDb25maWdEaWZmEjwKE3F1YW50aXphdGlvbl9jb25maWcYBSABKAsyGi5xZHJhbnQuUXVhbnRpemF0aW9uQ29uZmlnSACIAQESOQoSc3RyaWN0X21vZGVfY29uZmlnGAYgASgLMhgucWRyYW50LlN0cmljdE1vZGVDb25maWdIAYgBARI4CghtZXRhZGF0YRgHIAMoCzImLnFkcmFudC5Db2xsZWN0aW9uQ29uZmlnLk1ldGFkYXRhRW50cnkaPgoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQhYKFF9xdWFudGl6YXRpb25fY29uZmlnQhUKE19zdHJpY3RfbW9kZV9jb25maWciXAoSS2V5d29yZEluZGV4UGFyYW1zEhYKCWlzX3RlbmFudBgBIAEoCEgAiAEBEhQKB29uX2Rpc2sYAiABKAhIAYgBAUIMCgpfaXNfdGVuYW50QgoKCF9vbl9kaXNrIqABChJJbnRlZ2VySW5kZXhQYXJhbXMSEwoGbG9va3VwGAEgASgISACIAQESEgoFcmFuZ2UYAiABKAhIAYgBARIZCgxpc19wcmluY2lwYWwYAyABKAhIAogBARIUCgdvbl9kaXNrGAQgASgISAOIAQFCCQoHX2xvb2t1cEIICgZfcmFuZ2VCDwoNX2lzX3ByaW5jaXBhbEIKCghfb25fZGlzayJgChBGbG9hdEluZGV4UGFyYW1zEhQKB29uX2Rpc2sYASABKAhIAIgBARIZCgxpc19wcmluY2lwYWwYAiABKAhIAYgBAUIKCghfb25fZGlza0IPCg1faXNfcHJpbmNpcGFsIjIKDkdlb0luZGV4UGFyYW1zEhQKB29uX2Rpc2sYASABKAhIAIgBAUIKCghfb25fZGlzayIxCgxTdG9wd29yZHNTZXQSEQoJbGFuZ3VhZ2VzGAEgAygJEg4KBmN1c3RvbRgCIAMoCSK4AwoPVGV4dEluZGV4UGFyYW1zEigKCXRva2VuaXplchgBIAEoDjIVLnFkcmFudC5Ub2tlbml6ZXJUeXBlEhYKCWxvd2VyY2FzZRgCIAEoCEgAiAEBEhoKDW1pbl90b2tlbl9sZW4YAyABKARIAYgBARIaCg1tYXhfdG9rZW5fbGVuGAQgASgESAKIAQESFAoHb25fZGlzaxgFIAEoCEgDiAEBEiwKCXN0b3B3b3JkcxgGIAEoCzIULnFkcmFudC5TdG9wd29yZHNTZXRIBIgBARIcCg9waHJhc2VfbWF0Y2hpbmcYByABKAhIBYgBARIvCgdzdGVtbWVyGAggASgLMhkucWRyYW50LlN0ZW1taW5nQWxnb3JpdGhtSAaIAQESGgoNYXNjaWlfZm9sZGluZxgJIAEoCEgHiAEBQgwKCl9sb3dlcmNhc2VCEAoOX21pbl90b2tlbl9sZW5CEAoOX21heF90b2tlbl9sZW5CCgoIX29uX2Rpc2tCDAoKX3N0b3B3b3Jkc0ISChBfcGhyYXNlX21hdGNoaW5nQgoKCF9zdGVtbWVyQhAKDl9hc2NpaV9mb2xkaW5nIlIKEVN0ZW1taW5nQWxnb3JpdGhtEioKCHNub3diYWxsGAEgASgLMhYucWRyYW50LlNub3diYWxsUGFyYW1zSABCEQoPc3RlbW1pbmdfcGFyYW1zIiIKDlNub3diYWxsUGFyYW1zEhAKCGxhbmd1YWdlGAEgASgJIjMKD0Jvb2xJbmRleFBhcmFtcxIUCgdvbl9kaXNrGAEgASgISACIAQFCCgoIX29uX2Rpc2siYwoTRGF0ZXRpbWVJbmRleFBhcmFtcxIUCgdvbl9kaXNrGAEgASgISACIAQESGQoMaXNfcHJpbmNpcGFsGAIgASgISAGIAQFCCgoIX29uX2Rpc2tCDwoNX2lzX3ByaW5jaXBhbCJZCg9VdWlkSW5kZXhQYXJhbXMSFgoJaXNfdGVuYW50GAEgASgISACIAQESFAoHb25fZGlzaxgCIAEoCEgBiAEBQgwKCl9pc190ZW5hbnRCCgoIX29uX2Rpc2si6AMKElBheWxvYWRJbmRleFBhcmFtcxI6ChRrZXl3b3JkX2luZGV4X3BhcmFtcxgDIAEoCzIaLnFkcmFudC5LZXl3b3JkSW5kZXhQYXJhbXNIABI6ChRpbnRlZ2VyX2luZGV4X3BhcmFtcxgCIAEoCzIaLnFkcmFudC5JbnRlZ2VySW5kZXhQYXJhbXNIABI2ChJmbG9hdF9pbmRleF9wYXJhbXMYBCABKAsyGC5xZHJhbnQuRmxvYXRJbmRleFBhcmFtc0gAEjIKEGdlb19pbmRleF9wYXJhbXMYBSABKAsyFi5xZHJhbnQuR2VvSW5kZXhQYXJhbXNIABI0ChF0ZXh0X2luZGV4X3BhcmFtcxgBIAEoCzIXLnFkcmFudC5UZXh0SW5kZXhQYXJhbXNIABI0ChFib29sX2luZGV4X3BhcmFtcxgGIAEoCzIXLnFkcmFudC5Cb29sSW5kZXhQYXJhbXNIABI8ChVkYXRldGltZV9pbmRleF9wYXJhbXMYByABKAsyGy5xZHJhbnQuRGF0ZXRpbWVJbmRleFBhcmFtc0gAEjQKEXV1aWRfaW5kZXhfcGFyYW1zGAggASgLMhcucWRyYW50LlV1aWRJbmRleFBhcmFtc0gAQg4KDGluZGV4X3BhcmFtcyKdAQoRUGF5bG9hZFNjaGVtYUluZm8SLAoJZGF0YV90eXBlGAEgASgOMhkucWRyYW50LlBheWxvYWRTY2hlbWFUeXBlEi8KBnBhcmFtcxgCIAEoCzIaLnFkcmFudC5QYXlsb2FkSW5kZXhQYXJhbXNIAIgBARITCgZwb2ludHMYAyABKARIAYgBAUIJCgdfcGFyYW1zQgkKB19wb2ludHMi7AMKDkNvbGxlY3Rpb25JbmZvEigKBnN0YXR1cxgBIAEoDjIYLnFkcmFudC5Db2xsZWN0aW9uU3RhdHVzEjEKEG9wdGltaXplcl9zdGF0dXMYAiABKAsyFy5xZHJhbnQuT3B0aW1pemVyU3RhdHVzEhYKDnNlZ21lbnRzX2NvdW50GAQgASgEEigKBmNvbmZpZxgHIAEoCzIYLnFkcmFudC5Db2xsZWN0aW9uQ29uZmlnEkEKDnBheWxvYWRfc2NoZW1hGAggAygLMikucWRyYW50LkNvbGxlY3Rpb25JbmZvLlBheWxvYWRTY2hlbWFFbnRyeRIZCgxwb2ludHNfY291bnQYCSABKARIAIgBARIiChVpbmRleGVkX3ZlY3RvcnNfY291bnQYCiABKARIAYgBARIrCgh3YXJuaW5ncxgLIAMoCzIZLnFkcmFudC5Db2xsZWN0aW9uV2FybmluZxpPChJQYXlsb2FkU2NoZW1hRW50cnkSCwoDa2V5GAEgASgJEigKBXZhbHVlGAIgASgLMhkucWRyYW50LlBheWxvYWRTY2hlbWFJbmZvOgI4AUIPCg1fcG9pbnRzX2NvdW50QhgKFl9pbmRleGVkX3ZlY3RvcnNfY291bnRKBAgDEARKBAgFEAZKBAgGEAciWwoNQ2hhbmdlQWxpYXNlcxIoCgdhY3Rpb25zGAEgAygLMhcucWRyYW50LkFsaWFzT3BlcmF0aW9ucxIUCgd0aW1lb3V0GAIgASgESACIAQFCCgoIX3RpbWVvdXQiogEKD0FsaWFzT3BlcmF0aW9ucxIrCgxjcmVhdGVfYWxpYXMYASABKAsyEy5xZHJhbnQuQ3JlYXRlQWxpYXNIABIrCgxyZW5hbWVfYWxpYXMYAiABKAsyEy5xZHJhbnQuUmVuYW1lQWxpYXNIABIrCgxkZWxldGVfYWxpYXMYAyABKAsyEy5xZHJhbnQuRGVsZXRlQWxpYXNIAEIICgZhY3Rpb24iOgoLQ3JlYXRlQWxpYXMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhIKCmFsaWFzX25hbWUYAiABKAkiPQoLUmVuYW1lQWxpYXMSFgoOb2xkX2FsaWFzX25hbWUYASABKAkSFgoObmV3X2FsaWFzX25hbWUYAiABKAkiIQoLRGVsZXRlQWxpYXMSEgoKYWxpYXNfbmFtZRgBIAEoCSIUChJMaXN0QWxpYXNlc1JlcXVlc3QiNwocTGlzdENvbGxlY3Rpb25BbGlhc2VzUmVxdWVzdBIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkiPwoQQWxpYXNEZXNjcmlwdGlvbhISCgphbGlhc19uYW1lGAEgASgJEhcKD2NvbGxlY3Rpb25fbmFtZRgCIAEoCSJOChNMaXN0QWxpYXNlc1Jlc3BvbnNlEikKB2FsaWFzZXMYASADKAsyGC5xZHJhbnQuQWxpYXNEZXNjcmlwdGlvbhIMCgR0aW1lGAIgASgBIjcKHENvbGxlY3Rpb25DbHVzdGVySW5mb1JlcXVlc3QSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJIjYKCFNoYXJkS2V5EhEKB2tleXdvcmQYASABKAlIABIQCgZudW1iZXIYAiABKARIAEIFCgNrZXkilQEKDkxvY2FsU2hhcmRJbmZvEhAKCHNoYXJkX2lkGAEgASgNEhQKDHBvaW50c19jb3VudBgCIAEoBBIjCgVzdGF0ZRgDIAEoDjIULnFkcmFudC5SZXBsaWNhU3RhdGUSKAoJc2hhcmRfa2V5GAQgASgLMhAucWRyYW50LlNoYXJkS2V5SACIAQFCDAoKX3NoYXJkX2tleSKRAQoPUmVtb3RlU2hhcmRJbmZvEhAKCHNoYXJkX2lkGAEgASgNEg8KB3BlZXJfaWQYAiABKAQSIwoFc3RhdGUYAyABKA4yFC5xZHJhbnQuUmVwbGljYVN0YXRlEigKCXNoYXJkX2tleRgEIAEoCzIQLnFkcmFudC5TaGFyZEtleUgAiAEBQgwKCl9zaGFyZF9rZXkidwoRU2hhcmRUcmFuc2ZlckluZm8SEAoIc2hhcmRfaWQYASABKA0SGAoLdG9fc2hhcmRfaWQYBSABKA1IAIgBARIMCgRmcm9tGAIgASgEEgoKAnRvGAMgASgEEgwKBHN5bmMYBCABKAhCDgoMX3RvX3NoYXJkX2lkIpsBCg5SZXNoYXJkaW5nSW5mbxIQCghzaGFyZF9pZBgBIAEoDRIPCgdwZWVyX2lkGAIgASgEEigKCXNoYXJkX2tleRgDIAEoCzIQLnFkcmFudC5TaGFyZEtleUgAiAEBEi4KCWRpcmVjdGlvbhgEIAEoDjIbLnFkcmFudC5SZXNoYXJkaW5nRGlyZWN0aW9uQgwKCl9zaGFyZF9rZXkijgIKHUNvbGxlY3Rpb25DbHVzdGVySW5mb1Jlc3BvbnNlEg8KB3BlZXJfaWQYASABKAQSEwoLc2hhcmRfY291bnQYAiABKAQSLAoMbG9jYWxfc2hhcmRzGAMgAygLMhYucWRyYW50LkxvY2FsU2hhcmRJbmZvEi4KDXJlbW90ZV9zaGFyZHMYBCADKAsyFy5xZHJhbnQuUmVtb3RlU2hhcmRJbmZvEjIKD3NoYXJkX3RyYW5zZmVycxgFIAMoCzIZLnFkcmFudC5TaGFyZFRyYW5zZmVySW5mbxI1ChVyZXNoYXJkaW5nX29wZXJhdGlvbnMYBiADKAsyFi5xZHJhbnQuUmVzaGFyZGluZ0luZm8irgEKCU1vdmVTaGFyZBIQCghzaGFyZF9pZBgBIAEoDRIYCgt0b19zaGFyZF9pZBgFIAEoDUgAiAEBEhQKDGZyb21fcGVlcl9pZBgCIAEoBBISCgp0b19wZWVyX2lkGAMgASgEEjAKBm1ldGhvZBgEIAEoDjIbLnFkcmFudC5TaGFyZFRyYW5zZmVyTWV0aG9kSAGIAQFCDgoMX3RvX3NoYXJkX2lkQgkKB19tZXRob2QiswEKDlJlcGxpY2F0ZVNoYXJkEhAKCHNoYXJkX2lkGAEgASgNEhgKC3RvX3NoYXJkX2lkGAUgASgNSACIAQESFAoMZnJvbV9wZWVyX2lkGAIgASgEEhIKCnRvX3BlZXJfaWQYAyABKAQSMAoGbWV0aG9kGAQgASgOMhsucWRyYW50LlNoYXJkVHJhbnNmZXJNZXRob2RIAYgBAUIOCgxfdG9fc2hhcmRfaWRCCQoHX21ldGhvZCJ6ChJBYm9ydFNoYXJkVHJhbnNmZXISEAoIc2hhcmRfaWQYASABKA0SGAoLdG9fc2hhcmRfaWQYBCABKA1IAIgBARIUCgxmcm9tX3BlZXJfaWQYAiABKAQSEgoKdG9fcGVlcl9pZBgDIAEoBEIOCgxfdG9fc2hhcmRfaWQipAEKD1Jlc3RhcnRUcmFuc2ZlchIQCghzaGFyZF9pZBgBIAEoDRIYCgt0b19zaGFyZF9pZBgFIAEoDUgAiAEBEhQKDGZyb21fcGVlcl9pZBgCIAEoBBISCgp0b19wZWVyX2lkGAMgASgEEisKBm1ldGhvZBgEIAEoDjIbLnFkcmFudC5TaGFyZFRyYW5zZmVyTWV0aG9kQg4KDF90b19zaGFyZF9pZCKTAQoPUmVwbGljYXRlUG9pbnRzEigKDmZyb21fc2hhcmRfa2V5GAEgASgLMhAucWRyYW50LlNoYXJkS2V5EiYKDHRvX3NoYXJkX2tleRgCIAEoCzIQLnFkcmFudC5TaGFyZEtleRIjCgZmaWx0ZXIYAyABKAsyDi5xZHJhbnQuRmlsdGVySACIAQFCCQoHX2ZpbHRlciIsCgdSZXBsaWNhEhAKCHNoYXJkX2lkGAEgASgNEg8KB3BlZXJfaWQYAiABKAQi8gEKDkNyZWF0ZVNoYXJkS2V5EiMKCXNoYXJkX2tleRgBIAEoCzIQLnFkcmFudC5TaGFyZEtleRIaCg1zaGFyZHNfbnVtYmVyGAIgASgNSACIAQESHwoScmVwbGljYXRpb25fZmFjdG9yGAMgASgNSAGIAQESEQoJcGxhY2VtZW50GAQgAygEEjAKDWluaXRpYWxfc3RhdGUYBSABKA4yFC5xZHJhbnQuUmVwbGljYVN0YXRlSAKIAQFCEAoOX3NoYXJkc19udW1iZXJCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvckIQCg5faW5pdGlhbF9zdGF0ZSI1Cg5EZWxldGVTaGFyZEtleRIjCglzaGFyZF9rZXkYASABKAsyEC5xZHJhbnQuU2hhcmRLZXki+gMKI1VwZGF0ZUNvbGxlY3Rpb25DbHVzdGVyU2V0dXBSZXF1ZXN0EhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRInCgptb3ZlX3NoYXJkGAIgASgLMhEucWRyYW50Lk1vdmVTaGFyZEgAEjEKD3JlcGxpY2F0ZV9zaGFyZBgDIAEoCzIWLnFkcmFudC5SZXBsaWNhdGVTaGFyZEgAEjQKDmFib3J0X3RyYW5zZmVyGAQgASgLMhoucWRyYW50LkFib3J0U2hhcmRUcmFuc2ZlckgAEicKDGRyb3BfcmVwbGljYRgFIAEoCzIPLnFkcmFudC5SZXBsaWNhSAASMgoQY3JlYXRlX3NoYXJkX2tleRgHIAEoCzIWLnFkcmFudC5DcmVhdGVTaGFyZEtleUgAEjIKEGRlbGV0ZV9zaGFyZF9rZXkYCCABKAsyFi5xZHJhbnQuRGVsZXRlU2hhcmRLZXlIABIzChByZXN0YXJ0X3RyYW5zZmVyGAkgASgLMhcucWRyYW50LlJlc3RhcnRUcmFuc2ZlckgAEjMKEHJlcGxpY2F0ZV9wb2ludHMYCiABKAsyFy5xZHJhbnQuUmVwbGljYXRlUG9pbnRzSAASFAoHdGltZW91dBgGIAEoBEgBiAEBQgsKCW9wZXJhdGlvbkIKCghfdGltZW91dCI2CiRVcGRhdGVDb2xsZWN0aW9uQ2x1c3RlclNldHVwUmVzcG9uc2USDgoGcmVzdWx0GAEgASgIInsKFUNyZWF0ZVNoYXJkS2V5UmVxdWVzdBIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSJwoHcmVxdWVzdBgCIAEoCzIWLnFkcmFudC5DcmVhdGVTaGFyZEtleRIUCgd0aW1lb3V0GAMgASgESACIAQFCCgoIX3RpbWVvdXQiewoVRGVsZXRlU2hhcmRLZXlSZXF1ZXN0EhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRInCgdyZXF1ZXN0GAIgASgLMhYucWRyYW50LkRlbGV0ZVNoYXJkS2V5EhQKB3RpbWVvdXQYAyABKARIAIgBAUIKCghfdGltZW91dCIoChZDcmVhdGVTaGFyZEtleVJlc3BvbnNlEg4KBnJlc3VsdBgBIAEoCCIoChZEZWxldGVTaGFyZEtleVJlc3BvbnNlEg4KBnJlc3VsdBgBIAEoCCo8CghEYXRhdHlwZRILCgdEZWZhdWx0EAASCwoHRmxvYXQzMhABEgkKBVVpbnQ4EAISCwoHRmxvYXQxNhADKh0KCE1vZGlmaWVyEggKBE5vbmUQABIHCgNJZGYQASojChVNdWx0aVZlY3RvckNvbXBhcmF0b3ISCgoGTWF4U2ltEAAqTwoIRGlzdGFuY2USEwoPVW5rbm93bkRpc3RhbmNlEAASCgoGQ29zaW5lEAESCgoGRXVjbGlkEAISBwoDRG90EAMSDQoJTWFuaGF0dGFuEAQqWQoQQ29sbGVjdGlvblN0YXR1cxIbChdVbmtub3duQ29sbGVjdGlvblN0YXR1cxAAEgkKBUdyZWVuEAESCgoGWWVsbG93EAISBwoDUmVkEAMSCAoER3JleRAEKn4KEVBheWxvYWRTY2hlbWFUeXBlEg8KC1Vua25vd25UeXBlEAASCwoHS2V5d29yZBABEgsKB0ludGVnZXIQAhIJCgVGbG9hdBADEgcKA0dlbxAEEggKBFRleHQQBRIICgRCb29sEAYSDAoIRGF0ZXRpbWUQBxIICgRVdWlkEAgqNQoQUXVhbnRpemF0aW9uVHlwZRIXChNVbmtub3duUXVhbnRpemF0aW9uEAASCAoESW50OBABKj0KEENvbXByZXNzaW9uUmF0aW8SBgoCeDQQABIGCgJ4OBABEgcKA3gxNhACEgcKA3gzMhADEgcKA3g2NBAEKkkKGkJpbmFyeVF1YW50aXphdGlvbkVuY29kaW5nEgoKBk9uZUJpdBAAEgsKB1R3b0JpdHMQARISCg5PbmVBbmRIYWxmQml0cxACKiYKDlNoYXJkaW5nTWV0aG9kEggKBEF1dG8QABIKCgZDdXN0b20QASpUCg1Ub2tlbml6ZXJUeXBlEgsKB1Vua25vd24QABIKCgZQcmVmaXgQARIOCgpXaGl0ZXNwYWNlEAISCAoEV29yZBADEhAKDE11bHRpbGluZ3VhbBAEKq0BCgxSZXBsaWNhU3RhdGUSCgoGQWN0aXZlEAASCAoERGVhZBABEgsKB1BhcnRpYWwQAhIQCgxJbml0aWFsaXppbmcQAxIMCghMaXN0ZW5lchAEEhMKD1BhcnRpYWxTbmFwc2hvdBAFEgwKCFJlY292ZXJ5EAYSDgoKUmVzaGFyZGluZxAHEhcKE1Jlc2hhcmRpbmdTY2FsZURvd24QCBIOCgpBY3RpdmVSZWFkEAkqJwoTUmVzaGFyZGluZ0RpcmVjdGlvbhIGCgJVcBAAEggKBERvd24QASphChNTaGFyZFRyYW5zZmVyTWV0aG9kEhEKDVN0cmVhbVJlY29yZHMQABIMCghTbmFwc2hvdBABEgwKCFdhbERlbHRhEAISGwoXUmVzaGFyZGluZ1N0cmVhbVJlY29yZHMQA0IVqgISUWRyYW50LkNsaWVudC5HcnBjYgZwcm90bzM", [file_json_with_int, file_common]); + fileDesc("ChFjb2xsZWN0aW9ucy5wcm90bxIGcWRyYW50IoMDCgxWZWN0b3JQYXJhbXMSDAoEc2l6ZRgBIAEoBBIiCghkaXN0YW5jZRgCIAEoDjIQLnFkcmFudC5EaXN0YW5jZRIwCgtobnN3X2NvbmZpZxgDIAEoCzIWLnFkcmFudC5IbnN3Q29uZmlnRGlmZkgAiAEBEjwKE3F1YW50aXphdGlvbl9jb25maWcYBCABKAsyGi5xZHJhbnQuUXVhbnRpemF0aW9uQ29uZmlnSAGIAQESFAoHb25fZGlzaxgFIAEoCEgCiAEBEicKCGRhdGF0eXBlGAYgASgOMhAucWRyYW50LkRhdGF0eXBlSAOIAQESOgoSbXVsdGl2ZWN0b3JfY29uZmlnGAcgASgLMhkucWRyYW50Lk11bHRpVmVjdG9yQ29uZmlnSASIAQFCDgoMX2huc3dfY29uZmlnQhYKFF9xdWFudGl6YXRpb25fY29uZmlnQgoKCF9vbl9kaXNrQgsKCV9kYXRhdHlwZUIVChNfbXVsdGl2ZWN0b3JfY29uZmlnItABChBWZWN0b3JQYXJhbXNEaWZmEjAKC2huc3dfY29uZmlnGAEgASgLMhYucWRyYW50Lkhuc3dDb25maWdEaWZmSACIAQESQAoTcXVhbnRpemF0aW9uX2NvbmZpZxgCIAEoCzIeLnFkcmFudC5RdWFudGl6YXRpb25Db25maWdEaWZmSAGIAQESFAoHb25fZGlzaxgDIAEoCEgCiAEBQg4KDF9obnN3X2NvbmZpZ0IWChRfcXVhbnRpemF0aW9uX2NvbmZpZ0IKCghfb25fZGlzayKCAQoPVmVjdG9yUGFyYW1zTWFwEi0KA21hcBgBIAMoCzIgLnFkcmFudC5WZWN0b3JQYXJhbXNNYXAuTWFwRW50cnkaQAoITWFwRW50cnkSCwoDa2V5GAEgASgJEiMKBXZhbHVlGAIgASgLMhQucWRyYW50LlZlY3RvclBhcmFtczoCOAEijgEKE1ZlY3RvclBhcmFtc0RpZmZNYXASMQoDbWFwGAEgAygLMiQucWRyYW50LlZlY3RvclBhcmFtc0RpZmZNYXAuTWFwRW50cnkaRAoITWFwRW50cnkSCwoDa2V5GAEgASgJEicKBXZhbHVlGAIgASgLMhgucWRyYW50LlZlY3RvclBhcmFtc0RpZmY6AjgBInAKDVZlY3RvcnNDb25maWcSJgoGcGFyYW1zGAEgASgLMhQucWRyYW50LlZlY3RvclBhcmFtc0gAEi0KCnBhcmFtc19tYXAYAiABKAsyFy5xZHJhbnQuVmVjdG9yUGFyYW1zTWFwSABCCAoGY29uZmlnInwKEVZlY3RvcnNDb25maWdEaWZmEioKBnBhcmFtcxgBIAEoCzIYLnFkcmFudC5WZWN0b3JQYXJhbXNEaWZmSAASMQoKcGFyYW1zX21hcBgCIAEoCzIbLnFkcmFudC5WZWN0b3JQYXJhbXNEaWZmTWFwSABCCAoGY29uZmlnIoMBChJTcGFyc2VWZWN0b3JQYXJhbXMSLQoFaW5kZXgYASABKAsyGS5xZHJhbnQuU3BhcnNlSW5kZXhDb25maWdIAIgBARInCghtb2RpZmllchgCIAEoDjIQLnFkcmFudC5Nb2RpZmllckgBiAEBQggKBl9pbmRleEILCglfbW9kaWZpZXIijgEKElNwYXJzZVZlY3RvckNvbmZpZxIwCgNtYXAYASADKAsyIy5xZHJhbnQuU3BhcnNlVmVjdG9yQ29uZmlnLk1hcEVudHJ5GkYKCE1hcEVudHJ5EgsKA2tleRgBIAEoCRIpCgV2YWx1ZRgCIAEoCzIaLnFkcmFudC5TcGFyc2VWZWN0b3JQYXJhbXM6AjgBIkYKEU11bHRpVmVjdG9yQ29uZmlnEjEKCmNvbXBhcmF0b3IYASABKA4yHS5xZHJhbnQuTXVsdGlWZWN0b3JDb21wYXJhdG9yIjMKGEdldENvbGxlY3Rpb25JbmZvUmVxdWVzdBIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkiMgoXQ29sbGVjdGlvbkV4aXN0c1JlcXVlc3QSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJIiIKEENvbGxlY3Rpb25FeGlzdHMSDgoGZXhpc3RzGAEgASgIIlIKGENvbGxlY3Rpb25FeGlzdHNSZXNwb25zZRIoCgZyZXN1bHQYASABKAsyGC5xZHJhbnQuQ29sbGVjdGlvbkV4aXN0cxIMCgR0aW1lGAIgASgBIhgKFkxpc3RDb2xsZWN0aW9uc1JlcXVlc3QiJQoVQ29sbGVjdGlvbkRlc2NyaXB0aW9uEgwKBG5hbWUYASABKAkiUQoZR2V0Q29sbGVjdGlvbkluZm9SZXNwb25zZRImCgZyZXN1bHQYASABKAsyFi5xZHJhbnQuQ29sbGVjdGlvbkluZm8SDAoEdGltZRgCIAEoASJbChdMaXN0Q29sbGVjdGlvbnNSZXNwb25zZRIyCgtjb2xsZWN0aW9ucxgBIAMoCzIdLnFkcmFudC5Db2xsZWN0aW9uRGVzY3JpcHRpb24SDAoEdGltZRgCIAEoASKEAQoWTWF4T3B0aW1pemF0aW9uVGhyZWFkcxIPCgV2YWx1ZRgBIAEoBEgAEjkKB3NldHRpbmcYAiABKA4yJi5xZHJhbnQuTWF4T3B0aW1pemF0aW9uVGhyZWFkcy5TZXR0aW5nSAAiEwoHU2V0dGluZxIICgRBdXRvEABCCQoHdmFyaWFudCIsCg9PcHRpbWl6ZXJTdGF0dXMSCgoCb2sYASABKAgSDQoFZXJyb3IYAiABKAkiJAoRQ29sbGVjdGlvbldhcm5pbmcSDwoHbWVzc2FnZRgBIAEoCSLAAgoOSG5zd0NvbmZpZ0RpZmYSDgoBbRgBIAEoBEgAiAEBEhkKDGVmX2NvbnN0cnVjdBgCIAEoBEgBiAEBEiAKE2Z1bGxfc2Nhbl90aHJlc2hvbGQYAyABKARIAogBARIhChRtYXhfaW5kZXhpbmdfdGhyZWFkcxgEIAEoBEgDiAEBEhQKB29uX2Rpc2sYBSABKAhIBIgBARIWCglwYXlsb2FkX20YBiABKARIBYgBARIbCg5pbmxpbmVfc3RvcmFnZRgHIAEoCEgGiAEBQgQKAl9tQg8KDV9lZl9jb25zdHJ1Y3RCFgoUX2Z1bGxfc2Nhbl90aHJlc2hvbGRCFwoVX21heF9pbmRleGluZ190aHJlYWRzQgoKCF9vbl9kaXNrQgwKCl9wYXlsb2FkX21CEQoPX2lubGluZV9zdG9yYWdlIqUBChFTcGFyc2VJbmRleENvbmZpZxIgChNmdWxsX3NjYW5fdGhyZXNob2xkGAEgASgESACIAQESFAoHb25fZGlzaxgCIAEoCEgBiAEBEicKCGRhdGF0eXBlGAMgASgOMhAucWRyYW50LkRhdGF0eXBlSAKIAQFCFgoUX2Z1bGxfc2Nhbl90aHJlc2hvbGRCCgoIX29uX2Rpc2tCCwoJX2RhdGF0eXBlIq8BCg1XYWxDb25maWdEaWZmEhwKD3dhbF9jYXBhY2l0eV9tYhgBIAEoBEgAiAEBEh8KEndhbF9zZWdtZW50c19haGVhZBgCIAEoBEgBiAEBEh4KEXdhbF9yZXRhaW5fY2xvc2VkGAMgASgESAKIAQFCEgoQX3dhbF9jYXBhY2l0eV9tYkIVChNfd2FsX3NlZ21lbnRzX2FoZWFkQhQKEl93YWxfcmV0YWluX2Nsb3NlZCKgBQoUT3B0aW1pemVyc0NvbmZpZ0RpZmYSHgoRZGVsZXRlZF90aHJlc2hvbGQYASABKAFIAIgBARIlChh2YWN1dW1fbWluX3ZlY3Rvcl9udW1iZXIYAiABKARIAYgBARIjChZkZWZhdWx0X3NlZ21lbnRfbnVtYmVyGAMgASgESAKIAQESHQoQbWF4X3NlZ21lbnRfc2l6ZRgEIAEoBEgDiAEBEh0KEG1lbW1hcF90aHJlc2hvbGQYBSABKARIBIgBARIfChJpbmRleGluZ190aHJlc2hvbGQYBiABKARIBYgBARIfChJmbHVzaF9pbnRlcnZhbF9zZWMYByABKARIBogBARIwCiNkZXByZWNhdGVkX21heF9vcHRpbWl6YXRpb25fdGhyZWFkcxgIIAEoBEgHiAEBEkUKGG1heF9vcHRpbWl6YXRpb25fdGhyZWFkcxgJIAEoCzIeLnFkcmFudC5NYXhPcHRpbWl6YXRpb25UaHJlYWRzSAiIAQESIAoTcHJldmVudF91bm9wdGltaXplZBgKIAEoCEgJiAEBQhQKEl9kZWxldGVkX3RocmVzaG9sZEIbChlfdmFjdXVtX21pbl92ZWN0b3JfbnVtYmVyQhkKF19kZWZhdWx0X3NlZ21lbnRfbnVtYmVyQhMKEV9tYXhfc2VnbWVudF9zaXplQhMKEV9tZW1tYXBfdGhyZXNob2xkQhUKE19pbmRleGluZ190aHJlc2hvbGRCFQoTX2ZsdXNoX2ludGVydmFsX3NlY0ImCiRfZGVwcmVjYXRlZF9tYXhfb3B0aW1pemF0aW9uX3RocmVhZHNCGwoZX21heF9vcHRpbWl6YXRpb25fdGhyZWFkc0IWChRfcHJldmVudF91bm9wdGltaXplZCKIAQoSU2NhbGFyUXVhbnRpemF0aW9uEiYKBHR5cGUYASABKA4yGC5xZHJhbnQuUXVhbnRpemF0aW9uVHlwZRIVCghxdWFudGlsZRgCIAEoAkgAiAEBEhcKCmFsd2F5c19yYW0YAyABKAhIAYgBAUILCglfcXVhbnRpbGVCDQoLX2Fsd2F5c19yYW0ibAoTUHJvZHVjdFF1YW50aXphdGlvbhItCgtjb21wcmVzc2lvbhgBIAEoDjIYLnFkcmFudC5Db21wcmVzc2lvblJhdGlvEhcKCmFsd2F5c19yYW0YAiABKAhIAIgBAUINCgtfYWx3YXlzX3JhbSK2AQofQmluYXJ5UXVhbnRpemF0aW9uUXVlcnlFbmNvZGluZxJCCgdzZXR0aW5nGAQgASgOMi8ucWRyYW50LkJpbmFyeVF1YW50aXphdGlvblF1ZXJ5RW5jb2RpbmcuU2V0dGluZ0gAIkQKB1NldHRpbmcSCwoHRGVmYXVsdBAAEgoKBkJpbmFyeRABEg8KC1NjYWxhcjRCaXRzEAISDwoLU2NhbGFyOEJpdHMQA0IJCgd2YXJpYW50It0BChJCaW5hcnlRdWFudGl6YXRpb24SFwoKYWx3YXlzX3JhbRgBIAEoCEgAiAEBEjkKCGVuY29kaW5nGAIgASgOMiIucWRyYW50LkJpbmFyeVF1YW50aXphdGlvbkVuY29kaW5nSAGIAQESRAoOcXVlcnlfZW5jb2RpbmcYAyABKAsyJy5xZHJhbnQuQmluYXJ5UXVhbnRpemF0aW9uUXVlcnlFbmNvZGluZ0gCiAEBQg0KC19hbHdheXNfcmFtQgsKCV9lbmNvZGluZ0IRCg9fcXVlcnlfZW5jb2RpbmcisAEKElF1YW50aXphdGlvbkNvbmZpZxIsCgZzY2FsYXIYASABKAsyGi5xZHJhbnQuU2NhbGFyUXVhbnRpemF0aW9uSAASLgoHcHJvZHVjdBgCIAEoCzIbLnFkcmFudC5Qcm9kdWN0UXVhbnRpemF0aW9uSAASLAoGYmluYXJ5GAMgASgLMhoucWRyYW50LkJpbmFyeVF1YW50aXphdGlvbkgAQg4KDHF1YW50aXphdGlvbiIKCghEaXNhYmxlZCLaAQoWUXVhbnRpemF0aW9uQ29uZmlnRGlmZhIsCgZzY2FsYXIYASABKAsyGi5xZHJhbnQuU2NhbGFyUXVhbnRpemF0aW9uSAASLgoHcHJvZHVjdBgCIAEoCzIbLnFkcmFudC5Qcm9kdWN0UXVhbnRpemF0aW9uSAASJAoIZGlzYWJsZWQYAyABKAsyEC5xZHJhbnQuRGlzYWJsZWRIABIsCgZiaW5hcnkYBCABKAsyGi5xZHJhbnQuQmluYXJ5UXVhbnRpemF0aW9uSABCDgoMcXVhbnRpemF0aW9uIrkJChBTdHJpY3RNb2RlQ29uZmlnEhQKB2VuYWJsZWQYASABKAhIAIgBARIcCg9tYXhfcXVlcnlfbGltaXQYAiABKA1IAYgBARIYCgttYXhfdGltZW91dBgDIAEoDUgCiAEBEikKHHVuaW5kZXhlZF9maWx0ZXJpbmdfcmV0cmlldmUYBCABKAhIA4gBARInChp1bmluZGV4ZWRfZmlsdGVyaW5nX3VwZGF0ZRgFIAEoCEgEiAEBEh8KEnNlYXJjaF9tYXhfaG5zd19lZhgGIAEoDUgFiAEBEh8KEnNlYXJjaF9hbGxvd19leGFjdBgHIAEoCEgGiAEBEiQKF3NlYXJjaF9tYXhfb3ZlcnNhbXBsaW5nGAggASgCSAeIAQESIQoUdXBzZXJ0X21heF9iYXRjaHNpemUYCSABKARICIgBARItCiBtYXhfY29sbGVjdGlvbl92ZWN0b3Jfc2l6ZV9ieXRlcxgKIAEoBEgJiAEBEhwKD3JlYWRfcmF0ZV9saW1pdBgLIAEoDUgKiAEBEh0KEHdyaXRlX3JhdGVfbGltaXQYDCABKA1IC4gBARIuCiFtYXhfY29sbGVjdGlvbl9wYXlsb2FkX3NpemVfYnl0ZXMYDSABKARIDIgBARIiChVmaWx0ZXJfbWF4X2NvbmRpdGlvbnMYDiABKARIDYgBARIfChJjb25kaXRpb25fbWF4X3NpemUYDyABKARIDogBARJEChJtdWx0aXZlY3Rvcl9jb25maWcYECABKAsyIy5xZHJhbnQuU3RyaWN0TW9kZU11bHRpdmVjdG9yQ29uZmlnSA+IAQESOgoNc3BhcnNlX2NvbmZpZxgRIAEoCzIeLnFkcmFudC5TdHJpY3RNb2RlU3BhcnNlQ29uZmlnSBCIAQESHQoQbWF4X3BvaW50c19jb3VudBgSIAEoBEgRiAEBEiQKF21heF9wYXlsb2FkX2luZGV4X2NvdW50GBMgASgESBKIAQFCCgoIX2VuYWJsZWRCEgoQX21heF9xdWVyeV9saW1pdEIOCgxfbWF4X3RpbWVvdXRCHwodX3VuaW5kZXhlZF9maWx0ZXJpbmdfcmV0cmlldmVCHQobX3VuaW5kZXhlZF9maWx0ZXJpbmdfdXBkYXRlQhUKE19zZWFyY2hfbWF4X2huc3dfZWZCFQoTX3NlYXJjaF9hbGxvd19leGFjdEIaChhfc2VhcmNoX21heF9vdmVyc2FtcGxpbmdCFwoVX3Vwc2VydF9tYXhfYmF0Y2hzaXplQiMKIV9tYXhfY29sbGVjdGlvbl92ZWN0b3Jfc2l6ZV9ieXRlc0ISChBfcmVhZF9yYXRlX2xpbWl0QhMKEV93cml0ZV9yYXRlX2xpbWl0QiQKIl9tYXhfY29sbGVjdGlvbl9wYXlsb2FkX3NpemVfYnl0ZXNCGAoWX2ZpbHRlcl9tYXhfY29uZGl0aW9uc0IVChNfY29uZGl0aW9uX21heF9zaXplQhUKE19tdWx0aXZlY3Rvcl9jb25maWdCEAoOX3NwYXJzZV9jb25maWdCEwoRX21heF9wb2ludHNfY291bnRCGgoYX21heF9wYXlsb2FkX2luZGV4X2NvdW50IrABChZTdHJpY3RNb2RlU3BhcnNlQ29uZmlnEkcKDXNwYXJzZV9jb25maWcYASADKAsyMC5xZHJhbnQuU3RyaWN0TW9kZVNwYXJzZUNvbmZpZy5TcGFyc2VDb25maWdFbnRyeRpNChFTcGFyc2VDb25maWdFbnRyeRILCgNrZXkYASABKAkSJwoFdmFsdWUYAiABKAsyGC5xZHJhbnQuU3RyaWN0TW9kZVNwYXJzZToCOAEiOgoQU3RyaWN0TW9kZVNwYXJzZRIXCgptYXhfbGVuZ3RoGAogASgESACIAQFCDQoLX21heF9sZW5ndGgizgEKG1N0cmljdE1vZGVNdWx0aXZlY3RvckNvbmZpZxJWChJtdWx0aXZlY3Rvcl9jb25maWcYASADKAsyOi5xZHJhbnQuU3RyaWN0TW9kZU11bHRpdmVjdG9yQ29uZmlnLk11bHRpdmVjdG9yQ29uZmlnRW50cnkaVwoWTXVsdGl2ZWN0b3JDb25maWdFbnRyeRILCgNrZXkYASABKAkSLAoFdmFsdWUYAiABKAsyHS5xZHJhbnQuU3RyaWN0TW9kZU11bHRpdmVjdG9yOgI4ASJBChVTdHJpY3RNb2RlTXVsdGl2ZWN0b3ISGAoLbWF4X3ZlY3RvcnMYASABKARIAIgBAUIOCgxfbWF4X3ZlY3RvcnMimwgKEENyZWF0ZUNvbGxlY3Rpb24SFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEjAKC2huc3dfY29uZmlnGAQgASgLMhYucWRyYW50Lkhuc3dDb25maWdEaWZmSACIAQESLgoKd2FsX2NvbmZpZxgFIAEoCzIVLnFkcmFudC5XYWxDb25maWdEaWZmSAGIAQESPAoRb3B0aW1pemVyc19jb25maWcYBiABKAsyHC5xZHJhbnQuT3B0aW1pemVyc0NvbmZpZ0RpZmZIAogBARIZCgxzaGFyZF9udW1iZXIYByABKA1IA4gBARIcCg9vbl9kaXNrX3BheWxvYWQYCCABKAhIBIgBARIUCgd0aW1lb3V0GAkgASgESAWIAQESMgoOdmVjdG9yc19jb25maWcYCiABKAsyFS5xZHJhbnQuVmVjdG9yc0NvbmZpZ0gGiAEBEh8KEnJlcGxpY2F0aW9uX2ZhY3RvchgLIAEoDUgHiAEBEiUKGHdyaXRlX2NvbnNpc3RlbmN5X2ZhY3RvchgMIAEoDUgIiAEBEjwKE3F1YW50aXphdGlvbl9jb25maWcYDiABKAsyGi5xZHJhbnQuUXVhbnRpemF0aW9uQ29uZmlnSAmIAQESNAoPc2hhcmRpbmdfbWV0aG9kGA8gASgOMhYucWRyYW50LlNoYXJkaW5nTWV0aG9kSAqIAQESPgoVc3BhcnNlX3ZlY3RvcnNfY29uZmlnGBAgASgLMhoucWRyYW50LlNwYXJzZVZlY3RvckNvbmZpZ0gLiAEBEjkKEnN0cmljdF9tb2RlX2NvbmZpZxgRIAEoCzIYLnFkcmFudC5TdHJpY3RNb2RlQ29uZmlnSAyIAQESOAoIbWV0YWRhdGEYEiADKAsyJi5xZHJhbnQuQ3JlYXRlQ29sbGVjdGlvbi5NZXRhZGF0YUVudHJ5Gj4KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUIOCgxfaG5zd19jb25maWdCDQoLX3dhbF9jb25maWdCFAoSX29wdGltaXplcnNfY29uZmlnQg8KDV9zaGFyZF9udW1iZXJCEgoQX29uX2Rpc2tfcGF5bG9hZEIKCghfdGltZW91dEIRCg9fdmVjdG9yc19jb25maWdCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvckIbChlfd3JpdGVfY29uc2lzdGVuY3lfZmFjdG9yQhYKFF9xdWFudGl6YXRpb25fY29uZmlnQhIKEF9zaGFyZGluZ19tZXRob2RCGAoWX3NwYXJzZV92ZWN0b3JzX2NvbmZpZ0IVChNfc3RyaWN0X21vZGVfY29uZmlnSgQIAhADSgQIAxAESgQIDRAOIuwFChBVcGRhdGVDb2xsZWN0aW9uEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRI8ChFvcHRpbWl6ZXJzX2NvbmZpZxgCIAEoCzIcLnFkcmFudC5PcHRpbWl6ZXJzQ29uZmlnRGlmZkgAiAEBEhQKB3RpbWVvdXQYAyABKARIAYgBARIxCgZwYXJhbXMYBCABKAsyHC5xZHJhbnQuQ29sbGVjdGlvblBhcmFtc0RpZmZIAogBARIwCgtobnN3X2NvbmZpZxgFIAEoCzIWLnFkcmFudC5IbnN3Q29uZmlnRGlmZkgDiAEBEjYKDnZlY3RvcnNfY29uZmlnGAYgASgLMhkucWRyYW50LlZlY3RvcnNDb25maWdEaWZmSASIAQESQAoTcXVhbnRpemF0aW9uX2NvbmZpZxgHIAEoCzIeLnFkcmFudC5RdWFudGl6YXRpb25Db25maWdEaWZmSAWIAQESPgoVc3BhcnNlX3ZlY3RvcnNfY29uZmlnGAggASgLMhoucWRyYW50LlNwYXJzZVZlY3RvckNvbmZpZ0gGiAEBEjkKEnN0cmljdF9tb2RlX2NvbmZpZxgJIAEoCzIYLnFkcmFudC5TdHJpY3RNb2RlQ29uZmlnSAeIAQESOAoIbWV0YWRhdGEYCiADKAsyJi5xZHJhbnQuVXBkYXRlQ29sbGVjdGlvbi5NZXRhZGF0YUVudHJ5Gj4KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUIUChJfb3B0aW1pemVyc19jb25maWdCCgoIX3RpbWVvdXRCCQoHX3BhcmFtc0IOCgxfaG5zd19jb25maWdCEQoPX3ZlY3RvcnNfY29uZmlnQhYKFF9xdWFudGl6YXRpb25fY29uZmlnQhgKFl9zcGFyc2VfdmVjdG9yc19jb25maWdCFQoTX3N0cmljdF9tb2RlX2NvbmZpZyJNChBEZWxldGVDb2xsZWN0aW9uEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIUCgd0aW1lb3V0GAIgASgESACIAQFCCgoIX3RpbWVvdXQiOwobQ29sbGVjdGlvbk9wZXJhdGlvblJlc3BvbnNlEg4KBnJlc3VsdBgBIAEoCBIMCgR0aW1lGAIgASgBIqwEChBDb2xsZWN0aW9uUGFyYW1zEhQKDHNoYXJkX251bWJlchgDIAEoDRIXCg9vbl9kaXNrX3BheWxvYWQYBCABKAgSMgoOdmVjdG9yc19jb25maWcYBSABKAsyFS5xZHJhbnQuVmVjdG9yc0NvbmZpZ0gAiAEBEh8KEnJlcGxpY2F0aW9uX2ZhY3RvchgGIAEoDUgBiAEBEiUKGHdyaXRlX2NvbnNpc3RlbmN5X2ZhY3RvchgHIAEoDUgCiAEBEiAKE3JlYWRfZmFuX291dF9mYWN0b3IYCCABKA1IA4gBARI0Cg9zaGFyZGluZ19tZXRob2QYCSABKA4yFi5xZHJhbnQuU2hhcmRpbmdNZXRob2RIBIgBARI+ChVzcGFyc2VfdmVjdG9yc19jb25maWcYCiABKAsyGi5xZHJhbnQuU3BhcnNlVmVjdG9yQ29uZmlnSAWIAQESIgoVcmVhZF9mYW5fb3V0X2RlbGF5X21zGAsgASgESAaIAQFCEQoPX3ZlY3RvcnNfY29uZmlnQhUKE19yZXBsaWNhdGlvbl9mYWN0b3JCGwoZX3dyaXRlX2NvbnNpc3RlbmN5X2ZhY3RvckIWChRfcmVhZF9mYW5fb3V0X2ZhY3RvckISChBfc2hhcmRpbmdfbWV0aG9kQhgKFl9zcGFyc2VfdmVjdG9yc19jb25maWdCGAoWX3JlYWRfZmFuX291dF9kZWxheV9tc0oECAEQAkoECAIQAyK8AgoUQ29sbGVjdGlvblBhcmFtc0RpZmYSHwoScmVwbGljYXRpb25fZmFjdG9yGAEgASgNSACIAQESJQoYd3JpdGVfY29uc2lzdGVuY3lfZmFjdG9yGAIgASgNSAGIAQESHAoPb25fZGlza19wYXlsb2FkGAMgASgISAKIAQESIAoTcmVhZF9mYW5fb3V0X2ZhY3RvchgEIAEoDUgDiAEBEiIKFXJlYWRfZmFuX291dF9kZWxheV9tcxgFIAEoBEgEiAEBQhUKE19yZXBsaWNhdGlvbl9mYWN0b3JCGwoZX3dyaXRlX2NvbnNpc3RlbmN5X2ZhY3RvckISChBfb25fZGlza19wYXlsb2FkQhYKFF9yZWFkX2Zhbl9vdXRfZmFjdG9yQhgKFl9yZWFkX2Zhbl9vdXRfZGVsYXlfbXMi7gMKEENvbGxlY3Rpb25Db25maWcSKAoGcGFyYW1zGAEgASgLMhgucWRyYW50LkNvbGxlY3Rpb25QYXJhbXMSKwoLaG5zd19jb25maWcYAiABKAsyFi5xZHJhbnQuSG5zd0NvbmZpZ0RpZmYSNgoQb3B0aW1pemVyX2NvbmZpZxgDIAEoCzIcLnFkcmFudC5PcHRpbWl6ZXJzQ29uZmlnRGlmZhIpCgp3YWxfY29uZmlnGAQgASgLMhUucWRyYW50LldhbENvbmZpZ0RpZmYSPAoTcXVhbnRpemF0aW9uX2NvbmZpZxgFIAEoCzIaLnFkcmFudC5RdWFudGl6YXRpb25Db25maWdIAIgBARI5ChJzdHJpY3RfbW9kZV9jb25maWcYBiABKAsyGC5xZHJhbnQuU3RyaWN0TW9kZUNvbmZpZ0gBiAEBEjgKCG1ldGFkYXRhGAcgAygLMiYucWRyYW50LkNvbGxlY3Rpb25Db25maWcuTWV0YWRhdGFFbnRyeRo+Cg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAFCFgoUX3F1YW50aXphdGlvbl9jb25maWdCFQoTX3N0cmljdF9tb2RlX2NvbmZpZyKGAQoSS2V5d29yZEluZGV4UGFyYW1zEhYKCWlzX3RlbmFudBgBIAEoCEgAiAEBEhQKB29uX2Rpc2sYAiABKAhIAYgBARIYCgtlbmFibGVfaG5zdxgDIAEoCEgCiAEBQgwKCl9pc190ZW5hbnRCCgoIX29uX2Rpc2tCDgoMX2VuYWJsZV9obnN3IsoBChJJbnRlZ2VySW5kZXhQYXJhbXMSEwoGbG9va3VwGAEgASgISACIAQESEgoFcmFuZ2UYAiABKAhIAYgBARIZCgxpc19wcmluY2lwYWwYAyABKAhIAogBARIUCgdvbl9kaXNrGAQgASgISAOIAQESGAoLZW5hYmxlX2huc3cYBSABKAhIBIgBAUIJCgdfbG9va3VwQggKBl9yYW5nZUIPCg1faXNfcHJpbmNpcGFsQgoKCF9vbl9kaXNrQg4KDF9lbmFibGVfaG5zdyKKAQoQRmxvYXRJbmRleFBhcmFtcxIUCgdvbl9kaXNrGAEgASgISACIAQESGQoMaXNfcHJpbmNpcGFsGAIgASgISAGIAQESGAoLZW5hYmxlX2huc3cYAyABKAhIAogBAUIKCghfb25fZGlza0IPCg1faXNfcHJpbmNpcGFsQg4KDF9lbmFibGVfaG5zdyJcCg5HZW9JbmRleFBhcmFtcxIUCgdvbl9kaXNrGAEgASgISACIAQESGAoLZW5hYmxlX2huc3cYAiABKAhIAYgBAUIKCghfb25fZGlza0IOCgxfZW5hYmxlX2huc3ciMQoMU3RvcHdvcmRzU2V0EhEKCWxhbmd1YWdlcxgBIAMoCRIOCgZjdXN0b20YAiADKAki4gMKD1RleHRJbmRleFBhcmFtcxIoCgl0b2tlbml6ZXIYASABKA4yFS5xZHJhbnQuVG9rZW5pemVyVHlwZRIWCglsb3dlcmNhc2UYAiABKAhIAIgBARIaCg1taW5fdG9rZW5fbGVuGAMgASgESAGIAQESGgoNbWF4X3Rva2VuX2xlbhgEIAEoBEgCiAEBEhQKB29uX2Rpc2sYBSABKAhIA4gBARIsCglzdG9wd29yZHMYBiABKAsyFC5xZHJhbnQuU3RvcHdvcmRzU2V0SASIAQESHAoPcGhyYXNlX21hdGNoaW5nGAcgASgISAWIAQESLwoHc3RlbW1lchgIIAEoCzIZLnFkcmFudC5TdGVtbWluZ0FsZ29yaXRobUgGiAEBEhoKDWFzY2lpX2ZvbGRpbmcYCSABKAhIB4gBARIYCgtlbmFibGVfaG5zdxgKIAEoCEgIiAEBQgwKCl9sb3dlcmNhc2VCEAoOX21pbl90b2tlbl9sZW5CEAoOX21heF90b2tlbl9sZW5CCgoIX29uX2Rpc2tCDAoKX3N0b3B3b3Jkc0ISChBfcGhyYXNlX21hdGNoaW5nQgoKCF9zdGVtbWVyQhAKDl9hc2NpaV9mb2xkaW5nQg4KDF9lbmFibGVfaG5zdyJSChFTdGVtbWluZ0FsZ29yaXRobRIqCghzbm93YmFsbBgBIAEoCzIWLnFkcmFudC5Tbm93YmFsbFBhcmFtc0gAQhEKD3N0ZW1taW5nX3BhcmFtcyIiCg5Tbm93YmFsbFBhcmFtcxIQCghsYW5ndWFnZRgBIAEoCSJdCg9Cb29sSW5kZXhQYXJhbXMSFAoHb25fZGlzaxgBIAEoCEgAiAEBEhgKC2VuYWJsZV9obnN3GAIgASgISAGIAQFCCgoIX29uX2Rpc2tCDgoMX2VuYWJsZV9obnN3Io0BChNEYXRldGltZUluZGV4UGFyYW1zEhQKB29uX2Rpc2sYASABKAhIAIgBARIZCgxpc19wcmluY2lwYWwYAiABKAhIAYgBARIYCgtlbmFibGVfaG5zdxgDIAEoCEgCiAEBQgoKCF9vbl9kaXNrQg8KDV9pc19wcmluY2lwYWxCDgoMX2VuYWJsZV9obnN3IoMBCg9VdWlkSW5kZXhQYXJhbXMSFgoJaXNfdGVuYW50GAEgASgISACIAQESFAoHb25fZGlzaxgCIAEoCEgBiAEBEhgKC2VuYWJsZV9obnN3GAMgASgISAKIAQFCDAoKX2lzX3RlbmFudEIKCghfb25fZGlza0IOCgxfZW5hYmxlX2huc3ci6AMKElBheWxvYWRJbmRleFBhcmFtcxI6ChRrZXl3b3JkX2luZGV4X3BhcmFtcxgDIAEoCzIaLnFkcmFudC5LZXl3b3JkSW5kZXhQYXJhbXNIABI6ChRpbnRlZ2VyX2luZGV4X3BhcmFtcxgCIAEoCzIaLnFkcmFudC5JbnRlZ2VySW5kZXhQYXJhbXNIABI2ChJmbG9hdF9pbmRleF9wYXJhbXMYBCABKAsyGC5xZHJhbnQuRmxvYXRJbmRleFBhcmFtc0gAEjIKEGdlb19pbmRleF9wYXJhbXMYBSABKAsyFi5xZHJhbnQuR2VvSW5kZXhQYXJhbXNIABI0ChF0ZXh0X2luZGV4X3BhcmFtcxgBIAEoCzIXLnFkcmFudC5UZXh0SW5kZXhQYXJhbXNIABI0ChFib29sX2luZGV4X3BhcmFtcxgGIAEoCzIXLnFkcmFudC5Cb29sSW5kZXhQYXJhbXNIABI8ChVkYXRldGltZV9pbmRleF9wYXJhbXMYByABKAsyGy5xZHJhbnQuRGF0ZXRpbWVJbmRleFBhcmFtc0gAEjQKEXV1aWRfaW5kZXhfcGFyYW1zGAggASgLMhcucWRyYW50LlV1aWRJbmRleFBhcmFtc0gAQg4KDGluZGV4X3BhcmFtcyKdAQoRUGF5bG9hZFNjaGVtYUluZm8SLAoJZGF0YV90eXBlGAEgASgOMhkucWRyYW50LlBheWxvYWRTY2hlbWFUeXBlEi8KBnBhcmFtcxgCIAEoCzIaLnFkcmFudC5QYXlsb2FkSW5kZXhQYXJhbXNIAIgBARITCgZwb2ludHMYAyABKARIAYgBAUIJCgdfcGFyYW1zQgkKB19wb2ludHMiIQoPVXBkYXRlUXVldWVJbmZvEg4KBmxlbmd0aBgBIAEoBCKbBAoOQ29sbGVjdGlvbkluZm8SKAoGc3RhdHVzGAEgASgOMhgucWRyYW50LkNvbGxlY3Rpb25TdGF0dXMSMQoQb3B0aW1pemVyX3N0YXR1cxgCIAEoCzIXLnFkcmFudC5PcHRpbWl6ZXJTdGF0dXMSFgoOc2VnbWVudHNfY291bnQYBCABKAQSKAoGY29uZmlnGAcgASgLMhgucWRyYW50LkNvbGxlY3Rpb25Db25maWcSQQoOcGF5bG9hZF9zY2hlbWEYCCADKAsyKS5xZHJhbnQuQ29sbGVjdGlvbkluZm8uUGF5bG9hZFNjaGVtYUVudHJ5EhkKDHBvaW50c19jb3VudBgJIAEoBEgAiAEBEiIKFWluZGV4ZWRfdmVjdG9yc19jb3VudBgKIAEoBEgBiAEBEisKCHdhcm5pbmdzGAsgAygLMhkucWRyYW50LkNvbGxlY3Rpb25XYXJuaW5nEi0KDHVwZGF0ZV9xdWV1ZRgMIAEoCzIXLnFkcmFudC5VcGRhdGVRdWV1ZUluZm8aTwoSUGF5bG9hZFNjaGVtYUVudHJ5EgsKA2tleRgBIAEoCRIoCgV2YWx1ZRgCIAEoCzIZLnFkcmFudC5QYXlsb2FkU2NoZW1hSW5mbzoCOAFCDwoNX3BvaW50c19jb3VudEIYChZfaW5kZXhlZF92ZWN0b3JzX2NvdW50SgQIAxAESgQIBRAGSgQIBhAHIlsKDUNoYW5nZUFsaWFzZXMSKAoHYWN0aW9ucxgBIAMoCzIXLnFkcmFudC5BbGlhc09wZXJhdGlvbnMSFAoHdGltZW91dBgCIAEoBEgAiAEBQgoKCF90aW1lb3V0IqIBCg9BbGlhc09wZXJhdGlvbnMSKwoMY3JlYXRlX2FsaWFzGAEgASgLMhMucWRyYW50LkNyZWF0ZUFsaWFzSAASKwoMcmVuYW1lX2FsaWFzGAIgASgLMhMucWRyYW50LlJlbmFtZUFsaWFzSAASKwoMZGVsZXRlX2FsaWFzGAMgASgLMhMucWRyYW50LkRlbGV0ZUFsaWFzSABCCAoGYWN0aW9uIjoKC0NyZWF0ZUFsaWFzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRISCgphbGlhc19uYW1lGAIgASgJIj0KC1JlbmFtZUFsaWFzEhYKDm9sZF9hbGlhc19uYW1lGAEgASgJEhYKDm5ld19hbGlhc19uYW1lGAIgASgJIiEKC0RlbGV0ZUFsaWFzEhIKCmFsaWFzX25hbWUYASABKAkiFAoSTGlzdEFsaWFzZXNSZXF1ZXN0IjcKHExpc3RDb2xsZWN0aW9uQWxpYXNlc1JlcXVlc3QSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJIj8KEEFsaWFzRGVzY3JpcHRpb24SEgoKYWxpYXNfbmFtZRgBIAEoCRIXCg9jb2xsZWN0aW9uX25hbWUYAiABKAkiTgoTTGlzdEFsaWFzZXNSZXNwb25zZRIpCgdhbGlhc2VzGAEgAygLMhgucWRyYW50LkFsaWFzRGVzY3JpcHRpb24SDAoEdGltZRgCIAEoASI3ChxDb2xsZWN0aW9uQ2x1c3RlckluZm9SZXF1ZXN0EhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCSI2CghTaGFyZEtleRIRCgdrZXl3b3JkGAEgASgJSAASEAoGbnVtYmVyGAIgASgESABCBQoDa2V5IpUBCg5Mb2NhbFNoYXJkSW5mbxIQCghzaGFyZF9pZBgBIAEoDRIUCgxwb2ludHNfY291bnQYAiABKAQSIwoFc3RhdGUYAyABKA4yFC5xZHJhbnQuUmVwbGljYVN0YXRlEigKCXNoYXJkX2tleRgEIAEoCzIQLnFkcmFudC5TaGFyZEtleUgAiAEBQgwKCl9zaGFyZF9rZXkikQEKD1JlbW90ZVNoYXJkSW5mbxIQCghzaGFyZF9pZBgBIAEoDRIPCgdwZWVyX2lkGAIgASgEEiMKBXN0YXRlGAMgASgOMhQucWRyYW50LlJlcGxpY2FTdGF0ZRIoCglzaGFyZF9rZXkYBCABKAsyEC5xZHJhbnQuU2hhcmRLZXlIAIgBAUIMCgpfc2hhcmRfa2V5IncKEVNoYXJkVHJhbnNmZXJJbmZvEhAKCHNoYXJkX2lkGAEgASgNEhgKC3RvX3NoYXJkX2lkGAUgASgNSACIAQESDAoEZnJvbRgCIAEoBBIKCgJ0bxgDIAEoBBIMCgRzeW5jGAQgASgIQg4KDF90b19zaGFyZF9pZCKbAQoOUmVzaGFyZGluZ0luZm8SEAoIc2hhcmRfaWQYASABKA0SDwoHcGVlcl9pZBgCIAEoBBIoCglzaGFyZF9rZXkYAyABKAsyEC5xZHJhbnQuU2hhcmRLZXlIAIgBARIuCglkaXJlY3Rpb24YBCABKA4yGy5xZHJhbnQuUmVzaGFyZGluZ0RpcmVjdGlvbkIMCgpfc2hhcmRfa2V5Io4CCh1Db2xsZWN0aW9uQ2x1c3RlckluZm9SZXNwb25zZRIPCgdwZWVyX2lkGAEgASgEEhMKC3NoYXJkX2NvdW50GAIgASgEEiwKDGxvY2FsX3NoYXJkcxgDIAMoCzIWLnFkcmFudC5Mb2NhbFNoYXJkSW5mbxIuCg1yZW1vdGVfc2hhcmRzGAQgAygLMhcucWRyYW50LlJlbW90ZVNoYXJkSW5mbxIyCg9zaGFyZF90cmFuc2ZlcnMYBSADKAsyGS5xZHJhbnQuU2hhcmRUcmFuc2ZlckluZm8SNQoVcmVzaGFyZGluZ19vcGVyYXRpb25zGAYgAygLMhYucWRyYW50LlJlc2hhcmRpbmdJbmZvIq4BCglNb3ZlU2hhcmQSEAoIc2hhcmRfaWQYASABKA0SGAoLdG9fc2hhcmRfaWQYBSABKA1IAIgBARIUCgxmcm9tX3BlZXJfaWQYAiABKAQSEgoKdG9fcGVlcl9pZBgDIAEoBBIwCgZtZXRob2QYBCABKA4yGy5xZHJhbnQuU2hhcmRUcmFuc2Zlck1ldGhvZEgBiAEBQg4KDF90b19zaGFyZF9pZEIJCgdfbWV0aG9kIrMBCg5SZXBsaWNhdGVTaGFyZBIQCghzaGFyZF9pZBgBIAEoDRIYCgt0b19zaGFyZF9pZBgFIAEoDUgAiAEBEhQKDGZyb21fcGVlcl9pZBgCIAEoBBISCgp0b19wZWVyX2lkGAMgASgEEjAKBm1ldGhvZBgEIAEoDjIbLnFkcmFudC5TaGFyZFRyYW5zZmVyTWV0aG9kSAGIAQFCDgoMX3RvX3NoYXJkX2lkQgkKB19tZXRob2QiegoSQWJvcnRTaGFyZFRyYW5zZmVyEhAKCHNoYXJkX2lkGAEgASgNEhgKC3RvX3NoYXJkX2lkGAQgASgNSACIAQESFAoMZnJvbV9wZWVyX2lkGAIgASgEEhIKCnRvX3BlZXJfaWQYAyABKARCDgoMX3RvX3NoYXJkX2lkIqQBCg9SZXN0YXJ0VHJhbnNmZXISEAoIc2hhcmRfaWQYASABKA0SGAoLdG9fc2hhcmRfaWQYBSABKA1IAIgBARIUCgxmcm9tX3BlZXJfaWQYAiABKAQSEgoKdG9fcGVlcl9pZBgDIAEoBBIrCgZtZXRob2QYBCABKA4yGy5xZHJhbnQuU2hhcmRUcmFuc2Zlck1ldGhvZEIOCgxfdG9fc2hhcmRfaWQikwEKD1JlcGxpY2F0ZVBvaW50cxIoCg5mcm9tX3NoYXJkX2tleRgBIAEoCzIQLnFkcmFudC5TaGFyZEtleRImCgx0b19zaGFyZF9rZXkYAiABKAsyEC5xZHJhbnQuU2hhcmRLZXkSIwoGZmlsdGVyGAMgASgLMg4ucWRyYW50LkZpbHRlckgAiAEBQgkKB19maWx0ZXIiLAoHUmVwbGljYRIQCghzaGFyZF9pZBgBIAEoDRIPCgdwZWVyX2lkGAIgASgEIvIBCg5DcmVhdGVTaGFyZEtleRIjCglzaGFyZF9rZXkYASABKAsyEC5xZHJhbnQuU2hhcmRLZXkSGgoNc2hhcmRzX251bWJlchgCIAEoDUgAiAEBEh8KEnJlcGxpY2F0aW9uX2ZhY3RvchgDIAEoDUgBiAEBEhEKCXBsYWNlbWVudBgEIAMoBBIwCg1pbml0aWFsX3N0YXRlGAUgASgOMhQucWRyYW50LlJlcGxpY2FTdGF0ZUgCiAEBQhAKDl9zaGFyZHNfbnVtYmVyQhUKE19yZXBsaWNhdGlvbl9mYWN0b3JCEAoOX2luaXRpYWxfc3RhdGUiNQoORGVsZXRlU2hhcmRLZXkSIwoJc2hhcmRfa2V5GAEgASgLMhAucWRyYW50LlNoYXJkS2V5IvoDCiNVcGRhdGVDb2xsZWN0aW9uQ2x1c3RlclNldHVwUmVxdWVzdBIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSJwoKbW92ZV9zaGFyZBgCIAEoCzIRLnFkcmFudC5Nb3ZlU2hhcmRIABIxCg9yZXBsaWNhdGVfc2hhcmQYAyABKAsyFi5xZHJhbnQuUmVwbGljYXRlU2hhcmRIABI0Cg5hYm9ydF90cmFuc2ZlchgEIAEoCzIaLnFkcmFudC5BYm9ydFNoYXJkVHJhbnNmZXJIABInCgxkcm9wX3JlcGxpY2EYBSABKAsyDy5xZHJhbnQuUmVwbGljYUgAEjIKEGNyZWF0ZV9zaGFyZF9rZXkYByABKAsyFi5xZHJhbnQuQ3JlYXRlU2hhcmRLZXlIABIyChBkZWxldGVfc2hhcmRfa2V5GAggASgLMhYucWRyYW50LkRlbGV0ZVNoYXJkS2V5SAASMwoQcmVzdGFydF90cmFuc2ZlchgJIAEoCzIXLnFkcmFudC5SZXN0YXJ0VHJhbnNmZXJIABIzChByZXBsaWNhdGVfcG9pbnRzGAogASgLMhcucWRyYW50LlJlcGxpY2F0ZVBvaW50c0gAEhQKB3RpbWVvdXQYBiABKARIAYgBAUILCglvcGVyYXRpb25CCgoIX3RpbWVvdXQiNgokVXBkYXRlQ29sbGVjdGlvbkNsdXN0ZXJTZXR1cFJlc3BvbnNlEg4KBnJlc3VsdBgBIAEoCCJ7ChVDcmVhdGVTaGFyZEtleVJlcXVlc3QSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEicKB3JlcXVlc3QYAiABKAsyFi5xZHJhbnQuQ3JlYXRlU2hhcmRLZXkSFAoHdGltZW91dBgDIAEoBEgAiAEBQgoKCF90aW1lb3V0InsKFURlbGV0ZVNoYXJkS2V5UmVxdWVzdBIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSJwoHcmVxdWVzdBgCIAEoCzIWLnFkcmFudC5EZWxldGVTaGFyZEtleRIUCgd0aW1lb3V0GAMgASgESACIAQFCCgoIX3RpbWVvdXQiLwoUTGlzdFNoYXJkS2V5c1JlcXVlc3QSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJIigKFkNyZWF0ZVNoYXJkS2V5UmVzcG9uc2USDgoGcmVzdWx0GAEgASgIIigKFkRlbGV0ZVNoYXJkS2V5UmVzcG9uc2USDgoGcmVzdWx0GAEgASgIIjQKE1NoYXJkS2V5RGVzY3JpcHRpb24SHQoDa2V5GAEgASgLMhAucWRyYW50LlNoYXJkS2V5IlYKFUxpc3RTaGFyZEtleXNSZXNwb25zZRIvCgpzaGFyZF9rZXlzGAEgAygLMhsucWRyYW50LlNoYXJkS2V5RGVzY3JpcHRpb24SDAoEdGltZRgCIAEoASo8CghEYXRhdHlwZRILCgdEZWZhdWx0EAASCwoHRmxvYXQzMhABEgkKBVVpbnQ4EAISCwoHRmxvYXQxNhADKh0KCE1vZGlmaWVyEggKBE5vbmUQABIHCgNJZGYQASojChVNdWx0aVZlY3RvckNvbXBhcmF0b3ISCgoGTWF4U2ltEAAqTwoIRGlzdGFuY2USEwoPVW5rbm93bkRpc3RhbmNlEAASCgoGQ29zaW5lEAESCgoGRXVjbGlkEAISBwoDRG90EAMSDQoJTWFuaGF0dGFuEAQqWQoQQ29sbGVjdGlvblN0YXR1cxIbChdVbmtub3duQ29sbGVjdGlvblN0YXR1cxAAEgkKBUdyZWVuEAESCgoGWWVsbG93EAISBwoDUmVkEAMSCAoER3JleRAEKn4KEVBheWxvYWRTY2hlbWFUeXBlEg8KC1Vua25vd25UeXBlEAASCwoHS2V5d29yZBABEgsKB0ludGVnZXIQAhIJCgVGbG9hdBADEgcKA0dlbxAEEggKBFRleHQQBRIICgRCb29sEAYSDAoIRGF0ZXRpbWUQBxIICgRVdWlkEAgqNQoQUXVhbnRpemF0aW9uVHlwZRIXChNVbmtub3duUXVhbnRpemF0aW9uEAASCAoESW50OBABKj0KEENvbXByZXNzaW9uUmF0aW8SBgoCeDQQABIGCgJ4OBABEgcKA3gxNhACEgcKA3gzMhADEgcKA3g2NBAEKkkKGkJpbmFyeVF1YW50aXphdGlvbkVuY29kaW5nEgoKBk9uZUJpdBAAEgsKB1R3b0JpdHMQARISCg5PbmVBbmRIYWxmQml0cxACKiYKDlNoYXJkaW5nTWV0aG9kEggKBEF1dG8QABIKCgZDdXN0b20QASpUCg1Ub2tlbml6ZXJUeXBlEgsKB1Vua25vd24QABIKCgZQcmVmaXgQARIOCgpXaGl0ZXNwYWNlEAISCAoEV29yZBADEhAKDE11bHRpbGluZ3VhbBAEKsEBCgxSZXBsaWNhU3RhdGUSCgoGQWN0aXZlEAASCAoERGVhZBABEgsKB1BhcnRpYWwQAhIQCgxJbml0aWFsaXppbmcQAxIMCghMaXN0ZW5lchAEEhMKD1BhcnRpYWxTbmFwc2hvdBAFEgwKCFJlY292ZXJ5EAYSDgoKUmVzaGFyZGluZxAHEhcKE1Jlc2hhcmRpbmdTY2FsZURvd24QCBIOCgpBY3RpdmVSZWFkEAkSEgoOTWFudWFsUmVjb3ZlcnkQCionChNSZXNoYXJkaW5nRGlyZWN0aW9uEgYKAlVwEAASCAoERG93bhABKmEKE1NoYXJkVHJhbnNmZXJNZXRob2QSEQoNU3RyZWFtUmVjb3JkcxAAEgwKCFNuYXBzaG90EAESDAoIV2FsRGVsdGEQAhIbChdSZXNoYXJkaW5nU3RyZWFtUmVjb3JkcxADQhWqAhJRZHJhbnQuQ2xpZW50LkdycGNiBnByb3RvMw", [file_json_with_int, file_qdrant_common]); /** * @generated from message qdrant.VectorParams @@ -35,21 +35,24 @@ export type VectorParams = Message<"qdrant.VectorParams"> & { distance: Distance; /** - * Configuration of vector HNSW graph. If omitted - the collection configuration will be used + * Configuration of vector HNSW graph. + * If omitted - the collection configuration will be used * * @generated from field: optional qdrant.HnswConfigDiff hnsw_config = 3; */ hnswConfig?: HnswConfigDiff; /** - * Configuration of vector quantization config. If omitted - the collection configuration will be used + * Configuration of vector quantization config. + * If omitted - the collection configuration will be used * * @generated from field: optional qdrant.QuantizationConfig quantization_config = 4; */ quantizationConfig?: QuantizationConfig; /** - * If true - serve vectors from disk. If set to false, the vectors will be loaded in RAM. + * If true - serve vectors from disk. + * If set to false, the vectors will be loaded in RAM. * * @generated from field: optional bool on_disk = 5; */ @@ -82,7 +85,8 @@ export const VectorParamsSchema: GenMessage = /*@__PURE__*/ */ export type VectorParamsDiff = Message<"qdrant.VectorParamsDiff"> & { /** - * Update params for HNSW index. If empty object - it will be unset + * Update params for HNSW index. + * If empty object - it will be unset * * @generated from field: optional qdrant.HnswConfigDiff hnsw_config = 1; */ @@ -96,7 +100,8 @@ export type VectorParamsDiff = Message<"qdrant.VectorParamsDiff"> & { quantizationConfig?: QuantizationConfigDiff; /** - * If true - serve vectors from disk. If set to false, the vectors will be loaded in RAM. + * If true - serve vectors from disk. + * If set to false, the vectors will be loaded in RAM. * * @generated from field: optional bool on_disk = 3; */ @@ -510,23 +515,22 @@ export const CollectionWarningSchema: GenMessage = /*@__PURE_ */ export type HnswConfigDiff = Message<"qdrant.HnswConfigDiff"> & { /** - * - * Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. + * Number of edges per node in the index graph. + * Larger the value - more accurate the search, more space required. * * @generated from field: optional uint64 m = 1; */ m?: bigint; /** - * - * Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build the index. + * Number of neighbours to consider during the index building. + * Larger the value - more accurate the search, more time required to build the index. * * @generated from field: optional uint64 ef_construct = 2; */ efConstruct?: bigint; /** - * * Minimal size threshold (in KiloBytes) below which full-scan is preferred over HNSW search. * This measures the total size of vectors being queried against. * When the maximum estimated amount of points that a condition satisfies is smaller than @@ -539,7 +543,6 @@ export type HnswConfigDiff = Message<"qdrant.HnswConfigDiff"> & { fullScanThreshold?: bigint; /** - * * Number of parallel threads used for background index building. * If 0 - automatically select from 8 to 16. * Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs. @@ -550,7 +553,6 @@ export type HnswConfigDiff = Message<"qdrant.HnswConfigDiff"> & { maxIndexingThreads?: bigint; /** - * * Store HNSW index on disk. If set to false, the index will be stored in RAM. * * @generated from field: optional bool on_disk = 5; @@ -558,15 +560,14 @@ export type HnswConfigDiff = Message<"qdrant.HnswConfigDiff"> & { onDisk?: boolean; /** - * - * Number of additional payload-aware links per node in the index graph. If not set - regular M parameter will be used. + * Number of additional payload-aware links per node in the index graph. + * If not set - regular M parameter will be used. * * @generated from field: optional uint64 payload_m = 6; */ payloadM?: bigint; /** - * * Store copies of original and quantized vectors within the HNSW index file. Default: false. * Enabling this option will trade the search speed for disk usage by reducing amount of * random seeks during the search. @@ -589,7 +590,6 @@ export const HnswConfigDiffSchema: GenMessage = /*@__PURE__*/ */ export type SparseIndexConfig = Message<"qdrant.SparseIndexConfig"> & { /** - * * Prefer a full scan search upto (excluding) this number of vectors. * Note: this is number of vectors, not KiloBytes. * @@ -598,7 +598,6 @@ export type SparseIndexConfig = Message<"qdrant.SparseIndexConfig"> & { fullScanThreshold?: bigint; /** - * * Store inverted index on disk. If set to false, the index will be stored in RAM. * * @generated from field: optional bool on_disk = 2; @@ -606,7 +605,6 @@ export type SparseIndexConfig = Message<"qdrant.SparseIndexConfig"> & { onDisk?: boolean; /** - * * Datatype used to store weights in the index. * * @generated from field: optional qdrant.Datatype datatype = 3; @@ -659,23 +657,22 @@ export const WalConfigDiffSchema: GenMessage = /*@__PURE__*/ */ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { /** - * - * The minimal fraction of deleted vectors in a segment, required to perform segment optimization + * The minimal fraction of deleted vectors in a segment, required to perform + * segment optimization * * @generated from field: optional double deleted_threshold = 1; */ deletedThreshold?: number; /** - * - * The minimal number of vectors in a segment, required to perform segment optimization + * The minimal number of vectors in a segment, required to perform segment + * optimization * * @generated from field: optional uint64 vacuum_min_vector_number = 2; */ vacuumMinVectorNumber?: bigint; /** - * * Target amount of segments the optimizer will try to keep. * Real amount of segments may vary depending on multiple parameters: * @@ -690,7 +687,6 @@ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { defaultSegmentNumber?: bigint; /** - * * Deprecated: * * Do not create segments larger this size (in kilobytes). @@ -707,7 +703,6 @@ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { maxSegmentSize?: bigint; /** - * * Maximum size (in kilobytes) of vectors to store in-memory per segment. * Segments larger than this threshold will be stored as read-only memmapped file. * @@ -722,10 +717,11 @@ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { memmapThreshold?: bigint; /** + * Maximum size (in kilobytes) of vectors allowed for plain index, exceeding + * this threshold will enable vector indexing * - * Maximum size (in kilobytes) of vectors allowed for plain index, exceeding this threshold will enable vector indexing - * - * Default value is 20,000, based on . + * Default value is 20,000, based on + * . * * To disable vector indexing, set to `0`. * @@ -736,7 +732,6 @@ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { indexingThreshold?: bigint; /** - * * Interval between forced flushes. * * @generated from field: optional uint64 flush_interval_sec = 7; @@ -751,7 +746,6 @@ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { deprecatedMaxOptimizationThreads?: bigint; /** - * * Max number of threads (jobs) for running optimizations per shard. * Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. * If "auto" - have no limit and choose dynamically to saturate CPU. @@ -760,6 +754,17 @@ export type OptimizersConfigDiff = Message<"qdrant.OptimizersConfigDiff"> & { * @generated from field: optional qdrant.MaxOptimizationThreads max_optimization_threads = 9; */ maxOptimizationThreads?: MaxOptimizationThreads; + + /** + * If this option is set, service will try to prevent creation of large unoptimized segments. + * When enabled, updates may be blocked at request level if there are unoptimized segments larger than indexing threshold. + * Updates will be resumed when optimization is completed and segments are optimized below the threshold. + * Using this option may lead to increased delay between submitting an update and its application. + * Default is disabled. + * + * @generated from field: optional bool prevent_unoptimized = 10; + */ + preventUnoptimized?: boolean; }; /** @@ -901,8 +906,8 @@ export type BinaryQuantization = Message<"qdrant.BinaryQuantization"> & { encoding?: BinaryQuantizationEncoding; /** - * - * Asymmetric quantization configuration allows a query to have different quantization than stored vectors. + * Asymmetric quantization configuration allows a query to have different + * quantization than stored vectors. * It can increase the accuracy of search at the cost of performance. * * @generated from field: optional qdrant.BinaryQuantizationQueryEncoding query_encoding = 3; @@ -1256,7 +1261,8 @@ export type CreateCollection = Message<"qdrant.CreateCollection"> & { optimizersConfig?: OptimizersConfigDiff; /** - * Number of shards in the collection, default is 1 for standalone, otherwise equal to the number of nodes. Minimum is 1 + * Number of shards in the collection, default is 1 for standalone, otherwise + * equal to the number of nodes. Minimum is 1 * * @generated from field: optional uint32 shard_number = 7; */ @@ -1270,7 +1276,8 @@ export type CreateCollection = Message<"qdrant.CreateCollection"> & { onDiskPayload?: boolean; /** - * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds, if not specified - default + * value will be supplied * * @generated from field: optional uint64 timeout = 9; */ @@ -1352,14 +1359,17 @@ export type UpdateCollection = Message<"qdrant.UpdateCollection"> & { collectionName: string; /** - * New configuration parameters for the collection. This operation is blocking, it will only proceed once all current optimizations are complete + * New configuration parameters for the collection. + * This operation is blocking, it will only proceed once all current + * optimizations are complete * * @generated from field: optional qdrant.OptimizersConfigDiff optimizers_config = 2; */ optimizersConfig?: OptimizersConfigDiff; /** - * Wait timeout for operation commit in seconds if blocking, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds if blocking. + * If not specified - default value will be supplied. * * @generated from field: optional uint64 timeout = 3; */ @@ -1408,7 +1418,8 @@ export type UpdateCollection = Message<"qdrant.UpdateCollection"> & { strictModeConfig?: StrictModeConfig; /** - * Arbitrary JSON-like metadata for the collection, will be merged with already stored metadata + * Arbitrary JSON-like metadata for the collection, will be merged with + * already stored metadata * * @generated from field: map metadata = 10; */ @@ -1434,7 +1445,8 @@ export type DeleteCollection = Message<"qdrant.DeleteCollection"> & { collectionName: string; /** - * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds. + * If not specified - default value will be supplied. * * @generated from field: optional uint64 timeout = 2; */ @@ -1533,6 +1545,13 @@ export type CollectionParams = Message<"qdrant.CollectionParams"> & { * @generated from field: optional qdrant.SparseVectorConfig sparse_vectors_config = 10; */ sparseVectorsConfig?: SparseVectorConfig; + + /** + * Define number of milliseconds to wait before attempting to read from another replica. + * + * @generated from field: optional uint64 read_fan_out_delay_ms = 11; + */ + readFanOutDelayMs?: bigint; }; /** @@ -1573,6 +1592,13 @@ export type CollectionParamsDiff = Message<"qdrant.CollectionParamsDiff"> & { * @generated from field: optional uint32 read_fan_out_factor = 4; */ readFanOutFactor?: number; + + /** + * Define number of milliseconds to wait before attempting to read from another replica. + * + * @generated from field: optional uint64 read_fan_out_delay_ms = 5; + */ + readFanOutDelayMs?: bigint; }; /** @@ -1660,6 +1686,15 @@ export type KeywordIndexParams = Message<"qdrant.KeywordIndexParams"> & { * @generated from field: optional bool on_disk = 2; */ onDisk?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 3; + */ + enableHnsw?: boolean; }; /** @@ -1688,7 +1723,9 @@ export type IntegerIndexParams = Message<"qdrant.IntegerIndexParams"> & { range?: boolean; /** - * If true - use this key to organize storage of the collection data. This option assumes that this key will be used in majority of filtered requests. Default is false. + * If true - use this key to organize storage of the collection data. + * This option assumes that this key will be used in majority of filtered requests. + * Default is false. * * @generated from field: optional bool is_principal = 3; */ @@ -1700,6 +1737,15 @@ export type IntegerIndexParams = Message<"qdrant.IntegerIndexParams"> & { * @generated from field: optional bool on_disk = 4; */ onDisk?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 5; + */ + enableHnsw?: boolean; }; /** @@ -1721,11 +1767,21 @@ export type FloatIndexParams = Message<"qdrant.FloatIndexParams"> & { onDisk?: boolean; /** - * If true - use this key to organize storage of the collection data. This option assumes that this key will be used in majority of filtered requests. + * If true - use this key to organize storage of the collection data. + * This option assumes that this key will be used in majority of filtered requests. * * @generated from field: optional bool is_principal = 2; */ isPrincipal?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 3; + */ + enableHnsw?: boolean; }; /** @@ -1745,6 +1801,15 @@ export type GeoIndexParams = Message<"qdrant.GeoIndexParams"> & { * @generated from field: optional bool on_disk = 1; */ onDisk?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 2; + */ + enableHnsw?: boolean; }; /** @@ -1841,11 +1906,21 @@ export type TextIndexParams = Message<"qdrant.TextIndexParams"> & { stemmer?: StemmingAlgorithm; /** - * If true, normalize tokens by folding accented characters to ASCII (e.g., "ação" -> "acao"). Default: false. + * If true, normalize tokens by folding accented characters to ASCII (e.g., "ação" -> "acao"). + * Default: false. * * @generated from field: optional bool ascii_folding = 9; */ asciiFolding?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 10; + */ + enableHnsw?: boolean; }; /** @@ -1909,6 +1984,15 @@ export type BoolIndexParams = Message<"qdrant.BoolIndexParams"> & { * @generated from field: optional bool on_disk = 1; */ onDisk?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 2; + */ + enableHnsw?: boolean; }; /** @@ -1930,11 +2014,21 @@ export type DatetimeIndexParams = Message<"qdrant.DatetimeIndexParams"> & { onDisk?: boolean; /** - * If true - use this key to organize storage of the collection data. This option assumes that this key will be used in majority of filtered requests. + * If true - use this key to organize storage of the collection data. + * This option assumes that this key will be used in majority of filtered requests. * * @generated from field: optional bool is_principal = 2; */ isPrincipal?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 3; + */ + enableHnsw?: boolean; }; /** @@ -1961,6 +2055,15 @@ export type UuidIndexParams = Message<"qdrant.UuidIndexParams"> & { * @generated from field: optional bool on_disk = 2; */ onDisk?: boolean; + + /** + * Enable HNSW graph building for this payload field. + * If true, builds additional HNSW links (Need payload_m > 0). + * Default: true. + * + * @generated from field: optional bool enable_hnsw = 3; + */ + enableHnsw?: boolean; }; /** @@ -2070,7 +2173,7 @@ export type PayloadSchemaInfo = Message<"qdrant.PayloadSchemaInfo"> & { params?: PayloadIndexParams; /** - * Number of points indexed within this field indexed + * Number of points indexed within this field * * @generated from field: optional uint64 points = 3; */ @@ -2084,6 +2187,25 @@ export type PayloadSchemaInfo = Message<"qdrant.PayloadSchemaInfo"> & { export const PayloadSchemaInfoSchema: GenMessage = /*@__PURE__*/ messageDesc(file_collections, 55); +/** + * @generated from message qdrant.UpdateQueueInfo + */ +export type UpdateQueueInfo = Message<"qdrant.UpdateQueueInfo"> & { + /** + * Number of elements in the queue + * + * @generated from field: uint64 length = 1; + */ + length: bigint; +}; + +/** + * Describes the message qdrant.UpdateQueueInfo. + * Use `create(UpdateQueueInfoSchema)` to create a new message. + */ +export const UpdateQueueInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_collections, 56); + /** * @generated from message qdrant.CollectionInfo */ @@ -2143,6 +2265,13 @@ export type CollectionInfo = Message<"qdrant.CollectionInfo"> & { * @generated from field: repeated qdrant.CollectionWarning warnings = 11; */ warnings: CollectionWarning[]; + + /** + * Update queue info + * + * @generated from field: qdrant.UpdateQueueInfo update_queue = 12; + */ + updateQueue?: UpdateQueueInfo; }; /** @@ -2150,7 +2279,7 @@ export type CollectionInfo = Message<"qdrant.CollectionInfo"> & { * Use `create(CollectionInfoSchema)` to create a new message. */ export const CollectionInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 56); + messageDesc(file_collections, 57); /** * @generated from message qdrant.ChangeAliases @@ -2164,7 +2293,8 @@ export type ChangeAliases = Message<"qdrant.ChangeAliases"> & { actions: AliasOperations[]; /** - * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds. + * If not specified - default value will be supplied. * * @generated from field: optional uint64 timeout = 2; */ @@ -2176,7 +2306,7 @@ export type ChangeAliases = Message<"qdrant.ChangeAliases"> & { * Use `create(ChangeAliasesSchema)` to create a new message. */ export const ChangeAliasesSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 57); + messageDesc(file_collections, 58); /** * @generated from message qdrant.AliasOperations @@ -2211,7 +2341,7 @@ export type AliasOperations = Message<"qdrant.AliasOperations"> & { * Use `create(AliasOperationsSchema)` to create a new message. */ export const AliasOperationsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 58); + messageDesc(file_collections, 59); /** * @generated from message qdrant.CreateAlias @@ -2237,7 +2367,7 @@ export type CreateAlias = Message<"qdrant.CreateAlias"> & { * Use `create(CreateAliasSchema)` to create a new message. */ export const CreateAliasSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 59); + messageDesc(file_collections, 60); /** * @generated from message qdrant.RenameAlias @@ -2263,7 +2393,7 @@ export type RenameAlias = Message<"qdrant.RenameAlias"> & { * Use `create(RenameAliasSchema)` to create a new message. */ export const RenameAliasSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 60); + messageDesc(file_collections, 61); /** * @generated from message qdrant.DeleteAlias @@ -2282,7 +2412,7 @@ export type DeleteAlias = Message<"qdrant.DeleteAlias"> & { * Use `create(DeleteAliasSchema)` to create a new message. */ export const DeleteAliasSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 61); + messageDesc(file_collections, 62); /** * @generated from message qdrant.ListAliasesRequest @@ -2295,7 +2425,7 @@ export type ListAliasesRequest = Message<"qdrant.ListAliasesRequest"> & { * Use `create(ListAliasesRequestSchema)` to create a new message. */ export const ListAliasesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 62); + messageDesc(file_collections, 63); /** * @generated from message qdrant.ListCollectionAliasesRequest @@ -2314,7 +2444,7 @@ export type ListCollectionAliasesRequest = Message<"qdrant.ListCollectionAliases * Use `create(ListCollectionAliasesRequestSchema)` to create a new message. */ export const ListCollectionAliasesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 63); + messageDesc(file_collections, 64); /** * @generated from message qdrant.AliasDescription @@ -2340,7 +2470,7 @@ export type AliasDescription = Message<"qdrant.AliasDescription"> & { * Use `create(AliasDescriptionSchema)` to create a new message. */ export const AliasDescriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 64); + messageDesc(file_collections, 65); /** * @generated from message qdrant.ListAliasesResponse @@ -2364,7 +2494,7 @@ export type ListAliasesResponse = Message<"qdrant.ListAliasesResponse"> & { * Use `create(ListAliasesResponseSchema)` to create a new message. */ export const ListAliasesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 65); + messageDesc(file_collections, 66); /** * @generated from message qdrant.CollectionClusterInfoRequest @@ -2383,7 +2513,7 @@ export type CollectionClusterInfoRequest = Message<"qdrant.CollectionClusterInfo * Use `create(CollectionClusterInfoRequestSchema)` to create a new message. */ export const CollectionClusterInfoRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 66); + messageDesc(file_collections, 67); /** * @generated from message qdrant.ShardKey @@ -2416,7 +2546,7 @@ export type ShardKey = Message<"qdrant.ShardKey"> & { * Use `create(ShardKeySchema)` to create a new message. */ export const ShardKeySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 67); + messageDesc(file_collections, 68); /** * @generated from message qdrant.LocalShardInfo @@ -2456,7 +2586,7 @@ export type LocalShardInfo = Message<"qdrant.LocalShardInfo"> & { * Use `create(LocalShardInfoSchema)` to create a new message. */ export const LocalShardInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 68); + messageDesc(file_collections, 69); /** * @generated from message qdrant.RemoteShardInfo @@ -2496,7 +2626,7 @@ export type RemoteShardInfo = Message<"qdrant.RemoteShardInfo"> & { * Use `create(RemoteShardInfoSchema)` to create a new message. */ export const RemoteShardInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 69); + messageDesc(file_collections, 70); /** * @generated from message qdrant.ShardTransferInfo @@ -2525,7 +2655,8 @@ export type ShardTransferInfo = Message<"qdrant.ShardTransferInfo"> & { to: bigint; /** - * If `true` transfer is a synchronization of a replicas; If `false` transfer is a moving of a shard from one peer to another + * If `true` transfer is a synchronization of a replicas; + * If `false` transfer is a moving of a shard from one peer to another * * @generated from field: bool sync = 4; */ @@ -2537,7 +2668,7 @@ export type ShardTransferInfo = Message<"qdrant.ShardTransferInfo"> & { * Use `create(ShardTransferInfoSchema)` to create a new message. */ export const ShardTransferInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 70); + messageDesc(file_collections, 71); /** * @generated from message qdrant.ReshardingInfo @@ -2569,7 +2700,7 @@ export type ReshardingInfo = Message<"qdrant.ReshardingInfo"> & { * Use `create(ReshardingInfoSchema)` to create a new message. */ export const ReshardingInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 71); + messageDesc(file_collections, 72); /** * @generated from message qdrant.CollectionClusterInfoResponse @@ -2623,7 +2754,7 @@ export type CollectionClusterInfoResponse = Message<"qdrant.CollectionClusterInf * Use `create(CollectionClusterInfoResponseSchema)` to create a new message. */ export const CollectionClusterInfoResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 72); + messageDesc(file_collections, 73); /** * @generated from message qdrant.MoveShard @@ -2662,7 +2793,7 @@ export type MoveShard = Message<"qdrant.MoveShard"> & { * Use `create(MoveShardSchema)` to create a new message. */ export const MoveShardSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 73); + messageDesc(file_collections, 74); /** * @generated from message qdrant.ReplicateShard @@ -2701,7 +2832,7 @@ export type ReplicateShard = Message<"qdrant.ReplicateShard"> & { * Use `create(ReplicateShardSchema)` to create a new message. */ export const ReplicateShardSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 74); + messageDesc(file_collections, 75); /** * @generated from message qdrant.AbortShardTransfer @@ -2735,7 +2866,7 @@ export type AbortShardTransfer = Message<"qdrant.AbortShardTransfer"> & { * Use `create(AbortShardTransferSchema)` to create a new message. */ export const AbortShardTransferSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 75); + messageDesc(file_collections, 76); /** * @generated from message qdrant.RestartTransfer @@ -2774,7 +2905,7 @@ export type RestartTransfer = Message<"qdrant.RestartTransfer"> & { * Use `create(RestartTransferSchema)` to create a new message. */ export const RestartTransferSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 76); + messageDesc(file_collections, 77); /** * @generated from message qdrant.ReplicatePoints @@ -2807,7 +2938,7 @@ export type ReplicatePoints = Message<"qdrant.ReplicatePoints"> & { * Use `create(ReplicatePointsSchema)` to create a new message. */ export const ReplicatePointsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 77); + messageDesc(file_collections, 78); /** * @generated from message qdrant.Replica @@ -2829,7 +2960,7 @@ export type Replica = Message<"qdrant.Replica"> & { * Use `create(ReplicaSchema)` to create a new message. */ export const ReplicaSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 78); + messageDesc(file_collections, 79); /** * @generated from message qdrant.CreateShardKey @@ -2876,7 +3007,7 @@ export type CreateShardKey = Message<"qdrant.CreateShardKey"> & { * Use `create(CreateShardKeySchema)` to create a new message. */ export const CreateShardKeySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 79); + messageDesc(file_collections, 80); /** * @generated from message qdrant.DeleteShardKey @@ -2895,7 +3026,7 @@ export type DeleteShardKey = Message<"qdrant.DeleteShardKey"> & { * Use `create(DeleteShardKeySchema)` to create a new message. */ export const DeleteShardKeySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 80); + messageDesc(file_collections, 81); /** * @generated from message qdrant.UpdateCollectionClusterSetupRequest @@ -2962,7 +3093,8 @@ export type UpdateCollectionClusterSetupRequest = Message<"qdrant.UpdateCollecti } | { case: undefined; value?: undefined }; /** - * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds. + * If not specified - default value will be supplied. * * @generated from field: optional uint64 timeout = 6; */ @@ -2974,7 +3106,7 @@ export type UpdateCollectionClusterSetupRequest = Message<"qdrant.UpdateCollecti * Use `create(UpdateCollectionClusterSetupRequestSchema)` to create a new message. */ export const UpdateCollectionClusterSetupRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 81); + messageDesc(file_collections, 82); /** * @generated from message qdrant.UpdateCollectionClusterSetupResponse @@ -2991,7 +3123,7 @@ export type UpdateCollectionClusterSetupResponse = Message<"qdrant.UpdateCollect * Use `create(UpdateCollectionClusterSetupResponseSchema)` to create a new message. */ export const UpdateCollectionClusterSetupResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 82); + messageDesc(file_collections, 83); /** * @generated from message qdrant.CreateShardKeyRequest @@ -3012,7 +3144,8 @@ export type CreateShardKeyRequest = Message<"qdrant.CreateShardKeyRequest"> & { request?: CreateShardKey; /** - * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds. + * If not specified - default value will be supplied. * * @generated from field: optional uint64 timeout = 3; */ @@ -3024,7 +3157,7 @@ export type CreateShardKeyRequest = Message<"qdrant.CreateShardKeyRequest"> & { * Use `create(CreateShardKeyRequestSchema)` to create a new message. */ export const CreateShardKeyRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 83); + messageDesc(file_collections, 84); /** * @generated from message qdrant.DeleteShardKeyRequest @@ -3045,7 +3178,8 @@ export type DeleteShardKeyRequest = Message<"qdrant.DeleteShardKeyRequest"> & { request?: DeleteShardKey; /** - * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * Wait timeout for operation commit in seconds. + * If not specified - default value will be supplied. * * @generated from field: optional uint64 timeout = 3; */ @@ -3057,7 +3191,26 @@ export type DeleteShardKeyRequest = Message<"qdrant.DeleteShardKeyRequest"> & { * Use `create(DeleteShardKeyRequestSchema)` to create a new message. */ export const DeleteShardKeyRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 84); + messageDesc(file_collections, 85); + +/** + * @generated from message qdrant.ListShardKeysRequest + */ +export type ListShardKeysRequest = Message<"qdrant.ListShardKeysRequest"> & { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName: string; +}; + +/** + * Describes the message qdrant.ListShardKeysRequest. + * Use `create(ListShardKeysRequestSchema)` to create a new message. + */ +export const ListShardKeysRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_collections, 86); /** * @generated from message qdrant.CreateShardKeyResponse @@ -3074,7 +3227,7 @@ export type CreateShardKeyResponse = Message<"qdrant.CreateShardKeyResponse"> & * Use `create(CreateShardKeyResponseSchema)` to create a new message. */ export const CreateShardKeyResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 85); + messageDesc(file_collections, 87); /** * @generated from message qdrant.DeleteShardKeyResponse @@ -3091,7 +3244,48 @@ export type DeleteShardKeyResponse = Message<"qdrant.DeleteShardKeyResponse"> & * Use `create(DeleteShardKeyResponseSchema)` to create a new message. */ export const DeleteShardKeyResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_collections, 86); + messageDesc(file_collections, 88); + +/** + * @generated from message qdrant.ShardKeyDescription + */ +export type ShardKeyDescription = Message<"qdrant.ShardKeyDescription"> & { + /** + * @generated from field: qdrant.ShardKey key = 1; + */ + key?: ShardKey; +}; + +/** + * Describes the message qdrant.ShardKeyDescription. + * Use `create(ShardKeyDescriptionSchema)` to create a new message. + */ +export const ShardKeyDescriptionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_collections, 89); + +/** + * @generated from message qdrant.ListShardKeysResponse + */ +export type ListShardKeysResponse = Message<"qdrant.ListShardKeysResponse"> & { + /** + * @generated from field: repeated qdrant.ShardKeyDescription shard_keys = 1; + */ + shardKeys: ShardKeyDescription[]; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time: number; +}; + +/** + * Describes the message qdrant.ListShardKeysResponse. + * Use `create(ListShardKeysResponseSchema)` to create a new message. + */ +export const ListShardKeysResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_collections, 90); /** * @generated from enum qdrant.Datatype @@ -3476,21 +3670,24 @@ export enum ReplicaState { Initializing = 3, /** - * A shard which receives data, but is not used for search; Useful for backup shards + * A shard which receives data, but is not used for search. + * Useful for backup shards. * * @generated from enum value: Listener = 4; */ Listener = 4, /** - * Deprecated: snapshot shard transfer is in progress; Updates should not be sent to (and are ignored by) the shard + * Deprecated: snapshot shard transfer is in progress. + * Updates should not be sent to (and are ignored by) the shard. * * @generated from enum value: PartialSnapshot = 5; */ PartialSnapshot = 5, /** - * Shard is undergoing recovered by an external node; Normally rejects updates, accepts updates if force is true + * Shard is undergoing recovery by an external node. + * Normally rejects updates, accepts updates if force is true. * * @generated from enum value: Recovery = 6; */ @@ -3516,6 +3713,17 @@ export enum ReplicaState { * @generated from enum value: ActiveRead = 9; */ ActiveRead = 9, + + /** + * State for manually creation/recovery of a shard. + * Usually when snapshot is uploaded. + * This state is equivalent to `Partial`, except: + * - it can't receive updates + * - it is not treated as broken on startup + * + * @generated from enum value: ManualRecovery = 10; + */ + ManualRecovery = 10, } /** @@ -3525,7 +3733,6 @@ export const ReplicaStateSchema: GenEnum = /*@__PURE__*/ enumDesc(file_collections, 11); /** - * * Resharding direction, scale up or down in number of shards * * @generated from enum qdrant.ReshardingDirection diff --git a/packages/js-client-grpc/src/proto/collections_service_pb.ts b/packages/js-client-grpc/src/proto/collections_service_pb.ts index 06a4b80..7fc3291 100644 --- a/packages/js-client-grpc/src/proto/collections_service_pb.ts +++ b/packages/js-client-grpc/src/proto/collections_service_pb.ts @@ -4,21 +4,20 @@ import type { GenFile, GenService } from "@bufbuild/protobuf/codegenv2"; import { fileDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import type { ChangeAliasesSchema, CollectionClusterInfoRequestSchema, CollectionClusterInfoResponseSchema, CollectionExistsRequestSchema, CollectionExistsResponseSchema, CollectionOperationResponseSchema, CreateCollectionSchema, CreateShardKeyRequestSchema, CreateShardKeyResponseSchema, DeleteCollectionSchema, DeleteShardKeyRequestSchema, DeleteShardKeyResponseSchema, GetCollectionInfoRequestSchema, GetCollectionInfoResponseSchema, ListAliasesRequestSchema, ListAliasesResponseSchema, ListCollectionAliasesRequestSchema, ListCollectionsRequestSchema, ListCollectionsResponseSchema, UpdateCollectionClusterSetupRequestSchema, UpdateCollectionClusterSetupResponseSchema, UpdateCollectionSchema } from "./collections_pb.js"; +import type { ChangeAliasesSchema, CollectionClusterInfoRequestSchema, CollectionClusterInfoResponseSchema, CollectionExistsRequestSchema, CollectionExistsResponseSchema, CollectionOperationResponseSchema, CreateCollectionSchema, CreateShardKeyRequestSchema, CreateShardKeyResponseSchema, DeleteCollectionSchema, DeleteShardKeyRequestSchema, DeleteShardKeyResponseSchema, GetCollectionInfoRequestSchema, GetCollectionInfoResponseSchema, ListAliasesRequestSchema, ListAliasesResponseSchema, ListCollectionAliasesRequestSchema, ListCollectionsRequestSchema, ListCollectionsResponseSchema, ListShardKeysRequestSchema, ListShardKeysResponseSchema, UpdateCollectionClusterSetupRequestSchema, UpdateCollectionClusterSetupResponseSchema, UpdateCollectionSchema } from "./collections_pb.js"; import { file_collections } from "./collections_pb.js"; /** * Describes the file collections_service.proto. */ export const file_collections_service: GenFile = /*@__PURE__*/ - fileDesc("Chljb2xsZWN0aW9uc19zZXJ2aWNlLnByb3RvEgZxZHJhbnQy4ggKC0NvbGxlY3Rpb25zEkwKA0dldBIgLnFkcmFudC5HZXRDb2xsZWN0aW9uSW5mb1JlcXVlc3QaIS5xZHJhbnQuR2V0Q29sbGVjdGlvbkluZm9SZXNwb25zZSIAEkkKBExpc3QSHi5xZHJhbnQuTGlzdENvbGxlY3Rpb25zUmVxdWVzdBofLnFkcmFudC5MaXN0Q29sbGVjdGlvbnNSZXNwb25zZSIAEkkKBkNyZWF0ZRIYLnFkcmFudC5DcmVhdGVDb2xsZWN0aW9uGiMucWRyYW50LkNvbGxlY3Rpb25PcGVyYXRpb25SZXNwb25zZSIAEkkKBlVwZGF0ZRIYLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uGiMucWRyYW50LkNvbGxlY3Rpb25PcGVyYXRpb25SZXNwb25zZSIAEkkKBkRlbGV0ZRIYLnFkcmFudC5EZWxldGVDb2xsZWN0aW9uGiMucWRyYW50LkNvbGxlY3Rpb25PcGVyYXRpb25SZXNwb25zZSIAEk0KDVVwZGF0ZUFsaWFzZXMSFS5xZHJhbnQuQ2hhbmdlQWxpYXNlcxojLnFkcmFudC5Db2xsZWN0aW9uT3BlcmF0aW9uUmVzcG9uc2UiABJcChVMaXN0Q29sbGVjdGlvbkFsaWFzZXMSJC5xZHJhbnQuTGlzdENvbGxlY3Rpb25BbGlhc2VzUmVxdWVzdBobLnFkcmFudC5MaXN0QWxpYXNlc1Jlc3BvbnNlIgASSAoLTGlzdEFsaWFzZXMSGi5xZHJhbnQuTGlzdEFsaWFzZXNSZXF1ZXN0GhsucWRyYW50Lkxpc3RBbGlhc2VzUmVzcG9uc2UiABJmChVDb2xsZWN0aW9uQ2x1c3RlckluZm8SJC5xZHJhbnQuQ29sbGVjdGlvbkNsdXN0ZXJJbmZvUmVxdWVzdBolLnFkcmFudC5Db2xsZWN0aW9uQ2x1c3RlckluZm9SZXNwb25zZSIAElcKEENvbGxlY3Rpb25FeGlzdHMSHy5xZHJhbnQuQ29sbGVjdGlvbkV4aXN0c1JlcXVlc3QaIC5xZHJhbnQuQ29sbGVjdGlvbkV4aXN0c1Jlc3BvbnNlIgASewocVXBkYXRlQ29sbGVjdGlvbkNsdXN0ZXJTZXR1cBIrLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uQ2x1c3RlclNldHVwUmVxdWVzdBosLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uQ2x1c3RlclNldHVwUmVzcG9uc2UiABJRCg5DcmVhdGVTaGFyZEtleRIdLnFkcmFudC5DcmVhdGVTaGFyZEtleVJlcXVlc3QaHi5xZHJhbnQuQ3JlYXRlU2hhcmRLZXlSZXNwb25zZSIAElEKDkRlbGV0ZVNoYXJkS2V5Eh0ucWRyYW50LkRlbGV0ZVNoYXJkS2V5UmVxdWVzdBoeLnFkcmFudC5EZWxldGVTaGFyZEtleVJlc3BvbnNlIgBCFaoCElFkcmFudC5DbGllbnQuR3JwY2IGcHJvdG8z", [file_collections]); + fileDesc("Chljb2xsZWN0aW9uc19zZXJ2aWNlLnByb3RvEgZxZHJhbnQysgkKC0NvbGxlY3Rpb25zEkwKA0dldBIgLnFkcmFudC5HZXRDb2xsZWN0aW9uSW5mb1JlcXVlc3QaIS5xZHJhbnQuR2V0Q29sbGVjdGlvbkluZm9SZXNwb25zZSIAEkkKBExpc3QSHi5xZHJhbnQuTGlzdENvbGxlY3Rpb25zUmVxdWVzdBofLnFkcmFudC5MaXN0Q29sbGVjdGlvbnNSZXNwb25zZSIAEkkKBkNyZWF0ZRIYLnFkcmFudC5DcmVhdGVDb2xsZWN0aW9uGiMucWRyYW50LkNvbGxlY3Rpb25PcGVyYXRpb25SZXNwb25zZSIAEkkKBlVwZGF0ZRIYLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uGiMucWRyYW50LkNvbGxlY3Rpb25PcGVyYXRpb25SZXNwb25zZSIAEkkKBkRlbGV0ZRIYLnFkcmFudC5EZWxldGVDb2xsZWN0aW9uGiMucWRyYW50LkNvbGxlY3Rpb25PcGVyYXRpb25SZXNwb25zZSIAEk0KDVVwZGF0ZUFsaWFzZXMSFS5xZHJhbnQuQ2hhbmdlQWxpYXNlcxojLnFkcmFudC5Db2xsZWN0aW9uT3BlcmF0aW9uUmVzcG9uc2UiABJcChVMaXN0Q29sbGVjdGlvbkFsaWFzZXMSJC5xZHJhbnQuTGlzdENvbGxlY3Rpb25BbGlhc2VzUmVxdWVzdBobLnFkcmFudC5MaXN0QWxpYXNlc1Jlc3BvbnNlIgASSAoLTGlzdEFsaWFzZXMSGi5xZHJhbnQuTGlzdEFsaWFzZXNSZXF1ZXN0GhsucWRyYW50Lkxpc3RBbGlhc2VzUmVzcG9uc2UiABJmChVDb2xsZWN0aW9uQ2x1c3RlckluZm8SJC5xZHJhbnQuQ29sbGVjdGlvbkNsdXN0ZXJJbmZvUmVxdWVzdBolLnFkcmFudC5Db2xsZWN0aW9uQ2x1c3RlckluZm9SZXNwb25zZSIAElcKEENvbGxlY3Rpb25FeGlzdHMSHy5xZHJhbnQuQ29sbGVjdGlvbkV4aXN0c1JlcXVlc3QaIC5xZHJhbnQuQ29sbGVjdGlvbkV4aXN0c1Jlc3BvbnNlIgASewocVXBkYXRlQ29sbGVjdGlvbkNsdXN0ZXJTZXR1cBIrLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uQ2x1c3RlclNldHVwUmVxdWVzdBosLnFkcmFudC5VcGRhdGVDb2xsZWN0aW9uQ2x1c3RlclNldHVwUmVzcG9uc2UiABJRCg5DcmVhdGVTaGFyZEtleRIdLnFkcmFudC5DcmVhdGVTaGFyZEtleVJlcXVlc3QaHi5xZHJhbnQuQ3JlYXRlU2hhcmRLZXlSZXNwb25zZSIAElEKDkRlbGV0ZVNoYXJkS2V5Eh0ucWRyYW50LkRlbGV0ZVNoYXJkS2V5UmVxdWVzdBoeLnFkcmFudC5EZWxldGVTaGFyZEtleVJlc3BvbnNlIgASTgoNTGlzdFNoYXJkS2V5cxIcLnFkcmFudC5MaXN0U2hhcmRLZXlzUmVxdWVzdBodLnFkcmFudC5MaXN0U2hhcmRLZXlzUmVzcG9uc2UiAEIVqgISUWRyYW50LkNsaWVudC5HcnBjYgZwcm90bzM", [file_collections]); /** * @generated from service qdrant.Collections */ export const Collections: GenService<{ /** - * * Get detailed information about specified existing collection * * @generated from rpc qdrant.Collections.Get @@ -29,8 +28,7 @@ export const Collections: GenService<{ output: typeof GetCollectionInfoResponseSchema; }, /** - * - * Get list name of all existing collections + * Get list of names of all existing collections * * @generated from rpc qdrant.Collections.List */ @@ -40,7 +38,6 @@ export const Collections: GenService<{ output: typeof ListCollectionsResponseSchema; }, /** - * * Create new collection with given parameters * * @generated from rpc qdrant.Collections.Create @@ -51,7 +48,6 @@ export const Collections: GenService<{ output: typeof CollectionOperationResponseSchema; }, /** - * * Update parameters of the existing collection * * @generated from rpc qdrant.Collections.Update @@ -62,7 +58,6 @@ export const Collections: GenService<{ output: typeof CollectionOperationResponseSchema; }, /** - * * Drop collection and all associated data * * @generated from rpc qdrant.Collections.Delete @@ -73,7 +68,6 @@ export const Collections: GenService<{ output: typeof CollectionOperationResponseSchema; }, /** - * * Update Aliases of the existing collection * * @generated from rpc qdrant.Collections.UpdateAliases @@ -84,7 +78,6 @@ export const Collections: GenService<{ output: typeof CollectionOperationResponseSchema; }, /** - * * Get list of all aliases for a collection * * @generated from rpc qdrant.Collections.ListCollectionAliases @@ -95,7 +88,6 @@ export const Collections: GenService<{ output: typeof ListAliasesResponseSchema; }, /** - * * Get list of all aliases for all existing collections * * @generated from rpc qdrant.Collections.ListAliases @@ -106,7 +98,6 @@ export const Collections: GenService<{ output: typeof ListAliasesResponseSchema; }, /** - * * Get cluster information for a collection * * @generated from rpc qdrant.Collections.CollectionClusterInfo @@ -117,7 +108,6 @@ export const Collections: GenService<{ output: typeof CollectionClusterInfoResponseSchema; }, /** - * * Check the existence of a collection * * @generated from rpc qdrant.Collections.CollectionExists @@ -128,7 +118,6 @@ export const Collections: GenService<{ output: typeof CollectionExistsResponseSchema; }, /** - * * Update cluster setup for a collection * * @generated from rpc qdrant.Collections.UpdateCollectionClusterSetup @@ -139,7 +128,6 @@ export const Collections: GenService<{ output: typeof UpdateCollectionClusterSetupResponseSchema; }, /** - * * Create shard key * * @generated from rpc qdrant.Collections.CreateShardKey @@ -150,7 +138,6 @@ export const Collections: GenService<{ output: typeof CreateShardKeyResponseSchema; }, /** - * * Delete shard key * * @generated from rpc qdrant.Collections.DeleteShardKey @@ -160,6 +147,16 @@ export const Collections: GenService<{ input: typeof DeleteShardKeyRequestSchema; output: typeof DeleteShardKeyResponseSchema; }, + /** + * List shard keys + * + * @generated from rpc qdrant.Collections.ListShardKeys + */ + listShardKeys: { + methodKind: "unary"; + input: typeof ListShardKeysRequestSchema; + output: typeof ListShardKeysResponseSchema; + }, }> = /*@__PURE__*/ serviceDesc(file_collections_service, 0); diff --git a/packages/js-client-grpc/src/proto/points_pb.ts b/packages/js-client-grpc/src/proto/points_pb.ts index 89728cf..4a80c9d 100644 --- a/packages/js-client-grpc/src/proto/points_pb.ts +++ b/packages/js-client-grpc/src/proto/points_pb.ts @@ -6,8 +6,8 @@ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2" import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; import type { PayloadIndexParams, ShardKey } from "./collections_pb.js"; import { file_collections } from "./collections_pb.js"; -import type { Condition, Filter, GeoPoint, PointId } from "./common_pb.js"; -import { file_common } from "./common_pb.js"; +import type { Condition, Filter, GeoPoint, PointId } from "./qdrant_common_pb.js"; +import { file_qdrant_common } from "./qdrant_common_pb.js"; import type { Timestamp } from "@bufbuild/protobuf/wkt"; import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; import type { Value } from "./json_with_int_pb.js"; @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file points.proto. */ export const file_points: GenFile = /*@__PURE__*/ - fileDesc("Cgxwb2ludHMucHJvdG8SBnFkcmFudCI4Cg1Xcml0ZU9yZGVyaW5nEicKBHR5cGUYASABKA4yGS5xZHJhbnQuV3JpdGVPcmRlcmluZ1R5cGUiWQoPUmVhZENvbnNpc3RlbmN5EisKBHR5cGUYASABKA4yGy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5VHlwZUgAEhAKBmZhY3RvchgCIAEoBEgAQgcKBXZhbHVlIh0KDVNwYXJzZUluZGljZXMSDAoEZGF0YRgBIAMoDSKWAQoIRG9jdW1lbnQSDAoEdGV4dBgBIAEoCRINCgVtb2RlbBgDIAEoCRIuCgdvcHRpb25zGAQgAygLMh0ucWRyYW50LkRvY3VtZW50Lk9wdGlvbnNFbnRyeRo9CgxPcHRpb25zRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4ASKgAQoFSW1hZ2USHAoFaW1hZ2UYASABKAsyDS5xZHJhbnQuVmFsdWUSDQoFbW9kZWwYAiABKAkSKwoHb3B0aW9ucxgDIAMoCzIaLnFkcmFudC5JbWFnZS5PcHRpb25zRW50cnkaPQoMT3B0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAEitQEKD0luZmVyZW5jZU9iamVjdBIdCgZvYmplY3QYASABKAsyDS5xZHJhbnQuVmFsdWUSDQoFbW9kZWwYAiABKAkSNQoHb3B0aW9ucxgDIAMoCzIkLnFkcmFudC5JbmZlcmVuY2VPYmplY3QuT3B0aW9uc0VudHJ5Gj0KDE9wdGlvbnNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBIoMDCgZWZWN0b3ISEAoEZGF0YRgBIAMoAkICGAESLwoHaW5kaWNlcxgCIAEoCzIVLnFkcmFudC5TcGFyc2VJbmRpY2VzQgIYAUgBiAEBEh4KDXZlY3RvcnNfY291bnQYAyABKA1CAhgBSAKIAQESJAoFZGVuc2UYZSABKAsyEy5xZHJhbnQuRGVuc2VWZWN0b3JIABImCgZzcGFyc2UYZiABKAsyFC5xZHJhbnQuU3BhcnNlVmVjdG9ySAASLwoLbXVsdGlfZGVuc2UYZyABKAsyGC5xZHJhbnQuTXVsdGlEZW5zZVZlY3RvckgAEiQKCGRvY3VtZW50GGggASgLMhAucWRyYW50LkRvY3VtZW50SAASHgoFaW1hZ2UYaSABKAsyDS5xZHJhbnQuSW1hZ2VIABIpCgZvYmplY3QYaiABKAsyFy5xZHJhbnQuSW5mZXJlbmNlT2JqZWN0SABCCAoGdmVjdG9yQgoKCF9pbmRpY2VzQhAKDl92ZWN0b3JzX2NvdW50IpgCCgxWZWN0b3JPdXRwdXQSEAoEZGF0YRgBIAMoAkICGAESLwoHaW5kaWNlcxgCIAEoCzIVLnFkcmFudC5TcGFyc2VJbmRpY2VzQgIYAUgBiAEBEh4KDXZlY3RvcnNfY291bnQYAyABKA1CAhgBSAKIAQESJAoFZGVuc2UYZSABKAsyEy5xZHJhbnQuRGVuc2VWZWN0b3JIABImCgZzcGFyc2UYZiABKAsyFC5xZHJhbnQuU3BhcnNlVmVjdG9ySAASLwoLbXVsdGlfZGVuc2UYZyABKAsyGC5xZHJhbnQuTXVsdGlEZW5zZVZlY3RvckgAQggKBnZlY3RvckIKCghfaW5kaWNlc0IQCg5fdmVjdG9yc19jb3VudCIbCgtEZW5zZVZlY3RvchIMCgRkYXRhGAEgAygCIi8KDFNwYXJzZVZlY3RvchIOCgZ2YWx1ZXMYASADKAISDwoHaW5kaWNlcxgCIAMoDSI4ChBNdWx0aURlbnNlVmVjdG9yEiQKB3ZlY3RvcnMYASADKAsyEy5xZHJhbnQuRGVuc2VWZWN0b3IipwIKC1ZlY3RvcklucHV0Eh0KAmlkGAEgASgLMg8ucWRyYW50LlBvaW50SWRIABIkCgVkZW5zZRgCIAEoCzITLnFkcmFudC5EZW5zZVZlY3RvckgAEiYKBnNwYXJzZRgDIAEoCzIULnFkcmFudC5TcGFyc2VWZWN0b3JIABIvCgttdWx0aV9kZW5zZRgEIAEoCzIYLnFkcmFudC5NdWx0aURlbnNlVmVjdG9ySAASJAoIZG9jdW1lbnQYBSABKAsyEC5xZHJhbnQuRG9jdW1lbnRIABIeCgVpbWFnZRgGIAEoCzINLnFkcmFudC5JbWFnZUgAEikKBm9iamVjdBgHIAEoCzIXLnFkcmFudC5JbmZlcmVuY2VPYmplY3RIAEIJCgd2YXJpYW50Im4KEFNoYXJkS2V5U2VsZWN0b3ISJAoKc2hhcmRfa2V5cxgBIAMoCzIQLnFkcmFudC5TaGFyZEtleRInCghmYWxsYmFjaxgCIAEoCzIQLnFkcmFudC5TaGFyZEtleUgAiAEBQgsKCV9mYWxsYmFjayKzAgoMVXBzZXJ0UG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIRCgR3YWl0GAIgASgISACIAQESIwoGcG9pbnRzGAMgAygLMhMucWRyYW50LlBvaW50U3RydWN0EiwKCG9yZGVyaW5nGAQgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYBSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgCiAEBEioKDXVwZGF0ZV9maWx0ZXIYBiABKAsyDi5xZHJhbnQuRmlsdGVySAOIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCEAoOX3VwZGF0ZV9maWx0ZXIi+AEKDERlbGV0ZVBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEiYKBnBvaW50cxgDIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvchIsCghvcmRlcmluZxgEIAEoCzIVLnFkcmFudC5Xcml0ZU9yZGVyaW5nSAGIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAUgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAogBAUIHCgVfd2FpdEILCglfb3JkZXJpbmdCFQoTX3NoYXJkX2tleV9zZWxlY3RvciKFAwoJR2V0UG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIcCgNpZHMYAiADKAsyDy5xZHJhbnQuUG9pbnRJZBIxCgx3aXRoX3BheWxvYWQYBCABKAsyGy5xZHJhbnQuV2l0aFBheWxvYWRTZWxlY3RvchI2Cgx3aXRoX3ZlY3RvcnMYBSABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgAiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYBiABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAGIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAcgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAogBARIUCgd0aW1lb3V0GAggASgESAOIAQFCDwoNX3dpdGhfdmVjdG9yc0ITChFfcmVhZF9jb25zaXN0ZW5jeUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yQgoKCF90aW1lb3V0SgQIAxAEIroCChJVcGRhdGVQb2ludFZlY3RvcnMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARIkCgZwb2ludHMYAyADKAsyFC5xZHJhbnQuUG9pbnRWZWN0b3JzEiwKCG9yZGVyaW5nGAQgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYBSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgCiAEBEioKDXVwZGF0ZV9maWx0ZXIYBiABKAsyDi5xZHJhbnQuRmlsdGVySAOIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCEAoOX3VwZGF0ZV9maWx0ZXIiTQoMUG9pbnRWZWN0b3JzEhsKAmlkGAEgASgLMg8ucWRyYW50LlBvaW50SWQSIAoHdmVjdG9ycxgCIAEoCzIPLnFkcmFudC5WZWN0b3JzIrECChJEZWxldGVQb2ludFZlY3RvcnMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARIvCg9wb2ludHNfc2VsZWN0b3IYAyABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3ISKAoHdmVjdG9ycxgEIAEoCzIXLnFkcmFudC5WZWN0b3JzU2VsZWN0b3ISLAoIb3JkZXJpbmcYBSABKAsyFS5xZHJhbnQuV3JpdGVPcmRlcmluZ0gBiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgGIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAKIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQhUKE19zaGFyZF9rZXlfc2VsZWN0b3IitQMKEFNldFBheWxvYWRQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARI2CgdwYXlsb2FkGAMgAygLMiUucWRyYW50LlNldFBheWxvYWRQb2ludHMuUGF5bG9hZEVudHJ5EjQKD3BvaW50c19zZWxlY3RvchgFIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckgBiAEBEiwKCG9yZGVyaW5nGAYgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAogBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYByABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgDiAEBEhAKA2tleRgIIAEoCUgEiAEBGj0KDFBheWxvYWRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQgcKBV93YWl0QhIKEF9wb2ludHNfc2VsZWN0b3JCCwoJX29yZGVyaW5nQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCBgoEX2tleUoECAQQBSK1AgoTRGVsZXRlUGF5bG9hZFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEgwKBGtleXMYAyADKAkSNAoPcG9pbnRzX3NlbGVjdG9yGAUgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9ySAGIAQESLAoIb3JkZXJpbmcYBiABKAsyFS5xZHJhbnQuV3JpdGVPcmRlcmluZ0gCiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgHIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAOIAQFCBwoFX3dhaXRCEgoQX3BvaW50c19zZWxlY3RvckILCglfb3JkZXJpbmdCFQoTX3NoYXJkX2tleV9zZWxlY3RvckoECAQQBSL+AQoSQ2xlYXJQYXlsb2FkUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIRCgR3YWl0GAIgASgISACIAQESJgoGcG9pbnRzGAMgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9yEiwKCG9yZGVyaW5nGAQgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYBSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgCiAEBQgcKBV93YWl0QgsKCV9vcmRlcmluZ0IVChNfc2hhcmRfa2V5X3NlbGVjdG9yIq8CChpDcmVhdGVGaWVsZEluZGV4Q29sbGVjdGlvbhIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEhIKCmZpZWxkX25hbWUYAyABKAkSKgoKZmllbGRfdHlwZRgEIAEoDjIRLnFkcmFudC5GaWVsZFR5cGVIAYgBARI7ChJmaWVsZF9pbmRleF9wYXJhbXMYBSABKAsyGi5xZHJhbnQuUGF5bG9hZEluZGV4UGFyYW1zSAKIAQESLAoIb3JkZXJpbmcYBiABKAsyFS5xZHJhbnQuV3JpdGVPcmRlcmluZ0gDiAEBQgcKBV93YWl0Qg0KC19maWVsZF90eXBlQhUKE19maWVsZF9pbmRleF9wYXJhbXNCCwoJX29yZGVyaW5nIqABChpEZWxldGVGaWVsZEluZGV4Q29sbGVjdGlvbhIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEhIKCmZpZWxkX25hbWUYAyABKAkSLAoIb3JkZXJpbmcYBCABKAsyFS5xZHJhbnQuV3JpdGVPcmRlcmluZ0gBiAEBQgcKBV93YWl0QgsKCV9vcmRlcmluZyIoChZQYXlsb2FkSW5jbHVkZVNlbGVjdG9yEg4KBmZpZWxkcxgBIAMoCSIoChZQYXlsb2FkRXhjbHVkZVNlbGVjdG9yEg4KBmZpZWxkcxgBIAMoCSKhAQoTV2l0aFBheWxvYWRTZWxlY3RvchIQCgZlbmFibGUYASABKAhIABIxCgdpbmNsdWRlGAIgASgLMh4ucWRyYW50LlBheWxvYWRJbmNsdWRlU2VsZWN0b3JIABIxCgdleGNsdWRlGAMgASgLMh4ucWRyYW50LlBheWxvYWRFeGNsdWRlU2VsZWN0b3JIAEISChBzZWxlY3Rvcl9vcHRpb25zIoIBCgxOYW1lZFZlY3RvcnMSMgoHdmVjdG9ycxgBIAMoCzIhLnFkcmFudC5OYW1lZFZlY3RvcnMuVmVjdG9yc0VudHJ5Gj4KDFZlY3RvcnNFbnRyeRILCgNrZXkYASABKAkSHQoFdmFsdWUYAiABKAsyDi5xZHJhbnQuVmVjdG9yOgI4ASKUAQoSTmFtZWRWZWN0b3JzT3V0cHV0EjgKB3ZlY3RvcnMYASADKAsyJy5xZHJhbnQuTmFtZWRWZWN0b3JzT3V0cHV0LlZlY3RvcnNFbnRyeRpECgxWZWN0b3JzRW50cnkSCwoDa2V5GAEgASgJEiMKBXZhbHVlGAIgASgLMhQucWRyYW50LlZlY3Rvck91dHB1dDoCOAEiZwoHVmVjdG9ycxIgCgZ2ZWN0b3IYASABKAsyDi5xZHJhbnQuVmVjdG9ySAASJwoHdmVjdG9ycxgCIAEoCzIULnFkcmFudC5OYW1lZFZlY3RvcnNIAEIRCg92ZWN0b3JzX29wdGlvbnMieQoNVmVjdG9yc091dHB1dBImCgZ2ZWN0b3IYASABKAsyFC5xZHJhbnQuVmVjdG9yT3V0cHV0SAASLQoHdmVjdG9ycxgCIAEoCzIaLnFkcmFudC5OYW1lZFZlY3RvcnNPdXRwdXRIAEIRCg92ZWN0b3JzX29wdGlvbnMiIAoPVmVjdG9yc1NlbGVjdG9yEg0KBW5hbWVzGAEgAygJImcKE1dpdGhWZWN0b3JzU2VsZWN0b3ISEAoGZW5hYmxlGAEgASgISAASKgoHaW5jbHVkZRgCIAEoCzIXLnFkcmFudC5WZWN0b3JzU2VsZWN0b3JIAEISChBzZWxlY3Rvcl9vcHRpb25zIogBChhRdWFudGl6YXRpb25TZWFyY2hQYXJhbXMSEwoGaWdub3JlGAEgASgISACIAQESFAoHcmVzY29yZRgCIAEoCEgBiAEBEhkKDG92ZXJzYW1wbGluZxgDIAEoAUgCiAEBQgkKB19pZ25vcmVCCgoIX3Jlc2NvcmVCDwoNX292ZXJzYW1wbGluZyJlChFBY29yblNlYXJjaFBhcmFtcxITCgZlbmFibGUYASABKAhIAIgBARIcCg9tYXhfc2VsZWN0aXZpdHkYAiABKAFIAYgBAUIJCgdfZW5hYmxlQhIKEF9tYXhfc2VsZWN0aXZpdHkigQIKDFNlYXJjaFBhcmFtcxIUCgdobnN3X2VmGAEgASgESACIAQESEgoFZXhhY3QYAiABKAhIAYgBARI7CgxxdWFudGl6YXRpb24YAyABKAsyIC5xZHJhbnQuUXVhbnRpemF0aW9uU2VhcmNoUGFyYW1zSAKIAQESGQoMaW5kZXhlZF9vbmx5GAQgASgISAOIAQESLQoFYWNvcm4YBSABKAsyGS5xZHJhbnQuQWNvcm5TZWFyY2hQYXJhbXNIBIgBAUIKCghfaG5zd19lZkIICgZfZXhhY3RCDwoNX3F1YW50aXphdGlvbkIPCg1faW5kZXhlZF9vbmx5QggKBl9hY29ybiKSBQoMU2VhcmNoUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIOCgZ2ZWN0b3IYAiADKAISHgoGZmlsdGVyGAMgASgLMg4ucWRyYW50LkZpbHRlchINCgVsaW1pdBgEIAEoBBIxCgx3aXRoX3BheWxvYWQYBiABKAsyGy5xZHJhbnQuV2l0aFBheWxvYWRTZWxlY3RvchIkCgZwYXJhbXMYByABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zEhwKD3Njb3JlX3RocmVzaG9sZBgIIAEoAkgAiAEBEhMKBm9mZnNldBgJIAEoBEgBiAEBEhgKC3ZlY3Rvcl9uYW1lGAogASgJSAKIAQESNgoMd2l0aF92ZWN0b3JzGAsgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIA4gBARI2ChByZWFkX2NvbnNpc3RlbmN5GAwgASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgEiAEBEhQKB3RpbWVvdXQYDSABKARIBYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYDiABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgGiAEBEjIKDnNwYXJzZV9pbmRpY2VzGA8gASgLMhUucWRyYW50LlNwYXJzZUluZGljZXNIB4gBAUISChBfc2NvcmVfdGhyZXNob2xkQgkKB19vZmZzZXRCDgoMX3ZlY3Rvcl9uYW1lQg8KDV93aXRoX3ZlY3RvcnNCEwoRX3JlYWRfY29uc2lzdGVuY3lCCgoIX3RpbWVvdXRCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIRCg9fc3BhcnNlX2luZGljZXNKBAgFEAYiyAEKEVNlYXJjaEJhdGNoUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIrCg1zZWFyY2hfcG9pbnRzGAIgAygLMhQucWRyYW50LlNlYXJjaFBvaW50cxI2ChByZWFkX2NvbnNpc3RlbmN5GAMgASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgAiAEBEhQKB3RpbWVvdXQYBCABKARIAYgBAUITChFfcmVhZF9jb25zaXN0ZW5jeUIKCghfdGltZW91dCKyAQoKV2l0aExvb2t1cBISCgpjb2xsZWN0aW9uGAEgASgJEjYKDHdpdGhfcGF5bG9hZBgCIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9ySACIAQESNgoMd2l0aF92ZWN0b3JzGAMgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIAYgBAUIPCg1fd2l0aF9wYXlsb2FkQg8KDV93aXRoX3ZlY3RvcnMi1QUKEVNlYXJjaFBvaW50R3JvdXBzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIOCgZ2ZWN0b3IYAiADKAISHgoGZmlsdGVyGAMgASgLMg4ucWRyYW50LkZpbHRlchINCgVsaW1pdBgEIAEoDRIxCgx3aXRoX3BheWxvYWQYBSABKAsyGy5xZHJhbnQuV2l0aFBheWxvYWRTZWxlY3RvchIkCgZwYXJhbXMYBiABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zEhwKD3Njb3JlX3RocmVzaG9sZBgHIAEoAkgAiAEBEhgKC3ZlY3Rvcl9uYW1lGAggASgJSAGIAQESNgoMd2l0aF92ZWN0b3JzGAkgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIAogBARIQCghncm91cF9ieRgKIAEoCRISCgpncm91cF9zaXplGAsgASgNEjYKEHJlYWRfY29uc2lzdGVuY3kYDCABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAOIAQESLAoLd2l0aF9sb29rdXAYDSABKAsyEi5xZHJhbnQuV2l0aExvb2t1cEgEiAEBEhQKB3RpbWVvdXQYDiABKARIBYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYDyABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgGiAEBEjIKDnNwYXJzZV9pbmRpY2VzGBAgASgLMhUucWRyYW50LlNwYXJzZUluZGljZXNIB4gBAUISChBfc2NvcmVfdGhyZXNob2xkQg4KDF92ZWN0b3JfbmFtZUIPCg1fd2l0aF92ZWN0b3JzQhMKEV9yZWFkX2NvbnNpc3RlbmN5Qg4KDF93aXRoX2xvb2t1cEIKCghfdGltZW91dEIVChNfc2hhcmRfa2V5X3NlbGVjdG9yQhEKD19zcGFyc2VfaW5kaWNlcyJ9CglTdGFydEZyb20SDwoFZmxvYXQYASABKAFIABIRCgdpbnRlZ2VyGAIgASgDSAASLwoJdGltZXN0YW1wGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAEhIKCGRhdGV0aW1lGAQgASgJSABCBwoFdmFsdWUiigEKB09yZGVyQnkSCwoDa2V5GAEgASgJEikKCWRpcmVjdGlvbhgCIAEoDjIRLnFkcmFudC5EaXJlY3Rpb25IAIgBARIqCgpzdGFydF9mcm9tGAMgASgLMhEucWRyYW50LlN0YXJ0RnJvbUgBiAEBQgwKCl9kaXJlY3Rpb25CDQoLX3N0YXJ0X2Zyb20ijgQKDFNjcm9sbFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSHgoGZmlsdGVyGAIgASgLMg4ucWRyYW50LkZpbHRlchIkCgZvZmZzZXQYAyABKAsyDy5xZHJhbnQuUG9pbnRJZEgAiAEBEhIKBWxpbWl0GAQgASgNSAGIAQESMQoMd2l0aF9wYXlsb2FkGAYgASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3ISNgoMd2l0aF92ZWN0b3JzGAcgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIAogBARI2ChByZWFkX2NvbnNpc3RlbmN5GAggASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgDiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgJIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySASIAQESJgoIb3JkZXJfYnkYCiABKAsyDy5xZHJhbnQuT3JkZXJCeUgFiAEBEhQKB3RpbWVvdXQYCyABKARIBogBAUIJCgdfb2Zmc2V0QggKBl9saW1pdEIPCg1fd2l0aF92ZWN0b3JzQhMKEV9yZWFkX2NvbnNpc3RlbmN5QhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCCwoJX29yZGVyX2J5QgoKCF90aW1lb3V0SgQIBRAGIqUBCg5Mb29rdXBMb2NhdGlvbhIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSGAoLdmVjdG9yX25hbWUYAiABKAlIAIgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYAyABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgBiAEBQg4KDF92ZWN0b3JfbmFtZUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIs0GCg9SZWNvbW1lbmRQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEiEKCHBvc2l0aXZlGAIgAygLMg8ucWRyYW50LlBvaW50SWQSIQoIbmVnYXRpdmUYAyADKAsyDy5xZHJhbnQuUG9pbnRJZBIeCgZmaWx0ZXIYBCABKAsyDi5xZHJhbnQuRmlsdGVyEg0KBWxpbWl0GAUgASgEEjEKDHdpdGhfcGF5bG9hZBgHIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9yEiQKBnBhcmFtcxgIIAEoCzIULnFkcmFudC5TZWFyY2hQYXJhbXMSHAoPc2NvcmVfdGhyZXNob2xkGAkgASgCSACIAQESEwoGb2Zmc2V0GAogASgESAGIAQESEgoFdXNpbmcYCyABKAlIAogBARI2Cgx3aXRoX3ZlY3RvcnMYDCABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgDiAEBEjAKC2xvb2t1cF9mcm9tGA0gASgLMhYucWRyYW50Lkxvb2t1cExvY2F0aW9uSASIAQESNgoQcmVhZF9jb25zaXN0ZW5jeRgOIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIBYgBARIwCghzdHJhdGVneRgQIAEoDjIZLnFkcmFudC5SZWNvbW1lbmRTdHJhdGVneUgGiAEBEigKEHBvc2l0aXZlX3ZlY3RvcnMYESADKAsyDi5xZHJhbnQuVmVjdG9yEigKEG5lZ2F0aXZlX3ZlY3RvcnMYEiADKAsyDi5xZHJhbnQuVmVjdG9yEhQKB3RpbWVvdXQYEyABKARIB4gBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYFCABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgIiAEBQhIKEF9zY29yZV90aHJlc2hvbGRCCQoHX29mZnNldEIICgZfdXNpbmdCDwoNX3dpdGhfdmVjdG9yc0IOCgxfbG9va3VwX2Zyb21CEwoRX3JlYWRfY29uc2lzdGVuY3lCCwoJX3N0cmF0ZWd5QgoKCF90aW1lb3V0QhUKE19zaGFyZF9rZXlfc2VsZWN0b3JKBAgGEAci0QEKFFJlY29tbWVuZEJhdGNoUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIxChByZWNvbW1lbmRfcG9pbnRzGAIgAygLMhcucWRyYW50LlJlY29tbWVuZFBvaW50cxI2ChByZWFkX2NvbnNpc3RlbmN5GAMgASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgAiAEBEhQKB3RpbWVvdXQYBCABKARIAYgBAUITChFfcmVhZF9jb25zaXN0ZW5jeUIKCghfdGltZW91dCKQBwoUUmVjb21tZW5kUG9pbnRHcm91cHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEiEKCHBvc2l0aXZlGAIgAygLMg8ucWRyYW50LlBvaW50SWQSIQoIbmVnYXRpdmUYAyADKAsyDy5xZHJhbnQuUG9pbnRJZBIeCgZmaWx0ZXIYBCABKAsyDi5xZHJhbnQuRmlsdGVyEg0KBWxpbWl0GAUgASgNEjEKDHdpdGhfcGF5bG9hZBgGIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9yEiQKBnBhcmFtcxgHIAEoCzIULnFkcmFudC5TZWFyY2hQYXJhbXMSHAoPc2NvcmVfdGhyZXNob2xkGAggASgCSACIAQESEgoFdXNpbmcYCSABKAlIAYgBARI2Cgx3aXRoX3ZlY3RvcnMYCiABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgCiAEBEjAKC2xvb2t1cF9mcm9tGAsgASgLMhYucWRyYW50Lkxvb2t1cExvY2F0aW9uSAOIAQESEAoIZ3JvdXBfYnkYDCABKAkSEgoKZ3JvdXBfc2l6ZRgNIAEoDRI2ChByZWFkX2NvbnNpc3RlbmN5GA4gASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgEiAEBEiwKC3dpdGhfbG9va3VwGA8gASgLMhIucWRyYW50LldpdGhMb29rdXBIBYgBARIwCghzdHJhdGVneRgRIAEoDjIZLnFkcmFudC5SZWNvbW1lbmRTdHJhdGVneUgGiAEBEigKEHBvc2l0aXZlX3ZlY3RvcnMYEiADKAsyDi5xZHJhbnQuVmVjdG9yEigKEG5lZ2F0aXZlX3ZlY3RvcnMYEyADKAsyDi5xZHJhbnQuVmVjdG9yEhQKB3RpbWVvdXQYFCABKARIB4gBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYFSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgIiAEBQhIKEF9zY29yZV90aHJlc2hvbGRCCAoGX3VzaW5nQg8KDV93aXRoX3ZlY3RvcnNCDgoMX2xvb2t1cF9mcm9tQhMKEV9yZWFkX2NvbnNpc3RlbmN5Qg4KDF93aXRoX2xvb2t1cEILCglfc3RyYXRlZ3lCCgoIX3RpbWVvdXRCFQoTX3NoYXJkX2tleV9zZWxlY3RvciJBCgxUYXJnZXRWZWN0b3ISJwoGc2luZ2xlGAEgASgLMhUucWRyYW50LlZlY3RvckV4YW1wbGVIAEIICgZ0YXJnZXQiWwoNVmVjdG9yRXhhbXBsZRIdCgJpZBgBIAEoCzIPLnFkcmFudC5Qb2ludElkSAASIAoGdmVjdG9yGAIgASgLMg4ucWRyYW50LlZlY3RvckgAQgkKB2V4YW1wbGUiZgoSQ29udGV4dEV4YW1wbGVQYWlyEicKCHBvc2l0aXZlGAEgASgLMhUucWRyYW50LlZlY3RvckV4YW1wbGUSJwoIbmVnYXRpdmUYAiABKAsyFS5xZHJhbnQuVmVjdG9yRXhhbXBsZSKOBQoORGlzY292ZXJQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEiQKBnRhcmdldBgCIAEoCzIULnFkcmFudC5UYXJnZXRWZWN0b3ISKwoHY29udGV4dBgDIAMoCzIaLnFkcmFudC5Db250ZXh0RXhhbXBsZVBhaXISHgoGZmlsdGVyGAQgASgLMg4ucWRyYW50LkZpbHRlchINCgVsaW1pdBgFIAEoBBIxCgx3aXRoX3BheWxvYWQYBiABKAsyGy5xZHJhbnQuV2l0aFBheWxvYWRTZWxlY3RvchIkCgZwYXJhbXMYByABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zEhMKBm9mZnNldBgIIAEoBEgAiAEBEhIKBXVzaW5nGAkgASgJSAGIAQESNgoMd2l0aF92ZWN0b3JzGAogASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIAogBARIwCgtsb29rdXBfZnJvbRgLIAEoCzIWLnFkcmFudC5Mb29rdXBMb2NhdGlvbkgDiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYDCABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SASIAQESFAoHdGltZW91dBgNIAEoBEgFiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgOIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAaIAQFCCQoHX29mZnNldEIICgZfdXNpbmdCDwoNX3dpdGhfdmVjdG9yc0IOCgxfbG9va3VwX2Zyb21CEwoRX3JlYWRfY29uc2lzdGVuY3lCCgoIX3RpbWVvdXRCFQoTX3NoYXJkX2tleV9zZWxlY3RvciLOAQoTRGlzY292ZXJCYXRjaFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSLwoPZGlzY292ZXJfcG9pbnRzGAIgAygLMhYucWRyYW50LkRpc2NvdmVyUG9pbnRzEjYKEHJlYWRfY29uc2lzdGVuY3kYAyABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SACIAQESFAoHdGltZW91dBgEIAEoBEgBiAEBQhMKEV9yZWFkX2NvbnNpc3RlbmN5QgoKCF90aW1lb3V0IqUCCgtDb3VudFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSHgoGZmlsdGVyGAIgASgLMg4ucWRyYW50LkZpbHRlchISCgVleGFjdBgDIAEoCEgAiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYBCABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAGIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAUgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAogBARIUCgd0aW1lb3V0GAYgASgESAOIAQFCCAoGX2V4YWN0QhMKEV9yZWFkX2NvbnNpc3RlbmN5QhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCCgoIX3RpbWVvdXQinQEKDlJlY29tbWVuZElucHV0EiUKCHBvc2l0aXZlGAEgAygLMhMucWRyYW50LlZlY3RvcklucHV0EiUKCG5lZ2F0aXZlGAIgAygLMhMucWRyYW50LlZlY3RvcklucHV0EjAKCHN0cmF0ZWd5GAMgASgOMhkucWRyYW50LlJlY29tbWVuZFN0cmF0ZWd5SACIAQFCCwoJX3N0cmF0ZWd5ImAKEENvbnRleHRJbnB1dFBhaXISJQoIcG9zaXRpdmUYASABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSJQoIbmVnYXRpdmUYAiABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQiWwoNRGlzY292ZXJJbnB1dBIjCgZ0YXJnZXQYASABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSJQoHY29udGV4dBgCIAEoCzIULnFkcmFudC5Db250ZXh0SW5wdXQiNwoMQ29udGV4dElucHV0EicKBXBhaXJzGAEgAygLMhgucWRyYW50LkNvbnRleHRJbnB1dFBhaXIiogEKB0Zvcm11bGESJgoKZXhwcmVzc2lvbhgBIAEoCzISLnFkcmFudC5FeHByZXNzaW9uEi8KCGRlZmF1bHRzGAIgAygLMh0ucWRyYW50LkZvcm11bGEuRGVmYXVsdHNFbnRyeRo+Cg1EZWZhdWx0c0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAEizAUKCkV4cHJlc3Npb24SEgoIY29uc3RhbnQYASABKAJIABISCgh2YXJpYWJsZRgCIAEoCUgAEiYKCWNvbmRpdGlvbhgDIAEoCzIRLnFkcmFudC5Db25kaXRpb25IABIrCgxnZW9fZGlzdGFuY2UYBCABKAsyEy5xZHJhbnQuR2VvRGlzdGFuY2VIABISCghkYXRldGltZRgFIAEoCUgAEhYKDGRhdGV0aW1lX2tleRgGIAEoCUgAEiYKBG11bHQYByABKAsyFi5xZHJhbnQuTXVsdEV4cHJlc3Npb25IABIkCgNzdW0YCCABKAsyFS5xZHJhbnQuU3VtRXhwcmVzc2lvbkgAEiQKA2RpdhgJIAEoCzIVLnFkcmFudC5EaXZFeHByZXNzaW9uSAASIQoDbmVnGAogASgLMhIucWRyYW50LkV4cHJlc3Npb25IABIhCgNhYnMYCyABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbkgAEiIKBHNxcnQYDCABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbkgAEiQKA3BvdxgNIAEoCzIVLnFkcmFudC5Qb3dFeHByZXNzaW9uSAASIQoDZXhwGA4gASgLMhIucWRyYW50LkV4cHJlc3Npb25IABIjCgVsb2cxMBgPIAEoCzISLnFkcmFudC5FeHByZXNzaW9uSAASIAoCbG4YECABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbkgAEjIKCWV4cF9kZWNheRgRIAEoCzIdLnFkcmFudC5EZWNheVBhcmFtc0V4cHJlc3Npb25IABI0CgtnYXVzc19kZWNheRgSIAEoCzIdLnFkcmFudC5EZWNheVBhcmFtc0V4cHJlc3Npb25IABIyCglsaW5fZGVjYXkYEyABKAsyHS5xZHJhbnQuRGVjYXlQYXJhbXNFeHByZXNzaW9uSABCCQoHdmFyaWFudCI7CgtHZW9EaXN0YW5jZRIgCgZvcmlnaW4YASABKAsyEC5xZHJhbnQuR2VvUG9pbnQSCgoCdG8YAiABKAkiMgoOTXVsdEV4cHJlc3Npb24SIAoEbXVsdBgBIAMoCzISLnFkcmFudC5FeHByZXNzaW9uIjAKDVN1bUV4cHJlc3Npb24SHwoDc3VtGAEgAygLMhIucWRyYW50LkV4cHJlc3Npb24ihgEKDURpdkV4cHJlc3Npb24SIAoEbGVmdBgBIAEoCzISLnFkcmFudC5FeHByZXNzaW9uEiEKBXJpZ2h0GAIgASgLMhIucWRyYW50LkV4cHJlc3Npb24SHAoPYnlfemVyb19kZWZhdWx0GAMgASgCSACIAQFCEgoQX2J5X3plcm9fZGVmYXVsdCJXCg1Qb3dFeHByZXNzaW9uEiAKBGJhc2UYASABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbhIkCghleHBvbmVudBgCIAEoCzISLnFkcmFudC5FeHByZXNzaW9uIqwBChVEZWNheVBhcmFtc0V4cHJlc3Npb24SHQoBeBgBIAEoCzISLnFkcmFudC5FeHByZXNzaW9uEicKBnRhcmdldBgCIAEoCzISLnFkcmFudC5FeHByZXNzaW9uSACIAQESEgoFc2NhbGUYAyABKAJIAYgBARIVCghtaWRwb2ludBgEIAEoAkgCiAEBQgkKB190YXJnZXRCCAoGX3NjYWxlQgsKCV9taWRwb2ludCJVChNOZWFyZXN0SW5wdXRXaXRoTW1yEiQKB25lYXJlc3QYASABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSGAoDbW1yGAIgASgLMgsucWRyYW50Lk1tciJfCgNNbXISFgoJZGl2ZXJzaXR5GAIgASgCSACIAQESHQoQY2FuZGlkYXRlc19saW1pdBgDIAEoDUgBiAEBQgwKCl9kaXZlcnNpdHlCEwoRX2NhbmRpZGF0ZXNfbGltaXQiGwoDUnJmEg4KAWsYASABKA1IAIgBAUIECgJfayKdAwoFUXVlcnkSJgoHbmVhcmVzdBgBIAEoCzITLnFkcmFudC5WZWN0b3JJbnB1dEgAEisKCXJlY29tbWVuZBgCIAEoCzIWLnFkcmFudC5SZWNvbW1lbmRJbnB1dEgAEikKCGRpc2NvdmVyGAMgASgLMhUucWRyYW50LkRpc2NvdmVySW5wdXRIABInCgdjb250ZXh0GAQgASgLMhQucWRyYW50LkNvbnRleHRJbnB1dEgAEiMKCG9yZGVyX2J5GAUgASgLMg8ucWRyYW50Lk9yZGVyQnlIABIgCgZmdXNpb24YBiABKA4yDi5xZHJhbnQuRnVzaW9uSAASIAoGc2FtcGxlGAcgASgOMg4ucWRyYW50LlNhbXBsZUgAEiIKB2Zvcm11bGEYCCABKAsyDy5xZHJhbnQuRm9ybXVsYUgAEjcKEG5lYXJlc3Rfd2l0aF9tbXIYCSABKAsyGy5xZHJhbnQuTmVhcmVzdElucHV0V2l0aE1tckgAEhoKA3JyZhgKIAEoCzILLnFkcmFudC5ScmZIAEIJCgd2YXJpYW50IvsCCg1QcmVmZXRjaFF1ZXJ5EicKCHByZWZldGNoGAEgAygLMhUucWRyYW50LlByZWZldGNoUXVlcnkSIQoFcXVlcnkYAiABKAsyDS5xZHJhbnQuUXVlcnlIAIgBARISCgV1c2luZxgDIAEoCUgBiAEBEiMKBmZpbHRlchgEIAEoCzIOLnFkcmFudC5GaWx0ZXJIAogBARIpCgZwYXJhbXMYBSABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zSAOIAQESHAoPc2NvcmVfdGhyZXNob2xkGAYgASgCSASIAQESEgoFbGltaXQYByABKARIBYgBARIwCgtsb29rdXBfZnJvbRgIIAEoCzIWLnFkcmFudC5Mb29rdXBMb2NhdGlvbkgGiAEBQggKBl9xdWVyeUIICgZfdXNpbmdCCQoHX2ZpbHRlckIJCgdfcGFyYW1zQhIKEF9zY29yZV90aHJlc2hvbGRCCAoGX2xpbWl0Qg4KDF9sb29rdXBfZnJvbSKFBgoLUXVlcnlQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEicKCHByZWZldGNoGAIgAygLMhUucWRyYW50LlByZWZldGNoUXVlcnkSIQoFcXVlcnkYAyABKAsyDS5xZHJhbnQuUXVlcnlIAIgBARISCgV1c2luZxgEIAEoCUgBiAEBEiMKBmZpbHRlchgFIAEoCzIOLnFkcmFudC5GaWx0ZXJIAogBARIpCgZwYXJhbXMYBiABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zSAOIAQESHAoPc2NvcmVfdGhyZXNob2xkGAcgASgCSASIAQESEgoFbGltaXQYCCABKARIBYgBARITCgZvZmZzZXQYCSABKARIBogBARI2Cgx3aXRoX3ZlY3RvcnMYCiABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgHiAEBEjYKDHdpdGhfcGF5bG9hZBgLIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9ySAiIAQESNgoQcmVhZF9jb25zaXN0ZW5jeRgMIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lICYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYDSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgKiAEBEjAKC2xvb2t1cF9mcm9tGA4gASgLMhYucWRyYW50Lkxvb2t1cExvY2F0aW9uSAuIAQESFAoHdGltZW91dBgPIAEoBEgMiAEBQggKBl9xdWVyeUIICgZfdXNpbmdCCQoHX2ZpbHRlckIJCgdfcGFyYW1zQhIKEF9zY29yZV90aHJlc2hvbGRCCAoGX2xpbWl0QgkKB19vZmZzZXRCDwoNX3dpdGhfdmVjdG9yc0IPCg1fd2l0aF9wYXlsb2FkQhMKEV9yZWFkX2NvbnNpc3RlbmN5QhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCDgoMX2xvb2t1cF9mcm9tQgoKCF90aW1lb3V0IsUBChBRdWVyeUJhdGNoUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIpCgxxdWVyeV9wb2ludHMYAiADKAsyEy5xZHJhbnQuUXVlcnlQb2ludHMSNgoQcmVhZF9jb25zaXN0ZW5jeRgDIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIAIgBARIUCgd0aW1lb3V0GAQgASgESAGIAQFCEwoRX3JlYWRfY29uc2lzdGVuY3lCCgoIX3RpbWVvdXQizAYKEFF1ZXJ5UG9pbnRHcm91cHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEicKCHByZWZldGNoGAIgAygLMhUucWRyYW50LlByZWZldGNoUXVlcnkSIQoFcXVlcnkYAyABKAsyDS5xZHJhbnQuUXVlcnlIAIgBARISCgV1c2luZxgEIAEoCUgBiAEBEiMKBmZpbHRlchgFIAEoCzIOLnFkcmFudC5GaWx0ZXJIAogBARIpCgZwYXJhbXMYBiABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zSAOIAQESHAoPc2NvcmVfdGhyZXNob2xkGAcgASgCSASIAQESMQoMd2l0aF9wYXlsb2FkGAggASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3ISNgoMd2l0aF92ZWN0b3JzGAkgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIBYgBARIwCgtsb29rdXBfZnJvbRgKIAEoCzIWLnFkcmFudC5Mb29rdXBMb2NhdGlvbkgGiAEBEhIKBWxpbWl0GAsgASgESAeIAQESFwoKZ3JvdXBfc2l6ZRgMIAEoBEgIiAEBEhAKCGdyb3VwX2J5GA0gASgJEjYKEHJlYWRfY29uc2lzdGVuY3kYDiABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAmIAQESLAoLd2l0aF9sb29rdXAYDyABKAsyEi5xZHJhbnQuV2l0aExvb2t1cEgKiAEBEhQKB3RpbWVvdXQYECABKARIC4gBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYESABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgMiAEBQggKBl9xdWVyeUIICgZfdXNpbmdCCQoHX2ZpbHRlckIJCgdfcGFyYW1zQhIKEF9zY29yZV90aHJlc2hvbGRCDwoNX3dpdGhfdmVjdG9yc0IOCgxfbG9va3VwX2Zyb21CCAoGX2xpbWl0Qg0KC19ncm91cF9zaXplQhMKEV9yZWFkX2NvbnNpc3RlbmN5Qg4KDF93aXRoX2xvb2t1cEIKCghfdGltZW91dEIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIuACCgtGYWNldENvdW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSCwoDa2V5GAIgASgJEiMKBmZpbHRlchgDIAEoCzIOLnFkcmFudC5GaWx0ZXJIAIgBARISCgVsaW1pdBgEIAEoBEgBiAEBEhIKBWV4YWN0GAUgASgISAKIAQESFAoHdGltZW91dBgGIAEoBEgDiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYByABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SASIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAggASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIBYgBAUIJCgdfZmlsdGVyQggKBl9saW1pdEIICgZfZXhhY3RCCgoIX3RpbWVvdXRCEwoRX3JlYWRfY29uc2lzdGVuY3lCFQoTX3NoYXJkX2tleV9zZWxlY3RvciJeCgpGYWNldFZhbHVlEhYKDHN0cmluZ192YWx1ZRgBIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAiABKANIABIUCgpib29sX3ZhbHVlGAMgASgISABCCQoHdmFyaWFudCI8CghGYWNldEhpdBIhCgV2YWx1ZRgBIAEoCzISLnFkcmFudC5GYWNldFZhbHVlEg0KBWNvdW50GAIgASgEIvoCChJTZWFyY2hNYXRyaXhQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEiMKBmZpbHRlchgCIAEoCzIOLnFkcmFudC5GaWx0ZXJIAIgBARITCgZzYW1wbGUYAyABKARIAYgBARISCgVsaW1pdBgEIAEoBEgCiAEBEhIKBXVzaW5nGAUgASgJSAOIAQESFAoHdGltZW91dBgGIAEoBEgEiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYByABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAWIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAggASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIBogBAUIJCgdfZmlsdGVyQgkKB19zYW1wbGVCCAoGX2xpbWl0QggKBl91c2luZ0IKCghfdGltZW91dEITChFfcmVhZF9jb25zaXN0ZW5jeUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIjwKEVNlYXJjaE1hdHJpeFBhaXJzEicKBXBhaXJzGAEgAygLMhgucWRyYW50LlNlYXJjaE1hdHJpeFBhaXIiWQoQU2VhcmNoTWF0cml4UGFpchIaCgFhGAEgASgLMg8ucWRyYW50LlBvaW50SWQSGgoBYhgCIAEoCzIPLnFkcmFudC5Qb2ludElkEg0KBXNjb3JlGAMgASgCIm0KE1NlYXJjaE1hdHJpeE9mZnNldHMSEwoLb2Zmc2V0c19yb3cYASADKAQSEwoLb2Zmc2V0c19jb2wYAiADKAQSDgoGc2NvcmVzGAMgAygCEhwKA2lkcxgEIAMoCzIPLnFkcmFudC5Qb2ludElkIpETChVQb2ludHNVcGRhdGVPcGVyYXRpb24SPwoGdXBzZXJ0GAEgASgLMi0ucWRyYW50LlBvaW50c1VwZGF0ZU9wZXJhdGlvbi5Qb2ludFN0cnVjdExpc3RIABI3ChFkZWxldGVfZGVwcmVjYXRlZBgCIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckICGAFIABI/CgtzZXRfcGF5bG9hZBgDIAEoCzIoLnFkcmFudC5Qb2ludHNVcGRhdGVPcGVyYXRpb24uU2V0UGF5bG9hZEgAEksKEW92ZXJ3cml0ZV9wYXlsb2FkGAQgASgLMi4ucWRyYW50LlBvaW50c1VwZGF0ZU9wZXJhdGlvbi5PdmVyd3JpdGVQYXlsb2FkSAASRQoOZGVsZXRlX3BheWxvYWQYBSABKAsyKy5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLkRlbGV0ZVBheWxvYWRIABI+ChhjbGVhcl9wYXlsb2FkX2RlcHJlY2F0ZWQYBiABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3JCAhgBSAASRQoOdXBkYXRlX3ZlY3RvcnMYByABKAsyKy5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLlVwZGF0ZVZlY3RvcnNIABJFCg5kZWxldGVfdmVjdG9ycxgIIAEoCzIrLnFkcmFudC5Qb2ludHNVcGRhdGVPcGVyYXRpb24uRGVsZXRlVmVjdG9yc0gAEkMKDWRlbGV0ZV9wb2ludHMYCSABKAsyKi5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLkRlbGV0ZVBvaW50c0gAEkMKDWNsZWFyX3BheWxvYWQYCiABKAsyKi5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLkNsZWFyUGF5bG9hZEgAGsYBCg9Qb2ludFN0cnVjdExpc3QSIwoGcG9pbnRzGAEgAygLMhMucWRyYW50LlBvaW50U3RydWN0EjkKEnNoYXJkX2tleV9zZWxlY3RvchgCIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySACIAQESKgoNdXBkYXRlX2ZpbHRlchgDIAEoCzIOLnFkcmFudC5GaWx0ZXJIAYgBAUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yQhAKDl91cGRhdGVfZmlsdGVyGskCCgpTZXRQYXlsb2FkEkYKB3BheWxvYWQYASADKAsyNS5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLlNldFBheWxvYWQuUGF5bG9hZEVudHJ5EjQKD3BvaW50c19zZWxlY3RvchgCIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckgAiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgDIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAGIAQESEAoDa2V5GAQgASgJSAKIAQEaPQoMUGF5bG9hZEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAFCEgoQX3BvaW50c19zZWxlY3RvckIVChNfc2hhcmRfa2V5X3NlbGVjdG9yQgYKBF9rZXka1QIKEE92ZXJ3cml0ZVBheWxvYWQSTAoHcGF5bG9hZBgBIAMoCzI7LnFkcmFudC5Qb2ludHNVcGRhdGVPcGVyYXRpb24uT3ZlcndyaXRlUGF5bG9hZC5QYXlsb2FkRW50cnkSNAoPcG9pbnRzX3NlbGVjdG9yGAIgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9ySACIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAMgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAYgBARIQCgNrZXkYBCABKAlIAogBARo9CgxQYXlsb2FkRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUISChBfcG9pbnRzX3NlbGVjdG9yQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCBgoEX2tleRq5AQoNRGVsZXRlUGF5bG9hZBIMCgRrZXlzGAEgAygJEjQKD3BvaW50c19zZWxlY3RvchgCIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckgAiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgDIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAGIAQFCEgoQX3BvaW50c19zZWxlY3RvckIVChNfc2hhcmRfa2V5X3NlbGVjdG9yGsUBCg1VcGRhdGVWZWN0b3JzEiQKBnBvaW50cxgBIAMoCzIULnFkcmFudC5Qb2ludFZlY3RvcnMSOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAIgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAIgBARIqCg11cGRhdGVfZmlsdGVyGAMgASgLMg4ucWRyYW50LkZpbHRlckgBiAEBQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCEAoOX3VwZGF0ZV9maWx0ZXIavAEKDURlbGV0ZVZlY3RvcnMSLwoPcG9pbnRzX3NlbGVjdG9yGAEgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9yEigKB3ZlY3RvcnMYAiABKAsyFy5xZHJhbnQuVmVjdG9yc1NlbGVjdG9yEjkKEnNoYXJkX2tleV9zZWxlY3RvchgDIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySACIAQFCFQoTX3NoYXJkX2tleV9zZWxlY3RvchqIAQoMRGVsZXRlUG9pbnRzEiYKBnBvaW50cxgBIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvchI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYAiABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgAiAEBQhUKE19zaGFyZF9rZXlfc2VsZWN0b3IaiAEKDENsZWFyUGF5bG9hZBImCgZwb2ludHMYASABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3ISOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAIgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAIgBAUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yQgsKCW9wZXJhdGlvbiK2AQoRVXBkYXRlQmF0Y2hQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARIxCgpvcGVyYXRpb25zGAMgAygLMh0ucWRyYW50LlBvaW50c1VwZGF0ZU9wZXJhdGlvbhIsCghvcmRlcmluZxgEIAEoCzIVLnFkcmFudC5Xcml0ZU9yZGVyaW5nSAGIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nInoKF1BvaW50c09wZXJhdGlvblJlc3BvbnNlEiQKBnJlc3VsdBgBIAEoCzIULnFkcmFudC5VcGRhdGVSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJgCgxVcGRhdGVSZXN1bHQSGQoMb3BlcmF0aW9uX2lkGAEgASgESACIAQESJAoGc3RhdHVzGAIgASgOMhQucWRyYW50LlVwZGF0ZVN0YXR1c0IPCg1fb3BlcmF0aW9uX2lkIjcKCk9yZGVyVmFsdWUSDQoDaW50GAEgASgDSAASDwoFZmxvYXQYAiABKAFIAEIJCgd2YXJpYW50IvECCgtTY29yZWRQb2ludBIbCgJpZBgBIAEoCzIPLnFkcmFudC5Qb2ludElkEjEKB3BheWxvYWQYAiADKAsyIC5xZHJhbnQuU2NvcmVkUG9pbnQuUGF5bG9hZEVudHJ5Eg0KBXNjb3JlGAMgASgCEg8KB3ZlcnNpb24YBSABKAQSKwoHdmVjdG9ycxgGIAEoCzIVLnFkcmFudC5WZWN0b3JzT3V0cHV0SACIAQESKAoJc2hhcmRfa2V5GAcgASgLMhAucWRyYW50LlNoYXJkS2V5SAGIAQESLAoLb3JkZXJfdmFsdWUYCCABKAsyEi5xZHJhbnQuT3JkZXJWYWx1ZUgCiAEBGj0KDFBheWxvYWRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQgoKCF92ZWN0b3JzQgwKCl9zaGFyZF9rZXlCDgoMX29yZGVyX3ZhbHVlSgQIBBAFIlwKB0dyb3VwSWQSGAoOdW5zaWduZWRfdmFsdWUYASABKARIABIXCg1pbnRlZ2VyX3ZhbHVlGAIgASgDSAASFgoMc3RyaW5nX3ZhbHVlGAMgASgJSABCBgoEa2luZCJ0CgpQb2ludEdyb3VwEhsKAmlkGAEgASgLMg8ucWRyYW50Lkdyb3VwSWQSIQoEaGl0cxgCIAMoCzITLnFkcmFudC5TY29yZWRQb2ludBImCgZsb29rdXAYAyABKAsyFi5xZHJhbnQuUmV0cmlldmVkUG9pbnQiMgoMR3JvdXBzUmVzdWx0EiIKBmdyb3VwcxgBIAMoCzISLnFkcmFudC5Qb2ludEdyb3VwInAKDlNlYXJjaFJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5TY29yZWRQb2ludBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIm8KDVF1ZXJ5UmVzcG9uc2USIwoGcmVzdWx0GAEgAygLMhMucWRyYW50LlNjb3JlZFBvaW50EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UidAoSUXVlcnlCYXRjaFJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5CYXRjaFJlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlInYKE1F1ZXJ5R3JvdXBzUmVzcG9uc2USJAoGcmVzdWx0GAEgASgLMhQucWRyYW50Lkdyb3Vwc1Jlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIjIKC0JhdGNoUmVzdWx0EiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5TY29yZWRQb2ludCJ1ChNTZWFyY2hCYXRjaFJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5CYXRjaFJlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIncKFFNlYXJjaEdyb3Vwc1Jlc3BvbnNlEiQKBnJlc3VsdBgBIAEoCzIULnFkcmFudC5Hcm91cHNSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJvCg1Db3VudFJlc3BvbnNlEiMKBnJlc3VsdBgBIAEoCzITLnFkcmFudC5Db3VudFJlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIrgBCg5TY3JvbGxSZXNwb25zZRIuChBuZXh0X3BhZ2Vfb2Zmc2V0GAEgASgLMg8ucWRyYW50LlBvaW50SWRIAIgBARImCgZyZXN1bHQYAiADKAsyFi5xZHJhbnQuUmV0cmlldmVkUG9pbnQSDAoEdGltZRgDIAEoARIhCgV1c2FnZRgEIAEoCzINLnFkcmFudC5Vc2FnZUgBiAEBQhMKEV9uZXh0X3BhZ2Vfb2Zmc2V0QggKBl91c2FnZSIcCgtDb3VudFJlc3VsdBINCgVjb3VudBgBIAEoBCLXAgoOUmV0cmlldmVkUG9pbnQSGwoCaWQYASABKAsyDy5xZHJhbnQuUG9pbnRJZBI0CgdwYXlsb2FkGAIgAygLMiMucWRyYW50LlJldHJpZXZlZFBvaW50LlBheWxvYWRFbnRyeRIrCgd2ZWN0b3JzGAQgASgLMhUucWRyYW50LlZlY3RvcnNPdXRwdXRIAIgBARIoCglzaGFyZF9rZXkYBSABKAsyEC5xZHJhbnQuU2hhcmRLZXlIAYgBARIsCgtvcmRlcl92YWx1ZRgGIAEoCzISLnFkcmFudC5PcmRlclZhbHVlSAKIAQEaPQoMUGF5bG9hZEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAFCCgoIX3ZlY3RvcnNCDAoKX3NoYXJkX2tleUIOCgxfb3JkZXJfdmFsdWVKBAgDEAQicAoLR2V0UmVzcG9uc2USJgoGcmVzdWx0GAEgAygLMhYucWRyYW50LlJldHJpZXZlZFBvaW50EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UicwoRUmVjb21tZW5kUmVzcG9uc2USIwoGcmVzdWx0GAEgAygLMhMucWRyYW50LlNjb3JlZFBvaW50EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UieAoWUmVjb21tZW5kQmF0Y2hSZXNwb25zZRIjCgZyZXN1bHQYASADKAsyEy5xZHJhbnQuQmF0Y2hSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJyChBEaXNjb3ZlclJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5TY29yZWRQb2ludBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIncKFURpc2NvdmVyQmF0Y2hSZXNwb25zZRIjCgZyZXN1bHQYASADKAsyEy5xZHJhbnQuQmF0Y2hSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJ6ChdSZWNvbW1lbmRHcm91cHNSZXNwb25zZRIkCgZyZXN1bHQYASABKAsyFC5xZHJhbnQuR3JvdXBzUmVzdWx0EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UidgoTVXBkYXRlQmF0Y2hSZXNwb25zZRIkCgZyZXN1bHQYASADKAsyFC5xZHJhbnQuVXBkYXRlUmVzdWx0EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UiagoNRmFjZXRSZXNwb25zZRIeCgRoaXRzGAEgAygLMhAucWRyYW50LkZhY2V0SGl0EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UigQEKGVNlYXJjaE1hdHJpeFBhaXJzUmVzcG9uc2USKQoGcmVzdWx0GAEgASgLMhkucWRyYW50LlNlYXJjaE1hdHJpeFBhaXJzEgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UihQEKG1NlYXJjaE1hdHJpeE9mZnNldHNSZXNwb25zZRIrCgZyZXN1bHQYASABKAsyGy5xZHJhbnQuU2VhcmNoTWF0cml4T2Zmc2V0cxIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlInUKDlBvaW50c1NlbGVjdG9yEicKBnBvaW50cxgBIAEoCzIVLnFkcmFudC5Qb2ludHNJZHNMaXN0SAASIAoGZmlsdGVyGAIgASgLMg4ucWRyYW50LkZpbHRlckgAQhgKFnBvaW50c19zZWxlY3Rvcl9vbmVfb2YiLQoNUG9pbnRzSWRzTGlzdBIcCgNpZHMYASADKAsyDy5xZHJhbnQuUG9pbnRJZCLVAQoLUG9pbnRTdHJ1Y3QSGwoCaWQYASABKAsyDy5xZHJhbnQuUG9pbnRJZBIxCgdwYXlsb2FkGAMgAygLMiAucWRyYW50LlBvaW50U3RydWN0LlBheWxvYWRFbnRyeRIlCgd2ZWN0b3JzGAQgASgLMg8ucWRyYW50LlZlY3RvcnNIAIgBARo9CgxQYXlsb2FkRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUIKCghfdmVjdG9yc0oECAIQAyKAAQoFVXNhZ2USLAoIaGFyZHdhcmUYASABKAsyFS5xZHJhbnQuSGFyZHdhcmVVc2FnZUgAiAEBEi4KCWluZmVyZW5jZRgCIAEoCzIWLnFkcmFudC5JbmZlcmVuY2VVc2FnZUgBiAEBQgsKCV9oYXJkd2FyZUIMCgpfaW5mZXJlbmNlIocBCg5JbmZlcmVuY2VVc2FnZRIyCgZtb2RlbHMYASADKAsyIi5xZHJhbnQuSW5mZXJlbmNlVXNhZ2UuTW9kZWxzRW50cnkaQQoLTW9kZWxzRW50cnkSCwoDa2V5GAEgASgJEiEKBXZhbHVlGAIgASgLMhIucWRyYW50Lk1vZGVsVXNhZ2U6AjgBIhwKCk1vZGVsVXNhZ2USDgoGdG9rZW5zGAEgASgEIr8BCg1IYXJkd2FyZVVzYWdlEgsKA2NwdRgBIAEoBBIXCg9wYXlsb2FkX2lvX3JlYWQYAiABKAQSGAoQcGF5bG9hZF9pb193cml0ZRgDIAEoBBIdChVwYXlsb2FkX2luZGV4X2lvX3JlYWQYBCABKAQSHgoWcGF5bG9hZF9pbmRleF9pb193cml0ZRgFIAEoBBIWCg52ZWN0b3JfaW9fcmVhZBgGIAEoBBIXCg92ZWN0b3JfaW9fd3JpdGUYByABKAQqNQoRV3JpdGVPcmRlcmluZ1R5cGUSCAoEV2VhaxAAEgoKBk1lZGl1bRABEgoKBlN0cm9uZxACKjgKE1JlYWRDb25zaXN0ZW5jeVR5cGUSBwoDQWxsEAASDAoITWFqb3JpdHkQARIKCgZRdW9ydW0QAiqtAQoJRmllbGRUeXBlEhQKEEZpZWxkVHlwZUtleXdvcmQQABIUChBGaWVsZFR5cGVJbnRlZ2VyEAESEgoORmllbGRUeXBlRmxvYXQQAhIQCgxGaWVsZFR5cGVHZW8QAxIRCg1GaWVsZFR5cGVUZXh0EAQSEQoNRmllbGRUeXBlQm9vbBAFEhUKEUZpZWxkVHlwZURhdGV0aW1lEAYSEQoNRmllbGRUeXBlVXVpZBAHKh4KCURpcmVjdGlvbhIHCgNBc2MQABIICgREZXNjEAEqRAoRUmVjb21tZW5kU3RyYXRlZ3kSEQoNQXZlcmFnZVZlY3RvchAAEg0KCUJlc3RTY29yZRABEg0KCVN1bVNjb3JlcxACKhsKBkZ1c2lvbhIHCgNSUkYQABIICgREQlNGEAEqFAoGU2FtcGxlEgoKBlJhbmRvbRAAKlsKDFVwZGF0ZVN0YXR1cxIXChNVbmtub3duVXBkYXRlU3RhdHVzEAASEAoMQWNrbm93bGVkZ2VkEAESDQoJQ29tcGxldGVkEAISEQoNQ2xvY2tSZWplY3RlZBADQhWqAhJRZHJhbnQuQ2xpZW50LkdycGNiBnByb3RvMw", [file_collections, file_common, file_google_protobuf_timestamp, file_json_with_int]); + fileDesc("Cgxwb2ludHMucHJvdG8SBnFkcmFudCI4Cg1Xcml0ZU9yZGVyaW5nEicKBHR5cGUYASABKA4yGS5xZHJhbnQuV3JpdGVPcmRlcmluZ1R5cGUiWQoPUmVhZENvbnNpc3RlbmN5EisKBHR5cGUYASABKA4yGy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5VHlwZUgAEhAKBmZhY3RvchgCIAEoBEgAQgcKBXZhbHVlIh0KDVNwYXJzZUluZGljZXMSDAoEZGF0YRgBIAMoDSKWAQoIRG9jdW1lbnQSDAoEdGV4dBgBIAEoCRINCgVtb2RlbBgDIAEoCRIuCgdvcHRpb25zGAQgAygLMh0ucWRyYW50LkRvY3VtZW50Lk9wdGlvbnNFbnRyeRo9CgxPcHRpb25zRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4ASKgAQoFSW1hZ2USHAoFaW1hZ2UYASABKAsyDS5xZHJhbnQuVmFsdWUSDQoFbW9kZWwYAiABKAkSKwoHb3B0aW9ucxgDIAMoCzIaLnFkcmFudC5JbWFnZS5PcHRpb25zRW50cnkaPQoMT3B0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAEitQEKD0luZmVyZW5jZU9iamVjdBIdCgZvYmplY3QYASABKAsyDS5xZHJhbnQuVmFsdWUSDQoFbW9kZWwYAiABKAkSNQoHb3B0aW9ucxgDIAMoCzIkLnFkcmFudC5JbmZlcmVuY2VPYmplY3QuT3B0aW9uc0VudHJ5Gj0KDE9wdGlvbnNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBIoMDCgZWZWN0b3ISEAoEZGF0YRgBIAMoAkICGAESLwoHaW5kaWNlcxgCIAEoCzIVLnFkcmFudC5TcGFyc2VJbmRpY2VzQgIYAUgBiAEBEh4KDXZlY3RvcnNfY291bnQYAyABKA1CAhgBSAKIAQESJAoFZGVuc2UYZSABKAsyEy5xZHJhbnQuRGVuc2VWZWN0b3JIABImCgZzcGFyc2UYZiABKAsyFC5xZHJhbnQuU3BhcnNlVmVjdG9ySAASLwoLbXVsdGlfZGVuc2UYZyABKAsyGC5xZHJhbnQuTXVsdGlEZW5zZVZlY3RvckgAEiQKCGRvY3VtZW50GGggASgLMhAucWRyYW50LkRvY3VtZW50SAASHgoFaW1hZ2UYaSABKAsyDS5xZHJhbnQuSW1hZ2VIABIpCgZvYmplY3QYaiABKAsyFy5xZHJhbnQuSW5mZXJlbmNlT2JqZWN0SABCCAoGdmVjdG9yQgoKCF9pbmRpY2VzQhAKDl92ZWN0b3JzX2NvdW50IpgCCgxWZWN0b3JPdXRwdXQSEAoEZGF0YRgBIAMoAkICGAESLwoHaW5kaWNlcxgCIAEoCzIVLnFkcmFudC5TcGFyc2VJbmRpY2VzQgIYAUgBiAEBEh4KDXZlY3RvcnNfY291bnQYAyABKA1CAhgBSAKIAQESJAoFZGVuc2UYZSABKAsyEy5xZHJhbnQuRGVuc2VWZWN0b3JIABImCgZzcGFyc2UYZiABKAsyFC5xZHJhbnQuU3BhcnNlVmVjdG9ySAASLwoLbXVsdGlfZGVuc2UYZyABKAsyGC5xZHJhbnQuTXVsdGlEZW5zZVZlY3RvckgAQggKBnZlY3RvckIKCghfaW5kaWNlc0IQCg5fdmVjdG9yc19jb3VudCIbCgtEZW5zZVZlY3RvchIMCgRkYXRhGAEgAygCIi8KDFNwYXJzZVZlY3RvchIOCgZ2YWx1ZXMYASADKAISDwoHaW5kaWNlcxgCIAMoDSI4ChBNdWx0aURlbnNlVmVjdG9yEiQKB3ZlY3RvcnMYASADKAsyEy5xZHJhbnQuRGVuc2VWZWN0b3IipwIKC1ZlY3RvcklucHV0Eh0KAmlkGAEgASgLMg8ucWRyYW50LlBvaW50SWRIABIkCgVkZW5zZRgCIAEoCzITLnFkcmFudC5EZW5zZVZlY3RvckgAEiYKBnNwYXJzZRgDIAEoCzIULnFkcmFudC5TcGFyc2VWZWN0b3JIABIvCgttdWx0aV9kZW5zZRgEIAEoCzIYLnFkcmFudC5NdWx0aURlbnNlVmVjdG9ySAASJAoIZG9jdW1lbnQYBSABKAsyEC5xZHJhbnQuRG9jdW1lbnRIABIeCgVpbWFnZRgGIAEoCzINLnFkcmFudC5JbWFnZUgAEikKBm9iamVjdBgHIAEoCzIXLnFkcmFudC5JbmZlcmVuY2VPYmplY3RIAEIJCgd2YXJpYW50Im4KEFNoYXJkS2V5U2VsZWN0b3ISJAoKc2hhcmRfa2V5cxgBIAMoCzIQLnFkcmFudC5TaGFyZEtleRInCghmYWxsYmFjaxgCIAEoCzIQLnFkcmFudC5TaGFyZEtleUgAiAEBQgsKCV9mYWxsYmFjayKTAwoMVXBzZXJ0UG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIRCgR3YWl0GAIgASgISACIAQESIwoGcG9pbnRzGAMgAygLMhMucWRyYW50LlBvaW50U3RydWN0EiwKCG9yZGVyaW5nGAQgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYBSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgCiAEBEioKDXVwZGF0ZV9maWx0ZXIYBiABKAsyDi5xZHJhbnQuRmlsdGVySAOIAQESFAoHdGltZW91dBgHIAEoBEgEiAEBEiwKC3VwZGF0ZV9tb2RlGAggASgOMhIucWRyYW50LlVwZGF0ZU1vZGVIBYgBAUIHCgVfd2FpdEILCglfb3JkZXJpbmdCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIQCg5fdXBkYXRlX2ZpbHRlckIKCghfdGltZW91dEIOCgxfdXBkYXRlX21vZGUimgIKDERlbGV0ZVBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEiYKBnBvaW50cxgDIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvchIsCghvcmRlcmluZxgEIAEoCzIVLnFkcmFudC5Xcml0ZU9yZGVyaW5nSAGIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAUgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAogBARIUCgd0aW1lb3V0GAYgASgESAOIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCCgoIX3RpbWVvdXQihQMKCUdldFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSHAoDaWRzGAIgAygLMg8ucWRyYW50LlBvaW50SWQSMQoMd2l0aF9wYXlsb2FkGAQgASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3ISNgoMd2l0aF92ZWN0b3JzGAUgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIAIgBARI2ChByZWFkX2NvbnNpc3RlbmN5GAYgASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgBiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgHIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAKIAQESFAoHdGltZW91dBgIIAEoBEgDiAEBQg8KDV93aXRoX3ZlY3RvcnNCEwoRX3JlYWRfY29uc2lzdGVuY3lCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIKCghfdGltZW91dEoECAMQBCLcAgoSVXBkYXRlUG9pbnRWZWN0b3JzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIRCgR3YWl0GAIgASgISACIAQESJAoGcG9pbnRzGAMgAygLMhQucWRyYW50LlBvaW50VmVjdG9ycxIsCghvcmRlcmluZxgEIAEoCzIVLnFkcmFudC5Xcml0ZU9yZGVyaW5nSAGIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAUgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAogBARIqCg11cGRhdGVfZmlsdGVyGAYgASgLMg4ucWRyYW50LkZpbHRlckgDiAEBEhQKB3RpbWVvdXQYByABKARIBIgBAUIHCgVfd2FpdEILCglfb3JkZXJpbmdCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIQCg5fdXBkYXRlX2ZpbHRlckIKCghfdGltZW91dCJNCgxQb2ludFZlY3RvcnMSGwoCaWQYASABKAsyDy5xZHJhbnQuUG9pbnRJZBIgCgd2ZWN0b3JzGAIgASgLMg8ucWRyYW50LlZlY3RvcnMi0wIKEkRlbGV0ZVBvaW50VmVjdG9ycxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEi8KD3BvaW50c19zZWxlY3RvchgDIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvchIoCgd2ZWN0b3JzGAQgASgLMhcucWRyYW50LlZlY3RvcnNTZWxlY3RvchIsCghvcmRlcmluZxgFIAEoCzIVLnFkcmFudC5Xcml0ZU9yZGVyaW5nSAGIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAYgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAogBARIUCgd0aW1lb3V0GAcgASgESAOIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCCgoIX3RpbWVvdXQi1wMKEFNldFBheWxvYWRQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARI2CgdwYXlsb2FkGAMgAygLMiUucWRyYW50LlNldFBheWxvYWRQb2ludHMuUGF5bG9hZEVudHJ5EjQKD3BvaW50c19zZWxlY3RvchgFIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckgBiAEBEiwKCG9yZGVyaW5nGAYgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAogBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYByABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgDiAEBEhAKA2tleRgIIAEoCUgEiAEBEhQKB3RpbWVvdXQYCSABKARIBYgBARo9CgxQYXlsb2FkRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUIHCgVfd2FpdEISChBfcG9pbnRzX3NlbGVjdG9yQgsKCV9vcmRlcmluZ0IVChNfc2hhcmRfa2V5X3NlbGVjdG9yQgYKBF9rZXlCCgoIX3RpbWVvdXRKBAgEEAUi1wIKE0RlbGV0ZVBheWxvYWRQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARIMCgRrZXlzGAMgAygJEjQKD3BvaW50c19zZWxlY3RvchgFIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckgBiAEBEiwKCG9yZGVyaW5nGAYgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAogBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYByABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgDiAEBEhQKB3RpbWVvdXQYCCABKARIBIgBAUIHCgVfd2FpdEISChBfcG9pbnRzX3NlbGVjdG9yQgsKCV9vcmRlcmluZ0IVChNfc2hhcmRfa2V5X3NlbGVjdG9yQgoKCF90aW1lb3V0SgQIBBAFIqACChJDbGVhclBheWxvYWRQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARImCgZwb2ludHMYAyABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3ISLAoIb3JkZXJpbmcYBCABKAsyFS5xZHJhbnQuV3JpdGVPcmRlcmluZ0gBiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgFIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAKIAQESFAoHdGltZW91dBgGIAEoBEgDiAEBQgcKBV93YWl0QgsKCV9vcmRlcmluZ0IVChNfc2hhcmRfa2V5X3NlbGVjdG9yQgoKCF90aW1lb3V0ItECChpDcmVhdGVGaWVsZEluZGV4Q29sbGVjdGlvbhIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEhIKCmZpZWxkX25hbWUYAyABKAkSKgoKZmllbGRfdHlwZRgEIAEoDjIRLnFkcmFudC5GaWVsZFR5cGVIAYgBARI7ChJmaWVsZF9pbmRleF9wYXJhbXMYBSABKAsyGi5xZHJhbnQuUGF5bG9hZEluZGV4UGFyYW1zSAKIAQESLAoIb3JkZXJpbmcYBiABKAsyFS5xZHJhbnQuV3JpdGVPcmRlcmluZ0gDiAEBEhQKB3RpbWVvdXQYByABKARIBIgBAUIHCgVfd2FpdEINCgtfZmllbGRfdHlwZUIVChNfZmllbGRfaW5kZXhfcGFyYW1zQgsKCV9vcmRlcmluZ0IKCghfdGltZW91dCLCAQoaRGVsZXRlRmllbGRJbmRleENvbGxlY3Rpb24SFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEhEKBHdhaXQYAiABKAhIAIgBARISCgpmaWVsZF9uYW1lGAMgASgJEiwKCG9yZGVyaW5nGAQgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAYgBARIUCgd0aW1lb3V0GAUgASgESAKIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQgoKCF90aW1lb3V0IigKFlBheWxvYWRJbmNsdWRlU2VsZWN0b3ISDgoGZmllbGRzGAEgAygJIigKFlBheWxvYWRFeGNsdWRlU2VsZWN0b3ISDgoGZmllbGRzGAEgAygJIqEBChNXaXRoUGF5bG9hZFNlbGVjdG9yEhAKBmVuYWJsZRgBIAEoCEgAEjEKB2luY2x1ZGUYAiABKAsyHi5xZHJhbnQuUGF5bG9hZEluY2x1ZGVTZWxlY3RvckgAEjEKB2V4Y2x1ZGUYAyABKAsyHi5xZHJhbnQuUGF5bG9hZEV4Y2x1ZGVTZWxlY3RvckgAQhIKEHNlbGVjdG9yX29wdGlvbnMiggEKDE5hbWVkVmVjdG9ycxIyCgd2ZWN0b3JzGAEgAygLMiEucWRyYW50Lk5hbWVkVmVjdG9ycy5WZWN0b3JzRW50cnkaPgoMVmVjdG9yc0VudHJ5EgsKA2tleRgBIAEoCRIdCgV2YWx1ZRgCIAEoCzIOLnFkcmFudC5WZWN0b3I6AjgBIpQBChJOYW1lZFZlY3RvcnNPdXRwdXQSOAoHdmVjdG9ycxgBIAMoCzInLnFkcmFudC5OYW1lZFZlY3RvcnNPdXRwdXQuVmVjdG9yc0VudHJ5GkQKDFZlY3RvcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5xZHJhbnQuVmVjdG9yT3V0cHV0OgI4ASJnCgdWZWN0b3JzEiAKBnZlY3RvchgBIAEoCzIOLnFkcmFudC5WZWN0b3JIABInCgd2ZWN0b3JzGAIgASgLMhQucWRyYW50Lk5hbWVkVmVjdG9yc0gAQhEKD3ZlY3RvcnNfb3B0aW9ucyJ5Cg1WZWN0b3JzT3V0cHV0EiYKBnZlY3RvchgBIAEoCzIULnFkcmFudC5WZWN0b3JPdXRwdXRIABItCgd2ZWN0b3JzGAIgASgLMhoucWRyYW50Lk5hbWVkVmVjdG9yc091dHB1dEgAQhEKD3ZlY3RvcnNfb3B0aW9ucyIgCg9WZWN0b3JzU2VsZWN0b3ISDQoFbmFtZXMYASADKAkiZwoTV2l0aFZlY3RvcnNTZWxlY3RvchIQCgZlbmFibGUYASABKAhIABIqCgdpbmNsdWRlGAIgASgLMhcucWRyYW50LlZlY3RvcnNTZWxlY3RvckgAQhIKEHNlbGVjdG9yX29wdGlvbnMiiAEKGFF1YW50aXphdGlvblNlYXJjaFBhcmFtcxITCgZpZ25vcmUYASABKAhIAIgBARIUCgdyZXNjb3JlGAIgASgISAGIAQESGQoMb3ZlcnNhbXBsaW5nGAMgASgBSAKIAQFCCQoHX2lnbm9yZUIKCghfcmVzY29yZUIPCg1fb3ZlcnNhbXBsaW5nImUKEUFjb3JuU2VhcmNoUGFyYW1zEhMKBmVuYWJsZRgBIAEoCEgAiAEBEhwKD21heF9zZWxlY3Rpdml0eRgCIAEoAUgBiAEBQgkKB19lbmFibGVCEgoQX21heF9zZWxlY3Rpdml0eSKBAgoMU2VhcmNoUGFyYW1zEhQKB2huc3dfZWYYASABKARIAIgBARISCgVleGFjdBgCIAEoCEgBiAEBEjsKDHF1YW50aXphdGlvbhgDIAEoCzIgLnFkcmFudC5RdWFudGl6YXRpb25TZWFyY2hQYXJhbXNIAogBARIZCgxpbmRleGVkX29ubHkYBCABKAhIA4gBARItCgVhY29ybhgFIAEoCzIZLnFkcmFudC5BY29yblNlYXJjaFBhcmFtc0gEiAEBQgoKCF9obnN3X2VmQggKBl9leGFjdEIPCg1fcXVhbnRpemF0aW9uQg8KDV9pbmRleGVkX29ubHlCCAoGX2Fjb3JuIpIFCgxTZWFyY2hQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEg4KBnZlY3RvchgCIAMoAhIeCgZmaWx0ZXIYAyABKAsyDi5xZHJhbnQuRmlsdGVyEg0KBWxpbWl0GAQgASgEEjEKDHdpdGhfcGF5bG9hZBgGIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9yEiQKBnBhcmFtcxgHIAEoCzIULnFkcmFudC5TZWFyY2hQYXJhbXMSHAoPc2NvcmVfdGhyZXNob2xkGAggASgCSACIAQESEwoGb2Zmc2V0GAkgASgESAGIAQESGAoLdmVjdG9yX25hbWUYCiABKAlIAogBARI2Cgx3aXRoX3ZlY3RvcnMYCyABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgDiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYDCABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SASIAQESFAoHdGltZW91dBgNIAEoBEgFiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgOIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAaIAQESMgoOc3BhcnNlX2luZGljZXMYDyABKAsyFS5xZHJhbnQuU3BhcnNlSW5kaWNlc0gHiAEBQhIKEF9zY29yZV90aHJlc2hvbGRCCQoHX29mZnNldEIOCgxfdmVjdG9yX25hbWVCDwoNX3dpdGhfdmVjdG9yc0ITChFfcmVhZF9jb25zaXN0ZW5jeUIKCghfdGltZW91dEIVChNfc2hhcmRfa2V5X3NlbGVjdG9yQhEKD19zcGFyc2VfaW5kaWNlc0oECAUQBiLIAQoRU2VhcmNoQmF0Y2hQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEisKDXNlYXJjaF9wb2ludHMYAiADKAsyFC5xZHJhbnQuU2VhcmNoUG9pbnRzEjYKEHJlYWRfY29uc2lzdGVuY3kYAyABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SACIAQESFAoHdGltZW91dBgEIAEoBEgBiAEBQhMKEV9yZWFkX2NvbnNpc3RlbmN5QgoKCF90aW1lb3V0IrIBCgpXaXRoTG9va3VwEhIKCmNvbGxlY3Rpb24YASABKAkSNgoMd2l0aF9wYXlsb2FkGAIgASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3JIAIgBARI2Cgx3aXRoX3ZlY3RvcnMYAyABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgBiAEBQg8KDV93aXRoX3BheWxvYWRCDwoNX3dpdGhfdmVjdG9ycyLVBQoRU2VhcmNoUG9pbnRHcm91cHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEg4KBnZlY3RvchgCIAMoAhIeCgZmaWx0ZXIYAyABKAsyDi5xZHJhbnQuRmlsdGVyEg0KBWxpbWl0GAQgASgNEjEKDHdpdGhfcGF5bG9hZBgFIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9yEiQKBnBhcmFtcxgGIAEoCzIULnFkcmFudC5TZWFyY2hQYXJhbXMSHAoPc2NvcmVfdGhyZXNob2xkGAcgASgCSACIAQESGAoLdmVjdG9yX25hbWUYCCABKAlIAYgBARI2Cgx3aXRoX3ZlY3RvcnMYCSABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgCiAEBEhAKCGdyb3VwX2J5GAogASgJEhIKCmdyb3VwX3NpemUYCyABKA0SNgoQcmVhZF9jb25zaXN0ZW5jeRgMIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIA4gBARIsCgt3aXRoX2xvb2t1cBgNIAEoCzISLnFkcmFudC5XaXRoTG9va3VwSASIAQESFAoHdGltZW91dBgOIAEoBEgFiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgPIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAaIAQESMgoOc3BhcnNlX2luZGljZXMYECABKAsyFS5xZHJhbnQuU3BhcnNlSW5kaWNlc0gHiAEBQhIKEF9zY29yZV90aHJlc2hvbGRCDgoMX3ZlY3Rvcl9uYW1lQg8KDV93aXRoX3ZlY3RvcnNCEwoRX3JlYWRfY29uc2lzdGVuY3lCDgoMX3dpdGhfbG9va3VwQgoKCF90aW1lb3V0QhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCEQoPX3NwYXJzZV9pbmRpY2VzIn0KCVN0YXJ0RnJvbRIPCgVmbG9hdBgBIAEoAUgAEhEKB2ludGVnZXIYAiABKANIABIvCgl0aW1lc3RhbXAYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAASEgoIZGF0ZXRpbWUYBCABKAlIAEIHCgV2YWx1ZSKKAQoHT3JkZXJCeRILCgNrZXkYASABKAkSKQoJZGlyZWN0aW9uGAIgASgOMhEucWRyYW50LkRpcmVjdGlvbkgAiAEBEioKCnN0YXJ0X2Zyb20YAyABKAsyES5xZHJhbnQuU3RhcnRGcm9tSAGIAQFCDAoKX2RpcmVjdGlvbkINCgtfc3RhcnRfZnJvbSKOBAoMU2Nyb2xsUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIeCgZmaWx0ZXIYAiABKAsyDi5xZHJhbnQuRmlsdGVyEiQKBm9mZnNldBgDIAEoCzIPLnFkcmFudC5Qb2ludElkSACIAQESEgoFbGltaXQYBCABKA1IAYgBARIxCgx3aXRoX3BheWxvYWQYBiABKAsyGy5xZHJhbnQuV2l0aFBheWxvYWRTZWxlY3RvchI2Cgx3aXRoX3ZlY3RvcnMYByABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgCiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYCCABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAOIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAkgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIBIgBARImCghvcmRlcl9ieRgKIAEoCzIPLnFkcmFudC5PcmRlckJ5SAWIAQESFAoHdGltZW91dBgLIAEoBEgGiAEBQgkKB19vZmZzZXRCCAoGX2xpbWl0Qg8KDV93aXRoX3ZlY3RvcnNCEwoRX3JlYWRfY29uc2lzdGVuY3lCFQoTX3NoYXJkX2tleV9zZWxlY3RvckILCglfb3JkZXJfYnlCCgoIX3RpbWVvdXRKBAgFEAYipQEKDkxvb2t1cExvY2F0aW9uEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIYCgt2ZWN0b3JfbmFtZRgCIAEoCUgAiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgDIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAGIAQFCDgoMX3ZlY3Rvcl9uYW1lQhUKE19zaGFyZF9rZXlfc2VsZWN0b3IizQYKD1JlY29tbWVuZFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSIQoIcG9zaXRpdmUYAiADKAsyDy5xZHJhbnQuUG9pbnRJZBIhCghuZWdhdGl2ZRgDIAMoCzIPLnFkcmFudC5Qb2ludElkEh4KBmZpbHRlchgEIAEoCzIOLnFkcmFudC5GaWx0ZXISDQoFbGltaXQYBSABKAQSMQoMd2l0aF9wYXlsb2FkGAcgASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3ISJAoGcGFyYW1zGAggASgLMhQucWRyYW50LlNlYXJjaFBhcmFtcxIcCg9zY29yZV90aHJlc2hvbGQYCSABKAJIAIgBARITCgZvZmZzZXQYCiABKARIAYgBARISCgV1c2luZxgLIAEoCUgCiAEBEjYKDHdpdGhfdmVjdG9ycxgMIAEoCzIbLnFkcmFudC5XaXRoVmVjdG9yc1NlbGVjdG9ySAOIAQESMAoLbG9va3VwX2Zyb20YDSABKAsyFi5xZHJhbnQuTG9va3VwTG9jYXRpb25IBIgBARI2ChByZWFkX2NvbnNpc3RlbmN5GA4gASgLMhcucWRyYW50LlJlYWRDb25zaXN0ZW5jeUgFiAEBEjAKCHN0cmF0ZWd5GBAgASgOMhkucWRyYW50LlJlY29tbWVuZFN0cmF0ZWd5SAaIAQESKAoQcG9zaXRpdmVfdmVjdG9ycxgRIAMoCzIOLnFkcmFudC5WZWN0b3ISKAoQbmVnYXRpdmVfdmVjdG9ycxgSIAMoCzIOLnFkcmFudC5WZWN0b3ISFAoHdGltZW91dBgTIAEoBEgHiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgUIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAiIAQFCEgoQX3Njb3JlX3RocmVzaG9sZEIJCgdfb2Zmc2V0QggKBl91c2luZ0IPCg1fd2l0aF92ZWN0b3JzQg4KDF9sb29rdXBfZnJvbUITChFfcmVhZF9jb25zaXN0ZW5jeUILCglfc3RyYXRlZ3lCCgoIX3RpbWVvdXRCFQoTX3NoYXJkX2tleV9zZWxlY3RvckoECAYQByLRAQoUUmVjb21tZW5kQmF0Y2hQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEjEKEHJlY29tbWVuZF9wb2ludHMYAiADKAsyFy5xZHJhbnQuUmVjb21tZW5kUG9pbnRzEjYKEHJlYWRfY29uc2lzdGVuY3kYAyABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SACIAQESFAoHdGltZW91dBgEIAEoBEgBiAEBQhMKEV9yZWFkX2NvbnNpc3RlbmN5QgoKCF90aW1lb3V0IpAHChRSZWNvbW1lbmRQb2ludEdyb3VwcxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSIQoIcG9zaXRpdmUYAiADKAsyDy5xZHJhbnQuUG9pbnRJZBIhCghuZWdhdGl2ZRgDIAMoCzIPLnFkcmFudC5Qb2ludElkEh4KBmZpbHRlchgEIAEoCzIOLnFkcmFudC5GaWx0ZXISDQoFbGltaXQYBSABKA0SMQoMd2l0aF9wYXlsb2FkGAYgASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3ISJAoGcGFyYW1zGAcgASgLMhQucWRyYW50LlNlYXJjaFBhcmFtcxIcCg9zY29yZV90aHJlc2hvbGQYCCABKAJIAIgBARISCgV1c2luZxgJIAEoCUgBiAEBEjYKDHdpdGhfdmVjdG9ycxgKIAEoCzIbLnFkcmFudC5XaXRoVmVjdG9yc1NlbGVjdG9ySAKIAQESMAoLbG9va3VwX2Zyb20YCyABKAsyFi5xZHJhbnQuTG9va3VwTG9jYXRpb25IA4gBARIQCghncm91cF9ieRgMIAEoCRISCgpncm91cF9zaXplGA0gASgNEjYKEHJlYWRfY29uc2lzdGVuY3kYDiABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SASIAQESLAoLd2l0aF9sb29rdXAYDyABKAsyEi5xZHJhbnQuV2l0aExvb2t1cEgFiAEBEjAKCHN0cmF0ZWd5GBEgASgOMhkucWRyYW50LlJlY29tbWVuZFN0cmF0ZWd5SAaIAQESKAoQcG9zaXRpdmVfdmVjdG9ycxgSIAMoCzIOLnFkcmFudC5WZWN0b3ISKAoQbmVnYXRpdmVfdmVjdG9ycxgTIAMoCzIOLnFkcmFudC5WZWN0b3ISFAoHdGltZW91dBgUIAEoBEgHiAEBEjkKEnNoYXJkX2tleV9zZWxlY3RvchgVIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySAiIAQFCEgoQX3Njb3JlX3RocmVzaG9sZEIICgZfdXNpbmdCDwoNX3dpdGhfdmVjdG9yc0IOCgxfbG9va3VwX2Zyb21CEwoRX3JlYWRfY29uc2lzdGVuY3lCDgoMX3dpdGhfbG9va3VwQgsKCV9zdHJhdGVneUIKCghfdGltZW91dEIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIkEKDFRhcmdldFZlY3RvchInCgZzaW5nbGUYASABKAsyFS5xZHJhbnQuVmVjdG9yRXhhbXBsZUgAQggKBnRhcmdldCJbCg1WZWN0b3JFeGFtcGxlEh0KAmlkGAEgASgLMg8ucWRyYW50LlBvaW50SWRIABIgCgZ2ZWN0b3IYAiABKAsyDi5xZHJhbnQuVmVjdG9ySABCCQoHZXhhbXBsZSJmChJDb250ZXh0RXhhbXBsZVBhaXISJwoIcG9zaXRpdmUYASABKAsyFS5xZHJhbnQuVmVjdG9yRXhhbXBsZRInCghuZWdhdGl2ZRgCIAEoCzIVLnFkcmFudC5WZWN0b3JFeGFtcGxlIo4FCg5EaXNjb3ZlclBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSJAoGdGFyZ2V0GAIgASgLMhQucWRyYW50LlRhcmdldFZlY3RvchIrCgdjb250ZXh0GAMgAygLMhoucWRyYW50LkNvbnRleHRFeGFtcGxlUGFpchIeCgZmaWx0ZXIYBCABKAsyDi5xZHJhbnQuRmlsdGVyEg0KBWxpbWl0GAUgASgEEjEKDHdpdGhfcGF5bG9hZBgGIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9yEiQKBnBhcmFtcxgHIAEoCzIULnFkcmFudC5TZWFyY2hQYXJhbXMSEwoGb2Zmc2V0GAggASgESACIAQESEgoFdXNpbmcYCSABKAlIAYgBARI2Cgx3aXRoX3ZlY3RvcnMYCiABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgCiAEBEjAKC2xvb2t1cF9mcm9tGAsgASgLMhYucWRyYW50Lkxvb2t1cExvY2F0aW9uSAOIAQESNgoQcmVhZF9jb25zaXN0ZW5jeRgMIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIBIgBARIUCgd0aW1lb3V0GA0gASgESAWIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGA4gASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIBogBAUIJCgdfb2Zmc2V0QggKBl91c2luZ0IPCg1fd2l0aF92ZWN0b3JzQg4KDF9sb29rdXBfZnJvbUITChFfcmVhZF9jb25zaXN0ZW5jeUIKCghfdGltZW91dEIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIs4BChNEaXNjb3ZlckJhdGNoUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIvCg9kaXNjb3Zlcl9wb2ludHMYAiADKAsyFi5xZHJhbnQuRGlzY292ZXJQb2ludHMSNgoQcmVhZF9jb25zaXN0ZW5jeRgDIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIAIgBARIUCgd0aW1lb3V0GAQgASgESAGIAQFCEwoRX3JlYWRfY29uc2lzdGVuY3lCCgoIX3RpbWVvdXQipQIKC0NvdW50UG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIeCgZmaWx0ZXIYAiABKAsyDi5xZHJhbnQuRmlsdGVyEhIKBWV4YWN0GAMgASgISACIAQESNgoQcmVhZF9jb25zaXN0ZW5jeRgEIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIAYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYBSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgCiAEBEhQKB3RpbWVvdXQYBiABKARIA4gBAUIICgZfZXhhY3RCEwoRX3JlYWRfY29uc2lzdGVuY3lCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIKCghfdGltZW91dCKdAQoOUmVjb21tZW5kSW5wdXQSJQoIcG9zaXRpdmUYASADKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSJQoIbmVnYXRpdmUYAiADKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSMAoIc3RyYXRlZ3kYAyABKA4yGS5xZHJhbnQuUmVjb21tZW5kU3RyYXRlZ3lIAIgBAUILCglfc3RyYXRlZ3kiYAoQQ29udGV4dElucHV0UGFpchIlCghwb3NpdGl2ZRgBIAEoCzITLnFkcmFudC5WZWN0b3JJbnB1dBIlCghuZWdhdGl2ZRgCIAEoCzITLnFkcmFudC5WZWN0b3JJbnB1dCJbCg1EaXNjb3ZlcklucHV0EiMKBnRhcmdldBgBIAEoCzITLnFkcmFudC5WZWN0b3JJbnB1dBIlCgdjb250ZXh0GAIgASgLMhQucWRyYW50LkNvbnRleHRJbnB1dCI3CgxDb250ZXh0SW5wdXQSJwoFcGFpcnMYASADKAsyGC5xZHJhbnQuQ29udGV4dElucHV0UGFpciKRAQoWUmVsZXZhbmNlRmVlZGJhY2tJbnB1dBIjCgZ0YXJnZXQYASABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSJgoIZmVlZGJhY2sYAiADKAsyFC5xZHJhbnQuRmVlZGJhY2tJdGVtEioKCHN0cmF0ZWd5GAMgASgLMhgucWRyYW50LkZlZWRiYWNrU3RyYXRlZ3kiQwoMRmVlZGJhY2tJdGVtEiQKB2V4YW1wbGUYASABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXQSDQoFc2NvcmUYAiABKAIiTQoQRmVlZGJhY2tTdHJhdGVneRIuCgVuYWl2ZRgBIAEoCzIdLnFkcmFudC5OYWl2ZUZlZWRiYWNrU3RyYXRlZ3lIAEIJCgd2YXJpYW50IjgKFU5haXZlRmVlZGJhY2tTdHJhdGVneRIJCgFhGAEgASgCEgkKAWIYAiABKAISCQoBYxgDIAEoAiKiAQoHRm9ybXVsYRImCgpleHByZXNzaW9uGAEgASgLMhIucWRyYW50LkV4cHJlc3Npb24SLwoIZGVmYXVsdHMYAiADKAsyHS5xZHJhbnQuRm9ybXVsYS5EZWZhdWx0c0VudHJ5Gj4KDURlZmF1bHRzRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4ASLMBQoKRXhwcmVzc2lvbhISCghjb25zdGFudBgBIAEoAkgAEhIKCHZhcmlhYmxlGAIgASgJSAASJgoJY29uZGl0aW9uGAMgASgLMhEucWRyYW50LkNvbmRpdGlvbkgAEisKDGdlb19kaXN0YW5jZRgEIAEoCzITLnFkcmFudC5HZW9EaXN0YW5jZUgAEhIKCGRhdGV0aW1lGAUgASgJSAASFgoMZGF0ZXRpbWVfa2V5GAYgASgJSAASJgoEbXVsdBgHIAEoCzIWLnFkcmFudC5NdWx0RXhwcmVzc2lvbkgAEiQKA3N1bRgIIAEoCzIVLnFkcmFudC5TdW1FeHByZXNzaW9uSAASJAoDZGl2GAkgASgLMhUucWRyYW50LkRpdkV4cHJlc3Npb25IABIhCgNuZWcYCiABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbkgAEiEKA2FicxgLIAEoCzISLnFkcmFudC5FeHByZXNzaW9uSAASIgoEc3FydBgMIAEoCzISLnFkcmFudC5FeHByZXNzaW9uSAASJAoDcG93GA0gASgLMhUucWRyYW50LlBvd0V4cHJlc3Npb25IABIhCgNleHAYDiABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbkgAEiMKBWxvZzEwGA8gASgLMhIucWRyYW50LkV4cHJlc3Npb25IABIgCgJsbhgQIAEoCzISLnFkcmFudC5FeHByZXNzaW9uSAASMgoJZXhwX2RlY2F5GBEgASgLMh0ucWRyYW50LkRlY2F5UGFyYW1zRXhwcmVzc2lvbkgAEjQKC2dhdXNzX2RlY2F5GBIgASgLMh0ucWRyYW50LkRlY2F5UGFyYW1zRXhwcmVzc2lvbkgAEjIKCWxpbl9kZWNheRgTIAEoCzIdLnFkcmFudC5EZWNheVBhcmFtc0V4cHJlc3Npb25IAEIJCgd2YXJpYW50IjsKC0dlb0Rpc3RhbmNlEiAKBm9yaWdpbhgBIAEoCzIQLnFkcmFudC5HZW9Qb2ludBIKCgJ0bxgCIAEoCSIyCg5NdWx0RXhwcmVzc2lvbhIgCgRtdWx0GAEgAygLMhIucWRyYW50LkV4cHJlc3Npb24iMAoNU3VtRXhwcmVzc2lvbhIfCgNzdW0YASADKAsyEi5xZHJhbnQuRXhwcmVzc2lvbiKGAQoNRGl2RXhwcmVzc2lvbhIgCgRsZWZ0GAEgASgLMhIucWRyYW50LkV4cHJlc3Npb24SIQoFcmlnaHQYAiABKAsyEi5xZHJhbnQuRXhwcmVzc2lvbhIcCg9ieV96ZXJvX2RlZmF1bHQYAyABKAJIAIgBAUISChBfYnlfemVyb19kZWZhdWx0IlcKDVBvd0V4cHJlc3Npb24SIAoEYmFzZRgBIAEoCzISLnFkcmFudC5FeHByZXNzaW9uEiQKCGV4cG9uZW50GAIgASgLMhIucWRyYW50LkV4cHJlc3Npb24irAEKFURlY2F5UGFyYW1zRXhwcmVzc2lvbhIdCgF4GAEgASgLMhIucWRyYW50LkV4cHJlc3Npb24SJwoGdGFyZ2V0GAIgASgLMhIucWRyYW50LkV4cHJlc3Npb25IAIgBARISCgVzY2FsZRgDIAEoAkgBiAEBEhUKCG1pZHBvaW50GAQgASgCSAKIAQFCCQoHX3RhcmdldEIICgZfc2NhbGVCCwoJX21pZHBvaW50IlUKE05lYXJlc3RJbnB1dFdpdGhNbXISJAoHbmVhcmVzdBgBIAEoCzITLnFkcmFudC5WZWN0b3JJbnB1dBIYCgNtbXIYAiABKAsyCy5xZHJhbnQuTW1yIl8KA01tchIWCglkaXZlcnNpdHkYAiABKAJIAIgBARIdChBjYW5kaWRhdGVzX2xpbWl0GAMgASgNSAGIAQFCDAoKX2RpdmVyc2l0eUITChFfY2FuZGlkYXRlc19saW1pdCIsCgNScmYSDgoBaxgBIAEoDUgAiAEBEg8KB3dlaWdodHMYAiADKAJCBAoCX2si2wMKBVF1ZXJ5EiYKB25lYXJlc3QYASABKAsyEy5xZHJhbnQuVmVjdG9ySW5wdXRIABIrCglyZWNvbW1lbmQYAiABKAsyFi5xZHJhbnQuUmVjb21tZW5kSW5wdXRIABIpCghkaXNjb3ZlchgDIAEoCzIVLnFkcmFudC5EaXNjb3ZlcklucHV0SAASJwoHY29udGV4dBgEIAEoCzIULnFkcmFudC5Db250ZXh0SW5wdXRIABIjCghvcmRlcl9ieRgFIAEoCzIPLnFkcmFudC5PcmRlckJ5SAASIAoGZnVzaW9uGAYgASgOMg4ucWRyYW50LkZ1c2lvbkgAEiAKBnNhbXBsZRgHIAEoDjIOLnFkcmFudC5TYW1wbGVIABIiCgdmb3JtdWxhGAggASgLMg8ucWRyYW50LkZvcm11bGFIABI3ChBuZWFyZXN0X3dpdGhfbW1yGAkgASgLMhsucWRyYW50Lk5lYXJlc3RJbnB1dFdpdGhNbXJIABIaCgNycmYYCiABKAsyCy5xZHJhbnQuUnJmSAASPAoScmVsZXZhbmNlX2ZlZWRiYWNrGAsgASgLMh4ucWRyYW50LlJlbGV2YW5jZUZlZWRiYWNrSW5wdXRIAEIJCgd2YXJpYW50IvsCCg1QcmVmZXRjaFF1ZXJ5EicKCHByZWZldGNoGAEgAygLMhUucWRyYW50LlByZWZldGNoUXVlcnkSIQoFcXVlcnkYAiABKAsyDS5xZHJhbnQuUXVlcnlIAIgBARISCgV1c2luZxgDIAEoCUgBiAEBEiMKBmZpbHRlchgEIAEoCzIOLnFkcmFudC5GaWx0ZXJIAogBARIpCgZwYXJhbXMYBSABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zSAOIAQESHAoPc2NvcmVfdGhyZXNob2xkGAYgASgCSASIAQESEgoFbGltaXQYByABKARIBYgBARIwCgtsb29rdXBfZnJvbRgIIAEoCzIWLnFkcmFudC5Mb29rdXBMb2NhdGlvbkgGiAEBQggKBl9xdWVyeUIICgZfdXNpbmdCCQoHX2ZpbHRlckIJCgdfcGFyYW1zQhIKEF9zY29yZV90aHJlc2hvbGRCCAoGX2xpbWl0Qg4KDF9sb29rdXBfZnJvbSKFBgoLUXVlcnlQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEicKCHByZWZldGNoGAIgAygLMhUucWRyYW50LlByZWZldGNoUXVlcnkSIQoFcXVlcnkYAyABKAsyDS5xZHJhbnQuUXVlcnlIAIgBARISCgV1c2luZxgEIAEoCUgBiAEBEiMKBmZpbHRlchgFIAEoCzIOLnFkcmFudC5GaWx0ZXJIAogBARIpCgZwYXJhbXMYBiABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zSAOIAQESHAoPc2NvcmVfdGhyZXNob2xkGAcgASgCSASIAQESEgoFbGltaXQYCCABKARIBYgBARITCgZvZmZzZXQYCSABKARIBogBARI2Cgx3aXRoX3ZlY3RvcnMYCiABKAsyGy5xZHJhbnQuV2l0aFZlY3RvcnNTZWxlY3RvckgHiAEBEjYKDHdpdGhfcGF5bG9hZBgLIAEoCzIbLnFkcmFudC5XaXRoUGF5bG9hZFNlbGVjdG9ySAiIAQESNgoQcmVhZF9jb25zaXN0ZW5jeRgMIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lICYgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYDSABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgKiAEBEjAKC2xvb2t1cF9mcm9tGA4gASgLMhYucWRyYW50Lkxvb2t1cExvY2F0aW9uSAuIAQESFAoHdGltZW91dBgPIAEoBEgMiAEBQggKBl9xdWVyeUIICgZfdXNpbmdCCQoHX2ZpbHRlckIJCgdfcGFyYW1zQhIKEF9zY29yZV90aHJlc2hvbGRCCAoGX2xpbWl0QgkKB19vZmZzZXRCDwoNX3dpdGhfdmVjdG9yc0IPCg1fd2l0aF9wYXlsb2FkQhMKEV9yZWFkX2NvbnNpc3RlbmN5QhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCDgoMX2xvb2t1cF9mcm9tQgoKCF90aW1lb3V0IsUBChBRdWVyeUJhdGNoUG9pbnRzEhcKD2NvbGxlY3Rpb25fbmFtZRgBIAEoCRIpCgxxdWVyeV9wb2ludHMYAiADKAsyEy5xZHJhbnQuUXVlcnlQb2ludHMSNgoQcmVhZF9jb25zaXN0ZW5jeRgDIAEoCzIXLnFkcmFudC5SZWFkQ29uc2lzdGVuY3lIAIgBARIUCgd0aW1lb3V0GAQgASgESAGIAQFCEwoRX3JlYWRfY29uc2lzdGVuY3lCCgoIX3RpbWVvdXQizAYKEFF1ZXJ5UG9pbnRHcm91cHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEicKCHByZWZldGNoGAIgAygLMhUucWRyYW50LlByZWZldGNoUXVlcnkSIQoFcXVlcnkYAyABKAsyDS5xZHJhbnQuUXVlcnlIAIgBARISCgV1c2luZxgEIAEoCUgBiAEBEiMKBmZpbHRlchgFIAEoCzIOLnFkcmFudC5GaWx0ZXJIAogBARIpCgZwYXJhbXMYBiABKAsyFC5xZHJhbnQuU2VhcmNoUGFyYW1zSAOIAQESHAoPc2NvcmVfdGhyZXNob2xkGAcgASgCSASIAQESMQoMd2l0aF9wYXlsb2FkGAggASgLMhsucWRyYW50LldpdGhQYXlsb2FkU2VsZWN0b3ISNgoMd2l0aF92ZWN0b3JzGAkgASgLMhsucWRyYW50LldpdGhWZWN0b3JzU2VsZWN0b3JIBYgBARIwCgtsb29rdXBfZnJvbRgKIAEoCzIWLnFkcmFudC5Mb29rdXBMb2NhdGlvbkgGiAEBEhIKBWxpbWl0GAsgASgESAeIAQESFwoKZ3JvdXBfc2l6ZRgMIAEoBEgIiAEBEhAKCGdyb3VwX2J5GA0gASgJEjYKEHJlYWRfY29uc2lzdGVuY3kYDiABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAmIAQESLAoLd2l0aF9sb29rdXAYDyABKAsyEi5xZHJhbnQuV2l0aExvb2t1cEgKiAEBEhQKB3RpbWVvdXQYECABKARIC4gBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYESABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgMiAEBQggKBl9xdWVyeUIICgZfdXNpbmdCCQoHX2ZpbHRlckIJCgdfcGFyYW1zQhIKEF9zY29yZV90aHJlc2hvbGRCDwoNX3dpdGhfdmVjdG9yc0IOCgxfbG9va3VwX2Zyb21CCAoGX2xpbWl0Qg0KC19ncm91cF9zaXplQhMKEV9yZWFkX2NvbnNpc3RlbmN5Qg4KDF93aXRoX2xvb2t1cEIKCghfdGltZW91dEIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIuACCgtGYWNldENvdW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSCwoDa2V5GAIgASgJEiMKBmZpbHRlchgDIAEoCzIOLnFkcmFudC5GaWx0ZXJIAIgBARISCgVsaW1pdBgEIAEoBEgBiAEBEhIKBWV4YWN0GAUgASgISAKIAQESFAoHdGltZW91dBgGIAEoBEgDiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYByABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SASIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAggASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIBYgBAUIJCgdfZmlsdGVyQggKBl9saW1pdEIICgZfZXhhY3RCCgoIX3RpbWVvdXRCEwoRX3JlYWRfY29uc2lzdGVuY3lCFQoTX3NoYXJkX2tleV9zZWxlY3RvciJeCgpGYWNldFZhbHVlEhYKDHN0cmluZ192YWx1ZRgBIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAiABKANIABIUCgpib29sX3ZhbHVlGAMgASgISABCCQoHdmFyaWFudCI8CghGYWNldEhpdBIhCgV2YWx1ZRgBIAEoCzISLnFkcmFudC5GYWNldFZhbHVlEg0KBWNvdW50GAIgASgEIvoCChJTZWFyY2hNYXRyaXhQb2ludHMSFwoPY29sbGVjdGlvbl9uYW1lGAEgASgJEiMKBmZpbHRlchgCIAEoCzIOLnFkcmFudC5GaWx0ZXJIAIgBARITCgZzYW1wbGUYAyABKARIAYgBARISCgVsaW1pdBgEIAEoBEgCiAEBEhIKBXVzaW5nGAUgASgJSAOIAQESFAoHdGltZW91dBgGIAEoBEgEiAEBEjYKEHJlYWRfY29uc2lzdGVuY3kYByABKAsyFy5xZHJhbnQuUmVhZENvbnNpc3RlbmN5SAWIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAggASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIBogBAUIJCgdfZmlsdGVyQgkKB19zYW1wbGVCCAoGX2xpbWl0QggKBl91c2luZ0IKCghfdGltZW91dEITChFfcmVhZF9jb25zaXN0ZW5jeUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yIjwKEVNlYXJjaE1hdHJpeFBhaXJzEicKBXBhaXJzGAEgAygLMhgucWRyYW50LlNlYXJjaE1hdHJpeFBhaXIiWQoQU2VhcmNoTWF0cml4UGFpchIaCgFhGAEgASgLMg8ucWRyYW50LlBvaW50SWQSGgoBYhgCIAEoCzIPLnFkcmFudC5Qb2ludElkEg0KBXNjb3JlGAMgASgCIm0KE1NlYXJjaE1hdHJpeE9mZnNldHMSEwoLb2Zmc2V0c19yb3cYASADKAQSEwoLb2Zmc2V0c19jb2wYAiADKAQSDgoGc2NvcmVzGAMgAygCEhwKA2lkcxgEIAMoCzIPLnFkcmFudC5Qb2ludElkIs8TChVQb2ludHNVcGRhdGVPcGVyYXRpb24SPwoGdXBzZXJ0GAEgASgLMi0ucWRyYW50LlBvaW50c1VwZGF0ZU9wZXJhdGlvbi5Qb2ludFN0cnVjdExpc3RIABI3ChFkZWxldGVfZGVwcmVjYXRlZBgCIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvckICGAFIABI/CgtzZXRfcGF5bG9hZBgDIAEoCzIoLnFkcmFudC5Qb2ludHNVcGRhdGVPcGVyYXRpb24uU2V0UGF5bG9hZEgAEksKEW92ZXJ3cml0ZV9wYXlsb2FkGAQgASgLMi4ucWRyYW50LlBvaW50c1VwZGF0ZU9wZXJhdGlvbi5PdmVyd3JpdGVQYXlsb2FkSAASRQoOZGVsZXRlX3BheWxvYWQYBSABKAsyKy5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLkRlbGV0ZVBheWxvYWRIABI+ChhjbGVhcl9wYXlsb2FkX2RlcHJlY2F0ZWQYBiABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3JCAhgBSAASRQoOdXBkYXRlX3ZlY3RvcnMYByABKAsyKy5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLlVwZGF0ZVZlY3RvcnNIABJFCg5kZWxldGVfdmVjdG9ycxgIIAEoCzIrLnFkcmFudC5Qb2ludHNVcGRhdGVPcGVyYXRpb24uRGVsZXRlVmVjdG9yc0gAEkMKDWRlbGV0ZV9wb2ludHMYCSABKAsyKi5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLkRlbGV0ZVBvaW50c0gAEkMKDWNsZWFyX3BheWxvYWQYCiABKAsyKi5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uLkNsZWFyUGF5bG9hZEgAGoQCCg9Qb2ludFN0cnVjdExpc3QSIwoGcG9pbnRzGAEgAygLMhMucWRyYW50LlBvaW50U3RydWN0EjkKEnNoYXJkX2tleV9zZWxlY3RvchgCIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySACIAQESKgoNdXBkYXRlX2ZpbHRlchgDIAEoCzIOLnFkcmFudC5GaWx0ZXJIAYgBARIsCgt1cGRhdGVfbW9kZRgEIAEoDjISLnFkcmFudC5VcGRhdGVNb2RlSAKIAQFCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIQCg5fdXBkYXRlX2ZpbHRlckIOCgxfdXBkYXRlX21vZGUayQIKClNldFBheWxvYWQSRgoHcGF5bG9hZBgBIAMoCzI1LnFkcmFudC5Qb2ludHNVcGRhdGVPcGVyYXRpb24uU2V0UGF5bG9hZC5QYXlsb2FkRW50cnkSNAoPcG9pbnRzX3NlbGVjdG9yGAIgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9ySACIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAMgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAYgBARIQCgNrZXkYBCABKAlIAogBARo9CgxQYXlsb2FkRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUISChBfcG9pbnRzX3NlbGVjdG9yQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCBgoEX2tleRrVAgoQT3ZlcndyaXRlUGF5bG9hZBJMCgdwYXlsb2FkGAEgAygLMjsucWRyYW50LlBvaW50c1VwZGF0ZU9wZXJhdGlvbi5PdmVyd3JpdGVQYXlsb2FkLlBheWxvYWRFbnRyeRI0Cg9wb2ludHNfc2VsZWN0b3IYAiABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3JIAIgBARI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYAyABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgBiAEBEhAKA2tleRgEIAEoCUgCiAEBGj0KDFBheWxvYWRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQhIKEF9wb2ludHNfc2VsZWN0b3JCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIGCgRfa2V5GrkBCg1EZWxldGVQYXlsb2FkEgwKBGtleXMYASADKAkSNAoPcG9pbnRzX3NlbGVjdG9yGAIgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9ySACIAQESOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAMgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAYgBAUISChBfcG9pbnRzX3NlbGVjdG9yQhUKE19zaGFyZF9rZXlfc2VsZWN0b3IaxQEKDVVwZGF0ZVZlY3RvcnMSJAoGcG9pbnRzGAEgAygLMhQucWRyYW50LlBvaW50VmVjdG9ycxI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYAiABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgAiAEBEioKDXVwZGF0ZV9maWx0ZXIYAyABKAsyDi5xZHJhbnQuRmlsdGVySAGIAQFCFQoTX3NoYXJkX2tleV9zZWxlY3RvckIQCg5fdXBkYXRlX2ZpbHRlchq8AQoNRGVsZXRlVmVjdG9ycxIvCg9wb2ludHNfc2VsZWN0b3IYASABKAsyFi5xZHJhbnQuUG9pbnRzU2VsZWN0b3ISKAoHdmVjdG9ycxgCIAEoCzIXLnFkcmFudC5WZWN0b3JzU2VsZWN0b3ISOQoSc2hhcmRfa2V5X3NlbGVjdG9yGAMgASgLMhgucWRyYW50LlNoYXJkS2V5U2VsZWN0b3JIAIgBAUIVChNfc2hhcmRfa2V5X3NlbGVjdG9yGogBCgxEZWxldGVQb2ludHMSJgoGcG9pbnRzGAEgASgLMhYucWRyYW50LlBvaW50c1NlbGVjdG9yEjkKEnNoYXJkX2tleV9zZWxlY3RvchgCIAEoCzIYLnFkcmFudC5TaGFyZEtleVNlbGVjdG9ySACIAQFCFQoTX3NoYXJkX2tleV9zZWxlY3RvchqIAQoMQ2xlYXJQYXlsb2FkEiYKBnBvaW50cxgBIAEoCzIWLnFkcmFudC5Qb2ludHNTZWxlY3RvchI5ChJzaGFyZF9rZXlfc2VsZWN0b3IYAiABKAsyGC5xZHJhbnQuU2hhcmRLZXlTZWxlY3RvckgAiAEBQhUKE19zaGFyZF9rZXlfc2VsZWN0b3JCCwoJb3BlcmF0aW9uItgBChFVcGRhdGVCYXRjaFBvaW50cxIXCg9jb2xsZWN0aW9uX25hbWUYASABKAkSEQoEd2FpdBgCIAEoCEgAiAEBEjEKCm9wZXJhdGlvbnMYAyADKAsyHS5xZHJhbnQuUG9pbnRzVXBkYXRlT3BlcmF0aW9uEiwKCG9yZGVyaW5nGAQgASgLMhUucWRyYW50LldyaXRlT3JkZXJpbmdIAYgBARIUCgd0aW1lb3V0GAUgASgESAKIAQFCBwoFX3dhaXRCCwoJX29yZGVyaW5nQgoKCF90aW1lb3V0InoKF1BvaW50c09wZXJhdGlvblJlc3BvbnNlEiQKBnJlc3VsdBgBIAEoCzIULnFkcmFudC5VcGRhdGVSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJgCgxVcGRhdGVSZXN1bHQSGQoMb3BlcmF0aW9uX2lkGAEgASgESACIAQESJAoGc3RhdHVzGAIgASgOMhQucWRyYW50LlVwZGF0ZVN0YXR1c0IPCg1fb3BlcmF0aW9uX2lkIjcKCk9yZGVyVmFsdWUSDQoDaW50GAEgASgDSAASDwoFZmxvYXQYAiABKAFIAEIJCgd2YXJpYW50IvECCgtTY29yZWRQb2ludBIbCgJpZBgBIAEoCzIPLnFkcmFudC5Qb2ludElkEjEKB3BheWxvYWQYAiADKAsyIC5xZHJhbnQuU2NvcmVkUG9pbnQuUGF5bG9hZEVudHJ5Eg0KBXNjb3JlGAMgASgCEg8KB3ZlcnNpb24YBSABKAQSKwoHdmVjdG9ycxgGIAEoCzIVLnFkcmFudC5WZWN0b3JzT3V0cHV0SACIAQESKAoJc2hhcmRfa2V5GAcgASgLMhAucWRyYW50LlNoYXJkS2V5SAGIAQESLAoLb3JkZXJfdmFsdWUYCCABKAsyEi5xZHJhbnQuT3JkZXJWYWx1ZUgCiAEBGj0KDFBheWxvYWRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5xZHJhbnQuVmFsdWU6AjgBQgoKCF92ZWN0b3JzQgwKCl9zaGFyZF9rZXlCDgoMX29yZGVyX3ZhbHVlSgQIBBAFIlwKB0dyb3VwSWQSGAoOdW5zaWduZWRfdmFsdWUYASABKARIABIXCg1pbnRlZ2VyX3ZhbHVlGAIgASgDSAASFgoMc3RyaW5nX3ZhbHVlGAMgASgJSABCBgoEa2luZCJ0CgpQb2ludEdyb3VwEhsKAmlkGAEgASgLMg8ucWRyYW50Lkdyb3VwSWQSIQoEaGl0cxgCIAMoCzITLnFkcmFudC5TY29yZWRQb2ludBImCgZsb29rdXAYAyABKAsyFi5xZHJhbnQuUmV0cmlldmVkUG9pbnQiMgoMR3JvdXBzUmVzdWx0EiIKBmdyb3VwcxgBIAMoCzISLnFkcmFudC5Qb2ludEdyb3VwInAKDlNlYXJjaFJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5TY29yZWRQb2ludBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIm8KDVF1ZXJ5UmVzcG9uc2USIwoGcmVzdWx0GAEgAygLMhMucWRyYW50LlNjb3JlZFBvaW50EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UidAoSUXVlcnlCYXRjaFJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5CYXRjaFJlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlInYKE1F1ZXJ5R3JvdXBzUmVzcG9uc2USJAoGcmVzdWx0GAEgASgLMhQucWRyYW50Lkdyb3Vwc1Jlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIjIKC0JhdGNoUmVzdWx0EiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5TY29yZWRQb2ludCJ1ChNTZWFyY2hCYXRjaFJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5CYXRjaFJlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIncKFFNlYXJjaEdyb3Vwc1Jlc3BvbnNlEiQKBnJlc3VsdBgBIAEoCzIULnFkcmFudC5Hcm91cHNSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJvCg1Db3VudFJlc3BvbnNlEiMKBnJlc3VsdBgBIAEoCzITLnFkcmFudC5Db3VudFJlc3VsdBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIrgBCg5TY3JvbGxSZXNwb25zZRIuChBuZXh0X3BhZ2Vfb2Zmc2V0GAEgASgLMg8ucWRyYW50LlBvaW50SWRIAIgBARImCgZyZXN1bHQYAiADKAsyFi5xZHJhbnQuUmV0cmlldmVkUG9pbnQSDAoEdGltZRgDIAEoARIhCgV1c2FnZRgEIAEoCzINLnFkcmFudC5Vc2FnZUgBiAEBQhMKEV9uZXh0X3BhZ2Vfb2Zmc2V0QggKBl91c2FnZSIcCgtDb3VudFJlc3VsdBINCgVjb3VudBgBIAEoBCLXAgoOUmV0cmlldmVkUG9pbnQSGwoCaWQYASABKAsyDy5xZHJhbnQuUG9pbnRJZBI0CgdwYXlsb2FkGAIgAygLMiMucWRyYW50LlJldHJpZXZlZFBvaW50LlBheWxvYWRFbnRyeRIrCgd2ZWN0b3JzGAQgASgLMhUucWRyYW50LlZlY3RvcnNPdXRwdXRIAIgBARIoCglzaGFyZF9rZXkYBSABKAsyEC5xZHJhbnQuU2hhcmRLZXlIAYgBARIsCgtvcmRlcl92YWx1ZRgGIAEoCzISLnFkcmFudC5PcmRlclZhbHVlSAKIAQEaPQoMUGF5bG9hZEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLnFkcmFudC5WYWx1ZToCOAFCCgoIX3ZlY3RvcnNCDAoKX3NoYXJkX2tleUIOCgxfb3JkZXJfdmFsdWVKBAgDEAQicAoLR2V0UmVzcG9uc2USJgoGcmVzdWx0GAEgAygLMhYucWRyYW50LlJldHJpZXZlZFBvaW50EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UicwoRUmVjb21tZW5kUmVzcG9uc2USIwoGcmVzdWx0GAEgAygLMhMucWRyYW50LlNjb3JlZFBvaW50EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UieAoWUmVjb21tZW5kQmF0Y2hSZXNwb25zZRIjCgZyZXN1bHQYASADKAsyEy5xZHJhbnQuQmF0Y2hSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJyChBEaXNjb3ZlclJlc3BvbnNlEiMKBnJlc3VsdBgBIAMoCzITLnFkcmFudC5TY29yZWRQb2ludBIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlIncKFURpc2NvdmVyQmF0Y2hSZXNwb25zZRIjCgZyZXN1bHQYASADKAsyEy5xZHJhbnQuQmF0Y2hSZXN1bHQSDAoEdGltZRgCIAEoARIhCgV1c2FnZRgDIAEoCzINLnFkcmFudC5Vc2FnZUgAiAEBQggKBl91c2FnZSJ6ChdSZWNvbW1lbmRHcm91cHNSZXNwb25zZRIkCgZyZXN1bHQYASABKAsyFC5xZHJhbnQuR3JvdXBzUmVzdWx0EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UidgoTVXBkYXRlQmF0Y2hSZXNwb25zZRIkCgZyZXN1bHQYASADKAsyFC5xZHJhbnQuVXBkYXRlUmVzdWx0EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UiagoNRmFjZXRSZXNwb25zZRIeCgRoaXRzGAEgAygLMhAucWRyYW50LkZhY2V0SGl0EgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UigQEKGVNlYXJjaE1hdHJpeFBhaXJzUmVzcG9uc2USKQoGcmVzdWx0GAEgASgLMhkucWRyYW50LlNlYXJjaE1hdHJpeFBhaXJzEgwKBHRpbWUYAiABKAESIQoFdXNhZ2UYAyABKAsyDS5xZHJhbnQuVXNhZ2VIAIgBAUIICgZfdXNhZ2UihQEKG1NlYXJjaE1hdHJpeE9mZnNldHNSZXNwb25zZRIrCgZyZXN1bHQYASABKAsyGy5xZHJhbnQuU2VhcmNoTWF0cml4T2Zmc2V0cxIMCgR0aW1lGAIgASgBEiEKBXVzYWdlGAMgASgLMg0ucWRyYW50LlVzYWdlSACIAQFCCAoGX3VzYWdlInUKDlBvaW50c1NlbGVjdG9yEicKBnBvaW50cxgBIAEoCzIVLnFkcmFudC5Qb2ludHNJZHNMaXN0SAASIAoGZmlsdGVyGAIgASgLMg4ucWRyYW50LkZpbHRlckgAQhgKFnBvaW50c19zZWxlY3Rvcl9vbmVfb2YiLQoNUG9pbnRzSWRzTGlzdBIcCgNpZHMYASADKAsyDy5xZHJhbnQuUG9pbnRJZCLVAQoLUG9pbnRTdHJ1Y3QSGwoCaWQYASABKAsyDy5xZHJhbnQuUG9pbnRJZBIxCgdwYXlsb2FkGAMgAygLMiAucWRyYW50LlBvaW50U3RydWN0LlBheWxvYWRFbnRyeRIlCgd2ZWN0b3JzGAQgASgLMg8ucWRyYW50LlZlY3RvcnNIAIgBARo9CgxQYXlsb2FkRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0ucWRyYW50LlZhbHVlOgI4AUIKCghfdmVjdG9yc0oECAIQAyKAAQoFVXNhZ2USLAoIaGFyZHdhcmUYASABKAsyFS5xZHJhbnQuSGFyZHdhcmVVc2FnZUgAiAEBEi4KCWluZmVyZW5jZRgCIAEoCzIWLnFkcmFudC5JbmZlcmVuY2VVc2FnZUgBiAEBQgsKCV9oYXJkd2FyZUIMCgpfaW5mZXJlbmNlIocBCg5JbmZlcmVuY2VVc2FnZRIyCgZtb2RlbHMYASADKAsyIi5xZHJhbnQuSW5mZXJlbmNlVXNhZ2UuTW9kZWxzRW50cnkaQQoLTW9kZWxzRW50cnkSCwoDa2V5GAEgASgJEiEKBXZhbHVlGAIgASgLMhIucWRyYW50Lk1vZGVsVXNhZ2U6AjgBIhwKCk1vZGVsVXNhZ2USDgoGdG9rZW5zGAEgASgEIr8BCg1IYXJkd2FyZVVzYWdlEgsKA2NwdRgBIAEoBBIXCg9wYXlsb2FkX2lvX3JlYWQYAiABKAQSGAoQcGF5bG9hZF9pb193cml0ZRgDIAEoBBIdChVwYXlsb2FkX2luZGV4X2lvX3JlYWQYBCABKAQSHgoWcGF5bG9hZF9pbmRleF9pb193cml0ZRgFIAEoBBIWCg52ZWN0b3JfaW9fcmVhZBgGIAEoBBIXCg92ZWN0b3JfaW9fd3JpdGUYByABKAQqNQoRV3JpdGVPcmRlcmluZ1R5cGUSCAoEV2VhaxAAEgoKBk1lZGl1bRABEgoKBlN0cm9uZxACKjgKClVwZGF0ZU1vZGUSCgoGVXBzZXJ0EAASDgoKSW5zZXJ0T25seRABEg4KClVwZGF0ZU9ubHkQAio4ChNSZWFkQ29uc2lzdGVuY3lUeXBlEgcKA0FsbBAAEgwKCE1ham9yaXR5EAESCgoGUXVvcnVtEAIqrQEKCUZpZWxkVHlwZRIUChBGaWVsZFR5cGVLZXl3b3JkEAASFAoQRmllbGRUeXBlSW50ZWdlchABEhIKDkZpZWxkVHlwZUZsb2F0EAISEAoMRmllbGRUeXBlR2VvEAMSEQoNRmllbGRUeXBlVGV4dBAEEhEKDUZpZWxkVHlwZUJvb2wQBRIVChFGaWVsZFR5cGVEYXRldGltZRAGEhEKDUZpZWxkVHlwZVV1aWQQByoeCglEaXJlY3Rpb24SBwoDQXNjEAASCAoERGVzYxABKkQKEVJlY29tbWVuZFN0cmF0ZWd5EhEKDUF2ZXJhZ2VWZWN0b3IQABINCglCZXN0U2NvcmUQARINCglTdW1TY29yZXMQAiobCgZGdXNpb24SBwoDUlJGEAASCAoEREJTRhABKhQKBlNhbXBsZRIKCgZSYW5kb20QACpsCgxVcGRhdGVTdGF0dXMSFwoTVW5rbm93blVwZGF0ZVN0YXR1cxAAEhAKDEFja25vd2xlZGdlZBABEg0KCUNvbXBsZXRlZBACEhEKDUNsb2NrUmVqZWN0ZWQQAxIPCgtXYWl0VGltZW91dBAEQhWqAhJRZHJhbnQuQ2xpZW50LkdycGNiBnByb3RvMw", [file_collections, file_qdrant_common, file_google_protobuf_timestamp, file_json_with_int]); /** * @generated from message qdrant.WriteOrdering @@ -56,7 +56,8 @@ export type ReadConsistency = Message<"qdrant.ReadConsistency"> & { case: "type"; } | { /** - * Send request to a specified number of nodes, and return points which are present on all of them + * Send request to a specified number of nodes, + * and return points which are present on all of them * * @generated from field: uint64 factor = 2; */ @@ -393,7 +394,8 @@ export const MultiDenseVectorSchema: GenMessage = /*@__PURE__* messageDesc(file_points, 10); /** - * Vector type to be used in queries. Ids will be substituted with their corresponding vectors from the collection. + * Vector type to be used in queries. + * Ids will be substituted with their corresponding vectors from the collection. * * @generated from message qdrant.VectorInput */ @@ -515,11 +517,26 @@ export type UpsertPoints = Message<"qdrant.UpsertPoints"> & { shardKeySelector?: ShardKeySelector; /** - * If specified, only points that match this filter will be updated, others will be inserted + * Filter to apply when updating existing points. Only points matching this filter will be updated. + * Points that don't match will keep their current state. New points will be inserted regardless of the filter. * * @generated from field: optional qdrant.Filter update_filter = 6; */ updateFilter?: Filter; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 7; + */ + timeout?: bigint; + + /** + * Mode of the upsert operation: insert_only, upsert (default), update_only + * + * @generated from field: optional qdrant.UpdateMode update_mode = 8; + */ + updateMode?: UpdateMode; }; /** @@ -567,6 +584,13 @@ export type DeletePoints = Message<"qdrant.DeletePoints"> & { * @generated from field: optional qdrant.ShardKeySelector shard_key_selector = 5; */ shardKeySelector?: ShardKeySelector; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 6; + */ + timeout?: bigint; }; /** @@ -682,6 +706,13 @@ export type UpdatePointVectors = Message<"qdrant.UpdatePointVectors"> & { * @generated from field: optional qdrant.Filter update_filter = 6; */ updateFilter?: Filter; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 7; + */ + timeout?: bigint; }; /** @@ -762,6 +793,13 @@ export type DeletePointVectors = Message<"qdrant.DeletePointVectors"> & { * @generated from field: optional qdrant.ShardKeySelector shard_key_selector = 6; */ shardKeySelector?: ShardKeySelector; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 7; + */ + timeout?: bigint; }; /** @@ -823,6 +861,13 @@ export type SetPayloadPoints = Message<"qdrant.SetPayloadPoints"> & { * @generated from field: optional string key = 8; */ key?: string; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 9; + */ + timeout?: bigint; }; /** @@ -877,6 +922,13 @@ export type DeletePayloadPoints = Message<"qdrant.DeletePayloadPoints"> & { * @generated from field: optional qdrant.ShardKeySelector shard_key_selector = 7; */ shardKeySelector?: ShardKeySelector; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 8; + */ + timeout?: bigint; }; /** @@ -924,6 +976,13 @@ export type ClearPayloadPoints = Message<"qdrant.ClearPayloadPoints"> & { * @generated from field: optional qdrant.ShardKeySelector shard_key_selector = 5; */ shardKeySelector?: ShardKeySelector; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 6; + */ + timeout?: bigint; }; /** @@ -978,6 +1037,13 @@ export type CreateFieldIndexCollection = Message<"qdrant.CreateFieldIndexCollect * @generated from field: optional qdrant.WriteOrdering ordering = 6; */ ordering?: WriteOrdering; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 7; + */ + timeout?: bigint; }; /** @@ -1018,6 +1084,13 @@ export type DeleteFieldIndexCollection = Message<"qdrant.DeleteFieldIndexCollect * @generated from field: optional qdrant.WriteOrdering ordering = 4; */ ordering?: WriteOrdering; + + /** + * Timeout for the request in seconds + * + * @generated from field: optional uint64 timeout = 5; + */ + timeout?: bigint; }; /** @@ -1230,7 +1303,7 @@ export type WithVectorsSelector = Message<"qdrant.WithVectorsSelector"> & { case: "enable"; } | { /** - * List of payload keys to include into result + * List of vectors to include into result * * @generated from field: qdrant.VectorsSelector include = 2; */ @@ -1251,7 +1324,6 @@ export const WithVectorsSelectorSchema: GenMessage = /*@__P */ export type QuantizationSearchParams = Message<"qdrant.QuantizationSearchParams"> & { /** - * * If set to true, search will ignore quantized vector data * * @generated from field: optional bool ignore = 1; @@ -1259,21 +1331,21 @@ export type QuantizationSearchParams = Message<"qdrant.QuantizationSearchParams" ignore?: boolean; /** - * - * If true, use original vectors to re-score top-k results. If ignored, qdrant decides automatically does rescore enabled or not. + * If true, use original vectors to re-score top-k results. + * If ignored, qdrant decides automatically does rescore enabled or not. * * @generated from field: optional bool rescore = 2; */ rescore?: boolean; /** - * * Oversampling factor for quantization. * * Defines how many extra vectors should be pre-selected using quantized index, * and then re-scored using original vectors. * - * For example, if `oversampling` is 2.4 and `limit` is 100, then 240 vectors will be pre-selected using quantized index, + * For example, if `oversampling` is 2.4 and `limit` is 100, + * then 240 vectors will be pre-selected using quantized index, * and then top-100 will be returned after re-scoring. * * @generated from field: optional double oversampling = 3; @@ -1293,7 +1365,6 @@ export const QuantizationSearchParamsSchema: GenMessage & { /** - * * If true, then ACORN may be used for the HNSW search based on filters * selectivity. * @@ -1305,7 +1376,6 @@ export type AcornSearchParams = Message<"qdrant.AcornSearchParams"> & { enable?: boolean; /** - * * Maximum selectivity of filters to enable ACORN. * * If estimated filters selectivity is higher than this value, @@ -1331,7 +1401,6 @@ export const AcornSearchParamsSchema: GenMessage = /*@__PURE_ */ export type SearchParams = Message<"qdrant.SearchParams"> & { /** - * * Params relevant to HNSW index. Size of the beam in a beam-search. * Larger the value - more accurate the result, more time required for search. * @@ -1340,7 +1409,6 @@ export type SearchParams = Message<"qdrant.SearchParams"> & { hnswEf?: bigint; /** - * * Search without approximation. If set to true, search may run long but with exact results. * * @generated from field: optional bool exact = 2; @@ -1348,7 +1416,6 @@ export type SearchParams = Message<"qdrant.SearchParams"> & { exact?: boolean; /** - * * If set to true, search will ignore quantized vector data * * @generated from field: optional qdrant.QuantizationSearchParams quantization = 3; @@ -1356,7 +1423,6 @@ export type SearchParams = Message<"qdrant.SearchParams"> & { quantization?: QuantizationSearchParams; /** - * * If enabled, the engine will only perform search among indexed or small segments. * Using this option prevents slow searches in case of delayed index, but does not * guarantee that all uploaded vectors will be included in search results @@ -1366,7 +1432,6 @@ export type SearchParams = Message<"qdrant.SearchParams"> & { indexedOnly?: boolean; /** - * * ACORN search params * * @generated from field: optional qdrant.AcornSearchParams acorn = 5; @@ -1628,7 +1693,9 @@ export type SearchPointGroups = Message<"qdrant.SearchPointGroups"> & { withVectors?: WithVectorsSelector; /** - * Payload field to group by, must be a string or number field. If there are multiple values for the field, all of them will be used. One point can be in multiple groups. + * Payload field to group by, must be a string or number field. + * If there are multiple values for the field, all of them will be used. + * One point can be in multiple groups. * * @generated from field: string group_by = 10; */ @@ -2125,7 +2192,9 @@ export type RecommendPointGroups = Message<"qdrant.RecommendPointGroups"> & { lookupFrom?: LookupLocation; /** - * Payload field to group by, must be a string or number field. If there are multiple values for the field, all of them will be used. One point can be in multiple groups. + * Payload field to group by, must be a string or number field. + * If there are multiple values for the field, all of them will be used. + * One point can be in multiple groups. * * @generated from field: string group_by = 12; */ @@ -2575,6 +2644,117 @@ export type ContextInput = Message<"qdrant.ContextInput"> & { export const ContextInputSchema: GenMessage = /*@__PURE__*/ messageDesc(file_points, 56); +/** + * @generated from message qdrant.RelevanceFeedbackInput + */ +export type RelevanceFeedbackInput = Message<"qdrant.RelevanceFeedbackInput"> & { + /** + * The original query vector + * + * @generated from field: qdrant.VectorInput target = 1; + */ + target?: VectorInput; + + /** + * Previous results scored by the feedback provider. + * + * @generated from field: repeated qdrant.FeedbackItem feedback = 2; + */ + feedback: FeedbackItem[]; + + /** + * Formula and trained coefficients to use. + * + * @generated from field: qdrant.FeedbackStrategy strategy = 3; + */ + strategy?: FeedbackStrategy; +}; + +/** + * Describes the message qdrant.RelevanceFeedbackInput. + * Use `create(RelevanceFeedbackInputSchema)` to create a new message. + */ +export const RelevanceFeedbackInputSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_points, 57); + +/** + * @generated from message qdrant.FeedbackItem + */ +export type FeedbackItem = Message<"qdrant.FeedbackItem"> & { + /** + * The id or vector from the original model + * + * @generated from field: qdrant.VectorInput example = 1; + */ + example?: VectorInput; + + /** + * Score for this vector as determined by the feedback provider + * + * @generated from field: float score = 2; + */ + score: number; +}; + +/** + * Describes the message qdrant.FeedbackItem. + * Use `create(FeedbackItemSchema)` to create a new message. + */ +export const FeedbackItemSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_points, 58); + +/** + * @generated from message qdrant.FeedbackStrategy + */ +export type FeedbackStrategy = Message<"qdrant.FeedbackStrategy"> & { + /** + * @generated from oneof qdrant.FeedbackStrategy.variant + */ + variant: { + /** + * a * score + sim(confidence^b * c * delta) + * + * @generated from field: qdrant.NaiveFeedbackStrategy naive = 1; + */ + value: NaiveFeedbackStrategy; + case: "naive"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message qdrant.FeedbackStrategy. + * Use `create(FeedbackStrategySchema)` to create a new message. + */ +export const FeedbackStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_points, 59); + +/** + * @generated from message qdrant.NaiveFeedbackStrategy + */ +export type NaiveFeedbackStrategy = Message<"qdrant.NaiveFeedbackStrategy"> & { + /** + * @generated from field: float a = 1; + */ + a: number; + + /** + * @generated from field: float b = 2; + */ + b: number; + + /** + * @generated from field: float c = 3; + */ + c: number; +}; + +/** + * Describes the message qdrant.NaiveFeedbackStrategy. + * Use `create(NaiveFeedbackStrategySchema)` to create a new message. + */ +export const NaiveFeedbackStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_points, 60); + /** * @generated from message qdrant.Formula */ @@ -2595,7 +2775,7 @@ export type Formula = Message<"qdrant.Formula"> & { * Use `create(FormulaSchema)` to create a new message. */ export const FormulaSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 57); + messageDesc(file_points, 61); /** * @generated from message qdrant.Expression @@ -2762,7 +2942,7 @@ export type Expression = Message<"qdrant.Expression"> & { * Use `create(ExpressionSchema)` to create a new message. */ export const ExpressionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 58); + messageDesc(file_points, 62); /** * @generated from message qdrant.GeoDistance @@ -2784,7 +2964,7 @@ export type GeoDistance = Message<"qdrant.GeoDistance"> & { * Use `create(GeoDistanceSchema)` to create a new message. */ export const GeoDistanceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 59); + messageDesc(file_points, 63); /** * @generated from message qdrant.MultExpression @@ -2801,7 +2981,7 @@ export type MultExpression = Message<"qdrant.MultExpression"> & { * Use `create(MultExpressionSchema)` to create a new message. */ export const MultExpressionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 60); + messageDesc(file_points, 64); /** * @generated from message qdrant.SumExpression @@ -2818,7 +2998,7 @@ export type SumExpression = Message<"qdrant.SumExpression"> & { * Use `create(SumExpressionSchema)` to create a new message. */ export const SumExpressionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 61); + messageDesc(file_points, 65); /** * @generated from message qdrant.DivExpression @@ -2845,7 +3025,7 @@ export type DivExpression = Message<"qdrant.DivExpression"> & { * Use `create(DivExpressionSchema)` to create a new message. */ export const DivExpressionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 62); + messageDesc(file_points, 66); /** * @generated from message qdrant.PowExpression @@ -2867,7 +3047,7 @@ export type PowExpression = Message<"qdrant.PowExpression"> & { * Use `create(PowExpressionSchema)` to create a new message. */ export const PowExpressionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 63); + messageDesc(file_points, 67); /** * @generated from message qdrant.DecayParamsExpression @@ -2888,14 +3068,17 @@ export type DecayParamsExpression = Message<"qdrant.DecayParamsExpression"> & { target?: Expression; /** - * The scale factor of the decay, in terms of `x`. Defaults to 1.0. Must be a non-zero positive number. + * The scale factor of the decay, in terms of `x`. + * Defaults to 1.0. Must be a non-zero positive number. * * @generated from field: optional float scale = 3; */ scale?: number; /** - * The midpoint of the decay. Should be between 0 and 1. Defaults to 0.5. Output will be this value when `|x - target| == scale`. + * The midpoint of the decay. + * Should be between 0 and 1. Defaults to 0.5. + * Output will be this value when `|x - target| == scale`. * * @generated from field: optional float midpoint = 4; */ @@ -2907,7 +3090,7 @@ export type DecayParamsExpression = Message<"qdrant.DecayParamsExpression"> & { * Use `create(DecayParamsExpressionSchema)` to create a new message. */ export const DecayParamsExpressionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 64); + messageDesc(file_points, 68); /** * @generated from message qdrant.NearestInputWithMmr @@ -2934,7 +3117,7 @@ export type NearestInputWithMmr = Message<"qdrant.NearestInputWithMmr"> & { * Use `create(NearestInputWithMmrSchema)` to create a new message. */ export const NearestInputWithMmrSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 65); + messageDesc(file_points, 69); /** * Maximal Marginal Relevance (MMR) algorithm for re-ranking the points. @@ -2971,7 +3154,7 @@ export type Mmr = Message<"qdrant.Mmr"> & { * Use `create(MmrSchema)` to create a new message. */ export const MmrSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 66); + messageDesc(file_points, 70); /** * Parameterized reciprocal rank fusion @@ -2985,6 +3168,16 @@ export type Rrf = Message<"qdrant.Rrf"> & { * @generated from field: optional uint32 k = 1; */ k?: number; + + /** + * Weights for each prefetch source. + * Higher weight gives more influence on the final ranking. + * If not specified, all prefetches are weighted equally. + * The number of weights should match the number of prefetches. + * + * @generated from field: repeated float weights = 2; + */ + weights: number[]; }; /** @@ -2992,7 +3185,7 @@ export type Rrf = Message<"qdrant.Rrf"> & { * Use `create(RrfSchema)` to create a new message. */ export const RrfSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 67); + messageDesc(file_points, 71); /** * @generated from message qdrant.Query @@ -3081,6 +3274,14 @@ export type Query = Message<"qdrant.Query"> & { */ value: Rrf; case: "rrf"; + } | { + /** + * Search with feedback from some oracle. + * + * @generated from field: qdrant.RelevanceFeedbackInput relevance_feedback = 11; + */ + value: RelevanceFeedbackInput; + case: "relevanceFeedback"; } | { case: undefined; value?: undefined }; }; @@ -3089,28 +3290,31 @@ export type Query = Message<"qdrant.Query"> & { * Use `create(QuerySchema)` to create a new message. */ export const QuerySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 68); + messageDesc(file_points, 72); /** * @generated from message qdrant.PrefetchQuery */ export type PrefetchQuery = Message<"qdrant.PrefetchQuery"> & { /** - * Sub-requests to perform first. If present, the query will be performed on the results of the prefetches. + * Sub-requests to perform first. + * If present, the query will be performed on the results of the prefetches. * * @generated from field: repeated qdrant.PrefetchQuery prefetch = 1; */ prefetch: PrefetchQuery[]; /** - * Query to perform. If missing, returns points ordered by their IDs. + * Query to perform. + * If missing, returns points ordered by their IDs. * * @generated from field: optional qdrant.Query query = 2; */ query?: Query; /** - * Define which vector to use for querying. If missing, the default vector is is used. + * Define which vector to use for querying. + * If missing, the default vector is used. * * @generated from field: optional string using = 3; */ @@ -3145,7 +3349,8 @@ export type PrefetchQuery = Message<"qdrant.PrefetchQuery"> & { limit?: bigint; /** - * The location to use for IDs lookup, if not specified - use the current collection and the 'using' vector + * The location to use for IDs lookup. + * If not specified - use the current collection and the 'using' vector. * * @generated from field: optional qdrant.LookupLocation lookup_from = 8; */ @@ -3157,7 +3362,7 @@ export type PrefetchQuery = Message<"qdrant.PrefetchQuery"> & { * Use `create(PrefetchQuerySchema)` to create a new message. */ export const PrefetchQuerySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 69); + messageDesc(file_points, 73); /** * @generated from message qdrant.QueryPoints @@ -3171,7 +3376,8 @@ export type QueryPoints = Message<"qdrant.QueryPoints"> & { collectionName: string; /** - * Sub-requests to perform first. If present, the query will be performed on the results of the prefetches. + * Sub-requests to perform first. + * If present, the query will be performed on the results of the prefetches. * * @generated from field: repeated qdrant.PrefetchQuery prefetch = 2; */ @@ -3185,7 +3391,8 @@ export type QueryPoints = Message<"qdrant.QueryPoints"> & { query?: Query; /** - * Define which vector to use for querying. If missing, the default vector is used. + * Define which vector to use for querying. + * If missing, the default vector is used. * * @generated from field: optional string using = 4; */ @@ -3248,14 +3455,16 @@ export type QueryPoints = Message<"qdrant.QueryPoints"> & { readConsistency?: ReadConsistency; /** - * Specify in which shards to look for the points, if not specified - look in all shards. + * Specify in which shards to look for the points. + * If not specified - look in all shards. * * @generated from field: optional qdrant.ShardKeySelector shard_key_selector = 13; */ shardKeySelector?: ShardKeySelector; /** - * The location to use for IDs lookup, if not specified - use the current collection and the 'using' vector + * The location to use for IDs lookup. + * If not specified - use the current collection and the 'using' vector. * * @generated from field: optional qdrant.LookupLocation lookup_from = 14; */ @@ -3274,7 +3483,7 @@ export type QueryPoints = Message<"qdrant.QueryPoints"> & { * Use `create(QueryPointsSchema)` to create a new message. */ export const QueryPointsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 70); + messageDesc(file_points, 74); /** * @generated from message qdrant.QueryBatchPoints @@ -3310,7 +3519,7 @@ export type QueryBatchPoints = Message<"qdrant.QueryBatchPoints"> & { * Use `create(QueryBatchPointsSchema)` to create a new message. */ export const QueryBatchPointsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 71); + messageDesc(file_points, 75); /** * @generated from message qdrant.QueryPointGroups @@ -3324,7 +3533,8 @@ export type QueryPointGroups = Message<"qdrant.QueryPointGroups"> & { collectionName: string; /** - * Sub-requests to perform first. If present, the query will be performed on the results of the prefetches. + * Sub-requests to perform first. + * If present, the query will be performed on the results of the prefetches. * * @generated from field: repeated qdrant.PrefetchQuery prefetch = 2; */ @@ -3338,7 +3548,8 @@ export type QueryPointGroups = Message<"qdrant.QueryPointGroups"> & { query?: Query; /** - * Define which vector to use for querying. If missing, the default vector is used. + * Define which vector to use for querying. + * If missing, the default vector is used. * * @generated from field: optional string using = 4; */ @@ -3380,7 +3591,8 @@ export type QueryPointGroups = Message<"qdrant.QueryPointGroups"> & { withVectors?: WithVectorsSelector; /** - * The location to use for IDs lookup, if not specified - use the current collection and the 'using' vector + * The location to use for IDs lookup. + * If not specified - use the current collection and the 'using' vector. * * @generated from field: optional qdrant.LookupLocation lookup_from = 10; */ @@ -3394,14 +3606,16 @@ export type QueryPointGroups = Message<"qdrant.QueryPointGroups"> & { limit?: bigint; /** - * Maximum amount of points to return per group. Default to 10. + * Maximum amount of points to return per group. Defaults to 10. * * @generated from field: optional uint64 group_size = 12; */ groupSize?: bigint; /** - * Payload field to group by, must be a string or number field. If there are multiple values for the field, all of them will be used. One point can be in multiple groups. + * Payload field to group by, must be a string or number field. + * If there are multiple values for the field, all of them will be used. + * One point can be in multiple groups. * * @generated from field: string group_by = 13; */ @@ -3441,7 +3655,7 @@ export type QueryPointGroups = Message<"qdrant.QueryPointGroups"> & { * Use `create(QueryPointGroupsSchema)` to create a new message. */ export const QueryPointGroupsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 72); + messageDesc(file_points, 76); /** * @generated from message qdrant.FacetCounts @@ -3509,7 +3723,7 @@ export type FacetCounts = Message<"qdrant.FacetCounts"> & { * Use `create(FacetCountsSchema)` to create a new message. */ export const FacetCountsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 73); + messageDesc(file_points, 77); /** * @generated from message qdrant.FacetValue @@ -3550,7 +3764,7 @@ export type FacetValue = Message<"qdrant.FacetValue"> & { * Use `create(FacetValueSchema)` to create a new message. */ export const FacetValueSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 74); + messageDesc(file_points, 78); /** * @generated from message qdrant.FacetHit @@ -3576,7 +3790,7 @@ export type FacetHit = Message<"qdrant.FacetHit"> & { * Use `create(FacetHitSchema)` to create a new message. */ export const FacetHitSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 75); + messageDesc(file_points, 79); /** * @generated from message qdrant.SearchMatrixPoints @@ -3611,7 +3825,7 @@ export type SearchMatrixPoints = Message<"qdrant.SearchMatrixPoints"> & { limit?: bigint; /** - * Define which vector to use for querying. If missing, the default vector is is used. + * Define which vector to use for querying. If missing, the default vector is used. * * @generated from field: optional string using = 5; */ @@ -3644,7 +3858,7 @@ export type SearchMatrixPoints = Message<"qdrant.SearchMatrixPoints"> & { * Use `create(SearchMatrixPointsSchema)` to create a new message. */ export const SearchMatrixPointsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 76); + messageDesc(file_points, 80); /** * @generated from message qdrant.SearchMatrixPairs @@ -3663,7 +3877,7 @@ export type SearchMatrixPairs = Message<"qdrant.SearchMatrixPairs"> & { * Use `create(SearchMatrixPairsSchema)` to create a new message. */ export const SearchMatrixPairsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 77); + messageDesc(file_points, 81); /** * @generated from message qdrant.SearchMatrixPair @@ -3696,7 +3910,7 @@ export type SearchMatrixPair = Message<"qdrant.SearchMatrixPair"> & { * Use `create(SearchMatrixPairSchema)` to create a new message. */ export const SearchMatrixPairSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 78); + messageDesc(file_points, 82); /** * @generated from message qdrant.SearchMatrixOffsets @@ -3736,7 +3950,7 @@ export type SearchMatrixOffsets = Message<"qdrant.SearchMatrixOffsets"> & { * Use `create(SearchMatrixOffsetsSchema)` to create a new message. */ export const SearchMatrixOffsetsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 79); + messageDesc(file_points, 83); /** * @generated from message qdrant.PointsUpdateOperation @@ -3815,7 +4029,7 @@ export type PointsUpdateOperation = Message<"qdrant.PointsUpdateOperation"> & { * Use `create(PointsUpdateOperationSchema)` to create a new message. */ export const PointsUpdateOperationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80); + messageDesc(file_points, 84); /** * @generated from message qdrant.PointsUpdateOperation.PointStructList @@ -3834,11 +4048,19 @@ export type PointsUpdateOperation_PointStructList = Message<"qdrant.PointsUpdate shardKeySelector?: ShardKeySelector; /** - * If specified, only points that match this filter will be updated, others will be inserted + * Filter to apply when updating existing points. Only points matching this filter will be updated. + * Points that don't match will keep their current state. New points will be inserted regardless of the filter. * * @generated from field: optional qdrant.Filter update_filter = 3; */ updateFilter?: Filter; + + /** + * Mode of the upsert operation: insert_only, upsert (default), update_only + * + * @generated from field: optional qdrant.UpdateMode update_mode = 4; + */ + updateMode?: UpdateMode; }; /** @@ -3846,7 +4068,7 @@ export type PointsUpdateOperation_PointStructList = Message<"qdrant.PointsUpdate * Use `create(PointsUpdateOperation_PointStructListSchema)` to create a new message. */ export const PointsUpdateOperation_PointStructListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 0); + messageDesc(file_points, 84, 0); /** * @generated from message qdrant.PointsUpdateOperation.SetPayload @@ -3884,7 +4106,7 @@ export type PointsUpdateOperation_SetPayload = Message<"qdrant.PointsUpdateOpera * Use `create(PointsUpdateOperation_SetPayloadSchema)` to create a new message. */ export const PointsUpdateOperation_SetPayloadSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 1); + messageDesc(file_points, 84, 1); /** * @generated from message qdrant.PointsUpdateOperation.OverwritePayload @@ -3922,7 +4144,7 @@ export type PointsUpdateOperation_OverwritePayload = Message<"qdrant.PointsUpdat * Use `create(PointsUpdateOperation_OverwritePayloadSchema)` to create a new message. */ export const PointsUpdateOperation_OverwritePayloadSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 2); + messageDesc(file_points, 84, 2); /** * @generated from message qdrant.PointsUpdateOperation.DeletePayload @@ -3953,7 +4175,7 @@ export type PointsUpdateOperation_DeletePayload = Message<"qdrant.PointsUpdateOp * Use `create(PointsUpdateOperation_DeletePayloadSchema)` to create a new message. */ export const PointsUpdateOperation_DeletePayloadSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 3); + messageDesc(file_points, 84, 3); /** * @generated from message qdrant.PointsUpdateOperation.UpdateVectors @@ -3986,7 +4208,7 @@ export type PointsUpdateOperation_UpdateVectors = Message<"qdrant.PointsUpdateOp * Use `create(PointsUpdateOperation_UpdateVectorsSchema)` to create a new message. */ export const PointsUpdateOperation_UpdateVectorsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 4); + messageDesc(file_points, 84, 4); /** * @generated from message qdrant.PointsUpdateOperation.DeleteVectors @@ -4019,7 +4241,7 @@ export type PointsUpdateOperation_DeleteVectors = Message<"qdrant.PointsUpdateOp * Use `create(PointsUpdateOperation_DeleteVectorsSchema)` to create a new message. */ export const PointsUpdateOperation_DeleteVectorsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 5); + messageDesc(file_points, 84, 5); /** * @generated from message qdrant.PointsUpdateOperation.DeletePoints @@ -4045,7 +4267,7 @@ export type PointsUpdateOperation_DeletePoints = Message<"qdrant.PointsUpdateOpe * Use `create(PointsUpdateOperation_DeletePointsSchema)` to create a new message. */ export const PointsUpdateOperation_DeletePointsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 6); + messageDesc(file_points, 84, 6); /** * @generated from message qdrant.PointsUpdateOperation.ClearPayload @@ -4071,7 +4293,7 @@ export type PointsUpdateOperation_ClearPayload = Message<"qdrant.PointsUpdateOpe * Use `create(PointsUpdateOperation_ClearPayloadSchema)` to create a new message. */ export const PointsUpdateOperation_ClearPayloadSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 80, 7); + messageDesc(file_points, 84, 7); /** * @generated from message qdrant.UpdateBatchPoints @@ -4102,6 +4324,13 @@ export type UpdateBatchPoints = Message<"qdrant.UpdateBatchPoints"> & { * @generated from field: optional qdrant.WriteOrdering ordering = 4; */ ordering?: WriteOrdering; + + /** + * Timeout for the operation in seconds + * + * @generated from field: optional uint64 timeout = 5; + */ + timeout?: bigint; }; /** @@ -4109,7 +4338,7 @@ export type UpdateBatchPoints = Message<"qdrant.UpdateBatchPoints"> & { * Use `create(UpdateBatchPointsSchema)` to create a new message. */ export const UpdateBatchPointsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 81); + messageDesc(file_points, 85); /** * @generated from message qdrant.PointsOperationResponse @@ -4138,7 +4367,7 @@ export type PointsOperationResponse = Message<"qdrant.PointsOperationResponse"> * Use `create(PointsOperationResponseSchema)` to create a new message. */ export const PointsOperationResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 82); + messageDesc(file_points, 86); /** * @generated from message qdrant.UpdateResult @@ -4164,7 +4393,7 @@ export type UpdateResult = Message<"qdrant.UpdateResult"> & { * Use `create(UpdateResultSchema)` to create a new message. */ export const UpdateResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 83); + messageDesc(file_points, 87); /** * @generated from message qdrant.OrderValue @@ -4193,7 +4422,7 @@ export type OrderValue = Message<"qdrant.OrderValue"> & { * Use `create(OrderValueSchema)` to create a new message. */ export const OrderValueSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 84); + messageDesc(file_points, 88); /** * @generated from message qdrant.ScoredPoint @@ -4254,7 +4483,7 @@ export type ScoredPoint = Message<"qdrant.ScoredPoint"> & { * Use `create(ScoredPointSchema)` to create a new message. */ export const ScoredPointSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 85); + messageDesc(file_points, 89); /** * @generated from message qdrant.GroupId @@ -4265,7 +4494,7 @@ export type GroupId = Message<"qdrant.GroupId"> & { */ kind: { /** - * Represents a double value. + * Represents an unsigned integer value. * * @generated from field: uint64 unsigned_value = 1; */ @@ -4295,7 +4524,7 @@ export type GroupId = Message<"qdrant.GroupId"> & { * Use `create(GroupIdSchema)` to create a new message. */ export const GroupIdSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 86); + messageDesc(file_points, 90); /** * @generated from message qdrant.PointGroup @@ -4328,7 +4557,7 @@ export type PointGroup = Message<"qdrant.PointGroup"> & { * Use `create(PointGroupSchema)` to create a new message. */ export const PointGroupSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 87); + messageDesc(file_points, 91); /** * @generated from message qdrant.GroupsResult @@ -4347,7 +4576,7 @@ export type GroupsResult = Message<"qdrant.GroupsResult"> & { * Use `create(GroupsResultSchema)` to create a new message. */ export const GroupsResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 88); + messageDesc(file_points, 92); /** * @generated from message qdrant.SearchResponse @@ -4376,7 +4605,7 @@ export type SearchResponse = Message<"qdrant.SearchResponse"> & { * Use `create(SearchResponseSchema)` to create a new message. */ export const SearchResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 89); + messageDesc(file_points, 93); /** * @generated from message qdrant.QueryResponse @@ -4405,7 +4634,7 @@ export type QueryResponse = Message<"qdrant.QueryResponse"> & { * Use `create(QueryResponseSchema)` to create a new message. */ export const QueryResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 90); + messageDesc(file_points, 94); /** * @generated from message qdrant.QueryBatchResponse @@ -4434,7 +4663,7 @@ export type QueryBatchResponse = Message<"qdrant.QueryBatchResponse"> & { * Use `create(QueryBatchResponseSchema)` to create a new message. */ export const QueryBatchResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 91); + messageDesc(file_points, 95); /** * @generated from message qdrant.QueryGroupsResponse @@ -4463,7 +4692,7 @@ export type QueryGroupsResponse = Message<"qdrant.QueryGroupsResponse"> & { * Use `create(QueryGroupsResponseSchema)` to create a new message. */ export const QueryGroupsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 92); + messageDesc(file_points, 96); /** * @generated from message qdrant.BatchResult @@ -4480,7 +4709,7 @@ export type BatchResult = Message<"qdrant.BatchResult"> & { * Use `create(BatchResultSchema)` to create a new message. */ export const BatchResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 93); + messageDesc(file_points, 97); /** * @generated from message qdrant.SearchBatchResponse @@ -4509,7 +4738,7 @@ export type SearchBatchResponse = Message<"qdrant.SearchBatchResponse"> & { * Use `create(SearchBatchResponseSchema)` to create a new message. */ export const SearchBatchResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 94); + messageDesc(file_points, 98); /** * @generated from message qdrant.SearchGroupsResponse @@ -4538,7 +4767,7 @@ export type SearchGroupsResponse = Message<"qdrant.SearchGroupsResponse"> & { * Use `create(SearchGroupsResponseSchema)` to create a new message. */ export const SearchGroupsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 95); + messageDesc(file_points, 99); /** * @generated from message qdrant.CountResponse @@ -4567,7 +4796,7 @@ export type CountResponse = Message<"qdrant.CountResponse"> & { * Use `create(CountResponseSchema)` to create a new message. */ export const CountResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 96); + messageDesc(file_points, 100); /** * @generated from message qdrant.ScrollResponse @@ -4603,7 +4832,7 @@ export type ScrollResponse = Message<"qdrant.ScrollResponse"> & { * Use `create(ScrollResponseSchema)` to create a new message. */ export const ScrollResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 97); + messageDesc(file_points, 101); /** * @generated from message qdrant.CountResult @@ -4620,7 +4849,7 @@ export type CountResult = Message<"qdrant.CountResult"> & { * Use `create(CountResultSchema)` to create a new message. */ export const CountResultSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 98); + messageDesc(file_points, 102); /** * @generated from message qdrant.RetrievedPoint @@ -4661,7 +4890,7 @@ export type RetrievedPoint = Message<"qdrant.RetrievedPoint"> & { * Use `create(RetrievedPointSchema)` to create a new message. */ export const RetrievedPointSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 99); + messageDesc(file_points, 103); /** * @generated from message qdrant.GetResponse @@ -4690,7 +4919,7 @@ export type GetResponse = Message<"qdrant.GetResponse"> & { * Use `create(GetResponseSchema)` to create a new message. */ export const GetResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 100); + messageDesc(file_points, 104); /** * @generated from message qdrant.RecommendResponse @@ -4719,7 +4948,7 @@ export type RecommendResponse = Message<"qdrant.RecommendResponse"> & { * Use `create(RecommendResponseSchema)` to create a new message. */ export const RecommendResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 101); + messageDesc(file_points, 105); /** * @generated from message qdrant.RecommendBatchResponse @@ -4748,7 +4977,7 @@ export type RecommendBatchResponse = Message<"qdrant.RecommendBatchResponse"> & * Use `create(RecommendBatchResponseSchema)` to create a new message. */ export const RecommendBatchResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 102); + messageDesc(file_points, 106); /** * @generated from message qdrant.DiscoverResponse @@ -4777,7 +5006,7 @@ export type DiscoverResponse = Message<"qdrant.DiscoverResponse"> & { * Use `create(DiscoverResponseSchema)` to create a new message. */ export const DiscoverResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 103); + messageDesc(file_points, 107); /** * @generated from message qdrant.DiscoverBatchResponse @@ -4806,7 +5035,7 @@ export type DiscoverBatchResponse = Message<"qdrant.DiscoverBatchResponse"> & { * Use `create(DiscoverBatchResponseSchema)` to create a new message. */ export const DiscoverBatchResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 104); + messageDesc(file_points, 108); /** * @generated from message qdrant.RecommendGroupsResponse @@ -4835,7 +5064,7 @@ export type RecommendGroupsResponse = Message<"qdrant.RecommendGroupsResponse"> * Use `create(RecommendGroupsResponseSchema)` to create a new message. */ export const RecommendGroupsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 105); + messageDesc(file_points, 109); /** * @generated from message qdrant.UpdateBatchResponse @@ -4864,7 +5093,7 @@ export type UpdateBatchResponse = Message<"qdrant.UpdateBatchResponse"> & { * Use `create(UpdateBatchResponseSchema)` to create a new message. */ export const UpdateBatchResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 106); + messageDesc(file_points, 110); /** * @generated from message qdrant.FacetResponse @@ -4893,7 +5122,7 @@ export type FacetResponse = Message<"qdrant.FacetResponse"> & { * Use `create(FacetResponseSchema)` to create a new message. */ export const FacetResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 107); + messageDesc(file_points, 111); /** * @generated from message qdrant.SearchMatrixPairsResponse @@ -4922,7 +5151,7 @@ export type SearchMatrixPairsResponse = Message<"qdrant.SearchMatrixPairsRespons * Use `create(SearchMatrixPairsResponseSchema)` to create a new message. */ export const SearchMatrixPairsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 108); + messageDesc(file_points, 112); /** * @generated from message qdrant.SearchMatrixOffsetsResponse @@ -4951,7 +5180,7 @@ export type SearchMatrixOffsetsResponse = Message<"qdrant.SearchMatrixOffsetsRes * Use `create(SearchMatrixOffsetsResponseSchema)` to create a new message. */ export const SearchMatrixOffsetsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 109); + messageDesc(file_points, 113); /** * @generated from message qdrant.PointsSelector @@ -4980,7 +5209,7 @@ export type PointsSelector = Message<"qdrant.PointsSelector"> & { * Use `create(PointsSelectorSchema)` to create a new message. */ export const PointsSelectorSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 110); + messageDesc(file_points, 114); /** * @generated from message qdrant.PointsIdsList @@ -4997,7 +5226,7 @@ export type PointsIdsList = Message<"qdrant.PointsIdsList"> & { * Use `create(PointsIdsListSchema)` to create a new message. */ export const PointsIdsListSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 111); + messageDesc(file_points, 115); /** * @generated from message qdrant.PointStruct @@ -5024,7 +5253,7 @@ export type PointStruct = Message<"qdrant.PointStruct"> & { * Use `create(PointStructSchema)` to create a new message. */ export const PointStructSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 112); + messageDesc(file_points, 116); /** * --------------------------------------------- @@ -5050,7 +5279,7 @@ export type Usage = Message<"qdrant.Usage"> & { * Use `create(UsageSchema)` to create a new message. */ export const UsageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 113); + messageDesc(file_points, 117); /** * @generated from message qdrant.InferenceUsage @@ -5067,7 +5296,7 @@ export type InferenceUsage = Message<"qdrant.InferenceUsage"> & { * Use `create(InferenceUsageSchema)` to create a new message. */ export const InferenceUsageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 114); + messageDesc(file_points, 118); /** * @generated from message qdrant.ModelUsage @@ -5084,7 +5313,7 @@ export type ModelUsage = Message<"qdrant.ModelUsage"> & { * Use `create(ModelUsageSchema)` to create a new message. */ export const ModelUsageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 115); + messageDesc(file_points, 119); /** * @generated from message qdrant.HardwareUsage @@ -5131,7 +5360,7 @@ export type HardwareUsage = Message<"qdrant.HardwareUsage"> & { * Use `create(HardwareUsageSchema)` to create a new message. */ export const HardwareUsageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_points, 116); + messageDesc(file_points, 120); /** * @generated from enum qdrant.WriteOrderingType @@ -5145,14 +5374,16 @@ export enum WriteOrderingType { Weak = 0, /** - * Write operations go through dynamically selected leader, may be inconsistent for a short period of time in case of leader change + * Write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change * * @generated from enum value: Medium = 1; */ Medium = 1, /** - * Write operations go through the permanent leader, consistent, but may be unavailable if leader is down + * Write operations go through the permanent leader, consistent, + * but may be unavailable if leader is down * * @generated from enum value: Strong = 2; */ @@ -5165,6 +5396,40 @@ export enum WriteOrderingType { export const WriteOrderingTypeSchema: GenEnum = /*@__PURE__*/ enumDesc(file_points, 0); +/** + * Defines the mode of the upsert operation + * + * @generated from enum qdrant.UpdateMode + */ +export enum UpdateMode { + /** + * Default mode - insert new points, update existing points + * + * @generated from enum value: Upsert = 0; + */ + Upsert = 0, + + /** + * Only insert new points, do not update existing points + * + * @generated from enum value: InsertOnly = 1; + */ + InsertOnly = 1, + + /** + * Only update existing points, do not insert new points + * + * @generated from enum value: UpdateOnly = 2; + */ + UpdateOnly = 2, +} + +/** + * Describes the enum qdrant.UpdateMode. + */ +export const UpdateModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_points, 1); + /** * @generated from enum qdrant.ReadConsistencyType */ @@ -5195,7 +5460,7 @@ export enum ReadConsistencyType { * Describes the enum qdrant.ReadConsistencyType. */ export const ReadConsistencyTypeSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 1); + enumDesc(file_points, 2); /** * @generated from enum qdrant.FieldType @@ -5246,7 +5511,7 @@ export enum FieldType { * Describes the enum qdrant.FieldType. */ export const FieldTypeSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 2); + enumDesc(file_points, 3); /** * @generated from enum qdrant.Direction @@ -5267,7 +5532,7 @@ export enum Direction { * Describes the enum qdrant.Direction. */ export const DirectionSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 3); + enumDesc(file_points, 4); /** * How to use positive and negative vectors to find the results, default is `AverageVector`. @@ -5305,7 +5570,7 @@ export enum RecommendStrategy { * Describes the enum qdrant.RecommendStrategy. */ export const RecommendStrategySchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 4); + enumDesc(file_points, 5); /** * @generated from enum qdrant.Fusion @@ -5330,7 +5595,7 @@ export enum Fusion { * Describes the enum qdrant.Fusion. */ export const FusionSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 5); + enumDesc(file_points, 6); /** * Sample points from the collection @@ -5352,7 +5617,7 @@ export enum Sample { * Describes the enum qdrant.Sample. */ export const SampleSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 6); + enumDesc(file_points, 7); /** * @generated from enum qdrant.UpdateStatus @@ -5383,11 +5648,18 @@ export enum UpdateStatus { * @generated from enum value: ClockRejected = 3; */ ClockRejected = 3, + + /** + * Timeout of awaited operations + * + * @generated from enum value: WaitTimeout = 4; + */ + WaitTimeout = 4, } /** * Describes the enum qdrant.UpdateStatus. */ export const UpdateStatusSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_points, 7); + enumDesc(file_points, 8); diff --git a/packages/js-client-grpc/src/proto/points_service_pb.ts b/packages/js-client-grpc/src/proto/points_service_pb.ts index bc115ea..900b108 100644 --- a/packages/js-client-grpc/src/proto/points_service_pb.ts +++ b/packages/js-client-grpc/src/proto/points_service_pb.ts @@ -18,8 +18,8 @@ export const file_points_service: GenFile = /*@__PURE__*/ */ export const Points: GenService<{ /** - * - * Perform insert + updates on points. If a point with a given ID already exists - it will be overwritten. + * Perform insert + updates on points. + * If a point with a given ID already exists - it will be overwritten. * * @generated from rpc qdrant.Points.Upsert */ @@ -29,7 +29,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Delete points * * @generated from rpc qdrant.Points.Delete @@ -40,7 +39,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Retrieve points * * @generated from rpc qdrant.Points.Get @@ -51,7 +49,6 @@ export const Points: GenService<{ output: typeof GetResponseSchema; }, /** - * * Update named vectors for point * * @generated from rpc qdrant.Points.UpdateVectors @@ -62,7 +59,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Delete named vectors for points * * @generated from rpc qdrant.Points.DeleteVectors @@ -73,7 +69,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Set payload for points * * @generated from rpc qdrant.Points.SetPayload @@ -84,7 +79,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Overwrite payload for points * * @generated from rpc qdrant.Points.OverwritePayload @@ -95,7 +89,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Delete specified key payload for points * * @generated from rpc qdrant.Points.DeletePayload @@ -106,7 +99,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Remove all payload for specified points * * @generated from rpc qdrant.Points.ClearPayload @@ -117,7 +109,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Create index for field in collection * * @generated from rpc qdrant.Points.CreateFieldIndex @@ -128,7 +119,6 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * * Delete field index for collection * * @generated from rpc qdrant.Points.DeleteFieldIndex @@ -139,8 +129,8 @@ export const Points: GenService<{ output: typeof PointsOperationResponseSchema; }, /** - * - * Retrieve closest points based on vector similarity and given filtering conditions + * Retrieve closest points based on vector similarity and given filtering + * conditions * * @generated from rpc qdrant.Points.Search */ @@ -150,8 +140,8 @@ export const Points: GenService<{ output: typeof SearchResponseSchema; }, /** - * - * Retrieve closest points based on vector similarity and given filtering conditions + * Retrieve closest points based on vector similarity and given filtering + * conditions * * @generated from rpc qdrant.Points.SearchBatch */ @@ -161,8 +151,8 @@ export const Points: GenService<{ output: typeof SearchBatchResponseSchema; }, /** - * - * Retrieve closest points based on vector similarity and given filtering conditions, grouped by a given field + * Retrieve closest points based on vector similarity and given filtering + * conditions, grouped by a given field * * @generated from rpc qdrant.Points.SearchGroups */ @@ -172,7 +162,6 @@ export const Points: GenService<{ output: typeof SearchGroupsResponseSchema; }, /** - * * Iterate over all or filtered points * * @generated from rpc qdrant.Points.Scroll @@ -183,8 +172,8 @@ export const Points: GenService<{ output: typeof ScrollResponseSchema; }, /** - * - * Look for the points which are closer to stored positive examples and at the same time further to negative examples. + * Look for the points which are closer to stored positive examples and at + * the same time further to negative examples. * * @generated from rpc qdrant.Points.Recommend */ @@ -194,8 +183,8 @@ export const Points: GenService<{ output: typeof RecommendResponseSchema; }, /** - * - * Look for the points which are closer to stored positive examples and at the same time further to negative examples. + * Look for the points which are closer to stored positive examples and at + * the same time further to negative examples. * * @generated from rpc qdrant.Points.RecommendBatch */ @@ -205,8 +194,8 @@ export const Points: GenService<{ output: typeof RecommendBatchResponseSchema; }, /** - * - * Look for the points which are closer to stored positive examples and at the same time further to negative examples, grouped by a given field + * Look for the points which are closer to stored positive examples and at + * the same time further to negative examples, grouped by a given field * * @generated from rpc qdrant.Points.RecommendGroups */ @@ -216,22 +205,25 @@ export const Points: GenService<{ output: typeof RecommendGroupsResponseSchema; }, /** - * - * Use context and a target to find the most similar points to the target, constrained by the context. - * - * When using only the context (without a target), a special search - called context search - is performed where - * pairs of points are used to generate a loss that guides the search towards the zone where - * most positive examples overlap. This means that the score minimizes the scenario of - * finding a point closer to a negative than to a positive part of a pair. - * - * Since the score of a context relates to loss, the maximum score a point can get is 0.0, - * and it becomes normal that many points can have a score of 0.0. - * - * When using target (with or without context), the score behaves a little different: The - * integer part of the score represents the rank with respect to the context, while the - * decimal part of the score relates to the distance to the target. The context part of the score for - * each pair is calculated +1 if the point is closer to a positive than to a negative part of a pair, - * and -1 otherwise. + * Use context and a target to find the most similar points to the target, + * constrained by the context. + * + * When using only the context (without a target), a special search - called + * context search - is performed where pairs of points are used to generate a + * loss that guides the search towards the zone where most positive examples + * overlap. This means that the score minimizes the scenario of finding a + * point closer to a negative than to a positive part of a pair. + * + * Since the score of a context relates to loss, the maximum score a point + * can get is 0.0, and it becomes normal that many points can have a score of + * 0.0. + * + * When using target (with or without context), the score behaves a little + * different: The integer part of the score represents the rank with respect + * to the context, while the decimal part of the score relates to the + * distance to the target. The context part of the score for each pair is + * calculated +1 if the point is closer to a positive than to a negative part + * of a pair, and -1 otherwise. * * @generated from rpc qdrant.Points.Discover */ @@ -241,7 +233,6 @@ export const Points: GenService<{ output: typeof DiscoverResponseSchema; }, /** - * * Batch request points based on { positive, negative } pairs of examples, and/or a target * * @generated from rpc qdrant.Points.DiscoverBatch @@ -252,7 +243,6 @@ export const Points: GenService<{ output: typeof DiscoverBatchResponseSchema; }, /** - * * Count points in collection with given filtering conditions * * @generated from rpc qdrant.Points.Count @@ -263,7 +253,6 @@ export const Points: GenService<{ output: typeof CountResponseSchema; }, /** - * * Perform multiple update operations in one request * * @generated from rpc qdrant.Points.UpdateBatch @@ -274,8 +263,9 @@ export const Points: GenService<{ output: typeof UpdateBatchResponseSchema; }, /** - * - * Universally query points. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. + * Universally query points. + * This endpoint covers all capabilities of search, recommend, discover, filters. + * But also enables hybrid and multi-stage queries. * * @generated from rpc qdrant.Points.Query */ @@ -285,8 +275,9 @@ export const Points: GenService<{ output: typeof QueryResponseSchema; }, /** - * - * Universally query points in a batch fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. + * Universally query points in a batch fashion. + * This endpoint covers all capabilities of search, recommend, discover, filters. + * But also enables hybrid and multi-stage queries. * * @generated from rpc qdrant.Points.QueryBatch */ @@ -296,8 +287,9 @@ export const Points: GenService<{ output: typeof QueryBatchResponseSchema; }, /** - * - * Universally query points in a group fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. + * Universally query points in a group fashion. + * This endpoint covers all capabilities of search, recommend, discover, filters. + * But also enables hybrid and multi-stage queries. * * @generated from rpc qdrant.Points.QueryGroups */ @@ -307,8 +299,9 @@ export const Points: GenService<{ output: typeof QueryGroupsResponseSchema; }, /** - * - * Perform facet counts. For each value in the field, count the number of points that have this value and match the conditions. + * Perform facet counts. + * For each value in the field, count the number of points that have this + * value and match the conditions. * * @generated from rpc qdrant.Points.Facet */ @@ -318,7 +311,6 @@ export const Points: GenService<{ output: typeof FacetResponseSchema; }, /** - * * Compute distance matrix for sampled points with a pair based output format * * @generated from rpc qdrant.Points.SearchMatrixPairs @@ -329,7 +321,6 @@ export const Points: GenService<{ output: typeof SearchMatrixPairsResponseSchema; }, /** - * * Compute distance matrix for sampled points with an offset based output format * * @generated from rpc qdrant.Points.SearchMatrixOffsets diff --git a/packages/js-client-grpc/src/proto/qdrant_common_pb.ts b/packages/js-client-grpc/src/proto/qdrant_common_pb.ts new file mode 100644 index 0000000..eb7d7c5 --- /dev/null +++ b/packages/js-client-grpc/src/proto/qdrant_common_pb.ts @@ -0,0 +1,694 @@ +// @generated by protoc-gen-es v2.10.1 with parameter "target=ts,import_extension=js" +// @generated from file qdrant_common.proto (package qdrant, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file qdrant_common.proto. + */ +export const file_qdrant_common: GenFile = /*@__PURE__*/ + fileDesc("ChNxZHJhbnRfY29tbW9uLnByb3RvEgZxZHJhbnQiPAoHUG9pbnRJZBINCgNudW0YASABKARIABIOCgR1dWlkGAIgASgJSABCEgoQcG9pbnRfaWRfb3B0aW9ucyIkCghHZW9Qb2ludBILCgNsb24YASABKAESCwoDbGF0GAIgASgBIqwBCgZGaWx0ZXISIQoGc2hvdWxkGAEgAygLMhEucWRyYW50LkNvbmRpdGlvbhIfCgRtdXN0GAIgAygLMhEucWRyYW50LkNvbmRpdGlvbhIjCghtdXN0X25vdBgDIAMoCzIRLnFkcmFudC5Db25kaXRpb24SKgoKbWluX3Nob3VsZBgEIAEoCzIRLnFkcmFudC5NaW5TaG91bGRIAIgBAUINCgtfbWluX3Nob3VsZCJFCglNaW5TaG91bGQSJQoKY29uZGl0aW9ucxgBIAMoCzIRLnFkcmFudC5Db25kaXRpb24SEQoJbWluX2NvdW50GAIgASgEIssCCglDb25kaXRpb24SJwoFZmllbGQYASABKAsyFi5xZHJhbnQuRmllbGRDb25kaXRpb25IABIsCghpc19lbXB0eRgCIAEoCzIYLnFkcmFudC5Jc0VtcHR5Q29uZGl0aW9uSAASKAoGaGFzX2lkGAMgASgLMhYucWRyYW50Lkhhc0lkQ29uZGl0aW9uSAASIAoGZmlsdGVyGAQgASgLMg4ucWRyYW50LkZpbHRlckgAEioKB2lzX251bGwYBSABKAsyFy5xZHJhbnQuSXNOdWxsQ29uZGl0aW9uSAASKQoGbmVzdGVkGAYgASgLMhcucWRyYW50Lk5lc3RlZENvbmRpdGlvbkgAEjAKCmhhc192ZWN0b3IYByABKAsyGi5xZHJhbnQuSGFzVmVjdG9yQ29uZGl0aW9uSABCEgoQY29uZGl0aW9uX29uZV9vZiIfChBJc0VtcHR5Q29uZGl0aW9uEgsKA2tleRgBIAEoCSIeCg9Jc051bGxDb25kaXRpb24SCwoDa2V5GAEgASgJIjEKDkhhc0lkQ29uZGl0aW9uEh8KBmhhc19pZBgBIAMoCzIPLnFkcmFudC5Qb2ludElkIigKEkhhc1ZlY3RvckNvbmRpdGlvbhISCgpoYXNfdmVjdG9yGAEgASgJIj4KD05lc3RlZENvbmRpdGlvbhILCgNrZXkYASABKAkSHgoGZmlsdGVyGAIgASgLMg4ucWRyYW50LkZpbHRlciL7AgoORmllbGRDb25kaXRpb24SCwoDa2V5GAEgASgJEhwKBW1hdGNoGAIgASgLMg0ucWRyYW50Lk1hdGNoEhwKBXJhbmdlGAMgASgLMg0ucWRyYW50LlJhbmdlEjAKEGdlb19ib3VuZGluZ19ib3gYBCABKAsyFi5xZHJhbnQuR2VvQm91bmRpbmdCb3gSJQoKZ2VvX3JhZGl1cxgFIAEoCzIRLnFkcmFudC5HZW9SYWRpdXMSKQoMdmFsdWVzX2NvdW50GAYgASgLMhMucWRyYW50LlZhbHVlc0NvdW50EicKC2dlb19wb2x5Z29uGAcgASgLMhIucWRyYW50Lkdlb1BvbHlnb24SLQoOZGF0ZXRpbWVfcmFuZ2UYCCABKAsyFS5xZHJhbnQuRGF0ZXRpbWVSYW5nZRIVCghpc19lbXB0eRgJIAEoCEgAiAEBEhQKB2lzX251bGwYCiABKAhIAYgBAUILCglfaXNfZW1wdHlCCgoIX2lzX251bGwiyQIKBU1hdGNoEhEKB2tleXdvcmQYASABKAlIABIRCgdpbnRlZ2VyGAIgASgDSAASEQoHYm9vbGVhbhgDIAEoCEgAEg4KBHRleHQYBCABKAlIABIrCghrZXl3b3JkcxgFIAEoCzIXLnFkcmFudC5SZXBlYXRlZFN0cmluZ3NIABIsCghpbnRlZ2VycxgGIAEoCzIYLnFkcmFudC5SZXBlYXRlZEludGVnZXJzSAASMwoPZXhjZXB0X2ludGVnZXJzGAcgASgLMhgucWRyYW50LlJlcGVhdGVkSW50ZWdlcnNIABIyCg9leGNlcHRfa2V5d29yZHMYCCABKAsyFy5xZHJhbnQuUmVwZWF0ZWRTdHJpbmdzSAASEAoGcGhyYXNlGAkgASgJSAASEgoIdGV4dF9hbnkYCiABKAlIAEINCgttYXRjaF92YWx1ZSIiCg9SZXBlYXRlZFN0cmluZ3MSDwoHc3RyaW5ncxgBIAMoCSIkChBSZXBlYXRlZEludGVnZXJzEhAKCGludGVnZXJzGAEgAygDImsKBVJhbmdlEg8KAmx0GAEgASgBSACIAQESDwoCZ3QYAiABKAFIAYgBARIQCgNndGUYAyABKAFIAogBARIQCgNsdGUYBCABKAFIA4gBAUIFCgNfbHRCBQoDX2d0QgYKBF9ndGVCBgoEX2x0ZSLjAQoNRGF0ZXRpbWVSYW5nZRIrCgJsdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBARIrCgJndBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAYgBARIsCgNndGUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAKIAQESLAoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDiAEBQgUKA19sdEIFCgNfZ3RCBgoEX2d0ZUIGCgRfbHRlIlwKDkdlb0JvdW5kaW5nQm94EiIKCHRvcF9sZWZ0GAEgASgLMhAucWRyYW50Lkdlb1BvaW50EiYKDGJvdHRvbV9yaWdodBgCIAEoCzIQLnFkcmFudC5HZW9Qb2ludCI9CglHZW9SYWRpdXMSIAoGY2VudGVyGAEgASgLMhAucWRyYW50Lkdlb1BvaW50Eg4KBnJhZGl1cxgCIAEoAiIxCg1HZW9MaW5lU3RyaW5nEiAKBnBvaW50cxgBIAMoCzIQLnFkcmFudC5HZW9Qb2ludCJfCgpHZW9Qb2x5Z29uEicKCGV4dGVyaW9yGAEgASgLMhUucWRyYW50Lkdlb0xpbmVTdHJpbmcSKAoJaW50ZXJpb3JzGAIgAygLMhUucWRyYW50Lkdlb0xpbmVTdHJpbmcicQoLVmFsdWVzQ291bnQSDwoCbHQYASABKARIAIgBARIPCgJndBgCIAEoBEgBiAEBEhAKA2d0ZRgDIAEoBEgCiAEBEhAKA2x0ZRgEIAEoBEgDiAEBQgUKA19sdEIFCgNfZ3RCBgoEX2d0ZUIGCgRfbHRlQh1CBkNvbW1vbqoCElFkcmFudC5DbGllbnQuR3JwY2IGcHJvdG8z", [file_google_protobuf_timestamp]); + +/** + * @generated from message qdrant.PointId + */ +export type PointId = Message<"qdrant.PointId"> & { + /** + * @generated from oneof qdrant.PointId.point_id_options + */ + pointIdOptions: { + /** + * Numerical ID of the point + * + * @generated from field: uint64 num = 1; + */ + value: bigint; + case: "num"; + } | { + /** + * UUID + * + * @generated from field: string uuid = 2; + */ + value: string; + case: "uuid"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message qdrant.PointId. + * Use `create(PointIdSchema)` to create a new message. + */ +export const PointIdSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 0); + +/** + * @generated from message qdrant.GeoPoint + */ +export type GeoPoint = Message<"qdrant.GeoPoint"> & { + /** + * @generated from field: double lon = 1; + */ + lon: number; + + /** + * @generated from field: double lat = 2; + */ + lat: number; +}; + +/** + * Describes the message qdrant.GeoPoint. + * Use `create(GeoPointSchema)` to create a new message. + */ +export const GeoPointSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 1); + +/** + * @generated from message qdrant.Filter + */ +export type Filter = Message<"qdrant.Filter"> & { + /** + * At least one of those conditions should match + * + * @generated from field: repeated qdrant.Condition should = 1; + */ + should: Condition[]; + + /** + * All conditions must match + * + * @generated from field: repeated qdrant.Condition must = 2; + */ + must: Condition[]; + + /** + * All conditions must NOT match + * + * @generated from field: repeated qdrant.Condition must_not = 3; + */ + mustNot: Condition[]; + + /** + * At least minimum amount of given conditions should match + * + * @generated from field: optional qdrant.MinShould min_should = 4; + */ + minShould?: MinShould; +}; + +/** + * Describes the message qdrant.Filter. + * Use `create(FilterSchema)` to create a new message. + */ +export const FilterSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 2); + +/** + * @generated from message qdrant.MinShould + */ +export type MinShould = Message<"qdrant.MinShould"> & { + /** + * @generated from field: repeated qdrant.Condition conditions = 1; + */ + conditions: Condition[]; + + /** + * @generated from field: uint64 min_count = 2; + */ + minCount: bigint; +}; + +/** + * Describes the message qdrant.MinShould. + * Use `create(MinShouldSchema)` to create a new message. + */ +export const MinShouldSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 3); + +/** + * @generated from message qdrant.Condition + */ +export type Condition = Message<"qdrant.Condition"> & { + /** + * @generated from oneof qdrant.Condition.condition_one_of + */ + conditionOneOf: { + /** + * @generated from field: qdrant.FieldCondition field = 1; + */ + value: FieldCondition; + case: "field"; + } | { + /** + * @generated from field: qdrant.IsEmptyCondition is_empty = 2; + */ + value: IsEmptyCondition; + case: "isEmpty"; + } | { + /** + * @generated from field: qdrant.HasIdCondition has_id = 3; + */ + value: HasIdCondition; + case: "hasId"; + } | { + /** + * @generated from field: qdrant.Filter filter = 4; + */ + value: Filter; + case: "filter"; + } | { + /** + * @generated from field: qdrant.IsNullCondition is_null = 5; + */ + value: IsNullCondition; + case: "isNull"; + } | { + /** + * @generated from field: qdrant.NestedCondition nested = 6; + */ + value: NestedCondition; + case: "nested"; + } | { + /** + * @generated from field: qdrant.HasVectorCondition has_vector = 7; + */ + value: HasVectorCondition; + case: "hasVector"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message qdrant.Condition. + * Use `create(ConditionSchema)` to create a new message. + */ +export const ConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 4); + +/** + * @generated from message qdrant.IsEmptyCondition + */ +export type IsEmptyCondition = Message<"qdrant.IsEmptyCondition"> & { + /** + * @generated from field: string key = 1; + */ + key: string; +}; + +/** + * Describes the message qdrant.IsEmptyCondition. + * Use `create(IsEmptyConditionSchema)` to create a new message. + */ +export const IsEmptyConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 5); + +/** + * @generated from message qdrant.IsNullCondition + */ +export type IsNullCondition = Message<"qdrant.IsNullCondition"> & { + /** + * @generated from field: string key = 1; + */ + key: string; +}; + +/** + * Describes the message qdrant.IsNullCondition. + * Use `create(IsNullConditionSchema)` to create a new message. + */ +export const IsNullConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 6); + +/** + * @generated from message qdrant.HasIdCondition + */ +export type HasIdCondition = Message<"qdrant.HasIdCondition"> & { + /** + * @generated from field: repeated qdrant.PointId has_id = 1; + */ + hasId: PointId[]; +}; + +/** + * Describes the message qdrant.HasIdCondition. + * Use `create(HasIdConditionSchema)` to create a new message. + */ +export const HasIdConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 7); + +/** + * @generated from message qdrant.HasVectorCondition + */ +export type HasVectorCondition = Message<"qdrant.HasVectorCondition"> & { + /** + * @generated from field: string has_vector = 1; + */ + hasVector: string; +}; + +/** + * Describes the message qdrant.HasVectorCondition. + * Use `create(HasVectorConditionSchema)` to create a new message. + */ +export const HasVectorConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 8); + +/** + * @generated from message qdrant.NestedCondition + */ +export type NestedCondition = Message<"qdrant.NestedCondition"> & { + /** + * Path to nested object + * + * @generated from field: string key = 1; + */ + key: string; + + /** + * Filter condition + * + * @generated from field: qdrant.Filter filter = 2; + */ + filter?: Filter; +}; + +/** + * Describes the message qdrant.NestedCondition. + * Use `create(NestedConditionSchema)` to create a new message. + */ +export const NestedConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 9); + +/** + * @generated from message qdrant.FieldCondition + */ +export type FieldCondition = Message<"qdrant.FieldCondition"> & { + /** + * @generated from field: string key = 1; + */ + key: string; + + /** + * Check if point has field with a given value + * + * @generated from field: qdrant.Match match = 2; + */ + match?: Match; + + /** + * Check if points value lies in a given range + * + * @generated from field: qdrant.Range range = 3; + */ + range?: Range; + + /** + * Check if points geolocation lies in a given area + * + * @generated from field: qdrant.GeoBoundingBox geo_bounding_box = 4; + */ + geoBoundingBox?: GeoBoundingBox; + + /** + * Check if geo point is within a given radius + * + * @generated from field: qdrant.GeoRadius geo_radius = 5; + */ + geoRadius?: GeoRadius; + + /** + * Check number of values for a specific field + * + * @generated from field: qdrant.ValuesCount values_count = 6; + */ + valuesCount?: ValuesCount; + + /** + * Check if geo point is within a given polygon + * + * @generated from field: qdrant.GeoPolygon geo_polygon = 7; + */ + geoPolygon?: GeoPolygon; + + /** + * Check if datetime is within a given range + * + * @generated from field: qdrant.DatetimeRange datetime_range = 8; + */ + datetimeRange?: DatetimeRange; + + /** + * Check if field is empty + * + * @generated from field: optional bool is_empty = 9; + */ + isEmpty?: boolean; + + /** + * Check if field is null + * + * @generated from field: optional bool is_null = 10; + */ + isNull?: boolean; +}; + +/** + * Describes the message qdrant.FieldCondition. + * Use `create(FieldConditionSchema)` to create a new message. + */ +export const FieldConditionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 10); + +/** + * @generated from message qdrant.Match + */ +export type Match = Message<"qdrant.Match"> & { + /** + * @generated from oneof qdrant.Match.match_value + */ + matchValue: { + /** + * Match string keyword + * + * @generated from field: string keyword = 1; + */ + value: string; + case: "keyword"; + } | { + /** + * Match integer + * + * @generated from field: int64 integer = 2; + */ + value: bigint; + case: "integer"; + } | { + /** + * Match boolean + * + * @generated from field: bool boolean = 3; + */ + value: boolean; + case: "boolean"; + } | { + /** + * Match text + * + * @generated from field: string text = 4; + */ + value: string; + case: "text"; + } | { + /** + * Match multiple keywords + * + * @generated from field: qdrant.RepeatedStrings keywords = 5; + */ + value: RepeatedStrings; + case: "keywords"; + } | { + /** + * Match multiple integers + * + * @generated from field: qdrant.RepeatedIntegers integers = 6; + */ + value: RepeatedIntegers; + case: "integers"; + } | { + /** + * Match any other value except those integers + * + * @generated from field: qdrant.RepeatedIntegers except_integers = 7; + */ + value: RepeatedIntegers; + case: "exceptIntegers"; + } | { + /** + * Match any other value except those keywords + * + * @generated from field: qdrant.RepeatedStrings except_keywords = 8; + */ + value: RepeatedStrings; + case: "exceptKeywords"; + } | { + /** + * Match phrase text + * + * @generated from field: string phrase = 9; + */ + value: string; + case: "phrase"; + } | { + /** + * Match any word in the text + * + * @generated from field: string text_any = 10; + */ + value: string; + case: "textAny"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message qdrant.Match. + * Use `create(MatchSchema)` to create a new message. + */ +export const MatchSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 11); + +/** + * @generated from message qdrant.RepeatedStrings + */ +export type RepeatedStrings = Message<"qdrant.RepeatedStrings"> & { + /** + * @generated from field: repeated string strings = 1; + */ + strings: string[]; +}; + +/** + * Describes the message qdrant.RepeatedStrings. + * Use `create(RepeatedStringsSchema)` to create a new message. + */ +export const RepeatedStringsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 12); + +/** + * @generated from message qdrant.RepeatedIntegers + */ +export type RepeatedIntegers = Message<"qdrant.RepeatedIntegers"> & { + /** + * @generated from field: repeated int64 integers = 1; + */ + integers: bigint[]; +}; + +/** + * Describes the message qdrant.RepeatedIntegers. + * Use `create(RepeatedIntegersSchema)` to create a new message. + */ +export const RepeatedIntegersSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 13); + +/** + * @generated from message qdrant.Range + */ +export type Range = Message<"qdrant.Range"> & { + /** + * @generated from field: optional double lt = 1; + */ + lt?: number; + + /** + * @generated from field: optional double gt = 2; + */ + gt?: number; + + /** + * @generated from field: optional double gte = 3; + */ + gte?: number; + + /** + * @generated from field: optional double lte = 4; + */ + lte?: number; +}; + +/** + * Describes the message qdrant.Range. + * Use `create(RangeSchema)` to create a new message. + */ +export const RangeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 14); + +/** + * @generated from message qdrant.DatetimeRange + */ +export type DatetimeRange = Message<"qdrant.DatetimeRange"> & { + /** + * @generated from field: optional google.protobuf.Timestamp lt = 1; + */ + lt?: Timestamp; + + /** + * @generated from field: optional google.protobuf.Timestamp gt = 2; + */ + gt?: Timestamp; + + /** + * @generated from field: optional google.protobuf.Timestamp gte = 3; + */ + gte?: Timestamp; + + /** + * @generated from field: optional google.protobuf.Timestamp lte = 4; + */ + lte?: Timestamp; +}; + +/** + * Describes the message qdrant.DatetimeRange. + * Use `create(DatetimeRangeSchema)` to create a new message. + */ +export const DatetimeRangeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 15); + +/** + * @generated from message qdrant.GeoBoundingBox + */ +export type GeoBoundingBox = Message<"qdrant.GeoBoundingBox"> & { + /** + * north-west corner + * + * @generated from field: qdrant.GeoPoint top_left = 1; + */ + topLeft?: GeoPoint; + + /** + * south-east corner + * + * @generated from field: qdrant.GeoPoint bottom_right = 2; + */ + bottomRight?: GeoPoint; +}; + +/** + * Describes the message qdrant.GeoBoundingBox. + * Use `create(GeoBoundingBoxSchema)` to create a new message. + */ +export const GeoBoundingBoxSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 16); + +/** + * @generated from message qdrant.GeoRadius + */ +export type GeoRadius = Message<"qdrant.GeoRadius"> & { + /** + * Center of the circle + * + * @generated from field: qdrant.GeoPoint center = 1; + */ + center?: GeoPoint; + + /** + * In meters + * + * @generated from field: float radius = 2; + */ + radius: number; +}; + +/** + * Describes the message qdrant.GeoRadius. + * Use `create(GeoRadiusSchema)` to create a new message. + */ +export const GeoRadiusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 17); + +/** + * @generated from message qdrant.GeoLineString + */ +export type GeoLineString = Message<"qdrant.GeoLineString"> & { + /** + * Ordered sequence of GeoPoints representing the line + * + * @generated from field: repeated qdrant.GeoPoint points = 1; + */ + points: GeoPoint[]; +}; + +/** + * Describes the message qdrant.GeoLineString. + * Use `create(GeoLineStringSchema)` to create a new message. + */ +export const GeoLineStringSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 18); + +/** + * For a valid GeoPolygon, both the exterior and interior GeoLineStrings must + * consist of a minimum of 4 points. + * Additionally, the first and last points of each GeoLineString must be the same. + * + * @generated from message qdrant.GeoPolygon + */ +export type GeoPolygon = Message<"qdrant.GeoPolygon"> & { + /** + * The exterior line bounds the surface + * + * @generated from field: qdrant.GeoLineString exterior = 1; + */ + exterior?: GeoLineString; + + /** + * Interior lines (if present) bound holes within the surface + * + * @generated from field: repeated qdrant.GeoLineString interiors = 2; + */ + interiors: GeoLineString[]; +}; + +/** + * Describes the message qdrant.GeoPolygon. + * Use `create(GeoPolygonSchema)` to create a new message. + */ +export const GeoPolygonSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 19); + +/** + * @generated from message qdrant.ValuesCount + */ +export type ValuesCount = Message<"qdrant.ValuesCount"> & { + /** + * @generated from field: optional uint64 lt = 1; + */ + lt?: bigint; + + /** + * @generated from field: optional uint64 gt = 2; + */ + gt?: bigint; + + /** + * @generated from field: optional uint64 gte = 3; + */ + gte?: bigint; + + /** + * @generated from field: optional uint64 lte = 4; + */ + lte?: bigint; +}; + +/** + * Describes the message qdrant.ValuesCount. + * Use `create(ValuesCountSchema)` to create a new message. + */ +export const ValuesCountSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_qdrant_common, 20); + diff --git a/packages/js-client-grpc/src/proto/snapshots_service_pb.ts b/packages/js-client-grpc/src/proto/snapshots_service_pb.ts index e507242..4faea60 100644 --- a/packages/js-client-grpc/src/proto/snapshots_service_pb.ts +++ b/packages/js-client-grpc/src/proto/snapshots_service_pb.ts @@ -235,7 +235,6 @@ export const DeleteSnapshotResponseSchema: GenMessage = */ export const Snapshots: GenService<{ /** - * * Create collection snapshot * * @generated from rpc qdrant.Snapshots.Create @@ -246,7 +245,6 @@ export const Snapshots: GenService<{ output: typeof CreateSnapshotResponseSchema; }, /** - * * List collection snapshots * * @generated from rpc qdrant.Snapshots.List @@ -257,7 +255,6 @@ export const Snapshots: GenService<{ output: typeof ListSnapshotsResponseSchema; }, /** - * * Delete collection snapshot * * @generated from rpc qdrant.Snapshots.Delete @@ -268,7 +265,6 @@ export const Snapshots: GenService<{ output: typeof DeleteSnapshotResponseSchema; }, /** - * * Create full storage snapshot * * @generated from rpc qdrant.Snapshots.CreateFull @@ -279,7 +275,6 @@ export const Snapshots: GenService<{ output: typeof CreateSnapshotResponseSchema; }, /** - * * List full storage snapshots * * @generated from rpc qdrant.Snapshots.ListFull @@ -290,7 +285,6 @@ export const Snapshots: GenService<{ output: typeof ListSnapshotsResponseSchema; }, /** - * * Delete full storage snapshot * * @generated from rpc qdrant.Snapshots.DeleteFull diff --git a/packages/js-client-rest/CHANGELOG.md b/packages/js-client-rest/CHANGELOG.md index 5c9275e..5283725 100644 --- a/packages/js-client-rest/CHANGELOG.md +++ b/packages/js-client-rest/CHANGELOG.md @@ -1,5 +1,15 @@ # @qdrant/js-client-rest +## v1.17.0 + +### Minor Changes + +- Qdrant v1.17.0 API +- Added `listShardKeys` method +- Added `clusterTelemetry` method +- Added `getOptimizations` method +- Added `timeout` parameter to write operations: `updateVectors`, `deleteVectors`, `setPayload`, `overwritePayload`, `deletePayload`, `clearPayload`, `batchUpdate` + ## v1.16.2 ### Patch Changes diff --git a/packages/js-client-rest/package.json b/packages/js-client-rest/package.json index 5aa8765..7e5e47f 100644 --- a/packages/js-client-rest/package.json +++ b/packages/js-client-rest/package.json @@ -1,6 +1,6 @@ { "name": "@qdrant/js-client-rest", - "version": "1.16.2", + "version": "1.17.0", "engines": { "node": ">=18.17.0", "pnpm": ">=8" @@ -55,7 +55,7 @@ }, "dependencies": { "@qdrant/openapi-typescript-fetch": "1.2.6", - "undici": "^6.0.0" + "undici": "^6.23.0" }, "devDependencies": { "@rollup/plugin-commonjs": "^24.1.0", diff --git a/packages/js-client-rest/src/client-version.ts b/packages/js-client-rest/src/client-version.ts index fd6c3fa..56aea71 100644 --- a/packages/js-client-rest/src/client-version.ts +++ b/packages/js-client-rest/src/client-version.ts @@ -1,4 +1,4 @@ -export const PACKAGE_VERSION = '1.16.2'; +export const PACKAGE_VERSION = '1.17.0'; interface Version { major: number; diff --git a/packages/js-client-rest/src/openapi/generated_api_client.ts b/packages/js-client-rest/src/openapi/generated_api_client.ts index 4d8d2d8..3593c42 100644 --- a/packages/js-client-rest/src/openapi/generated_api_client.ts +++ b/packages/js-client-rest/src/openapi/generated_api_client.ts @@ -5,6 +5,13 @@ import {ClientApi} from './generated_client_type.js'; export function createClientApi(client: Client) : ClientApi { return { + /** List shard keys */ + listShardKeys: + client + .path('/collections/{collection_name}/shards') + .method('get') + .create(), + /** Create shard key */ createShardKey: client @@ -113,6 +120,16 @@ export function createClientApi(client: Client) : ClientApi { .method('get') .create(), + /** + * Collect cluster telemetry data + * @description Get telemetry data, from the point of view of the cluster. This includes peers info, collections info, shard transfers, and resharding status + */ + clusterTelemetry: + client + .path('/cluster/telemetry') + .method('get') + .create(), + /** Tries to recover current peer Raft state. */ recoverCurrentPeer: client @@ -209,6 +226,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -232,6 +250,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -253,6 +272,16 @@ export function createClientApi(client: Client) : ClientApi { timeout: true, }), + /** + * Get optimization progress + * @description Get progress of ongoing and completed optimizations for a collection + */ + getOptimizations: + client + .path('/collections/{collection_name}/optimizations') + .method('get') + .create(), + /** * List aliases for collection * @description Get list of all aliases for a collection @@ -387,6 +416,16 @@ export function createClientApi(client: Client) : ClientApi { wait: true, }), + /** + * Download shard snapshot + * @description Stream the current state of a shard as a snapshot file + */ + streamShardSnapshot: + client + .path('/collections/{collection_name}/shards/{shard_id}/snapshot') + .method('get') + .create(), + /** * Recover shard from an uploaded snapshot * @description Recover shard of a local collection from an uploaded snapshot. This will overwrite any data, stored on this node, for the collection shard. @@ -478,6 +517,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -504,6 +544,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -517,6 +558,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -530,6 +572,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -543,6 +586,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -556,6 +600,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -569,6 +614,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -582,6 +628,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** @@ -595,6 +642,7 @@ export function createClientApi(client: Client) : ClientApi { .create({ wait: true, ordering: true, + timeout: true, }), /** diff --git a/packages/js-client-rest/src/openapi/generated_client_type.ts b/packages/js-client-rest/src/openapi/generated_client_type.ts index 4b9d482..dbb362b 100644 --- a/packages/js-client-rest/src/openapi/generated_client_type.ts +++ b/packages/js-client-rest/src/openapi/generated_client_type.ts @@ -4,6 +4,37 @@ import {TypedFetch} from '@qdrant/openapi-typescript-fetch'; import {components} from '../openapi/generated_schema.js'; export type ClientApi = { + /** List shard keys */ + listShardKeys: TypedFetch<{ + parameters: { + path: { + collection_name: string; + }; + }; + responses: { + 200: { + content: { + "application/json": { + usage?: components["schemas"]["Usage"] | (Record | null); + time?: number; + status?: string; + result?: components["schemas"]["ShardKeysResponse"]; + }; + }; + }; + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }>; + /** Create shard key */ createShardKey: TypedFetch<{ parameters: { @@ -106,6 +137,7 @@ export type ClientApi = { query?: { anonymize?: boolean; details_level?: number; + timeout?: number; }; }; responses: { @@ -140,6 +172,7 @@ export type ClientApi = { parameters: { query?: { anonymize?: boolean; + timeout?: number; }; }; responses: { @@ -220,10 +253,24 @@ export type ClientApi = { responses: { 200: { content: { - "application/json": boolean; + "application/json": { + usage?: components["schemas"]["Usage"] | (Record | null); + time?: number; + status?: string; + result?: boolean; + }; + }; + }; + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; - "4XX": never; }; }>; @@ -256,6 +303,41 @@ export type ClientApi = { }; }>; + /** + * Collect cluster telemetry data + * @description Get telemetry data, from the point of view of the cluster. This includes peers info, collections info, shard transfers, and resharding status + */ + clusterTelemetry: TypedFetch<{ + parameters: { + query?: { + details_level?: number; + timeout?: number; + }; + }; + responses: { + 200: { + content: { + "application/json": { + usage?: components["schemas"]["Usage"] | (Record | null); + time?: number; + status?: string; + result?: components["schemas"]["DistributedTelemetryData"]; + }; + }; + }; + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }>; + /** Tries to recover current peer Raft state. */ recoverCurrentPeer: TypedFetch<{ responses: { @@ -549,6 +631,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -626,6 +709,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -729,6 +813,44 @@ export type ClientApi = { }; }>; + /** + * Get optimization progress + * @description Get progress of ongoing and completed optimizations for a collection + */ + getOptimizations: TypedFetch<{ + parameters: { + query?: { + with?: string; + completed_limit?: number; + }; + path: { + collection_name: string; + }; + }; + responses: { + 200: { + content: { + "application/json": { + usage?: components["schemas"]["Usage"] | (Record | null); + time?: number; + status?: string; + result?: components["schemas"]["OptimizationsResponse"]; + }; + }; + }; + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }>; + /** * List aliases for collection * @description Get list of all aliases for a collection @@ -1190,6 +1312,36 @@ export type ClientApi = { }; }>; + /** + * Download shard snapshot + * @description Stream the current state of a shard as a snapshot file + */ + streamShardSnapshot: TypedFetch<{ + parameters: { + path: { + collection_name: string; + shard_id: number; + }; + }; + responses: { + 200: { + content: { + "application/octet-stream": string; + }; + }; + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }>; + /** * Recover shard from an uploaded snapshot * @description Recover shard of a local collection from an uploaded snapshot. This will overwrite any data, stored on this node, for the collection shard. @@ -1498,6 +1650,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1584,6 +1737,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1627,6 +1781,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1670,6 +1825,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1713,6 +1869,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1756,6 +1913,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1799,6 +1957,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1842,6 +2001,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; @@ -1885,6 +2045,7 @@ export type ClientApi = { query?: { wait?: boolean; ordering?: components["schemas"]["WriteOrdering"]; + timeout?: number; }; path: { collection_name: string; diff --git a/packages/js-client-rest/src/openapi/generated_schema.ts b/packages/js-client-rest/src/openapi/generated_schema.ts index 8b9b80d..70681c6 100644 --- a/packages/js-client-rest/src/openapi/generated_schema.ts +++ b/packages/js-client-rest/src/openapi/generated_schema.ts @@ -11,6 +11,8 @@ type OneOf = T extends [infer Only] ? Only : T extends [infer A export interface paths { "/collections/{collection_name}/shards": { + /** List shard keys */ + get: operations["list_shard_keys"]; /** Create shard key */ put: operations["create_shard_key"]; }; @@ -79,6 +81,13 @@ export interface paths { */ get: operations["cluster_status"]; }; + "/cluster/telemetry": { + /** + * Collect cluster telemetry data + * @description Get telemetry data, from the point of view of the cluster. This includes peers info, collections info, shard transfers, and resharding status + */ + get: operations["cluster_telemetry"]; + }; "/cluster/recover": { /** Tries to recover current peer Raft state. */ post: operations["recover_current_peer"]; @@ -153,6 +162,13 @@ export interface paths { /** Update collection cluster setup */ post: operations["update_collection_cluster"]; }; + "/collections/{collection_name}/optimizations": { + /** + * Get optimization progress + * @description Get progress of ongoing and completed optimizations for a collection + */ + get: operations["get_optimizations"]; + }; "/collections/{collection_name}/aliases": { /** * List aliases for collection @@ -229,6 +245,13 @@ export interface paths { */ delete: operations["delete_full_snapshot"]; }; + "/collections/{collection_name}/shards/{shard_id}/snapshot": { + /** + * Download shard snapshot + * @description Stream the current state of a shard as a snapshot file + */ + get: operations["stream_shard_snapshot"]; + }; "/collections/{collection_name}/shards/{shard_id}/snapshots/upload": { /** * Recover shard from an uploaded snapshot @@ -531,6 +554,8 @@ export interface components { payload_schema: { [key: string]: components["schemas"]["PayloadIndexInfo"] | undefined; }; + /** @description Update queue info */ + update_queue?: components["schemas"]["UpdateQueueInfo"] | (Record | null); }; /** * @description Current state of the collection. `Green` - all good. `Yellow` - optimization is running, 'Grey' - optimizations are possible but not triggered, `Red` - some operations failed and was not recovered @@ -584,6 +609,11 @@ export interface components { * @description Defines how many additional replicas should be processing read request at the same time. Default value is Auto, which means that fan-out will be determined automatically based on the busyness of the local replica. Having more than 0 might be useful to smooth latency spikes of individual nodes. */ read_fan_out_factor?: number | null; + /** + * Format: uint64 + * @description Define number of milliseconds to wait before attempting to read from another replica. This setting can help to reduce latency spikes in case of occasional slow replicas. Default is 0, which means delayed fan out request is disabled. + */ + read_fan_out_delay_ms?: number | null; /** * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. * @@ -838,6 +868,11 @@ export interface components { * @default null */ max_optimization_threads?: number | null; + /** + * @description If this option is set, service will try to prevent creation of large unoptimized segments. When enabled, updates may be blocked at request level if there are unoptimized segments larger than indexing threshold. Updates will be resumed when optimization is completed and segments are optimized below the threshold. Using this option may lead to increased delay between submitting an update and its application. Default is disabled. + * @default null + */ + prevent_unoptimized?: boolean | null; }; WalConfig: { /** @@ -988,6 +1023,8 @@ export interface components { is_tenant?: boolean | null; /** @description If true, store the index on disk. Default: false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ KeywordIndexType: "keyword"; @@ -1001,6 +1038,8 @@ export interface components { is_principal?: boolean | null; /** @description If true, store the index on disk. Default: false. Default is false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ IntegerIndexType: "integer"; @@ -1010,6 +1049,8 @@ export interface components { is_principal?: boolean | null; /** @description If true, store the index on disk. Default: false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ FloatIndexType: "float"; @@ -1017,6 +1058,8 @@ export interface components { type: components["schemas"]["GeoIndexType"]; /** @description If true, store the index on disk. Default: false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ GeoIndexType: "geo"; @@ -1045,6 +1088,8 @@ export interface components { on_disk?: boolean | null; /** @description Algorithm for stemming. Default: disabled. */ stemmer?: components["schemas"]["StemmingAlgorithm"] | (Record | null); + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ TextIndexType: "text"; @@ -1076,6 +1121,8 @@ export interface components { type: components["schemas"]["BoolIndexType"]; /** @description If true, store the index on disk. Default: false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ BoolIndexType: "bool"; @@ -1085,6 +1132,8 @@ export interface components { is_principal?: boolean | null; /** @description If true, store the index on disk. Default: false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ DatetimeIndexType: "datetime"; @@ -1094,9 +1143,18 @@ export interface components { is_tenant?: boolean | null; /** @description If true, store the index on disk. Default: false. */ on_disk?: boolean | null; + /** @description Enable HNSW graph building for this payload field. If true, builds additional HNSW links (Need payload_m > 0). Default: true. */ + enable_hnsw?: boolean | null; }; /** @enum {string} */ UuidIndexType: "uuid"; + UpdateQueueInfo: { + /** + * Format: uint + * @description Number of elements in the queue + */ + length: number; + }; PointRequest: { /** @description Specify in which shards to look for the points, if not specified - look in all shards */ shard_key?: components["schemas"]["ShardKeySelector"] | (Record | null); @@ -1506,10 +1564,10 @@ export interface components { status: components["schemas"]["UpdateStatus"]; }; /** - * @description `Acknowledged` - Request is saved to WAL and will be process in a queue. `Completed` - Request is completed, changes are actual. + * @description `Acknowledged` - Request is saved to WAL and will be process in a queue. `Completed` - Request is completed, changes are actual. `WaitTimeout` - Request is waiting for timeout. * @enum {string} */ - UpdateStatus: "acknowledged" | "completed"; + UpdateStatus: "acknowledged" | "completed" | "wait_timeout"; /** * @description Recommendation request. Provides positive and negative examples of the vectors, which can be ids of points that are already stored in the collection, raw vectors, or even ids and vectors combined. * @@ -1789,6 +1847,11 @@ export interface components { flush_interval_sec?: number | null; /** @description Max number of threads (jobs) for running optimizations per shard. Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. If "auto" - have no limit and choose dynamically to saturate CPU. If 0 - no optimization threads, optimizations will be disabled. */ max_optimization_threads?: components["schemas"]["MaxOptimizationThreads"] | (Record | null); + /** + * @description If this option is set, service will try to prevent creation of large unoptimized segments. When enabled, updates may be blocked at request level if there are unoptimized segments larger than indexing threshold. Updates will be resumed when optimization is completed and segments are optimized below the threshold. Using this option may lead to increased delay between submitting an update and its application. Default is disabled. + * @default null + */ + prevent_unoptimized?: boolean | null; }; MaxOptimizationThreads: components["schemas"]["MaxOptimizationThreadsSetting"] | number; /** @enum {string} */ @@ -1948,6 +2011,11 @@ export interface components { * @description Fan-out every read request to these many additional remote nodes (and return first available response) */ read_fan_out_factor?: number | null; + /** + * Format: uint64 + * @description Delay in milliseconds before sending read requests to remote nodes + */ + read_fan_out_delay_ms?: number | null; /** * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. * @default null @@ -2006,8 +2074,10 @@ export interface components { PointsBatch: { batch: components["schemas"]["Batch"]; shard_key?: components["schemas"]["ShardKeySelector"] | (Record | null); - /** @description If specified, only points that match this filter will be updated, others will be inserted */ + /** @description Filter to apply when updating existing points. Only points matching this filter will be updated. Points that don't match will keep their current state. New points will be inserted regardless of the filter. */ update_filter?: components["schemas"]["Filter"] | (Record | null); + /** @description Mode of the upsert operation: insert_only, upsert (default), update_only */ + update_mode?: components["schemas"]["UpdateMode"] | (Record | null); }; Batch: { ids: (components["schemas"]["ExtendedPointId"])[]; @@ -2123,11 +2193,20 @@ export interface components { [key: string]: unknown; } | null; }; + /** + * @description Defines the mode of the upsert operation + * + * * `upsert` - default mode, insert new points, update existing points * `insert_only` - only insert new points, do not update existing points * `update_only` - only update existing points, do not insert new points + * @enum {string} + */ + UpdateMode: "upsert" | "insert_only" | "update_only"; PointsList: { points: (components["schemas"]["PointStruct"])[]; shard_key?: components["schemas"]["ShardKeySelector"] | (Record | null); - /** @description If specified, only points that match this filter will be updated, others will be inserted */ + /** @description Filter to apply when updating existing points. Only points matching this filter will be updated. Points that don't match will keep their current state. New points will be inserted regardless of the filter. */ update_filter?: components["schemas"]["Filter"] | (Record | null); + /** @description Mode of the upsert operation: insert_only, upsert (default), update_only */ + update_mode?: components["schemas"]["UpdateMode"] | (Record | null); }; PointStruct: { id: components["schemas"]["ExtendedPointId"]; @@ -2319,7 +2398,7 @@ export interface components { * @description State of the single shard within a replica set. * @enum {string} */ - ReplicaState: "Active" | "Dead" | "Partial" | "Initializing" | "Listener" | "PartialSnapshot" | "Recovery" | "Resharding" | "ReshardingScaleDown" | "ActiveRead"; + ReplicaState: "Active" | "Dead" | "Partial" | "Initializing" | "Listener" | "PartialSnapshot" | "Recovery" | "Resharding" | "ReshardingScaleDown" | "ActiveRead" | "ManualRecovery"; RemoteShardInfo: { /** * Format: uint32 @@ -2342,7 +2421,7 @@ export interface components { * Format: uint32 * @description Target shard ID if different than source shard ID * - * Used exclusively with `ReshardStreamRecords` transfer method. + * Used exclusively with `ReshardingStreamRecords` transfer method. */ to_shard_id?: number | null; /** @@ -2393,7 +2472,7 @@ export interface components { ReshardingDirection: "up" | "down"; TelemetryData: { id: string; - app: components["schemas"]["AppBuildTelemetry"]; + app?: components["schemas"]["AppBuildTelemetry"] | (Record | null); collections: components["schemas"]["CollectionsTelemetry"]; cluster?: components["schemas"]["ClusterTelemetry"] | (Record | null); requests?: components["schemas"]["RequestsTelemetry"] | (Record | null); @@ -2418,6 +2497,7 @@ export interface components { recovery_mode: boolean; gpu: boolean; rocksdb: boolean; + staging: boolean; }; FeatureFlags: { /** @@ -2494,6 +2574,13 @@ export interface components { * @default true */ appendable_quantization?: boolean; + /** + * @description Use single-file mmap in-ram vector storage (InRamMmap) + * + * Enabled by default in Qdrant 1.17.1+ + * @default false + */ + single_file_mmap_vector_storage?: boolean; }; HnswGlobalConfig: { /** @@ -2534,8 +2621,8 @@ export interface components { CollectionTelemetry: { id: string; /** Format: uint64 */ - init_time_ms: number; - config: components["schemas"]["CollectionConfigTelemetry"]; + init_time_ms?: number | null; + config?: components["schemas"]["CollectionConfigTelemetry"] | (Record | null); shards?: (components["schemas"]["ReplicaSetTelemetry"])[] | null; transfers?: (components["schemas"]["ShardTransferInfo"])[] | null; resharding?: (components["schemas"]["ReshardingInfo"])[] | null; @@ -2603,11 +2690,13 @@ export interface components { [key: string]: number | undefined; }) | null; segments?: (components["schemas"]["SegmentTelemetry"])[] | null; - optimizations: components["schemas"]["OptimizerTelemetry"]; + optimizations?: components["schemas"]["OptimizerTelemetry"] | (Record | null); async_scorer?: boolean | null; indexed_only_excluded_vectors?: ({ [key: string]: number | undefined; }) | null; + /** @description Update queue status */ + update_queue?: components["schemas"]["ShardUpdateQueueInfo"] | (Record | null); }; /** * @description Current state of the shard (supports same states as the collection) @@ -2624,6 +2713,8 @@ export interface components { }; /** @description Aggregated information about segment */ SegmentInfo: { + /** Format: uuid */ + uuid: string; segment_type: components["schemas"]["SegmentType"]; /** Format: uint */ num_vectors: number; @@ -2696,7 +2787,7 @@ export interface components { datatype?: components["schemas"]["VectorStorageDatatype"] | (Record | null); }; /** @description Storage types for vectors */ - VectorStorageType: "Memory" | "Mmap" | "ChunkedMmap" | "InRamChunkedMmap"; + VectorStorageType: "Memory" | "Mmap" | "ChunkedMmap" | "InRamChunkedMmap" | "InRamMmap"; /** @description Vector index configuration */ Indexes: OneOf<[{ /** @enum {string} */ @@ -2814,8 +2905,15 @@ export interface components { TrackerTelemetry: { /** @description Name of the optimizer */ name: string; - /** @description Segment IDs being optimized */ + /** + * Format: uuid + * @description UUID of the upcoming segment being created by the optimizer + */ + uuid: string; + /** @description Internal segment IDs being optimized. These are local and in-memory, meaning that they can refer to different segments after a service restart. */ segment_ids: (number)[]; + /** @description Segment UUIDs being optimized. Refers to same segments as in `segment_ids`, but trackable across restarts, and reflect their directory name. */ + segment_uuids: (string)[]; status: components["schemas"]["TrackerStatus"]; /** * Format: date-time @@ -2834,13 +2932,25 @@ export interface components { }, { error: string; }]>; + ShardUpdateQueueInfo: { + /** + * Format: uint + * @description Number of elements in the queue + */ + length: number; + /** + * Format: uint + * @description last operation number processed + */ + op_num?: number | null; + }; RemoteShardTelemetry: { /** Format: uint32 */ shard_id: number; /** Format: uint64 */ - peer_id?: number | null; - searches: components["schemas"]["OperationDurationStatistics"]; - updates: components["schemas"]["OperationDurationStatistics"]; + peer_id: number; + searches?: components["schemas"]["OperationDurationStatistics"] | (Record | null); + updates?: components["schemas"]["OperationDurationStatistics"] | (Record | null); }; PartialSnapshotTelemetry: { /** Format: uint */ @@ -2889,6 +2999,7 @@ export interface components { metadata?: { [key: string]: unknown; } | null; + resharding_enabled?: boolean | null; }; ClusterStatusTelemetry: { /** Format: uint */ @@ -2941,7 +3052,9 @@ export interface components { }; GrpcTelemetry: { responses: { - [key: string]: components["schemas"]["OperationDurationStatistics"] | undefined; + [key: string]: ({ + [key: string]: components["schemas"]["OperationDurationStatistics"] | undefined; + }) | undefined; }; }; MemoryTelemetry: { @@ -3504,7 +3617,7 @@ export interface components { }; QueryInterface: components["schemas"]["VectorInput"] | components["schemas"]["Query"]; VectorInput: (number)[] | components["schemas"]["SparseVector"] | ((number)[])[] | components["schemas"]["ExtendedPointId"] | components["schemas"]["Document"] | components["schemas"]["Image"] | components["schemas"]["InferenceObject"]; - Query: components["schemas"]["NearestQuery"] | components["schemas"]["RecommendQuery"] | components["schemas"]["DiscoverQuery"] | components["schemas"]["ContextQuery"] | components["schemas"]["OrderByQuery"] | components["schemas"]["FusionQuery"] | components["schemas"]["RrfQuery"] | components["schemas"]["FormulaQuery"] | components["schemas"]["SampleQuery"]; + Query: components["schemas"]["NearestQuery"] | components["schemas"]["RecommendQuery"] | components["schemas"]["DiscoverQuery"] | components["schemas"]["ContextQuery"] | components["schemas"]["OrderByQuery"] | components["schemas"]["FusionQuery"] | components["schemas"]["RrfQuery"] | components["schemas"]["FormulaQuery"] | components["schemas"]["SampleQuery"] | components["schemas"]["RelevanceFeedbackQuery"]; NearestQuery: { nearest: components["schemas"]["VectorInput"]; /** @description Perform MMR (Maximal Marginal Relevance) reranking after search, using the same vector in this query to calculate relevance. */ @@ -3582,6 +3695,8 @@ export interface components { * @default null */ k?: number | null; + /** @description Weights for each prefetch source. Higher weight gives more influence on the final ranking. If not specified, all prefetches are weighted equally. The number of weights should match the number of prefetches. */ + weights?: (number)[] | null; }; FormulaQuery: { formula: components["schemas"]["Expression"]; @@ -3674,6 +3789,31 @@ export interface components { }; /** @enum {string} */ Sample: "random"; + RelevanceFeedbackQuery: { + relevance_feedback: components["schemas"]["RelevanceFeedbackInput"]; + }; + RelevanceFeedbackInput: { + target: components["schemas"]["VectorInput"]; + feedback: (components["schemas"]["FeedbackItem"])[]; + strategy: components["schemas"]["FeedbackStrategy"]; + }; + FeedbackItem: { + example: components["schemas"]["VectorInput"]; + /** Format: float */ + score: number; + }; + FeedbackStrategy: components["schemas"]["NaiveFeedbackStrategy"]; + NaiveFeedbackStrategy: { + naive: components["schemas"]["NaiveFeedbackStrategyParams"]; + }; + NaiveFeedbackStrategyParams: { + /** Format: float */ + a: number; + /** Format: float */ + b: number; + /** Format: float */ + c: number; + }; QueryRequestBatch: { searches: (components["schemas"]["QueryRequest"])[]; }; @@ -3800,6 +3940,225 @@ export interface components { /** Format: uint64 */ tokens: number; }; + ShardKeysResponse: { + /** @description The existing shard keys. Only available when sharding method is `custom` */ + shard_keys?: (components["schemas"]["ShardKeyDescription"])[] | null; + }; + ShardKeyDescription: { + key: components["schemas"]["ShardKey"]; + }; + /** @description Optimizations progress for the collection */ + OptimizationsResponse: { + summary: components["schemas"]["OptimizationsSummary"]; + /** @description Currently running optimizations. */ + running: (components["schemas"]["Optimization"])[]; + /** @description An estimated queue of pending optimizations. Requires `?with=queued`. */ + queued?: (components["schemas"]["PendingOptimization"])[] | null; + /** @description Completed optimizations. Requires `?with=completed`. Limited by `?completed_limit=N`. */ + completed?: (components["schemas"]["Optimization"])[] | null; + /** @description Segments that don't require optimization. Requires `?with=idle_segments`. */ + idle_segments?: (components["schemas"]["OptimizationSegmentInfo"])[] | null; + }; + OptimizationsSummary: { + /** + * Format: uint + * @description Number of pending optimizations in the queue. Each optimization will take one or more unoptimized segments and produce one optimized segment. + */ + queued_optimizations: number; + /** + * Format: uint + * @description Number of unoptimized segments in the queue. + */ + queued_segments: number; + /** + * Format: uint + * @description Number of points in unoptimized segments in the queue. + */ + queued_points: number; + /** + * Format: uint + * @description Number of segments that don't require optimization. + */ + idle_segments: number; + }; + Optimization: { + /** + * Format: uuid + * @description Unique identifier of the optimization process. + * + * After the optimization is complete, a new segment will be created with this UUID. + */ + uuid: string; + /** @description Name of the optimizer that performed this optimization. */ + optimizer: string; + status: components["schemas"]["TrackerStatus"]; + /** + * @description Segments being optimized. + * + * After the optimization is complete, these segments will be replaced by the new optimized segment. + */ + segments: (components["schemas"]["OptimizationSegmentInfo"])[]; + progress: components["schemas"]["ProgressTree"]; + }; + OptimizationSegmentInfo: { + /** + * Format: uuid + * @description Unique identifier of the segment. + */ + uuid: string; + /** + * Format: uint + * @description Number of non-deleted points in the segment. + */ + points_count: number; + }; + ProgressTree: { + /** @description Name of the operation. */ + name: string; + /** + * Format: date-time + * @description When the operation started. + */ + started_at?: string | null; + /** + * Format: date-time + * @description When the operation finished. + */ + finished_at?: string | null; + /** + * Format: double + * @description For finished operations, how long they took, in seconds. + */ + duration_sec?: number | null; + /** + * Format: uint64 + * @description Number of completed units of work, if applicable. + */ + done?: number | null; + /** + * Format: uint64 + * @description Total number of units of work, if applicable and known. + */ + total?: number | null; + /** @description Child operations. */ + children?: (components["schemas"]["ProgressTree"])[]; + }; + PendingOptimization: { + /** @description Name of the optimizer that scheduled this optimization. */ + optimizer: string; + /** @description Segments that will be optimized. */ + segments: (components["schemas"]["OptimizationSegmentInfo"])[]; + }; + DistributedTelemetryData: { + collections: { + [key: string]: components["schemas"]["DistributedCollectionTelemetry"] | undefined; + }; + cluster?: components["schemas"]["DistributedClusterTelemetry"] | (Record | null); + }; + DistributedCollectionTelemetry: { + /** @description Collection name */ + id: string; + /** @description Shards topology */ + shards?: (components["schemas"]["DistributedShardTelemetry"])[] | null; + /** @description Ongoing resharding operations */ + reshardings?: (components["schemas"]["ReshardingInfo"])[] | null; + /** @description Ongoing shard transfers */ + shard_transfers?: (components["schemas"]["ShardTransferInfo"])[] | null; + }; + DistributedShardTelemetry: { + /** + * Format: uint32 + * @description Shard ID + */ + id: number; + /** @description Optional shard key */ + key?: components["schemas"]["ShardKey"] | (Record | null); + /** @description Replica information */ + replicas: (components["schemas"]["DistributedReplicaTelemetry"])[]; + }; + DistributedReplicaTelemetry: { + /** + * Format: uint64 + * @description Peer ID hosting this replica + */ + peer_id: number; + state: components["schemas"]["ReplicaState"]; + /** @description Shard status */ + status?: components["schemas"]["ShardStatus"] | (Record | null); + /** + * Format: uint + * @description Total optimized points + */ + total_optimized_points?: number | null; + /** + * Format: uint + * @description Estimated vectors size in bytes + */ + vectors_size_bytes?: number | null; + /** + * Format: uint + * @description Estimated payloads size in bytes + */ + payloads_size_bytes?: number | null; + /** + * Format: uint + * @description Approximate number of points + */ + num_points?: number | null; + /** + * Format: uint + * @description Approximate number of vectors + */ + num_vectors?: number | null; + /** @description Approximate number of vectors by name */ + num_vectors_by_name?: ({ + [key: string]: number | undefined; + }) | null; + /** @description Shard cleaning task status. After a resharding, a cleanup task is performed to remove outdated points from this shard. */ + shard_cleaning_status?: components["schemas"]["ShardCleanStatusTelemetry"] | (Record | null); + /** @description Partial snapshot telemetry */ + partial_snapshot?: components["schemas"]["PartialSnapshotTelemetry"] | (Record | null); + }; + DistributedClusterTelemetry: { + enabled: boolean; + /** Format: uint64 */ + number_of_peers?: number | null; + peers: { + [key: string]: components["schemas"]["DistributedPeerInfo"] | undefined; + }; + }; + DistributedPeerInfo: { + /** @description URI of the peer */ + uri: string; + /** @description Whether this peer responded for this request */ + responsive: boolean; + /** @description If responsive, these details should be available */ + details?: components["schemas"]["DistributedPeerDetails"] | (Record | null); + }; + DistributedPeerDetails: { + /** @description Qdrant version */ + version: string; + /** @description Consensus role for the peer */ + role?: components["schemas"]["StateRole"] | (Record | null); + /** @description Whether it can participate in leader elections */ + is_voter: boolean; + /** + * Format: uint64 + * @description Election term + */ + term: number; + /** + * Format: uint64 + * @description Latest accepted commit + */ + commit: number; + /** + * Format: uint64 + * @description Number of operations pending for being applied + */ + num_pending_operations: number; + consensus_thread_status: components["schemas"]["ConsensusThreadStatus"]; + }; }; responses: never; parameters: never; @@ -3812,6 +4171,47 @@ export type external = Record; export interface operations { + /** List shard keys */ + list_shard_keys: { + parameters: { + path: { + /** @description Name of the collection to list shard keys for */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** @default null */ + usage?: components["schemas"]["Usage"] | (Record | null); + /** + * Format: float + * @description Time spent to process this request + * @example 0.002 + */ + time?: number; + /** @example ok */ + status?: string; + result?: components["schemas"]["ShardKeysResponse"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; /** Create shard key */ create_shard_key: { parameters: { @@ -3947,6 +4347,8 @@ export interface operations { anonymize?: boolean; /** @description Level of details in telemetry data. Minimal level is 0, maximal is infinity */ details_level?: number; + /** @description Timeout for this request */ + timeout?: number; }; }; responses: { @@ -3991,6 +4393,8 @@ export interface operations { query?: { /** @description If true, anonymize result */ anonymize?: boolean; + /** @description Timeout for this request */ + timeout?: number; }; }; responses: { @@ -4074,14 +4478,36 @@ export interface operations { */ clear_issues: { responses: { - /** @description Successful response */ + /** @description successful operation */ 200: { content: { - "application/json": boolean; + "application/json": { + /** @default null */ + usage?: components["schemas"]["Usage"] | (Record | null); + /** + * Format: float + * @description Time spent to process this request + * @example 0.002 + */ + time?: number; + /** @example ok */ + status?: string; + result?: boolean; + }; }; }; /** @description error */ - "4XX": never; + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; /** @@ -4122,6 +4548,52 @@ export interface operations { }; }; }; + /** + * Collect cluster telemetry data + * @description Get telemetry data, from the point of view of the cluster. This includes peers info, collections info, shard transfers, and resharding status + */ + cluster_telemetry: { + parameters: { + query?: { + /** @description The level of detail to include in the response */ + details_level?: number; + /** @description Timeout for this request */ + timeout?: number; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** @default null */ + usage?: components["schemas"]["Usage"] | (Record | null); + /** + * Format: float + * @description Time spent to process this request + * @example 0.002 + */ + time?: number; + /** @example ok */ + status?: string; + result?: components["schemas"]["DistributedTelemetryData"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; /** Tries to recover current peer Raft state. */ recover_current_peer: { responses: { @@ -4518,6 +4990,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection */ @@ -4618,6 +5092,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection */ @@ -4757,6 +5233,62 @@ export interface operations { }; }; }; + /** + * Get optimization progress + * @description Get progress of ongoing and completed optimizations for a collection + */ + get_optimizations: { + parameters: { + query?: { + /** + * @description Comma-separated list of optional fields to include in the response. + * Possible values: queued, completed, idle_segments. + */ + with?: string; + /** + * @description Maximum number of completed optimizations to return. + * Ignored if `completed` is not in the `with` parameter. + */ + completed_limit?: number; + }; + path: { + /** @description Name of the collection */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** @default null */ + usage?: components["schemas"]["Usage"] | (Record | null); + /** + * Format: float + * @description Time spent to process this request + * @example 0.002 + */ + time?: number; + /** @example ok */ + status?: string; + result?: components["schemas"]["OptimizationsResponse"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; /** * List aliases for collection * @description Get list of all aliases for a collection @@ -5358,6 +5890,40 @@ export interface operations { }; }; }; + /** + * Download shard snapshot + * @description Stream the current state of a shard as a snapshot file + */ + stream_shard_snapshot: { + parameters: { + path: { + /** @description Name of the collection */ + collection_name: string; + /** @description Id of the shard */ + shard_id: number; + }; + }; + responses: { + /** @description Snapshot file */ + 200: { + content: { + "application/octet-stream": string; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; /** * Recover shard from an uploaded snapshot * @description Recover shard of a local collection from an uploaded snapshot. This will overwrite any data, stored on this node, for the collection shard. @@ -5766,6 +6332,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to update from */ @@ -5878,6 +6446,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to delete from */ @@ -5934,6 +6504,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to update from */ @@ -5990,6 +6562,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to delete from */ @@ -6046,6 +6620,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to set from */ @@ -6102,6 +6678,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to set from */ @@ -6158,6 +6736,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to delete from */ @@ -6214,6 +6794,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to clear payload from */ @@ -6270,6 +6852,8 @@ export interface operations { wait?: boolean; /** @description define ordering guarantees for the operation */ ordering?: components["schemas"]["WriteOrdering"]; + /** @description Timeout for the operation */ + timeout?: number; }; path: { /** @description Name of the collection to apply operations on */ diff --git a/packages/js-client-rest/src/qdrant-client.ts b/packages/js-client-rest/src/qdrant-client.ts index ea4c929..7c52e3a 100644 --- a/packages/js-client-rest/src/qdrant-client.ts +++ b/packages/js-client-rest/src/qdrant-client.ts @@ -589,14 +589,16 @@ export class QdrantClient { { wait = true, ordering, + timeout, points, shard_key, - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['UpdateVectors'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['UpdateVectors'], ): Promise { const response = await this._openApiClient.updateVectors({ collection_name, wait, ordering, + timeout, points, shard_key, }); @@ -628,16 +630,18 @@ export class QdrantClient { { wait = true, ordering, + timeout, points, filter, vector, shard_key, - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['DeleteVectors'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['DeleteVectors'], ): Promise { const response = await this._openApiClient.deleteVectors({ collection_name, wait, ordering, + timeout, points, filter, vector, @@ -796,13 +800,15 @@ export class QdrantClient { { wait = true, ordering, + timeout, ...points_or_batch - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['PointInsertOperations'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['PointInsertOperations'], ): Promise { const response = await this._openApiClient.upsertPoints({ collection_name, wait, ordering, + timeout, ...points_or_batch, }); return response.data.result ?? noResultError(); @@ -893,13 +899,15 @@ export class QdrantClient { { wait, ordering, + timeout, ...points_selector - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['PointsSelector'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['PointsSelector'], ): Promise { const response = await this._openApiClient.deletePoints({ collection_name, wait, ordering, + timeout, ...points_selector, }); return response.data.result ?? noResultError(); @@ -947,8 +955,9 @@ export class QdrantClient { shard_key, key, ordering, + timeout, wait = true, - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['SetPayload'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['SetPayload'], ): Promise { const response = await this._openApiClient.setPayload({ collection_name, @@ -959,6 +968,7 @@ export class QdrantClient { key, wait, ordering, + timeout, }); return response.data.result ?? noResultError(); } @@ -1002,13 +1012,14 @@ export class QdrantClient { collection_name: string, { ordering, + timeout, payload, points, filter, shard_key, key, wait = true, - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['SetPayload'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['SetPayload'], ): Promise { const response = await this._openApiClient.overwritePayload({ collection_name, @@ -1019,6 +1030,7 @@ export class QdrantClient { key, wait, ordering, + timeout, }); return response.data.result ?? noResultError(); } @@ -1059,12 +1071,14 @@ export class QdrantClient { collection_name: string, { ordering, + timeout, keys, points, filter, shard_key, wait = true, - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['PointsSelector'] & Schemas['DeletePayload'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['PointsSelector'] & + Schemas['DeletePayload'], ): Promise { const response = await this._openApiClient.deletePayload({ collection_name, @@ -1074,6 +1088,7 @@ export class QdrantClient { shard_key, wait, ordering, + timeout, }); return response.data.result ?? noResultError(); } @@ -1112,14 +1127,16 @@ export class QdrantClient { collection_name: string, { ordering, + timeout, wait = true, ...points_selector - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['PointsSelector'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['PointsSelector'], ): Promise { const response = await this._openApiClient.clearPayload({ collection_name, wait, ordering, + timeout, ...points_selector, }); return response.data.result ?? noResultError(); @@ -1400,9 +1417,10 @@ export class QdrantClient { { wait, ordering, + timeout, field_name, field_schema, - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['CreateFieldIndex'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['CreateFieldIndex'], ): Promise { const response = await this._openApiClient.createFieldIndex({ collection_name, @@ -1410,6 +1428,7 @@ export class QdrantClient { field_schema, wait, ordering, + timeout, }); return response.data.result ?? noResultError(); } @@ -1434,13 +1453,14 @@ export class QdrantClient { async deletePayloadIndex( collection_name: string, field_name: string, - {wait = true, ordering}: {wait?: boolean; ordering?: Schemas['WriteOrdering']} = {}, + {wait = true, ordering, timeout}: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} = {}, ): Promise { const response = await this._openApiClient.deleteFieldIndex({ collection_name, field_name, wait, ordering, + timeout, }); return response.data.result ?? noResultError(); } @@ -1561,13 +1581,15 @@ export class QdrantClient { { wait = true, ordering, + timeout, ...operations - }: {wait?: boolean; ordering?: Schemas['WriteOrdering']} & Schemas['UpdateOperations'], + }: {wait?: boolean; ordering?: Schemas['WriteOrdering']; timeout?: number} & Schemas['UpdateOperations'], ): Promise { const response = await this._openApiClient.batchUpdate({ collection_name, wait, ordering, + timeout, ...operations, }); return response.data.result ?? noResultError(); @@ -1648,6 +1670,16 @@ export class QdrantClient { return response.data.result ?? noResultError(); } + /** + * List shard keys + * @param collection_name Name of the collection + * @returns Shard keys response + */ + async listShardKeys(collection_name: string): Promise { + const response = await this._openApiClient.listShardKeys({collection_name}); + return response.data.result ?? noResultError(); + } + /** * Create shard key * @param collection_name Name of the collection @@ -1798,6 +1830,41 @@ export class QdrantClient { return response.data.result ?? noResultError(); } + /** + * Collect cluster telemetry data + * @description Get telemetry data, from the point of view of the cluster. + * This includes peers info, collections info, shard transfers, and resharding status. + * @param {object} args + * - details_level: The level of detail to include in the response + * - timeout: Timeout for this request + * @returns Cluster telemetry data + */ + async clusterTelemetry(args?: { + details_level?: number; + timeout?: number; + }): Promise { + const response = await this._openApiClient.clusterTelemetry(args ?? {}); + return response.data.result ?? noResultError(); + } + + /** + * Get optimization progress + * @description Get progress of ongoing and completed optimizations for a collection + * @param collection_name Name of the collection + * @param {object} args + * - with: Comma-separated list of optional fields to include in the response. + * Possible values: queued, completed, idle_segments. + * - completed_limit: Maximum number of completed optimizations to return. + * @returns Optimizations progress + */ + async getOptimizations( + collection_name: string, + args?: {with?: string; completed_limit?: number}, + ): Promise { + const response = await this._openApiClient.getOptimizations({collection_name, ...args}); + return response.data.result ?? noResultError(); + } + /** * Returns information about the running Qdrant instance * @description Returns information about the running Qdrant instance like version and commit id diff --git a/packages/js-client-rest/tests/integration/qdrant-client.test.ts b/packages/js-client-rest/tests/integration/qdrant-client.test.ts index 05b81ca..edf686d 100644 --- a/packages/js-client-rest/tests/integration/qdrant-client.test.ts +++ b/packages/js-client-rest/tests/integration/qdrant-client.test.ts @@ -142,6 +142,27 @@ describe('QdrantClient', () => { expect(result).toHaveLength(3); }); + test('upsert with timeout', async () => { + const result = await client.upsert(collectionName, { + wait: true, + timeout: 10, + points: [ + { + id: 5, + vector: [0.05, 0.61, 0.76, 0.74], + payload: { + city: 'Berlin', + country: 'Germany', + count: 1000000, + square: 12.5, + coords: {lat: 1.0, lon: 2.0}, + }, + }, + ], + }); + expect(result).toMatchObject({operation_id: expect.any(Number) as number, status: 'completed'}); + }); + test('search points filter', async () => { const result = await client.search(collectionName, { filter: { diff --git a/packages/qdrant-js/CHANGELOG.md b/packages/qdrant-js/CHANGELOG.md index ca15578..c17df65 100644 --- a/packages/qdrant-js/CHANGELOG.md +++ b/packages/qdrant-js/CHANGELOG.md @@ -1,5 +1,14 @@ # @qdrant/qdrant-js +## v1.17.0 + +### Minor Changes + +- Qdrant v1.17.0 API +- Updated dependencies + - @qdrant/js-client-grpc@1.17.0 + - @qdrant/js-client-rest@1.17.0 + ## v1.16.2 ### Patch Changes diff --git a/packages/qdrant-js/package.json b/packages/qdrant-js/package.json index 8906d77..7cf51d4 100644 --- a/packages/qdrant-js/package.json +++ b/packages/qdrant-js/package.json @@ -1,6 +1,6 @@ { "name": "@qdrant/qdrant-js", - "version": "1.16.2", + "version": "1.17.0", "engines": { "node": ">=18.17.0", "pnpm": ">=8" @@ -57,8 +57,8 @@ "clean": "rimraf ./dist" }, "dependencies": { - "@qdrant/js-client-rest": "workspace:1.16.2", - "@qdrant/js-client-grpc": "workspace:1.16.2" + "@qdrant/js-client-rest": "workspace:1.17.0", + "@qdrant/js-client-grpc": "workspace:1.17.0" }, "peerDependencies": { "typescript": ">=4.1" diff --git a/packages/qdrant-js/scripts/integration-tests.sh b/packages/qdrant-js/scripts/integration-tests.sh index 474cf31..b54470d 100755 --- a/packages/qdrant-js/scripts/integration-tests.sh +++ b/packages/qdrant-js/scripts/integration-tests.sh @@ -9,7 +9,7 @@ function stop_docker() docker stop qdrant_test } -QDRANT_LATEST="v1.16.0" +QDRANT_LATEST="v1.17.0" QDRANT_VERSION=${QDRANT_VERSION:-"$QDRANT_LATEST"} QDRANT_HOST='127.0.0.1:6333' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dae1c29..3dcb41f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,8 +88,8 @@ importers: specifier: '>=4.7' version: 5.0.4 undici: - specifier: ^6.0.0 - version: 6.21.3 + specifier: ^6.23.0 + version: 6.23.0 devDependencies: '@rollup/plugin-commonjs': specifier: ^24.1.0 @@ -122,10 +122,10 @@ importers: packages/qdrant-js: dependencies: '@qdrant/js-client-grpc': - specifier: workspace:1.16.2 + specifier: workspace:1.17.0 version: link:../js-client-grpc '@qdrant/js-client-rest': - specifier: workspace:1.16.2 + specifier: workspace:1.17.0 version: link:../js-client-rest typescript: specifier: '>=4.1' @@ -1138,15 +1138,17 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -1202,6 +1204,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1569,6 +1572,7 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@5.0.10: @@ -1795,12 +1799,12 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@5.28.5: - resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@6.21.3: - resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} engines: {node: '>=18.17'} uri-js@4.4.1: @@ -3135,7 +3139,7 @@ snapshots: fast-glob: 3.2.12 js-yaml: 4.1.0 supports-color: 9.3.1 - undici: 5.28.5 + undici: 5.29.0 yargs-parser: 21.1.1 optionator@0.9.4: @@ -3447,11 +3451,11 @@ snapshots: undici-types@6.19.8: {} - undici@5.28.5: + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.0 - undici@6.21.3: {} + undici@6.23.0: {} uri-js@4.4.1: dependencies: