From 153667428edebe6adb4d92356d9ef6192d3203e0 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Fri, 2 Aug 2024 15:18:16 +0530 Subject: [PATCH 1/8] Add query plan api to query-frontend --- pkg/loghttp/query_plan.go | 26 + pkg/logproto/compat.go | 30 + pkg/logproto/logproto.pb.go | 1536 ++++++++++++++++++++--- pkg/logproto/logproto.proto | 47 + pkg/loki/modules.go | 1 + pkg/querier/queryrange/codec.go | 33 + pkg/querier/queryrange/queryrange.pb.go | 842 ++++++++++--- pkg/querier/queryrange/queryrange.proto | 10 + pkg/querier/queryrange/roundtrip.go | 2 + 9 files changed, 2171 insertions(+), 356 deletions(-) create mode 100644 pkg/loghttp/query_plan.go diff --git a/pkg/loghttp/query_plan.go b/pkg/loghttp/query_plan.go new file mode 100644 index 0000000000000..ea56717931794 --- /dev/null +++ b/pkg/loghttp/query_plan.go @@ -0,0 +1,26 @@ +package loghttp + +import ( + "net/http" + + "github.com/grafana/loki/v3/pkg/logproto" +) + +func ParseQueryPlanRequest(r *http.Request) (*logproto.QueryPlanRequest, error) { + req := &logproto.QueryPlanRequest{} + + req.Query = query(r) + start, end, err := bounds(r) + if err != nil { + return nil, err + } + + req.Start = start + req.End = end + dir, err := direction(r) + if err != nil { + return nil, err + } + req.Direction = dir + return req, nil +} diff --git a/pkg/logproto/compat.go b/pkg/logproto/compat.go index fd2923b7a06c7..ddf6634592b8f 100644 --- a/pkg/logproto/compat.go +++ b/pkg/logproto/compat.go @@ -624,3 +624,33 @@ func (m *QuerySamplesRequest) LogToSpan(sp opentracing.Span) { } sp.LogFields(fields...) } + +func (m *QueryPlanRequest) GetCachingOptions() (res definitions.CachingOptions) { return } + +func (m *QueryPlanRequest) WithStartEnd(start, end time.Time) definitions.Request { + clone := *m + clone.Start = start + clone.End = end + return &clone +} + +func (m *QueryPlanRequest) WithStartEndForCache(start, end time.Time) resultscache.Request { + return m.WithStartEnd(start, end).(resultscache.Request) +} + +func (m *QueryPlanRequest) WithQuery(query string) definitions.Request { + clone := *m + clone.Query = query + return &clone +} + +func (m *QueryPlanRequest) LogToSpan(sp opentracing.Span) { + fields := []otlog.Field{ + otlog.String("query", m.GetQuery()), + otlog.String("start", m.Start.String()), + otlog.String("end", m.End.String()), + } + sp.LogFields(fields...) +} + +func (m *QueryPlanRequest) GetStep() int64 { return 0 } diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index e1c54358897e9..65086145feaf5 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -64,6 +64,30 @@ func (Direction) EnumDescriptor() ([]byte, []int) { return fileDescriptor_c28a5f14f1f4c79a, []int{0} } +type MergeStrategy int32 + +const ( + LOGSTREAM MergeStrategy = 0 + SUM MergeStrategy = 1 + AVG MergeStrategy = 2 +) + +var MergeStrategy_name = map[int32]string{ + 0: "LOGSTREAM", + 1: "SUM", + 2: "AVG", +} + +var MergeStrategy_value = map[string]int32{ + "LOGSTREAM": 0, + "SUM": 1, + "AVG": 2, +} + +func (MergeStrategy) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_c28a5f14f1f4c79a, []int{1} +} + type LabelToValuesResponse struct { Labels map[string]*UniqueLabelValues `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } @@ -3058,8 +3082,202 @@ func (m *DetectedLabel) GetSketch() []byte { return nil } +type QueryPlanRequest struct { + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + Limit uint32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Start time.Time `protobuf:"bytes,3,opt,name=start,proto3,stdtime" json:"start"` + End time.Time `protobuf:"bytes,4,opt,name=end,proto3,stdtime" json:"end"` + Direction Direction `protobuf:"varint,5,opt,name=direction,proto3,enum=logproto.Direction" json:"direction,omitempty"` +} + +func (m *QueryPlanRequest) Reset() { *m = QueryPlanRequest{} } +func (*QueryPlanRequest) ProtoMessage() {} +func (*QueryPlanRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_c28a5f14f1f4c79a, []int{54} +} +func (m *QueryPlanRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPlanRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPlanRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPlanRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPlanRequest.Merge(m, src) +} +func (m *QueryPlanRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPlanRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPlanRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPlanRequest proto.InternalMessageInfo + +func (m *QueryPlanRequest) GetQuery() string { + if m != nil { + return m.Query + } + return "" +} + +func (m *QueryPlanRequest) GetLimit() uint32 { + if m != nil { + return m.Limit + } + return 0 +} + +func (m *QueryPlanRequest) GetStart() time.Time { + if m != nil { + return m.Start + } + return time.Time{} +} + +func (m *QueryPlanRequest) GetEnd() time.Time { + if m != nil { + return m.End + } + return time.Time{} +} + +func (m *QueryPlanRequest) GetDirection() Direction { + if m != nil { + return m.Direction + } + return FORWARD +} + +type QueryPlanResponse struct { + Results []*SubQueryResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + MergeStrategy MergeStrategy `protobuf:"varint,2,opt,name=mergeStrategy,proto3,enum=logproto.MergeStrategy" json:"mergeStrategy,omitempty"` +} + +func (m *QueryPlanResponse) Reset() { *m = QueryPlanResponse{} } +func (*QueryPlanResponse) ProtoMessage() {} +func (*QueryPlanResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_c28a5f14f1f4c79a, []int{55} +} +func (m *QueryPlanResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPlanResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPlanResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPlanResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPlanResponse.Merge(m, src) +} +func (m *QueryPlanResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPlanResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPlanResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPlanResponse proto.InternalMessageInfo + +func (m *QueryPlanResponse) GetResults() []*SubQueryResult { + if m != nil { + return m.Results + } + return nil +} + +func (m *QueryPlanResponse) GetMergeStrategy() MergeStrategy { + if m != nil { + return m.MergeStrategy + } + return LOGSTREAM +} + +type SubQueryResult struct { + Start time.Time `protobuf:"bytes,1,opt,name=start,proto3,stdtime" json:"start"` + End time.Time `protobuf:"bytes,2,opt,name=end,proto3,stdtime" json:"end"` + Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` + Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` +} + +func (m *SubQueryResult) Reset() { *m = SubQueryResult{} } +func (*SubQueryResult) ProtoMessage() {} +func (*SubQueryResult) Descriptor() ([]byte, []int) { + return fileDescriptor_c28a5f14f1f4c79a, []int{56} +} +func (m *SubQueryResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SubQueryResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SubQueryResult.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SubQueryResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubQueryResult.Merge(m, src) +} +func (m *SubQueryResult) XXX_Size() int { + return m.Size() +} +func (m *SubQueryResult) XXX_DiscardUnknown() { + xxx_messageInfo_SubQueryResult.DiscardUnknown(m) +} + +var xxx_messageInfo_SubQueryResult proto.InternalMessageInfo + +func (m *SubQueryResult) GetStart() time.Time { + if m != nil { + return m.Start + } + return time.Time{} +} + +func (m *SubQueryResult) GetEnd() time.Time { + if m != nil { + return m.End + } + return time.Time{} +} + +func (m *SubQueryResult) GetQuery() string { + if m != nil { + return m.Query + } + return "" +} + +func (m *SubQueryResult) GetLimit() uint32 { + if m != nil { + return m.Limit + } + return 0 +} + func init() { proto.RegisterEnum("logproto.Direction", Direction_name, Direction_value) + proto.RegisterEnum("logproto.MergeStrategy", MergeStrategy_name, MergeStrategy_value) proto.RegisterType((*LabelToValuesResponse)(nil), "logproto.LabelToValuesResponse") proto.RegisterMapType((map[string]*UniqueLabelValues)(nil), "logproto.LabelToValuesResponse.LabelsEntry") proto.RegisterType((*UniqueLabelValues)(nil), "logproto.UniqueLabelValues") @@ -3116,179 +3334,191 @@ func init() { proto.RegisterType((*DetectedLabelsRequest)(nil), "logproto.DetectedLabelsRequest") proto.RegisterType((*DetectedLabelsResponse)(nil), "logproto.DetectedLabelsResponse") proto.RegisterType((*DetectedLabel)(nil), "logproto.DetectedLabel") + proto.RegisterType((*QueryPlanRequest)(nil), "logproto.QueryPlanRequest") + proto.RegisterType((*QueryPlanResponse)(nil), "logproto.QueryPlanResponse") + proto.RegisterType((*SubQueryResult)(nil), "logproto.SubQueryResult") } func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2673 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x8c, 0x5b, 0x47, - 0xd9, 0xcf, 0x7e, 0xfe, 0xfb, 0xec, 0xdd, 0x6c, 0x66, 0x9d, 0xc4, 0xda, 0xa4, 0x7e, 0xdb, 0x11, - 0xb4, 0xa1, 0x49, 0xd7, 0x4d, 0x4a, 0x4b, 0x9a, 0x52, 0x4a, 0xbc, 0xdb, 0xa4, 0x49, 0xb7, 0x69, - 0x3a, 0x9b, 0xa6, 0x05, 0x51, 0x55, 0x2f, 0xf6, 0xac, 0xf7, 0x29, 0xf6, 0x7b, 0xce, 0x7b, 0xe3, - 0xa6, 0x7b, 0x43, 0xe2, 0x8c, 0xa8, 0xc4, 0x01, 0xb8, 0x20, 0x21, 0x21, 0x81, 0x40, 0xbd, 0x20, - 0x4e, 0x08, 0xc1, 0x85, 0x43, 0xb9, 0xf5, 0x58, 0xf5, 0x60, 0xe8, 0xf6, 0x82, 0x56, 0x42, 0xaa, - 0x84, 0xc4, 0xa1, 0x27, 0x34, 0x7f, 0xef, 0xcd, 0x7b, 0x6b, 0x93, 0x3a, 0x04, 0xb5, 0xb9, 0xd8, - 0xf3, 0x7d, 0xf3, 0xcd, 0x37, 0xf3, 0xfd, 0xcc, 0xf7, 0x7d, 0xf3, 0xd9, 0x70, 0x7c, 0x74, 0xab, - 0xdf, 0x1e, 0x04, 0xfd, 0x51, 0x18, 0xb0, 0x20, 0x1e, 0xac, 0x89, 0x4f, 0x54, 0xd1, 0xf0, 0x4a, - 0xa3, 0x1f, 0xf4, 0x03, 0x49, 0xc3, 0x47, 0x72, 0x7e, 0xc5, 0xe9, 0x07, 0x41, 0x7f, 0x40, 0xdb, - 0x02, 0xba, 0x39, 0xde, 0x6e, 0x33, 0x6f, 0x48, 0x23, 0xe6, 0x0e, 0x47, 0x8a, 0x60, 0x55, 0x71, - 0xbf, 0x3d, 0x18, 0x06, 0x3d, 0x3a, 0x68, 0x47, 0xcc, 0x65, 0x91, 0xfc, 0x54, 0x14, 0xcb, 0x9c, - 0x62, 0x34, 0x8e, 0x76, 0xc4, 0x87, 0x44, 0xe2, 0xdf, 0x5b, 0x70, 0x64, 0xd3, 0xbd, 0x49, 0x07, - 0xd7, 0x83, 0x1b, 0xee, 0x60, 0x4c, 0x23, 0x42, 0xa3, 0x51, 0xe0, 0x47, 0x14, 0xad, 0x43, 0x69, - 0xc0, 0x27, 0xa2, 0xa6, 0xb5, 0x5a, 0x38, 0x59, 0x3b, 0x7b, 0x6a, 0x2d, 0x3e, 0xf2, 0xd4, 0x05, - 0x12, 0x1b, 0xbd, 0xe0, 0xb3, 0x70, 0x97, 0xa8, 0xa5, 0x2b, 0x37, 0xa0, 0x66, 0xa0, 0xd1, 0x12, - 0x14, 0x6e, 0xd1, 0xdd, 0xa6, 0xb5, 0x6a, 0x9d, 0xac, 0x12, 0x3e, 0x44, 0x67, 0xa0, 0xf8, 0x36, - 0x67, 0xd3, 0xcc, 0xaf, 0x5a, 0x27, 0x6b, 0x67, 0x8f, 0x27, 0x9b, 0xbc, 0xe6, 0x7b, 0xb7, 0xc7, - 0x54, 0xac, 0x56, 0x1b, 0x49, 0xca, 0xf3, 0xf9, 0x73, 0x16, 0x3e, 0x05, 0x87, 0x0f, 0xcc, 0xa3, - 0xa3, 0x50, 0x12, 0x14, 0xf2, 0xc4, 0x55, 0xa2, 0x20, 0xdc, 0x00, 0xb4, 0xc5, 0x42, 0xea, 0x0e, - 0x89, 0xcb, 0xf8, 0x79, 0x6f, 0x8f, 0x69, 0xc4, 0xf0, 0xcb, 0xb0, 0x9c, 0xc2, 0x2a, 0xb1, 0x9f, - 0x86, 0x5a, 0x94, 0xa0, 0x95, 0xec, 0x8d, 0xe4, 0x58, 0xc9, 0x1a, 0x62, 0x12, 0xe2, 0x9f, 0x5b, - 0x00, 0xc9, 0x1c, 0x6a, 0x01, 0xc8, 0xd9, 0x17, 0xdd, 0x68, 0x47, 0x08, 0x6c, 0x13, 0x03, 0x83, - 0x4e, 0xc3, 0xe1, 0x04, 0xba, 0x1a, 0x6c, 0xed, 0xb8, 0x61, 0x4f, 0xe8, 0xc0, 0x26, 0x07, 0x27, - 0x10, 0x02, 0x3b, 0x74, 0x19, 0x6d, 0x16, 0x56, 0xad, 0x93, 0x05, 0x22, 0xc6, 0x5c, 0x5a, 0x46, - 0x7d, 0xd7, 0x67, 0x4d, 0x5b, 0xa8, 0x53, 0x41, 0x1c, 0xcf, 0xed, 0x4b, 0xa3, 0x66, 0x71, 0xd5, - 0x3a, 0xb9, 0x40, 0x14, 0x84, 0xff, 0x5d, 0x80, 0xfa, 0xab, 0x63, 0x1a, 0xee, 0x2a, 0x05, 0xa0, - 0x16, 0x54, 0x22, 0x3a, 0xa0, 0x5d, 0x16, 0x84, 0xd2, 0x22, 0x9d, 0x7c, 0xd3, 0x22, 0x31, 0x0e, - 0x35, 0xa0, 0x38, 0xf0, 0x86, 0x1e, 0x13, 0xc7, 0x5a, 0x20, 0x12, 0x40, 0xe7, 0xa1, 0x18, 0x31, - 0x37, 0x64, 0xe2, 0x2c, 0xb5, 0xb3, 0x2b, 0x6b, 0xd2, 0x31, 0xd7, 0xb4, 0x63, 0xae, 0x5d, 0xd7, - 0x8e, 0xd9, 0xa9, 0xbc, 0x3f, 0x71, 0x72, 0xef, 0xfe, 0xcd, 0xb1, 0x88, 0x5c, 0x82, 0x9e, 0x86, - 0x02, 0xf5, 0x7b, 0xe2, 0xbc, 0x9f, 0x77, 0x25, 0x5f, 0x80, 0xce, 0x40, 0xb5, 0xe7, 0x85, 0xb4, - 0xcb, 0xbc, 0xc0, 0x17, 0x52, 0x2d, 0x9e, 0x5d, 0x4e, 0x2c, 0xb2, 0xa1, 0xa7, 0x48, 0x42, 0x85, - 0x4e, 0x43, 0x29, 0xe2, 0xaa, 0x8b, 0x9a, 0x65, 0xee, 0x0b, 0x9d, 0xc6, 0xfe, 0xc4, 0x59, 0x92, - 0x98, 0xd3, 0xc1, 0xd0, 0x63, 0x74, 0x38, 0x62, 0xbb, 0x44, 0xd1, 0xa0, 0xc7, 0xa0, 0xdc, 0xa3, - 0x03, 0xca, 0x0d, 0x5e, 0x11, 0x06, 0x5f, 0x32, 0xd8, 0x8b, 0x09, 0xa2, 0x09, 0xd0, 0x9b, 0x60, - 0x8f, 0x06, 0xae, 0xdf, 0xac, 0x0a, 0x29, 0x16, 0x13, 0xc2, 0x6b, 0x03, 0xd7, 0xef, 0x3c, 0xf3, - 0xd1, 0xc4, 0x79, 0xaa, 0xef, 0xb1, 0x9d, 0xf1, 0xcd, 0xb5, 0x6e, 0x30, 0x6c, 0xf7, 0x43, 0x77, - 0xdb, 0xf5, 0xdd, 0xf6, 0x20, 0xb8, 0xe5, 0xb5, 0xdf, 0x7e, 0xb2, 0xcd, 0xef, 0xe0, 0xed, 0x31, - 0x0d, 0x3d, 0x1a, 0xb6, 0x39, 0x9b, 0x35, 0x61, 0x12, 0xbe, 0x94, 0x08, 0xb6, 0xe8, 0x0a, 0xf7, - 0xbf, 0x20, 0xa4, 0xeb, 0x3b, 0x63, 0xff, 0x56, 0xd4, 0x04, 0xb1, 0xcb, 0xb1, 0x64, 0x17, 0x81, - 0x27, 0x74, 0xfb, 0x52, 0x18, 0x8c, 0x47, 0x9d, 0x43, 0xfb, 0x13, 0xc7, 0xa4, 0x27, 0x26, 0x70, - 0xc5, 0xae, 0x94, 0x96, 0xca, 0xf8, 0xbd, 0x02, 0xa0, 0x2d, 0x77, 0x38, 0x1a, 0xd0, 0xb9, 0xcc, - 0x1f, 0x1b, 0x3a, 0x7f, 0xcf, 0x86, 0x2e, 0xcc, 0x6b, 0xe8, 0xc4, 0x6a, 0xf6, 0x7c, 0x56, 0x2b, - 0x7e, 0x5e, 0xab, 0x95, 0xbe, 0xf4, 0x56, 0xc3, 0x4d, 0xb0, 0x39, 0x67, 0x1e, 0x2c, 0x43, 0xf7, - 0x8e, 0xb0, 0x4d, 0x9d, 0xf0, 0x21, 0xde, 0x84, 0x92, 0x94, 0x0b, 0xad, 0x64, 0x8d, 0x97, 0xbe, - 0xb7, 0x89, 0xe1, 0x0a, 0xda, 0x24, 0x4b, 0x89, 0x49, 0x0a, 0x42, 0xd9, 0xf8, 0x8f, 0x16, 0x2c, - 0x28, 0x8f, 0x50, 0xb1, 0xef, 0x26, 0x94, 0x65, 0xec, 0xd1, 0x71, 0xef, 0x58, 0x36, 0xee, 0x5d, - 0xe8, 0xb9, 0x23, 0x46, 0xc3, 0x4e, 0xfb, 0xfd, 0x89, 0x63, 0x7d, 0x34, 0x71, 0x1e, 0x9d, 0xa5, - 0x34, 0x9d, 0x6b, 0x74, 0xbc, 0xd4, 0x8c, 0xd1, 0x29, 0x71, 0x3a, 0x16, 0x29, 0xb7, 0x3a, 0xb4, - 0x26, 0x53, 0xd4, 0x65, 0xbf, 0x4f, 0x23, 0xce, 0xd9, 0xe6, 0x1e, 0x41, 0x24, 0x0d, 0x17, 0xf3, - 0x8e, 0x1b, 0xfa, 0x9e, 0xdf, 0x8f, 0x9a, 0x05, 0x11, 0xd3, 0x63, 0x18, 0xff, 0xd4, 0x82, 0xe5, - 0x94, 0x5b, 0x2b, 0x21, 0xce, 0x41, 0x29, 0xe2, 0x96, 0xd2, 0x32, 0x18, 0x4e, 0xb1, 0x25, 0xf0, - 0x9d, 0x45, 0x75, 0xf8, 0x92, 0x84, 0x89, 0xa2, 0xbf, 0x7f, 0x47, 0xfb, 0x8b, 0x05, 0x75, 0x91, - 0x98, 0xf4, 0x5d, 0x43, 0x60, 0xfb, 0xee, 0x90, 0x2a, 0x53, 0x89, 0xb1, 0x91, 0xad, 0xf8, 0x76, - 0x15, 0x9d, 0xad, 0xe6, 0x0d, 0xb0, 0xd6, 0x3d, 0x07, 0x58, 0x2b, 0xb9, 0x77, 0x0d, 0x28, 0x72, - 0xf7, 0xde, 0x15, 0xc1, 0xb5, 0x4a, 0x24, 0x80, 0x1f, 0x85, 0x05, 0x25, 0x85, 0x52, 0xed, 0xac, - 0x04, 0x3b, 0x84, 0x92, 0xb4, 0x04, 0xfa, 0x0a, 0x54, 0xe3, 0xc2, 0x44, 0x48, 0x5b, 0xe8, 0x94, - 0xf6, 0x27, 0x4e, 0x9e, 0x45, 0x24, 0x99, 0x40, 0x8e, 0x99, 0xf4, 0xad, 0x4e, 0x75, 0x7f, 0xe2, - 0x48, 0x84, 0x4a, 0xf1, 0xe8, 0x04, 0xd8, 0x3b, 0x3c, 0x6f, 0x72, 0x15, 0xd8, 0x9d, 0xca, 0xfe, - 0xc4, 0x11, 0x30, 0x11, 0x9f, 0xf8, 0x12, 0xd4, 0x37, 0x69, 0xdf, 0xed, 0xee, 0xaa, 0x4d, 0x1b, - 0x9a, 0x1d, 0xdf, 0xd0, 0xd2, 0x3c, 0x1e, 0x86, 0x7a, 0xbc, 0xe3, 0x5b, 0xc3, 0x48, 0xdd, 0x86, - 0x5a, 0x8c, 0x7b, 0x39, 0xc2, 0x3f, 0xb3, 0x40, 0xf9, 0x00, 0xc2, 0x46, 0xb5, 0xc3, 0x63, 0x21, - 0xec, 0x4f, 0x1c, 0x85, 0xd1, 0xc5, 0x0c, 0x7a, 0x16, 0xca, 0x91, 0xd8, 0x91, 0x33, 0xcb, 0xba, - 0x96, 0x98, 0xe8, 0x1c, 0xe2, 0x2e, 0xb2, 0x3f, 0x71, 0x34, 0x21, 0xd1, 0x03, 0xb4, 0x96, 0x2a, - 0x08, 0xa4, 0x60, 0x8b, 0xfb, 0x13, 0xc7, 0xc0, 0x9a, 0x05, 0x02, 0xfe, 0xcc, 0x82, 0xda, 0x75, - 0xd7, 0x8b, 0x5d, 0xa8, 0xa9, 0x4d, 0x94, 0xc4, 0x6a, 0x89, 0xe0, 0x9e, 0xd8, 0xa3, 0x03, 0x77, - 0xf7, 0x62, 0x10, 0x0a, 0xbe, 0x0b, 0x24, 0x86, 0x93, 0x1c, 0x6e, 0x4f, 0xcd, 0xe1, 0xc5, 0xf9, - 0x43, 0xfb, 0xff, 0x37, 0x90, 0x5e, 0xb1, 0x2b, 0xf9, 0xa5, 0x02, 0x7e, 0xcf, 0x82, 0xba, 0x14, - 0x5e, 0x79, 0xde, 0xf7, 0xa0, 0x24, 0x75, 0x23, 0xc4, 0xff, 0x2f, 0x81, 0xe9, 0xd4, 0x3c, 0x41, - 0x49, 0xf1, 0x44, 0xcf, 0xc3, 0x62, 0x2f, 0x0c, 0x46, 0x23, 0xda, 0xdb, 0x52, 0xe1, 0x2f, 0x9f, - 0x0d, 0x7f, 0x1b, 0xe6, 0x3c, 0xc9, 0x90, 0xe3, 0xbf, 0x5a, 0xb0, 0xa0, 0x82, 0x89, 0x32, 0x57, - 0xac, 0x62, 0xeb, 0x9e, 0xb3, 0x67, 0x7e, 0xde, 0xec, 0x79, 0x14, 0x4a, 0x7d, 0x9e, 0x5f, 0x74, - 0x40, 0x52, 0xd0, 0x7c, 0x59, 0x15, 0x5f, 0x81, 0x45, 0x2d, 0xca, 0x8c, 0x88, 0xba, 0x92, 0x8d, - 0xa8, 0x97, 0x7b, 0xd4, 0x67, 0xde, 0xb6, 0x17, 0xc7, 0x48, 0x45, 0x8f, 0x7f, 0x64, 0xc1, 0x52, - 0x96, 0x04, 0x6d, 0x64, 0x1e, 0x16, 0x8f, 0xcc, 0x66, 0x67, 0xbe, 0x29, 0x34, 0x6b, 0xf5, 0xb2, - 0x78, 0xea, 0x6e, 0x2f, 0x8b, 0x86, 0x19, 0x64, 0xaa, 0x2a, 0x2a, 0xe0, 0x9f, 0x58, 0xb0, 0x90, - 0xb2, 0x25, 0x3a, 0x07, 0xf6, 0x76, 0x18, 0x0c, 0xe7, 0x32, 0x94, 0x58, 0x81, 0xbe, 0x0e, 0x79, - 0x16, 0xcc, 0x65, 0xa6, 0x3c, 0x0b, 0xb8, 0x95, 0x94, 0xf8, 0x05, 0x59, 0xb7, 0x4b, 0x08, 0x3f, - 0x05, 0x55, 0x21, 0xd0, 0x35, 0xd7, 0x0b, 0xa7, 0x26, 0x8c, 0xe9, 0x02, 0x3d, 0x0b, 0x87, 0x64, - 0x30, 0x9c, 0xbe, 0xb8, 0x3e, 0x6d, 0x71, 0x5d, 0x2f, 0x3e, 0x0e, 0x45, 0x51, 0x74, 0xf0, 0x25, - 0x3d, 0x97, 0xb9, 0x7a, 0x09, 0x1f, 0xe3, 0x23, 0xb0, 0xcc, 0xef, 0x20, 0x0d, 0xa3, 0xf5, 0x60, - 0xec, 0x33, 0xfd, 0x6e, 0x3a, 0x0d, 0x8d, 0x34, 0x5a, 0x79, 0x49, 0x03, 0x8a, 0x5d, 0x8e, 0x10, - 0x3c, 0x16, 0x88, 0x04, 0xf0, 0x2f, 0x2d, 0x40, 0x97, 0x28, 0x13, 0xbb, 0x5c, 0xde, 0x88, 0xaf, - 0xc7, 0x0a, 0x54, 0x86, 0x2e, 0xeb, 0xee, 0xd0, 0x30, 0xd2, 0xf5, 0x8b, 0x86, 0xbf, 0x88, 0xc2, - 0x13, 0x9f, 0x81, 0xe5, 0xd4, 0x29, 0x95, 0x4c, 0x2b, 0x50, 0xe9, 0x2a, 0x9c, 0x4a, 0x79, 0x31, - 0x8c, 0x7f, 0x97, 0x87, 0x8a, 0x2e, 0xeb, 0xd0, 0x19, 0xa8, 0x6d, 0x7b, 0x7e, 0x9f, 0x86, 0xa3, - 0xd0, 0x53, 0x2a, 0xb0, 0x65, 0x99, 0x67, 0xa0, 0x89, 0x09, 0xa0, 0xc7, 0xa1, 0x3c, 0x8e, 0x68, - 0xf8, 0x96, 0x27, 0x6f, 0x7a, 0xb5, 0xd3, 0xd8, 0x9b, 0x38, 0xa5, 0xd7, 0x22, 0x1a, 0x5e, 0xde, - 0xe0, 0xc9, 0x67, 0x2c, 0x46, 0x44, 0x7e, 0xf7, 0xd0, 0x4b, 0xca, 0x4d, 0x45, 0x01, 0xd7, 0xf9, - 0x06, 0x3f, 0x7e, 0x26, 0xd4, 0x8d, 0xc2, 0x60, 0x48, 0xd9, 0x0e, 0x1d, 0x47, 0xed, 0x6e, 0x30, - 0x1c, 0x06, 0x7e, 0x5b, 0x74, 0x02, 0x84, 0xd0, 0x3c, 0x83, 0xf2, 0xe5, 0xca, 0x73, 0xaf, 0x43, - 0x99, 0xed, 0x84, 0xc1, 0xb8, 0xbf, 0x23, 0x12, 0x43, 0xa1, 0x73, 0x7e, 0x7e, 0x7e, 0x9a, 0x03, - 0xd1, 0x03, 0xf4, 0x30, 0xd7, 0x16, 0xed, 0xde, 0x8a, 0xc6, 0x43, 0xf9, 0xf6, 0xec, 0x14, 0xf7, - 0x27, 0x8e, 0xf5, 0x38, 0x89, 0xd1, 0xf8, 0x02, 0x2c, 0xa4, 0x4a, 0x61, 0xf4, 0x04, 0xd8, 0x21, - 0xdd, 0xd6, 0xa1, 0x00, 0x1d, 0xac, 0x98, 0x65, 0xf6, 0xe7, 0x34, 0x44, 0x7c, 0xe2, 0x1f, 0xe6, - 0xc1, 0x31, 0x5e, 0xfd, 0x17, 0x83, 0xf0, 0x65, 0xca, 0x42, 0xaf, 0x7b, 0xd5, 0x1d, 0x52, 0xed, - 0x5e, 0x0e, 0xd4, 0x86, 0x02, 0xf9, 0x96, 0x71, 0x8b, 0x60, 0x18, 0xd3, 0xa1, 0x87, 0x00, 0xc4, - 0xb5, 0x93, 0xf3, 0xf2, 0x42, 0x55, 0x05, 0x46, 0x4c, 0xaf, 0xa7, 0x94, 0xdd, 0x9e, 0x53, 0x39, - 0x4a, 0xc9, 0x97, 0xb3, 0x4a, 0x9e, 0x9b, 0x4f, 0xac, 0x59, 0xf3, 0xba, 0x14, 0xd3, 0xd7, 0x05, - 0xff, 0xd3, 0x82, 0xd6, 0xa6, 0x3e, 0xf9, 0x3d, 0xaa, 0x43, 0xcb, 0x9b, 0xbf, 0x4f, 0xf2, 0x16, - 0xee, 0xa3, 0xbc, 0x76, 0x46, 0xde, 0x16, 0xc0, 0xa6, 0xe7, 0xd3, 0x8b, 0xde, 0x80, 0xd1, 0x70, - 0xca, 0x23, 0xe9, 0xc7, 0x85, 0x24, 0xe2, 0x10, 0xba, 0xad, 0x75, 0xb0, 0x6e, 0x84, 0xf9, 0xfb, - 0x21, 0x62, 0xfe, 0x3e, 0x8a, 0x58, 0xc8, 0x44, 0x40, 0x1f, 0xca, 0xdb, 0x42, 0x3c, 0x99, 0xb1, - 0x53, 0xfd, 0xa7, 0x44, 0xf6, 0xce, 0xb7, 0xd4, 0xe6, 0x4f, 0xdf, 0xa5, 0xe0, 0x12, 0x5d, 0xc1, - 0x76, 0xb4, 0xeb, 0x33, 0xf7, 0x1d, 0x63, 0x3d, 0xd1, 0x9b, 0x20, 0x57, 0xd5, 0x74, 0xc5, 0xa9, - 0x35, 0xdd, 0x73, 0x6a, 0x9b, 0xff, 0xa5, 0xae, 0xc3, 0xcf, 0x25, 0x01, 0x56, 0x18, 0x45, 0x05, - 0xd8, 0x47, 0xee, 0x76, 0xfd, 0xd5, 0xa5, 0xff, 0x93, 0x05, 0x4b, 0x97, 0x28, 0x4b, 0xd7, 0x58, - 0x0f, 0x90, 0x49, 0xf1, 0x8b, 0x70, 0xd8, 0x38, 0xbf, 0x92, 0xfe, 0xc9, 0x4c, 0x61, 0x75, 0x24, - 0x91, 0xff, 0xb2, 0xdf, 0xa3, 0xef, 0xa8, 0xf7, 0x6a, 0xba, 0xa6, 0xba, 0x06, 0x35, 0x63, 0x12, - 0x5d, 0xc8, 0x54, 0x53, 0xcb, 0x99, 0x36, 0x2d, 0xaf, 0x08, 0x3a, 0x0d, 0x25, 0x93, 0x7c, 0x95, - 0xaa, 0x5a, 0x39, 0xae, 0x3c, 0xb6, 0x00, 0x09, 0x73, 0x09, 0xb6, 0x66, 0xee, 0x13, 0xd8, 0x97, - 0xe2, 0xb2, 0x2a, 0x86, 0xd1, 0xc3, 0x60, 0x87, 0xc1, 0x1d, 0x5d, 0x26, 0x2f, 0x24, 0x5b, 0x92, - 0xe0, 0x0e, 0x11, 0x53, 0xf8, 0x59, 0x28, 0x90, 0xe0, 0x0e, 0x6a, 0x01, 0x84, 0xae, 0xdf, 0xa7, - 0x37, 0xe2, 0x07, 0x5a, 0x9d, 0x18, 0x98, 0x19, 0x75, 0xc9, 0x3a, 0x1c, 0x36, 0x4f, 0x24, 0xcd, - 0xbd, 0x06, 0xe5, 0x57, 0xc7, 0xa6, 0xba, 0x1a, 0x19, 0x75, 0xc9, 0x3e, 0x80, 0x26, 0xe2, 0x3e, - 0x03, 0x09, 0x1e, 0x9d, 0x80, 0x2a, 0x73, 0x6f, 0x0e, 0xe8, 0xd5, 0x24, 0x04, 0x26, 0x08, 0x3e, - 0xcb, 0xdf, 0x96, 0x37, 0x8c, 0x02, 0x2b, 0x41, 0xa0, 0xc7, 0x60, 0x29, 0x39, 0xf3, 0xb5, 0x90, - 0x6e, 0x7b, 0xef, 0x08, 0x0b, 0xd7, 0xc9, 0x01, 0x3c, 0x3a, 0x09, 0x87, 0x12, 0xdc, 0x96, 0x28, - 0x64, 0x6c, 0x41, 0x9a, 0x45, 0x73, 0xdd, 0x08, 0x71, 0x5f, 0xb8, 0x3d, 0x76, 0x07, 0xe2, 0xf2, - 0xd5, 0x89, 0x81, 0xc1, 0x7f, 0xb6, 0xe0, 0xb0, 0x34, 0x35, 0x73, 0xd9, 0x03, 0xe9, 0xf5, 0xbf, - 0xb2, 0x00, 0x99, 0x12, 0x28, 0xd7, 0xfa, 0xaa, 0xd9, 0x67, 0xe2, 0x95, 0x52, 0x4d, 0x3c, 0x99, - 0x25, 0x2a, 0x69, 0x15, 0x61, 0x28, 0x75, 0x65, 0x3f, 0x4d, 0x34, 0xc6, 0xe5, 0x9b, 0x5c, 0x62, - 0x88, 0xfa, 0x46, 0x0e, 0x14, 0x6f, 0xee, 0x32, 0x1a, 0xa9, 0x17, 0xb5, 0x68, 0x25, 0x08, 0x04, - 0x91, 0x5f, 0x7c, 0x2f, 0xea, 0x33, 0xe1, 0x35, 0x76, 0xb2, 0x97, 0x42, 0x11, 0x3d, 0xc0, 0xbf, - 0xcd, 0xc3, 0xc2, 0x8d, 0x60, 0x30, 0x4e, 0x92, 0xe6, 0x83, 0x94, 0x30, 0x52, 0xcf, 0xfc, 0xa2, - 0x7e, 0xe6, 0x23, 0xb0, 0x23, 0x46, 0x47, 0xc2, 0xb3, 0x0a, 0x44, 0x8c, 0x11, 0x86, 0x3a, 0x73, - 0xc3, 0x3e, 0x65, 0xf2, 0xf1, 0xd4, 0x2c, 0x89, 0xaa, 0x36, 0x85, 0x43, 0xab, 0x50, 0x73, 0xfb, - 0xfd, 0x90, 0xf6, 0x5d, 0x46, 0x3b, 0xbb, 0xcd, 0xb2, 0xd8, 0xcc, 0x44, 0xe1, 0x37, 0x60, 0x51, - 0x2b, 0x4b, 0x99, 0xf4, 0x09, 0x28, 0xbf, 0x2d, 0x30, 0x53, 0xda, 0x6e, 0x92, 0x54, 0x85, 0x31, - 0x4d, 0x96, 0xfe, 0x79, 0x41, 0x9f, 0x19, 0x5f, 0x81, 0x92, 0x24, 0x47, 0x27, 0xcc, 0x27, 0x90, - 0xac, 0x02, 0x39, 0xac, 0xde, 0x33, 0x18, 0x4a, 0x92, 0x91, 0x32, 0xbc, 0xf0, 0x0d, 0x89, 0x21, - 0xea, 0x1b, 0xff, 0xcb, 0x82, 0x23, 0x1b, 0x94, 0xd1, 0x2e, 0xa3, 0xbd, 0x8b, 0x1e, 0x1d, 0xf4, - 0xbe, 0xd0, 0xd7, 0x79, 0xdc, 0x63, 0x2b, 0x18, 0x3d, 0x36, 0x1e, 0x77, 0x06, 0x9e, 0x4f, 0x37, - 0x8d, 0x26, 0x4d, 0x82, 0xe0, 0x11, 0x62, 0x9b, 0x1f, 0x5c, 0x4e, 0xcb, 0xdf, 0x73, 0x0c, 0x4c, - 0x6c, 0xe1, 0x52, 0x62, 0x61, 0xfc, 0x03, 0x0b, 0x8e, 0x66, 0xa5, 0x56, 0x46, 0x6a, 0x43, 0x49, - 0x2c, 0x9e, 0xd2, 0xde, 0x4d, 0xad, 0x20, 0x8a, 0x0c, 0x9d, 0x4b, 0xed, 0x2f, 0x7e, 0x07, 0xea, - 0x34, 0xf7, 0x27, 0x4e, 0x23, 0xc1, 0x1a, 0x1d, 0x04, 0x83, 0x16, 0xff, 0x81, 0xbf, 0xb3, 0x4d, - 0x9e, 0xc2, 0xde, 0xdc, 0xbf, 0x54, 0xec, 0x95, 0x00, 0xfa, 0x1a, 0xd8, 0x6c, 0x77, 0xa4, 0x42, - 0x6e, 0xe7, 0xc8, 0x67, 0x13, 0xe7, 0x70, 0x6a, 0xd9, 0xf5, 0xdd, 0x11, 0x25, 0x82, 0x84, 0xbb, - 0x65, 0xd7, 0x0d, 0x7b, 0x9e, 0xef, 0x0e, 0x3c, 0x26, 0xd5, 0x68, 0x13, 0x13, 0x85, 0x9a, 0x50, - 0x1e, 0xb9, 0x61, 0xa4, 0xeb, 0xa6, 0x2a, 0xd1, 0xa0, 0x68, 0x81, 0xdc, 0xa2, 0xac, 0xbb, 0x23, - 0xc3, 0xac, 0x6a, 0x81, 0x08, 0x4c, 0xaa, 0x05, 0x22, 0x30, 0xf8, 0x17, 0x86, 0xe3, 0xc8, 0x3b, - 0xf1, 0xa5, 0x73, 0x1c, 0xfc, 0x9d, 0xc4, 0xca, 0xfa, 0x88, 0xca, 0xca, 0xcf, 0xc3, 0x62, 0x2f, - 0x35, 0x33, 0xdb, 0xda, 0xb2, 0xbd, 0x9b, 0x21, 0xc7, 0xe3, 0xc4, 0x74, 0x02, 0x33, 0xc3, 0x74, - 0x19, 0x7b, 0xe4, 0x0f, 0xda, 0x23, 0xd1, 0x7a, 0xe1, 0xee, 0x5a, 0x7f, 0xec, 0x11, 0xa8, 0xc6, - 0x3f, 0xe5, 0xa1, 0x1a, 0x94, 0x2f, 0xbe, 0x42, 0x5e, 0xbf, 0x40, 0x36, 0x96, 0x72, 0xa8, 0x0e, - 0x95, 0xce, 0x85, 0xf5, 0x97, 0x04, 0x64, 0x9d, 0xfd, 0x4d, 0x49, 0x17, 0x02, 0x21, 0xfa, 0x26, - 0x14, 0x65, 0x76, 0x3f, 0x9a, 0x08, 0x67, 0xfe, 0xca, 0xb5, 0x72, 0xec, 0x00, 0x5e, 0x6a, 0x09, - 0xe7, 0x9e, 0xb0, 0xd0, 0x55, 0xa8, 0x09, 0xa4, 0xea, 0x23, 0x9f, 0xc8, 0xb6, 0x73, 0x53, 0x9c, - 0x1e, 0x9a, 0x31, 0x6b, 0xf0, 0x3b, 0x0f, 0x45, 0xa9, 0xb0, 0xa3, 0x99, 0x22, 0x6c, 0xca, 0x69, - 0x52, 0x9d, 0x75, 0x9c, 0x43, 0xcf, 0x80, 0x7d, 0xdd, 0xf5, 0x06, 0xc8, 0xa8, 0x01, 0x8d, 0xf6, - 0xef, 0xca, 0xd1, 0x2c, 0xda, 0xd8, 0xf6, 0xb9, 0xb8, 0x8b, 0x7d, 0x2c, 0xdb, 0x4a, 0xd3, 0xcb, - 0x9b, 0x07, 0x27, 0xe2, 0x9d, 0x5f, 0x91, 0xbd, 0x56, 0xdd, 0xd0, 0x41, 0x0f, 0xa5, 0xb7, 0xca, - 0xf4, 0x7f, 0x56, 0x5a, 0xb3, 0xa6, 0x63, 0x86, 0x9b, 0x50, 0x33, 0x9a, 0x29, 0xa6, 0x5a, 0x0f, - 0x76, 0x82, 0x4c, 0xb5, 0x4e, 0xe9, 0xc0, 0xe0, 0x1c, 0xba, 0x04, 0x15, 0x5e, 0x39, 0x8b, 0x1f, - 0x5d, 0x8e, 0x67, 0x0b, 0x64, 0xa3, 0x30, 0x5a, 0x39, 0x31, 0x7d, 0x32, 0x66, 0xf4, 0x6d, 0xa8, - 0x5e, 0xa2, 0x4c, 0x65, 0x97, 0x63, 0xd9, 0xf4, 0x34, 0x45, 0x53, 0xe9, 0x14, 0x87, 0x73, 0xe8, - 0x0d, 0x51, 0xc4, 0xa7, 0x83, 0x2b, 0x72, 0x66, 0x04, 0xd1, 0xf8, 0x5c, 0xab, 0xb3, 0x09, 0x62, - 0xce, 0xaf, 0xa7, 0x38, 0xab, 0x3c, 0xec, 0xcc, 0xb8, 0xb0, 0x31, 0x67, 0xe7, 0x2e, 0x7f, 0xc9, - 0xc0, 0xb9, 0xb3, 0x6f, 0xea, 0x7f, 0x25, 0x6c, 0xb8, 0xcc, 0x45, 0xaf, 0xc0, 0xa2, 0xd0, 0x65, - 0xfc, 0xb7, 0x85, 0x94, 0xcf, 0x1f, 0xf8, 0x8f, 0x44, 0xca, 0xe7, 0x0f, 0xfe, 0x57, 0x02, 0xe7, - 0x3a, 0x6f, 0x7e, 0xf0, 0x71, 0x2b, 0xf7, 0xe1, 0xc7, 0xad, 0xdc, 0xa7, 0x1f, 0xb7, 0xac, 0xef, - 0xef, 0xb5, 0xac, 0x5f, 0xef, 0xb5, 0xac, 0xf7, 0xf7, 0x5a, 0xd6, 0x07, 0x7b, 0x2d, 0xeb, 0xef, - 0x7b, 0x2d, 0xeb, 0x1f, 0x7b, 0xad, 0xdc, 0xa7, 0x7b, 0x2d, 0xeb, 0xdd, 0x4f, 0x5a, 0xb9, 0x0f, - 0x3e, 0x69, 0xe5, 0x3e, 0xfc, 0xa4, 0x95, 0xfb, 0xee, 0xa3, 0x77, 0x7f, 0xb0, 0xca, 0xb0, 0x58, - 0x12, 0x5f, 0x4f, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x55, 0xf6, 0x50, 0x3b, 0x23, 0x00, + // 2817 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x6c, 0x1b, 0xc7, + 0xd5, 0x5c, 0xfe, 0x8a, 0x8f, 0xa4, 0x4c, 0x8f, 0x69, 0x9b, 0xa0, 0x1d, 0x52, 0x19, 0x7c, 0x5f, + 0xe2, 0xda, 0x8e, 0x68, 0x2b, 0x4d, 0xea, 0x38, 0x75, 0x53, 0x51, 0x8a, 0x15, 0x39, 0xf2, 0x4f, + 0x46, 0x8a, 0x93, 0x16, 0x0d, 0x82, 0x15, 0x39, 0xa2, 0x16, 0x26, 0x77, 0xe9, 0xdd, 0x61, 0x1c, + 0xdd, 0x0a, 0x14, 0xe8, 0xad, 0x68, 0x80, 0x1e, 0xda, 0x5e, 0x0a, 0x14, 0x28, 0xd0, 0x02, 0x45, + 0x80, 0xa2, 0xe8, 0xa9, 0x28, 0xda, 0x4b, 0x0f, 0xe9, 0x2d, 0xc7, 0x20, 0x07, 0xb6, 0x51, 0x50, + 0xa0, 0x10, 0x50, 0x20, 0x40, 0xd1, 0x1e, 0x72, 0x2a, 0xe6, 0x6f, 0x77, 0x76, 0x45, 0xd5, 0x91, + 0xeb, 0x22, 0xf1, 0x85, 0xdc, 0x79, 0xf3, 0xe6, 0xcd, 0xbc, 0x9f, 0x79, 0x7f, 0xbb, 0x70, 0x6a, + 0x74, 0xa7, 0xdf, 0x1e, 0x78, 0xfd, 0x91, 0xef, 0x31, 0x2f, 0x7c, 0x98, 0x17, 0xbf, 0x68, 0x46, + 0x8f, 0x1b, 0xb5, 0xbe, 0xd7, 0xf7, 0x24, 0x0e, 0x7f, 0x92, 0xf3, 0x8d, 0x56, 0xdf, 0xf3, 0xfa, + 0x03, 0xda, 0x16, 0xa3, 0xcd, 0xf1, 0x56, 0x9b, 0x39, 0x43, 0x1a, 0x30, 0x7b, 0x38, 0x52, 0x08, + 0x73, 0x8a, 0xfa, 0xdd, 0xc1, 0xd0, 0xeb, 0xd1, 0x41, 0x3b, 0x60, 0x36, 0x0b, 0xe4, 0xaf, 0xc2, + 0x38, 0xc6, 0x31, 0x46, 0xe3, 0x60, 0x5b, 0xfc, 0x48, 0x20, 0xfe, 0x8d, 0x05, 0xc7, 0xd7, 0xec, + 0x4d, 0x3a, 0xd8, 0xf0, 0x6e, 0xdb, 0x83, 0x31, 0x0d, 0x08, 0x0d, 0x46, 0x9e, 0x1b, 0x50, 0xb4, + 0x04, 0xf9, 0x01, 0x9f, 0x08, 0xea, 0xd6, 0x5c, 0xe6, 0x4c, 0x69, 0xe1, 0xdc, 0x7c, 0x78, 0xe4, + 0xa9, 0x0b, 0x24, 0x34, 0x78, 0xd1, 0x65, 0xfe, 0x0e, 0x51, 0x4b, 0x1b, 0xb7, 0xa1, 0x64, 0x80, + 0x51, 0x15, 0x32, 0x77, 0xe8, 0x4e, 0xdd, 0x9a, 0xb3, 0xce, 0x14, 0x09, 0x7f, 0x44, 0x17, 0x21, + 0xf7, 0x16, 0x27, 0x53, 0x4f, 0xcf, 0x59, 0x67, 0x4a, 0x0b, 0xa7, 0xa2, 0x4d, 0x5e, 0x75, 0x9d, + 0xbb, 0x63, 0x2a, 0x56, 0xab, 0x8d, 0x24, 0xe6, 0xe5, 0xf4, 0x25, 0x0b, 0x9f, 0x83, 0xa3, 0xfb, + 0xe6, 0xd1, 0x09, 0xc8, 0x0b, 0x0c, 0x79, 0xe2, 0x22, 0x51, 0x23, 0x5c, 0x03, 0xb4, 0xce, 0x7c, + 0x6a, 0x0f, 0x89, 0xcd, 0xf8, 0x79, 0xef, 0x8e, 0x69, 0xc0, 0xf0, 0x75, 0x38, 0x16, 0x83, 0x2a, + 0xb6, 0x9f, 0x85, 0x52, 0x10, 0x81, 0x15, 0xef, 0xb5, 0xe8, 0x58, 0xd1, 0x1a, 0x62, 0x22, 0xe2, + 0x9f, 0x58, 0x00, 0xd1, 0x1c, 0x6a, 0x02, 0xc8, 0xd9, 0x97, 0xec, 0x60, 0x5b, 0x30, 0x9c, 0x25, + 0x06, 0x04, 0x9d, 0x87, 0xa3, 0xd1, 0xe8, 0x86, 0xb7, 0xbe, 0x6d, 0xfb, 0x3d, 0x21, 0x83, 0x2c, + 0xd9, 0x3f, 0x81, 0x10, 0x64, 0x7d, 0x9b, 0xd1, 0x7a, 0x66, 0xce, 0x3a, 0x93, 0x21, 0xe2, 0x99, + 0x73, 0xcb, 0xa8, 0x6b, 0xbb, 0xac, 0x9e, 0x15, 0xe2, 0x54, 0x23, 0x0e, 0xe7, 0xfa, 0xa5, 0x41, + 0x3d, 0x37, 0x67, 0x9d, 0xa9, 0x10, 0x35, 0xc2, 0xff, 0xca, 0x40, 0xf9, 0x95, 0x31, 0xf5, 0x77, + 0x94, 0x00, 0x50, 0x13, 0x66, 0x02, 0x3a, 0xa0, 0x5d, 0xe6, 0xf9, 0x52, 0x23, 0x9d, 0x74, 0xdd, + 0x22, 0x21, 0x0c, 0xd5, 0x20, 0x37, 0x70, 0x86, 0x0e, 0x13, 0xc7, 0xaa, 0x10, 0x39, 0x40, 0x97, + 0x21, 0x17, 0x30, 0xdb, 0x67, 0xe2, 0x2c, 0xa5, 0x85, 0xc6, 0xbc, 0x34, 0xcc, 0x79, 0x6d, 0x98, + 0xf3, 0x1b, 0xda, 0x30, 0x3b, 0x33, 0xef, 0x4d, 0x5a, 0xa9, 0x77, 0xfe, 0xdc, 0xb2, 0x88, 0x5c, + 0x82, 0x9e, 0x85, 0x0c, 0x75, 0x7b, 0xe2, 0xbc, 0x9f, 0x75, 0x25, 0x5f, 0x80, 0x2e, 0x42, 0xb1, + 0xe7, 0xf8, 0xb4, 0xcb, 0x1c, 0xcf, 0x15, 0x5c, 0xcd, 0x2e, 0x1c, 0x8b, 0x34, 0xb2, 0xac, 0xa7, + 0x48, 0x84, 0x85, 0xce, 0x43, 0x3e, 0xe0, 0xa2, 0x0b, 0xea, 0x05, 0x6e, 0x0b, 0x9d, 0xda, 0xde, + 0xa4, 0x55, 0x95, 0x90, 0xf3, 0xde, 0xd0, 0x61, 0x74, 0x38, 0x62, 0x3b, 0x44, 0xe1, 0xa0, 0xb3, + 0x50, 0xe8, 0xd1, 0x01, 0xe5, 0x0a, 0x9f, 0x11, 0x0a, 0xaf, 0x1a, 0xe4, 0xc5, 0x04, 0xd1, 0x08, + 0xe8, 0x0d, 0xc8, 0x8e, 0x06, 0xb6, 0x5b, 0x2f, 0x0a, 0x2e, 0x66, 0x23, 0xc4, 0x5b, 0x03, 0xdb, + 0xed, 0x3c, 0xf7, 0xe1, 0xa4, 0xf5, 0x4c, 0xdf, 0x61, 0xdb, 0xe3, 0xcd, 0xf9, 0xae, 0x37, 0x6c, + 0xf7, 0x7d, 0x7b, 0xcb, 0x76, 0xed, 0xf6, 0xc0, 0xbb, 0xe3, 0xb4, 0xdf, 0x7a, 0xba, 0xcd, 0xef, + 0xe0, 0xdd, 0x31, 0xf5, 0x1d, 0xea, 0xb7, 0x39, 0x99, 0x79, 0xa1, 0x12, 0xbe, 0x94, 0x08, 0xb2, + 0xe8, 0x1a, 0xb7, 0x3f, 0xcf, 0xa7, 0x4b, 0xdb, 0x63, 0xf7, 0x4e, 0x50, 0x07, 0xb1, 0xcb, 0xc9, + 0x68, 0x17, 0x01, 0x27, 0x74, 0x6b, 0xc5, 0xf7, 0xc6, 0xa3, 0xce, 0x91, 0xbd, 0x49, 0xcb, 0xc4, + 0x27, 0xe6, 0xe0, 0x5a, 0x76, 0x26, 0x5f, 0x2d, 0xe0, 0x77, 0x33, 0x80, 0xd6, 0xed, 0xe1, 0x68, + 0x40, 0x0f, 0xa5, 0xfe, 0x50, 0xd1, 0xe9, 0x07, 0x56, 0x74, 0xe6, 0xb0, 0x8a, 0x8e, 0xb4, 0x96, + 0x3d, 0x9c, 0xd6, 0x72, 0x9f, 0x55, 0x6b, 0xf9, 0x2f, 0xbc, 0xd6, 0x70, 0x1d, 0xb2, 0x9c, 0x32, + 0x77, 0x96, 0xbe, 0x7d, 0x4f, 0xe8, 0xa6, 0x4c, 0xf8, 0x23, 0x5e, 0x83, 0xbc, 0xe4, 0x0b, 0x35, + 0x92, 0xca, 0x8b, 0xdf, 0xdb, 0x48, 0x71, 0x19, 0xad, 0x92, 0x6a, 0xa4, 0x92, 0x8c, 0x10, 0x36, + 0xfe, 0x9d, 0x05, 0x15, 0x65, 0x11, 0xca, 0xf7, 0x6d, 0x42, 0x41, 0xfa, 0x1e, 0xed, 0xf7, 0x4e, + 0x26, 0xfd, 0xde, 0x62, 0xcf, 0x1e, 0x31, 0xea, 0x77, 0xda, 0xef, 0x4d, 0x5a, 0xd6, 0x87, 0x93, + 0xd6, 0x93, 0x07, 0x09, 0x4d, 0xc7, 0x1a, 0xed, 0x2f, 0x35, 0x61, 0x74, 0x4e, 0x9c, 0x8e, 0x05, + 0xca, 0xac, 0x8e, 0xcc, 0xcb, 0x10, 0xb5, 0xea, 0xf6, 0x69, 0xc0, 0x29, 0x67, 0xb9, 0x45, 0x10, + 0x89, 0xc3, 0xd9, 0xbc, 0x67, 0xfb, 0xae, 0xe3, 0xf6, 0x83, 0x7a, 0x46, 0xf8, 0xf4, 0x70, 0x8c, + 0x7f, 0x64, 0xc1, 0xb1, 0x98, 0x59, 0x2b, 0x26, 0x2e, 0x41, 0x3e, 0xe0, 0x9a, 0xd2, 0x3c, 0x18, + 0x46, 0xb1, 0x2e, 0xe0, 0x9d, 0x59, 0x75, 0xf8, 0xbc, 0x1c, 0x13, 0x85, 0xff, 0xf0, 0x8e, 0xf6, + 0x47, 0x0b, 0xca, 0x22, 0x30, 0xe9, 0xbb, 0x86, 0x20, 0xeb, 0xda, 0x43, 0xaa, 0x54, 0x25, 0x9e, + 0x8d, 0x68, 0xc5, 0xb7, 0x9b, 0xd1, 0xd1, 0xea, 0xb0, 0x0e, 0xd6, 0x7a, 0x60, 0x07, 0x6b, 0x45, + 0xf7, 0xae, 0x06, 0x39, 0x6e, 0xde, 0x3b, 0xc2, 0xb9, 0x16, 0x89, 0x1c, 0xe0, 0x27, 0xa1, 0xa2, + 0xb8, 0x50, 0xa2, 0x3d, 0x28, 0xc0, 0x0e, 0x21, 0x2f, 0x35, 0x81, 0xfe, 0x0f, 0x8a, 0x61, 0x62, + 0x22, 0xb8, 0xcd, 0x74, 0xf2, 0x7b, 0x93, 0x56, 0x9a, 0x05, 0x24, 0x9a, 0x40, 0x2d, 0x33, 0xe8, + 0x5b, 0x9d, 0xe2, 0xde, 0xa4, 0x25, 0x01, 0x2a, 0xc4, 0xa3, 0xd3, 0x90, 0xdd, 0xe6, 0x71, 0x93, + 0x8b, 0x20, 0xdb, 0x99, 0xd9, 0x9b, 0xb4, 0xc4, 0x98, 0x88, 0x5f, 0xbc, 0x02, 0xe5, 0x35, 0xda, + 0xb7, 0xbb, 0x3b, 0x6a, 0xd3, 0x9a, 0x26, 0xc7, 0x37, 0xb4, 0x34, 0x8d, 0xc7, 0xa1, 0x1c, 0xee, + 0xf8, 0xe6, 0x30, 0x50, 0xb7, 0xa1, 0x14, 0xc2, 0xae, 0x07, 0xf8, 0xc7, 0x16, 0x28, 0x1b, 0x40, + 0xd8, 0xc8, 0x76, 0xb8, 0x2f, 0x84, 0xbd, 0x49, 0x4b, 0x41, 0x74, 0x32, 0x83, 0x9e, 0x87, 0x42, + 0x20, 0x76, 0xe4, 0xc4, 0x92, 0xa6, 0x25, 0x26, 0x3a, 0x47, 0xb8, 0x89, 0xec, 0x4d, 0x5a, 0x1a, + 0x91, 0xe8, 0x07, 0x34, 0x1f, 0x4b, 0x08, 0x24, 0x63, 0xb3, 0x7b, 0x93, 0x96, 0x01, 0x35, 0x13, + 0x04, 0xfc, 0xa9, 0x05, 0xa5, 0x0d, 0xdb, 0x09, 0x4d, 0xa8, 0xae, 0x55, 0x14, 0xf9, 0x6a, 0x09, + 0xe0, 0x96, 0xd8, 0xa3, 0x03, 0x7b, 0xe7, 0xaa, 0xe7, 0x0b, 0xba, 0x15, 0x12, 0x8e, 0xa3, 0x18, + 0x9e, 0x9d, 0x1a, 0xc3, 0x73, 0x87, 0x77, 0xed, 0xff, 0x5b, 0x47, 0x7a, 0x2d, 0x3b, 0x93, 0xae, + 0x66, 0xf0, 0xbb, 0x16, 0x94, 0x25, 0xf3, 0xca, 0xf2, 0xbe, 0x05, 0x79, 0x29, 0x1b, 0xc1, 0xfe, + 0x7f, 0x70, 0x4c, 0xe7, 0x0e, 0xe3, 0x94, 0x14, 0x4d, 0xf4, 0x02, 0xcc, 0xf6, 0x7c, 0x6f, 0x34, + 0xa2, 0xbd, 0x75, 0xe5, 0xfe, 0xd2, 0x49, 0xf7, 0xb7, 0x6c, 0xce, 0x93, 0x04, 0x3a, 0xfe, 0x93, + 0x05, 0x15, 0xe5, 0x4c, 0x94, 0xba, 0x42, 0x11, 0x5b, 0x0f, 0x1c, 0x3d, 0xd3, 0x87, 0x8d, 0x9e, + 0x27, 0x20, 0xdf, 0xe7, 0xf1, 0x45, 0x3b, 0x24, 0x35, 0x3a, 0x5c, 0x54, 0xc5, 0xd7, 0x60, 0x56, + 0xb3, 0x72, 0x80, 0x47, 0x6d, 0x24, 0x3d, 0xea, 0x6a, 0x8f, 0xba, 0xcc, 0xd9, 0x72, 0x42, 0x1f, + 0xa9, 0xf0, 0xf1, 0xf7, 0x2d, 0xa8, 0x26, 0x51, 0xd0, 0x72, 0xa2, 0xb0, 0x78, 0xe2, 0x60, 0x72, + 0x66, 0x4d, 0xa1, 0x49, 0xab, 0xca, 0xe2, 0x99, 0xfb, 0x55, 0x16, 0x35, 0xd3, 0xc9, 0x14, 0x95, + 0x57, 0xc0, 0x3f, 0xb4, 0xa0, 0x12, 0xd3, 0x25, 0xba, 0x04, 0xd9, 0x2d, 0xdf, 0x1b, 0x1e, 0x4a, + 0x51, 0x62, 0x05, 0xfa, 0x32, 0xa4, 0x99, 0x77, 0x28, 0x35, 0xa5, 0x99, 0xc7, 0xb5, 0xa4, 0xd8, + 0xcf, 0xc8, 0xbc, 0x5d, 0x8e, 0xf0, 0x33, 0x50, 0x14, 0x0c, 0xdd, 0xb2, 0x1d, 0x7f, 0x6a, 0xc0, + 0x98, 0xce, 0xd0, 0xf3, 0x70, 0x44, 0x3a, 0xc3, 0xe9, 0x8b, 0xcb, 0xd3, 0x16, 0x97, 0xf5, 0xe2, + 0x53, 0x90, 0x13, 0x49, 0x07, 0x5f, 0xd2, 0xb3, 0x99, 0xad, 0x97, 0xf0, 0x67, 0x7c, 0x1c, 0x8e, + 0xf1, 0x3b, 0x48, 0xfd, 0x60, 0xc9, 0x1b, 0xbb, 0x4c, 0xd7, 0x4d, 0xe7, 0xa1, 0x16, 0x07, 0x2b, + 0x2b, 0xa9, 0x41, 0xae, 0xcb, 0x01, 0x82, 0x46, 0x85, 0xc8, 0x01, 0xfe, 0x99, 0x05, 0x68, 0x85, + 0x32, 0xb1, 0xcb, 0xea, 0x72, 0x78, 0x3d, 0x1a, 0x30, 0x33, 0xb4, 0x59, 0x77, 0x9b, 0xfa, 0x81, + 0xce, 0x5f, 0xf4, 0xf8, 0xf3, 0x48, 0x3c, 0xf1, 0x45, 0x38, 0x16, 0x3b, 0xa5, 0xe2, 0xa9, 0x01, + 0x33, 0x5d, 0x05, 0x53, 0x21, 0x2f, 0x1c, 0xe3, 0x5f, 0xa7, 0x61, 0x46, 0xa7, 0x75, 0xe8, 0x22, + 0x94, 0xb6, 0x1c, 0xb7, 0x4f, 0xfd, 0x91, 0xef, 0x28, 0x11, 0x64, 0x65, 0x9a, 0x67, 0x80, 0x89, + 0x39, 0x40, 0x4f, 0x41, 0x61, 0x1c, 0x50, 0xff, 0x4d, 0x47, 0xde, 0xf4, 0x62, 0xa7, 0xb6, 0x3b, + 0x69, 0xe5, 0x5f, 0x0d, 0xa8, 0xbf, 0xba, 0xcc, 0x83, 0xcf, 0x58, 0x3c, 0x11, 0xf9, 0xdf, 0x43, + 0x2f, 0x2b, 0x33, 0x15, 0x09, 0x5c, 0xe7, 0x2b, 0xfc, 0xf8, 0x09, 0x57, 0x37, 0xf2, 0xbd, 0x21, + 0x65, 0xdb, 0x74, 0x1c, 0xb4, 0xbb, 0xde, 0x70, 0xe8, 0xb9, 0x6d, 0xd1, 0x09, 0x10, 0x4c, 0xf3, + 0x08, 0xca, 0x97, 0x2b, 0xcb, 0xdd, 0x80, 0x02, 0xdb, 0xf6, 0xbd, 0x71, 0x7f, 0x5b, 0x04, 0x86, + 0x4c, 0xe7, 0xf2, 0xe1, 0xe9, 0x69, 0x0a, 0x44, 0x3f, 0xa0, 0xc7, 0xb9, 0xb4, 0x68, 0xf7, 0x4e, + 0x30, 0x1e, 0xca, 0xda, 0xb3, 0x93, 0xdb, 0x9b, 0xb4, 0xac, 0xa7, 0x48, 0x08, 0xc6, 0x8b, 0x50, + 0x89, 0xa5, 0xc2, 0xe8, 0x02, 0x64, 0x7d, 0xba, 0xa5, 0x5d, 0x01, 0xda, 0x9f, 0x31, 0xcb, 0xe8, + 0xcf, 0x71, 0x88, 0xf8, 0xc5, 0xdf, 0x4b, 0x43, 0xcb, 0xa8, 0xfa, 0xaf, 0x7a, 0xfe, 0x75, 0xca, + 0x7c, 0xa7, 0x7b, 0xc3, 0x1e, 0x52, 0x6d, 0x5e, 0x2d, 0x28, 0x0d, 0x05, 0xf0, 0x4d, 0xe3, 0x16, + 0xc1, 0x30, 0xc4, 0x43, 0x8f, 0x01, 0x88, 0x6b, 0x27, 0xe7, 0xe5, 0x85, 0x2a, 0x0a, 0x88, 0x98, + 0x5e, 0x8a, 0x09, 0xbb, 0x7d, 0x48, 0xe1, 0x28, 0x21, 0xaf, 0x26, 0x85, 0x7c, 0x68, 0x3a, 0xa1, + 0x64, 0xcd, 0xeb, 0x92, 0x8b, 0x5f, 0x17, 0xfc, 0x77, 0x0b, 0x9a, 0x6b, 0xfa, 0xe4, 0x0f, 0x28, + 0x0e, 0xcd, 0x6f, 0xfa, 0x21, 0xf1, 0x9b, 0x79, 0x88, 0xfc, 0x66, 0x13, 0xfc, 0x36, 0x01, 0xd6, + 0x1c, 0x97, 0x5e, 0x75, 0x06, 0x8c, 0xfa, 0x53, 0x8a, 0xa4, 0x1f, 0x64, 0x22, 0x8f, 0x43, 0xe8, + 0x96, 0x96, 0xc1, 0x92, 0xe1, 0xe6, 0x1f, 0x06, 0x8b, 0xe9, 0x87, 0xc8, 0x62, 0x26, 0xe1, 0x01, + 0x5d, 0x28, 0x6c, 0x09, 0xf6, 0x64, 0xc4, 0x8e, 0xf5, 0x9f, 0x22, 0xde, 0x3b, 0x5f, 0x53, 0x9b, + 0x3f, 0x7b, 0x9f, 0x84, 0x4b, 0x74, 0x05, 0xdb, 0xc1, 0x8e, 0xcb, 0xec, 0xb7, 0x8d, 0xf5, 0x44, + 0x6f, 0x82, 0x6c, 0x95, 0xd3, 0xe5, 0xa6, 0xe6, 0x74, 0x57, 0xd4, 0x36, 0xff, 0x4d, 0x5e, 0x87, + 0xaf, 0x44, 0x0e, 0x56, 0x28, 0x45, 0x39, 0xd8, 0x27, 0xee, 0x77, 0xfd, 0xd5, 0xa5, 0xff, 0xbd, + 0x05, 0xd5, 0x15, 0xca, 0xe2, 0x39, 0xd6, 0x23, 0xa4, 0x52, 0xfc, 0x12, 0x1c, 0x35, 0xce, 0xaf, + 0xb8, 0x7f, 0x3a, 0x91, 0x58, 0x1d, 0x8f, 0xf8, 0x5f, 0x75, 0x7b, 0xf4, 0x6d, 0x55, 0xaf, 0xc6, + 0x73, 0xaa, 0x5b, 0x50, 0x32, 0x26, 0xd1, 0x62, 0x22, 0x9b, 0x3a, 0x96, 0x68, 0xd3, 0xf2, 0x8c, + 0xa0, 0x53, 0x53, 0x3c, 0xc9, 0xaa, 0x54, 0xe5, 0xca, 0x61, 0xe6, 0xb1, 0x0e, 0x48, 0xa8, 0x4b, + 0x90, 0x35, 0x63, 0x9f, 0x80, 0xbe, 0x1c, 0xa6, 0x55, 0xe1, 0x18, 0x3d, 0x0e, 0x59, 0xdf, 0xbb, + 0xa7, 0xd3, 0xe4, 0x4a, 0xb4, 0x25, 0xf1, 0xee, 0x11, 0x31, 0x85, 0x9f, 0x87, 0x0c, 0xf1, 0xee, + 0xa1, 0x26, 0x80, 0x6f, 0xbb, 0x7d, 0x7a, 0x3b, 0x2c, 0xd0, 0xca, 0xc4, 0x80, 0x1c, 0x90, 0x97, + 0x2c, 0xc1, 0x51, 0xf3, 0x44, 0x52, 0xdd, 0xf3, 0x50, 0x78, 0x65, 0x6c, 0x8a, 0xab, 0x96, 0x10, + 0x97, 0xec, 0x03, 0x68, 0x24, 0x6e, 0x33, 0x10, 0xc1, 0xd1, 0x69, 0x28, 0x32, 0x7b, 0x73, 0x40, + 0x6f, 0x44, 0x2e, 0x30, 0x02, 0xf0, 0x59, 0x5e, 0x5b, 0xde, 0x36, 0x12, 0xac, 0x08, 0x80, 0xce, + 0x42, 0x35, 0x3a, 0xf3, 0x2d, 0x9f, 0x6e, 0x39, 0x6f, 0x0b, 0x0d, 0x97, 0xc9, 0x3e, 0x38, 0x3a, + 0x03, 0x47, 0x22, 0xd8, 0xba, 0x48, 0x64, 0xb2, 0x02, 0x35, 0x09, 0xe6, 0xb2, 0x11, 0xec, 0xbe, + 0x78, 0x77, 0x6c, 0x0f, 0xc4, 0xe5, 0x2b, 0x13, 0x03, 0x82, 0xff, 0x60, 0xc1, 0x51, 0xa9, 0x6a, + 0x66, 0xb3, 0x47, 0xd2, 0xea, 0x7f, 0x6e, 0x01, 0x32, 0x39, 0x50, 0xa6, 0xf5, 0xff, 0x66, 0x9f, + 0x89, 0x67, 0x4a, 0x25, 0x51, 0x32, 0x4b, 0x50, 0xd4, 0x2a, 0xc2, 0x90, 0xef, 0xca, 0x7e, 0x9a, + 0x68, 0x8c, 0xcb, 0x9a, 0x5c, 0x42, 0x88, 0xfa, 0x47, 0x2d, 0xc8, 0x6d, 0xee, 0x30, 0x1a, 0xa8, + 0x8a, 0x5a, 0xb4, 0x12, 0x04, 0x80, 0xc8, 0x3f, 0xbe, 0x17, 0x75, 0x99, 0xb0, 0x9a, 0x6c, 0xb4, + 0x97, 0x02, 0x11, 0xfd, 0x80, 0x7f, 0x99, 0x86, 0xca, 0x6d, 0x6f, 0x30, 0x8e, 0x82, 0xe6, 0xa3, + 0x14, 0x30, 0x62, 0x65, 0x7e, 0x4e, 0x97, 0xf9, 0x08, 0xb2, 0x01, 0xa3, 0x23, 0x61, 0x59, 0x19, + 0x22, 0x9e, 0x11, 0x86, 0x32, 0xb3, 0xfd, 0x3e, 0x65, 0xb2, 0x78, 0xaa, 0xe7, 0x45, 0x56, 0x1b, + 0x83, 0xa1, 0x39, 0x28, 0xd9, 0xfd, 0xbe, 0x4f, 0xfb, 0x36, 0xa3, 0x9d, 0x9d, 0x7a, 0x41, 0x6c, + 0x66, 0x82, 0xf0, 0xeb, 0x30, 0xab, 0x85, 0xa5, 0x54, 0x7a, 0x01, 0x0a, 0x6f, 0x09, 0xc8, 0x94, + 0xb6, 0x9b, 0x44, 0x55, 0x6e, 0x4c, 0xa3, 0xc5, 0x5f, 0x2f, 0xe8, 0x33, 0xe3, 0x6b, 0x90, 0x97, + 0xe8, 0xe8, 0xb4, 0x59, 0x02, 0xc9, 0x2c, 0x90, 0x8f, 0x55, 0x3d, 0x83, 0x21, 0x2f, 0x09, 0x29, + 0xc5, 0x0b, 0xdb, 0x90, 0x10, 0xa2, 0xfe, 0xf1, 0x3f, 0x2c, 0x38, 0xbe, 0x4c, 0x19, 0xed, 0x32, + 0xda, 0xbb, 0xea, 0xd0, 0x41, 0xef, 0x73, 0xad, 0xce, 0xc3, 0x1e, 0x5b, 0xc6, 0xe8, 0xb1, 0x71, + 0xbf, 0x33, 0x70, 0x5c, 0xba, 0x66, 0x34, 0x69, 0x22, 0x00, 0xf7, 0x10, 0x5b, 0xfc, 0xe0, 0x72, + 0x5a, 0xbe, 0xcf, 0x31, 0x20, 0xa1, 0x86, 0xf3, 0x91, 0x86, 0xf1, 0x77, 0x2c, 0x38, 0x91, 0xe4, + 0x5a, 0x29, 0xa9, 0x0d, 0x79, 0xb1, 0x78, 0x4a, 0x7b, 0x37, 0xb6, 0x82, 0x28, 0x34, 0x74, 0x29, + 0xb6, 0xbf, 0x78, 0x0f, 0xd4, 0xa9, 0xef, 0x4d, 0x5a, 0xb5, 0x08, 0x6a, 0x74, 0x10, 0x0c, 0x5c, + 0xfc, 0x5b, 0x5e, 0x67, 0x9b, 0x34, 0x85, 0xbe, 0xb9, 0x7d, 0x29, 0xdf, 0x2b, 0x07, 0xe8, 0x4b, + 0x90, 0x65, 0x3b, 0x23, 0xe5, 0x72, 0x3b, 0xc7, 0x3f, 0x9d, 0xb4, 0x8e, 0xc6, 0x96, 0x6d, 0xec, + 0x8c, 0x28, 0x11, 0x28, 0xdc, 0x2c, 0xbb, 0xb6, 0xdf, 0x73, 0x5c, 0x7b, 0xe0, 0x30, 0x29, 0xc6, + 0x2c, 0x31, 0x41, 0xa8, 0x0e, 0x85, 0x91, 0xed, 0x07, 0x3a, 0x6f, 0x2a, 0x12, 0x3d, 0x14, 0x2d, + 0x90, 0x3b, 0x94, 0x75, 0xb7, 0xa5, 0x9b, 0x55, 0x2d, 0x10, 0x01, 0x89, 0xb5, 0x40, 0x04, 0x04, + 0xff, 0xd4, 0x30, 0x1c, 0x79, 0x27, 0xbe, 0x70, 0x86, 0x83, 0xbf, 0x11, 0x69, 0x59, 0x1f, 0x51, + 0x69, 0xf9, 0x05, 0x98, 0xed, 0xc5, 0x66, 0x0e, 0xd6, 0xb6, 0x6c, 0xef, 0x26, 0xd0, 0xf1, 0x38, + 0x52, 0x9d, 0x80, 0x1c, 0xa0, 0xba, 0x84, 0x3e, 0xd2, 0xfb, 0xf5, 0x11, 0x49, 0x3d, 0xf3, 0x19, + 0xa4, 0xfe, 0x57, 0x0b, 0xaa, 0x51, 0xda, 0xa8, 0x04, 0x5e, 0x8b, 0xb5, 0x3d, 0xf5, 0xad, 0x79, + 0x94, 0x5f, 0x4d, 0xe2, 0xef, 0x5a, 0x2a, 0xbb, 0x91, 0x7c, 0x2a, 0xad, 0x2d, 0x40, 0xc1, 0xa7, + 0xc1, 0x78, 0xc0, 0xb4, 0xba, 0xea, 0x46, 0x5b, 0x6c, 0xbc, 0xa9, 0xdf, 0x71, 0x8c, 0x07, 0x8c, + 0x68, 0x44, 0x74, 0x05, 0x2a, 0x43, 0xea, 0xf7, 0xe9, 0x3a, 0xf3, 0x6d, 0x46, 0xfb, 0x52, 0x07, + 0xb3, 0xa6, 0xa2, 0xaf, 0x9b, 0xd3, 0x24, 0x8e, 0x8d, 0x7f, 0x65, 0xc1, 0x6c, 0x9c, 0xf4, 0x17, + 0xc8, 0x31, 0x4e, 0xed, 0x5c, 0x9f, 0x7d, 0x02, 0x8a, 0xa1, 0x4c, 0x51, 0x09, 0x0a, 0x57, 0x6f, + 0x92, 0xd7, 0x16, 0xc9, 0x72, 0x35, 0x85, 0xca, 0x30, 0xd3, 0x59, 0x5c, 0x7a, 0x59, 0x8c, 0xac, + 0xb3, 0x17, 0xa0, 0x12, 0x63, 0x1d, 0x55, 0xa0, 0xb8, 0x76, 0x73, 0x65, 0x7d, 0x83, 0xbc, 0xb8, + 0x78, 0xbd, 0x9a, 0x42, 0x05, 0xc8, 0xac, 0xbf, 0x7a, 0xbd, 0x6a, 0xf1, 0x87, 0xc5, 0xdb, 0x2b, + 0xd5, 0xf4, 0xc2, 0x3f, 0xf3, 0x3a, 0xbd, 0xf4, 0xd1, 0x57, 0x21, 0x27, 0x73, 0xc6, 0x13, 0x91, + 0x24, 0xcd, 0x77, 0xa7, 0x8d, 0x93, 0xfb, 0xe0, 0x52, 0x8b, 0x38, 0x75, 0xc1, 0x42, 0x37, 0xa0, + 0x24, 0x80, 0xea, 0xed, 0xc4, 0xe9, 0xe4, 0x4b, 0x82, 0x18, 0xa5, 0xc7, 0x0e, 0x98, 0x35, 0xe8, + 0x5d, 0x86, 0x9c, 0xbc, 0x86, 0x27, 0x12, 0xa9, 0xfd, 0x94, 0xd3, 0xc4, 0xde, 0xd7, 0xe0, 0x14, + 0x7a, 0x0e, 0xb2, 0x1b, 0xb6, 0x33, 0x40, 0x46, 0x65, 0x61, 0xbc, 0x54, 0x68, 0x9c, 0x48, 0x82, + 0x8d, 0x6d, 0xaf, 0x84, 0xef, 0x46, 0x4e, 0x26, 0x1b, 0xb4, 0x7a, 0x79, 0x7d, 0xff, 0x44, 0xb8, + 0xf3, 0x4d, 0xd9, 0xc1, 0xd7, 0x6d, 0x42, 0xf4, 0x58, 0x7c, 0xab, 0x44, 0x57, 0xb1, 0xd1, 0x3c, + 0x68, 0x3a, 0x24, 0xb8, 0x06, 0x25, 0xa3, 0x45, 0x67, 0x8a, 0x75, 0x7f, 0x7f, 0xd1, 0x14, 0xeb, + 0x94, 0xbe, 0x1e, 0x4e, 0xa1, 0x15, 0x98, 0xe1, 0xf5, 0x98, 0x78, 0x95, 0x77, 0x2a, 0x59, 0x76, + 0x19, 0xe9, 0x76, 0xe3, 0xf4, 0xf4, 0xc9, 0x90, 0xd0, 0xd7, 0xa1, 0xb8, 0x42, 0x99, 0xca, 0x59, + 0x4e, 0x26, 0x93, 0x9e, 0x29, 0x92, 0x8a, 0x27, 0x4e, 0x38, 0x85, 0x5e, 0x17, 0xa5, 0x61, 0x3c, + 0x64, 0xa3, 0xd6, 0x01, 0xa1, 0x39, 0x3c, 0xd7, 0xdc, 0xc1, 0x08, 0x21, 0xe5, 0xd7, 0x62, 0x94, + 0x55, 0x76, 0xd7, 0x3a, 0x20, 0x0c, 0x84, 0x94, 0x5b, 0xf7, 0xf9, 0xd0, 0x07, 0xa7, 0xd0, 0x2a, + 0x94, 0x57, 0x28, 0x0b, 0x9d, 0x18, 0x6a, 0x24, 0xee, 0x83, 0xe1, 0xc1, 0x1b, 0xa7, 0xa6, 0xce, + 0x69, 0x52, 0x0b, 0x6f, 0xe8, 0xcf, 0x66, 0x96, 0x6d, 0x66, 0xa3, 0x9b, 0x30, 0x2b, 0xd4, 0x12, + 0x7e, 0x57, 0x13, 0xbb, 0x3e, 0xfb, 0x3e, 0xe2, 0x89, 0x5d, 0x9f, 0xfd, 0x1f, 0xf3, 0xe0, 0x54, + 0xe7, 0x8d, 0xf7, 0x3f, 0x6a, 0xa6, 0x3e, 0xf8, 0xa8, 0x99, 0xfa, 0xe4, 0xa3, 0xa6, 0xf5, 0xed, + 0xdd, 0xa6, 0xf5, 0x8b, 0xdd, 0xa6, 0xf5, 0xde, 0x6e, 0xd3, 0x7a, 0x7f, 0xb7, 0x69, 0xfd, 0x65, + 0xb7, 0x69, 0xfd, 0x6d, 0xb7, 0x99, 0xfa, 0x64, 0xb7, 0x69, 0xbd, 0xf3, 0x71, 0x33, 0xf5, 0xfe, + 0xc7, 0xcd, 0xd4, 0x07, 0x1f, 0x37, 0x53, 0xdf, 0x7c, 0xf2, 0xfe, 0x1d, 0x15, 0xe9, 0xd7, 0xf2, + 0xe2, 0xef, 0xe9, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x64, 0xe8, 0x9b, 0xda, 0xdc, 0x25, 0x00, 0x00, } @@ -3299,6 +3529,13 @@ func (x Direction) String() string { } return strconv.Itoa(int(x)) } +func (x MergeStrategy) String() string { + s, ok := MergeStrategy_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} func (this *LabelToValuesResponse) Equal(that interface{}) bool { if that == nil { return this == nil @@ -5086,6 +5323,107 @@ func (this *DetectedLabel) Equal(that interface{}) bool { } return true } +func (this *QueryPlanRequest) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*QueryPlanRequest) + if !ok { + that2, ok := that.(QueryPlanRequest) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Query != that1.Query { + return false + } + if this.Limit != that1.Limit { + return false + } + if !this.Start.Equal(that1.Start) { + return false + } + if !this.End.Equal(that1.End) { + return false + } + if this.Direction != that1.Direction { + return false + } + return true +} +func (this *QueryPlanResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*QueryPlanResponse) + if !ok { + that2, ok := that.(QueryPlanResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if len(this.Results) != len(that1.Results) { + return false + } + for i := range this.Results { + if !this.Results[i].Equal(that1.Results[i]) { + return false + } + } + if this.MergeStrategy != that1.MergeStrategy { + return false + } + return true +} +func (this *SubQueryResult) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*SubQueryResult) + if !ok { + that2, ok := that.(SubQueryResult) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.Start.Equal(that1.Start) { + return false + } + if !this.End.Equal(that1.End) { + return false + } + if this.Query != that1.Query { + return false + } + if this.Limit != that1.Limit { + return false + } + return true +} func (this *LabelToValuesResponse) GoString() string { if this == nil { return "nil" @@ -5798,23 +6136,63 @@ func (this *DetectedLabel) GoString() string { s = append(s, "}") return strings.Join(s, "") } -func valueToGoStringLogproto(v interface{}, typ string) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { +func (this *QueryPlanRequest) GoString() string { + if this == nil { return "nil" } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) + s := make([]string, 0, 9) + s = append(s, "&logproto.QueryPlanRequest{") + s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") + s = append(s, "Limit: "+fmt.Sprintf("%#v", this.Limit)+",\n") + s = append(s, "Start: "+fmt.Sprintf("%#v", this.Start)+",\n") + s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") + s = append(s, "Direction: "+fmt.Sprintf("%#v", this.Direction)+",\n") + s = append(s, "}") + return strings.Join(s, "") } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - +func (this *QueryPlanResponse) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&logproto.QueryPlanResponse{") + if this.Results != nil { + s = append(s, "Results: "+fmt.Sprintf("%#v", this.Results)+",\n") + } + s = append(s, "MergeStrategy: "+fmt.Sprintf("%#v", this.MergeStrategy)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *SubQueryResult) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&logproto.SubQueryResult{") + s = append(s, "Start: "+fmt.Sprintf("%#v", this.Start)+",\n") + s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") + s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") + s = append(s, "Limit: "+fmt.Sprintf("%#v", this.Limit)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringLogproto(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + // QuerierClient is the client API for Querier service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. @@ -5834,6 +6212,7 @@ type QuerierClient interface { GetVolume(ctx context.Context, in *VolumeRequest, opts ...grpc.CallOption) (*VolumeResponse, error) GetDetectedFields(ctx context.Context, in *DetectedFieldsRequest, opts ...grpc.CallOption) (*DetectedFieldsResponse, error) GetDetectedLabels(ctx context.Context, in *DetectedLabelsRequest, opts ...grpc.CallOption) (*LabelToValuesResponse, error) + GetQueryPlan(ctx context.Context, in *QueryPlanRequest, opts ...grpc.CallOption) (*QueryPlanResponse, error) } type querierClient struct { @@ -6012,6 +6391,15 @@ func (c *querierClient) GetDetectedLabels(ctx context.Context, in *DetectedLabel return out, nil } +func (c *querierClient) GetQueryPlan(ctx context.Context, in *QueryPlanRequest, opts ...grpc.CallOption) (*QueryPlanResponse, error) { + out := new(QueryPlanResponse) + err := c.cc.Invoke(ctx, "/logproto.Querier/GetQueryPlan", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QuerierServer is the server API for Querier service. type QuerierServer interface { Query(*QueryRequest, Querier_QueryServer) error @@ -6029,6 +6417,7 @@ type QuerierServer interface { GetVolume(context.Context, *VolumeRequest) (*VolumeResponse, error) GetDetectedFields(context.Context, *DetectedFieldsRequest) (*DetectedFieldsResponse, error) GetDetectedLabels(context.Context, *DetectedLabelsRequest) (*LabelToValuesResponse, error) + GetQueryPlan(context.Context, *QueryPlanRequest) (*QueryPlanResponse, error) } // UnimplementedQuerierServer can be embedded to have forward compatible implementations. @@ -6068,6 +6457,9 @@ func (*UnimplementedQuerierServer) GetDetectedFields(ctx context.Context, req *D func (*UnimplementedQuerierServer) GetDetectedLabels(ctx context.Context, req *DetectedLabelsRequest) (*LabelToValuesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDetectedLabels not implemented") } +func (*UnimplementedQuerierServer) GetQueryPlan(ctx context.Context, req *QueryPlanRequest) (*QueryPlanResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetQueryPlan not implemented") +} func RegisterQuerierServer(s *grpc.Server, srv QuerierServer) { s.RegisterService(&_Querier_serviceDesc, srv) @@ -6280,6 +6672,24 @@ func _Querier_GetDetectedLabels_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _Querier_GetQueryPlan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPlanRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QuerierServer).GetQueryPlan(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/logproto.Querier/GetQueryPlan", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QuerierServer).GetQueryPlan(ctx, req.(*QueryPlanRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Querier_serviceDesc = grpc.ServiceDesc{ ServiceName: "logproto.Querier", HandlerType: (*QuerierServer)(nil), @@ -6316,6 +6726,10 @@ var _Querier_serviceDesc = grpc.ServiceDesc{ MethodName: "GetDetectedLabels", Handler: _Querier_GetDetectedLabels_Handler, }, + { + MethodName: "GetQueryPlan", + Handler: _Querier_GetQueryPlan_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -8876,6 +9290,155 @@ func (m *DetectedLabel) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *QueryPlanRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPlanRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPlanRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Direction != 0 { + i = encodeVarintLogproto(dAtA, i, uint64(m.Direction)) + i-- + dAtA[i] = 0x28 + } + n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):]) + if err28 != nil { + return 0, err28 + } + i -= n28 + i = encodeVarintLogproto(dAtA, i, uint64(n28)) + i-- + dAtA[i] = 0x22 + n29, err29 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err29 != nil { + return 0, err29 + } + i -= n29 + i = encodeVarintLogproto(dAtA, i, uint64(n29)) + i-- + dAtA[i] = 0x1a + if m.Limit != 0 { + i = encodeVarintLogproto(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x10 + } + if len(m.Query) > 0 { + i -= len(m.Query) + copy(dAtA[i:], m.Query) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Query))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryPlanResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPlanResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPlanResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MergeStrategy != 0 { + i = encodeVarintLogproto(dAtA, i, uint64(m.MergeStrategy)) + i-- + dAtA[i] = 0x10 + } + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintLogproto(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SubQueryResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SubQueryResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SubQueryResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Limit != 0 { + i = encodeVarintLogproto(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x20 + } + if len(m.Query) > 0 { + i -= len(m.Query) + copy(dAtA[i:], m.Query) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Query))) + i-- + dAtA[i] = 0x1a + } + n30, err30 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):]) + if err30 != nil { + return 0, err30 + } + i -= n30 + i = encodeVarintLogproto(dAtA, i, uint64(n30)) + i-- + dAtA[i] = 0x12 + n31, err31 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err31 != nil { + return 0, err31 + } + i -= n31 + i = encodeVarintLogproto(dAtA, i, uint64(n31)) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintLogproto(dAtA []byte, offset int, v uint64) int { offset -= sovLogproto(v) base := offset @@ -9971,6 +10534,67 @@ func (m *DetectedLabel) Size() (n int) { return n } +func (m *QueryPlanRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Query) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } + if m.Limit != 0 { + n += 1 + sovLogproto(uint64(m.Limit)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Start) + n += 1 + l + sovLogproto(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.End) + n += 1 + l + sovLogproto(uint64(l)) + if m.Direction != 0 { + n += 1 + sovLogproto(uint64(m.Direction)) + } + return n +} + +func (m *QueryPlanResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovLogproto(uint64(l)) + } + } + if m.MergeStrategy != 0 { + n += 1 + sovLogproto(uint64(m.MergeStrategy)) + } + return n +} + +func (m *SubQueryResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Start) + n += 1 + l + sovLogproto(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.End) + n += 1 + l + sovLogproto(uint64(l)) + l = len(m.Query) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } + if m.Limit != 0 { + n += 1 + sovLogproto(uint64(m.Limit)) + } + return n +} + func sovLogproto(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -10708,29 +11332,72 @@ func (this *DetectedLabel) String() string { }, "") return s } -func valueToStringLogproto(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { +func (this *QueryPlanRequest) String() string { + if this == nil { return "nil" } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) + s := strings.Join([]string{`&QueryPlanRequest{`, + `Query:` + fmt.Sprintf("%v", this.Query) + `,`, + `Limit:` + fmt.Sprintf("%v", this.Limit) + `,`, + `Start:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Start), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, + `End:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, + `Direction:` + fmt.Sprintf("%v", this.Direction) + `,`, + `}`, + }, "") + return s } -func (m *LabelToValuesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowLogproto - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ +func (this *QueryPlanResponse) String() string { + if this == nil { + return "nil" + } + repeatedStringForResults := "[]*SubQueryResult{" + for _, f := range this.Results { + repeatedStringForResults += strings.Replace(f.String(), "SubQueryResult", "SubQueryResult", 1) + "," + } + repeatedStringForResults += "}" + s := strings.Join([]string{`&QueryPlanResponse{`, + `Results:` + repeatedStringForResults + `,`, + `MergeStrategy:` + fmt.Sprintf("%v", this.MergeStrategy) + `,`, + `}`, + }, "") + return s +} +func (this *SubQueryResult) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SubQueryResult{`, + `Start:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Start), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, + `End:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, + `Query:` + fmt.Sprintf("%v", this.Query) + `,`, + `Limit:` + fmt.Sprintf("%v", this.Limit) + `,`, + `}`, + }, "") + return s +} +func valueToStringLogproto(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *LabelToValuesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ wire |= uint64(b&0x7F) << shift if b < 0x80 { break @@ -18033,6 +18700,471 @@ func (m *DetectedLabel) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryPlanRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPlanRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPlanRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Query = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Start, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field End", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.End, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Direction", wireType) + } + m.Direction = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Direction |= Direction(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipLogproto(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthLogproto + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthLogproto + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPlanResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPlanResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPlanResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Results = append(m.Results, &SubQueryResult{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MergeStrategy", wireType) + } + m.MergeStrategy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MergeStrategy |= MergeStrategy(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipLogproto(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthLogproto + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthLogproto + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SubQueryResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SubQueryResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubQueryResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Start, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field End", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.End, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Query = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipLogproto(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthLogproto + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthLogproto + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipLogproto(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index 949861ee8ae4c..541e401487d96 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -34,6 +34,8 @@ service Querier { rpc GetDetectedFields(DetectedFieldsRequest) returns (DetectedFieldsResponse) {} rpc GetDetectedLabels(DetectedLabelsRequest) returns (LabelToValuesResponse) {} + + rpc GetQueryPlan(QueryPlanRequest) returns (QueryPlanResponse) {} } message LabelToValuesResponse { @@ -497,3 +499,48 @@ message DetectedLabel { uint64 cardinality = 2; bytes sketch = 3 [(gogoproto.jsontag) = "sketch,omitempty"]; } + +message QueryPlanRequest { + string query = 1; + uint32 limit = 2; + google.protobuf.Timestamp start = 3 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; + google.protobuf.Timestamp end = 4 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; + Direction direction = 5; + +// repeated string shards = 5 [(gogoproto.jsontag) = "shards,omitempty"]; +// repeated Delete deletes = 6; +// Plan plan = 7 [(gogoproto.customtype) = "github.com/grafana/loki/v3/pkg/querier/plan.QueryPlan"]; +// // If populated, these represent the chunk references that the querier should +// // use to fetch the data, plus any other chunks reported by ingesters. +// ChunkRefGroup storeChunks = 10 [(gogoproto.jsontag) = "storeChunks"]; +} + +message QueryPlanResponse { + repeated SubQueryResult results = 1; + MergeStrategy mergeStrategy = 2; +} + +enum MergeStrategy { + LOGSTREAM = 0; + SUM = 1; + AVG = 2; +} + +message SubQueryResult { + google.protobuf.Timestamp start = 1 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; + google.protobuf.Timestamp end = 2 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = false + ]; + string query = 3; + uint32 limit = 4; +} \ No newline at end of file diff --git a/pkg/loki/modules.go b/pkg/loki/modules.go index 1ede7ee806b79..417ed3de59715 100644 --- a/pkg/loki/modules.go +++ b/pkg/loki/modules.go @@ -1223,6 +1223,7 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) { t.Server.HTTP.Path("/api/prom/label").Methods("GET", "POST").Handler(frontendHandler) t.Server.HTTP.Path("/api/prom/label/{name}/values").Methods("GET", "POST").Handler(frontendHandler) t.Server.HTTP.Path("/api/prom/series").Methods("GET", "POST").Handler(frontendHandler) + t.Server.HTTP.Path("/loki/api/v1/query/plan").Methods("GET", "POST").Handler(frontendHandler) // Only register tailing requests if this process does not act as a Querier // If this process is also a Querier the Querier will register the tail endpoints. diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index db6a83351968f..79c41cf21bf61 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -465,6 +465,12 @@ func (Codec) DecodeRequest(_ context.Context, r *http.Request, _ []string) (quer return nil, httpgrpc.Errorf(http.StatusBadRequest, err.Error()) } return req, nil + case QueryPlanOp: + req, err := loghttp.ParseQueryPlanRequest(r) + if err != nil { + return nil, httpgrpc.Errorf(http.StatusBadRequest, err.Error()) + } + return req, nil default: return nil, httpgrpc.Errorf(http.StatusNotFound, fmt.Sprintf("unknown request path: %s", r.URL.Path)) } @@ -656,6 +662,12 @@ func (Codec) DecodeHTTPGrpcRequest(ctx context.Context, r *httpgrpc.HTTPRequest) return nil, ctx, httpgrpc.Errorf(http.StatusBadRequest, err.Error()) } return req, ctx, nil + case QueryPlanOp: + req, err := loghttp.ParseQueryPlanRequest(httpReq) + if err != nil { + return nil, ctx, httpgrpc.Errorf(http.StatusBadRequest, err.Error()) + } + return req, ctx, nil default: return nil, ctx, httpgrpc.Errorf(http.StatusBadRequest, fmt.Sprintf("unknown request path in HTTP gRPC decode: %s", r.Url)) } @@ -1014,6 +1026,27 @@ func (c Codec) EncodeRequest(ctx context.Context, r queryrangebase.Request) (*ht Header: header, } + return req.WithContext(ctx), nil + case *logproto.QueryPlanRequest: + params := url.Values{ + "query": []string{request.GetQuery()}, + "start": []string{fmt.Sprintf("%d", request.Start.UnixNano())}, + "end": []string{fmt.Sprintf("%d", request.End.UnixNano())}, + } + + u := &url.URL{ + Path: "/loki/api/v1/query/plan", + RawQuery: params.Encode(), + } + + req := &http.Request{ + Method: "GET", + RequestURI: u.String(), + URL: u, + Body: http.NoBody, + Header: header, + } + return req.WithContext(ctx), nil default: return nil, httpgrpc.Errorf(http.StatusInternalServerError, fmt.Sprintf("invalid request format, got (%T)", r)) diff --git a/pkg/querier/queryrange/queryrange.pb.go b/pkg/querier/queryrange/queryrange.pb.go index 5db2c2ce0df6b..71e4ead8240ab 100644 --- a/pkg/querier/queryrange/queryrange.pb.go +++ b/pkg/querier/queryrange/queryrange.pb.go @@ -1093,6 +1093,7 @@ type QueryResponse struct { // *QueryResponse_PatternsResponse // *QueryResponse_DetectedLabels // *QueryResponse_SamplesResponse + // *QueryResponse_QueryPlanResponse Response isQueryResponse_Response `protobuf_oneof:"response"` } @@ -1174,20 +1175,24 @@ type QueryResponse_DetectedLabels struct { type QueryResponse_SamplesResponse struct { SamplesResponse *QuerySamplesResponse `protobuf:"bytes,14,opt,name=samplesResponse,proto3,oneof"` } - -func (*QueryResponse_Series) isQueryResponse_Response() {} -func (*QueryResponse_Labels) isQueryResponse_Response() {} -func (*QueryResponse_Stats) isQueryResponse_Response() {} -func (*QueryResponse_Prom) isQueryResponse_Response() {} -func (*QueryResponse_Streams) isQueryResponse_Response() {} -func (*QueryResponse_Volume) isQueryResponse_Response() {} -func (*QueryResponse_TopkSketches) isQueryResponse_Response() {} -func (*QueryResponse_QuantileSketches) isQueryResponse_Response() {} -func (*QueryResponse_ShardsResponse) isQueryResponse_Response() {} -func (*QueryResponse_DetectedFields) isQueryResponse_Response() {} -func (*QueryResponse_PatternsResponse) isQueryResponse_Response() {} -func (*QueryResponse_DetectedLabels) isQueryResponse_Response() {} -func (*QueryResponse_SamplesResponse) isQueryResponse_Response() {} +type QueryResponse_QueryPlanResponse struct { + QueryPlanResponse *QueryPlanResponse `protobuf:"bytes,15,opt,name=queryPlanResponse,proto3,oneof"` +} + +func (*QueryResponse_Series) isQueryResponse_Response() {} +func (*QueryResponse_Labels) isQueryResponse_Response() {} +func (*QueryResponse_Stats) isQueryResponse_Response() {} +func (*QueryResponse_Prom) isQueryResponse_Response() {} +func (*QueryResponse_Streams) isQueryResponse_Response() {} +func (*QueryResponse_Volume) isQueryResponse_Response() {} +func (*QueryResponse_TopkSketches) isQueryResponse_Response() {} +func (*QueryResponse_QuantileSketches) isQueryResponse_Response() {} +func (*QueryResponse_ShardsResponse) isQueryResponse_Response() {} +func (*QueryResponse_DetectedFields) isQueryResponse_Response() {} +func (*QueryResponse_PatternsResponse) isQueryResponse_Response() {} +func (*QueryResponse_DetectedLabels) isQueryResponse_Response() {} +func (*QueryResponse_SamplesResponse) isQueryResponse_Response() {} +func (*QueryResponse_QueryPlanResponse) isQueryResponse_Response() {} func (m *QueryResponse) GetResponse() isQueryResponse_Response { if m != nil { @@ -1294,6 +1299,13 @@ func (m *QueryResponse) GetSamplesResponse() *QuerySamplesResponse { return nil } +func (m *QueryResponse) GetQueryPlanResponse() *QueryPlanResponse { + if x, ok := m.GetResponse().(*QueryResponse_QueryPlanResponse); ok { + return x.QueryPlanResponse + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*QueryResponse) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -1310,6 +1322,7 @@ func (*QueryResponse) XXX_OneofWrappers() []interface{} { (*QueryResponse_PatternsResponse)(nil), (*QueryResponse_DetectedLabels)(nil), (*QueryResponse_SamplesResponse)(nil), + (*QueryResponse_QueryPlanResponse)(nil), } } @@ -1326,6 +1339,7 @@ type QueryRequest struct { // *QueryRequest_PatternsRequest // *QueryRequest_DetectedLabels // *QueryRequest_SamplesRequest + // *QueryRequest_QueryPlanRequest Request isQueryRequest_Request `protobuf_oneof:"request"` Metadata map[string]string `protobuf:"bytes,7,rep,name=metadata,proto3" json:"metadata" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } @@ -1402,18 +1416,22 @@ type QueryRequest_DetectedLabels struct { type QueryRequest_SamplesRequest struct { SamplesRequest *logproto.QuerySamplesRequest `protobuf:"bytes,12,opt,name=samplesRequest,proto3,oneof"` } +type QueryRequest_QueryPlanRequest struct { + QueryPlanRequest *logproto.QueryPlanRequest `protobuf:"bytes,13,opt,name=queryPlanRequest,proto3,oneof"` +} -func (*QueryRequest_Series) isQueryRequest_Request() {} -func (*QueryRequest_Labels) isQueryRequest_Request() {} -func (*QueryRequest_Stats) isQueryRequest_Request() {} -func (*QueryRequest_Instant) isQueryRequest_Request() {} -func (*QueryRequest_Streams) isQueryRequest_Request() {} -func (*QueryRequest_Volume) isQueryRequest_Request() {} -func (*QueryRequest_ShardsRequest) isQueryRequest_Request() {} -func (*QueryRequest_DetectedFields) isQueryRequest_Request() {} -func (*QueryRequest_PatternsRequest) isQueryRequest_Request() {} -func (*QueryRequest_DetectedLabels) isQueryRequest_Request() {} -func (*QueryRequest_SamplesRequest) isQueryRequest_Request() {} +func (*QueryRequest_Series) isQueryRequest_Request() {} +func (*QueryRequest_Labels) isQueryRequest_Request() {} +func (*QueryRequest_Stats) isQueryRequest_Request() {} +func (*QueryRequest_Instant) isQueryRequest_Request() {} +func (*QueryRequest_Streams) isQueryRequest_Request() {} +func (*QueryRequest_Volume) isQueryRequest_Request() {} +func (*QueryRequest_ShardsRequest) isQueryRequest_Request() {} +func (*QueryRequest_DetectedFields) isQueryRequest_Request() {} +func (*QueryRequest_PatternsRequest) isQueryRequest_Request() {} +func (*QueryRequest_DetectedLabels) isQueryRequest_Request() {} +func (*QueryRequest_SamplesRequest) isQueryRequest_Request() {} +func (*QueryRequest_QueryPlanRequest) isQueryRequest_Request() {} func (m *QueryRequest) GetRequest() isQueryRequest_Request { if m != nil { @@ -1499,6 +1517,13 @@ func (m *QueryRequest) GetSamplesRequest() *logproto.QuerySamplesRequest { return nil } +func (m *QueryRequest) GetQueryPlanRequest() *logproto.QueryPlanRequest { + if x, ok := m.GetRequest().(*QueryRequest_QueryPlanRequest); ok { + return x.QueryPlanRequest + } + return nil +} + func (m *QueryRequest) GetMetadata() map[string]string { if m != nil { return m.Metadata @@ -1520,8 +1545,46 @@ func (*QueryRequest) XXX_OneofWrappers() []interface{} { (*QueryRequest_PatternsRequest)(nil), (*QueryRequest_DetectedLabels)(nil), (*QueryRequest_SamplesRequest)(nil), + (*QueryRequest_QueryPlanRequest)(nil), + } +} + +type QueryPlanResponse struct { + Response *github_com_grafana_loki_v3_pkg_logproto.QueryPlanResponse `protobuf:"bytes,1,opt,name=response,proto3,customtype=github.com/grafana/loki/v3/pkg/logproto.QueryPlanResponse" json:"response,omitempty"` + Headers []github_com_grafana_loki_v3_pkg_querier_queryrange_queryrangebase_definitions.PrometheusResponseHeader `protobuf:"bytes,2,rep,name=Headers,proto3,customtype=github.com/grafana/loki/v3/pkg/querier/queryrange/queryrangebase/definitions.PrometheusResponseHeader" json:"-"` +} + +func (m *QueryPlanResponse) Reset() { *m = QueryPlanResponse{} } +func (*QueryPlanResponse) ProtoMessage() {} +func (*QueryPlanResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_51b9d53b40d11902, []int{20} +} +func (m *QueryPlanResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPlanResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPlanResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } } +func (m *QueryPlanResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPlanResponse.Merge(m, src) +} +func (m *QueryPlanResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPlanResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPlanResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPlanResponse proto.InternalMessageInfo func init() { proto.RegisterType((*LokiRequest)(nil), "queryrange.LokiRequest") @@ -1545,6 +1608,7 @@ func init() { proto.RegisterType((*QueryResponse)(nil), "queryrange.QueryResponse") proto.RegisterType((*QueryRequest)(nil), "queryrange.QueryRequest") proto.RegisterMapType((map[string]string)(nil), "queryrange.QueryRequest.MetadataEntry") + proto.RegisterType((*QueryPlanResponse)(nil), "queryrange.QueryPlanResponse") } func init() { @@ -1552,133 +1616,137 @@ func init() { } var fileDescriptor_51b9d53b40d11902 = []byte{ - // 2004 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcf, 0x6f, 0x1c, 0x49, - 0xf5, 0x9f, 0x9e, 0x9f, 0x9e, 0x67, 0x7b, 0xe2, 0x6f, 0xc5, 0x5f, 0x6f, 0xe3, 0xcd, 0x4e, 0x9b, - 0x91, 0xd8, 0x35, 0x08, 0x66, 0x36, 0xf6, 0x6e, 0xd8, 0x35, 0x21, 0xda, 0x74, 0x9c, 0xac, 0x13, - 0xb2, 0x6c, 0xb6, 0x6d, 0x71, 0xe0, 0x82, 0xca, 0x33, 0xe5, 0x99, 0xc6, 0x33, 0xdd, 0x9d, 0xee, - 0x1a, 0x27, 0x96, 0x10, 0xda, 0x7f, 0x00, 0xb1, 0x7f, 0x05, 0xe2, 0x86, 0x84, 0x38, 0x71, 0xe2, - 0x84, 0x76, 0x0f, 0x48, 0x39, 0xa1, 0x95, 0x25, 0x06, 0xe2, 0x48, 0x08, 0xf9, 0xb4, 0x12, 0x57, - 0x0e, 0xa8, 0x7e, 0x74, 0x4f, 0xd5, 0x74, 0x1b, 0xcf, 0x04, 0x84, 0x64, 0xe0, 0x32, 0xd3, 0x55, - 0xf5, 0x3e, 0xd5, 0x55, 0x9f, 0xf7, 0x79, 0xf5, 0xaa, 0xaa, 0xe1, 0x8d, 0xe0, 0xb0, 0xdb, 0x7a, - 0x3c, 0x24, 0xa1, 0x4b, 0x42, 0xfe, 0x7f, 0x1c, 0x62, 0xaf, 0x4b, 0x94, 0xc7, 0x66, 0x10, 0xfa, - 0xd4, 0x47, 0x30, 0xae, 0x59, 0xdd, 0xe8, 0xba, 0xb4, 0x37, 0xdc, 0x6f, 0xb6, 0xfd, 0x41, 0xab, - 0xeb, 0x77, 0xfd, 0x56, 0xd7, 0xf7, 0xbb, 0x7d, 0x82, 0x03, 0x37, 0x92, 0x8f, 0xad, 0x30, 0x68, - 0xb7, 0x22, 0x8a, 0xe9, 0x30, 0x12, 0xf8, 0xd5, 0x65, 0x66, 0xc8, 0x1f, 0x39, 0x44, 0xd6, 0x5a, - 0xd2, 0x9c, 0x97, 0xf6, 0x87, 0x07, 0x2d, 0xea, 0x0e, 0x48, 0x44, 0xf1, 0x20, 0x88, 0x0d, 0xd8, - 0xf8, 0xfa, 0x7e, 0x57, 0x20, 0x5d, 0xaf, 0x43, 0x9e, 0x76, 0x31, 0x25, 0x4f, 0xf0, 0xb1, 0x34, - 0x78, 0x55, 0x33, 0x88, 0x1f, 0x64, 0xe3, 0xaa, 0xd6, 0x18, 0x60, 0x4a, 0x49, 0xe8, 0xc9, 0xb6, - 0x2f, 0x69, 0x6d, 0xd1, 0x21, 0xa1, 0xed, 0x9e, 0x6c, 0x5a, 0x93, 0x4d, 0x8f, 0xfb, 0x03, 0xbf, - 0x43, 0xfa, 0x7c, 0x22, 0x91, 0xf8, 0x95, 0x16, 0x57, 0x99, 0x45, 0x30, 0x8c, 0x7a, 0xfc, 0x47, - 0x56, 0xde, 0xb9, 0x90, 0xcb, 0x7d, 0x1c, 0x91, 0x56, 0x87, 0x1c, 0xb8, 0x9e, 0x4b, 0x5d, 0xdf, - 0x8b, 0xd4, 0x67, 0xd9, 0xc9, 0x8d, 0xe9, 0x3a, 0x99, 0xf4, 0xcf, 0xea, 0x9b, 0x0c, 0x17, 0x51, - 0x3f, 0xc4, 0x5d, 0xd2, 0x6a, 0xf7, 0x86, 0xde, 0x61, 0xab, 0x8d, 0xdb, 0x3d, 0xd2, 0x0a, 0x49, - 0x34, 0xec, 0xd3, 0x48, 0x14, 0xe8, 0x71, 0x40, 0xe4, 0x9b, 0x1a, 0x9f, 0x15, 0x61, 0xfe, 0xa1, - 0x7f, 0xe8, 0x3a, 0xe4, 0xf1, 0x90, 0x44, 0x14, 0x2d, 0x43, 0x89, 0xf7, 0x6a, 0x1a, 0x6b, 0xc6, - 0x7a, 0xd5, 0x11, 0x05, 0x56, 0xdb, 0x77, 0x07, 0x2e, 0x35, 0xf3, 0x6b, 0xc6, 0xfa, 0xa2, 0x23, - 0x0a, 0x08, 0x41, 0x31, 0xa2, 0x24, 0x30, 0x0b, 0x6b, 0xc6, 0x7a, 0xc1, 0xe1, 0xcf, 0x68, 0x15, - 0xe6, 0x5c, 0x8f, 0x92, 0xf0, 0x08, 0xf7, 0xcd, 0x2a, 0xaf, 0x4f, 0xca, 0xe8, 0x16, 0x54, 0x22, - 0x8a, 0x43, 0xba, 0x17, 0x99, 0xc5, 0x35, 0x63, 0x7d, 0x7e, 0x63, 0xb5, 0x29, 0x3c, 0xdf, 0x8c, - 0x3d, 0xdf, 0xdc, 0x8b, 0x3d, 0x6f, 0xcf, 0x7d, 0x3a, 0xb2, 0x72, 0x9f, 0xfc, 0xd1, 0x32, 0x9c, - 0x18, 0x84, 0xb6, 0xa0, 0x44, 0xbc, 0xce, 0x5e, 0x64, 0x96, 0x66, 0x40, 0x0b, 0x08, 0xba, 0x0e, - 0xd5, 0x8e, 0x1b, 0x92, 0x36, 0x63, 0xd9, 0x2c, 0xaf, 0x19, 0xeb, 0xb5, 0x8d, 0xab, 0xcd, 0x44, - 0x28, 0xdb, 0x71, 0x93, 0x33, 0xb6, 0x62, 0xd3, 0x0b, 0x30, 0xed, 0x99, 0x15, 0xce, 0x04, 0x7f, - 0x46, 0x0d, 0x28, 0x47, 0x3d, 0x1c, 0x76, 0x22, 0x73, 0x6e, 0xad, 0xb0, 0x5e, 0xb5, 0xe1, 0x6c, - 0x64, 0xc9, 0x1a, 0x47, 0xfe, 0xa3, 0x1f, 0x40, 0x31, 0xe8, 0x63, 0xcf, 0x04, 0x3e, 0xca, 0xa5, - 0xa6, 0xe2, 0xa5, 0x47, 0x7d, 0xec, 0xd9, 0xef, 0x9e, 0x8c, 0xac, 0xb7, 0xd5, 0xe0, 0x09, 0xf1, - 0x01, 0xf6, 0x70, 0xab, 0xef, 0x1f, 0xba, 0xad, 0xa3, 0xcd, 0x96, 0xea, 0x7b, 0xd6, 0x51, 0xf3, - 0x23, 0xd6, 0x01, 0x83, 0x3a, 0xbc, 0x63, 0xf4, 0x00, 0xe6, 0x99, 0x8f, 0xc9, 0x1d, 0xe6, 0xe0, - 0xc8, 0x9c, 0xe7, 0xef, 0x79, 0x65, 0x3c, 0x1b, 0x5e, 0xef, 0x90, 0x83, 0xf7, 0x43, 0x7f, 0x18, - 0xd8, 0x57, 0xce, 0x46, 0x96, 0x6a, 0xef, 0xa8, 0x05, 0xf4, 0x00, 0x6a, 0x4c, 0x14, 0xae, 0xd7, - 0xfd, 0x30, 0xe0, 0x0a, 0x34, 0x17, 0x78, 0x77, 0xd7, 0x9a, 0xaa, 0x64, 0x9a, 0x77, 0x34, 0x1b, - 0xbb, 0xc8, 0xe8, 0x75, 0x26, 0x90, 0x8d, 0xd3, 0x02, 0x20, 0xa6, 0xa5, 0xfb, 0x5e, 0x44, 0xb1, - 0x47, 0x5f, 0x46, 0x52, 0x37, 0xa1, 0xcc, 0x82, 0x7f, 0x2f, 0xe2, 0xa2, 0x9a, 0xd6, 0xc7, 0x12, - 0xa3, 0x3b, 0xb9, 0x38, 0x93, 0x93, 0x4b, 0x99, 0x4e, 0x2e, 0x5f, 0xe8, 0xe4, 0xca, 0xbf, 0xc9, - 0xc9, 0x73, 0xff, 0x5a, 0x27, 0x57, 0x5f, 0xda, 0xc9, 0x26, 0x14, 0xd9, 0x28, 0xd1, 0x12, 0x14, - 0x42, 0xfc, 0x84, 0xfb, 0x74, 0xc1, 0x61, 0x8f, 0x8d, 0xd3, 0x22, 0x2c, 0x88, 0xa5, 0x24, 0x0a, - 0x7c, 0x2f, 0x22, 0x8c, 0xc7, 0x5d, 0xbe, 0xfa, 0x0b, 0xcf, 0x4b, 0x1e, 0x79, 0x8d, 0x23, 0x5b, - 0xd0, 0x7b, 0x50, 0xdc, 0xc6, 0x14, 0x73, 0x15, 0xcc, 0x6f, 0x2c, 0xab, 0x3c, 0xb2, 0xbe, 0x58, - 0x9b, 0xbd, 0xc2, 0x06, 0x72, 0x36, 0xb2, 0x6a, 0x1d, 0x4c, 0xf1, 0xd7, 0xfd, 0x81, 0x4b, 0xc9, - 0x20, 0xa0, 0xc7, 0x0e, 0x47, 0xa2, 0xb7, 0xa1, 0x7a, 0x37, 0x0c, 0xfd, 0x70, 0xef, 0x38, 0x20, - 0x5c, 0x35, 0x55, 0xfb, 0x95, 0xb3, 0x91, 0x75, 0x95, 0xc4, 0x95, 0x0a, 0x62, 0x6c, 0x89, 0xbe, - 0x0a, 0x25, 0x5e, 0xe0, 0x3a, 0xa9, 0xda, 0x57, 0xcf, 0x46, 0xd6, 0x15, 0x0e, 0x51, 0xcc, 0x85, - 0x85, 0x2e, 0xab, 0xd2, 0x54, 0xb2, 0x4a, 0xd4, 0x5d, 0x56, 0xd5, 0x6d, 0x42, 0xe5, 0x88, 0x84, - 0x11, 0xeb, 0xa6, 0xc2, 0xeb, 0xe3, 0x22, 0xba, 0x0d, 0xc0, 0x88, 0x71, 0x23, 0xea, 0xb6, 0x63, - 0x67, 0x2f, 0x36, 0x45, 0xb2, 0x71, 0xb8, 0x8f, 0x6c, 0x24, 0x59, 0x50, 0x0c, 0x1d, 0xe5, 0x19, - 0xfd, 0xc2, 0x80, 0xca, 0x0e, 0xc1, 0x1d, 0x12, 0x32, 0xf7, 0x16, 0xd6, 0xe7, 0x37, 0xbe, 0xd2, - 0x54, 0x33, 0xcb, 0xa3, 0xd0, 0x1f, 0x10, 0xda, 0x23, 0xc3, 0x28, 0x76, 0x90, 0xb0, 0xb6, 0xbd, - 0x93, 0x91, 0x45, 0xa6, 0x94, 0xea, 0x54, 0x09, 0xed, 0xdc, 0x57, 0x9d, 0x8d, 0x2c, 0xe3, 0x1b, - 0x4e, 0x3c, 0x4a, 0xb4, 0x01, 0x73, 0x4f, 0x70, 0xe8, 0xb9, 0x5e, 0x37, 0x32, 0x81, 0x47, 0xda, - 0xca, 0xd9, 0xc8, 0x42, 0x71, 0x9d, 0xe2, 0x88, 0xc4, 0xae, 0xf1, 0x07, 0x03, 0xfe, 0x8f, 0x09, - 0x63, 0x97, 0x8d, 0x27, 0x52, 0x96, 0x98, 0x01, 0xa6, 0xed, 0x9e, 0x69, 0xb0, 0x6e, 0x1c, 0x51, - 0x50, 0xf3, 0x4d, 0xfe, 0x9f, 0xca, 0x37, 0x85, 0xd9, 0xf3, 0x4d, 0xbc, 0xae, 0x14, 0x33, 0xd7, - 0x95, 0xd2, 0x79, 0xeb, 0x4a, 0xe3, 0xa7, 0x72, 0x0d, 0x8d, 0xe7, 0x37, 0x43, 0x28, 0xdd, 0x4b, - 0x42, 0xa9, 0xc0, 0x47, 0x9b, 0x28, 0x54, 0xf4, 0x75, 0xbf, 0x43, 0x3c, 0xea, 0x1e, 0xb8, 0x24, - 0xbc, 0x20, 0xa0, 0x14, 0x95, 0x16, 0x74, 0x95, 0xaa, 0x12, 0x2b, 0x5e, 0x0a, 0x89, 0xe9, 0x71, - 0x55, 0x7a, 0x89, 0xb8, 0x6a, 0xfc, 0x35, 0x0f, 0x2b, 0xcc, 0x23, 0x0f, 0xf1, 0x3e, 0xe9, 0x7f, - 0x17, 0x0f, 0x66, 0xf4, 0xca, 0xeb, 0x8a, 0x57, 0xaa, 0x36, 0xfa, 0x1f, 0xeb, 0xd3, 0xb1, 0xfe, - 0x33, 0x03, 0xe6, 0xe2, 0x04, 0x80, 0x9a, 0x00, 0x02, 0xc6, 0xd7, 0x78, 0xc1, 0x75, 0x8d, 0x81, - 0xc3, 0xa4, 0xd6, 0x51, 0x2c, 0xd0, 0x0f, 0xa1, 0x2c, 0x4a, 0x32, 0x16, 0x94, 0xb4, 0xb9, 0x4b, - 0x43, 0x82, 0x07, 0xb7, 0x3b, 0x38, 0xa0, 0x24, 0xb4, 0xdf, 0x65, 0xa3, 0x38, 0x19, 0x59, 0x6f, - 0x9c, 0xc7, 0x52, 0xbc, 0xc3, 0x97, 0x38, 0xe6, 0x5f, 0xf1, 0x4e, 0x47, 0xbe, 0xa1, 0xf1, 0x13, - 0x03, 0x96, 0xd8, 0x40, 0x19, 0x35, 0x89, 0x30, 0xb6, 0x61, 0x2e, 0x94, 0xcf, 0x7c, 0xb8, 0xf3, - 0x1b, 0x8d, 0xa6, 0x4e, 0x6b, 0x06, 0x95, 0x3c, 0xe1, 0x1a, 0x4e, 0x82, 0x44, 0x9b, 0x1a, 0x8d, - 0xf9, 0x2c, 0x1a, 0x45, 0x8e, 0x56, 0x89, 0xfb, 0x4d, 0x1e, 0xd0, 0x7d, 0x76, 0x42, 0x62, 0xfa, - 0x1b, 0x4b, 0xf5, 0x69, 0x6a, 0x44, 0xd7, 0xc6, 0xa4, 0xa4, 0xed, 0xed, 0x5b, 0x27, 0x23, 0x6b, - 0xeb, 0x02, 0xed, 0xfc, 0x03, 0xbc, 0x32, 0x0b, 0x55, 0xbe, 0xf9, 0xcb, 0x20, 0xdf, 0xc6, 0xaf, - 0xf2, 0x50, 0xfb, 0x9e, 0xdf, 0x1f, 0x0e, 0x48, 0x42, 0x5f, 0x90, 0xa2, 0xcf, 0x1c, 0xd3, 0xa7, - 0xdb, 0xda, 0x5b, 0x27, 0x23, 0xeb, 0xc6, 0xb4, 0xd4, 0xe9, 0xd8, 0x4b, 0x4d, 0xdb, 0x9f, 0xf3, - 0xb0, 0xbc, 0xe7, 0x07, 0xdf, 0xd9, 0xe5, 0xa7, 0x68, 0x65, 0x99, 0xec, 0xa5, 0xc8, 0x5b, 0x1e, - 0x93, 0xc7, 0x10, 0x1f, 0x60, 0x1a, 0xba, 0x4f, 0xed, 0x1b, 0x27, 0x23, 0x6b, 0x63, 0x5a, 0xe2, - 0xc6, 0xb8, 0xcb, 0x4c, 0x9a, 0xb6, 0x07, 0x2a, 0x4c, 0xb9, 0x07, 0xfa, 0x5b, 0x1e, 0x56, 0x3e, - 0x1a, 0x62, 0x8f, 0xba, 0x7d, 0x22, 0xc8, 0x4e, 0xa8, 0xfe, 0x51, 0x8a, 0xea, 0xfa, 0x98, 0x6a, - 0x1d, 0x23, 0x49, 0x7f, 0xef, 0x64, 0x64, 0xdd, 0x9c, 0x96, 0xf4, 0xac, 0x1e, 0xfe, 0xeb, 0xe8, - 0xff, 0x75, 0x1e, 0x6a, 0xbb, 0x62, 0xd7, 0x16, 0x4f, 0xfc, 0x28, 0x83, 0x76, 0xf5, 0x9a, 0x2a, - 0xd8, 0x6f, 0xea, 0x88, 0xd9, 0x16, 0x09, 0x1d, 0x7b, 0xa9, 0x17, 0x89, 0xdf, 0xe5, 0x61, 0x65, - 0x9b, 0x50, 0xd2, 0xa6, 0xa4, 0x73, 0xcf, 0x25, 0x7d, 0x85, 0xc4, 0x8f, 0x8d, 0x14, 0x8b, 0x6b, - 0xca, 0x31, 0x2b, 0x13, 0x64, 0xdb, 0x27, 0x23, 0xeb, 0xd6, 0xb4, 0x3c, 0x66, 0xf7, 0x71, 0xa9, - 0xf9, 0xfc, 0x2c, 0x0f, 0xff, 0x2f, 0xae, 0x0e, 0xc4, 0xbd, 0xe6, 0x98, 0xce, 0x1f, 0xa7, 0xd8, - 0xb4, 0xd4, 0xa5, 0x20, 0x03, 0x62, 0xdf, 0x3e, 0x19, 0x59, 0xdf, 0x9e, 0x7e, 0x2d, 0xc8, 0xe8, - 0xe2, 0x3f, 0x46, 0x9b, 0x7c, 0xb7, 0x3f, 0xab, 0x36, 0x75, 0xd0, 0xcb, 0x69, 0x53, 0xef, 0xe3, - 0x52, 0xf3, 0xf9, 0xdb, 0x3c, 0x2c, 0x73, 0x95, 0xec, 0xe2, 0x41, 0xd0, 0x57, 0x36, 0x04, 0x17, - 0x64, 0xa9, 0x34, 0x62, 0xd6, 0x2c, 0x95, 0xee, 0xe1, 0x52, 0x13, 0xf9, 0xcb, 0x0a, 0x2c, 0xf2, - 0x49, 0x25, 0x0c, 0x7e, 0x0d, 0xe4, 0x39, 0x53, 0xf2, 0x87, 0xe2, 0xbb, 0x89, 0x30, 0x68, 0x37, - 0x77, 0xe5, 0x09, 0x54, 0x58, 0xa0, 0x77, 0xa0, 0x1c, 0xf1, 0x1b, 0x00, 0x79, 0x84, 0xa8, 0x4f, - 0x5e, 0xb2, 0xe9, 0x77, 0x0d, 0x3b, 0x39, 0x47, 0xda, 0xa3, 0x9b, 0x50, 0xee, 0x73, 0x39, 0xca, - 0x1b, 0x90, 0xc6, 0x24, 0x32, 0x7d, 0x26, 0x66, 0x68, 0x81, 0x41, 0x37, 0xa0, 0xc4, 0xcf, 0x2a, - 0xf2, 0xb2, 0x5f, 0x7b, 0x6d, 0xfa, 0xc4, 0xb0, 0x93, 0x73, 0x84, 0x39, 0xda, 0x80, 0x62, 0x10, - 0xfa, 0x03, 0x79, 0x6e, 0xbc, 0x36, 0xf9, 0x4e, 0xf5, 0xa0, 0xb5, 0x93, 0x73, 0xb8, 0x2d, 0x7a, - 0x0b, 0x2a, 0x11, 0x3f, 0xa1, 0x45, 0xfc, 0xc6, 0x8d, 0x6d, 0xcf, 0x27, 0x60, 0x0a, 0x24, 0x36, - 0x45, 0x6f, 0x41, 0xf9, 0x88, 0xef, 0xbf, 0xe5, 0x35, 0xee, 0xaa, 0x0a, 0xd2, 0x77, 0xe6, 0x6c, - 0x5e, 0xc2, 0x16, 0xdd, 0x83, 0x05, 0xea, 0x07, 0x87, 0xf1, 0x36, 0x57, 0xde, 0xd6, 0xad, 0xa9, - 0xd8, 0xac, 0x6d, 0xf0, 0x4e, 0xce, 0xd1, 0x70, 0xe8, 0x11, 0x2c, 0x3d, 0xd6, 0xf6, 0x53, 0x24, - 0xbe, 0x97, 0xd5, 0x78, 0xce, 0xde, 0xe9, 0xed, 0xe4, 0x9c, 0x14, 0x1a, 0x6d, 0x43, 0x2d, 0xd2, - 0xb6, 0x0a, 0xf2, 0x1b, 0x84, 0x36, 0x2f, 0x7d, 0x33, 0xb1, 0x93, 0x73, 0x26, 0x30, 0xe8, 0x21, - 0xd4, 0x3a, 0x5a, 0xa2, 0x94, 0x5f, 0x18, 0xb4, 0x51, 0x65, 0xa7, 0x52, 0xd6, 0x9b, 0x8e, 0x45, - 0x1f, 0xc2, 0x52, 0x30, 0x91, 0x24, 0xe4, 0x27, 0x86, 0x2f, 0xeb, 0xb3, 0xcc, 0xc8, 0x26, 0x6c, - 0x92, 0x93, 0x60, 0x75, 0x78, 0x62, 0xad, 0x34, 0x17, 0xcf, 0x1f, 0x9e, 0xbe, 0x9a, 0xaa, 0xc3, - 0x13, 0x2d, 0xe8, 0x21, 0x5c, 0x89, 0xf4, 0x95, 0xc2, 0xac, 0xa5, 0xfd, 0x99, 0xb5, 0xa2, 0xec, - 0xe4, 0x9c, 0x49, 0xa8, 0x0d, 0xe3, 0x85, 0xad, 0xf1, 0xfb, 0x32, 0x2c, 0xc8, 0xa0, 0x15, 0x97, - 0x94, 0xdf, 0x4c, 0xe2, 0x50, 0xc4, 0xec, 0x6b, 0xe7, 0xc5, 0x21, 0x37, 0x57, 0xc2, 0xf0, 0xcd, - 0x24, 0x0c, 0x45, 0x00, 0xaf, 0x8c, 0x17, 0x4b, 0x3e, 0x0b, 0x05, 0x21, 0x43, 0x6f, 0x33, 0x0e, - 0x3d, 0x11, 0xb7, 0xaf, 0x66, 0x1f, 0xf5, 0x63, 0x94, 0x8c, 0xbb, 0x2d, 0xa8, 0xb8, 0xe2, 0xcb, - 0x4d, 0x56, 0xc4, 0xa6, 0x3f, 0xec, 0xb0, 0x48, 0x92, 0x00, 0xb4, 0x39, 0x8e, 0xbf, 0x92, 0xfc, - 0x52, 0x91, 0x8a, 0xbf, 0x04, 0x14, 0x87, 0xdf, 0xf5, 0x24, 0xfc, 0xca, 0x93, 0x5f, 0x37, 0xe2, - 0xe0, 0x4b, 0x26, 0x26, 0x63, 0xef, 0x2e, 0x2c, 0xc6, 0x6a, 0xe5, 0x4d, 0x32, 0xf8, 0x5e, 0x3b, - 0x6f, 0xb7, 0x1d, 0xe3, 0x75, 0x14, 0xba, 0x9f, 0x92, 0x78, 0x75, 0x72, 0x87, 0x34, 0x29, 0xf0, - 0xb8, 0xa7, 0x49, 0x7d, 0x3f, 0x80, 0x2b, 0x63, 0x89, 0x8a, 0x31, 0x41, 0x66, 0x4a, 0x7b, 0xa4, - 0x5b, 0x31, 0xf9, 0x4c, 0x00, 0xd5, 0x61, 0x49, 0x69, 0xcf, 0x9f, 0x37, 0xac, 0x58, 0xd8, 0xa9, - 0x61, 0x49, 0x5d, 0xbf, 0x0f, 0xb5, 0x44, 0x9c, 0x62, 0x54, 0x0b, 0x92, 0xa9, 0x73, 0xd2, 0x64, - 0xd2, 0x91, 0x0e, 0x43, 0x3b, 0x30, 0x37, 0x20, 0x14, 0x77, 0x30, 0xc5, 0x66, 0x85, 0x67, 0xcb, - 0xd7, 0x53, 0x91, 0x21, 0x6d, 0x9b, 0x1f, 0x48, 0xc3, 0xbb, 0x1e, 0x0d, 0x8f, 0xe5, 0xdd, 0x54, - 0x82, 0x5e, 0xfd, 0x16, 0x2c, 0x6a, 0x06, 0x68, 0x09, 0x0a, 0x87, 0x24, 0xfe, 0x2c, 0xc8, 0x1e, - 0xd1, 0x32, 0x94, 0x8e, 0x70, 0x7f, 0x48, 0xb8, 0xd0, 0xab, 0x8e, 0x28, 0x6c, 0xe5, 0xdf, 0x31, - 0xec, 0x2a, 0x54, 0x42, 0xf1, 0x16, 0xbb, 0xfb, 0xec, 0x79, 0x3d, 0xf7, 0xf9, 0xf3, 0x7a, 0xee, - 0x8b, 0xe7, 0x75, 0xe3, 0xe3, 0xd3, 0xba, 0xf1, 0xf3, 0xd3, 0xba, 0xf1, 0xe9, 0x69, 0xdd, 0x78, - 0x76, 0x5a, 0x37, 0xfe, 0x74, 0x5a, 0x37, 0xfe, 0x72, 0x5a, 0xcf, 0x7d, 0x71, 0x5a, 0x37, 0x3e, - 0x79, 0x51, 0xcf, 0x3d, 0x7b, 0x51, 0xcf, 0x7d, 0xfe, 0xa2, 0x9e, 0xfb, 0xfe, 0xf5, 0x99, 0x13, - 0xf7, 0x7e, 0x99, 0xf3, 0xb4, 0xf9, 0xf7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x42, 0x9e, 0x81, 0xb1, - 0x1f, 0x21, 0x00, 0x00, + // 2071 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcf, 0x6f, 0x1b, 0x59, + 0x1d, 0xf7, 0xf8, 0x67, 0xfc, 0x92, 0xb8, 0xe9, 0x6b, 0xc8, 0x0e, 0x69, 0xd7, 0x13, 0x2c, 0xb1, + 0x1b, 0x10, 0xd8, 0xdb, 0x64, 0xb7, 0x6c, 0x43, 0xb7, 0xda, 0x4e, 0xd3, 0xae, 0x5b, 0x5a, 0xb6, + 0x3b, 0x89, 0x38, 0x70, 0x41, 0x2f, 0xf6, 0x8b, 0x3d, 0xc4, 0x9e, 0x99, 0xcc, 0x3c, 0xa7, 0x8d, + 0x84, 0xd0, 0xf2, 0x07, 0x20, 0xf6, 0x4f, 0xe0, 0x84, 0xb8, 0x71, 0xe1, 0x84, 0x84, 0xc4, 0x09, + 0xed, 0x1e, 0x90, 0x7a, 0x5c, 0x59, 0x62, 0xa0, 0xae, 0x84, 0x50, 0x4e, 0x2b, 0x71, 0xe5, 0x80, + 0xde, 0x8f, 0x19, 0xbf, 0xe7, 0x99, 0x10, 0xbb, 0x20, 0x24, 0x03, 0x17, 0x7b, 0xde, 0x7b, 0xdf, + 0xcf, 0x77, 0xbe, 0xef, 0xf3, 0xfd, 0xf1, 0x7e, 0x0c, 0x78, 0xd3, 0x3b, 0xea, 0x34, 0x8e, 0x07, + 0xd8, 0xb7, 0xb1, 0xcf, 0xfe, 0x4f, 0x7d, 0xe4, 0x74, 0xb0, 0xf4, 0x58, 0xf7, 0x7c, 0x97, 0xb8, + 0x10, 0x8c, 0x7b, 0xd6, 0xb7, 0x3a, 0x36, 0xe9, 0x0e, 0x0e, 0xea, 0x2d, 0xb7, 0xdf, 0xe8, 0xb8, + 0x1d, 0xb7, 0xd1, 0x71, 0xdd, 0x4e, 0x0f, 0x23, 0xcf, 0x0e, 0xc4, 0x63, 0xc3, 0xf7, 0x5a, 0x8d, + 0x80, 0x20, 0x32, 0x08, 0x38, 0x7e, 0x7d, 0x95, 0x0a, 0xb2, 0x47, 0x06, 0x11, 0xbd, 0x86, 0x10, + 0x67, 0xad, 0x83, 0xc1, 0x61, 0x83, 0xd8, 0x7d, 0x1c, 0x10, 0xd4, 0xf7, 0x22, 0x01, 0x6a, 0x5f, + 0xcf, 0xed, 0x70, 0xa4, 0xed, 0xb4, 0xf1, 0xb3, 0x0e, 0x22, 0xf8, 0x29, 0x3a, 0x15, 0x02, 0x57, + 0x15, 0x81, 0xe8, 0x41, 0x0c, 0xae, 0x2b, 0x83, 0x1e, 0x22, 0x04, 0xfb, 0x8e, 0x18, 0xfb, 0xb2, + 0x32, 0x16, 0x1c, 0x61, 0xd2, 0xea, 0x8a, 0xa1, 0x0d, 0x31, 0x74, 0xdc, 0xeb, 0xbb, 0x6d, 0xdc, + 0x63, 0x13, 0x09, 0xf8, 0xaf, 0x90, 0xb8, 0x42, 0x25, 0xbc, 0x41, 0xd0, 0x65, 0x3f, 0xa2, 0xf3, + 0xee, 0x85, 0x5c, 0x1e, 0xa0, 0x00, 0x37, 0xda, 0xf8, 0xd0, 0x76, 0x6c, 0x62, 0xbb, 0x4e, 0x20, + 0x3f, 0x0b, 0x25, 0x37, 0xa6, 0x53, 0x32, 0xe9, 0x9f, 0xf5, 0xb7, 0x28, 0x2e, 0x20, 0xae, 0x8f, + 0x3a, 0xb8, 0xd1, 0xea, 0x0e, 0x9c, 0xa3, 0x46, 0x0b, 0xb5, 0xba, 0xb8, 0xe1, 0xe3, 0x60, 0xd0, + 0x23, 0x01, 0x6f, 0x90, 0x53, 0x0f, 0x8b, 0x37, 0xd5, 0x3e, 0xcb, 0x83, 0xc5, 0x47, 0xee, 0x91, + 0x6d, 0xe1, 0xe3, 0x01, 0x0e, 0x08, 0x5c, 0x05, 0x05, 0xa6, 0x55, 0xd7, 0x36, 0xb4, 0xcd, 0xb2, + 0xc5, 0x1b, 0xb4, 0xb7, 0x67, 0xf7, 0x6d, 0xa2, 0x67, 0x37, 0xb4, 0xcd, 0x65, 0x8b, 0x37, 0x20, + 0x04, 0xf9, 0x80, 0x60, 0x4f, 0xcf, 0x6d, 0x68, 0x9b, 0x39, 0x8b, 0x3d, 0xc3, 0x75, 0xb0, 0x60, + 0x3b, 0x04, 0xfb, 0x27, 0xa8, 0xa7, 0x97, 0x59, 0x7f, 0xdc, 0x86, 0xb7, 0x41, 0x29, 0x20, 0xc8, + 0x27, 0xfb, 0x81, 0x9e, 0xdf, 0xd0, 0x36, 0x17, 0xb7, 0xd6, 0xeb, 0xdc, 0xf3, 0xf5, 0xc8, 0xf3, + 0xf5, 0xfd, 0xc8, 0xf3, 0xe6, 0xc2, 0xa7, 0xa1, 0x91, 0xf9, 0xe4, 0x4f, 0x86, 0x66, 0x45, 0x20, + 0xb8, 0x03, 0x0a, 0xd8, 0x69, 0xef, 0x07, 0x7a, 0x61, 0x06, 0x34, 0x87, 0xc0, 0xeb, 0xa0, 0xdc, + 0xb6, 0x7d, 0xdc, 0xa2, 0x2c, 0xeb, 0xc5, 0x0d, 0x6d, 0xb3, 0xb2, 0x75, 0xa5, 0x1e, 0x07, 0xca, + 0x6e, 0x34, 0x64, 0x8d, 0xa5, 0xe8, 0xf4, 0x3c, 0x44, 0xba, 0x7a, 0x89, 0x31, 0xc1, 0x9e, 0x61, + 0x0d, 0x14, 0x83, 0x2e, 0xf2, 0xdb, 0x81, 0xbe, 0xb0, 0x91, 0xdb, 0x2c, 0x9b, 0xe0, 0x2c, 0x34, + 0x44, 0x8f, 0x25, 0xfe, 0xe1, 0x0f, 0x40, 0xde, 0xeb, 0x21, 0x47, 0x07, 0xcc, 0xca, 0x95, 0xba, + 0xe4, 0xa5, 0x27, 0x3d, 0xe4, 0x98, 0x37, 0x87, 0xa1, 0xf1, 0x8e, 0x9c, 0x3c, 0x3e, 0x3a, 0x44, + 0x0e, 0x6a, 0xf4, 0xdc, 0x23, 0xbb, 0x71, 0xb2, 0xdd, 0x90, 0x7d, 0x4f, 0x15, 0xd5, 0x3f, 0xa2, + 0x0a, 0x28, 0xd4, 0x62, 0x8a, 0xe1, 0x43, 0xb0, 0x48, 0x7d, 0x8c, 0xef, 0x52, 0x07, 0x07, 0xfa, + 0x22, 0x7b, 0xcf, 0x6b, 0xe3, 0xd9, 0xb0, 0x7e, 0x0b, 0x1f, 0x7e, 0xe0, 0xbb, 0x03, 0xcf, 0xbc, + 0x74, 0x16, 0x1a, 0xb2, 0xbc, 0x25, 0x37, 0xe0, 0x43, 0x50, 0xa1, 0x41, 0x61, 0x3b, 0x9d, 0x0f, + 0x3d, 0x16, 0x81, 0xfa, 0x12, 0x53, 0x77, 0xad, 0x2e, 0x87, 0x4c, 0xfd, 0xae, 0x22, 0x63, 0xe6, + 0x29, 0xbd, 0xd6, 0x04, 0xb2, 0x36, 0xca, 0x01, 0x48, 0x63, 0xe9, 0x81, 0x13, 0x10, 0xe4, 0x90, + 0x57, 0x09, 0xa9, 0x5b, 0xa0, 0x48, 0x93, 0x7f, 0x3f, 0x60, 0x41, 0x35, 0xad, 0x8f, 0x05, 0x46, + 0x75, 0x72, 0x7e, 0x26, 0x27, 0x17, 0x52, 0x9d, 0x5c, 0xbc, 0xd0, 0xc9, 0xa5, 0xff, 0x90, 0x93, + 0x17, 0xfe, 0xbd, 0x4e, 0x2e, 0xbf, 0xb2, 0x93, 0x75, 0x90, 0xa7, 0x56, 0xc2, 0x15, 0x90, 0xf3, + 0xd1, 0x53, 0xe6, 0xd3, 0x25, 0x8b, 0x3e, 0xd6, 0x46, 0x79, 0xb0, 0xc4, 0x4b, 0x49, 0xe0, 0xb9, + 0x4e, 0x80, 0x29, 0x8f, 0x7b, 0xac, 0xfa, 0x73, 0xcf, 0x0b, 0x1e, 0x59, 0x8f, 0x25, 0x46, 0xe0, + 0xfb, 0x20, 0xbf, 0x8b, 0x08, 0x62, 0x51, 0xb0, 0xb8, 0xb5, 0x2a, 0xf3, 0x48, 0x75, 0xd1, 0x31, + 0x73, 0x8d, 0x1a, 0x72, 0x16, 0x1a, 0x95, 0x36, 0x22, 0xe8, 0x1b, 0x6e, 0xdf, 0x26, 0xb8, 0xef, + 0x91, 0x53, 0x8b, 0x21, 0xe1, 0x3b, 0xa0, 0x7c, 0xcf, 0xf7, 0x5d, 0x7f, 0xff, 0xd4, 0xc3, 0x2c, + 0x6a, 0xca, 0xe6, 0x6b, 0x67, 0xa1, 0x71, 0x05, 0x47, 0x9d, 0x12, 0x62, 0x2c, 0x09, 0xbf, 0x06, + 0x0a, 0xac, 0xc1, 0xe2, 0xa4, 0x6c, 0x5e, 0x39, 0x0b, 0x8d, 0x4b, 0x0c, 0x22, 0x89, 0x73, 0x09, + 0x35, 0xac, 0x0a, 0x53, 0x85, 0x55, 0x1c, 0xdd, 0x45, 0x39, 0xba, 0x75, 0x50, 0x3a, 0xc1, 0x7e, + 0x40, 0xd5, 0x94, 0x58, 0x7f, 0xd4, 0x84, 0x77, 0x00, 0xa0, 0xc4, 0xd8, 0x01, 0xb1, 0x5b, 0x91, + 0xb3, 0x97, 0xeb, 0x7c, 0xb1, 0xb1, 0x98, 0x8f, 0x4c, 0x28, 0x58, 0x90, 0x04, 0x2d, 0xe9, 0x19, + 0xfe, 0x4a, 0x03, 0xa5, 0x26, 0x46, 0x6d, 0xec, 0x53, 0xf7, 0xe6, 0x36, 0x17, 0xb7, 0xbe, 0x5a, + 0x97, 0x57, 0x96, 0x27, 0xbe, 0xdb, 0xc7, 0xa4, 0x8b, 0x07, 0x41, 0xe4, 0x20, 0x2e, 0x6d, 0x3a, + 0xc3, 0xd0, 0xc0, 0x53, 0x86, 0xea, 0x54, 0x0b, 0xda, 0xb9, 0xaf, 0x3a, 0x0b, 0x0d, 0xed, 0x9b, + 0x56, 0x64, 0x25, 0xdc, 0x02, 0x0b, 0x4f, 0x91, 0xef, 0xd8, 0x4e, 0x27, 0xd0, 0x01, 0xcb, 0xb4, + 0xb5, 0xb3, 0xd0, 0x80, 0x51, 0x9f, 0xe4, 0x88, 0x58, 0xae, 0xf6, 0x47, 0x0d, 0x5c, 0xa6, 0x81, + 0xb1, 0x47, 0xed, 0x09, 0xa4, 0x12, 0xd3, 0x47, 0xa4, 0xd5, 0xd5, 0x35, 0xaa, 0xc6, 0xe2, 0x0d, + 0x79, 0xbd, 0xc9, 0xfe, 0x4b, 0xeb, 0x4d, 0x6e, 0xf6, 0xf5, 0x26, 0xaa, 0x2b, 0xf9, 0xd4, 0xba, + 0x52, 0x38, 0xaf, 0xae, 0xd4, 0x7e, 0x26, 0x6a, 0x68, 0x34, 0xbf, 0x19, 0x52, 0xe9, 0x7e, 0x9c, + 0x4a, 0x39, 0x66, 0x6d, 0x1c, 0xa1, 0x5c, 0xd7, 0x83, 0x36, 0x76, 0x88, 0x7d, 0x68, 0x63, 0xff, + 0x82, 0x84, 0x92, 0xa2, 0x34, 0xa7, 0x46, 0xa9, 0x1c, 0x62, 0xf9, 0xb9, 0x08, 0x31, 0x35, 0xaf, + 0x0a, 0xaf, 0x90, 0x57, 0xb5, 0xbf, 0x65, 0xc1, 0x1a, 0xf5, 0xc8, 0x23, 0x74, 0x80, 0x7b, 0xdf, + 0x45, 0xfd, 0x19, 0xbd, 0xf2, 0x86, 0xe4, 0x95, 0xb2, 0x09, 0xff, 0xcf, 0xfa, 0x74, 0xac, 0xff, + 0x42, 0x03, 0x0b, 0xd1, 0x02, 0x00, 0xeb, 0x00, 0x70, 0x18, 0xab, 0xf1, 0x9c, 0xeb, 0x0a, 0x05, + 0xfb, 0x71, 0xaf, 0x25, 0x49, 0xc0, 0x1f, 0x82, 0x22, 0x6f, 0x89, 0x5c, 0x90, 0x96, 0xcd, 0x3d, + 0xe2, 0x63, 0xd4, 0xbf, 0xd3, 0x46, 0x1e, 0xc1, 0xbe, 0x79, 0x93, 0x5a, 0x31, 0x0c, 0x8d, 0x37, + 0xcf, 0x63, 0x29, 0xda, 0xe1, 0x0b, 0x1c, 0xf5, 0x2f, 0x7f, 0xa7, 0x25, 0xde, 0x50, 0xfb, 0xa9, + 0x06, 0x56, 0xa8, 0xa1, 0x94, 0x9a, 0x38, 0x30, 0x76, 0xc1, 0x82, 0x2f, 0x9e, 0x99, 0xb9, 0x8b, + 0x5b, 0xb5, 0xba, 0x4a, 0x6b, 0x0a, 0x95, 0x6c, 0xc1, 0xd5, 0xac, 0x18, 0x09, 0xb7, 0x15, 0x1a, + 0xb3, 0x69, 0x34, 0xf2, 0x35, 0x5a, 0x26, 0xee, 0x77, 0x59, 0x00, 0x1f, 0xd0, 0x13, 0x12, 0x8d, + 0xbf, 0x71, 0xa8, 0x3e, 0x4b, 0x58, 0x74, 0x6d, 0x4c, 0x4a, 0x52, 0xde, 0xbc, 0x3d, 0x0c, 0x8d, + 0x9d, 0x0b, 0x62, 0xe7, 0x9f, 0xe0, 0xa5, 0x59, 0xc8, 0xe1, 0x9b, 0x9d, 0x87, 0xf0, 0xad, 0xfd, + 0x3a, 0x0b, 0x2a, 0xdf, 0x73, 0x7b, 0x83, 0x3e, 0x8e, 0xe9, 0xf3, 0x12, 0xf4, 0xe9, 0x63, 0xfa, + 0x54, 0x59, 0x73, 0x67, 0x18, 0x1a, 0x37, 0xa6, 0xa5, 0x4e, 0xc5, 0xce, 0x35, 0x6d, 0x7f, 0xc9, + 0x82, 0xd5, 0x7d, 0xd7, 0xfb, 0xce, 0x1e, 0x3b, 0x45, 0x4b, 0x65, 0xb2, 0x9b, 0x20, 0x6f, 0x75, + 0x4c, 0x1e, 0x45, 0x3c, 0x46, 0xc4, 0xb7, 0x9f, 0x99, 0x37, 0x86, 0xa1, 0xb1, 0x35, 0x2d, 0x71, + 0x63, 0xdc, 0x3c, 0x93, 0xa6, 0xec, 0x81, 0x72, 0x53, 0xee, 0x81, 0xfe, 0x9e, 0x05, 0x6b, 0x1f, + 0x0d, 0x90, 0x43, 0xec, 0x1e, 0xe6, 0x64, 0xc7, 0x54, 0xff, 0x28, 0x41, 0x75, 0x75, 0x4c, 0xb5, + 0x8a, 0x11, 0xa4, 0xbf, 0x3f, 0x0c, 0x8d, 0x5b, 0xd3, 0x92, 0x9e, 0xa6, 0xe1, 0x7f, 0x8e, 0xfe, + 0xdf, 0x64, 0x41, 0x65, 0x8f, 0xef, 0xda, 0xa2, 0x89, 0x9f, 0xa4, 0xd0, 0x2e, 0x5f, 0x53, 0x79, + 0x07, 0x75, 0x15, 0x31, 0x5b, 0x91, 0x50, 0xb1, 0x73, 0x5d, 0x24, 0xfe, 0x90, 0x05, 0x6b, 0xbb, + 0x98, 0xe0, 0x16, 0xc1, 0xed, 0xfb, 0x36, 0xee, 0x49, 0x24, 0x7e, 0xac, 0x25, 0x58, 0xdc, 0x90, + 0x8e, 0x59, 0xa9, 0x20, 0xd3, 0x1c, 0x86, 0xc6, 0xed, 0x69, 0x79, 0x4c, 0xd7, 0x31, 0xd7, 0x7c, + 0x7e, 0x96, 0x05, 0x5f, 0xe2, 0x57, 0x07, 0xfc, 0x5e, 0x73, 0x4c, 0xe7, 0x8f, 0x13, 0x6c, 0x1a, + 0x72, 0x29, 0x48, 0x81, 0x98, 0x77, 0x86, 0xa1, 0xf1, 0xde, 0xf4, 0xb5, 0x20, 0x45, 0xc5, 0x7f, + 0x4d, 0x6c, 0xb2, 0xdd, 0xfe, 0xac, 0xb1, 0xa9, 0x82, 0x5e, 0x2d, 0x36, 0x55, 0x1d, 0x73, 0xcd, + 0xe7, 0xef, 0xb3, 0x60, 0x95, 0x45, 0xc9, 0x1e, 0xea, 0x7b, 0x3d, 0x69, 0x43, 0x70, 0xc1, 0x2a, + 0x95, 0x44, 0xcc, 0xba, 0x4a, 0x25, 0x35, 0xcc, 0x35, 0x91, 0x3f, 0x59, 0x00, 0xcb, 0x6c, 0x52, + 0x31, 0x83, 0x5f, 0x07, 0xe2, 0x9c, 0x29, 0xf8, 0x83, 0xd1, 0xdd, 0x84, 0xef, 0xb5, 0xea, 0x7b, + 0xe2, 0x04, 0xca, 0x25, 0xe0, 0xbb, 0xa0, 0x18, 0xb0, 0x1b, 0x00, 0x71, 0x84, 0xa8, 0x4e, 0x5e, + 0xb2, 0xa9, 0x77, 0x0d, 0xcd, 0x8c, 0x25, 0xe4, 0xe1, 0x2d, 0x50, 0xec, 0xb1, 0x70, 0x14, 0x37, + 0x20, 0xb5, 0x49, 0x64, 0xf2, 0x4c, 0x4c, 0xd1, 0x1c, 0x03, 0x6f, 0x80, 0x02, 0x3b, 0xab, 0x88, + 0xcb, 0x7e, 0xe5, 0xb5, 0xc9, 0x13, 0x43, 0x33, 0x63, 0x71, 0x71, 0xb8, 0x05, 0xf2, 0x9e, 0xef, + 0xf6, 0xc5, 0xb9, 0xf1, 0xda, 0xe4, 0x3b, 0xe5, 0x83, 0x56, 0x33, 0x63, 0x31, 0x59, 0xf8, 0x36, + 0x28, 0x05, 0xec, 0x84, 0x16, 0xb0, 0x1b, 0x37, 0xba, 0x3d, 0x9f, 0x80, 0x49, 0x90, 0x48, 0x14, + 0xbe, 0x0d, 0x8a, 0x27, 0x6c, 0xff, 0x2d, 0xae, 0x71, 0xd7, 0x65, 0x90, 0xba, 0x33, 0xa7, 0xf3, + 0xe2, 0xb2, 0xf0, 0x3e, 0x58, 0x22, 0xae, 0x77, 0x14, 0x6d, 0x73, 0xc5, 0x6d, 0xdd, 0x86, 0x8c, + 0x4d, 0xdb, 0x06, 0x37, 0x33, 0x96, 0x82, 0x83, 0x4f, 0xc0, 0xca, 0xb1, 0xb2, 0x9f, 0xc2, 0xd1, + 0xbd, 0xac, 0xc2, 0x73, 0xfa, 0x4e, 0xaf, 0x99, 0xb1, 0x12, 0x68, 0xb8, 0x0b, 0x2a, 0x81, 0xb2, + 0x55, 0x10, 0xdf, 0x20, 0x94, 0x79, 0xa9, 0x9b, 0x89, 0x66, 0xc6, 0x9a, 0xc0, 0xc0, 0x47, 0xa0, + 0xd2, 0x56, 0x16, 0x4a, 0xf1, 0x85, 0x41, 0xb1, 0x2a, 0x7d, 0x29, 0xa5, 0xda, 0x54, 0x2c, 0xfc, + 0x10, 0xac, 0x78, 0x13, 0x8b, 0x84, 0xf8, 0xc4, 0xf0, 0x15, 0x75, 0x96, 0x29, 0xab, 0x09, 0x9d, + 0xe4, 0x24, 0x58, 0x36, 0x8f, 0xd7, 0x4a, 0x7d, 0xf9, 0x7c, 0xf3, 0xd4, 0x6a, 0x2a, 0x9b, 0xc7, + 0x47, 0xe0, 0x23, 0x70, 0x29, 0x50, 0x2b, 0x85, 0x5e, 0x49, 0xfa, 0x33, 0xad, 0xa2, 0x34, 0x33, + 0xd6, 0x24, 0x14, 0x3e, 0x06, 0x97, 0x8f, 0xe3, 0x7b, 0xfc, 0x48, 0xdf, 0x25, 0xa6, 0xef, 0xf5, + 0xe4, 0x6c, 0x25, 0xa1, 0x66, 0xc6, 0x4a, 0x22, 0x4d, 0x30, 0xae, 0x93, 0xb5, 0x9f, 0x97, 0xc0, + 0x92, 0xa8, 0x01, 0xfc, 0xce, 0xf3, 0x5b, 0x71, 0x5a, 0x6b, 0xc9, 0x17, 0x24, 0xae, 0x48, 0xa5, + 0xac, 0x7e, 0x2b, 0xce, 0x6a, 0x5e, 0x0f, 0xd6, 0xc6, 0xb5, 0x97, 0x91, 0x22, 0x21, 0x44, 0x26, + 0x6f, 0x47, 0x99, 0xcc, 0xcb, 0xc0, 0xd5, 0xf4, 0x9b, 0x83, 0x08, 0x25, 0xd2, 0x78, 0x07, 0x94, + 0x6c, 0xfe, 0x21, 0x28, 0xad, 0x00, 0x24, 0xbf, 0x13, 0xd1, 0xc4, 0x14, 0x00, 0xb8, 0x3d, 0x4e, + 0xe7, 0x82, 0xf8, 0xf0, 0x91, 0x48, 0xe7, 0x18, 0x14, 0x65, 0xf3, 0xf5, 0x38, 0x9b, 0x8b, 0x93, + 0x1f, 0x4b, 0xa2, 0x5c, 0x8e, 0x27, 0x26, 0x52, 0xf9, 0x1e, 0x58, 0x8e, 0x82, 0x9f, 0x0d, 0x89, + 0x5c, 0x7e, 0xfd, 0xbc, 0xcd, 0x7b, 0x84, 0x57, 0x51, 0xf0, 0x41, 0x22, 0x63, 0xca, 0x93, 0x1b, + 0xae, 0xc9, 0x7c, 0x89, 0x34, 0x4d, 0xa6, 0xcb, 0x43, 0x70, 0x69, 0x1c, 0xf1, 0xdc, 0x26, 0x90, + 0xba, 0x42, 0x3e, 0x51, 0xa5, 0x68, 0x34, 0x4e, 0x00, 0x65, 0xb3, 0x44, 0xa6, 0x2c, 0x9e, 0x67, + 0x56, 0x94, 0x27, 0x09, 0xb3, 0x44, 0x9a, 0x7c, 0x00, 0x2a, 0x71, 0xac, 0x73, 0xab, 0x96, 0x04, + 0x53, 0xe7, 0xac, 0xba, 0xb1, 0x22, 0x15, 0x06, 0x9b, 0xb4, 0xe8, 0xc5, 0x71, 0xce, 0x55, 0x2d, + 0x8b, 0x22, 0x35, 0x31, 0xc1, 0xb1, 0x04, 0x2f, 0x76, 0x6a, 0x1f, 0x6c, 0x82, 0x85, 0x3e, 0x26, + 0xa8, 0x8d, 0x08, 0xd2, 0x4b, 0x6c, 0x19, 0x7f, 0x23, 0x91, 0x62, 0x42, 0xb6, 0xfe, 0x58, 0x08, + 0xde, 0x73, 0x88, 0x7f, 0x2a, 0x2e, 0xcd, 0x62, 0xf4, 0xfa, 0xb7, 0xc1, 0xb2, 0x22, 0x00, 0x57, + 0x40, 0xee, 0x08, 0x47, 0xdf, 0x2b, 0xe9, 0x23, 0x5c, 0x05, 0x85, 0x13, 0xd4, 0x1b, 0x60, 0x96, + 0x32, 0x65, 0x8b, 0x37, 0x76, 0xb2, 0xef, 0x6a, 0x66, 0x19, 0x94, 0x7c, 0xfe, 0x96, 0xda, 0x6f, + 0xb3, 0xe0, 0x72, 0x22, 0xb3, 0x53, 0xce, 0x86, 0x57, 0x53, 0x67, 0x2a, 0x72, 0xfe, 0xbd, 0x61, + 0x68, 0xdc, 0x9c, 0x6d, 0x0f, 0x2e, 0xc1, 0xe7, 0x79, 0x9b, 0x63, 0x76, 0x9e, 0xbf, 0xa8, 0x66, + 0x3e, 0x7f, 0x51, 0xcd, 0x7c, 0xf1, 0xa2, 0xaa, 0x7d, 0x3c, 0xaa, 0x6a, 0xbf, 0x1c, 0x55, 0xb5, + 0x4f, 0x47, 0x55, 0xed, 0xf9, 0xa8, 0xaa, 0xfd, 0x79, 0x54, 0xd5, 0xfe, 0x3a, 0xaa, 0x66, 0xbe, + 0x18, 0x55, 0xb5, 0x4f, 0x5e, 0x56, 0x33, 0xcf, 0x5f, 0x56, 0x33, 0x9f, 0xbf, 0xac, 0x66, 0xbe, + 0x7f, 0x7d, 0x66, 0x53, 0x0f, 0x8a, 0x8c, 0xbd, 0xed, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x41, + 0x30, 0x7a, 0xc9, 0xf8, 0x22, 0x00, 0x00, } func (this *LokiRequest) Equal(that interface{}) bool { @@ -2771,6 +2839,30 @@ func (this *QueryResponse_SamplesResponse) Equal(that interface{}) bool { } return true } +func (this *QueryResponse_QueryPlanResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*QueryResponse_QueryPlanResponse) + if !ok { + that2, ok := that.(QueryResponse_QueryPlanResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.QueryPlanResponse.Equal(that1.QueryPlanResponse) { + return false + } + return true +} func (this *QueryRequest) Equal(that interface{}) bool { if that == nil { return this == nil @@ -3073,6 +3165,66 @@ func (this *QueryRequest_SamplesRequest) Equal(that interface{}) bool { } return true } +func (this *QueryRequest_QueryPlanRequest) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*QueryRequest_QueryPlanRequest) + if !ok { + that2, ok := that.(QueryRequest_QueryPlanRequest) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.QueryPlanRequest.Equal(that1.QueryPlanRequest) { + return false + } + return true +} +func (this *QueryPlanResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*QueryPlanResponse) + if !ok { + that2, ok := that.(QueryPlanResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if that1.Response == nil { + if this.Response != nil { + return false + } + } else if !this.Response.Equal(*that1.Response) { + return false + } + if len(this.Headers) != len(that1.Headers) { + return false + } + for i := range this.Headers { + if !this.Headers[i].Equal(that1.Headers[i]) { + return false + } + } + return true +} func (this *LokiRequest) GoString() string { if this == nil { return "nil" @@ -3322,7 +3474,7 @@ func (this *QueryResponse) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 18) + s := make([]string, 0, 19) s = append(s, "&queryrange.QueryResponse{") if this.Status != nil { s = append(s, "Status: "+fmt.Sprintf("%#v", this.Status)+",\n") @@ -3437,11 +3589,19 @@ func (this *QueryResponse_SamplesResponse) GoString() string { `SamplesResponse:` + fmt.Sprintf("%#v", this.SamplesResponse) + `}`}, ", ") return s } +func (this *QueryResponse_QueryPlanResponse) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&queryrange.QueryResponse_QueryPlanResponse{` + + `QueryPlanResponse:` + fmt.Sprintf("%#v", this.QueryPlanResponse) + `}`}, ", ") + return s +} func (this *QueryRequest) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 16) + s := make([]string, 0, 17) s = append(s, "&queryrange.QueryRequest{") if this.Request != nil { s = append(s, "Request: "+fmt.Sprintf("%#v", this.Request)+",\n") @@ -3550,6 +3710,25 @@ func (this *QueryRequest_SamplesRequest) GoString() string { `SamplesRequest:` + fmt.Sprintf("%#v", this.SamplesRequest) + `}`}, ", ") return s } +func (this *QueryRequest_QueryPlanRequest) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&queryrange.QueryRequest_QueryPlanRequest{` + + `QueryPlanRequest:` + fmt.Sprintf("%#v", this.QueryPlanRequest) + `}`}, ", ") + return s +} +func (this *QueryPlanResponse) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&queryrange.QueryPlanResponse{") + s = append(s, "Response: "+fmt.Sprintf("%#v", this.Response)+",\n") + s = append(s, "Headers: "+fmt.Sprintf("%#v", this.Headers)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} func valueToGoStringQueryrange(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -4961,6 +5140,26 @@ func (m *QueryResponse_SamplesResponse) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } +func (m *QueryResponse_QueryPlanResponse) MarshalTo(dAtA []byte) (int, error) { + return m.MarshalToSizedBuffer(dAtA[:m.Size()]) +} + +func (m *QueryResponse_QueryPlanResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.QueryPlanResponse != nil { + { + size, err := m.QueryPlanResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQueryrange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } + return len(dAtA) - i, nil +} func (m *QueryRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5232,6 +5431,75 @@ func (m *QueryRequest_SamplesRequest) MarshalToSizedBuffer(dAtA []byte) (int, er } return len(dAtA) - i, nil } +func (m *QueryRequest_QueryPlanRequest) MarshalTo(dAtA []byte) (int, error) { + return m.MarshalToSizedBuffer(dAtA[:m.Size()]) +} + +func (m *QueryRequest_QueryPlanRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.QueryPlanRequest != nil { + { + size, err := m.QueryPlanRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQueryrange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + return len(dAtA) - i, nil +} +func (m *QueryPlanResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPlanResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPlanResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Headers) > 0 { + for iNdEx := len(m.Headers) - 1; iNdEx >= 0; iNdEx-- { + { + size := m.Headers[iNdEx].Size() + i -= size + if _, err := m.Headers[iNdEx].MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQueryrange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Response != nil { + { + size := m.Response.Size() + i -= size + if _, err := m.Response.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQueryrange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintQueryrange(dAtA []byte, offset int, v uint64) int { offset -= sovQueryrange(v) base := offset @@ -5870,6 +6138,18 @@ func (m *QueryResponse_SamplesResponse) Size() (n int) { } return n } +func (m *QueryResponse_QueryPlanResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.QueryPlanResponse != nil { + l = m.QueryPlanResponse.Size() + n += 1 + l + sovQueryrange(uint64(l)) + } + return n +} func (m *QueryRequest) Size() (n int) { if m == nil { return 0 @@ -6022,6 +6302,36 @@ func (m *QueryRequest_SamplesRequest) Size() (n int) { } return n } +func (m *QueryRequest_QueryPlanRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.QueryPlanRequest != nil { + l = m.QueryPlanRequest.Size() + n += 1 + l + sovQueryrange(uint64(l)) + } + return n +} +func (m *QueryPlanResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Response != nil { + l = m.Response.Size() + n += 1 + l + sovQueryrange(uint64(l)) + } + if len(m.Headers) > 0 { + for _, e := range m.Headers { + l = e.Size() + n += 1 + l + sovQueryrange(uint64(l)) + } + } + return n +} func sovQueryrange(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 @@ -6408,6 +6718,16 @@ func (this *QueryResponse_SamplesResponse) String() string { }, "") return s } +func (this *QueryResponse_QueryPlanResponse) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&QueryResponse_QueryPlanResponse{`, + `QueryPlanResponse:` + strings.Replace(fmt.Sprintf("%v", this.QueryPlanResponse), "QueryPlanResponse", "QueryPlanResponse", 1) + `,`, + `}`, + }, "") + return s +} func (this *QueryRequest) String() string { if this == nil { return "nil" @@ -6539,6 +6859,27 @@ func (this *QueryRequest_SamplesRequest) String() string { }, "") return s } +func (this *QueryRequest_QueryPlanRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&QueryRequest_QueryPlanRequest{`, + `QueryPlanRequest:` + strings.Replace(fmt.Sprintf("%v", this.QueryPlanRequest), "QueryPlanRequest", "logproto.QueryPlanRequest", 1) + `,`, + `}`, + }, "") + return s +} +func (this *QueryPlanResponse) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&QueryPlanResponse{`, + `Response:` + fmt.Sprintf("%v", this.Response) + `,`, + `Headers:` + fmt.Sprintf("%v", this.Headers) + `,`, + `}`, + }, "") + return s +} func valueToStringQueryrange(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -10248,6 +10589,41 @@ func (m *QueryResponse) Unmarshal(dAtA []byte) error { } m.Response = &QueryResponse_SamplesResponse{v} iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryPlanResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQueryrange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQueryrange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQueryrange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &QueryPlanResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &QueryResponse_QueryPlanResponse{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQueryrange(dAtA[iNdEx:]) @@ -10813,6 +11189,164 @@ func (m *QueryRequest) Unmarshal(dAtA []byte) error { } m.Request = &QueryRequest_SamplesRequest{v} iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryPlanRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQueryrange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQueryrange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQueryrange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &logproto.QueryPlanRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Request = &QueryRequest_QueryPlanRequest{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQueryrange(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQueryrange + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthQueryrange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPlanResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQueryrange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPlanResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPlanResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Response", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQueryrange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQueryrange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQueryrange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Response == nil { + m.Response = &github_com_grafana_loki_v3_pkg_logproto.QueryPlanResponse{} + } + if err := m.Response.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Headers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQueryrange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQueryrange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQueryrange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Headers = append(m.Headers, github_com_grafana_loki_v3_pkg_querier_queryrange_queryrangebase_definitions.PrometheusResponseHeader{}) + if err := m.Headers[len(m.Headers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQueryrange(dAtA[iNdEx:]) diff --git a/pkg/querier/queryrange/queryrange.proto b/pkg/querier/queryrange/queryrange.proto index bc4083bc9dc58..692097e393931 100644 --- a/pkg/querier/queryrange/queryrange.proto +++ b/pkg/querier/queryrange/queryrange.proto @@ -234,6 +234,7 @@ message QueryResponse { QueryPatternsResponse patternsResponse = 12; DetectedLabelsResponse detectedLabels = 13; QuerySamplesResponse samplesResponse = 14; + QueryPlanResponse queryPlanResponse = 15; } } @@ -250,6 +251,15 @@ message QueryRequest { logproto.QueryPatternsRequest patternsRequest = 10; logproto.DetectedLabelsRequest detectedLabels = 11; logproto.QuerySamplesRequest samplesRequest = 12; + logproto.QueryPlanRequest queryPlanRequest = 13; } map metadata = 7 [(gogoproto.nullable) = false]; } + +message QueryPlanResponse { + logproto.QueryPlanResponse response = 1 [(gogoproto.customtype) = "github.com/grafana/loki/v3/pkg/logproto.QueryPlanResponse"]; + repeated definitions.PrometheusResponseHeader Headers = 2 [ + (gogoproto.jsontag) = "-", + (gogoproto.customtype) = "github.com/grafana/loki/v3/pkg/querier/queryrange/queryrangebase/definitions.PrometheusResponseHeader" + ]; +} \ No newline at end of file diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index 21961d279ae61..8ee3b28069573 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -506,6 +506,7 @@ const ( PatternsQueryOp = "patterns" DetectedLabelsOp = "detected_labels" SamplesQueryOp = "samples" + QueryPlanOp = "query_plan" ) func getOperation(path string) string { @@ -534,6 +535,7 @@ func getOperation(path string) string { return PatternsQueryOp case path == "/loki/api/v1/detected_labels": return DetectedLabelsOp + case path == "/loki/api/v1/query/plan": default: return "" } From 4ff0ce86410888672e03645efebcd452c6953a0d Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Mon, 5 Aug 2024 21:25:47 +0530 Subject: [PATCH 2/8] Adaptive splitting based on shard stream label --- pkg/logproto/logproto.pb.go | 604 +++++++++++++++++---------- pkg/logproto/logproto.proto | 6 +- pkg/querier-rf1/querier.go | 4 + pkg/querier/adaptive_splitting.go | 101 +++++ pkg/querier/handler.go | 6 + pkg/querier/http.go | 9 + pkg/querier/multi_tenant_querier.go | 11 + pkg/querier/querier.go | 46 +- pkg/querier/querier_mock_test.go | 3 + pkg/querier/queryrange/codec.go | 4 + pkg/querier/queryrange/extensions.go | 19 + pkg/querier/queryrange/marshal.go | 8 + pkg/querier/queryrange/roundtrip.go | 1 + pkg/util/marshal/marshal.go | 10 + 14 files changed, 610 insertions(+), 222 deletions(-) create mode 100644 pkg/querier/adaptive_splitting.go diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index 65086145feaf5..3d07e4697e857 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -3088,6 +3088,7 @@ type QueryPlanRequest struct { Start time.Time `protobuf:"bytes,3,opt,name=start,proto3,stdtime" json:"start"` End time.Time `protobuf:"bytes,4,opt,name=end,proto3,stdtime" json:"end"` Direction Direction `protobuf:"varint,5,opt,name=direction,proto3,enum=logproto.Direction" json:"direction,omitempty"` + Buckets uint32 `protobuf:"varint,6,opt,name=buckets,proto3" json:"buckets,omitempty"` } func (m *QueryPlanRequest) Reset() { *m = QueryPlanRequest{} } @@ -3157,6 +3158,13 @@ func (m *QueryPlanRequest) GetDirection() Direction { return FORWARD } +func (m *QueryPlanRequest) GetBuckets() uint32 { + if m != nil { + return m.Buckets + } + return 0 +} + type QueryPlanResponse struct { Results []*SubQueryResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` MergeStrategy MergeStrategy `protobuf:"varint,2,opt,name=mergeStrategy,proto3,enum=logproto.MergeStrategy" json:"mergeStrategy,omitempty"` @@ -3209,10 +3217,13 @@ func (m *QueryPlanResponse) GetMergeStrategy() MergeStrategy { } type SubQueryResult struct { - Start time.Time `protobuf:"bytes,1,opt,name=start,proto3,stdtime" json:"start"` - End time.Time `protobuf:"bytes,2,opt,name=end,proto3,stdtime" json:"end"` - Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` - Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + Start time.Time `protobuf:"bytes,1,opt,name=start,proto3,stdtime" json:"start"` + End time.Time `protobuf:"bytes,2,opt,name=end,proto3,stdtime" json:"end"` + Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` + Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + Shards []string `protobuf:"bytes,5,rep,name=shards,proto3" json:"shards,omitempty"` + Volume uint64 `protobuf:"varint,6,opt,name=volume,proto3" json:"volume,omitempty"` + Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` } func (m *SubQueryResult) Reset() { *m = SubQueryResult{} } @@ -3275,6 +3286,27 @@ func (m *SubQueryResult) GetLimit() uint32 { return 0 } +func (m *SubQueryResult) GetShards() []string { + if m != nil { + return m.Shards + } + return nil +} + +func (m *SubQueryResult) GetVolume() uint64 { + if m != nil { + return m.Volume + } + return 0 +} + +func (m *SubQueryResult) GetId() string { + if m != nil { + return m.Id + } + return "" +} + func init() { proto.RegisterEnum("logproto.Direction", Direction_name, Direction_value) proto.RegisterEnum("logproto.MergeStrategy", MergeStrategy_name, MergeStrategy_value) @@ -3342,184 +3374,185 @@ func init() { func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2817 bytes of a gzipped FileDescriptorProto + // 2836 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x6c, 0x1b, 0xc7, - 0xd5, 0x5c, 0xfe, 0x8a, 0x8f, 0xa4, 0x4c, 0x8f, 0x69, 0x9b, 0xa0, 0x1d, 0x52, 0x19, 0x7c, 0x5f, - 0xe2, 0xda, 0x8e, 0x68, 0x2b, 0x4d, 0xea, 0x38, 0x75, 0x53, 0x51, 0x8a, 0x15, 0x39, 0xf2, 0x4f, - 0x46, 0x8a, 0x93, 0x16, 0x0d, 0x82, 0x15, 0x39, 0xa2, 0x16, 0x26, 0x77, 0xe9, 0xdd, 0x61, 0x1c, - 0xdd, 0x0a, 0x14, 0xe8, 0xad, 0x68, 0x80, 0x1e, 0xda, 0x5e, 0x0a, 0x14, 0x28, 0xd0, 0x02, 0x45, - 0x80, 0xa2, 0xe8, 0xa9, 0x28, 0xda, 0x4b, 0x0f, 0xe9, 0x2d, 0xc7, 0x20, 0x07, 0xb6, 0x51, 0x50, - 0xa0, 0x10, 0x50, 0x20, 0x40, 0xd1, 0x1e, 0x72, 0x2a, 0xe6, 0x6f, 0x77, 0x76, 0x45, 0xd5, 0x91, - 0xeb, 0x22, 0xf1, 0x85, 0xdc, 0x79, 0xf3, 0xe6, 0xcd, 0xbc, 0x9f, 0x79, 0x7f, 0xbb, 0x70, 0x6a, - 0x74, 0xa7, 0xdf, 0x1e, 0x78, 0xfd, 0x91, 0xef, 0x31, 0x2f, 0x7c, 0x98, 0x17, 0xbf, 0x68, 0x46, - 0x8f, 0x1b, 0xb5, 0xbe, 0xd7, 0xf7, 0x24, 0x0e, 0x7f, 0x92, 0xf3, 0x8d, 0x56, 0xdf, 0xf3, 0xfa, - 0x03, 0xda, 0x16, 0xa3, 0xcd, 0xf1, 0x56, 0x9b, 0x39, 0x43, 0x1a, 0x30, 0x7b, 0x38, 0x52, 0x08, - 0x73, 0x8a, 0xfa, 0xdd, 0xc1, 0xd0, 0xeb, 0xd1, 0x41, 0x3b, 0x60, 0x36, 0x0b, 0xe4, 0xaf, 0xc2, - 0x38, 0xc6, 0x31, 0x46, 0xe3, 0x60, 0x5b, 0xfc, 0x48, 0x20, 0xfe, 0x8d, 0x05, 0xc7, 0xd7, 0xec, - 0x4d, 0x3a, 0xd8, 0xf0, 0x6e, 0xdb, 0x83, 0x31, 0x0d, 0x08, 0x0d, 0x46, 0x9e, 0x1b, 0x50, 0xb4, - 0x04, 0xf9, 0x01, 0x9f, 0x08, 0xea, 0xd6, 0x5c, 0xe6, 0x4c, 0x69, 0xe1, 0xdc, 0x7c, 0x78, 0xe4, - 0xa9, 0x0b, 0x24, 0x34, 0x78, 0xd1, 0x65, 0xfe, 0x0e, 0x51, 0x4b, 0x1b, 0xb7, 0xa1, 0x64, 0x80, - 0x51, 0x15, 0x32, 0x77, 0xe8, 0x4e, 0xdd, 0x9a, 0xb3, 0xce, 0x14, 0x09, 0x7f, 0x44, 0x17, 0x21, - 0xf7, 0x16, 0x27, 0x53, 0x4f, 0xcf, 0x59, 0x67, 0x4a, 0x0b, 0xa7, 0xa2, 0x4d, 0x5e, 0x75, 0x9d, - 0xbb, 0x63, 0x2a, 0x56, 0xab, 0x8d, 0x24, 0xe6, 0xe5, 0xf4, 0x25, 0x0b, 0x9f, 0x83, 0xa3, 0xfb, - 0xe6, 0xd1, 0x09, 0xc8, 0x0b, 0x0c, 0x79, 0xe2, 0x22, 0x51, 0x23, 0x5c, 0x03, 0xb4, 0xce, 0x7c, - 0x6a, 0x0f, 0x89, 0xcd, 0xf8, 0x79, 0xef, 0x8e, 0x69, 0xc0, 0xf0, 0x75, 0x38, 0x16, 0x83, 0x2a, - 0xb6, 0x9f, 0x85, 0x52, 0x10, 0x81, 0x15, 0xef, 0xb5, 0xe8, 0x58, 0xd1, 0x1a, 0x62, 0x22, 0xe2, - 0x9f, 0x58, 0x00, 0xd1, 0x1c, 0x6a, 0x02, 0xc8, 0xd9, 0x97, 0xec, 0x60, 0x5b, 0x30, 0x9c, 0x25, - 0x06, 0x04, 0x9d, 0x87, 0xa3, 0xd1, 0xe8, 0x86, 0xb7, 0xbe, 0x6d, 0xfb, 0x3d, 0x21, 0x83, 0x2c, - 0xd9, 0x3f, 0x81, 0x10, 0x64, 0x7d, 0x9b, 0xd1, 0x7a, 0x66, 0xce, 0x3a, 0x93, 0x21, 0xe2, 0x99, - 0x73, 0xcb, 0xa8, 0x6b, 0xbb, 0xac, 0x9e, 0x15, 0xe2, 0x54, 0x23, 0x0e, 0xe7, 0xfa, 0xa5, 0x41, - 0x3d, 0x37, 0x67, 0x9d, 0xa9, 0x10, 0x35, 0xc2, 0xff, 0xca, 0x40, 0xf9, 0x95, 0x31, 0xf5, 0x77, - 0x94, 0x00, 0x50, 0x13, 0x66, 0x02, 0x3a, 0xa0, 0x5d, 0xe6, 0xf9, 0x52, 0x23, 0x9d, 0x74, 0xdd, - 0x22, 0x21, 0x0c, 0xd5, 0x20, 0x37, 0x70, 0x86, 0x0e, 0x13, 0xc7, 0xaa, 0x10, 0x39, 0x40, 0x97, - 0x21, 0x17, 0x30, 0xdb, 0x67, 0xe2, 0x2c, 0xa5, 0x85, 0xc6, 0xbc, 0x34, 0xcc, 0x79, 0x6d, 0x98, - 0xf3, 0x1b, 0xda, 0x30, 0x3b, 0x33, 0xef, 0x4d, 0x5a, 0xa9, 0x77, 0xfe, 0xdc, 0xb2, 0x88, 0x5c, - 0x82, 0x9e, 0x85, 0x0c, 0x75, 0x7b, 0xe2, 0xbc, 0x9f, 0x75, 0x25, 0x5f, 0x80, 0x2e, 0x42, 0xb1, - 0xe7, 0xf8, 0xb4, 0xcb, 0x1c, 0xcf, 0x15, 0x5c, 0xcd, 0x2e, 0x1c, 0x8b, 0x34, 0xb2, 0xac, 0xa7, - 0x48, 0x84, 0x85, 0xce, 0x43, 0x3e, 0xe0, 0xa2, 0x0b, 0xea, 0x05, 0x6e, 0x0b, 0x9d, 0xda, 0xde, - 0xa4, 0x55, 0x95, 0x90, 0xf3, 0xde, 0xd0, 0x61, 0x74, 0x38, 0x62, 0x3b, 0x44, 0xe1, 0xa0, 0xb3, - 0x50, 0xe8, 0xd1, 0x01, 0xe5, 0x0a, 0x9f, 0x11, 0x0a, 0xaf, 0x1a, 0xe4, 0xc5, 0x04, 0xd1, 0x08, - 0xe8, 0x0d, 0xc8, 0x8e, 0x06, 0xb6, 0x5b, 0x2f, 0x0a, 0x2e, 0x66, 0x23, 0xc4, 0x5b, 0x03, 0xdb, - 0xed, 0x3c, 0xf7, 0xe1, 0xa4, 0xf5, 0x4c, 0xdf, 0x61, 0xdb, 0xe3, 0xcd, 0xf9, 0xae, 0x37, 0x6c, - 0xf7, 0x7d, 0x7b, 0xcb, 0x76, 0xed, 0xf6, 0xc0, 0xbb, 0xe3, 0xb4, 0xdf, 0x7a, 0xba, 0xcd, 0xef, - 0xe0, 0xdd, 0x31, 0xf5, 0x1d, 0xea, 0xb7, 0x39, 0x99, 0x79, 0xa1, 0x12, 0xbe, 0x94, 0x08, 0xb2, - 0xe8, 0x1a, 0xb7, 0x3f, 0xcf, 0xa7, 0x4b, 0xdb, 0x63, 0xf7, 0x4e, 0x50, 0x07, 0xb1, 0xcb, 0xc9, - 0x68, 0x17, 0x01, 0x27, 0x74, 0x6b, 0xc5, 0xf7, 0xc6, 0xa3, 0xce, 0x91, 0xbd, 0x49, 0xcb, 0xc4, - 0x27, 0xe6, 0xe0, 0x5a, 0x76, 0x26, 0x5f, 0x2d, 0xe0, 0x77, 0x33, 0x80, 0xd6, 0xed, 0xe1, 0x68, - 0x40, 0x0f, 0xa5, 0xfe, 0x50, 0xd1, 0xe9, 0x07, 0x56, 0x74, 0xe6, 0xb0, 0x8a, 0x8e, 0xb4, 0x96, - 0x3d, 0x9c, 0xd6, 0x72, 0x9f, 0x55, 0x6b, 0xf9, 0x2f, 0xbc, 0xd6, 0x70, 0x1d, 0xb2, 0x9c, 0x32, - 0x77, 0x96, 0xbe, 0x7d, 0x4f, 0xe8, 0xa6, 0x4c, 0xf8, 0x23, 0x5e, 0x83, 0xbc, 0xe4, 0x0b, 0x35, - 0x92, 0xca, 0x8b, 0xdf, 0xdb, 0x48, 0x71, 0x19, 0xad, 0x92, 0x6a, 0xa4, 0x92, 0x8c, 0x10, 0x36, - 0xfe, 0x9d, 0x05, 0x15, 0x65, 0x11, 0xca, 0xf7, 0x6d, 0x42, 0x41, 0xfa, 0x1e, 0xed, 0xf7, 0x4e, - 0x26, 0xfd, 0xde, 0x62, 0xcf, 0x1e, 0x31, 0xea, 0x77, 0xda, 0xef, 0x4d, 0x5a, 0xd6, 0x87, 0x93, - 0xd6, 0x93, 0x07, 0x09, 0x4d, 0xc7, 0x1a, 0xed, 0x2f, 0x35, 0x61, 0x74, 0x4e, 0x9c, 0x8e, 0x05, - 0xca, 0xac, 0x8e, 0xcc, 0xcb, 0x10, 0xb5, 0xea, 0xf6, 0x69, 0xc0, 0x29, 0x67, 0xb9, 0x45, 0x10, - 0x89, 0xc3, 0xd9, 0xbc, 0x67, 0xfb, 0xae, 0xe3, 0xf6, 0x83, 0x7a, 0x46, 0xf8, 0xf4, 0x70, 0x8c, - 0x7f, 0x64, 0xc1, 0xb1, 0x98, 0x59, 0x2b, 0x26, 0x2e, 0x41, 0x3e, 0xe0, 0x9a, 0xd2, 0x3c, 0x18, - 0x46, 0xb1, 0x2e, 0xe0, 0x9d, 0x59, 0x75, 0xf8, 0xbc, 0x1c, 0x13, 0x85, 0xff, 0xf0, 0x8e, 0xf6, - 0x47, 0x0b, 0xca, 0x22, 0x30, 0xe9, 0xbb, 0x86, 0x20, 0xeb, 0xda, 0x43, 0xaa, 0x54, 0x25, 0x9e, - 0x8d, 0x68, 0xc5, 0xb7, 0x9b, 0xd1, 0xd1, 0xea, 0xb0, 0x0e, 0xd6, 0x7a, 0x60, 0x07, 0x6b, 0x45, - 0xf7, 0xae, 0x06, 0x39, 0x6e, 0xde, 0x3b, 0xc2, 0xb9, 0x16, 0x89, 0x1c, 0xe0, 0x27, 0xa1, 0xa2, - 0xb8, 0x50, 0xa2, 0x3d, 0x28, 0xc0, 0x0e, 0x21, 0x2f, 0x35, 0x81, 0xfe, 0x0f, 0x8a, 0x61, 0x62, - 0x22, 0xb8, 0xcd, 0x74, 0xf2, 0x7b, 0x93, 0x56, 0x9a, 0x05, 0x24, 0x9a, 0x40, 0x2d, 0x33, 0xe8, - 0x5b, 0x9d, 0xe2, 0xde, 0xa4, 0x25, 0x01, 0x2a, 0xc4, 0xa3, 0xd3, 0x90, 0xdd, 0xe6, 0x71, 0x93, - 0x8b, 0x20, 0xdb, 0x99, 0xd9, 0x9b, 0xb4, 0xc4, 0x98, 0x88, 0x5f, 0xbc, 0x02, 0xe5, 0x35, 0xda, - 0xb7, 0xbb, 0x3b, 0x6a, 0xd3, 0x9a, 0x26, 0xc7, 0x37, 0xb4, 0x34, 0x8d, 0xc7, 0xa1, 0x1c, 0xee, - 0xf8, 0xe6, 0x30, 0x50, 0xb7, 0xa1, 0x14, 0xc2, 0xae, 0x07, 0xf8, 0xc7, 0x16, 0x28, 0x1b, 0x40, - 0xd8, 0xc8, 0x76, 0xb8, 0x2f, 0x84, 0xbd, 0x49, 0x4b, 0x41, 0x74, 0x32, 0x83, 0x9e, 0x87, 0x42, - 0x20, 0x76, 0xe4, 0xc4, 0x92, 0xa6, 0x25, 0x26, 0x3a, 0x47, 0xb8, 0x89, 0xec, 0x4d, 0x5a, 0x1a, - 0x91, 0xe8, 0x07, 0x34, 0x1f, 0x4b, 0x08, 0x24, 0x63, 0xb3, 0x7b, 0x93, 0x96, 0x01, 0x35, 0x13, - 0x04, 0xfc, 0xa9, 0x05, 0xa5, 0x0d, 0xdb, 0x09, 0x4d, 0xa8, 0xae, 0x55, 0x14, 0xf9, 0x6a, 0x09, - 0xe0, 0x96, 0xd8, 0xa3, 0x03, 0x7b, 0xe7, 0xaa, 0xe7, 0x0b, 0xba, 0x15, 0x12, 0x8e, 0xa3, 0x18, - 0x9e, 0x9d, 0x1a, 0xc3, 0x73, 0x87, 0x77, 0xed, 0xff, 0x5b, 0x47, 0x7a, 0x2d, 0x3b, 0x93, 0xae, - 0x66, 0xf0, 0xbb, 0x16, 0x94, 0x25, 0xf3, 0xca, 0xf2, 0xbe, 0x05, 0x79, 0x29, 0x1b, 0xc1, 0xfe, - 0x7f, 0x70, 0x4c, 0xe7, 0x0e, 0xe3, 0x94, 0x14, 0x4d, 0xf4, 0x02, 0xcc, 0xf6, 0x7c, 0x6f, 0x34, - 0xa2, 0xbd, 0x75, 0xe5, 0xfe, 0xd2, 0x49, 0xf7, 0xb7, 0x6c, 0xce, 0x93, 0x04, 0x3a, 0xfe, 0x93, - 0x05, 0x15, 0xe5, 0x4c, 0x94, 0xba, 0x42, 0x11, 0x5b, 0x0f, 0x1c, 0x3d, 0xd3, 0x87, 0x8d, 0x9e, - 0x27, 0x20, 0xdf, 0xe7, 0xf1, 0x45, 0x3b, 0x24, 0x35, 0x3a, 0x5c, 0x54, 0xc5, 0xd7, 0x60, 0x56, - 0xb3, 0x72, 0x80, 0x47, 0x6d, 0x24, 0x3d, 0xea, 0x6a, 0x8f, 0xba, 0xcc, 0xd9, 0x72, 0x42, 0x1f, - 0xa9, 0xf0, 0xf1, 0xf7, 0x2d, 0xa8, 0x26, 0x51, 0xd0, 0x72, 0xa2, 0xb0, 0x78, 0xe2, 0x60, 0x72, - 0x66, 0x4d, 0xa1, 0x49, 0xab, 0xca, 0xe2, 0x99, 0xfb, 0x55, 0x16, 0x35, 0xd3, 0xc9, 0x14, 0x95, - 0x57, 0xc0, 0x3f, 0xb4, 0xa0, 0x12, 0xd3, 0x25, 0xba, 0x04, 0xd9, 0x2d, 0xdf, 0x1b, 0x1e, 0x4a, - 0x51, 0x62, 0x05, 0xfa, 0x32, 0xa4, 0x99, 0x77, 0x28, 0x35, 0xa5, 0x99, 0xc7, 0xb5, 0xa4, 0xd8, - 0xcf, 0xc8, 0xbc, 0x5d, 0x8e, 0xf0, 0x33, 0x50, 0x14, 0x0c, 0xdd, 0xb2, 0x1d, 0x7f, 0x6a, 0xc0, - 0x98, 0xce, 0xd0, 0xf3, 0x70, 0x44, 0x3a, 0xc3, 0xe9, 0x8b, 0xcb, 0xd3, 0x16, 0x97, 0xf5, 0xe2, - 0x53, 0x90, 0x13, 0x49, 0x07, 0x5f, 0xd2, 0xb3, 0x99, 0xad, 0x97, 0xf0, 0x67, 0x7c, 0x1c, 0x8e, - 0xf1, 0x3b, 0x48, 0xfd, 0x60, 0xc9, 0x1b, 0xbb, 0x4c, 0xd7, 0x4d, 0xe7, 0xa1, 0x16, 0x07, 0x2b, - 0x2b, 0xa9, 0x41, 0xae, 0xcb, 0x01, 0x82, 0x46, 0x85, 0xc8, 0x01, 0xfe, 0x99, 0x05, 0x68, 0x85, - 0x32, 0xb1, 0xcb, 0xea, 0x72, 0x78, 0x3d, 0x1a, 0x30, 0x33, 0xb4, 0x59, 0x77, 0x9b, 0xfa, 0x81, - 0xce, 0x5f, 0xf4, 0xf8, 0xf3, 0x48, 0x3c, 0xf1, 0x45, 0x38, 0x16, 0x3b, 0xa5, 0xe2, 0xa9, 0x01, - 0x33, 0x5d, 0x05, 0x53, 0x21, 0x2f, 0x1c, 0xe3, 0x5f, 0xa7, 0x61, 0x46, 0xa7, 0x75, 0xe8, 0x22, - 0x94, 0xb6, 0x1c, 0xb7, 0x4f, 0xfd, 0x91, 0xef, 0x28, 0x11, 0x64, 0x65, 0x9a, 0x67, 0x80, 0x89, - 0x39, 0x40, 0x4f, 0x41, 0x61, 0x1c, 0x50, 0xff, 0x4d, 0x47, 0xde, 0xf4, 0x62, 0xa7, 0xb6, 0x3b, - 0x69, 0xe5, 0x5f, 0x0d, 0xa8, 0xbf, 0xba, 0xcc, 0x83, 0xcf, 0x58, 0x3c, 0x11, 0xf9, 0xdf, 0x43, - 0x2f, 0x2b, 0x33, 0x15, 0x09, 0x5c, 0xe7, 0x2b, 0xfc, 0xf8, 0x09, 0x57, 0x37, 0xf2, 0xbd, 0x21, - 0x65, 0xdb, 0x74, 0x1c, 0xb4, 0xbb, 0xde, 0x70, 0xe8, 0xb9, 0x6d, 0xd1, 0x09, 0x10, 0x4c, 0xf3, - 0x08, 0xca, 0x97, 0x2b, 0xcb, 0xdd, 0x80, 0x02, 0xdb, 0xf6, 0xbd, 0x71, 0x7f, 0x5b, 0x04, 0x86, - 0x4c, 0xe7, 0xf2, 0xe1, 0xe9, 0x69, 0x0a, 0x44, 0x3f, 0xa0, 0xc7, 0xb9, 0xb4, 0x68, 0xf7, 0x4e, - 0x30, 0x1e, 0xca, 0xda, 0xb3, 0x93, 0xdb, 0x9b, 0xb4, 0xac, 0xa7, 0x48, 0x08, 0xc6, 0x8b, 0x50, - 0x89, 0xa5, 0xc2, 0xe8, 0x02, 0x64, 0x7d, 0xba, 0xa5, 0x5d, 0x01, 0xda, 0x9f, 0x31, 0xcb, 0xe8, - 0xcf, 0x71, 0x88, 0xf8, 0xc5, 0xdf, 0x4b, 0x43, 0xcb, 0xa8, 0xfa, 0xaf, 0x7a, 0xfe, 0x75, 0xca, - 0x7c, 0xa7, 0x7b, 0xc3, 0x1e, 0x52, 0x6d, 0x5e, 0x2d, 0x28, 0x0d, 0x05, 0xf0, 0x4d, 0xe3, 0x16, - 0xc1, 0x30, 0xc4, 0x43, 0x8f, 0x01, 0x88, 0x6b, 0x27, 0xe7, 0xe5, 0x85, 0x2a, 0x0a, 0x88, 0x98, - 0x5e, 0x8a, 0x09, 0xbb, 0x7d, 0x48, 0xe1, 0x28, 0x21, 0xaf, 0x26, 0x85, 0x7c, 0x68, 0x3a, 0xa1, - 0x64, 0xcd, 0xeb, 0x92, 0x8b, 0x5f, 0x17, 0xfc, 0x77, 0x0b, 0x9a, 0x6b, 0xfa, 0xe4, 0x0f, 0x28, - 0x0e, 0xcd, 0x6f, 0xfa, 0x21, 0xf1, 0x9b, 0x79, 0x88, 0xfc, 0x66, 0x13, 0xfc, 0x36, 0x01, 0xd6, - 0x1c, 0x97, 0x5e, 0x75, 0x06, 0x8c, 0xfa, 0x53, 0x8a, 0xa4, 0x1f, 0x64, 0x22, 0x8f, 0x43, 0xe8, - 0x96, 0x96, 0xc1, 0x92, 0xe1, 0xe6, 0x1f, 0x06, 0x8b, 0xe9, 0x87, 0xc8, 0x62, 0x26, 0xe1, 0x01, - 0x5d, 0x28, 0x6c, 0x09, 0xf6, 0x64, 0xc4, 0x8e, 0xf5, 0x9f, 0x22, 0xde, 0x3b, 0x5f, 0x53, 0x9b, - 0x3f, 0x7b, 0x9f, 0x84, 0x4b, 0x74, 0x05, 0xdb, 0xc1, 0x8e, 0xcb, 0xec, 0xb7, 0x8d, 0xf5, 0x44, - 0x6f, 0x82, 0x6c, 0x95, 0xd3, 0xe5, 0xa6, 0xe6, 0x74, 0x57, 0xd4, 0x36, 0xff, 0x4d, 0x5e, 0x87, - 0xaf, 0x44, 0x0e, 0x56, 0x28, 0x45, 0x39, 0xd8, 0x27, 0xee, 0x77, 0xfd, 0xd5, 0xa5, 0xff, 0xbd, - 0x05, 0xd5, 0x15, 0xca, 0xe2, 0x39, 0xd6, 0x23, 0xa4, 0x52, 0xfc, 0x12, 0x1c, 0x35, 0xce, 0xaf, - 0xb8, 0x7f, 0x3a, 0x91, 0x58, 0x1d, 0x8f, 0xf8, 0x5f, 0x75, 0x7b, 0xf4, 0x6d, 0x55, 0xaf, 0xc6, - 0x73, 0xaa, 0x5b, 0x50, 0x32, 0x26, 0xd1, 0x62, 0x22, 0x9b, 0x3a, 0x96, 0x68, 0xd3, 0xf2, 0x8c, - 0xa0, 0x53, 0x53, 0x3c, 0xc9, 0xaa, 0x54, 0xe5, 0xca, 0x61, 0xe6, 0xb1, 0x0e, 0x48, 0xa8, 0x4b, - 0x90, 0x35, 0x63, 0x9f, 0x80, 0xbe, 0x1c, 0xa6, 0x55, 0xe1, 0x18, 0x3d, 0x0e, 0x59, 0xdf, 0xbb, - 0xa7, 0xd3, 0xe4, 0x4a, 0xb4, 0x25, 0xf1, 0xee, 0x11, 0x31, 0x85, 0x9f, 0x87, 0x0c, 0xf1, 0xee, - 0xa1, 0x26, 0x80, 0x6f, 0xbb, 0x7d, 0x7a, 0x3b, 0x2c, 0xd0, 0xca, 0xc4, 0x80, 0x1c, 0x90, 0x97, - 0x2c, 0xc1, 0x51, 0xf3, 0x44, 0x52, 0xdd, 0xf3, 0x50, 0x78, 0x65, 0x6c, 0x8a, 0xab, 0x96, 0x10, - 0x97, 0xec, 0x03, 0x68, 0x24, 0x6e, 0x33, 0x10, 0xc1, 0xd1, 0x69, 0x28, 0x32, 0x7b, 0x73, 0x40, - 0x6f, 0x44, 0x2e, 0x30, 0x02, 0xf0, 0x59, 0x5e, 0x5b, 0xde, 0x36, 0x12, 0xac, 0x08, 0x80, 0xce, - 0x42, 0x35, 0x3a, 0xf3, 0x2d, 0x9f, 0x6e, 0x39, 0x6f, 0x0b, 0x0d, 0x97, 0xc9, 0x3e, 0x38, 0x3a, - 0x03, 0x47, 0x22, 0xd8, 0xba, 0x48, 0x64, 0xb2, 0x02, 0x35, 0x09, 0xe6, 0xb2, 0x11, 0xec, 0xbe, - 0x78, 0x77, 0x6c, 0x0f, 0xc4, 0xe5, 0x2b, 0x13, 0x03, 0x82, 0xff, 0x60, 0xc1, 0x51, 0xa9, 0x6a, - 0x66, 0xb3, 0x47, 0xd2, 0xea, 0x7f, 0x6e, 0x01, 0x32, 0x39, 0x50, 0xa6, 0xf5, 0xff, 0x66, 0x9f, - 0x89, 0x67, 0x4a, 0x25, 0x51, 0x32, 0x4b, 0x50, 0xd4, 0x2a, 0xc2, 0x90, 0xef, 0xca, 0x7e, 0x9a, - 0x68, 0x8c, 0xcb, 0x9a, 0x5c, 0x42, 0x88, 0xfa, 0x47, 0x2d, 0xc8, 0x6d, 0xee, 0x30, 0x1a, 0xa8, - 0x8a, 0x5a, 0xb4, 0x12, 0x04, 0x80, 0xc8, 0x3f, 0xbe, 0x17, 0x75, 0x99, 0xb0, 0x9a, 0x6c, 0xb4, - 0x97, 0x02, 0x11, 0xfd, 0x80, 0x7f, 0x99, 0x86, 0xca, 0x6d, 0x6f, 0x30, 0x8e, 0x82, 0xe6, 0xa3, - 0x14, 0x30, 0x62, 0x65, 0x7e, 0x4e, 0x97, 0xf9, 0x08, 0xb2, 0x01, 0xa3, 0x23, 0x61, 0x59, 0x19, - 0x22, 0x9e, 0x11, 0x86, 0x32, 0xb3, 0xfd, 0x3e, 0x65, 0xb2, 0x78, 0xaa, 0xe7, 0x45, 0x56, 0x1b, - 0x83, 0xa1, 0x39, 0x28, 0xd9, 0xfd, 0xbe, 0x4f, 0xfb, 0x36, 0xa3, 0x9d, 0x9d, 0x7a, 0x41, 0x6c, - 0x66, 0x82, 0xf0, 0xeb, 0x30, 0xab, 0x85, 0xa5, 0x54, 0x7a, 0x01, 0x0a, 0x6f, 0x09, 0xc8, 0x94, - 0xb6, 0x9b, 0x44, 0x55, 0x6e, 0x4c, 0xa3, 0xc5, 0x5f, 0x2f, 0xe8, 0x33, 0xe3, 0x6b, 0x90, 0x97, - 0xe8, 0xe8, 0xb4, 0x59, 0x02, 0xc9, 0x2c, 0x90, 0x8f, 0x55, 0x3d, 0x83, 0x21, 0x2f, 0x09, 0x29, - 0xc5, 0x0b, 0xdb, 0x90, 0x10, 0xa2, 0xfe, 0xf1, 0x3f, 0x2c, 0x38, 0xbe, 0x4c, 0x19, 0xed, 0x32, - 0xda, 0xbb, 0xea, 0xd0, 0x41, 0xef, 0x73, 0xad, 0xce, 0xc3, 0x1e, 0x5b, 0xc6, 0xe8, 0xb1, 0x71, - 0xbf, 0x33, 0x70, 0x5c, 0xba, 0x66, 0x34, 0x69, 0x22, 0x00, 0xf7, 0x10, 0x5b, 0xfc, 0xe0, 0x72, - 0x5a, 0xbe, 0xcf, 0x31, 0x20, 0xa1, 0x86, 0xf3, 0x91, 0x86, 0xf1, 0x77, 0x2c, 0x38, 0x91, 0xe4, - 0x5a, 0x29, 0xa9, 0x0d, 0x79, 0xb1, 0x78, 0x4a, 0x7b, 0x37, 0xb6, 0x82, 0x28, 0x34, 0x74, 0x29, - 0xb6, 0xbf, 0x78, 0x0f, 0xd4, 0xa9, 0xef, 0x4d, 0x5a, 0xb5, 0x08, 0x6a, 0x74, 0x10, 0x0c, 0x5c, - 0xfc, 0x5b, 0x5e, 0x67, 0x9b, 0x34, 0x85, 0xbe, 0xb9, 0x7d, 0x29, 0xdf, 0x2b, 0x07, 0xe8, 0x4b, - 0x90, 0x65, 0x3b, 0x23, 0xe5, 0x72, 0x3b, 0xc7, 0x3f, 0x9d, 0xb4, 0x8e, 0xc6, 0x96, 0x6d, 0xec, - 0x8c, 0x28, 0x11, 0x28, 0xdc, 0x2c, 0xbb, 0xb6, 0xdf, 0x73, 0x5c, 0x7b, 0xe0, 0x30, 0x29, 0xc6, - 0x2c, 0x31, 0x41, 0xa8, 0x0e, 0x85, 0x91, 0xed, 0x07, 0x3a, 0x6f, 0x2a, 0x12, 0x3d, 0x14, 0x2d, - 0x90, 0x3b, 0x94, 0x75, 0xb7, 0xa5, 0x9b, 0x55, 0x2d, 0x10, 0x01, 0x89, 0xb5, 0x40, 0x04, 0x04, - 0xff, 0xd4, 0x30, 0x1c, 0x79, 0x27, 0xbe, 0x70, 0x86, 0x83, 0xbf, 0x11, 0x69, 0x59, 0x1f, 0x51, - 0x69, 0xf9, 0x05, 0x98, 0xed, 0xc5, 0x66, 0x0e, 0xd6, 0xb6, 0x6c, 0xef, 0x26, 0xd0, 0xf1, 0x38, - 0x52, 0x9d, 0x80, 0x1c, 0xa0, 0xba, 0x84, 0x3e, 0xd2, 0xfb, 0xf5, 0x11, 0x49, 0x3d, 0xf3, 0x19, - 0xa4, 0xfe, 0x57, 0x0b, 0xaa, 0x51, 0xda, 0xa8, 0x04, 0x5e, 0x8b, 0xb5, 0x3d, 0xf5, 0xad, 0x79, - 0x94, 0x5f, 0x4d, 0xe2, 0xef, 0x5a, 0x2a, 0xbb, 0x91, 0x7c, 0x2a, 0xad, 0x2d, 0x40, 0xc1, 0xa7, - 0xc1, 0x78, 0xc0, 0xb4, 0xba, 0xea, 0x46, 0x5b, 0x6c, 0xbc, 0xa9, 0xdf, 0x71, 0x8c, 0x07, 0x8c, - 0x68, 0x44, 0x74, 0x05, 0x2a, 0x43, 0xea, 0xf7, 0xe9, 0x3a, 0xf3, 0x6d, 0x46, 0xfb, 0x52, 0x07, - 0xb3, 0xa6, 0xa2, 0xaf, 0x9b, 0xd3, 0x24, 0x8e, 0x8d, 0x7f, 0x65, 0xc1, 0x6c, 0x9c, 0xf4, 0x17, - 0xc8, 0x31, 0x4e, 0xed, 0x5c, 0x9f, 0x7d, 0x02, 0x8a, 0xa1, 0x4c, 0x51, 0x09, 0x0a, 0x57, 0x6f, - 0x92, 0xd7, 0x16, 0xc9, 0x72, 0x35, 0x85, 0xca, 0x30, 0xd3, 0x59, 0x5c, 0x7a, 0x59, 0x8c, 0xac, - 0xb3, 0x17, 0xa0, 0x12, 0x63, 0x1d, 0x55, 0xa0, 0xb8, 0x76, 0x73, 0x65, 0x7d, 0x83, 0xbc, 0xb8, - 0x78, 0xbd, 0x9a, 0x42, 0x05, 0xc8, 0xac, 0xbf, 0x7a, 0xbd, 0x6a, 0xf1, 0x87, 0xc5, 0xdb, 0x2b, - 0xd5, 0xf4, 0xc2, 0x3f, 0xf3, 0x3a, 0xbd, 0xf4, 0xd1, 0x57, 0x21, 0x27, 0x73, 0xc6, 0x13, 0x91, - 0x24, 0xcd, 0x77, 0xa7, 0x8d, 0x93, 0xfb, 0xe0, 0x52, 0x8b, 0x38, 0x75, 0xc1, 0x42, 0x37, 0xa0, - 0x24, 0x80, 0xea, 0xed, 0xc4, 0xe9, 0xe4, 0x4b, 0x82, 0x18, 0xa5, 0xc7, 0x0e, 0x98, 0x35, 0xe8, - 0x5d, 0x86, 0x9c, 0xbc, 0x86, 0x27, 0x12, 0xa9, 0xfd, 0x94, 0xd3, 0xc4, 0xde, 0xd7, 0xe0, 0x14, - 0x7a, 0x0e, 0xb2, 0x1b, 0xb6, 0x33, 0x40, 0x46, 0x65, 0x61, 0xbc, 0x54, 0x68, 0x9c, 0x48, 0x82, - 0x8d, 0x6d, 0xaf, 0x84, 0xef, 0x46, 0x4e, 0x26, 0x1b, 0xb4, 0x7a, 0x79, 0x7d, 0xff, 0x44, 0xb8, - 0xf3, 0x4d, 0xd9, 0xc1, 0xd7, 0x6d, 0x42, 0xf4, 0x58, 0x7c, 0xab, 0x44, 0x57, 0xb1, 0xd1, 0x3c, - 0x68, 0x3a, 0x24, 0xb8, 0x06, 0x25, 0xa3, 0x45, 0x67, 0x8a, 0x75, 0x7f, 0x7f, 0xd1, 0x14, 0xeb, - 0x94, 0xbe, 0x1e, 0x4e, 0xa1, 0x15, 0x98, 0xe1, 0xf5, 0x98, 0x78, 0x95, 0x77, 0x2a, 0x59, 0x76, - 0x19, 0xe9, 0x76, 0xe3, 0xf4, 0xf4, 0xc9, 0x90, 0xd0, 0xd7, 0xa1, 0xb8, 0x42, 0x99, 0xca, 0x59, - 0x4e, 0x26, 0x93, 0x9e, 0x29, 0x92, 0x8a, 0x27, 0x4e, 0x38, 0x85, 0x5e, 0x17, 0xa5, 0x61, 0x3c, - 0x64, 0xa3, 0xd6, 0x01, 0xa1, 0x39, 0x3c, 0xd7, 0xdc, 0xc1, 0x08, 0x21, 0xe5, 0xd7, 0x62, 0x94, - 0x55, 0x76, 0xd7, 0x3a, 0x20, 0x0c, 0x84, 0x94, 0x5b, 0xf7, 0xf9, 0xd0, 0x07, 0xa7, 0xd0, 0x2a, - 0x94, 0x57, 0x28, 0x0b, 0x9d, 0x18, 0x6a, 0x24, 0xee, 0x83, 0xe1, 0xc1, 0x1b, 0xa7, 0xa6, 0xce, - 0x69, 0x52, 0x0b, 0x6f, 0xe8, 0xcf, 0x66, 0x96, 0x6d, 0x66, 0xa3, 0x9b, 0x30, 0x2b, 0xd4, 0x12, - 0x7e, 0x57, 0x13, 0xbb, 0x3e, 0xfb, 0x3e, 0xe2, 0x89, 0x5d, 0x9f, 0xfd, 0x1f, 0xf3, 0xe0, 0x54, - 0xe7, 0x8d, 0xf7, 0x3f, 0x6a, 0xa6, 0x3e, 0xf8, 0xa8, 0x99, 0xfa, 0xe4, 0xa3, 0xa6, 0xf5, 0xed, - 0xdd, 0xa6, 0xf5, 0x8b, 0xdd, 0xa6, 0xf5, 0xde, 0x6e, 0xd3, 0x7a, 0x7f, 0xb7, 0x69, 0xfd, 0x65, - 0xb7, 0x69, 0xfd, 0x6d, 0xb7, 0x99, 0xfa, 0x64, 0xb7, 0x69, 0xbd, 0xf3, 0x71, 0x33, 0xf5, 0xfe, - 0xc7, 0xcd, 0xd4, 0x07, 0x1f, 0x37, 0x53, 0xdf, 0x7c, 0xf2, 0xfe, 0x1d, 0x15, 0xe9, 0xd7, 0xf2, - 0xe2, 0xef, 0xe9, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x64, 0xe8, 0x9b, 0xda, 0xdc, 0x25, 0x00, - 0x00, + 0xb9, 0x5c, 0xfe, 0x8a, 0x1f, 0x45, 0x99, 0x1e, 0xd1, 0x32, 0x21, 0x3b, 0xa4, 0x32, 0x78, 0x2f, + 0xf1, 0xb3, 0x1d, 0xd1, 0x56, 0x5e, 0xf2, 0x1c, 0xe7, 0xb9, 0xa9, 0x28, 0xc5, 0x8a, 0x1d, 0xf9, + 0x27, 0x23, 0xc5, 0x49, 0x8b, 0x06, 0xc1, 0x8a, 0x1c, 0x51, 0x0b, 0x91, 0xbb, 0xf4, 0xee, 0x30, + 0x8e, 0x6e, 0x05, 0x0a, 0xe4, 0x56, 0x34, 0x40, 0x0f, 0x6d, 0x2f, 0x05, 0x0a, 0x14, 0x68, 0xd1, + 0x22, 0x97, 0xa2, 0xa7, 0xa2, 0x68, 0x2f, 0x3d, 0xa4, 0xb7, 0x1c, 0x83, 0x1c, 0xd8, 0x46, 0xb9, + 0x14, 0x02, 0x0a, 0x04, 0x28, 0xd0, 0x43, 0x2e, 0x2d, 0xe6, 0x6f, 0x77, 0x76, 0x45, 0xd5, 0xa6, + 0xeb, 0x22, 0xf1, 0x85, 0xdc, 0xf9, 0xe6, 0x9b, 0x6f, 0xe6, 0xfb, 0x99, 0xef, 0x6f, 0x17, 0x4e, + 0x0d, 0x76, 0xbb, 0xcd, 0x9e, 0xd7, 0x1d, 0xf8, 0x1e, 0xf3, 0xc2, 0x87, 0x45, 0xf1, 0x8b, 0xa6, + 0xf4, 0x78, 0xbe, 0xda, 0xf5, 0xba, 0x9e, 0xc4, 0xe1, 0x4f, 0x72, 0x7e, 0xbe, 0xd1, 0xf5, 0xbc, + 0x6e, 0x8f, 0x36, 0xc5, 0x68, 0x6b, 0xb8, 0xdd, 0x64, 0x4e, 0x9f, 0x06, 0xcc, 0xee, 0x0f, 0x14, + 0xc2, 0x82, 0xa2, 0x7e, 0xb7, 0xd7, 0xf7, 0x3a, 0xb4, 0xd7, 0x0c, 0x98, 0xcd, 0x02, 0xf9, 0xab, + 0x30, 0x66, 0x39, 0xc6, 0x60, 0x18, 0xec, 0x88, 0x1f, 0x09, 0xc4, 0xbf, 0xb6, 0xe0, 0xc4, 0xba, + 0xbd, 0x45, 0x7b, 0x9b, 0xde, 0x1d, 0xbb, 0x37, 0xa4, 0x01, 0xa1, 0xc1, 0xc0, 0x73, 0x03, 0x8a, + 0x56, 0x20, 0xdf, 0xe3, 0x13, 0x41, 0xcd, 0x5a, 0xc8, 0x9c, 0x29, 0x2d, 0x9d, 0x5b, 0x0c, 0x8f, + 0x3c, 0x76, 0x81, 0x84, 0x06, 0x2f, 0xbb, 0xcc, 0xdf, 0x23, 0x6a, 0xe9, 0xfc, 0x1d, 0x28, 0x19, + 0x60, 0x54, 0x81, 0xcc, 0x2e, 0xdd, 0xab, 0x59, 0x0b, 0xd6, 0x99, 0x22, 0xe1, 0x8f, 0xe8, 0x22, + 0xe4, 0xde, 0xe1, 0x64, 0x6a, 0xe9, 0x05, 0xeb, 0x4c, 0x69, 0xe9, 0x54, 0xb4, 0xc9, 0xeb, 0xae, + 0x73, 0x77, 0x48, 0xc5, 0x6a, 0xb5, 0x91, 0xc4, 0xbc, 0x9c, 0xbe, 0x64, 0xe1, 0x73, 0x70, 0xfc, + 0xd0, 0x3c, 0x9a, 0x83, 0xbc, 0xc0, 0x90, 0x27, 0x2e, 0x12, 0x35, 0xc2, 0x55, 0x40, 0x1b, 0xcc, + 0xa7, 0x76, 0x9f, 0xd8, 0x8c, 0x9f, 0xf7, 0xee, 0x90, 0x06, 0x0c, 0xdf, 0x80, 0xd9, 0x18, 0x54, + 0xb1, 0xfd, 0x3c, 0x94, 0x82, 0x08, 0xac, 0x78, 0xaf, 0x46, 0xc7, 0x8a, 0xd6, 0x10, 0x13, 0x11, + 0xff, 0xd8, 0x02, 0x88, 0xe6, 0x50, 0x1d, 0x40, 0xce, 0xbe, 0x62, 0x07, 0x3b, 0x82, 0xe1, 0x2c, + 0x31, 0x20, 0xe8, 0x3c, 0x1c, 0x8f, 0x46, 0x37, 0xbd, 0x8d, 0x1d, 0xdb, 0xef, 0x08, 0x19, 0x64, + 0xc9, 0xe1, 0x09, 0x84, 0x20, 0xeb, 0xdb, 0x8c, 0xd6, 0x32, 0x0b, 0xd6, 0x99, 0x0c, 0x11, 0xcf, + 0x9c, 0x5b, 0x46, 0x5d, 0xdb, 0x65, 0xb5, 0xac, 0x10, 0xa7, 0x1a, 0x71, 0x38, 0xd7, 0x2f, 0x0d, + 0x6a, 0xb9, 0x05, 0xeb, 0x4c, 0x99, 0xa8, 0x11, 0xfe, 0x7b, 0x06, 0xa6, 0x5f, 0x1b, 0x52, 0x7f, + 0x4f, 0x09, 0x00, 0xd5, 0x61, 0x2a, 0xa0, 0x3d, 0xda, 0x66, 0x9e, 0x2f, 0x35, 0xd2, 0x4a, 0xd7, + 0x2c, 0x12, 0xc2, 0x50, 0x15, 0x72, 0x3d, 0xa7, 0xef, 0x30, 0x71, 0xac, 0x32, 0x91, 0x03, 0x74, + 0x19, 0x72, 0x01, 0xb3, 0x7d, 0x26, 0xce, 0x52, 0x5a, 0x9a, 0x5f, 0x94, 0x86, 0xb9, 0xa8, 0x0d, + 0x73, 0x71, 0x53, 0x1b, 0x66, 0x6b, 0xea, 0xc3, 0x51, 0x23, 0xf5, 0xfe, 0x9f, 0x1a, 0x16, 0x91, + 0x4b, 0xd0, 0xf3, 0x90, 0xa1, 0x6e, 0x47, 0x9c, 0xf7, 0x41, 0x57, 0xf2, 0x05, 0xe8, 0x22, 0x14, + 0x3b, 0x8e, 0x4f, 0xdb, 0xcc, 0xf1, 0x5c, 0xc1, 0xd5, 0xcc, 0xd2, 0x6c, 0xa4, 0x91, 0x55, 0x3d, + 0x45, 0x22, 0x2c, 0x74, 0x1e, 0xf2, 0x01, 0x17, 0x5d, 0x50, 0x2b, 0x70, 0x5b, 0x68, 0x55, 0x0f, + 0x46, 0x8d, 0x8a, 0x84, 0x9c, 0xf7, 0xfa, 0x0e, 0xa3, 0xfd, 0x01, 0xdb, 0x23, 0x0a, 0x07, 0x9d, + 0x85, 0x42, 0x87, 0xf6, 0x28, 0x57, 0xf8, 0x94, 0x50, 0x78, 0xc5, 0x20, 0x2f, 0x26, 0x88, 0x46, + 0x40, 0x6f, 0x41, 0x76, 0xd0, 0xb3, 0xdd, 0x5a, 0x51, 0x70, 0x31, 0x13, 0x21, 0xde, 0xee, 0xd9, + 0x6e, 0xeb, 0x85, 0x4f, 0x46, 0x8d, 0xe7, 0xba, 0x0e, 0xdb, 0x19, 0x6e, 0x2d, 0xb6, 0xbd, 0x7e, + 0xb3, 0xeb, 0xdb, 0xdb, 0xb6, 0x6b, 0x37, 0x7b, 0xde, 0xae, 0xd3, 0x7c, 0xe7, 0xd9, 0x26, 0xbf, + 0x83, 0x77, 0x87, 0xd4, 0x77, 0xa8, 0xdf, 0xe4, 0x64, 0x16, 0x85, 0x4a, 0xf8, 0x52, 0x22, 0xc8, + 0xa2, 0xeb, 0xdc, 0xfe, 0x3c, 0x9f, 0xae, 0xec, 0x0c, 0xdd, 0xdd, 0xa0, 0x06, 0x62, 0x97, 0x93, + 0xd1, 0x2e, 0x02, 0x4e, 0xe8, 0xf6, 0x9a, 0xef, 0x0d, 0x07, 0xad, 0x63, 0x07, 0xa3, 0x86, 0x89, + 0x4f, 0xcc, 0xc1, 0xf5, 0xec, 0x54, 0xbe, 0x52, 0xc0, 0x1f, 0x64, 0x00, 0x6d, 0xd8, 0xfd, 0x41, + 0x8f, 0x4e, 0xa4, 0xfe, 0x50, 0xd1, 0xe9, 0x87, 0x56, 0x74, 0x66, 0x52, 0x45, 0x47, 0x5a, 0xcb, + 0x4e, 0xa6, 0xb5, 0xdc, 0x83, 0x6a, 0x2d, 0xff, 0x95, 0xd7, 0x1a, 0xae, 0x41, 0x96, 0x53, 0xe6, + 0xce, 0xd2, 0xb7, 0xef, 0x09, 0xdd, 0x4c, 0x13, 0xfe, 0x88, 0xd7, 0x21, 0x2f, 0xf9, 0x42, 0xf3, + 0x49, 0xe5, 0xc5, 0xef, 0x6d, 0xa4, 0xb8, 0x8c, 0x56, 0x49, 0x25, 0x52, 0x49, 0x46, 0x08, 0x1b, + 0xff, 0xd6, 0x82, 0xb2, 0xb2, 0x08, 0xe5, 0xfb, 0xb6, 0xa0, 0x20, 0x7d, 0x8f, 0xf6, 0x7b, 0x27, + 0x93, 0x7e, 0x6f, 0xb9, 0x63, 0x0f, 0x18, 0xf5, 0x5b, 0xcd, 0x0f, 0x47, 0x0d, 0xeb, 0x93, 0x51, + 0xe3, 0xe9, 0xa3, 0x84, 0xa6, 0x63, 0x8d, 0xf6, 0x97, 0x9a, 0x30, 0x3a, 0x27, 0x4e, 0xc7, 0x02, + 0x65, 0x56, 0xc7, 0x16, 0x65, 0x88, 0xba, 0xe6, 0x76, 0x69, 0xc0, 0x29, 0x67, 0xb9, 0x45, 0x10, + 0x89, 0xc3, 0xd9, 0xbc, 0x67, 0xfb, 0xae, 0xe3, 0x76, 0x83, 0x5a, 0x46, 0xf8, 0xf4, 0x70, 0x8c, + 0x7f, 0x68, 0xc1, 0x6c, 0xcc, 0xac, 0x15, 0x13, 0x97, 0x20, 0x1f, 0x70, 0x4d, 0x69, 0x1e, 0x0c, + 0xa3, 0xd8, 0x10, 0xf0, 0xd6, 0x8c, 0x3a, 0x7c, 0x5e, 0x8e, 0x89, 0xc2, 0x7f, 0x74, 0x47, 0xfb, + 0x83, 0x05, 0xd3, 0x22, 0x30, 0xe9, 0xbb, 0x86, 0x20, 0xeb, 0xda, 0x7d, 0xaa, 0x54, 0x25, 0x9e, + 0x8d, 0x68, 0xc5, 0xb7, 0x9b, 0xd2, 0xd1, 0x6a, 0x52, 0x07, 0x6b, 0x3d, 0xb4, 0x83, 0xb5, 0xa2, + 0x7b, 0x57, 0x85, 0x1c, 0x37, 0xef, 0x3d, 0xe1, 0x5c, 0x8b, 0x44, 0x0e, 0xf0, 0xd3, 0x50, 0x56, + 0x5c, 0x28, 0xd1, 0x1e, 0x15, 0x60, 0xfb, 0x90, 0x97, 0x9a, 0x40, 0xff, 0x05, 0xc5, 0x30, 0x31, + 0x11, 0xdc, 0x66, 0x5a, 0xf9, 0x83, 0x51, 0x23, 0xcd, 0x02, 0x12, 0x4d, 0xa0, 0x86, 0x19, 0xf4, + 0xad, 0x56, 0xf1, 0x60, 0xd4, 0x90, 0x00, 0x15, 0xe2, 0xd1, 0x69, 0xc8, 0xee, 0xf0, 0xb8, 0xc9, + 0x45, 0x90, 0x6d, 0x4d, 0x1d, 0x8c, 0x1a, 0x62, 0x4c, 0xc4, 0x2f, 0x5e, 0x83, 0xe9, 0x75, 0xda, + 0xb5, 0xdb, 0x7b, 0x6a, 0xd3, 0xaa, 0x26, 0xc7, 0x37, 0xb4, 0x34, 0x8d, 0x27, 0x61, 0x3a, 0xdc, + 0xf1, 0xed, 0x7e, 0xa0, 0x6e, 0x43, 0x29, 0x84, 0xdd, 0x08, 0xf0, 0x8f, 0x2c, 0x50, 0x36, 0x80, + 0xb0, 0x91, 0xed, 0x70, 0x5f, 0x08, 0x07, 0xa3, 0x86, 0x82, 0xe8, 0x64, 0x06, 0xbd, 0x08, 0x85, + 0x40, 0xec, 0xc8, 0x89, 0x25, 0x4d, 0x4b, 0x4c, 0xb4, 0x8e, 0x71, 0x13, 0x39, 0x18, 0x35, 0x34, + 0x22, 0xd1, 0x0f, 0x68, 0x31, 0x96, 0x10, 0x48, 0xc6, 0x66, 0x0e, 0x46, 0x0d, 0x03, 0x6a, 0x26, + 0x08, 0xf8, 0x0b, 0x0b, 0x4a, 0x9b, 0xb6, 0x13, 0x9a, 0x50, 0x4d, 0xab, 0x28, 0xf2, 0xd5, 0x12, + 0xc0, 0x2d, 0xb1, 0x43, 0x7b, 0xf6, 0xde, 0x55, 0xcf, 0x17, 0x74, 0xcb, 0x24, 0x1c, 0x47, 0x31, + 0x3c, 0x3b, 0x36, 0x86, 0xe7, 0x26, 0x77, 0xed, 0xff, 0x59, 0x47, 0x7a, 0x3d, 0x3b, 0x95, 0xae, + 0x64, 0xf0, 0x07, 0x16, 0x4c, 0x4b, 0xe6, 0x95, 0xe5, 0x7d, 0x0b, 0xf2, 0x52, 0x36, 0x82, 0xfd, + 0x7f, 0xe1, 0x98, 0xce, 0x4d, 0xe2, 0x94, 0x14, 0x4d, 0xf4, 0x12, 0xcc, 0x74, 0x7c, 0x6f, 0x30, + 0xa0, 0x9d, 0x0d, 0xe5, 0xfe, 0xd2, 0x49, 0xf7, 0xb7, 0x6a, 0xce, 0x93, 0x04, 0x3a, 0xfe, 0xa3, + 0x05, 0x65, 0xe5, 0x4c, 0x94, 0xba, 0x42, 0x11, 0x5b, 0x0f, 0x1d, 0x3d, 0xd3, 0x93, 0x46, 0xcf, + 0x39, 0xc8, 0x77, 0x79, 0x7c, 0xd1, 0x0e, 0x49, 0x8d, 0x26, 0x8b, 0xaa, 0xf8, 0x3a, 0xcc, 0x68, + 0x56, 0x8e, 0xf0, 0xa8, 0xf3, 0x49, 0x8f, 0x7a, 0xad, 0x43, 0x5d, 0xe6, 0x6c, 0x3b, 0xa1, 0x8f, + 0x54, 0xf8, 0xf8, 0x7b, 0x16, 0x54, 0x92, 0x28, 0x68, 0x35, 0x51, 0x58, 0x3c, 0x75, 0x34, 0x39, + 0xb3, 0xa6, 0xd0, 0xa4, 0x55, 0x65, 0xf1, 0xdc, 0xfd, 0x2a, 0x8b, 0xaa, 0xe9, 0x64, 0x8a, 0xca, + 0x2b, 0xe0, 0x1f, 0x58, 0x50, 0x8e, 0xe9, 0x12, 0x5d, 0x82, 0xec, 0xb6, 0xef, 0xf5, 0x27, 0x52, + 0x94, 0x58, 0x81, 0xfe, 0x17, 0xd2, 0xcc, 0x9b, 0x48, 0x4d, 0x69, 0xe6, 0x71, 0x2d, 0x29, 0xf6, + 0x33, 0x32, 0x6f, 0x97, 0x23, 0xfc, 0x1c, 0x14, 0x05, 0x43, 0xb7, 0x6d, 0xc7, 0x1f, 0x1b, 0x30, + 0xc6, 0x33, 0xf4, 0x22, 0x1c, 0x93, 0xce, 0x70, 0xfc, 0xe2, 0xe9, 0x71, 0x8b, 0xa7, 0xf5, 0xe2, + 0x53, 0x90, 0x13, 0x49, 0x07, 0x5f, 0xd2, 0xb1, 0x99, 0xad, 0x97, 0xf0, 0x67, 0x7c, 0x02, 0x66, + 0xf9, 0x1d, 0xa4, 0x7e, 0xb0, 0xe2, 0x0d, 0x5d, 0xa6, 0xeb, 0xa6, 0xf3, 0x50, 0x8d, 0x83, 0x95, + 0x95, 0x54, 0x21, 0xd7, 0xe6, 0x00, 0x41, 0xa3, 0x4c, 0xe4, 0x00, 0xff, 0xd4, 0x02, 0xb4, 0x46, + 0x99, 0xd8, 0xe5, 0xda, 0x6a, 0x78, 0x3d, 0xe6, 0x61, 0xaa, 0x6f, 0xb3, 0xf6, 0x0e, 0xf5, 0x03, + 0x9d, 0xbf, 0xe8, 0xf1, 0x97, 0x91, 0x78, 0xe2, 0x8b, 0x30, 0x1b, 0x3b, 0xa5, 0xe2, 0x69, 0x1e, + 0xa6, 0xda, 0x0a, 0xa6, 0x42, 0x5e, 0x38, 0xc6, 0xbf, 0x4a, 0xc3, 0x94, 0x4e, 0xeb, 0xd0, 0x45, + 0x28, 0x6d, 0x3b, 0x6e, 0x97, 0xfa, 0x03, 0xdf, 0x51, 0x22, 0xc8, 0xca, 0x34, 0xcf, 0x00, 0x13, + 0x73, 0x80, 0x9e, 0x81, 0xc2, 0x30, 0xa0, 0xfe, 0xdb, 0x8e, 0xbc, 0xe9, 0xc5, 0x56, 0x75, 0x7f, + 0xd4, 0xc8, 0xbf, 0x1e, 0x50, 0xff, 0xda, 0x2a, 0x0f, 0x3e, 0x43, 0xf1, 0x44, 0xe4, 0x7f, 0x07, + 0xbd, 0xaa, 0xcc, 0x54, 0x24, 0x70, 0xad, 0xff, 0xe3, 0xc7, 0x4f, 0xb8, 0xba, 0x81, 0xef, 0xf5, + 0x29, 0xdb, 0xa1, 0xc3, 0xa0, 0xd9, 0xf6, 0xfa, 0x7d, 0xcf, 0x6d, 0x8a, 0x4e, 0x80, 0x60, 0x9a, + 0x47, 0x50, 0xbe, 0x5c, 0x59, 0xee, 0x26, 0x14, 0xd8, 0x8e, 0xef, 0x0d, 0xbb, 0x3b, 0x22, 0x30, + 0x64, 0x5a, 0x97, 0x27, 0xa7, 0xa7, 0x29, 0x10, 0xfd, 0x80, 0x9e, 0xe4, 0xd2, 0xa2, 0xed, 0xdd, + 0x60, 0xd8, 0x97, 0xb5, 0x67, 0x2b, 0x77, 0x30, 0x6a, 0x58, 0xcf, 0x90, 0x10, 0x8c, 0x97, 0xa1, + 0x1c, 0x4b, 0x85, 0xd1, 0x05, 0xc8, 0xfa, 0x74, 0x5b, 0xbb, 0x02, 0x74, 0x38, 0x63, 0x96, 0xd1, + 0x9f, 0xe3, 0x10, 0xf1, 0x8b, 0xbf, 0x9b, 0x86, 0x86, 0x51, 0xf5, 0x5f, 0xf5, 0xfc, 0x1b, 0x94, + 0xf9, 0x4e, 0xfb, 0xa6, 0xdd, 0xa7, 0xda, 0xbc, 0x1a, 0x50, 0xea, 0x0b, 0xe0, 0xdb, 0xc6, 0x2d, + 0x82, 0x7e, 0x88, 0x87, 0x9e, 0x00, 0x10, 0xd7, 0x4e, 0xce, 0xcb, 0x0b, 0x55, 0x14, 0x10, 0x31, + 0xbd, 0x12, 0x13, 0x76, 0x73, 0x42, 0xe1, 0x28, 0x21, 0x5f, 0x4b, 0x0a, 0x79, 0x62, 0x3a, 0xa1, + 0x64, 0xcd, 0xeb, 0x92, 0x8b, 0x5f, 0x17, 0xfc, 0x57, 0x0b, 0xea, 0xeb, 0xfa, 0xe4, 0x0f, 0x29, + 0x0e, 0xcd, 0x6f, 0xfa, 0x11, 0xf1, 0x9b, 0x79, 0x84, 0xfc, 0x66, 0x13, 0xfc, 0xd6, 0x01, 0xd6, + 0x1d, 0x97, 0x5e, 0x75, 0x7a, 0x8c, 0xfa, 0x63, 0x8a, 0xa4, 0xef, 0x67, 0x22, 0x8f, 0x43, 0xe8, + 0xb6, 0x96, 0xc1, 0x8a, 0xe1, 0xe6, 0x1f, 0x05, 0x8b, 0xe9, 0x47, 0xc8, 0x62, 0x26, 0xe1, 0x01, + 0x5d, 0x28, 0x6c, 0x0b, 0xf6, 0x64, 0xc4, 0x8e, 0xf5, 0x9f, 0x22, 0xde, 0x5b, 0x5f, 0x53, 0x9b, + 0x3f, 0x7f, 0x9f, 0x84, 0x4b, 0x74, 0x05, 0x9b, 0xc1, 0x9e, 0xcb, 0xec, 0x77, 0x8d, 0xf5, 0x44, + 0x6f, 0x82, 0x6c, 0x95, 0xd3, 0xe5, 0xc6, 0xe6, 0x74, 0x57, 0xd4, 0x36, 0xff, 0x4e, 0x5e, 0x87, + 0xaf, 0x44, 0x0e, 0x56, 0x28, 0x45, 0x39, 0xd8, 0xa7, 0xee, 0x77, 0xfd, 0xd5, 0xa5, 0xff, 0x9d, + 0x05, 0x95, 0x35, 0xca, 0xe2, 0x39, 0xd6, 0x63, 0xa4, 0x52, 0xfc, 0x0a, 0x1c, 0x37, 0xce, 0xaf, + 0xb8, 0x7f, 0x36, 0x91, 0x58, 0x9d, 0x88, 0xf8, 0xbf, 0xe6, 0x76, 0xe8, 0xbb, 0xaa, 0x5e, 0x8d, + 0xe7, 0x54, 0xb7, 0xa1, 0x64, 0x4c, 0xa2, 0xe5, 0x44, 0x36, 0x35, 0x9b, 0x68, 0xd3, 0xf2, 0x8c, + 0xa0, 0x55, 0x55, 0x3c, 0xc9, 0xaa, 0x54, 0xe5, 0xca, 0x61, 0xe6, 0xb1, 0x01, 0x48, 0xa8, 0x4b, + 0x90, 0x35, 0x63, 0x9f, 0x80, 0xbe, 0x1a, 0xa6, 0x55, 0xe1, 0x18, 0x3d, 0x09, 0x59, 0xdf, 0xbb, + 0xa7, 0xd3, 0xe4, 0x72, 0xb4, 0x25, 0xf1, 0xee, 0x11, 0x31, 0x85, 0x5f, 0x84, 0x0c, 0xf1, 0xee, + 0xa1, 0x3a, 0x80, 0x6f, 0xbb, 0x5d, 0x7a, 0x27, 0x2c, 0xd0, 0xa6, 0x89, 0x01, 0x39, 0x22, 0x2f, + 0x59, 0x81, 0xe3, 0xe6, 0x89, 0xa4, 0xba, 0x17, 0xa1, 0xf0, 0xda, 0xd0, 0x14, 0x57, 0x35, 0x21, + 0x2e, 0xd9, 0x07, 0xd0, 0x48, 0xdc, 0x66, 0x20, 0x82, 0xa3, 0xd3, 0x50, 0x64, 0xf6, 0x56, 0x8f, + 0xde, 0x8c, 0x5c, 0x60, 0x04, 0xe0, 0xb3, 0xbc, 0xb6, 0xbc, 0x63, 0x24, 0x58, 0x11, 0x00, 0x9d, + 0x85, 0x4a, 0x74, 0xe6, 0xdb, 0x3e, 0xdd, 0x76, 0xde, 0x15, 0x1a, 0x9e, 0x26, 0x87, 0xe0, 0xe8, + 0x0c, 0x1c, 0x8b, 0x60, 0x1b, 0x22, 0x91, 0xc9, 0x0a, 0xd4, 0x24, 0x98, 0xcb, 0x46, 0xb0, 0xfb, + 0xf2, 0xdd, 0xa1, 0xdd, 0x13, 0x97, 0x6f, 0x9a, 0x18, 0x10, 0xfc, 0x7b, 0x0b, 0x8e, 0x4b, 0x55, + 0x33, 0x9b, 0x3d, 0x96, 0x56, 0xff, 0x33, 0x0b, 0x90, 0xc9, 0x81, 0x32, 0xad, 0xff, 0x36, 0xfb, + 0x4c, 0x3c, 0x53, 0x2a, 0x89, 0x92, 0x59, 0x82, 0xa2, 0x56, 0x11, 0x86, 0x7c, 0x5b, 0xf6, 0xd3, + 0x44, 0x63, 0x5c, 0xd6, 0xe4, 0x12, 0x42, 0xd4, 0x3f, 0x6a, 0x40, 0x6e, 0x6b, 0x8f, 0xd1, 0x40, + 0x55, 0xd4, 0xa2, 0x95, 0x20, 0x00, 0x44, 0xfe, 0xf1, 0xbd, 0xa8, 0xcb, 0x84, 0xd5, 0x64, 0xa3, + 0xbd, 0x14, 0x88, 0xe8, 0x07, 0xfc, 0xcb, 0x34, 0x94, 0xef, 0x78, 0xbd, 0x61, 0x14, 0x34, 0x1f, + 0xa7, 0x80, 0x11, 0x2b, 0xf3, 0x73, 0xba, 0xcc, 0x47, 0x90, 0x0d, 0x18, 0x1d, 0x08, 0xcb, 0xca, + 0x10, 0xf1, 0x8c, 0x30, 0x4c, 0x33, 0xdb, 0xef, 0x52, 0x26, 0x8b, 0xa7, 0x5a, 0x5e, 0x64, 0xb5, + 0x31, 0x18, 0x5a, 0x80, 0x92, 0xdd, 0xed, 0xfa, 0xb4, 0x6b, 0x33, 0xda, 0xda, 0xab, 0x15, 0xc4, + 0x66, 0x26, 0x08, 0xbf, 0x09, 0x33, 0x5a, 0x58, 0x4a, 0xa5, 0x17, 0xa0, 0xf0, 0x8e, 0x80, 0x8c, + 0x69, 0xbb, 0x49, 0x54, 0xe5, 0xc6, 0x34, 0x5a, 0xfc, 0xf5, 0x82, 0x3e, 0x33, 0xbe, 0x0e, 0x79, + 0x89, 0x8e, 0x4e, 0x9b, 0x25, 0x90, 0xcc, 0x02, 0xf9, 0x58, 0xd5, 0x33, 0x18, 0xf2, 0x92, 0x90, + 0x52, 0xbc, 0xb0, 0x0d, 0x09, 0x21, 0xea, 0x1f, 0xff, 0xcd, 0x82, 0x13, 0xab, 0x94, 0xd1, 0x36, + 0xa3, 0x9d, 0xab, 0x0e, 0xed, 0x75, 0xbe, 0xd4, 0xea, 0x3c, 0xec, 0xb1, 0x65, 0x8c, 0x1e, 0x1b, + 0xf7, 0x3b, 0x3d, 0xc7, 0xa5, 0xeb, 0x46, 0x93, 0x26, 0x02, 0x70, 0x0f, 0xb1, 0xcd, 0x0f, 0x2e, + 0xa7, 0xe5, 0xfb, 0x1c, 0x03, 0x12, 0x6a, 0x38, 0x1f, 0x69, 0x18, 0x7f, 0xc7, 0x82, 0xb9, 0x24, + 0xd7, 0x4a, 0x49, 0x4d, 0xc8, 0x8b, 0xc5, 0x63, 0xda, 0xbb, 0xb1, 0x15, 0x44, 0xa1, 0xa1, 0x4b, + 0xb1, 0xfd, 0xc5, 0x7b, 0xa0, 0x56, 0xed, 0x60, 0xd4, 0xa8, 0x46, 0x50, 0xa3, 0x83, 0x60, 0xe0, + 0xe2, 0xdf, 0xf0, 0x3a, 0xdb, 0xa4, 0x29, 0xf4, 0xcd, 0xed, 0x4b, 0xf9, 0x5e, 0x39, 0x40, 0xff, + 0x03, 0x59, 0xb6, 0x37, 0x50, 0x2e, 0xb7, 0x75, 0xe2, 0x8b, 0x51, 0xe3, 0x78, 0x6c, 0xd9, 0xe6, + 0xde, 0x80, 0x12, 0x81, 0xc2, 0xcd, 0xb2, 0x6d, 0xfb, 0x1d, 0xc7, 0xb5, 0x7b, 0x0e, 0x93, 0x62, + 0xcc, 0x12, 0x13, 0x84, 0x6a, 0x50, 0x18, 0xd8, 0x7e, 0xa0, 0xf3, 0xa6, 0x22, 0xd1, 0x43, 0xd1, + 0x02, 0xd9, 0xa5, 0xac, 0xbd, 0x23, 0xdd, 0xac, 0x6a, 0x81, 0x08, 0x48, 0xac, 0x05, 0x22, 0x20, + 0xf8, 0x27, 0x86, 0xe1, 0xc8, 0x3b, 0xf1, 0x95, 0x33, 0x1c, 0xfc, 0x8d, 0x48, 0xcb, 0xfa, 0x88, + 0x4a, 0xcb, 0x2f, 0xc1, 0x4c, 0x27, 0x36, 0x73, 0xb4, 0xb6, 0x65, 0x7b, 0x37, 0x81, 0x8e, 0x87, + 0x91, 0xea, 0x04, 0xe4, 0x08, 0xd5, 0x25, 0xf4, 0x91, 0x3e, 0xac, 0x8f, 0x48, 0xea, 0x99, 0x07, + 0x90, 0xfa, 0x3f, 0x2c, 0xa8, 0x44, 0x69, 0xa3, 0x12, 0x78, 0x35, 0xd6, 0xf6, 0xd4, 0xb7, 0xe6, + 0xb1, 0x7e, 0x35, 0x59, 0x83, 0xc2, 0xd6, 0xb0, 0xbd, 0x4b, 0x59, 0x20, 0xee, 0x6d, 0x99, 0xe8, + 0x21, 0x7e, 0xcf, 0x52, 0x79, 0x8f, 0x94, 0x80, 0xd2, 0xe7, 0x12, 0x14, 0x7c, 0x1a, 0x0c, 0x7b, + 0x4c, 0x2b, 0xb2, 0x66, 0x34, 0xcc, 0x86, 0x5b, 0xfa, 0xed, 0xc7, 0xb0, 0xc7, 0x88, 0x46, 0x44, + 0x57, 0xa0, 0xdc, 0xa7, 0x7e, 0x97, 0x6e, 0x30, 0xdf, 0x66, 0xb4, 0x2b, 0xb5, 0x33, 0x63, 0x9a, + 0xc0, 0x0d, 0x73, 0x9a, 0xc4, 0xb1, 0xf1, 0x7b, 0x69, 0x98, 0x89, 0x93, 0xfe, 0x0a, 0xb9, 0xcc, + 0xf1, 0x3d, 0xed, 0xa8, 0xc9, 0x99, 0x7b, 0x80, 0x57, 0x87, 0x73, 0x61, 0xf8, 0xc8, 0x0b, 0xb3, + 0x55, 0x23, 0x34, 0x03, 0x69, 0xa7, 0xa3, 0x22, 0x5e, 0xda, 0xe9, 0x9c, 0x7d, 0x0a, 0x8a, 0xa1, + 0x0e, 0x51, 0x09, 0x0a, 0x57, 0x6f, 0x91, 0x37, 0x96, 0xc9, 0x6a, 0x25, 0x85, 0xa6, 0x61, 0xaa, + 0xb5, 0xbc, 0xf2, 0xaa, 0x18, 0x59, 0x67, 0x2f, 0x40, 0x39, 0x26, 0x50, 0x54, 0x86, 0xe2, 0xfa, + 0xad, 0xb5, 0x8d, 0x4d, 0xf2, 0xf2, 0xf2, 0x8d, 0x4a, 0x0a, 0x15, 0x20, 0xb3, 0xf1, 0xfa, 0x8d, + 0x8a, 0xc5, 0x1f, 0x96, 0xef, 0xac, 0x55, 0xd2, 0x4b, 0xbf, 0xc8, 0xeb, 0x74, 0xd6, 0x47, 0xff, + 0x0f, 0x39, 0x99, 0xa3, 0xce, 0x45, 0xfa, 0x31, 0xdf, 0xd5, 0xce, 0x9f, 0x3c, 0x04, 0x97, 0xb6, + 0x81, 0x53, 0x17, 0x2c, 0x74, 0x13, 0x4a, 0x02, 0xa8, 0xde, 0x86, 0x9c, 0x4e, 0xbe, 0x94, 0x88, + 0x51, 0x7a, 0xe2, 0x88, 0x59, 0x83, 0xde, 0x65, 0xc8, 0xc9, 0x6b, 0x3f, 0x97, 0x28, 0x25, 0xc6, + 0x9c, 0x26, 0xf6, 0x7e, 0x08, 0xa7, 0xd0, 0x0b, 0x90, 0xdd, 0xb4, 0x9d, 0x1e, 0x32, 0x2a, 0x19, + 0xe3, 0x25, 0xc6, 0xfc, 0x5c, 0x12, 0x6c, 0x6c, 0x7b, 0x25, 0x7c, 0x17, 0x73, 0x32, 0xd9, 0x10, + 0xd6, 0xcb, 0x6b, 0x87, 0x27, 0xc2, 0x9d, 0x6f, 0xc9, 0x37, 0x06, 0xba, 0x2d, 0x89, 0x9e, 0x88, + 0x6f, 0x95, 0xe8, 0x62, 0xce, 0xd7, 0x8f, 0x9a, 0x0e, 0x09, 0xae, 0x43, 0xc9, 0x68, 0x09, 0x9a, + 0x62, 0x3d, 0xdc, 0xcf, 0x34, 0xc5, 0x3a, 0xa6, 0x8f, 0x88, 0x53, 0x68, 0x0d, 0xa6, 0x78, 0xfd, + 0x27, 0x5e, 0x1d, 0x9e, 0x4a, 0x96, 0x79, 0x46, 0x7a, 0x3f, 0x7f, 0x7a, 0xfc, 0x64, 0x48, 0xe8, + 0xeb, 0x50, 0x5c, 0xa3, 0x4c, 0xe5, 0x48, 0x27, 0x93, 0x49, 0xd6, 0x18, 0x49, 0xc5, 0x13, 0x35, + 0x9c, 0x42, 0x6f, 0x8a, 0x52, 0x34, 0x9e, 0x22, 0xa0, 0xc6, 0x11, 0xa9, 0x40, 0x78, 0xae, 0x85, + 0xa3, 0x11, 0x42, 0xca, 0x6f, 0xc4, 0x28, 0xab, 0x6c, 0xb2, 0x71, 0x44, 0xd8, 0x09, 0x29, 0x37, + 0xee, 0xf3, 0x61, 0x11, 0x4e, 0x2d, 0xbd, 0xa5, 0xbf, 0xad, 0x59, 0xb5, 0x99, 0x8d, 0x6e, 0xc1, + 0x8c, 0x90, 0x65, 0xf8, 0xf1, 0x4d, 0xcc, 0xe6, 0x0f, 0x7d, 0xe9, 0x13, 0xb3, 0xf9, 0xc3, 0x5f, + 0xfc, 0xe0, 0x54, 0xeb, 0xad, 0x8f, 0x3e, 0xad, 0xa7, 0x3e, 0xfe, 0xb4, 0x9e, 0xfa, 0xfc, 0xd3, + 0xba, 0xf5, 0xed, 0xfd, 0xba, 0xf5, 0xf3, 0xfd, 0xba, 0xf5, 0xe1, 0x7e, 0xdd, 0xfa, 0x68, 0xbf, + 0x6e, 0xfd, 0x79, 0xbf, 0x6e, 0xfd, 0x65, 0xbf, 0x9e, 0xfa, 0x7c, 0xbf, 0x6e, 0xbd, 0xff, 0x59, + 0x3d, 0xf5, 0xd1, 0x67, 0xf5, 0xd4, 0xc7, 0x9f, 0xd5, 0x53, 0xdf, 0x7c, 0xfa, 0xfe, 0x6d, 0x17, + 0xe9, 0xe2, 0xf2, 0xe2, 0xef, 0xd9, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x9c, 0x62, 0xec, + 0x01, 0x26, 0x00, 0x00, } func (x Direction) String() string { @@ -5357,6 +5390,9 @@ func (this *QueryPlanRequest) Equal(that interface{}) bool { if this.Direction != that1.Direction { return false } + if this.Buckets != that1.Buckets { + return false + } return true } func (this *QueryPlanResponse) Equal(that interface{}) bool { @@ -5422,6 +5458,20 @@ func (this *SubQueryResult) Equal(that interface{}) bool { if this.Limit != that1.Limit { return false } + if len(this.Shards) != len(that1.Shards) { + return false + } + for i := range this.Shards { + if this.Shards[i] != that1.Shards[i] { + return false + } + } + if this.Volume != that1.Volume { + return false + } + if this.Id != that1.Id { + return false + } return true } func (this *LabelToValuesResponse) GoString() string { @@ -6140,13 +6190,14 @@ func (this *QueryPlanRequest) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 9) + s := make([]string, 0, 10) s = append(s, "&logproto.QueryPlanRequest{") s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") s = append(s, "Limit: "+fmt.Sprintf("%#v", this.Limit)+",\n") s = append(s, "Start: "+fmt.Sprintf("%#v", this.Start)+",\n") s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") s = append(s, "Direction: "+fmt.Sprintf("%#v", this.Direction)+",\n") + s = append(s, "Buckets: "+fmt.Sprintf("%#v", this.Buckets)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -6167,12 +6218,15 @@ func (this *SubQueryResult) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 8) + s := make([]string, 0, 11) s = append(s, "&logproto.SubQueryResult{") s = append(s, "Start: "+fmt.Sprintf("%#v", this.Start)+",\n") s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") s = append(s, "Limit: "+fmt.Sprintf("%#v", this.Limit)+",\n") + s = append(s, "Shards: "+fmt.Sprintf("%#v", this.Shards)+",\n") + s = append(s, "Volume: "+fmt.Sprintf("%#v", this.Volume)+",\n") + s = append(s, "Id: "+fmt.Sprintf("%#v", this.Id)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -6212,7 +6266,6 @@ type QuerierClient interface { GetVolume(ctx context.Context, in *VolumeRequest, opts ...grpc.CallOption) (*VolumeResponse, error) GetDetectedFields(ctx context.Context, in *DetectedFieldsRequest, opts ...grpc.CallOption) (*DetectedFieldsResponse, error) GetDetectedLabels(ctx context.Context, in *DetectedLabelsRequest, opts ...grpc.CallOption) (*LabelToValuesResponse, error) - GetQueryPlan(ctx context.Context, in *QueryPlanRequest, opts ...grpc.CallOption) (*QueryPlanResponse, error) } type querierClient struct { @@ -6391,15 +6444,6 @@ func (c *querierClient) GetDetectedLabels(ctx context.Context, in *DetectedLabel return out, nil } -func (c *querierClient) GetQueryPlan(ctx context.Context, in *QueryPlanRequest, opts ...grpc.CallOption) (*QueryPlanResponse, error) { - out := new(QueryPlanResponse) - err := c.cc.Invoke(ctx, "/logproto.Querier/GetQueryPlan", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // QuerierServer is the server API for Querier service. type QuerierServer interface { Query(*QueryRequest, Querier_QueryServer) error @@ -6417,7 +6461,6 @@ type QuerierServer interface { GetVolume(context.Context, *VolumeRequest) (*VolumeResponse, error) GetDetectedFields(context.Context, *DetectedFieldsRequest) (*DetectedFieldsResponse, error) GetDetectedLabels(context.Context, *DetectedLabelsRequest) (*LabelToValuesResponse, error) - GetQueryPlan(context.Context, *QueryPlanRequest) (*QueryPlanResponse, error) } // UnimplementedQuerierServer can be embedded to have forward compatible implementations. @@ -6457,9 +6500,6 @@ func (*UnimplementedQuerierServer) GetDetectedFields(ctx context.Context, req *D func (*UnimplementedQuerierServer) GetDetectedLabels(ctx context.Context, req *DetectedLabelsRequest) (*LabelToValuesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDetectedLabels not implemented") } -func (*UnimplementedQuerierServer) GetQueryPlan(ctx context.Context, req *QueryPlanRequest) (*QueryPlanResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetQueryPlan not implemented") -} func RegisterQuerierServer(s *grpc.Server, srv QuerierServer) { s.RegisterService(&_Querier_serviceDesc, srv) @@ -6672,24 +6712,6 @@ func _Querier_GetDetectedLabels_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } -func _Querier_GetQueryPlan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPlanRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QuerierServer).GetQueryPlan(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/logproto.Querier/GetQueryPlan", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QuerierServer).GetQueryPlan(ctx, req.(*QueryPlanRequest)) - } - return interceptor(ctx, in, info, handler) -} - var _Querier_serviceDesc = grpc.ServiceDesc{ ServiceName: "logproto.Querier", HandlerType: (*QuerierServer)(nil), @@ -6726,10 +6748,6 @@ var _Querier_serviceDesc = grpc.ServiceDesc{ MethodName: "GetDetectedLabels", Handler: _Querier_GetDetectedLabels_Handler, }, - { - MethodName: "GetQueryPlan", - Handler: _Querier_GetQueryPlan_Handler, - }, }, Streams: []grpc.StreamDesc{ { @@ -9310,6 +9328,11 @@ func (m *QueryPlanRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Buckets != 0 { + i = encodeVarintLogproto(dAtA, i, uint64(m.Buckets)) + i-- + dAtA[i] = 0x30 + } if m.Direction != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Direction)) i-- @@ -9408,6 +9431,27 @@ func (m *SubQueryResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x3a + } + if m.Volume != 0 { + i = encodeVarintLogproto(dAtA, i, uint64(m.Volume)) + i-- + dAtA[i] = 0x30 + } + if len(m.Shards) > 0 { + for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Shards[iNdEx]) + copy(dAtA[i:], m.Shards[iNdEx]) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Shards[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } if m.Limit != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Limit)) i-- @@ -10554,6 +10598,9 @@ func (m *QueryPlanRequest) Size() (n int) { if m.Direction != 0 { n += 1 + sovLogproto(uint64(m.Direction)) } + if m.Buckets != 0 { + n += 1 + sovLogproto(uint64(m.Buckets)) + } return n } @@ -10592,6 +10639,19 @@ func (m *SubQueryResult) Size() (n int) { if m.Limit != 0 { n += 1 + sovLogproto(uint64(m.Limit)) } + if len(m.Shards) > 0 { + for _, s := range m.Shards { + l = len(s) + n += 1 + l + sovLogproto(uint64(l)) + } + } + if m.Volume != 0 { + n += 1 + sovLogproto(uint64(m.Volume)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } return n } @@ -11342,6 +11402,7 @@ func (this *QueryPlanRequest) String() string { `Start:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Start), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, `End:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, `Direction:` + fmt.Sprintf("%v", this.Direction) + `,`, + `Buckets:` + fmt.Sprintf("%v", this.Buckets) + `,`, `}`, }, "") return s @@ -11371,6 +11432,9 @@ func (this *SubQueryResult) String() string { `End:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, `Limit:` + fmt.Sprintf("%v", this.Limit) + `,`, + `Shards:` + fmt.Sprintf("%v", this.Shards) + `,`, + `Volume:` + fmt.Sprintf("%v", this.Volume) + `,`, + `Id:` + fmt.Sprintf("%v", this.Id) + `,`, `}`, }, "") return s @@ -18865,6 +18929,25 @@ func (m *QueryPlanRequest) Unmarshal(dAtA []byte) error { break } } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Buckets", wireType) + } + m.Buckets = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Buckets |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) @@ -19141,6 +19224,89 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { break } } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) + } + m.Volume = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Volume |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index 541e401487d96..d8f03d3aecaad 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -34,8 +34,6 @@ service Querier { rpc GetDetectedFields(DetectedFieldsRequest) returns (DetectedFieldsResponse) {} rpc GetDetectedLabels(DetectedLabelsRequest) returns (LabelToValuesResponse) {} - - rpc GetQueryPlan(QueryPlanRequest) returns (QueryPlanResponse) {} } message LabelToValuesResponse { @@ -512,6 +510,7 @@ message QueryPlanRequest { (gogoproto.nullable) = false ]; Direction direction = 5; + uint32 buckets = 6; // repeated string shards = 5 [(gogoproto.jsontag) = "shards,omitempty"]; // repeated Delete deletes = 6; @@ -543,4 +542,7 @@ message SubQueryResult { ]; string query = 3; uint32 limit = 4; + repeated string shards = 5 [(gogoproto.jsontag) = "shards,omitempty"]; + uint64 volume = 6; + string id = 7; } \ No newline at end of file diff --git a/pkg/querier-rf1/querier.go b/pkg/querier-rf1/querier.go index 9504fe23482ab..e9204b5a6bb7a 100644 --- a/pkg/querier-rf1/querier.go +++ b/pkg/querier-rf1/querier.go @@ -607,6 +607,10 @@ func (q *Rf1Querier) DetectedLabels(ctx context.Context, req *logproto.DetectedL }, nil } +func (q *Rf1Querier) SelectQueryPlan(_ context.Context, _ *logproto.QueryPlanRequest) (*logproto.QueryPlanResponse, error) { + return nil, nil +} + func countLabelsAndCardinality(storeLabelsMap map[string][]string, staticLabels map[string]struct{}) []*logproto.DetectedLabel { dlMap := make(map[string]*parsedFields) diff --git a/pkg/querier/adaptive_splitting.go b/pkg/querier/adaptive_splitting.go new file mode 100644 index 0000000000000..e2b376b8a876f --- /dev/null +++ b/pkg/querier/adaptive_splitting.go @@ -0,0 +1,101 @@ +package querier + +import ( + "fmt" + "sort" + "strings" + + "github.com/prometheus/common/model" + + "github.com/grafana/loki/v3/pkg/logproto" +) + +const streamShardLabel = "__stream_shard__" + +type Shard struct { + ID string + Volume uint64 +} + +type Bucket struct { + Shards []string + Volume uint64 +} + +type AdaptiveShardDistributor struct { + Shards []Shard + Buckets []Bucket +} + +func NewAdaptiveShardDistributor(volumes []Shard) *AdaptiveShardDistributor { + return &AdaptiveShardDistributor{ + Shards: volumes, + } +} + +func (d *AdaptiveShardDistributor) createBuckets(bucketCount int) { + totalVolume := uint64(0) + for _, shard := range d.Shards { + totalVolume += shard.Volume + } + + targetVolumePerBucket := totalVolume / uint64(bucketCount) + d.Buckets = make([]Bucket, bucketCount) + + bucketIndex := 0 + for _, shard := range d.Shards { + if bucketIndex >= bucketCount { + bucketIndex = bucketCount - 1 + } + d.Buckets[bucketIndex].Shards = append(d.Buckets[bucketIndex].Shards, shard.ID) + d.Buckets[bucketIndex].Volume += shard.Volume + + if d.Buckets[bucketIndex].Volume >= targetVolumePerBucket && bucketIndex < bucketCount-1 { + bucketIndex++ + } + } +} + +func (d *AdaptiveShardDistributor) DistributeShards(query string, start, end model.Time, bucketCount int) []*logproto.SubQueryResult { + sort.Slice(d.Shards, func(i, j int) bool { + return d.Shards[i].Volume > d.Shards[j].Volume + }) + d.createBuckets(bucketCount) + + var subqueries []*logproto.SubQueryResult + for i, bucket := range d.Buckets { + subquery := d.createSubquery(query, start, end, bucket.Shards, i, bucket.Volume) + subqueries = append(subqueries, subquery) + } + + return subqueries +} + +func (d *AdaptiveShardDistributor) createSubquery(originalQuery string, start, end model.Time, shards []string, bucketIndex int, vol uint64) *logproto.SubQueryResult { + // Convert shard IDs to strings and join them with '|' + //shardValues := make([]string, len(shards)) + //for i, shard := range shards { + // shardValues[i] = shard + //} + shardRegex := strings.Join(shards, "|") + + // Parse the original query to insert the __stream_shard__ label matcher + var modifiedQuery string + if strings.Contains(originalQuery, "{") && strings.Contains(originalQuery, "}") { + // If the query already has label matchers, insert the __stream_shard__ matcher + parts := strings.SplitN(originalQuery, "}", 2) + modifiedQuery = fmt.Sprintf("%s, __stream_shard__=~\"%s\"}%s", parts[0], shardRegex, parts[1]) + } else { + // If the query doesn't have label matchers, add them with the __stream_shard__ matcher + parts := strings.SplitN(originalQuery, "[", 2) + modifiedQuery = fmt.Sprintf("%s{__stream_shard__=~\"%s\"}[%s", parts[0], shardRegex, parts[1]) + } + + return &logproto.SubQueryResult{ + Query: modifiedQuery, + Start: start.Time(), + End: end.Time(), + Shards: shards, + Volume: vol, + Id: fmt.Sprintf("sub%d", bucketIndex+1)} +} diff --git a/pkg/querier/handler.go b/pkg/querier/handler.go index 3fa77e1f5fb70..3571795239fdc 100644 --- a/pkg/querier/handler.go +++ b/pkg/querier/handler.go @@ -139,6 +139,12 @@ func (h *Handler) Do(ctx context.Context, req queryrangebase.Request) (queryrang return &queryrange.QuerySamplesResponse{ Response: result, }, nil + case *logproto.QueryPlanRequest: + result, err := h.api.QueryPlanHandler(ctx, concrete) + if err != nil { + return nil, err + } + return &queryrange.QueryPlanResponse{Response: result}, nil default: return nil, fmt.Errorf("unsupported query type %T", req) } diff --git a/pkg/querier/http.go b/pkg/querier/http.go index cb80af31c5da3..5bbc5da5991c7 100644 --- a/pkg/querier/http.go +++ b/pkg/querier/http.go @@ -430,6 +430,15 @@ func (q *QuerierAPI) SamplesHandler(ctx context.Context, req *logproto.QuerySamp return resp, nil } +func (q *QuerierAPI) QueryPlanHandler(ctx context.Context, req *logproto.QueryPlanRequest) (*logproto.QueryPlanResponse, error) { + resp, err := q.querier.SelectQueryPlan(ctx, req) + if err != nil { + return nil, err + } + // select something from index and get the query plan? + return resp, nil +} + func (q *QuerierAPI) validateMaxEntriesLimits(ctx context.Context, expr syntax.Expr, limit uint32) error { tenantIDs, err := tenant.TenantIDs(ctx) if err != nil { diff --git a/pkg/querier/multi_tenant_querier.go b/pkg/querier/multi_tenant_querier.go index 961b35a916514..1c332b2a59e6e 100644 --- a/pkg/querier/multi_tenant_querier.go +++ b/pkg/querier/multi_tenant_querier.go @@ -330,6 +330,17 @@ func (q *MultiTenantQuerier) DetectedLabels(ctx context.Context, req *logproto.D }, nil } +func (q *MultiTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto.QueryPlanRequest) (*logproto.QueryPlanResponse, error) { + tenantIDs, err := tenant.TenantIDs(ctx) + if err != nil { + return nil, err + } + if len(tenantIDs) == 1 { + return q.Querier.SelectQueryPlan(ctx, req) + } + return &logproto.QueryPlanResponse{Results: make([]*logproto.SubQueryResult, 0)}, nil +} + // removeTenantSelector filters the given tenant IDs based on any tenant ID filter the in passed selector. func removeTenantSelector(params logql.SelectSampleParams, tenantIDs []string) (map[string]struct{}, syntax.Expr, error) { expr, err := params.Expr() diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 961c67345f61c..ccb6268f337f8 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -108,6 +108,7 @@ type Querier interface { DetectedLabels(ctx context.Context, req *logproto.DetectedLabelsRequest) (*logproto.DetectedLabelsResponse, error) SelectMetricSamples(ctx context.Context, req *logproto.QuerySamplesRequest) (*logproto.QuerySamplesResponse, error) WithPatternQuerier(patternQuerier PatterQuerier) + SelectQueryPlan(ctx context.Context, req *logproto.QueryPlanRequest) (*logproto.QueryPlanResponse, error) } type Limits querier_limits.Limits @@ -557,6 +558,50 @@ func (q *SingleTenantQuerier) Series(ctx context.Context, req *logproto.SeriesRe return q.awaitSeries(ctx, req) } +func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto.QueryPlanRequest) (*logproto.QueryPlanResponse, error) { + userID, err := tenant.TenantID(ctx) + _, storeQueryInterval := q.buildQueryIntervals(req.Start, req.End) + if err != nil { + return nil, err + } + + var matchers []*labels.Matcher + if req.Query != "" { + matchers, err = syntax.ParseMatchers(req.Query, true) + if err != nil { + return nil, err + } + } + + from := model.TimeFromUnixNano(storeQueryInterval.start.UnixNano()) + through := model.TimeFromUnixNano(storeQueryInterval.end.UnixNano()) + + streamShardValues, err := q.store.LabelValuesForMetricName(ctx, userID, from, through, "logs", streamShardLabel, matchers...) + if err != nil { + return nil, err + } + volumes := make([]Shard, len(streamShardValues)) + // for each streamShardValues, get stats and add + for v := range streamShardValues { + // get stats for each shard + m := append(matchers, labels.MustNewMatcher(labels.MatchEqual, streamShardLabel, streamShardValues[v])) + stats, err := q.store.Stats(ctx, userID, from, through, m...) + if err != nil { + return nil, err + } + volumes[v] = Shard{ + ID: streamShardValues[v], + Volume: stats.Bytes, + } + } + + d := NewAdaptiveShardDistributor(volumes) + subqueries := d.DistributeShards(req.Query, from, through, int(req.Buckets)) + return &logproto.QueryPlanResponse{ + Results: subqueries, + }, nil +} + func (q *SingleTenantQuerier) awaitSeries(ctx context.Context, req *logproto.SeriesRequest) (*logproto.SeriesResponse, error) { // buffer the channels to the # of calls they're expecting su series := make(chan [][]logproto.SeriesIdentifier, 2) @@ -564,7 +609,6 @@ func (q *SingleTenantQuerier) awaitSeries(ctx context.Context, req *logproto.Ser ingesterQueryInterval, storeQueryInterval := q.buildQueryIntervals(req.Start, req.End) - // fetch series from ingesters and store concurrently if !q.cfg.QueryStoreOnly && ingesterQueryInterval != nil { timeFramedReq := *req timeFramedReq.Start = ingesterQueryInterval.start diff --git a/pkg/querier/querier_mock_test.go b/pkg/querier/querier_mock_test.go index c016855dd4d96..d76d35c404a53 100644 --- a/pkg/querier/querier_mock_test.go +++ b/pkg/querier/querier_mock_test.go @@ -666,6 +666,9 @@ func (q *querierMock) GetShards(_ context.Context, _ string, _, _ model.Time, _ return nil, nil } +func (q *querierMock) SelectQueryPlan(_ context.Context, _ *logproto.QueryPlanRequest) (*logproto.QueryPlanResponse, error) { + return nil, nil +} func (q *querierMock) HasForSeries(_, _ model.Time) (sharding.ForSeries, bool) { return nil, false } diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index 79c41cf21bf61..09f0eaab6c2bc 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -1451,6 +1451,10 @@ func encodeResponseJSONTo(version loghttp.Version, res queryrangebase.Response, if err := marshal.WriteQuerySamplesResponseJSON(response.Response, w); err != nil { return err } + case *QueryPlanResponse: + if err := marshal.WriteQueryPlanResponseJSON(response.Response, w); err != nil { + return err + } default: return httpgrpc.Errorf(http.StatusInternalServerError, fmt.Sprintf("invalid response format, got (%T)", res)) } diff --git a/pkg/querier/queryrange/extensions.go b/pkg/querier/queryrange/extensions.go index 2aa9842e7548a..916ed7f95afbd 100644 --- a/pkg/querier/queryrange/extensions.go +++ b/pkg/querier/queryrange/extensions.go @@ -306,3 +306,22 @@ func (m *QuerySamplesResponse) WithHeaders( m.Headers = h return m } + +// GetHeaders returns the HTTP headers in the response. +func (m *QueryPlanResponse) GetHeaders() []*queryrangebase.PrometheusResponseHeader { + if m != nil { + return convertPrometheusResponseHeadersToPointers(m.Headers) + } + return nil +} + +func (m *QueryPlanResponse) SetHeader(name, value string) { + m.Headers = setHeader(m.Headers, name, value) +} + +func (m *QueryPlanResponse) WithHeaders( + h []queryrangebase.PrometheusResponseHeader, +) queryrangebase.Response { + m.Headers = h + return m +} diff --git a/pkg/querier/queryrange/marshal.go b/pkg/querier/queryrange/marshal.go index 3671636945903..fefe6d5cc8848 100644 --- a/pkg/querier/queryrange/marshal.go +++ b/pkg/querier/queryrange/marshal.go @@ -235,6 +235,8 @@ func QueryResponseUnwrap(res *QueryResponse) (queryrangebase.Response, error) { return concrete.DetectedFields, nil case *QueryResponse_SamplesResponse: return concrete.SamplesResponse, nil + case *QueryResponse_QueryPlanResponse: + return concrete.QueryPlanResponse, nil default: return nil, fmt.Errorf("unsupported QueryResponse response type, got (%T)", res.Response) } @@ -278,6 +280,8 @@ func QueryResponseWrap(res queryrangebase.Response) (*QueryResponse, error) { p.Response = &QueryResponse_DetectedFields{response} case *QuerySamplesResponse: p.Response = &QueryResponse_SamplesResponse{response} + case *QueryPlanResponse: + p.Response = &QueryResponse_QueryPlanResponse{response} default: return nil, fmt.Errorf("invalid response format, got (%T)", res) } @@ -378,6 +382,8 @@ func (Codec) QueryRequestUnwrap(ctx context.Context, req *QueryRequest) (queryra }, ctx, nil case *QueryRequest_SamplesRequest: return concrete.SamplesRequest, ctx, nil + case *QueryRequest_QueryPlanRequest: + return concrete.QueryPlanRequest, ctx, nil default: return nil, ctx, fmt.Errorf("unsupported request type while unwrapping, got (%T)", req.Request) } @@ -411,6 +417,8 @@ func (Codec) QueryRequestWrap(ctx context.Context, r queryrangebase.Request) (*Q result.Request = &QueryRequest_DetectedFields{DetectedFields: &req.DetectedFieldsRequest} case *logproto.QuerySamplesRequest: result.Request = &QueryRequest_SamplesRequest{SamplesRequest: req} + case *logproto.QueryPlanRequest: + result.Request = &QueryRequest_QueryPlanRequest{QueryPlanRequest: req} default: return nil, fmt.Errorf("unsupported request type while wrapping, got (%T)", r) } diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index 8ee3b28069573..067bc381fd473 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -536,6 +536,7 @@ func getOperation(path string) string { case path == "/loki/api/v1/detected_labels": return DetectedLabelsOp case path == "/loki/api/v1/query/plan": + return QueryPlanOp default: return "" } diff --git a/pkg/util/marshal/marshal.go b/pkg/util/marshal/marshal.go index 6886650c822b5..93ec5950a626a 100644 --- a/pkg/util/marshal/marshal.go +++ b/pkg/util/marshal/marshal.go @@ -266,6 +266,16 @@ func WriteQuerySamplesResponseJSON(r *logproto.QuerySamplesResponse, w io.Writer return nil } +// WriteQueryPlanResponseJSON marshals a logproto.QuerySamplesResponse to JSON and then +// writes it to the provided io.Writer. +func WriteQueryPlanResponseJSON(r *logproto.QueryPlanResponse, w io.Writer) error { + s := jsoniter.ConfigFastest.BorrowStream(w) + defer jsoniter.ConfigFastest.ReturnStream(s) + s.WriteVal(r) + s.WriteRaw("\n") + return s.Flush() +} + func logprotoSeriesToPromQLMatrix(series []logproto.Series) (promql.Matrix, error) { promMatrix := make(promql.Matrix, len(series)) for i, s := range series { From 47a1bdfb5378d1da206452b01c88e4837e6a704e Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Mon, 5 Aug 2024 21:40:36 +0530 Subject: [PATCH 3/8] Fix bucket param --- pkg/loghttp/query_plan.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/loghttp/query_plan.go b/pkg/loghttp/query_plan.go index ea56717931794..ecb9cfd00f540 100644 --- a/pkg/loghttp/query_plan.go +++ b/pkg/loghttp/query_plan.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/grafana/loki/v3/pkg/logproto" + "github.com/pkg/errors" ) func ParseQueryPlanRequest(r *http.Request) (*logproto.QueryPlanRequest, error) { @@ -22,5 +23,21 @@ func ParseQueryPlanRequest(r *http.Request) (*logproto.QueryPlanRequest, error) return nil, err } req.Direction = dir + b, err := buckets(r) + if err != nil { + return nil, err + } + req.Buckets = b return req, nil } + +func buckets(r *http.Request) (uint32, error) { + b, err := parseInt(r.Form.Get("buckets"), 1) + if err != nil { + return 0, err + } + if b <= 0 { + return 0, errors.New("buckets must be a positive value") + } + return uint32(b), nil +} From 3dfc7e02f6e465bec0da3508d103b249611940e3 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Fri, 9 Aug 2024 10:43:43 +0530 Subject: [PATCH 4/8] Fix when bucket size is greater than actual shards --- pkg/querier/adaptive_splitting.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/querier/adaptive_splitting.go b/pkg/querier/adaptive_splitting.go index e2b376b8a876f..b82f9f9850429 100644 --- a/pkg/querier/adaptive_splitting.go +++ b/pkg/querier/adaptive_splitting.go @@ -5,6 +5,7 @@ import ( "sort" "strings" + "github.com/grafana/loki/v3/pkg/util/math" "github.com/prometheus/common/model" "github.com/grafana/loki/v3/pkg/logproto" @@ -57,12 +58,18 @@ func (d *AdaptiveShardDistributor) createBuckets(bucketCount int) { } func (d *AdaptiveShardDistributor) DistributeShards(query string, start, end model.Time, bucketCount int) []*logproto.SubQueryResult { + var subqueries []*logproto.SubQueryResult sort.Slice(d.Shards, func(i, j int) bool { return d.Shards[i].Volume > d.Shards[j].Volume }) - d.createBuckets(bucketCount) + b := math.Min(bucketCount, len(d.Shards)) + if b <= 0 { + results := append(subqueries, &logproto.SubQueryResult{Query: query, Start: start.Time(), End: end.Time(), Shards: []string{}, Volume: 0, Id: "sub1"}) + return results + } + + d.createBuckets(b) - var subqueries []*logproto.SubQueryResult for i, bucket := range d.Buckets { subquery := d.createSubquery(query, start, end, bucket.Shards, i, bucket.Volume) subqueries = append(subqueries, subquery) @@ -72,11 +79,6 @@ func (d *AdaptiveShardDistributor) DistributeShards(query string, start, end mod } func (d *AdaptiveShardDistributor) createSubquery(originalQuery string, start, end model.Time, shards []string, bucketIndex int, vol uint64) *logproto.SubQueryResult { - // Convert shard IDs to strings and join them with '|' - //shardValues := make([]string, len(shards)) - //for i, shard := range shards { - // shardValues[i] = shard - //} shardRegex := strings.Join(shards, "|") // Parse the original query to insert the __stream_shard__ label matcher From 23246fa5fe21485260ab7eb07c335743acd87eaf Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Mon, 12 Aug 2024 16:07:00 +0530 Subject: [PATCH 5/8] Remove shards from response --- pkg/logproto/logproto.pb.go | 544 +++++++++++++----------------- pkg/logproto/logproto.proto | 11 +- pkg/querier/adaptive_splitting.go | 3 +- pkg/querier/querier.go | 3 + 4 files changed, 248 insertions(+), 313 deletions(-) diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index 3d07e4697e857..8b6399736d617 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -3217,13 +3217,12 @@ func (m *QueryPlanResponse) GetMergeStrategy() MergeStrategy { } type SubQueryResult struct { - Start time.Time `protobuf:"bytes,1,opt,name=start,proto3,stdtime" json:"start"` - End time.Time `protobuf:"bytes,2,opt,name=end,proto3,stdtime" json:"end"` - Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` - Limit uint32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` - Shards []string `protobuf:"bytes,5,rep,name=shards,proto3" json:"shards,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Start time.Time `protobuf:"bytes,2,opt,name=start,proto3,stdtime" json:"start"` + End time.Time `protobuf:"bytes,3,opt,name=end,proto3,stdtime" json:"end"` + Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` + Limit uint32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` Volume uint64 `protobuf:"varint,6,opt,name=volume,proto3" json:"volume,omitempty"` - Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` } func (m *SubQueryResult) Reset() { *m = SubQueryResult{} } @@ -3258,6 +3257,13 @@ func (m *SubQueryResult) XXX_DiscardUnknown() { var xxx_messageInfo_SubQueryResult proto.InternalMessageInfo +func (m *SubQueryResult) GetId() string { + if m != nil { + return m.Id + } + return "" +} + func (m *SubQueryResult) GetStart() time.Time { if m != nil { return m.Start @@ -3286,13 +3292,6 @@ func (m *SubQueryResult) GetLimit() uint32 { return 0 } -func (m *SubQueryResult) GetShards() []string { - if m != nil { - return m.Shards - } - return nil -} - func (m *SubQueryResult) GetVolume() uint64 { if m != nil { return m.Volume @@ -3300,13 +3299,6 @@ func (m *SubQueryResult) GetVolume() uint64 { return 0 } -func (m *SubQueryResult) GetId() string { - if m != nil { - return m.Id - } - return "" -} - func init() { proto.RegisterEnum("logproto.Direction", Direction_name, Direction_value) proto.RegisterEnum("logproto.MergeStrategy", MergeStrategy_name, MergeStrategy_value) @@ -3374,185 +3366,184 @@ func init() { func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2836 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x6c, 0x1b, 0xc7, - 0xb9, 0x5c, 0xfe, 0x8a, 0x1f, 0x45, 0x99, 0x1e, 0xd1, 0x32, 0x21, 0x3b, 0xa4, 0x32, 0x78, 0x2f, - 0xf1, 0xb3, 0x1d, 0xd1, 0x56, 0x5e, 0xf2, 0x1c, 0xe7, 0xb9, 0xa9, 0x28, 0xc5, 0x8a, 0x1d, 0xf9, - 0x27, 0x23, 0xc5, 0x49, 0x8b, 0x06, 0xc1, 0x8a, 0x1c, 0x51, 0x0b, 0x91, 0xbb, 0xf4, 0xee, 0x30, - 0x8e, 0x6e, 0x05, 0x0a, 0xe4, 0x56, 0x34, 0x40, 0x0f, 0x6d, 0x2f, 0x05, 0x0a, 0x14, 0x68, 0xd1, - 0x22, 0x97, 0xa2, 0xa7, 0xa2, 0x68, 0x2f, 0x3d, 0xa4, 0xb7, 0x1c, 0x83, 0x1c, 0xd8, 0x46, 0xb9, - 0x14, 0x02, 0x0a, 0x04, 0x28, 0xd0, 0x43, 0x2e, 0x2d, 0xe6, 0x6f, 0x77, 0x76, 0x45, 0xd5, 0xa6, - 0xeb, 0x22, 0xf1, 0x85, 0xdc, 0xf9, 0xe6, 0x9b, 0x6f, 0xe6, 0xfb, 0x99, 0xef, 0x6f, 0x17, 0x4e, - 0x0d, 0x76, 0xbb, 0xcd, 0x9e, 0xd7, 0x1d, 0xf8, 0x1e, 0xf3, 0xc2, 0x87, 0x45, 0xf1, 0x8b, 0xa6, - 0xf4, 0x78, 0xbe, 0xda, 0xf5, 0xba, 0x9e, 0xc4, 0xe1, 0x4f, 0x72, 0x7e, 0xbe, 0xd1, 0xf5, 0xbc, - 0x6e, 0x8f, 0x36, 0xc5, 0x68, 0x6b, 0xb8, 0xdd, 0x64, 0x4e, 0x9f, 0x06, 0xcc, 0xee, 0x0f, 0x14, - 0xc2, 0x82, 0xa2, 0x7e, 0xb7, 0xd7, 0xf7, 0x3a, 0xb4, 0xd7, 0x0c, 0x98, 0xcd, 0x02, 0xf9, 0xab, - 0x30, 0x66, 0x39, 0xc6, 0x60, 0x18, 0xec, 0x88, 0x1f, 0x09, 0xc4, 0xbf, 0xb6, 0xe0, 0xc4, 0xba, - 0xbd, 0x45, 0x7b, 0x9b, 0xde, 0x1d, 0xbb, 0x37, 0xa4, 0x01, 0xa1, 0xc1, 0xc0, 0x73, 0x03, 0x8a, - 0x56, 0x20, 0xdf, 0xe3, 0x13, 0x41, 0xcd, 0x5a, 0xc8, 0x9c, 0x29, 0x2d, 0x9d, 0x5b, 0x0c, 0x8f, - 0x3c, 0x76, 0x81, 0x84, 0x06, 0x2f, 0xbb, 0xcc, 0xdf, 0x23, 0x6a, 0xe9, 0xfc, 0x1d, 0x28, 0x19, - 0x60, 0x54, 0x81, 0xcc, 0x2e, 0xdd, 0xab, 0x59, 0x0b, 0xd6, 0x99, 0x22, 0xe1, 0x8f, 0xe8, 0x22, - 0xe4, 0xde, 0xe1, 0x64, 0x6a, 0xe9, 0x05, 0xeb, 0x4c, 0x69, 0xe9, 0x54, 0xb4, 0xc9, 0xeb, 0xae, - 0x73, 0x77, 0x48, 0xc5, 0x6a, 0xb5, 0x91, 0xc4, 0xbc, 0x9c, 0xbe, 0x64, 0xe1, 0x73, 0x70, 0xfc, - 0xd0, 0x3c, 0x9a, 0x83, 0xbc, 0xc0, 0x90, 0x27, 0x2e, 0x12, 0x35, 0xc2, 0x55, 0x40, 0x1b, 0xcc, - 0xa7, 0x76, 0x9f, 0xd8, 0x8c, 0x9f, 0xf7, 0xee, 0x90, 0x06, 0x0c, 0xdf, 0x80, 0xd9, 0x18, 0x54, - 0xb1, 0xfd, 0x3c, 0x94, 0x82, 0x08, 0xac, 0x78, 0xaf, 0x46, 0xc7, 0x8a, 0xd6, 0x10, 0x13, 0x11, - 0xff, 0xd8, 0x02, 0x88, 0xe6, 0x50, 0x1d, 0x40, 0xce, 0xbe, 0x62, 0x07, 0x3b, 0x82, 0xe1, 0x2c, - 0x31, 0x20, 0xe8, 0x3c, 0x1c, 0x8f, 0x46, 0x37, 0xbd, 0x8d, 0x1d, 0xdb, 0xef, 0x08, 0x19, 0x64, - 0xc9, 0xe1, 0x09, 0x84, 0x20, 0xeb, 0xdb, 0x8c, 0xd6, 0x32, 0x0b, 0xd6, 0x99, 0x0c, 0x11, 0xcf, - 0x9c, 0x5b, 0x46, 0x5d, 0xdb, 0x65, 0xb5, 0xac, 0x10, 0xa7, 0x1a, 0x71, 0x38, 0xd7, 0x2f, 0x0d, - 0x6a, 0xb9, 0x05, 0xeb, 0x4c, 0x99, 0xa8, 0x11, 0xfe, 0x7b, 0x06, 0xa6, 0x5f, 0x1b, 0x52, 0x7f, - 0x4f, 0x09, 0x00, 0xd5, 0x61, 0x2a, 0xa0, 0x3d, 0xda, 0x66, 0x9e, 0x2f, 0x35, 0xd2, 0x4a, 0xd7, - 0x2c, 0x12, 0xc2, 0x50, 0x15, 0x72, 0x3d, 0xa7, 0xef, 0x30, 0x71, 0xac, 0x32, 0x91, 0x03, 0x74, - 0x19, 0x72, 0x01, 0xb3, 0x7d, 0x26, 0xce, 0x52, 0x5a, 0x9a, 0x5f, 0x94, 0x86, 0xb9, 0xa8, 0x0d, - 0x73, 0x71, 0x53, 0x1b, 0x66, 0x6b, 0xea, 0xc3, 0x51, 0x23, 0xf5, 0xfe, 0x9f, 0x1a, 0x16, 0x91, - 0x4b, 0xd0, 0xf3, 0x90, 0xa1, 0x6e, 0x47, 0x9c, 0xf7, 0x41, 0x57, 0xf2, 0x05, 0xe8, 0x22, 0x14, - 0x3b, 0x8e, 0x4f, 0xdb, 0xcc, 0xf1, 0x5c, 0xc1, 0xd5, 0xcc, 0xd2, 0x6c, 0xa4, 0x91, 0x55, 0x3d, - 0x45, 0x22, 0x2c, 0x74, 0x1e, 0xf2, 0x01, 0x17, 0x5d, 0x50, 0x2b, 0x70, 0x5b, 0x68, 0x55, 0x0f, - 0x46, 0x8d, 0x8a, 0x84, 0x9c, 0xf7, 0xfa, 0x0e, 0xa3, 0xfd, 0x01, 0xdb, 0x23, 0x0a, 0x07, 0x9d, - 0x85, 0x42, 0x87, 0xf6, 0x28, 0x57, 0xf8, 0x94, 0x50, 0x78, 0xc5, 0x20, 0x2f, 0x26, 0x88, 0x46, - 0x40, 0x6f, 0x41, 0x76, 0xd0, 0xb3, 0xdd, 0x5a, 0x51, 0x70, 0x31, 0x13, 0x21, 0xde, 0xee, 0xd9, - 0x6e, 0xeb, 0x85, 0x4f, 0x46, 0x8d, 0xe7, 0xba, 0x0e, 0xdb, 0x19, 0x6e, 0x2d, 0xb6, 0xbd, 0x7e, - 0xb3, 0xeb, 0xdb, 0xdb, 0xb6, 0x6b, 0x37, 0x7b, 0xde, 0xae, 0xd3, 0x7c, 0xe7, 0xd9, 0x26, 0xbf, - 0x83, 0x77, 0x87, 0xd4, 0x77, 0xa8, 0xdf, 0xe4, 0x64, 0x16, 0x85, 0x4a, 0xf8, 0x52, 0x22, 0xc8, - 0xa2, 0xeb, 0xdc, 0xfe, 0x3c, 0x9f, 0xae, 0xec, 0x0c, 0xdd, 0xdd, 0xa0, 0x06, 0x62, 0x97, 0x93, - 0xd1, 0x2e, 0x02, 0x4e, 0xe8, 0xf6, 0x9a, 0xef, 0x0d, 0x07, 0xad, 0x63, 0x07, 0xa3, 0x86, 0x89, - 0x4f, 0xcc, 0xc1, 0xf5, 0xec, 0x54, 0xbe, 0x52, 0xc0, 0x1f, 0x64, 0x00, 0x6d, 0xd8, 0xfd, 0x41, - 0x8f, 0x4e, 0xa4, 0xfe, 0x50, 0xd1, 0xe9, 0x87, 0x56, 0x74, 0x66, 0x52, 0x45, 0x47, 0x5a, 0xcb, - 0x4e, 0xa6, 0xb5, 0xdc, 0x83, 0x6a, 0x2d, 0xff, 0x95, 0xd7, 0x1a, 0xae, 0x41, 0x96, 0x53, 0xe6, - 0xce, 0xd2, 0xb7, 0xef, 0x09, 0xdd, 0x4c, 0x13, 0xfe, 0x88, 0xd7, 0x21, 0x2f, 0xf9, 0x42, 0xf3, - 0x49, 0xe5, 0xc5, 0xef, 0x6d, 0xa4, 0xb8, 0x8c, 0x56, 0x49, 0x25, 0x52, 0x49, 0x46, 0x08, 0x1b, - 0xff, 0xd6, 0x82, 0xb2, 0xb2, 0x08, 0xe5, 0xfb, 0xb6, 0xa0, 0x20, 0x7d, 0x8f, 0xf6, 0x7b, 0x27, - 0x93, 0x7e, 0x6f, 0xb9, 0x63, 0x0f, 0x18, 0xf5, 0x5b, 0xcd, 0x0f, 0x47, 0x0d, 0xeb, 0x93, 0x51, - 0xe3, 0xe9, 0xa3, 0x84, 0xa6, 0x63, 0x8d, 0xf6, 0x97, 0x9a, 0x30, 0x3a, 0x27, 0x4e, 0xc7, 0x02, - 0x65, 0x56, 0xc7, 0x16, 0x65, 0x88, 0xba, 0xe6, 0x76, 0x69, 0xc0, 0x29, 0x67, 0xb9, 0x45, 0x10, - 0x89, 0xc3, 0xd9, 0xbc, 0x67, 0xfb, 0xae, 0xe3, 0x76, 0x83, 0x5a, 0x46, 0xf8, 0xf4, 0x70, 0x8c, - 0x7f, 0x68, 0xc1, 0x6c, 0xcc, 0xac, 0x15, 0x13, 0x97, 0x20, 0x1f, 0x70, 0x4d, 0x69, 0x1e, 0x0c, - 0xa3, 0xd8, 0x10, 0xf0, 0xd6, 0x8c, 0x3a, 0x7c, 0x5e, 0x8e, 0x89, 0xc2, 0x7f, 0x74, 0x47, 0xfb, - 0x83, 0x05, 0xd3, 0x22, 0x30, 0xe9, 0xbb, 0x86, 0x20, 0xeb, 0xda, 0x7d, 0xaa, 0x54, 0x25, 0x9e, - 0x8d, 0x68, 0xc5, 0xb7, 0x9b, 0xd2, 0xd1, 0x6a, 0x52, 0x07, 0x6b, 0x3d, 0xb4, 0x83, 0xb5, 0xa2, - 0x7b, 0x57, 0x85, 0x1c, 0x37, 0xef, 0x3d, 0xe1, 0x5c, 0x8b, 0x44, 0x0e, 0xf0, 0xd3, 0x50, 0x56, - 0x5c, 0x28, 0xd1, 0x1e, 0x15, 0x60, 0xfb, 0x90, 0x97, 0x9a, 0x40, 0xff, 0x05, 0xc5, 0x30, 0x31, - 0x11, 0xdc, 0x66, 0x5a, 0xf9, 0x83, 0x51, 0x23, 0xcd, 0x02, 0x12, 0x4d, 0xa0, 0x86, 0x19, 0xf4, - 0xad, 0x56, 0xf1, 0x60, 0xd4, 0x90, 0x00, 0x15, 0xe2, 0xd1, 0x69, 0xc8, 0xee, 0xf0, 0xb8, 0xc9, - 0x45, 0x90, 0x6d, 0x4d, 0x1d, 0x8c, 0x1a, 0x62, 0x4c, 0xc4, 0x2f, 0x5e, 0x83, 0xe9, 0x75, 0xda, - 0xb5, 0xdb, 0x7b, 0x6a, 0xd3, 0xaa, 0x26, 0xc7, 0x37, 0xb4, 0x34, 0x8d, 0x27, 0x61, 0x3a, 0xdc, - 0xf1, 0xed, 0x7e, 0xa0, 0x6e, 0x43, 0x29, 0x84, 0xdd, 0x08, 0xf0, 0x8f, 0x2c, 0x50, 0x36, 0x80, - 0xb0, 0x91, 0xed, 0x70, 0x5f, 0x08, 0x07, 0xa3, 0x86, 0x82, 0xe8, 0x64, 0x06, 0xbd, 0x08, 0x85, - 0x40, 0xec, 0xc8, 0x89, 0x25, 0x4d, 0x4b, 0x4c, 0xb4, 0x8e, 0x71, 0x13, 0x39, 0x18, 0x35, 0x34, - 0x22, 0xd1, 0x0f, 0x68, 0x31, 0x96, 0x10, 0x48, 0xc6, 0x66, 0x0e, 0x46, 0x0d, 0x03, 0x6a, 0x26, - 0x08, 0xf8, 0x0b, 0x0b, 0x4a, 0x9b, 0xb6, 0x13, 0x9a, 0x50, 0x4d, 0xab, 0x28, 0xf2, 0xd5, 0x12, - 0xc0, 0x2d, 0xb1, 0x43, 0x7b, 0xf6, 0xde, 0x55, 0xcf, 0x17, 0x74, 0xcb, 0x24, 0x1c, 0x47, 0x31, - 0x3c, 0x3b, 0x36, 0x86, 0xe7, 0x26, 0x77, 0xed, 0xff, 0x59, 0x47, 0x7a, 0x3d, 0x3b, 0x95, 0xae, - 0x64, 0xf0, 0x07, 0x16, 0x4c, 0x4b, 0xe6, 0x95, 0xe5, 0x7d, 0x0b, 0xf2, 0x52, 0x36, 0x82, 0xfd, - 0x7f, 0xe1, 0x98, 0xce, 0x4d, 0xe2, 0x94, 0x14, 0x4d, 0xf4, 0x12, 0xcc, 0x74, 0x7c, 0x6f, 0x30, - 0xa0, 0x9d, 0x0d, 0xe5, 0xfe, 0xd2, 0x49, 0xf7, 0xb7, 0x6a, 0xce, 0x93, 0x04, 0x3a, 0xfe, 0xa3, - 0x05, 0x65, 0xe5, 0x4c, 0x94, 0xba, 0x42, 0x11, 0x5b, 0x0f, 0x1d, 0x3d, 0xd3, 0x93, 0x46, 0xcf, - 0x39, 0xc8, 0x77, 0x79, 0x7c, 0xd1, 0x0e, 0x49, 0x8d, 0x26, 0x8b, 0xaa, 0xf8, 0x3a, 0xcc, 0x68, - 0x56, 0x8e, 0xf0, 0xa8, 0xf3, 0x49, 0x8f, 0x7a, 0xad, 0x43, 0x5d, 0xe6, 0x6c, 0x3b, 0xa1, 0x8f, - 0x54, 0xf8, 0xf8, 0x7b, 0x16, 0x54, 0x92, 0x28, 0x68, 0x35, 0x51, 0x58, 0x3c, 0x75, 0x34, 0x39, - 0xb3, 0xa6, 0xd0, 0xa4, 0x55, 0x65, 0xf1, 0xdc, 0xfd, 0x2a, 0x8b, 0xaa, 0xe9, 0x64, 0x8a, 0xca, - 0x2b, 0xe0, 0x1f, 0x58, 0x50, 0x8e, 0xe9, 0x12, 0x5d, 0x82, 0xec, 0xb6, 0xef, 0xf5, 0x27, 0x52, - 0x94, 0x58, 0x81, 0xfe, 0x17, 0xd2, 0xcc, 0x9b, 0x48, 0x4d, 0x69, 0xe6, 0x71, 0x2d, 0x29, 0xf6, - 0x33, 0x32, 0x6f, 0x97, 0x23, 0xfc, 0x1c, 0x14, 0x05, 0x43, 0xb7, 0x6d, 0xc7, 0x1f, 0x1b, 0x30, - 0xc6, 0x33, 0xf4, 0x22, 0x1c, 0x93, 0xce, 0x70, 0xfc, 0xe2, 0xe9, 0x71, 0x8b, 0xa7, 0xf5, 0xe2, - 0x53, 0x90, 0x13, 0x49, 0x07, 0x5f, 0xd2, 0xb1, 0x99, 0xad, 0x97, 0xf0, 0x67, 0x7c, 0x02, 0x66, - 0xf9, 0x1d, 0xa4, 0x7e, 0xb0, 0xe2, 0x0d, 0x5d, 0xa6, 0xeb, 0xa6, 0xf3, 0x50, 0x8d, 0x83, 0x95, - 0x95, 0x54, 0x21, 0xd7, 0xe6, 0x00, 0x41, 0xa3, 0x4c, 0xe4, 0x00, 0xff, 0xd4, 0x02, 0xb4, 0x46, - 0x99, 0xd8, 0xe5, 0xda, 0x6a, 0x78, 0x3d, 0xe6, 0x61, 0xaa, 0x6f, 0xb3, 0xf6, 0x0e, 0xf5, 0x03, - 0x9d, 0xbf, 0xe8, 0xf1, 0x97, 0x91, 0x78, 0xe2, 0x8b, 0x30, 0x1b, 0x3b, 0xa5, 0xe2, 0x69, 0x1e, - 0xa6, 0xda, 0x0a, 0xa6, 0x42, 0x5e, 0x38, 0xc6, 0xbf, 0x4a, 0xc3, 0x94, 0x4e, 0xeb, 0xd0, 0x45, - 0x28, 0x6d, 0x3b, 0x6e, 0x97, 0xfa, 0x03, 0xdf, 0x51, 0x22, 0xc8, 0xca, 0x34, 0xcf, 0x00, 0x13, - 0x73, 0x80, 0x9e, 0x81, 0xc2, 0x30, 0xa0, 0xfe, 0xdb, 0x8e, 0xbc, 0xe9, 0xc5, 0x56, 0x75, 0x7f, - 0xd4, 0xc8, 0xbf, 0x1e, 0x50, 0xff, 0xda, 0x2a, 0x0f, 0x3e, 0x43, 0xf1, 0x44, 0xe4, 0x7f, 0x07, - 0xbd, 0xaa, 0xcc, 0x54, 0x24, 0x70, 0xad, 0xff, 0xe3, 0xc7, 0x4f, 0xb8, 0xba, 0x81, 0xef, 0xf5, - 0x29, 0xdb, 0xa1, 0xc3, 0xa0, 0xd9, 0xf6, 0xfa, 0x7d, 0xcf, 0x6d, 0x8a, 0x4e, 0x80, 0x60, 0x9a, - 0x47, 0x50, 0xbe, 0x5c, 0x59, 0xee, 0x26, 0x14, 0xd8, 0x8e, 0xef, 0x0d, 0xbb, 0x3b, 0x22, 0x30, - 0x64, 0x5a, 0x97, 0x27, 0xa7, 0xa7, 0x29, 0x10, 0xfd, 0x80, 0x9e, 0xe4, 0xd2, 0xa2, 0xed, 0xdd, - 0x60, 0xd8, 0x97, 0xb5, 0x67, 0x2b, 0x77, 0x30, 0x6a, 0x58, 0xcf, 0x90, 0x10, 0x8c, 0x97, 0xa1, - 0x1c, 0x4b, 0x85, 0xd1, 0x05, 0xc8, 0xfa, 0x74, 0x5b, 0xbb, 0x02, 0x74, 0x38, 0x63, 0x96, 0xd1, - 0x9f, 0xe3, 0x10, 0xf1, 0x8b, 0xbf, 0x9b, 0x86, 0x86, 0x51, 0xf5, 0x5f, 0xf5, 0xfc, 0x1b, 0x94, - 0xf9, 0x4e, 0xfb, 0xa6, 0xdd, 0xa7, 0xda, 0xbc, 0x1a, 0x50, 0xea, 0x0b, 0xe0, 0xdb, 0xc6, 0x2d, - 0x82, 0x7e, 0x88, 0x87, 0x9e, 0x00, 0x10, 0xd7, 0x4e, 0xce, 0xcb, 0x0b, 0x55, 0x14, 0x10, 0x31, - 0xbd, 0x12, 0x13, 0x76, 0x73, 0x42, 0xe1, 0x28, 0x21, 0x5f, 0x4b, 0x0a, 0x79, 0x62, 0x3a, 0xa1, - 0x64, 0xcd, 0xeb, 0x92, 0x8b, 0x5f, 0x17, 0xfc, 0x57, 0x0b, 0xea, 0xeb, 0xfa, 0xe4, 0x0f, 0x29, - 0x0e, 0xcd, 0x6f, 0xfa, 0x11, 0xf1, 0x9b, 0x79, 0x84, 0xfc, 0x66, 0x13, 0xfc, 0xd6, 0x01, 0xd6, - 0x1d, 0x97, 0x5e, 0x75, 0x7a, 0x8c, 0xfa, 0x63, 0x8a, 0xa4, 0xef, 0x67, 0x22, 0x8f, 0x43, 0xe8, - 0xb6, 0x96, 0xc1, 0x8a, 0xe1, 0xe6, 0x1f, 0x05, 0x8b, 0xe9, 0x47, 0xc8, 0x62, 0x26, 0xe1, 0x01, - 0x5d, 0x28, 0x6c, 0x0b, 0xf6, 0x64, 0xc4, 0x8e, 0xf5, 0x9f, 0x22, 0xde, 0x5b, 0x5f, 0x53, 0x9b, - 0x3f, 0x7f, 0x9f, 0x84, 0x4b, 0x74, 0x05, 0x9b, 0xc1, 0x9e, 0xcb, 0xec, 0x77, 0x8d, 0xf5, 0x44, - 0x6f, 0x82, 0x6c, 0x95, 0xd3, 0xe5, 0xc6, 0xe6, 0x74, 0x57, 0xd4, 0x36, 0xff, 0x4e, 0x5e, 0x87, - 0xaf, 0x44, 0x0e, 0x56, 0x28, 0x45, 0x39, 0xd8, 0xa7, 0xee, 0x77, 0xfd, 0xd5, 0xa5, 0xff, 0x9d, - 0x05, 0x95, 0x35, 0xca, 0xe2, 0x39, 0xd6, 0x63, 0xa4, 0x52, 0xfc, 0x0a, 0x1c, 0x37, 0xce, 0xaf, - 0xb8, 0x7f, 0x36, 0x91, 0x58, 0x9d, 0x88, 0xf8, 0xbf, 0xe6, 0x76, 0xe8, 0xbb, 0xaa, 0x5e, 0x8d, - 0xe7, 0x54, 0xb7, 0xa1, 0x64, 0x4c, 0xa2, 0xe5, 0x44, 0x36, 0x35, 0x9b, 0x68, 0xd3, 0xf2, 0x8c, - 0xa0, 0x55, 0x55, 0x3c, 0xc9, 0xaa, 0x54, 0xe5, 0xca, 0x61, 0xe6, 0xb1, 0x01, 0x48, 0xa8, 0x4b, - 0x90, 0x35, 0x63, 0x9f, 0x80, 0xbe, 0x1a, 0xa6, 0x55, 0xe1, 0x18, 0x3d, 0x09, 0x59, 0xdf, 0xbb, - 0xa7, 0xd3, 0xe4, 0x72, 0xb4, 0x25, 0xf1, 0xee, 0x11, 0x31, 0x85, 0x5f, 0x84, 0x0c, 0xf1, 0xee, - 0xa1, 0x3a, 0x80, 0x6f, 0xbb, 0x5d, 0x7a, 0x27, 0x2c, 0xd0, 0xa6, 0x89, 0x01, 0x39, 0x22, 0x2f, - 0x59, 0x81, 0xe3, 0xe6, 0x89, 0xa4, 0xba, 0x17, 0xa1, 0xf0, 0xda, 0xd0, 0x14, 0x57, 0x35, 0x21, - 0x2e, 0xd9, 0x07, 0xd0, 0x48, 0xdc, 0x66, 0x20, 0x82, 0xa3, 0xd3, 0x50, 0x64, 0xf6, 0x56, 0x8f, - 0xde, 0x8c, 0x5c, 0x60, 0x04, 0xe0, 0xb3, 0xbc, 0xb6, 0xbc, 0x63, 0x24, 0x58, 0x11, 0x00, 0x9d, - 0x85, 0x4a, 0x74, 0xe6, 0xdb, 0x3e, 0xdd, 0x76, 0xde, 0x15, 0x1a, 0x9e, 0x26, 0x87, 0xe0, 0xe8, - 0x0c, 0x1c, 0x8b, 0x60, 0x1b, 0x22, 0x91, 0xc9, 0x0a, 0xd4, 0x24, 0x98, 0xcb, 0x46, 0xb0, 0xfb, - 0xf2, 0xdd, 0xa1, 0xdd, 0x13, 0x97, 0x6f, 0x9a, 0x18, 0x10, 0xfc, 0x7b, 0x0b, 0x8e, 0x4b, 0x55, - 0x33, 0x9b, 0x3d, 0x96, 0x56, 0xff, 0x33, 0x0b, 0x90, 0xc9, 0x81, 0x32, 0xad, 0xff, 0x36, 0xfb, - 0x4c, 0x3c, 0x53, 0x2a, 0x89, 0x92, 0x59, 0x82, 0xa2, 0x56, 0x11, 0x86, 0x7c, 0x5b, 0xf6, 0xd3, - 0x44, 0x63, 0x5c, 0xd6, 0xe4, 0x12, 0x42, 0xd4, 0x3f, 0x6a, 0x40, 0x6e, 0x6b, 0x8f, 0xd1, 0x40, - 0x55, 0xd4, 0xa2, 0x95, 0x20, 0x00, 0x44, 0xfe, 0xf1, 0xbd, 0xa8, 0xcb, 0x84, 0xd5, 0x64, 0xa3, - 0xbd, 0x14, 0x88, 0xe8, 0x07, 0xfc, 0xcb, 0x34, 0x94, 0xef, 0x78, 0xbd, 0x61, 0x14, 0x34, 0x1f, - 0xa7, 0x80, 0x11, 0x2b, 0xf3, 0x73, 0xba, 0xcc, 0x47, 0x90, 0x0d, 0x18, 0x1d, 0x08, 0xcb, 0xca, - 0x10, 0xf1, 0x8c, 0x30, 0x4c, 0x33, 0xdb, 0xef, 0x52, 0x26, 0x8b, 0xa7, 0x5a, 0x5e, 0x64, 0xb5, - 0x31, 0x18, 0x5a, 0x80, 0x92, 0xdd, 0xed, 0xfa, 0xb4, 0x6b, 0x33, 0xda, 0xda, 0xab, 0x15, 0xc4, - 0x66, 0x26, 0x08, 0xbf, 0x09, 0x33, 0x5a, 0x58, 0x4a, 0xa5, 0x17, 0xa0, 0xf0, 0x8e, 0x80, 0x8c, - 0x69, 0xbb, 0x49, 0x54, 0xe5, 0xc6, 0x34, 0x5a, 0xfc, 0xf5, 0x82, 0x3e, 0x33, 0xbe, 0x0e, 0x79, - 0x89, 0x8e, 0x4e, 0x9b, 0x25, 0x90, 0xcc, 0x02, 0xf9, 0x58, 0xd5, 0x33, 0x18, 0xf2, 0x92, 0x90, - 0x52, 0xbc, 0xb0, 0x0d, 0x09, 0x21, 0xea, 0x1f, 0xff, 0xcd, 0x82, 0x13, 0xab, 0x94, 0xd1, 0x36, - 0xa3, 0x9d, 0xab, 0x0e, 0xed, 0x75, 0xbe, 0xd4, 0xea, 0x3c, 0xec, 0xb1, 0x65, 0x8c, 0x1e, 0x1b, - 0xf7, 0x3b, 0x3d, 0xc7, 0xa5, 0xeb, 0x46, 0x93, 0x26, 0x02, 0x70, 0x0f, 0xb1, 0xcd, 0x0f, 0x2e, - 0xa7, 0xe5, 0xfb, 0x1c, 0x03, 0x12, 0x6a, 0x38, 0x1f, 0x69, 0x18, 0x7f, 0xc7, 0x82, 0xb9, 0x24, - 0xd7, 0x4a, 0x49, 0x4d, 0xc8, 0x8b, 0xc5, 0x63, 0xda, 0xbb, 0xb1, 0x15, 0x44, 0xa1, 0xa1, 0x4b, - 0xb1, 0xfd, 0xc5, 0x7b, 0xa0, 0x56, 0xed, 0x60, 0xd4, 0xa8, 0x46, 0x50, 0xa3, 0x83, 0x60, 0xe0, - 0xe2, 0xdf, 0xf0, 0x3a, 0xdb, 0xa4, 0x29, 0xf4, 0xcd, 0xed, 0x4b, 0xf9, 0x5e, 0x39, 0x40, 0xff, - 0x03, 0x59, 0xb6, 0x37, 0x50, 0x2e, 0xb7, 0x75, 0xe2, 0x8b, 0x51, 0xe3, 0x78, 0x6c, 0xd9, 0xe6, - 0xde, 0x80, 0x12, 0x81, 0xc2, 0xcd, 0xb2, 0x6d, 0xfb, 0x1d, 0xc7, 0xb5, 0x7b, 0x0e, 0x93, 0x62, - 0xcc, 0x12, 0x13, 0x84, 0x6a, 0x50, 0x18, 0xd8, 0x7e, 0xa0, 0xf3, 0xa6, 0x22, 0xd1, 0x43, 0xd1, - 0x02, 0xd9, 0xa5, 0xac, 0xbd, 0x23, 0xdd, 0xac, 0x6a, 0x81, 0x08, 0x48, 0xac, 0x05, 0x22, 0x20, - 0xf8, 0x27, 0x86, 0xe1, 0xc8, 0x3b, 0xf1, 0x95, 0x33, 0x1c, 0xfc, 0x8d, 0x48, 0xcb, 0xfa, 0x88, - 0x4a, 0xcb, 0x2f, 0xc1, 0x4c, 0x27, 0x36, 0x73, 0xb4, 0xb6, 0x65, 0x7b, 0x37, 0x81, 0x8e, 0x87, - 0x91, 0xea, 0x04, 0xe4, 0x08, 0xd5, 0x25, 0xf4, 0x91, 0x3e, 0xac, 0x8f, 0x48, 0xea, 0x99, 0x07, - 0x90, 0xfa, 0x3f, 0x2c, 0xa8, 0x44, 0x69, 0xa3, 0x12, 0x78, 0x35, 0xd6, 0xf6, 0xd4, 0xb7, 0xe6, - 0xb1, 0x7e, 0x35, 0x59, 0x83, 0xc2, 0xd6, 0xb0, 0xbd, 0x4b, 0x59, 0x20, 0xee, 0x6d, 0x99, 0xe8, - 0x21, 0x7e, 0xcf, 0x52, 0x79, 0x8f, 0x94, 0x80, 0xd2, 0xe7, 0x12, 0x14, 0x7c, 0x1a, 0x0c, 0x7b, - 0x4c, 0x2b, 0xb2, 0x66, 0x34, 0xcc, 0x86, 0x5b, 0xfa, 0xed, 0xc7, 0xb0, 0xc7, 0x88, 0x46, 0x44, - 0x57, 0xa0, 0xdc, 0xa7, 0x7e, 0x97, 0x6e, 0x30, 0xdf, 0x66, 0xb4, 0x2b, 0xb5, 0x33, 0x63, 0x9a, - 0xc0, 0x0d, 0x73, 0x9a, 0xc4, 0xb1, 0xf1, 0x7b, 0x69, 0x98, 0x89, 0x93, 0xfe, 0x0a, 0xb9, 0xcc, - 0xf1, 0x3d, 0xed, 0xa8, 0xc9, 0x99, 0x7b, 0x80, 0x57, 0x87, 0x73, 0x61, 0xf8, 0xc8, 0x0b, 0xb3, - 0x55, 0x23, 0x34, 0x03, 0x69, 0xa7, 0xa3, 0x22, 0x5e, 0xda, 0xe9, 0x9c, 0x7d, 0x0a, 0x8a, 0xa1, - 0x0e, 0x51, 0x09, 0x0a, 0x57, 0x6f, 0x91, 0x37, 0x96, 0xc9, 0x6a, 0x25, 0x85, 0xa6, 0x61, 0xaa, - 0xb5, 0xbc, 0xf2, 0xaa, 0x18, 0x59, 0x67, 0x2f, 0x40, 0x39, 0x26, 0x50, 0x54, 0x86, 0xe2, 0xfa, - 0xad, 0xb5, 0x8d, 0x4d, 0xf2, 0xf2, 0xf2, 0x8d, 0x4a, 0x0a, 0x15, 0x20, 0xb3, 0xf1, 0xfa, 0x8d, - 0x8a, 0xc5, 0x1f, 0x96, 0xef, 0xac, 0x55, 0xd2, 0x4b, 0xbf, 0xc8, 0xeb, 0x74, 0xd6, 0x47, 0xff, - 0x0f, 0x39, 0x99, 0xa3, 0xce, 0x45, 0xfa, 0x31, 0xdf, 0xd5, 0xce, 0x9f, 0x3c, 0x04, 0x97, 0xb6, - 0x81, 0x53, 0x17, 0x2c, 0x74, 0x13, 0x4a, 0x02, 0xa8, 0xde, 0x86, 0x9c, 0x4e, 0xbe, 0x94, 0x88, - 0x51, 0x7a, 0xe2, 0x88, 0x59, 0x83, 0xde, 0x65, 0xc8, 0xc9, 0x6b, 0x3f, 0x97, 0x28, 0x25, 0xc6, - 0x9c, 0x26, 0xf6, 0x7e, 0x08, 0xa7, 0xd0, 0x0b, 0x90, 0xdd, 0xb4, 0x9d, 0x1e, 0x32, 0x2a, 0x19, - 0xe3, 0x25, 0xc6, 0xfc, 0x5c, 0x12, 0x6c, 0x6c, 0x7b, 0x25, 0x7c, 0x17, 0x73, 0x32, 0xd9, 0x10, - 0xd6, 0xcb, 0x6b, 0x87, 0x27, 0xc2, 0x9d, 0x6f, 0xc9, 0x37, 0x06, 0xba, 0x2d, 0x89, 0x9e, 0x88, - 0x6f, 0x95, 0xe8, 0x62, 0xce, 0xd7, 0x8f, 0x9a, 0x0e, 0x09, 0xae, 0x43, 0xc9, 0x68, 0x09, 0x9a, - 0x62, 0x3d, 0xdc, 0xcf, 0x34, 0xc5, 0x3a, 0xa6, 0x8f, 0x88, 0x53, 0x68, 0x0d, 0xa6, 0x78, 0xfd, - 0x27, 0x5e, 0x1d, 0x9e, 0x4a, 0x96, 0x79, 0x46, 0x7a, 0x3f, 0x7f, 0x7a, 0xfc, 0x64, 0x48, 0xe8, - 0xeb, 0x50, 0x5c, 0xa3, 0x4c, 0xe5, 0x48, 0x27, 0x93, 0x49, 0xd6, 0x18, 0x49, 0xc5, 0x13, 0x35, - 0x9c, 0x42, 0x6f, 0x8a, 0x52, 0x34, 0x9e, 0x22, 0xa0, 0xc6, 0x11, 0xa9, 0x40, 0x78, 0xae, 0x85, - 0xa3, 0x11, 0x42, 0xca, 0x6f, 0xc4, 0x28, 0xab, 0x6c, 0xb2, 0x71, 0x44, 0xd8, 0x09, 0x29, 0x37, - 0xee, 0xf3, 0x61, 0x11, 0x4e, 0x2d, 0xbd, 0xa5, 0xbf, 0xad, 0x59, 0xb5, 0x99, 0x8d, 0x6e, 0xc1, - 0x8c, 0x90, 0x65, 0xf8, 0xf1, 0x4d, 0xcc, 0xe6, 0x0f, 0x7d, 0xe9, 0x13, 0xb3, 0xf9, 0xc3, 0x5f, - 0xfc, 0xe0, 0x54, 0xeb, 0xad, 0x8f, 0x3e, 0xad, 0xa7, 0x3e, 0xfe, 0xb4, 0x9e, 0xfa, 0xfc, 0xd3, - 0xba, 0xf5, 0xed, 0xfd, 0xba, 0xf5, 0xf3, 0xfd, 0xba, 0xf5, 0xe1, 0x7e, 0xdd, 0xfa, 0x68, 0xbf, - 0x6e, 0xfd, 0x79, 0xbf, 0x6e, 0xfd, 0x65, 0xbf, 0x9e, 0xfa, 0x7c, 0xbf, 0x6e, 0xbd, 0xff, 0x59, - 0x3d, 0xf5, 0xd1, 0x67, 0xf5, 0xd4, 0xc7, 0x9f, 0xd5, 0x53, 0xdf, 0x7c, 0xfa, 0xfe, 0x6d, 0x17, - 0xe9, 0xe2, 0xf2, 0xe2, 0xef, 0xd9, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x9c, 0x62, 0xec, - 0x01, 0x26, 0x00, 0x00, + // 2831 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6c, 0x1b, 0xc7, + 0x95, 0xcb, 0xaf, 0xf8, 0x28, 0xca, 0xf4, 0x88, 0x96, 0x09, 0xd9, 0x21, 0x95, 0x41, 0x9b, 0xb8, + 0xb6, 0x23, 0xda, 0x4a, 0x93, 0x3a, 0x4e, 0xdd, 0x54, 0x94, 0x62, 0xc5, 0x8e, 0xfc, 0xc9, 0x48, + 0x71, 0xd2, 0xa2, 0x41, 0xb0, 0x22, 0x47, 0xd4, 0x42, 0xe4, 0x2e, 0xbd, 0x3b, 0x8c, 0xa3, 0x5b, + 0x81, 0x02, 0xbd, 0x15, 0x0d, 0xd0, 0x43, 0xdb, 0x4b, 0x81, 0x02, 0x05, 0x5a, 0xb4, 0xc8, 0xa5, + 0xe8, 0xa9, 0x28, 0xda, 0x4b, 0x0f, 0xe9, 0x2d, 0xc7, 0x20, 0x07, 0xb6, 0x51, 0x2e, 0x85, 0x80, + 0x02, 0x01, 0x0a, 0xf4, 0x90, 0x4b, 0x8b, 0xf9, 0xed, 0xce, 0xae, 0xa8, 0x3a, 0x74, 0x5d, 0x24, + 0xbe, 0x90, 0x3b, 0x6f, 0xde, 0xbc, 0x99, 0xf7, 0x99, 0xf7, 0xdb, 0x85, 0x53, 0x83, 0xdd, 0x6e, + 0xb3, 0xe7, 0x75, 0x07, 0xbe, 0xc7, 0xbc, 0xf0, 0x61, 0x51, 0xfc, 0xa2, 0x29, 0x3d, 0x9e, 0xaf, + 0x76, 0xbd, 0xae, 0x27, 0x71, 0xf8, 0x93, 0x9c, 0x9f, 0x6f, 0x74, 0x3d, 0xaf, 0xdb, 0xa3, 0x4d, + 0x31, 0xda, 0x1a, 0x6e, 0x37, 0x99, 0xd3, 0xa7, 0x01, 0xb3, 0xfb, 0x03, 0x85, 0xb0, 0xa0, 0xa8, + 0xdf, 0xed, 0xf5, 0xbd, 0x0e, 0xed, 0x35, 0x03, 0x66, 0xb3, 0x40, 0xfe, 0x2a, 0x8c, 0x59, 0x8e, + 0x31, 0x18, 0x06, 0x3b, 0xe2, 0x47, 0x02, 0xf1, 0xef, 0x2c, 0x38, 0xb1, 0x6e, 0x6f, 0xd1, 0xde, + 0xa6, 0x77, 0xc7, 0xee, 0x0d, 0x69, 0x40, 0x68, 0x30, 0xf0, 0xdc, 0x80, 0xa2, 0x15, 0xc8, 0xf7, + 0xf8, 0x44, 0x50, 0xb3, 0x16, 0x32, 0x67, 0x4a, 0x4b, 0xe7, 0x16, 0xc3, 0x23, 0x8f, 0x5d, 0x20, + 0xa1, 0xc1, 0x8b, 0x2e, 0xf3, 0xf7, 0x88, 0x5a, 0x3a, 0x7f, 0x07, 0x4a, 0x06, 0x18, 0x55, 0x20, + 0xb3, 0x4b, 0xf7, 0x6a, 0xd6, 0x82, 0x75, 0xa6, 0x48, 0xf8, 0x23, 0xba, 0x08, 0xb9, 0xb7, 0x38, + 0x99, 0x5a, 0x7a, 0xc1, 0x3a, 0x53, 0x5a, 0x3a, 0x15, 0x6d, 0xf2, 0xaa, 0xeb, 0xdc, 0x1d, 0x52, + 0xb1, 0x5a, 0x6d, 0x24, 0x31, 0x2f, 0xa7, 0x2f, 0x59, 0xf8, 0x1c, 0x1c, 0x3f, 0x34, 0x8f, 0xe6, + 0x20, 0x2f, 0x30, 0xe4, 0x89, 0x8b, 0x44, 0x8d, 0x70, 0x15, 0xd0, 0x06, 0xf3, 0xa9, 0xdd, 0x27, + 0x36, 0xe3, 0xe7, 0xbd, 0x3b, 0xa4, 0x01, 0xc3, 0x37, 0x60, 0x36, 0x06, 0x55, 0x6c, 0x3f, 0x0b, + 0xa5, 0x20, 0x02, 0x2b, 0xde, 0xab, 0xd1, 0xb1, 0xa2, 0x35, 0xc4, 0x44, 0xc4, 0x3f, 0xb3, 0x00, + 0xa2, 0x39, 0x54, 0x07, 0x90, 0xb3, 0x2f, 0xd9, 0xc1, 0x8e, 0x60, 0x38, 0x4b, 0x0c, 0x08, 0x3a, + 0x0f, 0xc7, 0xa3, 0xd1, 0x4d, 0x6f, 0x63, 0xc7, 0xf6, 0x3b, 0x42, 0x06, 0x59, 0x72, 0x78, 0x02, + 0x21, 0xc8, 0xfa, 0x36, 0xa3, 0xb5, 0xcc, 0x82, 0x75, 0x26, 0x43, 0xc4, 0x33, 0xe7, 0x96, 0x51, + 0xd7, 0x76, 0x59, 0x2d, 0x2b, 0xc4, 0xa9, 0x46, 0x1c, 0xce, 0xf5, 0x4b, 0x83, 0x5a, 0x6e, 0xc1, + 0x3a, 0x53, 0x26, 0x6a, 0x84, 0xff, 0x95, 0x81, 0xe9, 0x57, 0x86, 0xd4, 0xdf, 0x53, 0x02, 0x40, + 0x75, 0x98, 0x0a, 0x68, 0x8f, 0xb6, 0x99, 0xe7, 0x4b, 0x8d, 0xb4, 0xd2, 0x35, 0x8b, 0x84, 0x30, + 0x54, 0x85, 0x5c, 0xcf, 0xe9, 0x3b, 0x4c, 0x1c, 0xab, 0x4c, 0xe4, 0x00, 0x5d, 0x86, 0x5c, 0xc0, + 0x6c, 0x9f, 0x89, 0xb3, 0x94, 0x96, 0xe6, 0x17, 0xa5, 0x61, 0x2e, 0x6a, 0xc3, 0x5c, 0xdc, 0xd4, + 0x86, 0xd9, 0x9a, 0x7a, 0x6f, 0xd4, 0x48, 0xbd, 0xf3, 0xd7, 0x86, 0x45, 0xe4, 0x12, 0xf4, 0x2c, + 0x64, 0xa8, 0xdb, 0x11, 0xe7, 0xfd, 0xac, 0x2b, 0xf9, 0x02, 0x74, 0x11, 0x8a, 0x1d, 0xc7, 0xa7, + 0x6d, 0xe6, 0x78, 0xae, 0xe0, 0x6a, 0x66, 0x69, 0x36, 0xd2, 0xc8, 0xaa, 0x9e, 0x22, 0x11, 0x16, + 0x3a, 0x0f, 0xf9, 0x80, 0x8b, 0x2e, 0xa8, 0x15, 0xb8, 0x2d, 0xb4, 0xaa, 0x07, 0xa3, 0x46, 0x45, + 0x42, 0xce, 0x7b, 0x7d, 0x87, 0xd1, 0xfe, 0x80, 0xed, 0x11, 0x85, 0x83, 0xce, 0x42, 0xa1, 0x43, + 0x7b, 0x94, 0x2b, 0x7c, 0x4a, 0x28, 0xbc, 0x62, 0x90, 0x17, 0x13, 0x44, 0x23, 0xa0, 0x37, 0x20, + 0x3b, 0xe8, 0xd9, 0x6e, 0xad, 0x28, 0xb8, 0x98, 0x89, 0x10, 0x6f, 0xf7, 0x6c, 0xb7, 0xf5, 0xdc, + 0x87, 0xa3, 0xc6, 0x33, 0x5d, 0x87, 0xed, 0x0c, 0xb7, 0x16, 0xdb, 0x5e, 0xbf, 0xd9, 0xf5, 0xed, + 0x6d, 0xdb, 0xb5, 0x9b, 0x3d, 0x6f, 0xd7, 0x69, 0xbe, 0xf5, 0x74, 0x93, 0xdf, 0xc1, 0xbb, 0x43, + 0xea, 0x3b, 0xd4, 0x6f, 0x72, 0x32, 0x8b, 0x42, 0x25, 0x7c, 0x29, 0x11, 0x64, 0xd1, 0x75, 0x6e, + 0x7f, 0x9e, 0x4f, 0x57, 0x76, 0x86, 0xee, 0x6e, 0x50, 0x03, 0xb1, 0xcb, 0xc9, 0x68, 0x17, 0x01, + 0x27, 0x74, 0x7b, 0xcd, 0xf7, 0x86, 0x83, 0xd6, 0xb1, 0x83, 0x51, 0xc3, 0xc4, 0x27, 0xe6, 0xe0, + 0x7a, 0x76, 0x2a, 0x5f, 0x29, 0xe0, 0x77, 0x33, 0x80, 0x36, 0xec, 0xfe, 0xa0, 0x47, 0x27, 0x52, + 0x7f, 0xa8, 0xe8, 0xf4, 0x03, 0x2b, 0x3a, 0x33, 0xa9, 0xa2, 0x23, 0xad, 0x65, 0x27, 0xd3, 0x5a, + 0xee, 0xb3, 0x6a, 0x2d, 0xff, 0x85, 0xd7, 0x1a, 0xae, 0x41, 0x96, 0x53, 0xe6, 0xce, 0xd2, 0xb7, + 0xef, 0x09, 0xdd, 0x4c, 0x13, 0xfe, 0x88, 0xd7, 0x21, 0x2f, 0xf9, 0x42, 0xf3, 0x49, 0xe5, 0xc5, + 0xef, 0x6d, 0xa4, 0xb8, 0x8c, 0x56, 0x49, 0x25, 0x52, 0x49, 0x46, 0x08, 0x1b, 0xff, 0xc1, 0x82, + 0xb2, 0xb2, 0x08, 0xe5, 0xfb, 0xb6, 0xa0, 0x20, 0x7d, 0x8f, 0xf6, 0x7b, 0x27, 0x93, 0x7e, 0x6f, + 0xb9, 0x63, 0x0f, 0x18, 0xf5, 0x5b, 0xcd, 0xf7, 0x46, 0x0d, 0xeb, 0xc3, 0x51, 0xe3, 0xc9, 0xa3, + 0x84, 0xa6, 0x63, 0x8d, 0xf6, 0x97, 0x9a, 0x30, 0x3a, 0x27, 0x4e, 0xc7, 0x02, 0x65, 0x56, 0xc7, + 0x16, 0x65, 0x88, 0xba, 0xe6, 0x76, 0x69, 0xc0, 0x29, 0x67, 0xb9, 0x45, 0x10, 0x89, 0xc3, 0xd9, + 0xbc, 0x67, 0xfb, 0xae, 0xe3, 0x76, 0x83, 0x5a, 0x46, 0xf8, 0xf4, 0x70, 0x8c, 0x7f, 0x62, 0xc1, + 0x6c, 0xcc, 0xac, 0x15, 0x13, 0x97, 0x20, 0x1f, 0x70, 0x4d, 0x69, 0x1e, 0x0c, 0xa3, 0xd8, 0x10, + 0xf0, 0xd6, 0x8c, 0x3a, 0x7c, 0x5e, 0x8e, 0x89, 0xc2, 0x7f, 0x78, 0x47, 0xfb, 0xb3, 0x05, 0xd3, + 0x22, 0x30, 0xe9, 0xbb, 0x86, 0x20, 0xeb, 0xda, 0x7d, 0xaa, 0x54, 0x25, 0x9e, 0x8d, 0x68, 0xc5, + 0xb7, 0x9b, 0xd2, 0xd1, 0x6a, 0x52, 0x07, 0x6b, 0x3d, 0xb0, 0x83, 0xb5, 0xa2, 0x7b, 0x57, 0x85, + 0x1c, 0x37, 0xef, 0x3d, 0xe1, 0x5c, 0x8b, 0x44, 0x0e, 0xf0, 0x93, 0x50, 0x56, 0x5c, 0x28, 0xd1, + 0x1e, 0x15, 0x60, 0xfb, 0x90, 0x97, 0x9a, 0x40, 0x5f, 0x82, 0x62, 0x98, 0x98, 0x08, 0x6e, 0x33, + 0xad, 0xfc, 0xc1, 0xa8, 0x91, 0x66, 0x01, 0x89, 0x26, 0x50, 0xc3, 0x0c, 0xfa, 0x56, 0xab, 0x78, + 0x30, 0x6a, 0x48, 0x80, 0x0a, 0xf1, 0xe8, 0x34, 0x64, 0x77, 0x78, 0xdc, 0xe4, 0x22, 0xc8, 0xb6, + 0xa6, 0x0e, 0x46, 0x0d, 0x31, 0x26, 0xe2, 0x17, 0xaf, 0xc1, 0xf4, 0x3a, 0xed, 0xda, 0xed, 0x3d, + 0xb5, 0x69, 0x55, 0x93, 0xe3, 0x1b, 0x5a, 0x9a, 0xc6, 0xe3, 0x30, 0x1d, 0xee, 0xf8, 0x66, 0x3f, + 0x50, 0xb7, 0xa1, 0x14, 0xc2, 0x6e, 0x04, 0xf8, 0xa7, 0x16, 0x28, 0x1b, 0x40, 0xd8, 0xc8, 0x76, + 0xb8, 0x2f, 0x84, 0x83, 0x51, 0x43, 0x41, 0x74, 0x32, 0x83, 0x9e, 0x87, 0x42, 0x20, 0x76, 0xe4, + 0xc4, 0x92, 0xa6, 0x25, 0x26, 0x5a, 0xc7, 0xb8, 0x89, 0x1c, 0x8c, 0x1a, 0x1a, 0x91, 0xe8, 0x07, + 0xb4, 0x18, 0x4b, 0x08, 0x24, 0x63, 0x33, 0x07, 0xa3, 0x86, 0x01, 0x35, 0x13, 0x04, 0xfc, 0xa9, + 0x05, 0xa5, 0x4d, 0xdb, 0x09, 0x4d, 0xa8, 0xa6, 0x55, 0x14, 0xf9, 0x6a, 0x09, 0xe0, 0x96, 0xd8, + 0xa1, 0x3d, 0x7b, 0xef, 0xaa, 0xe7, 0x0b, 0xba, 0x65, 0x12, 0x8e, 0xa3, 0x18, 0x9e, 0x1d, 0x1b, + 0xc3, 0x73, 0x93, 0xbb, 0xf6, 0xff, 0xaf, 0x23, 0xbd, 0x9e, 0x9d, 0x4a, 0x57, 0x32, 0xf8, 0x5d, + 0x0b, 0xa6, 0x25, 0xf3, 0xca, 0xf2, 0xbe, 0x03, 0x79, 0x29, 0x1b, 0xc1, 0xfe, 0x7f, 0x71, 0x4c, + 0xe7, 0x26, 0x71, 0x4a, 0x8a, 0x26, 0x7a, 0x01, 0x66, 0x3a, 0xbe, 0x37, 0x18, 0xd0, 0xce, 0x86, + 0x72, 0x7f, 0xe9, 0xa4, 0xfb, 0x5b, 0x35, 0xe7, 0x49, 0x02, 0x1d, 0xff, 0xc5, 0x82, 0xb2, 0x72, + 0x26, 0x4a, 0x5d, 0xa1, 0x88, 0xad, 0x07, 0x8e, 0x9e, 0xe9, 0x49, 0xa3, 0xe7, 0x1c, 0xe4, 0xbb, + 0x3c, 0xbe, 0x68, 0x87, 0xa4, 0x46, 0x93, 0x45, 0x55, 0x7c, 0x1d, 0x66, 0x34, 0x2b, 0x47, 0x78, + 0xd4, 0xf9, 0xa4, 0x47, 0xbd, 0xd6, 0xa1, 0x2e, 0x73, 0xb6, 0x9d, 0xd0, 0x47, 0x2a, 0x7c, 0xfc, + 0x43, 0x0b, 0x2a, 0x49, 0x14, 0xb4, 0x9a, 0x28, 0x2c, 0x9e, 0x38, 0x9a, 0x9c, 0x59, 0x53, 0x68, + 0xd2, 0xaa, 0xb2, 0x78, 0xe6, 0x7e, 0x95, 0x45, 0xd5, 0x74, 0x32, 0x45, 0xe5, 0x15, 0xf0, 0x8f, + 0x2d, 0x28, 0xc7, 0x74, 0x89, 0x2e, 0x41, 0x76, 0xdb, 0xf7, 0xfa, 0x13, 0x29, 0x4a, 0xac, 0x40, + 0x5f, 0x85, 0x34, 0xf3, 0x26, 0x52, 0x53, 0x9a, 0x79, 0x5c, 0x4b, 0x8a, 0xfd, 0x8c, 0xcc, 0xdb, + 0xe5, 0x08, 0x3f, 0x03, 0x45, 0xc1, 0xd0, 0x6d, 0xdb, 0xf1, 0xc7, 0x06, 0x8c, 0xf1, 0x0c, 0x3d, + 0x0f, 0xc7, 0xa4, 0x33, 0x1c, 0xbf, 0x78, 0x7a, 0xdc, 0xe2, 0x69, 0xbd, 0xf8, 0x14, 0xe4, 0x44, + 0xd2, 0xc1, 0x97, 0x74, 0x6c, 0x66, 0xeb, 0x25, 0xfc, 0x19, 0x9f, 0x80, 0x59, 0x7e, 0x07, 0xa9, + 0x1f, 0xac, 0x78, 0x43, 0x97, 0xe9, 0xba, 0xe9, 0x3c, 0x54, 0xe3, 0x60, 0x65, 0x25, 0x55, 0xc8, + 0xb5, 0x39, 0x40, 0xd0, 0x28, 0x13, 0x39, 0xc0, 0xbf, 0xb0, 0x00, 0xad, 0x51, 0x26, 0x76, 0xb9, + 0xb6, 0x1a, 0x5e, 0x8f, 0x79, 0x98, 0xea, 0xdb, 0xac, 0xbd, 0x43, 0xfd, 0x40, 0xe7, 0x2f, 0x7a, + 0xfc, 0x79, 0x24, 0x9e, 0xf8, 0x22, 0xcc, 0xc6, 0x4e, 0xa9, 0x78, 0x9a, 0x87, 0xa9, 0xb6, 0x82, + 0xa9, 0x90, 0x17, 0x8e, 0xf1, 0x6f, 0xd3, 0x30, 0xa5, 0xd3, 0x3a, 0x74, 0x11, 0x4a, 0xdb, 0x8e, + 0xdb, 0xa5, 0xfe, 0xc0, 0x77, 0x94, 0x08, 0xb2, 0x32, 0xcd, 0x33, 0xc0, 0xc4, 0x1c, 0xa0, 0xa7, + 0xa0, 0x30, 0x0c, 0xa8, 0xff, 0xa6, 0x23, 0x6f, 0x7a, 0xb1, 0x55, 0xdd, 0x1f, 0x35, 0xf2, 0xaf, + 0x06, 0xd4, 0xbf, 0xb6, 0xca, 0x83, 0xcf, 0x50, 0x3c, 0x11, 0xf9, 0xdf, 0x41, 0x2f, 0x2b, 0x33, + 0x15, 0x09, 0x5c, 0xeb, 0x6b, 0xfc, 0xf8, 0x09, 0x57, 0x37, 0xf0, 0xbd, 0x3e, 0x65, 0x3b, 0x74, + 0x18, 0x34, 0xdb, 0x5e, 0xbf, 0xef, 0xb9, 0x4d, 0xd1, 0x09, 0x10, 0x4c, 0xf3, 0x08, 0xca, 0x97, + 0x2b, 0xcb, 0xdd, 0x84, 0x02, 0xdb, 0xf1, 0xbd, 0x61, 0x77, 0x47, 0x04, 0x86, 0x4c, 0xeb, 0xf2, + 0xe4, 0xf4, 0x34, 0x05, 0xa2, 0x1f, 0xd0, 0xe3, 0x5c, 0x5a, 0xb4, 0xbd, 0x1b, 0x0c, 0xfb, 0xb2, + 0xf6, 0x6c, 0xe5, 0x0e, 0x46, 0x0d, 0xeb, 0x29, 0x12, 0x82, 0xf1, 0x32, 0x94, 0x63, 0xa9, 0x30, + 0xba, 0x00, 0x59, 0x9f, 0x6e, 0x6b, 0x57, 0x80, 0x0e, 0x67, 0xcc, 0x32, 0xfa, 0x73, 0x1c, 0x22, + 0x7e, 0xf1, 0x0f, 0xd2, 0xd0, 0x30, 0xaa, 0xfe, 0xab, 0x9e, 0x7f, 0x83, 0x32, 0xdf, 0x69, 0xdf, + 0xb4, 0xfb, 0x54, 0x9b, 0x57, 0x03, 0x4a, 0x7d, 0x01, 0x7c, 0xd3, 0xb8, 0x45, 0xd0, 0x0f, 0xf1, + 0xd0, 0x63, 0x00, 0xe2, 0xda, 0xc9, 0x79, 0x79, 0xa1, 0x8a, 0x02, 0x22, 0xa6, 0x57, 0x62, 0xc2, + 0x6e, 0x4e, 0x28, 0x1c, 0x25, 0xe4, 0x6b, 0x49, 0x21, 0x4f, 0x4c, 0x27, 0x94, 0xac, 0x79, 0x5d, + 0x72, 0xf1, 0xeb, 0x82, 0xff, 0x61, 0x41, 0x7d, 0x5d, 0x9f, 0xfc, 0x01, 0xc5, 0xa1, 0xf9, 0x4d, + 0x3f, 0x24, 0x7e, 0x33, 0x0f, 0x91, 0xdf, 0x6c, 0x82, 0xdf, 0x3a, 0xc0, 0xba, 0xe3, 0xd2, 0xab, + 0x4e, 0x8f, 0x51, 0x7f, 0x4c, 0x91, 0xf4, 0xa3, 0x4c, 0xe4, 0x71, 0x08, 0xdd, 0xd6, 0x32, 0x58, + 0x31, 0xdc, 0xfc, 0xc3, 0x60, 0x31, 0xfd, 0x10, 0x59, 0xcc, 0x24, 0x3c, 0xa0, 0x0b, 0x85, 0x6d, + 0xc1, 0x9e, 0x8c, 0xd8, 0xb1, 0xfe, 0x53, 0xc4, 0x7b, 0xeb, 0x1b, 0x6a, 0xf3, 0x67, 0xef, 0x93, + 0x70, 0x89, 0xae, 0x60, 0x33, 0xd8, 0x73, 0x99, 0xfd, 0xb6, 0xb1, 0x9e, 0xe8, 0x4d, 0x90, 0xad, + 0x72, 0xba, 0xdc, 0xd8, 0x9c, 0xee, 0x8a, 0xda, 0xe6, 0x7f, 0xc9, 0xeb, 0xf0, 0x95, 0xc8, 0xc1, + 0x0a, 0xa5, 0x28, 0x07, 0xfb, 0xc4, 0xfd, 0xae, 0xbf, 0xba, 0xf4, 0x7f, 0xb4, 0xa0, 0xb2, 0x46, + 0x59, 0x3c, 0xc7, 0x7a, 0x84, 0x54, 0x8a, 0x5f, 0x82, 0xe3, 0xc6, 0xf9, 0x15, 0xf7, 0x4f, 0x27, + 0x12, 0xab, 0x13, 0x11, 0xff, 0xd7, 0xdc, 0x0e, 0x7d, 0x5b, 0xd5, 0xab, 0xf1, 0x9c, 0xea, 0x36, + 0x94, 0x8c, 0x49, 0xb4, 0x9c, 0xc8, 0xa6, 0x66, 0x13, 0x6d, 0x5a, 0x9e, 0x11, 0xb4, 0xaa, 0x8a, + 0x27, 0x59, 0x95, 0xaa, 0x5c, 0x39, 0xcc, 0x3c, 0x36, 0x00, 0x09, 0x75, 0x09, 0xb2, 0x66, 0xec, + 0x13, 0xd0, 0x97, 0xc3, 0xb4, 0x2a, 0x1c, 0xa3, 0xc7, 0x21, 0xeb, 0x7b, 0xf7, 0x74, 0x9a, 0x5c, + 0x8e, 0xb6, 0x24, 0xde, 0x3d, 0x22, 0xa6, 0xf0, 0xf3, 0x90, 0x21, 0xde, 0x3d, 0x54, 0x07, 0xf0, + 0x6d, 0xb7, 0x4b, 0xef, 0x84, 0x05, 0xda, 0x34, 0x31, 0x20, 0x47, 0xe4, 0x25, 0x2b, 0x70, 0xdc, + 0x3c, 0x91, 0x54, 0xf7, 0x22, 0x14, 0x5e, 0x19, 0x9a, 0xe2, 0xaa, 0x26, 0xc4, 0x25, 0xfb, 0x00, + 0x1a, 0x89, 0xdb, 0x0c, 0x44, 0x70, 0x74, 0x1a, 0x8a, 0xcc, 0xde, 0xea, 0xd1, 0x9b, 0x91, 0x0b, + 0x8c, 0x00, 0x7c, 0x96, 0xd7, 0x96, 0x77, 0x8c, 0x04, 0x2b, 0x02, 0xa0, 0xb3, 0x50, 0x89, 0xce, + 0x7c, 0xdb, 0xa7, 0xdb, 0xce, 0xdb, 0x42, 0xc3, 0xd3, 0xe4, 0x10, 0x1c, 0x9d, 0x81, 0x63, 0x11, + 0x6c, 0x43, 0x24, 0x32, 0x59, 0x81, 0x9a, 0x04, 0x73, 0xd9, 0x08, 0x76, 0x5f, 0xbc, 0x3b, 0xb4, + 0x7b, 0xe2, 0xf2, 0x4d, 0x13, 0x03, 0x82, 0xff, 0x64, 0xc1, 0x71, 0xa9, 0x6a, 0x66, 0xb3, 0x47, + 0xd2, 0xea, 0x7f, 0x69, 0x01, 0x32, 0x39, 0x50, 0xa6, 0xf5, 0x65, 0xb3, 0xcf, 0xc4, 0x33, 0xa5, + 0x92, 0x28, 0x99, 0x25, 0x28, 0x6a, 0x15, 0x61, 0xc8, 0xb7, 0x65, 0x3f, 0x4d, 0x34, 0xc6, 0x65, + 0x4d, 0x2e, 0x21, 0x44, 0xfd, 0xa3, 0x06, 0xe4, 0xb6, 0xf6, 0x18, 0x0d, 0x54, 0x45, 0x2d, 0x5a, + 0x09, 0x02, 0x40, 0xe4, 0x1f, 0xdf, 0x8b, 0xba, 0x4c, 0x58, 0x4d, 0x36, 0xda, 0x4b, 0x81, 0x88, + 0x7e, 0xc0, 0xbf, 0x49, 0x43, 0xf9, 0x8e, 0xd7, 0x1b, 0x46, 0x41, 0xf3, 0x51, 0x0a, 0x18, 0xb1, + 0x32, 0x3f, 0xa7, 0xcb, 0x7c, 0x04, 0xd9, 0x80, 0xd1, 0x81, 0xb0, 0xac, 0x0c, 0x11, 0xcf, 0x08, + 0xc3, 0x34, 0xb3, 0xfd, 0x2e, 0x65, 0xb2, 0x78, 0xaa, 0xe5, 0x45, 0x56, 0x1b, 0x83, 0xa1, 0x05, + 0x28, 0xd9, 0xdd, 0xae, 0x4f, 0xbb, 0x36, 0xa3, 0xad, 0xbd, 0x5a, 0x41, 0x6c, 0x66, 0x82, 0xf0, + 0xeb, 0x30, 0xa3, 0x85, 0xa5, 0x54, 0x7a, 0x01, 0x0a, 0x6f, 0x09, 0xc8, 0x98, 0xb6, 0x9b, 0x44, + 0x55, 0x6e, 0x4c, 0xa3, 0xc5, 0x5f, 0x2f, 0xe8, 0x33, 0xe3, 0xeb, 0x90, 0x97, 0xe8, 0xe8, 0xb4, + 0x59, 0x02, 0xc9, 0x2c, 0x90, 0x8f, 0x55, 0x3d, 0x83, 0x21, 0x2f, 0x09, 0x29, 0xc5, 0x0b, 0xdb, + 0x90, 0x10, 0xa2, 0xfe, 0xf1, 0x3f, 0x2d, 0x38, 0xb1, 0x4a, 0x19, 0x6d, 0x33, 0xda, 0xb9, 0xea, + 0xd0, 0x5e, 0xe7, 0x73, 0xad, 0xce, 0xc3, 0x1e, 0x5b, 0xc6, 0xe8, 0xb1, 0x71, 0xbf, 0xd3, 0x73, + 0x5c, 0xba, 0x6e, 0x34, 0x69, 0x22, 0x00, 0xf7, 0x10, 0xdb, 0xfc, 0xe0, 0x72, 0x5a, 0xbe, 0xcf, + 0x31, 0x20, 0xa1, 0x86, 0xf3, 0x91, 0x86, 0xf1, 0xf7, 0x2c, 0x98, 0x4b, 0x72, 0xad, 0x94, 0xd4, + 0x84, 0xbc, 0x58, 0x3c, 0xa6, 0xbd, 0x1b, 0x5b, 0x41, 0x14, 0x1a, 0xba, 0x14, 0xdb, 0x5f, 0xbc, + 0x07, 0x6a, 0xd5, 0x0e, 0x46, 0x8d, 0x6a, 0x04, 0x35, 0x3a, 0x08, 0x06, 0x2e, 0xfe, 0x3d, 0xaf, + 0xb3, 0x4d, 0x9a, 0x42, 0xdf, 0xdc, 0xbe, 0x94, 0xef, 0x95, 0x03, 0xf4, 0x15, 0xc8, 0xb2, 0xbd, + 0x81, 0x72, 0xb9, 0xad, 0x13, 0x9f, 0x8e, 0x1a, 0xc7, 0x63, 0xcb, 0x36, 0xf7, 0x06, 0x94, 0x08, + 0x14, 0x6e, 0x96, 0x6d, 0xdb, 0xef, 0x38, 0xae, 0xdd, 0x73, 0x98, 0x14, 0x63, 0x96, 0x98, 0x20, + 0x54, 0x83, 0xc2, 0xc0, 0xf6, 0x03, 0x9d, 0x37, 0x15, 0x89, 0x1e, 0x8a, 0x16, 0xc8, 0x2e, 0x65, + 0xed, 0x1d, 0xe9, 0x66, 0x55, 0x0b, 0x44, 0x40, 0x62, 0x2d, 0x10, 0x01, 0xc1, 0x3f, 0x37, 0x0c, + 0x47, 0xde, 0x89, 0x2f, 0x9c, 0xe1, 0xe0, 0x6f, 0x45, 0x5a, 0xd6, 0x47, 0x54, 0x5a, 0x7e, 0x01, + 0x66, 0x3a, 0xb1, 0x99, 0xa3, 0xb5, 0x2d, 0xdb, 0xbb, 0x09, 0x74, 0x3c, 0x8c, 0x54, 0x27, 0x20, + 0x47, 0xa8, 0x2e, 0xa1, 0x8f, 0xf4, 0x61, 0x7d, 0x44, 0x52, 0xcf, 0x7c, 0x06, 0xa9, 0xff, 0xdb, + 0x82, 0x4a, 0x94, 0x36, 0x2a, 0x81, 0x57, 0x63, 0x6d, 0x4f, 0x7d, 0x6b, 0x1e, 0xe9, 0x57, 0x93, + 0x35, 0x28, 0x6c, 0x0d, 0xdb, 0xbb, 0x94, 0x05, 0xe2, 0xde, 0x96, 0x89, 0x1e, 0xe2, 0xef, 0x5b, + 0x2a, 0xef, 0x91, 0x12, 0x50, 0xfa, 0x5c, 0x82, 0x82, 0x4f, 0x83, 0x61, 0x8f, 0x69, 0x45, 0xd6, + 0x8c, 0x86, 0xd9, 0x70, 0x4b, 0xbf, 0xfd, 0x18, 0xf6, 0x18, 0xd1, 0x88, 0xe8, 0x0a, 0x94, 0xfb, + 0xd4, 0xef, 0xd2, 0x0d, 0xe6, 0xdb, 0x8c, 0x76, 0xa5, 0x76, 0x66, 0x4c, 0x13, 0xb8, 0x61, 0x4e, + 0x93, 0x38, 0x36, 0xfe, 0xc0, 0x82, 0x99, 0x38, 0x69, 0x34, 0x03, 0x69, 0xa7, 0xa3, 0xb4, 0x90, + 0x76, 0x3a, 0x9f, 0xcb, 0xeb, 0xc1, 0xd0, 0x18, 0xb2, 0x63, 0x8d, 0x21, 0x67, 0x1a, 0xc3, 0x5c, + 0x18, 0x20, 0xf2, 0xc2, 0x30, 0xd5, 0xe8, 0xec, 0x13, 0x50, 0x0c, 0xb5, 0x82, 0x4a, 0x50, 0xb8, + 0x7a, 0x8b, 0xbc, 0xb6, 0x4c, 0x56, 0x2b, 0x29, 0x34, 0x0d, 0x53, 0xad, 0xe5, 0x95, 0x97, 0xc5, + 0xc8, 0x3a, 0x7b, 0x01, 0xca, 0x31, 0x11, 0xa1, 0x32, 0x14, 0xd7, 0x6f, 0xad, 0x6d, 0x6c, 0x92, + 0x17, 0x97, 0x6f, 0x54, 0x52, 0xa8, 0x00, 0x99, 0x8d, 0x57, 0x6f, 0x54, 0x2c, 0xfe, 0xb0, 0x7c, + 0x67, 0xad, 0x92, 0x5e, 0xfa, 0x75, 0x5e, 0x27, 0xa8, 0x3e, 0xfa, 0x3a, 0xe4, 0x64, 0xd6, 0x39, + 0x17, 0x49, 0xdc, 0x7c, 0xfb, 0x3a, 0x7f, 0xf2, 0x10, 0x5c, 0x6a, 0x1b, 0xa7, 0x2e, 0x58, 0xe8, + 0x26, 0x94, 0x04, 0x50, 0xbd, 0xdf, 0x38, 0x9d, 0x7c, 0xcd, 0x10, 0xa3, 0xf4, 0xd8, 0x11, 0xb3, + 0x06, 0xbd, 0xcb, 0x90, 0x93, 0x17, 0x79, 0x2e, 0x51, 0x1c, 0x8c, 0x39, 0x4d, 0xec, 0x8d, 0x0f, + 0x4e, 0xa1, 0xe7, 0x20, 0xbb, 0x69, 0x3b, 0x3d, 0x64, 0xd4, 0x26, 0xc6, 0x6b, 0x89, 0xf9, 0xb9, + 0x24, 0xd8, 0xd8, 0xf6, 0x4a, 0xf8, 0x76, 0xe5, 0x64, 0xb2, 0xc5, 0xab, 0x97, 0xd7, 0x0e, 0x4f, + 0x84, 0x3b, 0xdf, 0x92, 0xef, 0x00, 0x74, 0xa3, 0x11, 0x3d, 0x16, 0xdf, 0x2a, 0xd1, 0x97, 0x9c, + 0xaf, 0x1f, 0x35, 0x1d, 0x12, 0x5c, 0x87, 0x92, 0xd1, 0xe4, 0x33, 0xc5, 0x7a, 0xb8, 0x43, 0x69, + 0x8a, 0x75, 0x4c, 0x67, 0x10, 0xa7, 0xd0, 0x1a, 0x4c, 0xf1, 0x8a, 0x4e, 0xbc, 0x0c, 0x3c, 0x95, + 0x2c, 0xdc, 0x8c, 0x84, 0x7d, 0xfe, 0xf4, 0xf8, 0xc9, 0x90, 0xd0, 0x37, 0xa1, 0xb8, 0x46, 0x99, + 0xca, 0x7a, 0x4e, 0x26, 0xd3, 0xa6, 0x31, 0x92, 0x8a, 0xa7, 0x5e, 0x38, 0x85, 0x5e, 0x17, 0xc5, + 0x65, 0x3c, 0xe8, 0xa3, 0xc6, 0x11, 0xc1, 0x3d, 0x3c, 0xd7, 0xc2, 0xd1, 0x08, 0x21, 0xe5, 0xd7, + 0x62, 0x94, 0x55, 0x7e, 0xd8, 0x38, 0x22, 0x90, 0x84, 0x94, 0x1b, 0xf7, 0xf9, 0x54, 0x08, 0xa7, + 0x96, 0xde, 0xd0, 0x5f, 0xcb, 0xac, 0xda, 0xcc, 0x46, 0xb7, 0x60, 0x46, 0xc8, 0x32, 0xfc, 0x9c, + 0x26, 0x66, 0xf3, 0x87, 0xbe, 0xdd, 0x89, 0xd9, 0xfc, 0xe1, 0x6f, 0x78, 0x70, 0xaa, 0xf5, 0xc6, + 0xfb, 0x1f, 0xd5, 0x53, 0x1f, 0x7c, 0x54, 0x4f, 0x7d, 0xf2, 0x51, 0xdd, 0xfa, 0xee, 0x7e, 0xdd, + 0xfa, 0xd5, 0x7e, 0xdd, 0x7a, 0x6f, 0xbf, 0x6e, 0xbd, 0xbf, 0x5f, 0xb7, 0xfe, 0xb6, 0x5f, 0xb7, + 0xfe, 0xbe, 0x5f, 0x4f, 0x7d, 0xb2, 0x5f, 0xb7, 0xde, 0xf9, 0xb8, 0x9e, 0x7a, 0xff, 0xe3, 0x7a, + 0xea, 0x83, 0x8f, 0xeb, 0xa9, 0x6f, 0x3f, 0x79, 0xff, 0x46, 0x8a, 0x74, 0x52, 0x79, 0xf1, 0xf7, + 0xf4, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x2d, 0x64, 0x68, 0xd3, 0x25, 0x00, 0x00, } func (x Direction) String() string { @@ -5446,6 +5437,9 @@ func (this *SubQueryResult) Equal(that interface{}) bool { } else if this == nil { return false } + if this.Id != that1.Id { + return false + } if !this.Start.Equal(that1.Start) { return false } @@ -5458,20 +5452,9 @@ func (this *SubQueryResult) Equal(that interface{}) bool { if this.Limit != that1.Limit { return false } - if len(this.Shards) != len(that1.Shards) { - return false - } - for i := range this.Shards { - if this.Shards[i] != that1.Shards[i] { - return false - } - } if this.Volume != that1.Volume { return false } - if this.Id != that1.Id { - return false - } return true } func (this *LabelToValuesResponse) GoString() string { @@ -6218,15 +6201,14 @@ func (this *SubQueryResult) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 11) + s := make([]string, 0, 10) s = append(s, "&logproto.SubQueryResult{") + s = append(s, "Id: "+fmt.Sprintf("%#v", this.Id)+",\n") s = append(s, "Start: "+fmt.Sprintf("%#v", this.Start)+",\n") s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") s = append(s, "Limit: "+fmt.Sprintf("%#v", this.Limit)+",\n") - s = append(s, "Shards: "+fmt.Sprintf("%#v", this.Shards)+",\n") s = append(s, "Volume: "+fmt.Sprintf("%#v", this.Volume)+",\n") - s = append(s, "Id: "+fmt.Sprintf("%#v", this.Id)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -9431,38 +9413,22 @@ func (m *SubQueryResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintLogproto(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x3a - } if m.Volume != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Volume)) i-- dAtA[i] = 0x30 } - if len(m.Shards) > 0 { - for iNdEx := len(m.Shards) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Shards[iNdEx]) - copy(dAtA[i:], m.Shards[iNdEx]) - i = encodeVarintLogproto(dAtA, i, uint64(len(m.Shards[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } if m.Limit != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Limit)) i-- - dAtA[i] = 0x20 + dAtA[i] = 0x28 } if len(m.Query) > 0 { i -= len(m.Query) copy(dAtA[i:], m.Query) i = encodeVarintLogproto(dAtA, i, uint64(len(m.Query))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } n30, err30 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):]) if err30 != nil { @@ -9471,7 +9437,7 @@ func (m *SubQueryResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n30 i = encodeVarintLogproto(dAtA, i, uint64(n30)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a n31, err31 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) if err31 != nil { return 0, err31 @@ -9479,7 +9445,14 @@ func (m *SubQueryResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n31 i = encodeVarintLogproto(dAtA, i, uint64(n31)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } @@ -10628,6 +10601,10 @@ func (m *SubQueryResult) Size() (n int) { } var l int _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Start) n += 1 + l + sovLogproto(uint64(l)) l = github_com_gogo_protobuf_types.SizeOfStdTime(m.End) @@ -10639,19 +10616,9 @@ func (m *SubQueryResult) Size() (n int) { if m.Limit != 0 { n += 1 + sovLogproto(uint64(m.Limit)) } - if len(m.Shards) > 0 { - for _, s := range m.Shards { - l = len(s) - n += 1 + l + sovLogproto(uint64(l)) - } - } if m.Volume != 0 { n += 1 + sovLogproto(uint64(m.Volume)) } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovLogproto(uint64(l)) - } return n } @@ -11428,13 +11395,12 @@ func (this *SubQueryResult) String() string { return "nil" } s := strings.Join([]string{`&SubQueryResult{`, + `Id:` + fmt.Sprintf("%v", this.Id) + `,`, `Start:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Start), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, `End:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, `Limit:` + fmt.Sprintf("%v", this.Limit) + `,`, - `Shards:` + fmt.Sprintf("%v", this.Shards) + `,`, `Volume:` + fmt.Sprintf("%v", this.Volume) + `,`, - `Id:` + fmt.Sprintf("%v", this.Id) + `,`, `}`, }, "") return s @@ -19109,9 +19075,9 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto @@ -19121,28 +19087,27 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthLogproto } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthLogproto } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Start, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field End", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -19169,15 +19134,15 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.End, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Start, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field End", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto @@ -19187,46 +19152,28 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthLogproto } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthLogproto } if postIndex > l { return io.ErrUnexpectedEOF } - m.Query = string(dAtA[iNdEx:postIndex]) + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.End, dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - m.Limit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowLogproto - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Limit |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -19254,13 +19201,13 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Shards = append(m.Shards, string(dAtA[iNdEx:postIndex])) + m.Query = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 5: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) } - m.Volume = 0 + m.Limit = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto @@ -19270,16 +19217,16 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Volume |= uint64(b&0x7F) << shift + m.Limit |= uint32(b&0x7F) << shift if b < 0x80 { break } } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) } - var stringLen uint64 + m.Volume = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowLogproto @@ -19289,24 +19236,11 @@ func (m *SubQueryResult) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Volume |= uint64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthLogproto - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthLogproto - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index d8f03d3aecaad..c088c1169894c 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -532,17 +532,16 @@ enum MergeStrategy { } message SubQueryResult { - google.protobuf.Timestamp start = 1 [ + string id = 1; + google.protobuf.Timestamp start = 2 [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; - google.protobuf.Timestamp end = 2 [ + google.protobuf.Timestamp end = 3 [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false ]; - string query = 3; - uint32 limit = 4; - repeated string shards = 5 [(gogoproto.jsontag) = "shards,omitempty"]; + string query = 4; + uint32 limit = 5; uint64 volume = 6; - string id = 7; } \ No newline at end of file diff --git a/pkg/querier/adaptive_splitting.go b/pkg/querier/adaptive_splitting.go index b82f9f9850429..8e666d15ecfb0 100644 --- a/pkg/querier/adaptive_splitting.go +++ b/pkg/querier/adaptive_splitting.go @@ -64,7 +64,7 @@ func (d *AdaptiveShardDistributor) DistributeShards(query string, start, end mod }) b := math.Min(bucketCount, len(d.Shards)) if b <= 0 { - results := append(subqueries, &logproto.SubQueryResult{Query: query, Start: start.Time(), End: end.Time(), Shards: []string{}, Volume: 0, Id: "sub1"}) + results := append(subqueries, &logproto.SubQueryResult{Query: query, Start: start.Time(), End: end.Time(), Volume: 0, Id: "sub1"}) return results } @@ -97,7 +97,6 @@ func (d *AdaptiveShardDistributor) createSubquery(originalQuery string, start, e Query: modifiedQuery, Start: start.Time(), End: end.Time(), - Shards: shards, Volume: vol, Id: fmt.Sprintf("sub%d", bucketIndex+1)} } diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index ccb6268f337f8..2860f93b9905f 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -566,6 +566,8 @@ func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto } var matchers []*labels.Matcher + + // todo(shantanu): also do this for ingester queries if req.Query != "" { matchers, err = syntax.ParseMatchers(req.Query, true) if err != nil { @@ -577,6 +579,7 @@ func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto through := model.TimeFromUnixNano(storeQueryInterval.end.UnixNano()) streamShardValues, err := q.store.LabelValuesForMetricName(ctx, userID, from, through, "logs", streamShardLabel, matchers...) + if err != nil { return nil, err } From b8e7a399f1f42317997a4aa4ee55b36f28909978 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Wed, 21 Aug 2024 19:25:40 +0530 Subject: [PATCH 6/8] Rename stream shard splitter --- pkg/querier/querier.go | 4 +- pkg/querier/querier_test.go | 38 +++++++++++++++++++ pkg/querier/queryrange/codec.go | 9 ++++- ..._splitting.go => stream_shard_splitter.go} | 12 +++--- 4 files changed, 54 insertions(+), 9 deletions(-) rename pkg/querier/{adaptive_splitting.go => stream_shard_splitter.go} (82%) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 8ba393f01851c..c92ecbf482642 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -597,8 +597,8 @@ func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto } } - d := NewAdaptiveShardDistributor(volumes) - subqueries := d.DistributeShards(req.Query, from, through, int(req.Buckets)) + d := NewStreamShardSplitter(volumes) + subqueries := d.GetSubQueries(req.Query, from, through, int(req.Buckets)) return &logproto.QueryPlanResponse{ Results: subqueries, }, nil diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index 9e98a780561f3..6e0c94abd4d1c 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -1484,6 +1484,44 @@ func TestQuerier_DetectedLabels(t *testing.T) { } }) + t.Run("store response is present, but value returned is nil", func(t *testing.T) { + ingesterClient := newQuerierClientMock() + storeClient := newStoreMock() + + ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(nil, nil) + storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return([]string{"storeLabel", "commonLabel"}, nil). + On("LabelValuesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, "storeLabel", mock.Anything). + Return([]string{"val1", "val2"}, nil). + On("LabelValuesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, "commonLabel", mock.Anything). + Return([]string{}, nil) + + querier, err := newQuerier( + conf, + mockIngesterClientConfig(), + newIngesterClientMockFactory(ingesterClient), + mockReadRingWithOneActiveIngester(), + &mockDeleteGettter{}, + storeClient, limits) + require.NoError(t, err) + + resp, err := querier.DetectedLabels(ctx, &request) + require.NoError(t, err) + + calls := ingesterClient.GetMockedCallsByMethod("GetDetectedLabels") + assert.Equal(t, 1, len(calls)) + + detectedLabels := resp.DetectedLabels + assert.Len(t, detectedLabels, 4) + + expectedCardinality := map[string]uint64{"storeLabel": 2, "ingesterLabel": 3, "cluster": 1, "commonLabel": 5} + for _, d := range detectedLabels { + card := expectedCardinality[d.Label] + assert.Equal(t, d.Cardinality, card, "Expected cardinality mismatch for: ", d.Label) + } + }) + t.Run("returns a response when ingester data is empty", func(t *testing.T) { ingesterClient := newQuerierClientMock() storeClient := newStoreMock() diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index df59f93f7135b..aa6e5d4d0ebd4 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -1046,7 +1046,8 @@ func (c Codec) Path(r queryrangebase.Request) string { return "/loki/api/v1/patterns" case *DetectedLabelsRequest: return "/loki/api/v1/detected_labels" - // todo(shantanu): add missing api here. + case *logproto.QueryPlanRequest: + return "/loki/api/v1/query/plan" } return "other" @@ -1175,6 +1176,12 @@ func decodeResponseJSONFrom(buf []byte, req queryrangebase.Request, headers http Headers: httpResponseHeadersToPromResponseHeaders(headers), }, nil // todo (shantanu) another missing case here? + case *logproto.QueryPlanRequest: + var resp logproto.QueryPlanResponse + if err := json.Unmarshal(buf, &resp); err != nil { + return nil, httpgrpc.Errorf(http.StatusInternalServerError, "error decoding response: %v", err) + } + return &QueryPlanResponse{Response: &resp, Headers: httpResponseHeadersToPromResponseHeaders(headers)}, nil default: var resp loghttp.QueryResponse if err := resp.UnmarshalJSON(buf); err != nil { diff --git a/pkg/querier/adaptive_splitting.go b/pkg/querier/stream_shard_splitter.go similarity index 82% rename from pkg/querier/adaptive_splitting.go rename to pkg/querier/stream_shard_splitter.go index 8e666d15ecfb0..bb5fcdd63bc8c 100644 --- a/pkg/querier/adaptive_splitting.go +++ b/pkg/querier/stream_shard_splitter.go @@ -23,18 +23,18 @@ type Bucket struct { Volume uint64 } -type AdaptiveShardDistributor struct { +type StreamShardSplitter struct { Shards []Shard Buckets []Bucket } -func NewAdaptiveShardDistributor(volumes []Shard) *AdaptiveShardDistributor { - return &AdaptiveShardDistributor{ +func NewStreamShardSplitter(volumes []Shard) *StreamShardSplitter { + return &StreamShardSplitter{ Shards: volumes, } } -func (d *AdaptiveShardDistributor) createBuckets(bucketCount int) { +func (d *StreamShardSplitter) createBuckets(bucketCount int) { totalVolume := uint64(0) for _, shard := range d.Shards { totalVolume += shard.Volume @@ -57,7 +57,7 @@ func (d *AdaptiveShardDistributor) createBuckets(bucketCount int) { } } -func (d *AdaptiveShardDistributor) DistributeShards(query string, start, end model.Time, bucketCount int) []*logproto.SubQueryResult { +func (d *StreamShardSplitter) GetSubQueries(query string, start, end model.Time, bucketCount int) []*logproto.SubQueryResult { var subqueries []*logproto.SubQueryResult sort.Slice(d.Shards, func(i, j int) bool { return d.Shards[i].Volume > d.Shards[j].Volume @@ -78,7 +78,7 @@ func (d *AdaptiveShardDistributor) DistributeShards(query string, start, end mod return subqueries } -func (d *AdaptiveShardDistributor) createSubquery(originalQuery string, start, end model.Time, shards []string, bucketIndex int, vol uint64) *logproto.SubQueryResult { +func (d *StreamShardSplitter) createSubquery(originalQuery string, start, end model.Time, shards []string, bucketIndex int, vol uint64) *logproto.SubQueryResult { shardRegex := strings.Join(shards, "|") // Parse the original query to insert the __stream_shard__ label matcher From b5e5923ee33691e8d10ffaf77c8fe4797574e214 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Tue, 27 Aug 2024 16:31:19 +0530 Subject: [PATCH 7/8] wip --- pkg/querier/querier.go | 8 +++-- pkg/querier/querier_mock_test.go | 5 +-- pkg/querier/querier_test.go | 52 ++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index c92ecbf482642..93efb53dd0409 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -597,6 +597,10 @@ func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto } } + // split based on hierarchy - other labels within that stream + // split based on chunk id? but that's not a label, then how + // split only when the volume reaches beyond certain threshold + // dynamic label combination - frequently occurring labels for a tenant? d := NewStreamShardSplitter(volumes) subqueries := d.GetSubQueries(req.Query, from, through, int(req.Buckets)) return &logproto.QueryPlanResponse{ @@ -1042,7 +1046,7 @@ func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabel if ingesterLabels != nil { for label, val := range ingesterLabels.Labels { - if _, isStatic := staticLabels[label]; isStatic || !containsAllIDTypes(val.Values) { + if _, isStatic := staticLabels[label]; (isStatic && val.Values != nil) || !containsAllIDTypes(val.Values) { _, ok := dlMap[label] if !ok { dlMap[label] = newParsedLabels() @@ -1057,7 +1061,7 @@ func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabel } for label, values := range storeLabelsMap { - if _, isStatic := staticLabels[label]; isStatic || !containsAllIDTypes(values) { + if _, isStatic := staticLabels[label]; (isStatic && values != nil) || !containsAllIDTypes(values) { _, ok := dlMap[label] if !ok { dlMap[label] = newParsedLabels() diff --git a/pkg/querier/querier_mock_test.go b/pkg/querier/querier_mock_test.go index c6c9c2de4508f..f05eec09adf1b 100644 --- a/pkg/querier/querier_mock_test.go +++ b/pkg/querier/querier_mock_test.go @@ -379,8 +379,9 @@ func (s *storeMock) GetSeries(_ context.Context, _ string, _, _ model.Time, _ .. panic("don't call me please") } -func (s *storeMock) Stats(_ context.Context, _ string, _, _ model.Time, _ ...*labels.Matcher) (*stats.Stats, error) { - return nil, nil +func (s *storeMock) Stats(ctx context.Context, userID string, from, through model.Time, matchers ...*labels.Matcher) (*stats.Stats, error) { + args := s.Called(ctx, userID, from, through, matchers[0], matchers[1], matchers[2]) + return args.Get(0).(*stats.Stats), nil } func (s *storeMock) GetShards(_ context.Context, _ string, _, _ model.Time, _ uint64, _ chunk.Predicate) (*logproto.ShardsResponse, error) { diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index 6e0c94abd4d1c..ced6dbb6d43f3 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -15,7 +15,9 @@ import ( "github.com/grafana/dskit/ring" ring_client "github.com/grafana/dskit/ring/client" "github.com/grafana/dskit/user" + "github.com/grafana/loki/v3/pkg/storage/stores/index/stats" "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/model/labels" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -2005,3 +2007,53 @@ func BenchmarkQuerierDetectedFields(b *testing.B) { assert.NoError(b, err) } } + +func Benchmark_QuerierSelectQueryPlan(b *testing.B) { + startTime := time.Now().Add(-1 * time.Minute) + endTime := time.Now() + + limits, _ := validation.NewOverrides(defaultLimitsTestConfig(), nil) + ctx := user.InjectOrgID(context.Background(), "test") + + conf := mockQuerierConfig() + ingesterClient := newQuerierClientMock() + + request := logproto.QueryPlanRequest{ + Query: "{app=`test`, foo=`bar`}", + Limit: 10, + Start: startTime, + End: endTime, + Buckets: 3, + Direction: logproto.FORWARD, + } + + appTestMatcher := labels.MustNewMatcher(labels.MatchEqual, "app", "test") + fooBarMatcher := labels.MustNewMatcher(labels.MatchEqual, "foo", "bar") + s1 := labels.MustNewMatcher(labels.MatchEqual, "__stream_shard__", "1") + s2 := labels.MustNewMatcher(labels.MatchEqual, "__stream_shard__", "2") + + store := newStoreMock() + store. + On("LabelValuesForMetricName", mock.Anything, "test", model.TimeFromUnixNano(startTime.UnixNano()), model.TimeFromUnixNano(endTime.UnixNano()), "logs", "__stream_shard__", mock.Anything). + Return([]string{"1", "2"}, nil) + store.On("Stats", mock.Anything, "test", model.TimeFromUnixNano(startTime.UnixNano()), model.TimeFromUnixNano(endTime.UnixNano()), appTestMatcher, fooBarMatcher, s1). + Return(&stats.Stats{Streams: 100, Chunks: 100, Bytes: 100, Entries: 100}) + store.On("Stats", mock.Anything, "test", model.TimeFromUnixNano(startTime.UnixNano()), model.TimeFromUnixNano(endTime.UnixNano()), appTestMatcher, fooBarMatcher, s2). + Return(&stats.Stats{Streams: 200, Chunks: 200, Bytes: 200, Entries: 200}) + + querier, _ := newQuerier( + conf, + mockIngesterClientConfig(), + newIngesterClientMockFactory(ingesterClient), + mockReadRingWithOneActiveIngester(), + &mockDeleteGettter{}, + store, limits) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, err := querier.SelectQueryPlan(ctx, &request) + assert.NoError(b, err) + } +} From c78a45cd55d14a5669df7adaa3265c9617381f3e Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Thu, 5 Sep 2024 17:25:59 +0530 Subject: [PATCH 8/8] Add chunkrefs strategy to query plan api --- pkg/loghttp/query_plan.go | 1 + pkg/logproto/logproto.pb.go | 477 +++++++++++++++++----------- pkg/logproto/logproto.proto | 3 +- pkg/querier/querier.go | 45 ++- pkg/querier/queryrange/codec.go | 8 +- pkg/querier/queryrange/roundtrip.go | 11 + pkg/storage/store.go | 12 + 7 files changed, 367 insertions(+), 190 deletions(-) diff --git a/pkg/loghttp/query_plan.go b/pkg/loghttp/query_plan.go index ecb9cfd00f540..5823eebc7813d 100644 --- a/pkg/loghttp/query_plan.go +++ b/pkg/loghttp/query_plan.go @@ -28,6 +28,7 @@ func ParseQueryPlanRequest(r *http.Request) (*logproto.QueryPlanRequest, error) return nil, err } req.Buckets = b + req.Strategy = r.Form.Get("strategy") return req, nil } diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index bf1c5d5d2eff9..74b3870809fff 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -3098,6 +3098,7 @@ type QueryPlanRequest struct { End time.Time `protobuf:"bytes,4,opt,name=end,proto3,stdtime" json:"end"` Direction Direction `protobuf:"varint,5,opt,name=direction,proto3,enum=logproto.Direction" json:"direction,omitempty"` Buckets uint32 `protobuf:"varint,6,opt,name=buckets,proto3" json:"buckets,omitempty"` + Strategy string `protobuf:"bytes,7,opt,name=strategy,proto3" json:"strategy,omitempty"` } func (m *QueryPlanRequest) Reset() { *m = QueryPlanRequest{} } @@ -3174,9 +3175,17 @@ func (m *QueryPlanRequest) GetBuckets() uint32 { return 0 } +func (m *QueryPlanRequest) GetStrategy() string { + if m != nil { + return m.Strategy + } + return "" +} + type QueryPlanResponse struct { Results []*SubQueryResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` MergeStrategy MergeStrategy `protobuf:"varint,2,opt,name=mergeStrategy,proto3,enum=logproto.MergeStrategy" json:"mergeStrategy,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` } func (m *QueryPlanResponse) Reset() { *m = QueryPlanResponse{} } @@ -3225,6 +3234,13 @@ func (m *QueryPlanResponse) GetMergeStrategy() MergeStrategy { return LOGSTREAM } +func (m *QueryPlanResponse) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + type SubQueryResult struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Start time.Time `protobuf:"bytes,2,opt,name=start,proto3,stdtime" json:"start"` @@ -3375,188 +3391,189 @@ func init() { func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2891 bytes of a gzipped FileDescriptorProto + // 2908 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6c, 0x1b, 0xc7, - 0x95, 0xcb, 0x3f, 0x1f, 0x45, 0x99, 0x1e, 0xd1, 0x32, 0x21, 0x3b, 0xa4, 0x32, 0x68, 0x13, 0xd7, + 0x95, 0xcb, 0x3f, 0x1f, 0x45, 0x99, 0x1e, 0xd3, 0x36, 0x21, 0x3b, 0xa4, 0x32, 0x68, 0x13, 0xd7, 0x76, 0x44, 0x5b, 0x69, 0x52, 0xc7, 0xa9, 0x9b, 0x8a, 0x52, 0xac, 0xd8, 0x91, 0x3f, 0x19, 0x29, - 0x4e, 0x5a, 0x34, 0x08, 0x56, 0xe4, 0x88, 0x5a, 0x88, 0xdc, 0xa5, 0x77, 0x87, 0x71, 0x74, 0x2b, - 0x50, 0xa0, 0xb7, 0xa2, 0x01, 0x7a, 0x68, 0x7b, 0x29, 0x50, 0xa0, 0x40, 0x8b, 0x02, 0xb9, 0x14, - 0x3d, 0x15, 0x45, 0x7b, 0xe9, 0x21, 0xbd, 0xe5, 0x18, 0xe4, 0xc0, 0x36, 0xca, 0xa5, 0x10, 0x50, - 0x20, 0x40, 0x81, 0x16, 0xc8, 0xa5, 0xc5, 0xfc, 0x76, 0x67, 0x57, 0x54, 0x1d, 0xb9, 0x2e, 0x12, - 0x5f, 0xc8, 0x99, 0x37, 0x6f, 0xde, 0xcc, 0xfb, 0xcc, 0x7b, 0x6f, 0xde, 0x2c, 0x9c, 0x1a, 0xee, - 0xf4, 0x5a, 0x7d, 0xaf, 0x37, 0xf4, 0x3d, 0xe6, 0x85, 0x8d, 0x05, 0xf1, 0x8b, 0x8a, 0xba, 0x3f, - 0x57, 0xeb, 0x79, 0x3d, 0x4f, 0xe2, 0xf0, 0x96, 0x1c, 0x9f, 0x6b, 0xf6, 0x3c, 0xaf, 0xd7, 0xa7, - 0x2d, 0xd1, 0xdb, 0x1c, 0x6d, 0xb5, 0x98, 0x33, 0xa0, 0x01, 0xb3, 0x07, 0x43, 0x85, 0x30, 0xaf, - 0xa8, 0xdf, 0xed, 0x0f, 0xbc, 0x2e, 0xed, 0xb7, 0x02, 0x66, 0xb3, 0x40, 0xfe, 0x2a, 0x8c, 0x19, - 0x8e, 0x31, 0x1c, 0x05, 0xdb, 0xe2, 0x47, 0x01, 0x2f, 0x70, 0x60, 0xc0, 0x3c, 0xdf, 0xee, 0xd1, - 0x56, 0x67, 0x7b, 0xe4, 0xee, 0xb4, 0x3a, 0x76, 0x67, 0x9b, 0xb6, 0x7c, 0x1a, 0x8c, 0xfa, 0x2c, - 0x90, 0x1d, 0xb6, 0x3b, 0xa4, 0x8a, 0x0c, 0xfe, 0xad, 0x05, 0x27, 0xd6, 0xec, 0x4d, 0xda, 0xdf, - 0xf0, 0xee, 0xd8, 0xfd, 0x11, 0x0d, 0x08, 0x0d, 0x86, 0x9e, 0x1b, 0x50, 0xb4, 0x0c, 0xf9, 0x3e, - 0x1f, 0x08, 0xea, 0xd6, 0x7c, 0xe6, 0x4c, 0x79, 0xf1, 0xdc, 0x42, 0xc8, 0xe4, 0xc4, 0x09, 0x12, - 0x1a, 0xbc, 0xe8, 0x32, 0x7f, 0x97, 0xa8, 0xa9, 0x73, 0x77, 0xa0, 0x6c, 0x80, 0x51, 0x15, 0x32, - 0x3b, 0x74, 0xb7, 0x6e, 0xcd, 0x5b, 0x67, 0x4a, 0x84, 0x37, 0xd1, 0x45, 0xc8, 0xbd, 0xc5, 0xc9, - 0xd4, 0xd3, 0xf3, 0xd6, 0x99, 0xf2, 0xe2, 0xa9, 0x68, 0x91, 0x57, 0x5d, 0xe7, 0xee, 0x88, 0x8a, - 0xd9, 0x6a, 0x21, 0x89, 0x79, 0x39, 0x7d, 0xc9, 0xc2, 0xe7, 0xe0, 0xf8, 0x81, 0x71, 0x34, 0x0b, - 0x79, 0x81, 0x21, 0x77, 0x5c, 0x22, 0xaa, 0x87, 0x6b, 0x80, 0xd6, 0x99, 0x4f, 0xed, 0x01, 0xb1, - 0x19, 0xdf, 0xef, 0xdd, 0x11, 0x0d, 0x18, 0xbe, 0x01, 0x33, 0x31, 0xa8, 0x62, 0xfb, 0x59, 0x28, - 0x07, 0x11, 0x58, 0xf1, 0x5e, 0x8b, 0xb6, 0x15, 0xcd, 0x21, 0x26, 0x22, 0xfe, 0x99, 0x05, 0x10, - 0x8d, 0xa1, 0x06, 0x80, 0x1c, 0x7d, 0xc9, 0x0e, 0xb6, 0x05, 0xc3, 0x59, 0x62, 0x40, 0xd0, 0x79, - 0x38, 0x1e, 0xf5, 0x6e, 0x7a, 0xeb, 0xdb, 0xb6, 0xdf, 0x15, 0x32, 0xc8, 0x92, 0x83, 0x03, 0x08, - 0x41, 0xd6, 0xb7, 0x19, 0xad, 0x67, 0xe6, 0xad, 0x33, 0x19, 0x22, 0xda, 0x9c, 0x5b, 0x46, 0x5d, - 0xdb, 0x65, 0xf5, 0xac, 0x10, 0xa7, 0xea, 0x71, 0x38, 0xb7, 0x08, 0x1a, 0xd4, 0x73, 0xf3, 0xd6, - 0x99, 0x0a, 0x51, 0x3d, 0xfc, 0xcf, 0x0c, 0x4c, 0xbd, 0x32, 0xa2, 0xfe, 0xae, 0x12, 0x00, 0x6a, - 0x40, 0x31, 0xa0, 0x7d, 0xda, 0x61, 0x9e, 0x2f, 0x35, 0xd2, 0x4e, 0xd7, 0x2d, 0x12, 0xc2, 0x50, - 0x0d, 0x72, 0x7d, 0x67, 0xe0, 0x30, 0xb1, 0xad, 0x0a, 0x91, 0x1d, 0x74, 0x19, 0x72, 0x01, 0xb3, - 0x7d, 0x26, 0xf6, 0x52, 0x5e, 0x9c, 0x5b, 0x90, 0xa6, 0xbc, 0xa0, 0x4d, 0x79, 0x61, 0x43, 0x9b, - 0x72, 0xbb, 0xf8, 0xde, 0xb8, 0x99, 0x7a, 0xe7, 0x2f, 0x4d, 0x8b, 0xc8, 0x29, 0xe8, 0x59, 0xc8, - 0x50, 0xb7, 0x2b, 0xf6, 0xfb, 0x59, 0x67, 0xf2, 0x09, 0xe8, 0x22, 0x94, 0xba, 0x8e, 0x4f, 0x3b, - 0xcc, 0xf1, 0x5c, 0xc1, 0xd5, 0xf4, 0xe2, 0x4c, 0xa4, 0x91, 0x15, 0x3d, 0x44, 0x22, 0x2c, 0x74, - 0x1e, 0xf2, 0x01, 0x17, 0x5d, 0x50, 0x2f, 0x70, 0x5b, 0x68, 0xd7, 0xf6, 0xc7, 0xcd, 0xaa, 0x84, - 0x9c, 0xf7, 0x06, 0x0e, 0xa3, 0x83, 0x21, 0xdb, 0x25, 0x0a, 0x07, 0x9d, 0x85, 0x42, 0x97, 0xf6, - 0x29, 0x57, 0x78, 0x51, 0x28, 0xbc, 0x6a, 0x90, 0x17, 0x03, 0x44, 0x23, 0xa0, 0x37, 0x20, 0x3b, - 0xec, 0xdb, 0x6e, 0xbd, 0x24, 0xb8, 0x98, 0x8e, 0x10, 0x6f, 0xf7, 0x6d, 0xb7, 0xfd, 0xdc, 0x87, - 0xe3, 0xe6, 0x33, 0x3d, 0x87, 0x6d, 0x8f, 0x36, 0x17, 0x3a, 0xde, 0xa0, 0xd5, 0xf3, 0xed, 0x2d, - 0xdb, 0xb5, 0x5b, 0x7d, 0x6f, 0xc7, 0x69, 0xbd, 0xf5, 0x74, 0x8b, 0x1f, 0xd0, 0xbb, 0x23, 0xea, - 0x3b, 0xd4, 0x6f, 0x71, 0x32, 0x0b, 0x42, 0x25, 0x7c, 0x2a, 0x11, 0x64, 0xd1, 0x75, 0x6e, 0x7f, - 0x9e, 0x4f, 0x97, 0xf9, 0xe9, 0x0d, 0xea, 0x20, 0x56, 0x39, 0x19, 0xad, 0x22, 0xe0, 0x84, 0x6e, - 0xad, 0xfa, 0xde, 0x68, 0xd8, 0x3e, 0xb6, 0x3f, 0x6e, 0x9a, 0xf8, 0xc4, 0xec, 0x5c, 0xcf, 0x16, - 0xf3, 0xd5, 0x02, 0x7e, 0x37, 0x03, 0x68, 0xdd, 0x1e, 0x0c, 0xfb, 0xf4, 0x48, 0xea, 0x0f, 0x15, - 0x9d, 0x7e, 0x60, 0x45, 0x67, 0x8e, 0xaa, 0xe8, 0x48, 0x6b, 0xd9, 0xa3, 0x69, 0x2d, 0xf7, 0x59, - 0xb5, 0x96, 0xff, 0xc2, 0x6b, 0x0d, 0xd7, 0x21, 0xcb, 0x29, 0x73, 0x67, 0xe9, 0xdb, 0xf7, 0x84, - 0x6e, 0xa6, 0x08, 0x6f, 0xe2, 0x35, 0xc8, 0x4b, 0xbe, 0xd0, 0x5c, 0x52, 0x79, 0xf1, 0x73, 0x1b, - 0x29, 0x2e, 0xa3, 0x55, 0x52, 0x8d, 0x54, 0x92, 0x11, 0xc2, 0xc6, 0xbf, 0xb7, 0xa0, 0xa2, 0x2c, - 0x42, 0xf9, 0xbe, 0x4d, 0x28, 0x48, 0xdf, 0xa3, 0xfd, 0xde, 0xc9, 0xa4, 0xdf, 0x5b, 0xea, 0xda, - 0x43, 0x46, 0xfd, 0x76, 0xeb, 0xbd, 0x71, 0xd3, 0xfa, 0x70, 0xdc, 0x7c, 0xf2, 0x30, 0xa1, 0xe9, - 0xe8, 0xa4, 0xfd, 0xa5, 0x26, 0x8c, 0xce, 0x89, 0xdd, 0xb1, 0x40, 0x99, 0xd5, 0xb1, 0x05, 0x19, - 0xd4, 0xae, 0xb9, 0x3d, 0x1a, 0x70, 0xca, 0x59, 0x6e, 0x11, 0x44, 0xe2, 0x70, 0x36, 0xef, 0xd9, - 0xbe, 0xeb, 0xb8, 0xbd, 0xa0, 0x9e, 0x11, 0x3e, 0x3d, 0xec, 0xe3, 0x9f, 0x58, 0x30, 0x13, 0x33, - 0x6b, 0xc5, 0xc4, 0x25, 0xc8, 0x07, 0x5c, 0x53, 0x9a, 0x07, 0xc3, 0x28, 0xd6, 0x05, 0xbc, 0x3d, - 0xad, 0x36, 0x9f, 0x97, 0x7d, 0xa2, 0xf0, 0x1f, 0xde, 0xd6, 0xfe, 0x64, 0xc1, 0x94, 0x08, 0x4c, - 0xfa, 0xac, 0x21, 0xc8, 0xba, 0xf6, 0x80, 0x2a, 0x55, 0x89, 0xb6, 0x11, 0xad, 0xf8, 0x72, 0x45, - 0x1d, 0xad, 0x8e, 0xea, 0x60, 0xad, 0x07, 0x76, 0xb0, 0x56, 0x74, 0xee, 0x6a, 0x90, 0xe3, 0xe6, - 0xbd, 0x2b, 0x9c, 0x6b, 0x89, 0xc8, 0x0e, 0x7e, 0x12, 0x2a, 0x8a, 0x0b, 0x25, 0xda, 0xc3, 0x02, - 0xec, 0x00, 0xf2, 0x52, 0x13, 0xe8, 0x4b, 0x50, 0x0a, 0x53, 0x19, 0xc1, 0x6d, 0xa6, 0x9d, 0xdf, - 0x1f, 0x37, 0xd3, 0x2c, 0x20, 0xd1, 0x00, 0x6a, 0x9a, 0x41, 0xdf, 0x6a, 0x97, 0xf6, 0xc7, 0x4d, - 0x09, 0x50, 0x21, 0x1e, 0x9d, 0x86, 0xec, 0x36, 0x8f, 0x9b, 0x5c, 0x04, 0xd9, 0x76, 0x71, 0x7f, - 0xdc, 0x14, 0x7d, 0x22, 0x7e, 0xf1, 0x2a, 0x4c, 0xad, 0xd1, 0x9e, 0xdd, 0xd9, 0x55, 0x8b, 0xd6, - 0x34, 0x39, 0xbe, 0xa0, 0xa5, 0x69, 0x3c, 0x0e, 0x53, 0xe1, 0x8a, 0x6f, 0x0e, 0x02, 0x75, 0x1a, - 0xca, 0x21, 0xec, 0x46, 0x80, 0x7f, 0x6a, 0x81, 0xb2, 0x01, 0x84, 0x8d, 0x6c, 0x87, 0xfb, 0x42, - 0xd8, 0x1f, 0x37, 0x15, 0x44, 0x27, 0x33, 0xe8, 0x79, 0x28, 0x04, 0x62, 0x45, 0x4e, 0x2c, 0x69, - 0x5a, 0x62, 0xa0, 0x7d, 0x8c, 0x9b, 0xc8, 0xfe, 0xb8, 0xa9, 0x11, 0x89, 0x6e, 0xa0, 0x85, 0x58, - 0x42, 0x20, 0x19, 0x9b, 0xde, 0x1f, 0x37, 0x0d, 0xa8, 0x99, 0x20, 0xe0, 0x4f, 0x2d, 0x28, 0x6f, - 0xd8, 0x4e, 0x68, 0x42, 0x75, 0xad, 0xa2, 0xc8, 0x57, 0x4b, 0x00, 0xb7, 0xc4, 0x2e, 0xed, 0xdb, - 0xbb, 0x57, 0x3d, 0x5f, 0xd0, 0xad, 0x90, 0xb0, 0x1f, 0xc5, 0xf0, 0xec, 0xc4, 0x18, 0x9e, 0x3b, - 0xba, 0x6b, 0xff, 0xff, 0x3a, 0xd2, 0xeb, 0xd9, 0x62, 0xba, 0x9a, 0xc1, 0xef, 0x5a, 0x30, 0x25, - 0x99, 0x57, 0x96, 0xf7, 0x1d, 0xc8, 0x4b, 0xd9, 0x08, 0xf6, 0xff, 0x8b, 0x63, 0x3a, 0x77, 0x14, - 0xa7, 0xa4, 0x68, 0xa2, 0x17, 0x60, 0xba, 0xeb, 0x7b, 0xc3, 0x21, 0xed, 0xae, 0x2b, 0xf7, 0x97, - 0x4e, 0xba, 0xbf, 0x15, 0x73, 0x9c, 0x24, 0xd0, 0xf1, 0x9f, 0x2d, 0xa8, 0x28, 0x67, 0xa2, 0xd4, - 0x15, 0x8a, 0xd8, 0x7a, 0xe0, 0xe8, 0x99, 0x3e, 0x6a, 0xf4, 0x9c, 0x85, 0x7c, 0x8f, 0xc7, 0x17, - 0xed, 0x90, 0x54, 0xef, 0x68, 0x51, 0x15, 0x5f, 0x87, 0x69, 0xcd, 0xca, 0x21, 0x1e, 0x75, 0x2e, - 0xe9, 0x51, 0xaf, 0x75, 0xa9, 0xcb, 0x9c, 0x2d, 0x27, 0xf4, 0x91, 0x0a, 0x1f, 0xff, 0xd0, 0x82, - 0x6a, 0x12, 0x05, 0xad, 0x24, 0x2e, 0x16, 0x4f, 0x1c, 0x4e, 0xce, 0xbc, 0x53, 0x68, 0xd2, 0xea, - 0x66, 0xf1, 0xcc, 0xfd, 0x6e, 0x16, 0x35, 0xd3, 0xc9, 0x94, 0x94, 0x57, 0xc0, 0x3f, 0xb6, 0xa0, - 0x12, 0xd3, 0x25, 0xba, 0x04, 0xd9, 0x2d, 0xdf, 0x1b, 0x1c, 0x49, 0x51, 0x62, 0x06, 0xfa, 0x2a, - 0xa4, 0x99, 0x77, 0x24, 0x35, 0xa5, 0x99, 0xc7, 0xb5, 0xa4, 0xd8, 0xcf, 0xc8, 0xbc, 0x5d, 0xf6, - 0xf0, 0x33, 0x50, 0x12, 0x0c, 0xdd, 0xb6, 0x1d, 0x7f, 0x62, 0xc0, 0x98, 0xcc, 0xd0, 0xf3, 0x70, - 0x4c, 0x3a, 0xc3, 0xc9, 0x93, 0xa7, 0x26, 0x4d, 0x9e, 0xd2, 0x93, 0x4f, 0x41, 0x4e, 0x24, 0x1d, - 0x7c, 0x4a, 0xd7, 0x66, 0xb6, 0x9e, 0xc2, 0xdb, 0xf8, 0x04, 0xcc, 0xf0, 0x33, 0x48, 0xfd, 0x60, - 0xd9, 0x1b, 0xb9, 0x4c, 0xdf, 0x9b, 0xce, 0x43, 0x2d, 0x0e, 0x56, 0x56, 0x52, 0x83, 0x5c, 0x87, - 0x03, 0x04, 0x8d, 0x0a, 0x91, 0x1d, 0xfc, 0x0b, 0x0b, 0xd0, 0x2a, 0x65, 0x62, 0x95, 0x6b, 0x2b, - 0xe1, 0xf1, 0x98, 0x83, 0xe2, 0xc0, 0x66, 0x9d, 0x6d, 0xea, 0x07, 0x3a, 0x7f, 0xd1, 0xfd, 0xcf, - 0x23, 0xf1, 0xc4, 0x17, 0x61, 0x26, 0xb6, 0x4b, 0xc5, 0xd3, 0x1c, 0x14, 0x3b, 0x0a, 0xa6, 0x42, - 0x5e, 0xd8, 0xc7, 0xbf, 0x49, 0x43, 0x51, 0xa7, 0x75, 0xe8, 0x22, 0x94, 0xb7, 0x1c, 0xb7, 0x47, - 0xfd, 0xa1, 0xef, 0x28, 0x11, 0x64, 0x65, 0x9a, 0x67, 0x80, 0x89, 0xd9, 0x41, 0x4f, 0x41, 0x61, - 0x14, 0x50, 0xff, 0x4d, 0x47, 0x9e, 0xf4, 0x52, 0xbb, 0xb6, 0x37, 0x6e, 0xe6, 0x5f, 0x0d, 0xa8, - 0x7f, 0x6d, 0x85, 0x07, 0x9f, 0x91, 0x68, 0x11, 0xf9, 0xdf, 0x45, 0x2f, 0x2b, 0x33, 0x15, 0x09, - 0x5c, 0xfb, 0x6b, 0x7c, 0xfb, 0x09, 0x57, 0x37, 0xf4, 0xbd, 0x01, 0x65, 0xdb, 0x74, 0x14, 0xb4, - 0x3a, 0xde, 0x60, 0xe0, 0xb9, 0x2d, 0x51, 0x3b, 0x10, 0x4c, 0xf3, 0x08, 0xca, 0xa7, 0x2b, 0xcb, - 0xdd, 0x80, 0x02, 0xdb, 0xf6, 0xbd, 0x51, 0x6f, 0x5b, 0x04, 0x86, 0x4c, 0xfb, 0xf2, 0xd1, 0xe9, - 0x69, 0x0a, 0x44, 0x37, 0xd0, 0xe3, 0x5c, 0x5a, 0xb4, 0xb3, 0x13, 0x8c, 0x06, 0xf2, 0xee, 0xd9, - 0xce, 0xed, 0x8f, 0x9b, 0xd6, 0x53, 0x24, 0x04, 0xe3, 0x25, 0xa8, 0xc4, 0x52, 0x61, 0x74, 0x01, - 0xb2, 0x3e, 0xdd, 0xd2, 0xae, 0x00, 0x1d, 0xcc, 0x98, 0x65, 0xf4, 0xe7, 0x38, 0x44, 0xfc, 0xe2, - 0x1f, 0xa4, 0xa1, 0x69, 0xdc, 0xfa, 0xaf, 0x7a, 0xfe, 0x0d, 0xca, 0x7c, 0xa7, 0x73, 0xd3, 0x1e, - 0x50, 0x6d, 0x5e, 0x4d, 0x28, 0x0f, 0x04, 0xf0, 0x4d, 0xe3, 0x14, 0xc1, 0x20, 0xc4, 0x43, 0x8f, - 0x01, 0x88, 0x63, 0x27, 0xc7, 0xe5, 0x81, 0x2a, 0x09, 0x88, 0x18, 0x5e, 0x8e, 0x09, 0xbb, 0x75, - 0x44, 0xe1, 0x28, 0x21, 0x5f, 0x4b, 0x0a, 0xf9, 0xc8, 0x74, 0x42, 0xc9, 0x9a, 0xc7, 0x25, 0x17, - 0x3f, 0x2e, 0xf8, 0xef, 0x16, 0x34, 0xd6, 0xf4, 0xce, 0x1f, 0x50, 0x1c, 0x9a, 0xdf, 0xf4, 0x43, - 0xe2, 0x37, 0xf3, 0x10, 0xf9, 0xcd, 0x26, 0xf8, 0x6d, 0x00, 0xac, 0x39, 0x2e, 0xbd, 0xea, 0xf4, - 0x19, 0xf5, 0x27, 0x5c, 0x92, 0x7e, 0x94, 0x89, 0x3c, 0x0e, 0xa1, 0x5b, 0x5a, 0x06, 0xcb, 0x86, - 0x9b, 0x7f, 0x18, 0x2c, 0xa6, 0x1f, 0x22, 0x8b, 0x99, 0x84, 0x07, 0x74, 0xa1, 0xb0, 0x25, 0xd8, - 0x93, 0x11, 0x3b, 0x56, 0x7f, 0x8a, 0x78, 0x6f, 0x7f, 0x43, 0x2d, 0xfe, 0xec, 0x7d, 0x12, 0x2e, - 0x51, 0x47, 0x6c, 0x05, 0xbb, 0x2e, 0xb3, 0xdf, 0x36, 0xe6, 0x13, 0xbd, 0x08, 0xb2, 0x55, 0x4e, - 0x97, 0x9b, 0x98, 0xd3, 0x5d, 0x51, 0xcb, 0xfc, 0x2f, 0x79, 0x1d, 0xbe, 0x12, 0x39, 0x58, 0xa1, - 0x14, 0xe5, 0x60, 0x9f, 0xb8, 0xdf, 0xf1, 0x57, 0x87, 0xfe, 0x0f, 0x16, 0x54, 0x57, 0x29, 0x8b, - 0xe7, 0x58, 0x8f, 0x90, 0x4a, 0xf1, 0x4b, 0x70, 0xdc, 0xd8, 0xbf, 0xe2, 0xfe, 0xe9, 0x44, 0x62, - 0x75, 0x22, 0xe2, 0xff, 0x9a, 0xdb, 0xa5, 0x6f, 0xab, 0xfb, 0x6a, 0x3c, 0xa7, 0xba, 0x0d, 0x65, - 0x63, 0x10, 0x2d, 0x25, 0xb2, 0xa9, 0x99, 0x44, 0x99, 0x96, 0x67, 0x04, 0xed, 0x9a, 0xe2, 0x49, - 0xde, 0x4a, 0x55, 0xae, 0x1c, 0x66, 0x1e, 0xeb, 0x80, 0x84, 0xba, 0x04, 0x59, 0x33, 0xf6, 0x09, - 0xe8, 0xcb, 0x61, 0x5a, 0x15, 0xf6, 0xd1, 0xe3, 0x90, 0xf5, 0xbd, 0x7b, 0x3a, 0x4d, 0xae, 0x44, - 0x4b, 0x12, 0xef, 0x1e, 0x11, 0x43, 0xf8, 0x79, 0xc8, 0x10, 0xef, 0x1e, 0x6a, 0x00, 0xf8, 0xb6, - 0xdb, 0xa3, 0x77, 0xc2, 0x0b, 0xda, 0x14, 0x31, 0x20, 0x87, 0xe4, 0x25, 0xcb, 0x70, 0xdc, 0xdc, - 0x91, 0x54, 0xf7, 0x02, 0x14, 0x5e, 0x19, 0x99, 0xe2, 0xaa, 0x25, 0xc4, 0x25, 0xeb, 0x00, 0x1a, - 0x89, 0xdb, 0x0c, 0x44, 0x70, 0x74, 0x1a, 0x4a, 0xcc, 0xde, 0xec, 0xd3, 0x9b, 0x91, 0x0b, 0x8c, - 0x00, 0x7c, 0x94, 0xdf, 0x2d, 0xef, 0x18, 0x09, 0x56, 0x04, 0x40, 0x67, 0xa1, 0x1a, 0xed, 0xf9, - 0xb6, 0x4f, 0xb7, 0x9c, 0xb7, 0x85, 0x86, 0xa7, 0xc8, 0x01, 0x38, 0x3a, 0x03, 0xc7, 0x22, 0xd8, - 0xba, 0x48, 0x64, 0xb2, 0x02, 0x35, 0x09, 0xe6, 0xb2, 0x11, 0xec, 0xbe, 0x78, 0x77, 0x64, 0xf7, - 0xc5, 0xe1, 0x9b, 0x22, 0x06, 0x04, 0xff, 0xd1, 0x82, 0xe3, 0x52, 0xd5, 0xcc, 0x66, 0x8f, 0xa4, - 0xd5, 0xff, 0xd2, 0x02, 0x64, 0x72, 0xa0, 0x4c, 0xeb, 0xcb, 0x66, 0x9d, 0x89, 0x67, 0x4a, 0x65, - 0x71, 0x65, 0x96, 0xa0, 0xa8, 0x54, 0x84, 0x21, 0xdf, 0x91, 0xf5, 0x34, 0x51, 0x18, 0x97, 0x77, - 0x72, 0x09, 0x21, 0xea, 0x1f, 0x35, 0x21, 0xb7, 0xb9, 0xcb, 0x68, 0xa0, 0x6e, 0xd4, 0xa2, 0x94, - 0x20, 0x00, 0x44, 0xfe, 0xf1, 0xb5, 0xa8, 0xcb, 0x84, 0xd5, 0x64, 0xa3, 0xb5, 0x14, 0x88, 0xe8, - 0x06, 0xfe, 0x57, 0x1a, 0x2a, 0x77, 0xbc, 0xfe, 0x28, 0x0a, 0x9a, 0x8f, 0x52, 0xc0, 0x88, 0x5d, - 0xf3, 0x73, 0xfa, 0x9a, 0x8f, 0x20, 0x1b, 0x30, 0x3a, 0x14, 0x96, 0x95, 0x21, 0xa2, 0x8d, 0x30, - 0x4c, 0x31, 0xdb, 0xef, 0x51, 0x26, 0x2f, 0x4f, 0xf5, 0xbc, 0xc8, 0x6a, 0x63, 0x30, 0x34, 0x0f, - 0x65, 0xbb, 0xd7, 0xf3, 0x69, 0xcf, 0x66, 0xb4, 0xbd, 0x5b, 0x2f, 0x88, 0xc5, 0x4c, 0x10, 0xba, - 0x0e, 0xd3, 0x1d, 0xbb, 0xb3, 0xed, 0xb8, 0xbd, 0x5b, 0x43, 0xe6, 0x78, 0x6e, 0x50, 0x2f, 0x8a, - 0xd0, 0x71, 0x7a, 0xc1, 0x7c, 0x68, 0x5a, 0x58, 0x8e, 0xe1, 0x28, 0x3f, 0x96, 0x98, 0x89, 0x5f, - 0x87, 0x69, 0x2d, 0x78, 0x65, 0x1e, 0x17, 0xa0, 0xf0, 0x96, 0x80, 0x4c, 0x28, 0xe1, 0x49, 0x54, - 0x45, 0x4a, 0xa3, 0xc5, 0x9f, 0x2a, 0x34, 0xff, 0xf8, 0x3a, 0xe4, 0x25, 0x3a, 0x3a, 0x6d, 0x5e, - 0xa7, 0x64, 0x46, 0xc9, 0xfb, 0xea, 0x6e, 0x84, 0x21, 0x2f, 0x09, 0x29, 0x23, 0x12, 0x76, 0x26, - 0x21, 0x44, 0xfd, 0xe3, 0x7f, 0x58, 0x70, 0x62, 0x85, 0x32, 0xda, 0x61, 0xb4, 0x7b, 0xd5, 0xa1, - 0xfd, 0xee, 0xe7, 0x7a, 0xd3, 0x0f, 0xeb, 0x75, 0x19, 0xa3, 0x5e, 0xc7, 0x7d, 0x58, 0xdf, 0x71, - 0xe9, 0x9a, 0x51, 0xf0, 0x89, 0x00, 0xdc, 0xdb, 0x6c, 0xf1, 0x8d, 0xcb, 0x61, 0xf9, 0x36, 0x64, - 0x40, 0x42, 0x6b, 0xc9, 0x47, 0xd6, 0x82, 0xbf, 0x67, 0xc1, 0x6c, 0x92, 0x6b, 0xa5, 0xa4, 0x16, - 0xe4, 0xc5, 0xe4, 0x09, 0xa5, 0xe2, 0xd8, 0x0c, 0xa2, 0xd0, 0xd0, 0xa5, 0xd8, 0xfa, 0xe2, 0x4d, - 0xa9, 0x5d, 0xdf, 0x1f, 0x37, 0x6b, 0x11, 0xd4, 0xa8, 0x46, 0x18, 0xb8, 0xf8, 0x77, 0xfc, 0xce, - 0x6e, 0xd2, 0x14, 0xfa, 0xe6, 0xb6, 0xaa, 0xfc, 0xb8, 0xec, 0xa0, 0xaf, 0x40, 0x96, 0xed, 0x0e, - 0x95, 0xfb, 0x6e, 0x9f, 0xf8, 0x74, 0xdc, 0x3c, 0x1e, 0x9b, 0xb6, 0xb1, 0x3b, 0xa4, 0x44, 0xa0, - 0x70, 0x13, 0xef, 0xd8, 0x7e, 0xd7, 0x71, 0xed, 0xbe, 0xc3, 0xa4, 0x18, 0xb3, 0xc4, 0x04, 0xa1, - 0x3a, 0x14, 0x86, 0xb6, 0x1f, 0xe8, 0x1c, 0xac, 0x44, 0x74, 0x57, 0x94, 0x53, 0x76, 0x28, 0xeb, - 0x6c, 0x4b, 0x97, 0xad, 0xca, 0x29, 0x02, 0x12, 0x2b, 0xa7, 0x08, 0x08, 0xfe, 0xb9, 0x61, 0x38, - 0xf2, 0x7c, 0x7d, 0xe1, 0x0c, 0x07, 0x7f, 0x2b, 0xd2, 0xb2, 0xde, 0xa2, 0xd2, 0xf2, 0x0b, 0x30, - 0xdd, 0x8d, 0x8d, 0x1c, 0xae, 0x6d, 0x59, 0x2a, 0x4e, 0xa0, 0xe3, 0x51, 0xa4, 0x3a, 0x01, 0x39, - 0x44, 0x75, 0x09, 0x7d, 0xa4, 0x0f, 0xea, 0x23, 0x92, 0x7a, 0xe6, 0x33, 0x48, 0xfd, 0xdf, 0x16, - 0x54, 0xa3, 0x14, 0x54, 0x09, 0xbc, 0x16, 0x2b, 0xa1, 0xea, 0x53, 0xf3, 0x48, 0x3f, 0x73, 0xd6, - 0xa1, 0xb0, 0x39, 0xea, 0xec, 0x50, 0x16, 0x88, 0x73, 0x5b, 0x21, 0xba, 0x8b, 0xbf, 0x6f, 0xa9, - 0x1c, 0x4a, 0x4a, 0x40, 0xe9, 0x73, 0x11, 0x0a, 0xca, 0x43, 0x2b, 0x45, 0xd6, 0x8d, 0xe2, 0xdb, - 0x68, 0x53, 0xbf, 0xa4, 0x8c, 0xfa, 0x8c, 0x68, 0x44, 0x74, 0x05, 0x2a, 0x03, 0xea, 0xf7, 0xe8, - 0x3a, 0xf3, 0x6d, 0x46, 0x7b, 0x52, 0x3b, 0xd3, 0xa6, 0x09, 0xdc, 0x30, 0x87, 0x49, 0x1c, 0x1b, - 0x7f, 0x60, 0xc1, 0x74, 0x9c, 0x34, 0x9a, 0x86, 0xb4, 0xd3, 0x55, 0x5a, 0x48, 0x3b, 0xdd, 0xcf, - 0xe5, 0xa9, 0x31, 0x34, 0x86, 0xec, 0x44, 0x63, 0xc8, 0x99, 0xc6, 0x30, 0x1b, 0x06, 0x88, 0xbc, - 0x30, 0x4c, 0xd5, 0x3b, 0xfb, 0x04, 0x94, 0x42, 0xad, 0xa0, 0x32, 0x14, 0xae, 0xde, 0x22, 0xaf, - 0x2d, 0x91, 0x95, 0x6a, 0x0a, 0x4d, 0x41, 0xb1, 0xbd, 0xb4, 0xfc, 0xb2, 0xe8, 0x59, 0x67, 0x2f, - 0x40, 0x25, 0x26, 0x22, 0x54, 0x81, 0xd2, 0xda, 0xad, 0xd5, 0xf5, 0x0d, 0xf2, 0xe2, 0xd2, 0x8d, - 0x6a, 0x0a, 0x15, 0x20, 0xb3, 0xfe, 0xea, 0x8d, 0xaa, 0xc5, 0x1b, 0x4b, 0x77, 0x56, 0xab, 0xe9, - 0xc5, 0x5f, 0xe7, 0x75, 0xb2, 0xeb, 0xa3, 0xaf, 0x43, 0x4e, 0x66, 0xb0, 0xb3, 0x91, 0xc4, 0xcd, - 0x97, 0xdc, 0xb9, 0x93, 0x07, 0xe0, 0x52, 0xdb, 0x38, 0x75, 0xc1, 0x42, 0x37, 0xa1, 0x2c, 0x80, - 0xea, 0xad, 0xe4, 0x74, 0xf2, 0xc9, 0x22, 0x46, 0xe9, 0xb1, 0x43, 0x46, 0x0d, 0x7a, 0x97, 0x21, - 0x27, 0x0f, 0xf2, 0x6c, 0xe2, 0xa2, 0x31, 0x61, 0x37, 0xb1, 0xd7, 0x23, 0x9c, 0x42, 0xcf, 0x41, - 0x76, 0xc3, 0x76, 0xfa, 0xc8, 0xb8, 0xe7, 0x18, 0x4f, 0x1c, 0x73, 0xb3, 0x49, 0xb0, 0xb1, 0xec, - 0x95, 0xf0, 0xa5, 0xe6, 0x64, 0xb2, 0x5c, 0xac, 0xa7, 0xd7, 0x0f, 0x0e, 0x84, 0x2b, 0xdf, 0x92, - 0xef, 0x09, 0xba, 0x68, 0x89, 0x1e, 0x8b, 0x2f, 0x95, 0xa8, 0x71, 0xce, 0x35, 0x0e, 0x1b, 0x0e, - 0x09, 0xae, 0x41, 0xd9, 0x28, 0x18, 0x9a, 0x62, 0x3d, 0x58, 0xed, 0x34, 0xc5, 0x3a, 0xa1, 0xca, - 0x88, 0x53, 0x68, 0x15, 0x8a, 0xfc, 0x76, 0x28, 0x1e, 0x16, 0x4f, 0x25, 0x2f, 0x81, 0x46, 0xf2, - 0x3f, 0x77, 0x7a, 0xf2, 0x60, 0x48, 0xe8, 0x9b, 0x50, 0x5a, 0xa5, 0x4c, 0x65, 0x3d, 0x27, 0x93, - 0x69, 0xd3, 0x04, 0x49, 0xc5, 0x53, 0x2f, 0x9c, 0x42, 0xaf, 0x8b, 0x8b, 0x6a, 0x3c, 0xe8, 0xa3, - 0xe6, 0x21, 0xc1, 0x3d, 0xdc, 0xd7, 0xfc, 0xe1, 0x08, 0x21, 0xe5, 0xd7, 0x62, 0x94, 0x55, 0xae, - 0xd9, 0x3c, 0x24, 0x90, 0x84, 0x94, 0x9b, 0xf7, 0xf9, 0xec, 0x08, 0xa7, 0x16, 0xdf, 0xd0, 0x5f, - 0xde, 0xac, 0xd8, 0xcc, 0x46, 0xb7, 0x60, 0x5a, 0xc8, 0x32, 0xfc, 0x34, 0x27, 0x66, 0xf3, 0x07, - 0xbe, 0x03, 0x8a, 0xd9, 0xfc, 0xc1, 0xef, 0x81, 0x70, 0xaa, 0xfd, 0xc6, 0xfb, 0x1f, 0x35, 0x52, - 0x1f, 0x7c, 0xd4, 0x48, 0x7d, 0xf2, 0x51, 0xc3, 0xfa, 0xee, 0x5e, 0xc3, 0xfa, 0xd5, 0x5e, 0xc3, - 0x7a, 0x6f, 0xaf, 0x61, 0xbd, 0xbf, 0xd7, 0xb0, 0xfe, 0xba, 0xd7, 0xb0, 0xfe, 0xb6, 0xd7, 0x48, - 0x7d, 0xb2, 0xd7, 0xb0, 0xde, 0xf9, 0xb8, 0x91, 0x7a, 0xff, 0xe3, 0x46, 0xea, 0x83, 0x8f, 0x1b, - 0xa9, 0x6f, 0x3f, 0x79, 0xff, 0xa2, 0x8c, 0x74, 0x52, 0x79, 0xf1, 0xf7, 0xf4, 0x7f, 0x02, 0x00, - 0x00, 0xff, 0xff, 0xa7, 0x4e, 0x7c, 0x76, 0x51, 0x26, 0x00, 0x00, + 0x4e, 0x5a, 0x34, 0x08, 0x56, 0xe4, 0x88, 0x5c, 0x88, 0xdc, 0xa5, 0x77, 0x87, 0x71, 0x74, 0x2b, + 0xd0, 0x73, 0xd1, 0x00, 0x3d, 0xf4, 0x07, 0x14, 0x28, 0x50, 0xa0, 0x45, 0x81, 0x5c, 0x8a, 0x9e, + 0x8a, 0xa2, 0xbd, 0xf4, 0x90, 0xde, 0x72, 0x0c, 0x72, 0x60, 0x1b, 0xe5, 0x52, 0x08, 0x28, 0x10, + 0xa0, 0x40, 0x0b, 0xe4, 0x54, 0xcc, 0x6f, 0x77, 0x76, 0x45, 0xd5, 0x91, 0xeb, 0x22, 0xf1, 0x85, + 0x9c, 0x79, 0xf3, 0xe6, 0xcd, 0xbc, 0xcf, 0xbc, 0x79, 0xef, 0xcd, 0xc2, 0xa9, 0xd1, 0x76, 0xaf, + 0x35, 0xf0, 0x7a, 0x23, 0xdf, 0x63, 0x5e, 0xd8, 0x58, 0x10, 0xbf, 0xa8, 0xa8, 0xfb, 0x73, 0xb5, + 0x9e, 0xd7, 0xf3, 0x24, 0x0e, 0x6f, 0xc9, 0xf1, 0xb9, 0x66, 0xcf, 0xf3, 0x7a, 0x03, 0xda, 0x12, + 0xbd, 0xcd, 0xf1, 0x56, 0x8b, 0x39, 0x43, 0x1a, 0x30, 0x7b, 0x38, 0x52, 0x08, 0xf3, 0x8a, 0xfa, + 0xdd, 0xc1, 0xd0, 0xeb, 0xd2, 0x41, 0x2b, 0x60, 0x36, 0x0b, 0xe4, 0xaf, 0xc2, 0x38, 0xc6, 0x31, + 0x46, 0xe3, 0xa0, 0x2f, 0x7e, 0x14, 0xf0, 0x02, 0x07, 0x06, 0xcc, 0xf3, 0xed, 0x1e, 0x6d, 0x75, + 0xfa, 0x63, 0x77, 0xbb, 0xd5, 0xb1, 0x3b, 0x7d, 0xda, 0xf2, 0x69, 0x30, 0x1e, 0xb0, 0x40, 0x76, + 0xd8, 0xce, 0x88, 0x2a, 0x32, 0xf8, 0x77, 0x16, 0x1c, 0x5f, 0xb3, 0x37, 0xe9, 0x60, 0xc3, 0xbb, + 0x63, 0x0f, 0xc6, 0x34, 0x20, 0x34, 0x18, 0x79, 0x6e, 0x40, 0xd1, 0x32, 0xe4, 0x07, 0x7c, 0x20, + 0xa8, 0x5b, 0xf3, 0x99, 0x33, 0xe5, 0xc5, 0x73, 0x0b, 0x21, 0x93, 0x53, 0x27, 0x48, 0x68, 0xf0, + 0xa2, 0xcb, 0xfc, 0x1d, 0xa2, 0xa6, 0xce, 0xdd, 0x81, 0xb2, 0x01, 0x46, 0x55, 0xc8, 0x6c, 0xd3, + 0x9d, 0xba, 0x35, 0x6f, 0x9d, 0x29, 0x11, 0xde, 0x44, 0x17, 0x21, 0xf7, 0x16, 0x27, 0x53, 0x4f, + 0xcf, 0x5b, 0x67, 0xca, 0x8b, 0xa7, 0xa2, 0x45, 0x5e, 0x75, 0x9d, 0xbb, 0x63, 0x2a, 0x66, 0xab, + 0x85, 0x24, 0xe6, 0xe5, 0xf4, 0x25, 0x0b, 0x9f, 0x83, 0xa3, 0xfb, 0xc6, 0xd1, 0x09, 0xc8, 0x0b, + 0x0c, 0xb9, 0xe3, 0x12, 0x51, 0x3d, 0x5c, 0x03, 0xb4, 0xce, 0x7c, 0x6a, 0x0f, 0x89, 0xcd, 0xf8, + 0x7e, 0xef, 0x8e, 0x69, 0xc0, 0xf0, 0x0d, 0x38, 0x16, 0x83, 0x2a, 0xb6, 0x9f, 0x85, 0x72, 0x10, + 0x81, 0x15, 0xef, 0xb5, 0x68, 0x5b, 0xd1, 0x1c, 0x62, 0x22, 0xe2, 0x9f, 0x5b, 0x00, 0xd1, 0x18, + 0x6a, 0x00, 0xc8, 0xd1, 0x97, 0xec, 0xa0, 0x2f, 0x18, 0xce, 0x12, 0x03, 0x82, 0xce, 0xc3, 0xd1, + 0xa8, 0x77, 0xd3, 0x5b, 0xef, 0xdb, 0x7e, 0x57, 0xc8, 0x20, 0x4b, 0xf6, 0x0f, 0x20, 0x04, 0x59, + 0xdf, 0x66, 0xb4, 0x9e, 0x99, 0xb7, 0xce, 0x64, 0x88, 0x68, 0x73, 0x6e, 0x19, 0x75, 0x6d, 0x97, + 0xd5, 0xb3, 0x42, 0x9c, 0xaa, 0xc7, 0xe1, 0xdc, 0x22, 0x68, 0x50, 0xcf, 0xcd, 0x5b, 0x67, 0x2a, + 0x44, 0xf5, 0xf0, 0xbf, 0x32, 0x30, 0xf3, 0xca, 0x98, 0xfa, 0x3b, 0x4a, 0x00, 0xa8, 0x01, 0xc5, + 0x80, 0x0e, 0x68, 0x87, 0x79, 0xbe, 0xd4, 0x48, 0x3b, 0x5d, 0xb7, 0x48, 0x08, 0x43, 0x35, 0xc8, + 0x0d, 0x9c, 0xa1, 0xc3, 0xc4, 0xb6, 0x2a, 0x44, 0x76, 0xd0, 0x65, 0xc8, 0x05, 0xcc, 0xf6, 0x99, + 0xd8, 0x4b, 0x79, 0x71, 0x6e, 0x41, 0x9a, 0xf2, 0x82, 0x36, 0xe5, 0x85, 0x0d, 0x6d, 0xca, 0xed, + 0xe2, 0x7b, 0x93, 0x66, 0xea, 0x9d, 0xbf, 0x36, 0x2d, 0x22, 0xa7, 0xa0, 0x67, 0x21, 0x43, 0xdd, + 0xae, 0xd8, 0xef, 0x67, 0x9d, 0xc9, 0x27, 0xa0, 0x8b, 0x50, 0xea, 0x3a, 0x3e, 0xed, 0x30, 0xc7, + 0x73, 0x05, 0x57, 0xb3, 0x8b, 0xc7, 0x22, 0x8d, 0xac, 0xe8, 0x21, 0x12, 0x61, 0xa1, 0xf3, 0x90, + 0x0f, 0xb8, 0xe8, 0x82, 0x7a, 0x81, 0xdb, 0x42, 0xbb, 0xb6, 0x37, 0x69, 0x56, 0x25, 0xe4, 0xbc, + 0x37, 0x74, 0x18, 0x1d, 0x8e, 0xd8, 0x0e, 0x51, 0x38, 0xe8, 0x2c, 0x14, 0xba, 0x74, 0x40, 0xb9, + 0xc2, 0x8b, 0x42, 0xe1, 0x55, 0x83, 0xbc, 0x18, 0x20, 0x1a, 0x01, 0xbd, 0x01, 0xd9, 0xd1, 0xc0, + 0x76, 0xeb, 0x25, 0xc1, 0xc5, 0x6c, 0x84, 0x78, 0x7b, 0x60, 0xbb, 0xed, 0xe7, 0x3e, 0x9c, 0x34, + 0x9f, 0xe9, 0x39, 0xac, 0x3f, 0xde, 0x5c, 0xe8, 0x78, 0xc3, 0x56, 0xcf, 0xb7, 0xb7, 0x6c, 0xd7, + 0x6e, 0x0d, 0xbc, 0x6d, 0xa7, 0xf5, 0xd6, 0xd3, 0x2d, 0x7e, 0x40, 0xef, 0x8e, 0xa9, 0xef, 0x50, + 0xbf, 0xc5, 0xc9, 0x2c, 0x08, 0x95, 0xf0, 0xa9, 0x44, 0x90, 0x45, 0xd7, 0xb9, 0xfd, 0x79, 0x3e, + 0x5d, 0xe6, 0xa7, 0x37, 0xa8, 0x83, 0x58, 0xe5, 0x64, 0xb4, 0x8a, 0x80, 0x13, 0xba, 0xb5, 0xea, + 0x7b, 0xe3, 0x51, 0xfb, 0xc8, 0xde, 0xa4, 0x69, 0xe2, 0x13, 0xb3, 0x73, 0x3d, 0x5b, 0xcc, 0x57, + 0x0b, 0xf8, 0xdd, 0x0c, 0xa0, 0x75, 0x7b, 0x38, 0x1a, 0xd0, 0x43, 0xa9, 0x3f, 0x54, 0x74, 0xfa, + 0x81, 0x15, 0x9d, 0x39, 0xac, 0xa2, 0x23, 0xad, 0x65, 0x0f, 0xa7, 0xb5, 0xdc, 0x67, 0xd5, 0x5a, + 0xfe, 0x0b, 0xaf, 0x35, 0x5c, 0x87, 0x2c, 0xa7, 0xcc, 0x9d, 0xa5, 0x6f, 0xdf, 0x13, 0xba, 0x99, + 0x21, 0xbc, 0x89, 0xd7, 0x20, 0x2f, 0xf9, 0x42, 0x73, 0x49, 0xe5, 0xc5, 0xcf, 0x6d, 0xa4, 0xb8, + 0x8c, 0x56, 0x49, 0x35, 0x52, 0x49, 0x46, 0x08, 0x1b, 0xff, 0xc1, 0x82, 0x8a, 0xb2, 0x08, 0xe5, + 0xfb, 0x36, 0xa1, 0x20, 0x7d, 0x8f, 0xf6, 0x7b, 0x27, 0x93, 0x7e, 0x6f, 0xa9, 0x6b, 0x8f, 0x18, + 0xf5, 0xdb, 0xad, 0xf7, 0x26, 0x4d, 0xeb, 0xc3, 0x49, 0xf3, 0xc9, 0x83, 0x84, 0xa6, 0x6f, 0x27, + 0xed, 0x2f, 0x35, 0x61, 0x74, 0x4e, 0xec, 0x8e, 0x05, 0xca, 0xac, 0x8e, 0x2c, 0xc8, 0x4b, 0xed, + 0x9a, 0xdb, 0xa3, 0x01, 0xa7, 0x9c, 0xe5, 0x16, 0x41, 0x24, 0x0e, 0x67, 0xf3, 0x9e, 0xed, 0xbb, + 0x8e, 0xdb, 0x0b, 0xea, 0x19, 0xe1, 0xd3, 0xc3, 0x3e, 0xfe, 0xb1, 0x05, 0xc7, 0x62, 0x66, 0xad, + 0x98, 0xb8, 0x04, 0xf9, 0x80, 0x6b, 0x4a, 0xf3, 0x60, 0x18, 0xc5, 0xba, 0x80, 0xb7, 0x67, 0xd5, + 0xe6, 0xf3, 0xb2, 0x4f, 0x14, 0xfe, 0xc3, 0xdb, 0xda, 0x9f, 0x2d, 0x98, 0x11, 0x17, 0x93, 0x3e, + 0x6b, 0x08, 0xb2, 0xae, 0x3d, 0xa4, 0x4a, 0x55, 0xa2, 0x6d, 0xdc, 0x56, 0x7c, 0xb9, 0xa2, 0xbe, + 0xad, 0x0e, 0xeb, 0x60, 0xad, 0x07, 0x76, 0xb0, 0x56, 0x74, 0xee, 0x6a, 0x90, 0xe3, 0xe6, 0xbd, + 0x23, 0x9c, 0x6b, 0x89, 0xc8, 0x0e, 0x7e, 0x12, 0x2a, 0x8a, 0x0b, 0x25, 0xda, 0x83, 0x2e, 0xd8, + 0x21, 0xe4, 0xa5, 0x26, 0xd0, 0x97, 0xa0, 0x14, 0x86, 0x32, 0x82, 0xdb, 0x4c, 0x3b, 0xbf, 0x37, + 0x69, 0xa6, 0x59, 0x40, 0xa2, 0x01, 0xd4, 0x34, 0x2f, 0x7d, 0xab, 0x5d, 0xda, 0x9b, 0x34, 0x25, + 0x40, 0x5d, 0xf1, 0xe8, 0x34, 0x64, 0xfb, 0xfc, 0xde, 0xe4, 0x22, 0xc8, 0xb6, 0x8b, 0x7b, 0x93, + 0xa6, 0xe8, 0x13, 0xf1, 0x8b, 0x57, 0x61, 0x66, 0x8d, 0xf6, 0xec, 0xce, 0x8e, 0x5a, 0xb4, 0xa6, + 0xc9, 0xf1, 0x05, 0x2d, 0x4d, 0xe3, 0x71, 0x98, 0x09, 0x57, 0x7c, 0x73, 0x18, 0xa8, 0xd3, 0x50, + 0x0e, 0x61, 0x37, 0x02, 0xfc, 0x13, 0x0b, 0x94, 0x0d, 0x20, 0x6c, 0x44, 0x3b, 0xdc, 0x17, 0xc2, + 0xde, 0xa4, 0xa9, 0x20, 0x3a, 0x98, 0x41, 0xcf, 0x43, 0x21, 0x10, 0x2b, 0x72, 0x62, 0x49, 0xd3, + 0x12, 0x03, 0xed, 0x23, 0xdc, 0x44, 0xf6, 0x26, 0x4d, 0x8d, 0x48, 0x74, 0x03, 0x2d, 0xc4, 0x02, + 0x02, 0xc9, 0xd8, 0xec, 0xde, 0xa4, 0x69, 0x40, 0xcd, 0x00, 0x01, 0x7f, 0x6a, 0x41, 0x79, 0xc3, + 0x76, 0x42, 0x13, 0xaa, 0x6b, 0x15, 0x45, 0xbe, 0x5a, 0x02, 0xb8, 0x25, 0x76, 0xe9, 0xc0, 0xde, + 0xb9, 0xea, 0xf9, 0x82, 0x6e, 0x85, 0x84, 0xfd, 0xe8, 0x0e, 0xcf, 0x4e, 0xbd, 0xc3, 0x73, 0x87, + 0x77, 0xed, 0xff, 0x5f, 0x47, 0x7a, 0x3d, 0x5b, 0x4c, 0x57, 0x33, 0xf8, 0x5d, 0x0b, 0x66, 0x24, + 0xf3, 0xca, 0xf2, 0xbe, 0x03, 0x79, 0x29, 0x1b, 0xc1, 0xfe, 0x7f, 0x71, 0x4c, 0xe7, 0x0e, 0xe3, + 0x94, 0x14, 0x4d, 0xf4, 0x02, 0xcc, 0x76, 0x7d, 0x6f, 0x34, 0xa2, 0xdd, 0x75, 0xe5, 0xfe, 0xd2, + 0x49, 0xf7, 0xb7, 0x62, 0x8e, 0x93, 0x04, 0x3a, 0xfe, 0x8b, 0x05, 0x15, 0xe5, 0x4c, 0x94, 0xba, + 0x42, 0x11, 0x5b, 0x0f, 0x7c, 0x7b, 0xa6, 0x0f, 0x7b, 0x7b, 0x9e, 0x80, 0x7c, 0x8f, 0xdf, 0x2f, + 0xda, 0x21, 0xa9, 0xde, 0xe1, 0x6e, 0x55, 0x7c, 0x1d, 0x66, 0x35, 0x2b, 0x07, 0x78, 0xd4, 0xb9, + 0xa4, 0x47, 0xbd, 0xd6, 0xa5, 0x2e, 0x73, 0xb6, 0x9c, 0xd0, 0x47, 0x2a, 0x7c, 0xfc, 0x03, 0x0b, + 0xaa, 0x49, 0x14, 0xb4, 0x92, 0x48, 0x2c, 0x9e, 0x38, 0x98, 0x9c, 0x99, 0x53, 0x68, 0xd2, 0x2a, + 0xb3, 0x78, 0xe6, 0x7e, 0x99, 0x45, 0xcd, 0x74, 0x32, 0x25, 0xe5, 0x15, 0xf0, 0x8f, 0x2c, 0xa8, + 0xc4, 0x74, 0x89, 0x2e, 0x41, 0x76, 0xcb, 0xf7, 0x86, 0x87, 0x52, 0x94, 0x98, 0x81, 0xbe, 0x0a, + 0x69, 0xe6, 0x1d, 0x4a, 0x4d, 0x69, 0xe6, 0x71, 0x2d, 0x29, 0xf6, 0x33, 0x32, 0x6e, 0x97, 0x3d, + 0xfc, 0x0c, 0x94, 0x04, 0x43, 0xb7, 0x6d, 0xc7, 0x9f, 0x7a, 0x61, 0x4c, 0x67, 0xe8, 0x79, 0x38, + 0x22, 0x9d, 0xe1, 0xf4, 0xc9, 0x33, 0xd3, 0x26, 0xcf, 0xe8, 0xc9, 0xa7, 0x20, 0x27, 0x82, 0x0e, + 0x3e, 0xa5, 0x6b, 0x33, 0x5b, 0x4f, 0xe1, 0x6d, 0x7c, 0x1c, 0x8e, 0xf1, 0x33, 0x48, 0xfd, 0x60, + 0xd9, 0x1b, 0xbb, 0x4c, 0xe7, 0x4d, 0xe7, 0xa1, 0x16, 0x07, 0x2b, 0x2b, 0xa9, 0x41, 0xae, 0xc3, + 0x01, 0x82, 0x46, 0x85, 0xc8, 0x0e, 0xfe, 0xa5, 0x05, 0x68, 0x95, 0x32, 0xb1, 0xca, 0xb5, 0x95, + 0xf0, 0x78, 0xcc, 0x41, 0x71, 0x68, 0xb3, 0x4e, 0x9f, 0xfa, 0x81, 0x8e, 0x5f, 0x74, 0xff, 0xf3, + 0x08, 0x3c, 0xf1, 0x45, 0x38, 0x16, 0xdb, 0xa5, 0xe2, 0x69, 0x0e, 0x8a, 0x1d, 0x05, 0x53, 0x57, + 0x5e, 0xd8, 0xc7, 0xbf, 0x4d, 0x43, 0x51, 0x87, 0x75, 0xe8, 0x22, 0x94, 0xb7, 0x1c, 0xb7, 0x47, + 0xfd, 0x91, 0xef, 0x28, 0x11, 0x64, 0x65, 0x98, 0x67, 0x80, 0x89, 0xd9, 0x41, 0x4f, 0x41, 0x61, + 0x1c, 0x50, 0xff, 0x4d, 0x47, 0x9e, 0xf4, 0x52, 0xbb, 0xb6, 0x3b, 0x69, 0xe6, 0x5f, 0x0d, 0xa8, + 0x7f, 0x6d, 0x85, 0x5f, 0x3e, 0x63, 0xd1, 0x22, 0xf2, 0xbf, 0x8b, 0x5e, 0x56, 0x66, 0x2a, 0x02, + 0xb8, 0xf6, 0xd7, 0xf8, 0xf6, 0x13, 0xae, 0x6e, 0xe4, 0x7b, 0x43, 0xca, 0xfa, 0x74, 0x1c, 0xb4, + 0x3a, 0xde, 0x70, 0xe8, 0xb9, 0x2d, 0x51, 0x3b, 0x10, 0x4c, 0xf3, 0x1b, 0x94, 0x4f, 0x57, 0x96, + 0xbb, 0x01, 0x05, 0xd6, 0xf7, 0xbd, 0x71, 0xaf, 0x2f, 0x2e, 0x86, 0x4c, 0xfb, 0xf2, 0xe1, 0xe9, + 0x69, 0x0a, 0x44, 0x37, 0xd0, 0xe3, 0x5c, 0x5a, 0xb4, 0xb3, 0x1d, 0x8c, 0x87, 0x32, 0xf7, 0x6c, + 0xe7, 0xf6, 0x26, 0x4d, 0xeb, 0x29, 0x12, 0x82, 0xf1, 0x12, 0x54, 0x62, 0xa1, 0x30, 0xba, 0x00, + 0x59, 0x9f, 0x6e, 0x69, 0x57, 0x80, 0xf6, 0x47, 0xcc, 0xf2, 0xf6, 0xe7, 0x38, 0x44, 0xfc, 0xe2, + 0xef, 0xa7, 0xa1, 0x69, 0x64, 0xfd, 0x57, 0x3d, 0xff, 0x06, 0x65, 0xbe, 0xd3, 0xb9, 0x69, 0x0f, + 0xa9, 0x36, 0xaf, 0x26, 0x94, 0x87, 0x02, 0xf8, 0xa6, 0x71, 0x8a, 0x60, 0x18, 0xe2, 0xa1, 0xc7, + 0x00, 0xc4, 0xb1, 0x93, 0xe3, 0xf2, 0x40, 0x95, 0x04, 0x44, 0x0c, 0x2f, 0xc7, 0x84, 0xdd, 0x3a, + 0xa4, 0x70, 0x94, 0x90, 0xaf, 0x25, 0x85, 0x7c, 0x68, 0x3a, 0xa1, 0x64, 0xcd, 0xe3, 0x92, 0x8b, + 0x1f, 0x17, 0xfc, 0x0f, 0x0b, 0x1a, 0x6b, 0x7a, 0xe7, 0x0f, 0x28, 0x0e, 0xcd, 0x6f, 0xfa, 0x21, + 0xf1, 0x9b, 0x79, 0x88, 0xfc, 0x66, 0x13, 0xfc, 0x36, 0x00, 0xd6, 0x1c, 0x97, 0x5e, 0x75, 0x06, + 0x8c, 0xfa, 0x53, 0x92, 0xa4, 0x1f, 0x66, 0x22, 0x8f, 0x43, 0xe8, 0x96, 0x96, 0xc1, 0xb2, 0xe1, + 0xe6, 0x1f, 0x06, 0x8b, 0xe9, 0x87, 0xc8, 0x62, 0x26, 0xe1, 0x01, 0x5d, 0x28, 0x6c, 0x09, 0xf6, + 0xe4, 0x8d, 0x1d, 0xab, 0x3f, 0x45, 0xbc, 0xb7, 0xbf, 0xa1, 0x16, 0x7f, 0xf6, 0x3e, 0x01, 0x97, + 0xa8, 0x23, 0xb6, 0x82, 0x1d, 0x97, 0xd9, 0x6f, 0x1b, 0xf3, 0x89, 0x5e, 0x04, 0xd9, 0x2a, 0xa6, + 0xcb, 0x4d, 0x8d, 0xe9, 0xae, 0xa8, 0x65, 0xfe, 0x97, 0xb8, 0x0e, 0x5f, 0x89, 0x1c, 0xac, 0x50, + 0x8a, 0x72, 0xb0, 0x4f, 0xdc, 0xef, 0xf8, 0xab, 0x43, 0xff, 0x47, 0x0b, 0xaa, 0xab, 0x94, 0xc5, + 0x63, 0xac, 0x47, 0x48, 0xa5, 0xf8, 0x25, 0x38, 0x6a, 0xec, 0x5f, 0x71, 0xff, 0x74, 0x22, 0xb0, + 0x3a, 0x1e, 0xf1, 0x7f, 0xcd, 0xed, 0xd2, 0xb7, 0x55, 0xbe, 0x1a, 0x8f, 0xa9, 0x6e, 0x43, 0xd9, + 0x18, 0x44, 0x4b, 0x89, 0x68, 0xea, 0x58, 0xa2, 0x4c, 0xcb, 0x23, 0x82, 0x76, 0x4d, 0xf1, 0x24, + 0xb3, 0x52, 0x15, 0x2b, 0x87, 0x91, 0xc7, 0x3a, 0x20, 0xa1, 0x2e, 0x41, 0xd6, 0xbc, 0xfb, 0x04, + 0xf4, 0xe5, 0x30, 0xac, 0x0a, 0xfb, 0xe8, 0x71, 0xc8, 0xfa, 0xde, 0x3d, 0x1d, 0x26, 0x57, 0xa2, + 0x25, 0x89, 0x77, 0x8f, 0x88, 0x21, 0xfc, 0x3c, 0x64, 0x88, 0x77, 0x0f, 0x35, 0x00, 0x7c, 0xdb, + 0xed, 0xd1, 0x3b, 0x61, 0x82, 0x36, 0x43, 0x0c, 0xc8, 0x01, 0x71, 0xc9, 0x32, 0x1c, 0x35, 0x77, + 0x24, 0xd5, 0xbd, 0x00, 0x85, 0x57, 0xc6, 0xa6, 0xb8, 0x6a, 0x09, 0x71, 0xc9, 0x3a, 0x80, 0x46, + 0xe2, 0x36, 0x03, 0x11, 0x1c, 0x9d, 0x86, 0x12, 0xb3, 0x37, 0x07, 0xf4, 0x66, 0xe4, 0x02, 0x23, + 0x00, 0x1f, 0xe5, 0xb9, 0xe5, 0x1d, 0x23, 0xc0, 0x8a, 0x00, 0xe8, 0x2c, 0x54, 0xa3, 0x3d, 0xdf, + 0xf6, 0xe9, 0x96, 0xf3, 0xb6, 0xd0, 0xf0, 0x0c, 0xd9, 0x07, 0x47, 0x67, 0xe0, 0x48, 0x04, 0x5b, + 0x17, 0x81, 0x4c, 0x56, 0xa0, 0x26, 0xc1, 0x5c, 0x36, 0x82, 0xdd, 0x17, 0xef, 0x8e, 0xed, 0x81, + 0x38, 0x7c, 0x33, 0xc4, 0x80, 0xe0, 0x3f, 0x59, 0x70, 0x54, 0xaa, 0x9a, 0xd9, 0xec, 0x91, 0xb4, + 0xfa, 0x5f, 0x59, 0x80, 0x4c, 0x0e, 0x94, 0x69, 0x7d, 0xd9, 0xac, 0x33, 0xf1, 0x48, 0xa9, 0x2c, + 0x52, 0x66, 0x09, 0x8a, 0x4a, 0x45, 0x18, 0xf2, 0x1d, 0x59, 0x4f, 0x13, 0x85, 0x71, 0x99, 0x93, + 0x4b, 0x08, 0x51, 0xff, 0xa8, 0x09, 0xb9, 0xcd, 0x1d, 0x46, 0x03, 0x95, 0x51, 0x8b, 0x52, 0x82, + 0x00, 0x10, 0xf9, 0xc7, 0xd7, 0xa2, 0x2e, 0x13, 0x56, 0x93, 0x8d, 0xd6, 0x52, 0x20, 0xa2, 0x1b, + 0xf8, 0xdf, 0x69, 0xa8, 0xdc, 0xf1, 0x06, 0xe3, 0xe8, 0xd2, 0x7c, 0x94, 0x2e, 0x8c, 0x58, 0x9a, + 0x9f, 0xd3, 0x69, 0x3e, 0x82, 0x6c, 0xc0, 0xe8, 0x48, 0x58, 0x56, 0x86, 0x88, 0x36, 0xc2, 0x30, + 0xc3, 0x6c, 0xbf, 0x47, 0x99, 0x4c, 0x9e, 0xea, 0x79, 0x11, 0xd5, 0xc6, 0x60, 0x68, 0x1e, 0xca, + 0x76, 0xaf, 0xe7, 0xd3, 0x9e, 0xcd, 0x68, 0x7b, 0xa7, 0x5e, 0x10, 0x8b, 0x99, 0x20, 0x74, 0x1d, + 0x66, 0x3b, 0x76, 0xa7, 0xef, 0xb8, 0xbd, 0x5b, 0x23, 0xe6, 0x78, 0x6e, 0x50, 0x2f, 0x8a, 0xab, + 0xe3, 0xf4, 0x82, 0xf9, 0xd0, 0xb4, 0xb0, 0x1c, 0xc3, 0x51, 0x7e, 0x2c, 0x31, 0x13, 0xbf, 0x0e, + 0xb3, 0x5a, 0xf0, 0xca, 0x3c, 0x2e, 0x40, 0xe1, 0x2d, 0x01, 0x99, 0x52, 0xc2, 0x93, 0xa8, 0x8a, + 0x94, 0x46, 0x8b, 0x3f, 0x55, 0x68, 0xfe, 0xf1, 0x75, 0xc8, 0x4b, 0x74, 0x74, 0xda, 0x4c, 0xa7, + 0x64, 0x44, 0xc9, 0xfb, 0x2a, 0x37, 0xc2, 0x90, 0x97, 0x84, 0x94, 0x11, 0x09, 0x3b, 0x93, 0x10, + 0xa2, 0xfe, 0xf1, 0x3f, 0x2d, 0x38, 0xbe, 0x42, 0x19, 0xed, 0x30, 0xda, 0xbd, 0xea, 0xd0, 0x41, + 0xf7, 0x73, 0xcd, 0xf4, 0xc3, 0x7a, 0x5d, 0xc6, 0xa8, 0xd7, 0x71, 0x1f, 0x36, 0x70, 0x5c, 0xba, + 0x66, 0x14, 0x7c, 0x22, 0x00, 0xf7, 0x36, 0x5b, 0x7c, 0xe3, 0x72, 0x58, 0xbe, 0x0d, 0x19, 0x90, + 0xd0, 0x5a, 0xf2, 0x91, 0xb5, 0xe0, 0xef, 0x59, 0x70, 0x22, 0xc9, 0xb5, 0x52, 0x52, 0x0b, 0xf2, + 0x62, 0xf2, 0x94, 0x52, 0x71, 0x6c, 0x06, 0x51, 0x68, 0xe8, 0x52, 0x6c, 0x7d, 0xf1, 0xa6, 0xd4, + 0xae, 0xef, 0x4d, 0x9a, 0xb5, 0x08, 0x6a, 0x54, 0x23, 0x0c, 0x5c, 0xfc, 0x7b, 0x9e, 0xb3, 0x9b, + 0x34, 0x85, 0xbe, 0xb9, 0xad, 0x2a, 0x3f, 0x2e, 0x3b, 0xe8, 0x2b, 0x90, 0x65, 0x3b, 0x23, 0xe5, + 0xbe, 0xdb, 0xc7, 0x3f, 0x9d, 0x34, 0x8f, 0xc6, 0xa6, 0x6d, 0xec, 0x8c, 0x28, 0x11, 0x28, 0xdc, + 0xc4, 0x3b, 0xb6, 0xdf, 0x75, 0x5c, 0x7b, 0xe0, 0x30, 0x29, 0xc6, 0x2c, 0x31, 0x41, 0xa8, 0x0e, + 0x85, 0x91, 0xed, 0x07, 0x3a, 0x06, 0x2b, 0x11, 0xdd, 0x15, 0xe5, 0x94, 0x6d, 0xca, 0x3a, 0x7d, + 0xe9, 0xb2, 0x55, 0x39, 0x45, 0x40, 0x62, 0xe5, 0x14, 0x01, 0xc1, 0xbf, 0x30, 0x0c, 0x47, 0x9e, + 0xaf, 0x2f, 0x9c, 0xe1, 0xe0, 0x6f, 0x45, 0x5a, 0xd6, 0x5b, 0x54, 0x5a, 0x7e, 0x01, 0x66, 0xbb, + 0xb1, 0x91, 0x83, 0xb5, 0x2d, 0x4b, 0xc5, 0x09, 0x74, 0x3c, 0x8e, 0x54, 0x27, 0x20, 0x07, 0xa8, + 0x2e, 0xa1, 0x8f, 0xf4, 0x7e, 0x7d, 0x44, 0x52, 0xcf, 0x7c, 0x06, 0xa9, 0xff, 0x2c, 0x0d, 0xd5, + 0x28, 0x04, 0x55, 0x02, 0xaf, 0xc5, 0x4a, 0xa8, 0xfa, 0xd4, 0x3c, 0xd2, 0xcf, 0x9c, 0x75, 0x28, + 0x6c, 0x8e, 0x3b, 0xdb, 0x94, 0x05, 0xe2, 0xdc, 0x56, 0x88, 0xee, 0x8a, 0x17, 0x22, 0xe6, 0xdb, + 0x8c, 0xf6, 0xb4, 0x07, 0x0f, 0xfb, 0xf8, 0xa7, 0x96, 0x8a, 0xaf, 0xa4, 0x74, 0x94, 0xae, 0x17, + 0xa1, 0xa0, 0xbc, 0xb7, 0x52, 0x72, 0xdd, 0x28, 0xcc, 0x8d, 0x37, 0xf5, 0x2b, 0xcb, 0x78, 0xc0, + 0x88, 0x46, 0x44, 0x57, 0xa0, 0x32, 0xa4, 0x7e, 0x8f, 0xae, 0xeb, 0xa5, 0xd2, 0x62, 0xdb, 0x86, + 0x79, 0xdc, 0x30, 0x87, 0x49, 0x1c, 0x9b, 0xfb, 0x9c, 0x91, 0xcd, 0xfa, 0xca, 0x1a, 0x45, 0x1b, + 0x7f, 0x60, 0xc1, 0x6c, 0x7c, 0x39, 0x34, 0x0b, 0x69, 0xa7, 0xab, 0xb4, 0x96, 0x76, 0xba, 0x9f, + 0xcb, 0xd3, 0x64, 0x68, 0x3c, 0xd9, 0xa9, 0xc6, 0x93, 0x33, 0x8d, 0xe7, 0x44, 0x78, 0xa1, 0xe4, + 0x85, 0x21, 0xab, 0xde, 0xd9, 0x27, 0xa0, 0x14, 0x6a, 0x11, 0x95, 0xa1, 0x70, 0xf5, 0x16, 0x79, + 0x6d, 0x89, 0xac, 0x54, 0x53, 0x68, 0x06, 0x8a, 0xed, 0xa5, 0xe5, 0x97, 0x45, 0xcf, 0x3a, 0x7b, + 0x01, 0x2a, 0x31, 0xb1, 0xa1, 0x0a, 0x94, 0xd6, 0x6e, 0xad, 0xae, 0x6f, 0x90, 0x17, 0x97, 0x6e, + 0x54, 0x53, 0xa8, 0x00, 0x99, 0xf5, 0x57, 0x6f, 0x54, 0x2d, 0xde, 0x58, 0xba, 0xb3, 0x5a, 0x4d, + 0x2f, 0xfe, 0x26, 0xaf, 0x83, 0x63, 0x1f, 0x7d, 0x1d, 0x72, 0x32, 0xe2, 0x3d, 0x11, 0x69, 0xc1, + 0x7c, 0xf9, 0x9d, 0x3b, 0xb9, 0x0f, 0x2e, 0x2d, 0x00, 0xa7, 0x2e, 0x58, 0xe8, 0x26, 0x94, 0x05, + 0x50, 0xbd, 0xad, 0x9c, 0x4e, 0x3e, 0x71, 0xc4, 0x28, 0x3d, 0x76, 0xc0, 0xa8, 0x41, 0xef, 0x32, + 0xe4, 0xe4, 0xc1, 0x3f, 0x91, 0x48, 0x4c, 0xa6, 0xec, 0x26, 0xf6, 0xda, 0x84, 0x53, 0xe8, 0x39, + 0xc8, 0x6e, 0xd8, 0xce, 0x00, 0x19, 0x79, 0x91, 0xf1, 0x24, 0x32, 0x77, 0x22, 0x09, 0x36, 0x96, + 0xbd, 0x12, 0xbe, 0xec, 0x9c, 0x4c, 0x96, 0x97, 0xf5, 0xf4, 0xfa, 0xfe, 0x81, 0x70, 0xe5, 0x5b, + 0xf2, 0xfd, 0x41, 0x17, 0x39, 0xd1, 0x63, 0xf1, 0xa5, 0x12, 0x35, 0xd1, 0xb9, 0xc6, 0x41, 0xc3, + 0x21, 0xc1, 0x35, 0x28, 0x1b, 0x05, 0x46, 0x53, 0xac, 0xfb, 0xab, 0xa3, 0xa6, 0x58, 0xa7, 0x54, + 0x25, 0x71, 0x0a, 0xad, 0x42, 0x91, 0x67, 0x93, 0xe2, 0x21, 0xf2, 0x54, 0x32, 0x69, 0x34, 0x92, + 0x85, 0xb9, 0xd3, 0xd3, 0x07, 0x43, 0x42, 0xdf, 0x84, 0xd2, 0x2a, 0x65, 0x2a, 0x4a, 0x3a, 0x99, + 0x0c, 0xb3, 0xa6, 0x48, 0x2a, 0x1e, 0xaa, 0xe1, 0x14, 0x7a, 0x5d, 0x24, 0xb6, 0xf1, 0x20, 0x01, + 0x35, 0x0f, 0x08, 0x06, 0xc2, 0x7d, 0xcd, 0x1f, 0x8c, 0x10, 0x52, 0x7e, 0x2d, 0x46, 0x59, 0xc5, + 0xa6, 0xcd, 0x03, 0x2e, 0x9e, 0x90, 0x72, 0xf3, 0x3e, 0x9f, 0x29, 0xe1, 0xd4, 0xe2, 0x1b, 0xfa, + 0x4b, 0x9d, 0x15, 0x9b, 0xd9, 0xe8, 0x16, 0xcc, 0x0a, 0x59, 0x86, 0x9f, 0xf2, 0xc4, 0x6c, 0x7e, + 0xdf, 0x77, 0x43, 0x31, 0x9b, 0xdf, 0xff, 0xfd, 0x10, 0x4e, 0xb5, 0xdf, 0x78, 0xff, 0xa3, 0x46, + 0xea, 0x83, 0x8f, 0x1a, 0xa9, 0x4f, 0x3e, 0x6a, 0x58, 0xdf, 0xdd, 0x6d, 0x58, 0xbf, 0xde, 0x6d, + 0x58, 0xef, 0xed, 0x36, 0xac, 0xf7, 0x77, 0x1b, 0xd6, 0xdf, 0x76, 0x1b, 0xd6, 0xdf, 0x77, 0x1b, + 0xa9, 0x4f, 0x76, 0x1b, 0xd6, 0x3b, 0x1f, 0x37, 0x52, 0xef, 0x7f, 0xdc, 0x48, 0x7d, 0xf0, 0x71, + 0x23, 0xf5, 0xed, 0x27, 0xef, 0x5f, 0xc4, 0x91, 0x4e, 0x2a, 0x2f, 0xfe, 0x9e, 0xfe, 0x4f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x7d, 0x7c, 0x67, 0x48, 0x81, 0x26, 0x00, 0x00, } func (x Direction) String() string { @@ -5400,6 +5417,9 @@ func (this *QueryPlanRequest) Equal(that interface{}) bool { if this.Buckets != that1.Buckets { return false } + if this.Strategy != that1.Strategy { + return false + } return true } func (this *QueryPlanResponse) Equal(that interface{}) bool { @@ -5432,6 +5452,9 @@ func (this *QueryPlanResponse) Equal(that interface{}) bool { if this.MergeStrategy != that1.MergeStrategy { return false } + if this.Path != that1.Path { + return false + } return true } func (this *SubQueryResult) Equal(that interface{}) bool { @@ -6190,7 +6213,7 @@ func (this *QueryPlanRequest) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 10) + s := make([]string, 0, 11) s = append(s, "&logproto.QueryPlanRequest{") s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") s = append(s, "Limit: "+fmt.Sprintf("%#v", this.Limit)+",\n") @@ -6198,6 +6221,7 @@ func (this *QueryPlanRequest) GoString() string { s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") s = append(s, "Direction: "+fmt.Sprintf("%#v", this.Direction)+",\n") s = append(s, "Buckets: "+fmt.Sprintf("%#v", this.Buckets)+",\n") + s = append(s, "Strategy: "+fmt.Sprintf("%#v", this.Strategy)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -6205,12 +6229,13 @@ func (this *QueryPlanResponse) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 7) s = append(s, "&logproto.QueryPlanResponse{") if this.Results != nil { s = append(s, "Results: "+fmt.Sprintf("%#v", this.Results)+",\n") } s = append(s, "MergeStrategy: "+fmt.Sprintf("%#v", this.MergeStrategy)+",\n") + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -9337,6 +9362,13 @@ func (m *QueryPlanRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Strategy) > 0 { + i -= len(m.Strategy) + copy(dAtA[i:], m.Strategy) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Strategy))) + i-- + dAtA[i] = 0x3a + } if m.Buckets != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Buckets)) i-- @@ -9398,6 +9430,13 @@ func (m *QueryPlanResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x1a + } if m.MergeStrategy != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.MergeStrategy)) i-- @@ -10603,6 +10642,10 @@ func (m *QueryPlanRequest) Size() (n int) { if m.Buckets != 0 { n += 1 + sovLogproto(uint64(m.Buckets)) } + l = len(m.Strategy) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } return n } @@ -10621,6 +10664,10 @@ func (m *QueryPlanResponse) Size() (n int) { if m.MergeStrategy != 0 { n += 1 + sovLogproto(uint64(m.MergeStrategy)) } + l = len(m.Path) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } return n } @@ -11400,6 +11447,7 @@ func (this *QueryPlanRequest) String() string { `End:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1), `&`, ``, 1) + `,`, `Direction:` + fmt.Sprintf("%v", this.Direction) + `,`, `Buckets:` + fmt.Sprintf("%v", this.Buckets) + `,`, + `Strategy:` + fmt.Sprintf("%v", this.Strategy) + `,`, `}`, }, "") return s @@ -11416,6 +11464,7 @@ func (this *QueryPlanResponse) String() string { s := strings.Join([]string{`&QueryPlanResponse{`, `Results:` + repeatedStringForResults + `,`, `MergeStrategy:` + fmt.Sprintf("%v", this.MergeStrategy) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, `}`, }, "") return s @@ -18977,6 +19026,38 @@ func (m *QueryPlanRequest) Unmarshal(dAtA []byte) error { break } } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Strategy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Strategy = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) @@ -19083,6 +19164,38 @@ func (m *QueryPlanResponse) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index 69b12c5e93cbc..52d6b33024b15 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -513,7 +513,7 @@ message QueryPlanRequest { ]; Direction direction = 5; uint32 buckets = 6; - + string strategy = 7; // repeated string shards = 5 [(gogoproto.jsontag) = "shards,omitempty"]; // repeated Delete deletes = 6; // Plan plan = 7 [(gogoproto.customtype) = "github.com/grafana/loki/v3/pkg/querier/plan.QueryPlan"]; @@ -525,6 +525,7 @@ message QueryPlanRequest { message QueryPlanResponse { repeated SubQueryResult results = 1; MergeStrategy mergeStrategy = 2; + string path = 3; } enum MergeStrategy { diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index cf356dbe9369d..7225ded4077cb 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -576,9 +576,27 @@ func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto from := model.TimeFromUnixNano(storeQueryInterval.start.UnixNano()) through := model.TimeFromUnixNano(storeQueryInterval.end.UnixNano()) + subqueries := make([]*logproto.SubQueryResult, 0) + switch req.Strategy { + case "stream_shard_volume": + subqueries, err = q.breakIntoStreamShards(ctx, req, userID, from, through, matchers) + if err != nil { + return nil, err + } + case "chunkrefs": + subqueries, err = q.breakIntoChunkRefs(ctx, req, userID, from, through, matchers) + if err != nil { + return nil, err + } + } - streamShardValues, err := q.store.LabelValuesForMetricName(ctx, userID, from, through, "logs", streamShardLabel, matchers...) + return &logproto.QueryPlanResponse{ + Results: subqueries, + }, nil +} +func (q *SingleTenantQuerier) breakIntoStreamShards(ctx context.Context, req *logproto.QueryPlanRequest, userID string, from model.Time, through model.Time, matchers []*labels.Matcher) ([]*logproto.SubQueryResult, error) { + streamShardValues, err := q.store.LabelValuesForMetricName(ctx, userID, from, through, "logs", streamShardLabel, matchers...) if err != nil { return nil, err } @@ -603,9 +621,7 @@ func (q *SingleTenantQuerier) SelectQueryPlan(ctx context.Context, req *logproto // dynamic label combination - frequently occurring labels for a tenant? d := NewStreamShardSplitter(volumes) subqueries := d.GetSubQueries(req.Query, from, through, int(req.Buckets)) - return &logproto.QueryPlanResponse{ - Results: subqueries, - }, nil + return subqueries, nil } func (q *SingleTenantQuerier) awaitSeries(ctx context.Context, req *logproto.SeriesRequest) (*logproto.SeriesResponse, error) { @@ -1179,6 +1195,27 @@ func (q *SingleTenantQuerier) DetectedFields(ctx context.Context, req *logproto. }, nil } +func (q *SingleTenantQuerier) breakIntoChunkRefs(ctx context.Context, req *logproto.QueryPlanRequest, id string, from model.Time, through model.Time, matchers []*labels.Matcher) ([]*logproto.SubQueryResult, error) { + _, storeQueryInterval := q.buildQueryIntervals(req.Start, req.End) + parsed, err := syntax.ParseLogSelector(req.Query, true) + if err != nil { + return nil, err + } + p := &plan.QueryPlan{ + AST: parsed, + } + + if !q.cfg.QueryIngesterOnly && storeQueryInterval != nil { + lazyChunks, err := q.store.GetChunkRefs(ctx, id, from, through, matchers, p) + if err != nil { + return nil, err + } + + level.Info(q.logger).Log("lazychunks", lazyChunks) + } + return nil, nil +} + type parsedFields struct { sketch *hyperloglog.Sketch fieldType logproto.DetectedFieldType diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index a2d5d0eca8757..80a3ed630ef85 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -1002,9 +1002,11 @@ func (c Codec) EncodeRequest(ctx context.Context, r queryrangebase.Request) (*ht return req.WithContext(ctx), nil case *logproto.QueryPlanRequest: params := url.Values{ - "query": []string{request.GetQuery()}, - "start": []string{fmt.Sprintf("%d", request.Start.UnixNano())}, - "end": []string{fmt.Sprintf("%d", request.End.UnixNano())}, + "query": []string{request.GetQuery()}, + "start": []string{fmt.Sprintf("%d", request.Start.UnixNano())}, + "end": []string{fmt.Sprintf("%d", request.End.UnixNano())}, + "strategy": []string{request.GetStrategy()}, + "buckets": []string{fmt.Sprintf("%d", request.GetBuckets())}, } u := &url.URL{ diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index 5748d6f670c76..60f4a6440d37b 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -469,6 +469,17 @@ func (r roundTripper) Do(ctx context.Context, req base.Request) (base.Response, "start", op.Start, ) return r.detectedLabels.Do(ctx, req) + case *logproto.QueryPlanRequest: + level.Info(logger).Log( + "msg", "executing query", + "type", "query_plan", + "end", op.End, + "length", op.End.Sub(op.Start), + "query", op.Query, + "start", op.Start, + "buckets", op.Buckets, + "strategy", op.Strategy) + return r.next.Do(ctx, req) default: return r.next.Do(ctx, req) } diff --git a/pkg/storage/store.go b/pkg/storage/store.go index db4a0a498e17d..aa20bd730bbd2 100644 --- a/pkg/storage/store.go +++ b/pkg/storage/store.go @@ -6,6 +6,7 @@ import ( "math" "time" + "github.com/grafana/loki/v3/pkg/querier/plan" "github.com/grafana/loki/v3/pkg/storage/types" "github.com/grafana/loki/v3/pkg/util/httpreq" @@ -55,6 +56,7 @@ type SelectStore interface { SelectSamples(ctx context.Context, req logql.SelectSampleParams) (iter.SampleIterator, error) SelectLogs(ctx context.Context, req logql.SelectLogParams) (iter.EntryIterator, error) SelectSeries(ctx context.Context, req logql.SelectLogParams) ([]logproto.SeriesIdentifier, error) + GetChunkRefs(ctx context.Context, userID string, from, through model.Time, matchers []*labels.Matcher, p *plan.QueryPlan) ([]*LazyChunk, error) } type SchemaConfigProvider interface { @@ -608,3 +610,13 @@ func (f failingChunkWriter) Put(_ context.Context, _ []chunk.Chunk) error { func (f failingChunkWriter) PutOne(_ context.Context, _, _ model.Time, _ chunk.Chunk) error { return errWritingChunkUnsupported } + +func (s *LokiStore) GetChunkRefs(ctx context.Context, userID string, from, through model.Time, matchers []*labels.Matcher, p *plan.QueryPlan) ([]*LazyChunk, error) { + predicate := chunk.NewPredicate(matchers, p) + lazyChunks, err := s.lazyChunks(ctx, from, through, predicate, nil) + if err != nil { + return nil, err + } + + return lazyChunks, nil +}