From c624abda0a775e5aab583e3648c2e63217e796f0 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Thu, 25 Apr 2024 17:26:28 +0530 Subject: [PATCH 01/11] Remove usage of regex to improve performance --- pkg/querier/querier.go | 14 +++++------ pkg/querier/querier_test.go | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index bee850fd82d69..3fb46b1da7df0 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -5,7 +5,6 @@ import ( "flag" "fmt" "net/http" - "regexp" "sort" "strconv" "time" @@ -14,6 +13,7 @@ import ( "github.com/dustin/go-humanize" "github.com/go-kit/log" "github.com/go-kit/log/level" + "github.com/google/uuid" "github.com/grafana/dskit/httpgrpc" "github.com/grafana/dskit/tenant" "github.com/opentracing/opentracing-go" @@ -1046,13 +1046,13 @@ func (q *SingleTenantQuerier) isLabelRelevant(label string, values []string, sta // containsAllIDTypes filters out all UUID, GUID and numeric types. Returns false if even one value is not of the type func containsAllIDTypes(values []string) bool { - pattern := `^(?:(?:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})|(?:(?:\{)?[0-9a-fA-F]{8}(?:-?[0-9a-fA-F]{4}){3}-?[0-9a-fA-F]{12}(?:\})?)|(\d+(?:\.\d+)?))$` - - re := regexp.MustCompile(pattern) - for _, v := range values { - if !re.MatchString(v) { - return false + _, err := strconv.ParseFloat(v, 64) + if err != nil { + _, err = uuid.Parse(v) + if err != nil { + return false + } } } diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index e6c228f04920e..7491d559f9aad 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -1686,3 +1686,49 @@ func TestQuerier_DetectedLabels(t *testing.T) { assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "namespace", Cardinality: 60}) }) } + +func BenchmarkQuerierDetectedLabels(b *testing.B) { + now := time.Now() + + limits, _ := validation.NewOverrides(defaultLimitsTestConfig(), nil) + ctx := user.InjectOrgID(context.Background(), "test") + + conf := mockQuerierConfig() + conf.IngesterQueryStoreMaxLookback = 0 + + request := logproto.DetectedLabelsRequest{ + Start: &now, + End: &now, + Query: "", + } + ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ + "cluster": {Values: []string{"ingester"}}, + "ingesterLabel": {Values: []string{"abc", "def", "ghi", "abc"}}, + }} + + ingesterClient := newQuerierClientMock() + storeClient := newStoreMock() + + ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(&ingesterResponse, nil) + storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return([]string{"storeLabel"}, nil). + On("LabelValuesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, "storeLabel", mock.Anything). + Return([]string{"val1", "val2"}, nil) + + querier, _ := newQuerier( + conf, + mockIngesterClientConfig(), + newIngesterClientMockFactory(ingesterClient), + mockReadRingWithOneActiveIngester(), + &mockDeleteGettter{}, + storeClient, limits) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, err := querier.DetectedLabels(ctx, &request) + assert.NoError(b, err) + } +} From 5e2c55376298be8f719e1fe4bd2ab05d70ba0593 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Fri, 26 Apr 2024 14:02:02 +0530 Subject: [PATCH 02/11] Enable query splitting for detected labels --- pkg/ingester/ingester.go | 2 +- pkg/loghttp/labels.go | 11 +- pkg/logproto/logproto.pb.go | 413 +++++++++----------- pkg/logproto/logproto.proto | 4 +- pkg/querier/querier.go | 20 +- pkg/querier/queryrange/codec.go | 76 +++- pkg/querier/queryrange/roundtrip.go | 19 +- pkg/querier/queryrange/split_by_interval.go | 2 +- pkg/querier/queryrange/splitters.go | 15 + pkg/querier/queryrange/stats.go | 4 + pkg/storage/detected/labels.go | 7 + 11 files changed, 329 insertions(+), 244 deletions(-) create mode 100644 pkg/storage/detected/labels.go diff --git a/pkg/ingester/ingester.go b/pkg/ingester/ingester.go index e99de0d1531e2..1d7159bb93206 100644 --- a/pkg/ingester/ingester.go +++ b/pkg/ingester/ingester.go @@ -1397,7 +1397,7 @@ func (i *Ingester) GetDetectedLabels(ctx context.Context, req *logproto.Detected } } - labelMap, err := instance.LabelsWithValues(ctx, *req.Start, matchers...) + labelMap, err := instance.LabelsWithValues(ctx, req.Start, matchers...) if err != nil { return nil, err diff --git a/pkg/loghttp/labels.go b/pkg/loghttp/labels.go index b2c5a343637be..360c750048a5e 100644 --- a/pkg/loghttp/labels.go +++ b/pkg/loghttp/labels.go @@ -1,6 +1,7 @@ package loghttp import ( + "errors" "net/http" "sort" "strconv" @@ -88,14 +89,20 @@ func ParseLabelQuery(r *http.Request) (*logproto.LabelRequest, error) { } func ParseDetectedLabelsQuery(r *http.Request) (*logproto.DetectedLabelsRequest, error) { + var err error + start, end, err := bounds(r) if err != nil { return nil, err } + if end.Before(start) { + return nil, errors.New("end timestamp must not be before or equal to start time") + } + return &logproto.DetectedLabelsRequest{ - Start: &start, - End: &end, + Start: start, + End: end, Query: query(r), }, nil } diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index e8c7215990bf5..1d4e6953614c9 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -2819,9 +2819,9 @@ func (m *DetectedField) GetSketch() []byte { } type DetectedLabelsRequest struct { - Start *time.Time `protobuf:"bytes,1,opt,name=start,proto3,stdtime" json:"start,omitempty"` - End *time.Time `protobuf:"bytes,2,opt,name=end,proto3,stdtime" json:"end,omitempty"` - Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,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"` } func (m *DetectedLabelsRequest) Reset() { *m = DetectedLabelsRequest{} } @@ -2856,18 +2856,18 @@ func (m *DetectedLabelsRequest) XXX_DiscardUnknown() { var xxx_messageInfo_DetectedLabelsRequest proto.InternalMessageInfo -func (m *DetectedLabelsRequest) GetStart() *time.Time { +func (m *DetectedLabelsRequest) GetStart() time.Time { if m != nil { return m.Start } - return nil + return time.Time{} } -func (m *DetectedLabelsRequest) GetEnd() *time.Time { +func (m *DetectedLabelsRequest) GetEnd() time.Time { if m != nil { return m.End } - return nil + return time.Time{} } func (m *DetectedLabelsRequest) GetQuery() string { @@ -3033,171 +3033,170 @@ func init() { func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2611 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x6c, 0x1b, 0xc7, - 0xd5, 0x5c, 0x72, 0xf9, 0xf7, 0x48, 0xc9, 0xf2, 0x88, 0xb6, 0x09, 0xda, 0xe1, 0x2a, 0x83, 0xef, - 0x4b, 0xdc, 0xd8, 0x11, 0x63, 0xa7, 0x49, 0x1d, 0xa7, 0x69, 0x6a, 0x4a, 0xb1, 0x63, 0x47, 0x71, - 0x9c, 0x91, 0xe2, 0xa4, 0x45, 0x83, 0x60, 0x45, 0x8e, 0xa8, 0x85, 0xc8, 0x5d, 0x7a, 0x77, 0x18, - 0x87, 0xb7, 0x02, 0x3d, 0x17, 0x0d, 0xd0, 0x43, 0xdb, 0x4b, 0xd1, 0x02, 0x05, 0x5a, 0xa4, 0xe8, - 0xa5, 0xe8, 0xb1, 0x68, 0x2f, 0x3d, 0xa4, 0xb7, 0xf4, 0x16, 0xe4, 0xc0, 0xd6, 0xca, 0xa5, 0xd0, - 0x29, 0x40, 0x6f, 0x39, 0x15, 0xf3, 0xb3, 0xbb, 0xb3, 0x2b, 0xb2, 0x0e, 0x15, 0x07, 0x81, 0x2f, - 0xe2, 0xcc, 0x9b, 0x37, 0x6f, 0xe6, 0xfd, 0xcc, 0xfb, 0x5b, 0xc1, 0xe9, 0xe1, 0x5e, 0xaf, 0xd5, - 0xf7, 0x7a, 0x43, 0xdf, 0x63, 0x5e, 0x34, 0x58, 0x15, 0x7f, 0x51, 0x29, 0x9c, 0x37, 0x6a, 0x3d, - 0xaf, 0xe7, 0x49, 0x1c, 0x3e, 0x92, 0xeb, 0x0d, 0xab, 0xe7, 0x79, 0xbd, 0x3e, 0x6d, 0x89, 0xd9, - 0xf6, 0x68, 0xa7, 0xc5, 0x9c, 0x01, 0x0d, 0x98, 0x3d, 0x18, 0x2a, 0x84, 0x15, 0x45, 0xfd, 0x4e, - 0x7f, 0xe0, 0x75, 0x69, 0xbf, 0x15, 0x30, 0x9b, 0x05, 0xf2, 0xaf, 0xc2, 0x58, 0xe6, 0x18, 0xc3, - 0x51, 0xb0, 0x2b, 0xfe, 0x48, 0x20, 0xfe, 0x93, 0x01, 0x27, 0x36, 0xec, 0x6d, 0xda, 0xdf, 0xf2, - 0x6e, 0xdb, 0xfd, 0x11, 0x0d, 0x08, 0x0d, 0x86, 0x9e, 0x1b, 0x50, 0xb4, 0x06, 0x85, 0x3e, 0x5f, - 0x08, 0xea, 0xc6, 0x4a, 0xee, 0x6c, 0xe5, 0xe2, 0xb9, 0xd5, 0xe8, 0xca, 0x53, 0x37, 0x48, 0x68, - 0xf0, 0x92, 0xcb, 0xfc, 0x31, 0x51, 0x5b, 0x1b, 0xb7, 0xa1, 0xa2, 0x81, 0xd1, 0x12, 0xe4, 0xf6, - 0xe8, 0xb8, 0x6e, 0xac, 0x18, 0x67, 0xcb, 0x84, 0x0f, 0xd1, 0x05, 0xc8, 0xbf, 0xcb, 0xc9, 0xd4, - 0xb3, 0x2b, 0xc6, 0xd9, 0xca, 0xc5, 0xd3, 0xf1, 0x21, 0x6f, 0xb8, 0xce, 0x9d, 0x11, 0x15, 0xbb, - 0xd5, 0x41, 0x12, 0xf3, 0x72, 0xf6, 0x92, 0x81, 0xcf, 0xc1, 0xf1, 0x43, 0xeb, 0xe8, 0x24, 0x14, - 0x04, 0x86, 0xbc, 0x71, 0x99, 0xa8, 0x19, 0xae, 0x01, 0xda, 0x64, 0x3e, 0xb5, 0x07, 0xc4, 0x66, - 0xfc, 0xbe, 0x77, 0x46, 0x34, 0x60, 0xf8, 0x55, 0x58, 0x4e, 0x40, 0x15, 0xdb, 0xcf, 0x42, 0x25, - 0x88, 0xc1, 0x8a, 0xf7, 0x5a, 0x7c, 0xad, 0x78, 0x0f, 0xd1, 0x11, 0xf1, 0x2f, 0x0d, 0x80, 0x78, - 0x0d, 0x35, 0x01, 0xe4, 0xea, 0xcb, 0x76, 0xb0, 0x2b, 0x18, 0x36, 0x89, 0x06, 0x41, 0xe7, 0xe1, - 0x78, 0x3c, 0xbb, 0xe9, 0x6d, 0xee, 0xda, 0x7e, 0x57, 0xc8, 0xc0, 0x24, 0x87, 0x17, 0x10, 0x02, - 0xd3, 0xb7, 0x19, 0xad, 0xe7, 0x56, 0x8c, 0xb3, 0x39, 0x22, 0xc6, 0x9c, 0x5b, 0x46, 0x5d, 0xdb, - 0x65, 0x75, 0x53, 0x88, 0x53, 0xcd, 0x38, 0x9c, 0xeb, 0x97, 0x06, 0xf5, 0xfc, 0x8a, 0x71, 0x76, - 0x81, 0xa8, 0x19, 0xfe, 0x20, 0x07, 0xd5, 0xd7, 0x47, 0xd4, 0x1f, 0x2b, 0x01, 0xa0, 0x26, 0x94, - 0x02, 0xda, 0xa7, 0x1d, 0xe6, 0xf9, 0x52, 0x23, 0xed, 0x6c, 0xdd, 0x20, 0x11, 0x0c, 0xd5, 0x20, - 0xdf, 0x77, 0x06, 0x0e, 0x13, 0xd7, 0x5a, 0x20, 0x72, 0x82, 0x2e, 0x43, 0x3e, 0x60, 0xb6, 0xcf, - 0xc4, 0x5d, 0x2a, 0x17, 0x1b, 0xab, 0xd2, 0x30, 0x57, 0x43, 0xc3, 0x5c, 0xdd, 0x0a, 0x0d, 0xb3, - 0x5d, 0xfa, 0x70, 0x62, 0x65, 0xde, 0xff, 0xa7, 0x65, 0x10, 0xb9, 0x05, 0x3d, 0x0b, 0x39, 0xea, - 0x76, 0xc5, 0x7d, 0xbf, 0xe8, 0x4e, 0xbe, 0x01, 0x5d, 0x80, 0x72, 0xd7, 0xf1, 0x69, 0x87, 0x39, - 0x9e, 0x2b, 0xb8, 0x5a, 0xbc, 0xb8, 0x1c, 0x6b, 0x64, 0x3d, 0x5c, 0x22, 0x31, 0x16, 0x3a, 0x0f, - 0x85, 0x80, 0x8b, 0x2e, 0xa8, 0x17, 0xb9, 0x2d, 0xb4, 0x6b, 0x07, 0x13, 0x6b, 0x49, 0x42, 0xce, - 0x7b, 0x03, 0x87, 0xd1, 0xc1, 0x90, 0x8d, 0x89, 0xc2, 0x41, 0x4f, 0x40, 0xb1, 0x4b, 0xfb, 0x94, - 0x2b, 0xbc, 0x24, 0x14, 0xbe, 0xa4, 0x91, 0x17, 0x0b, 0x24, 0x44, 0x40, 0x6f, 0x83, 0x39, 0xec, - 0xdb, 0x6e, 0xbd, 0x2c, 0xb8, 0x58, 0x8c, 0x11, 0x6f, 0xf5, 0x6d, 0xb7, 0xfd, 0xdc, 0x27, 0x13, - 0xeb, 0x99, 0x9e, 0xc3, 0x76, 0x47, 0xdb, 0xab, 0x1d, 0x6f, 0xd0, 0xea, 0xf9, 0xf6, 0x8e, 0xed, - 0xda, 0xad, 0xbe, 0xb7, 0xe7, 0xb4, 0xde, 0x7d, 0xba, 0xc5, 0xdf, 0xe0, 0x9d, 0x11, 0xf5, 0x1d, - 0xea, 0xb7, 0x38, 0x99, 0x55, 0xa1, 0x12, 0xbe, 0x95, 0x08, 0xb2, 0x37, 0xcc, 0x52, 0x61, 0xa9, - 0x88, 0xef, 0x65, 0x01, 0x6d, 0xda, 0x83, 0x61, 0x9f, 0xce, 0xa5, 0xb2, 0x48, 0x39, 0xd9, 0x23, - 0x2b, 0x27, 0x37, 0xaf, 0x72, 0x62, 0x49, 0x9b, 0xf3, 0x49, 0x3a, 0xff, 0x45, 0x25, 0x5d, 0xf8, - 0x4a, 0x24, 0x8d, 0xeb, 0x60, 0xf2, 0x19, 0x77, 0x4a, 0xbe, 0x7d, 0x57, 0xc8, 0xb3, 0x4a, 0xf8, - 0x10, 0x6f, 0x40, 0x41, 0xde, 0x05, 0x35, 0xd2, 0x02, 0x4f, 0xbe, 0x8f, 0x58, 0xd8, 0xb9, 0x50, - 0x8c, 0x4b, 0xb1, 0x18, 0x73, 0x42, 0x40, 0xf8, 0xcf, 0x06, 0x2c, 0x28, 0x2d, 0x2a, 0x1f, 0xb3, - 0x0d, 0x45, 0xf9, 0xc6, 0x43, 0xff, 0x72, 0x2a, 0xed, 0x5f, 0xae, 0x74, 0xed, 0x21, 0xa3, 0x7e, - 0xbb, 0xf5, 0xe1, 0xc4, 0x32, 0x3e, 0x99, 0x58, 0x8f, 0xcf, 0x62, 0x34, 0xf4, 0xe9, 0xa1, 0x5f, - 0x0a, 0x09, 0xa3, 0x73, 0xe2, 0x76, 0x2c, 0x50, 0xa6, 0x70, 0x6c, 0x55, 0x86, 0x82, 0xeb, 0x6e, - 0x8f, 0x06, 0x9c, 0xb2, 0xc9, 0xb5, 0x48, 0x24, 0x0e, 0x67, 0xf3, 0xae, 0xed, 0xbb, 0x8e, 0xdb, - 0x0b, 0xea, 0x39, 0xe1, 0x3b, 0xa3, 0x39, 0xfe, 0xb9, 0x01, 0xcb, 0x09, 0x53, 0x54, 0x4c, 0x5c, - 0x82, 0x42, 0xc0, 0xa5, 0x1b, 0xf2, 0xa0, 0x29, 0x72, 0x53, 0xc0, 0xdb, 0x8b, 0xea, 0xf2, 0x05, - 0x39, 0x27, 0x0a, 0xff, 0xc1, 0x5d, 0xed, 0x6f, 0x06, 0x54, 0x45, 0x00, 0x08, 0xdf, 0x07, 0x02, - 0xd3, 0xb5, 0x07, 0x54, 0xa9, 0x4a, 0x8c, 0xb5, 0xa8, 0xc0, 0x8f, 0x2b, 0x85, 0x51, 0x61, 0x5e, - 0x47, 0x66, 0x1c, 0xd9, 0x91, 0x19, 0xf1, 0x5b, 0xa9, 0x41, 0x9e, 0x9b, 0xe4, 0x58, 0x38, 0xb1, - 0x32, 0x91, 0x13, 0xfc, 0x38, 0x2c, 0x28, 0x2e, 0x94, 0x68, 0x67, 0x05, 0xb2, 0x01, 0x14, 0xa4, - 0x26, 0xd0, 0xff, 0x41, 0x39, 0x4a, 0x00, 0x04, 0xb7, 0xb9, 0x76, 0xe1, 0x60, 0x62, 0x65, 0x59, - 0x40, 0xe2, 0x05, 0x64, 0xe9, 0xc1, 0xd5, 0x68, 0x97, 0x0f, 0x26, 0x96, 0x04, 0xa8, 0x50, 0x8a, - 0xce, 0x80, 0xb9, 0xcb, 0xe3, 0x13, 0x17, 0x81, 0xd9, 0x2e, 0x1d, 0x4c, 0x2c, 0x31, 0x27, 0xe2, - 0x2f, 0xbe, 0x06, 0xd5, 0x0d, 0xda, 0xb3, 0x3b, 0x63, 0x75, 0x68, 0x2d, 0x24, 0xc7, 0x0f, 0x34, - 0x42, 0x1a, 0x8f, 0x42, 0x35, 0x3a, 0xf1, 0x9d, 0x41, 0xa0, 0x5e, 0x43, 0x25, 0x82, 0xbd, 0x1a, - 0xe0, 0x5f, 0x18, 0xa0, 0x6c, 0x00, 0x61, 0x2d, 0xab, 0xe0, 0xfe, 0x0b, 0x0e, 0x26, 0x96, 0x82, - 0x84, 0x49, 0x03, 0x7a, 0x1e, 0x8a, 0x81, 0x38, 0x91, 0x13, 0x4b, 0x9b, 0x96, 0x58, 0x68, 0x1f, - 0xe3, 0x26, 0x72, 0x30, 0xb1, 0x42, 0x44, 0x12, 0x0e, 0xd0, 0x6a, 0x22, 0xf0, 0x4a, 0xc6, 0x16, - 0x0f, 0x26, 0x96, 0x06, 0xd5, 0x03, 0x31, 0xfe, 0xdc, 0x80, 0xca, 0x96, 0xed, 0x44, 0x26, 0x54, - 0x0f, 0x55, 0x14, 0xfb, 0x57, 0x09, 0xe0, 0x96, 0xd8, 0xa5, 0x7d, 0x7b, 0x7c, 0xd5, 0xf3, 0x05, - 0xdd, 0x05, 0x12, 0xcd, 0xe3, 0x58, 0x69, 0x4e, 0x8d, 0x95, 0xf9, 0xf9, 0xdd, 0xf1, 0x57, 0xeb, - 0xfc, 0x6e, 0x98, 0xa5, 0xec, 0x52, 0x0e, 0xff, 0xc1, 0x80, 0xaa, 0x64, 0x5e, 0x59, 0xde, 0x0f, - 0xa0, 0x20, 0x65, 0x23, 0xd8, 0xff, 0x1f, 0x8e, 0xe9, 0xdc, 0x3c, 0x4e, 0x49, 0xd1, 0x44, 0x2f, - 0xc2, 0x62, 0xd7, 0xf7, 0x86, 0x43, 0xda, 0xdd, 0x54, 0xee, 0x2f, 0x9b, 0x76, 0x7f, 0xeb, 0xfa, - 0x3a, 0x49, 0xa1, 0xe3, 0xbf, 0x1b, 0xb0, 0xa0, 0x9c, 0x89, 0x52, 0x57, 0x24, 0x62, 0xe3, 0xc8, - 0x11, 0x2f, 0x3b, 0x6f, 0xc4, 0x3b, 0x09, 0x85, 0x9e, 0xef, 0x8d, 0x86, 0xa1, 0x43, 0x52, 0xb3, - 0xf9, 0x22, 0x21, 0xbe, 0x01, 0x8b, 0x21, 0x2b, 0x33, 0x3c, 0x6a, 0x23, 0xed, 0x51, 0xaf, 0x77, - 0xa9, 0xcb, 0x9c, 0x1d, 0x27, 0xf2, 0x91, 0x0a, 0x1f, 0xff, 0xc4, 0x80, 0xa5, 0x34, 0x0a, 0x5a, - 0x4f, 0x25, 0xf0, 0x8f, 0xcd, 0x26, 0xa7, 0xe7, 0xee, 0x21, 0x69, 0x95, 0xc1, 0x3f, 0x73, 0xbf, - 0x0c, 0xbe, 0xa6, 0x3b, 0x99, 0xb2, 0xf2, 0x0a, 0xf8, 0x67, 0x06, 0x2c, 0x24, 0x74, 0x89, 0x2e, - 0x81, 0xb9, 0xe3, 0x7b, 0x83, 0xb9, 0x14, 0x25, 0x76, 0xa0, 0x6f, 0x42, 0x96, 0x79, 0x73, 0xa9, - 0x29, 0xcb, 0x3c, 0xae, 0x25, 0xc5, 0x7e, 0x4e, 0xe6, 0xc7, 0x72, 0x86, 0x9f, 0x81, 0xb2, 0x60, - 0xe8, 0x96, 0xed, 0xf8, 0x53, 0x03, 0xc6, 0x74, 0x86, 0x9e, 0x87, 0x63, 0xd2, 0x19, 0x4e, 0xdf, - 0x5c, 0x9d, 0xb6, 0xb9, 0x1a, 0x6e, 0x3e, 0x0d, 0xf9, 0xb5, 0xdd, 0x91, 0xbb, 0xc7, 0xb7, 0x74, - 0x6d, 0x66, 0x87, 0x5b, 0xf8, 0x18, 0x9f, 0x80, 0x65, 0xfe, 0x06, 0xa9, 0x1f, 0xac, 0x79, 0x23, - 0x97, 0x85, 0xf5, 0xc9, 0x79, 0xa8, 0x25, 0xc1, 0xca, 0x4a, 0x6a, 0x90, 0xef, 0x70, 0x80, 0xa0, - 0xb1, 0x40, 0xe4, 0x04, 0xff, 0xc6, 0x00, 0x74, 0x8d, 0x32, 0x71, 0xca, 0xf5, 0xf5, 0xe8, 0x79, - 0x34, 0xa0, 0x34, 0xb0, 0x59, 0x67, 0x97, 0xfa, 0x41, 0x98, 0xbf, 0x84, 0xf3, 0xaf, 0x23, 0x59, - 0xc4, 0x17, 0x60, 0x39, 0x71, 0x4b, 0xc5, 0x53, 0x03, 0x4a, 0x1d, 0x05, 0x53, 0x21, 0x2f, 0x9a, - 0xe3, 0x3f, 0x66, 0xa1, 0x24, 0x36, 0x10, 0xba, 0x83, 0x2e, 0x40, 0x65, 0xc7, 0x71, 0x7b, 0xd4, - 0x1f, 0xfa, 0x8e, 0x12, 0x81, 0xd9, 0x3e, 0x76, 0x30, 0xb1, 0x74, 0x30, 0xd1, 0x27, 0xe8, 0x49, - 0x28, 0x8e, 0x02, 0xea, 0xbf, 0xe3, 0xc8, 0x97, 0x5e, 0x6e, 0xd7, 0xf6, 0x27, 0x56, 0xe1, 0x8d, - 0x80, 0xfa, 0xd7, 0xd7, 0x79, 0xf0, 0x19, 0x89, 0x11, 0x91, 0xbf, 0x5d, 0xf4, 0x8a, 0x32, 0x53, - 0x91, 0xc0, 0xb5, 0xbf, 0xc5, 0xaf, 0x9f, 0x72, 0x75, 0x43, 0xdf, 0x1b, 0x50, 0xb6, 0x4b, 0x47, - 0x41, 0xab, 0xe3, 0x0d, 0x06, 0x9e, 0xdb, 0x12, 0x15, 0xb7, 0x60, 0x9a, 0x47, 0x50, 0xbe, 0x5d, - 0x59, 0xee, 0x16, 0x14, 0xd9, 0xae, 0xef, 0x8d, 0x7a, 0xbb, 0x22, 0x30, 0xe4, 0xda, 0x97, 0xe7, - 0xa7, 0x17, 0x52, 0x20, 0xe1, 0x00, 0x3d, 0xca, 0xa5, 0x45, 0x3b, 0x7b, 0xc1, 0x68, 0x20, 0x6b, - 0xbc, 0x76, 0xfe, 0x60, 0x62, 0x19, 0x4f, 0x92, 0x08, 0x8c, 0x7f, 0x9c, 0x05, 0x4b, 0x2b, 0x8d, - 0xaf, 0x7a, 0xfe, 0xab, 0x94, 0xf9, 0x4e, 0xe7, 0xa6, 0x3d, 0xa0, 0xa1, 0x6d, 0x58, 0x50, 0x19, - 0x08, 0xe0, 0x3b, 0xda, 0x13, 0x80, 0x41, 0x84, 0x87, 0x1e, 0x01, 0x10, 0x6f, 0x46, 0xae, 0xcb, - 0xd7, 0x50, 0x16, 0x10, 0xb1, 0xbc, 0x96, 0x90, 0x54, 0x6b, 0x4e, 0xce, 0x94, 0x84, 0xae, 0xa7, - 0x25, 0x34, 0x37, 0x9d, 0x48, 0x2c, 0xba, 0xad, 0xe7, 0x93, 0xb6, 0x8e, 0xff, 0x61, 0x40, 0x73, - 0x23, 0xbc, 0xf9, 0x11, 0xc5, 0x11, 0xf2, 0x9b, 0x7d, 0x40, 0xfc, 0xe6, 0xbe, 0x1c, 0xbf, 0xb8, - 0x09, 0xb0, 0xe1, 0xb8, 0xf4, 0xaa, 0xd3, 0x67, 0xd4, 0x9f, 0x52, 0xc5, 0xfc, 0x34, 0x17, 0xbb, - 0x04, 0x42, 0x77, 0x42, 0x3e, 0xd7, 0x34, 0x3f, 0xfc, 0x20, 0xd8, 0xc8, 0x3e, 0x40, 0xb5, 0xe5, - 0x52, 0x2e, 0xca, 0x85, 0xe2, 0x8e, 0x60, 0x4f, 0x86, 0xd4, 0x44, 0x23, 0x26, 0xe6, 0xbd, 0xfd, - 0x1d, 0x75, 0xf8, 0xb3, 0xf7, 0xc9, 0x88, 0x44, 0x7b, 0xac, 0x15, 0x8c, 0x5d, 0x66, 0xbf, 0xa7, - 0xed, 0x27, 0xe1, 0x21, 0xc8, 0x56, 0x49, 0x57, 0x7e, 0x6a, 0xd2, 0xf5, 0x82, 0x3a, 0xe6, 0x4b, - 0x55, 0x9d, 0x2f, 0xc4, 0x1e, 0x50, 0x28, 0x45, 0x79, 0xc0, 0xc7, 0xc0, 0xf4, 0xe9, 0x4e, 0x18, - 0xaa, 0x51, 0x7c, 0x72, 0x84, 0x29, 0xd6, 0xf1, 0x5f, 0x0c, 0x58, 0xba, 0x46, 0x59, 0x32, 0x09, - 0x7a, 0x88, 0x54, 0x8a, 0x5f, 0x86, 0xe3, 0xda, 0xfd, 0x15, 0xf7, 0x4f, 0xa7, 0x32, 0x9f, 0x13, - 0x31, 0xff, 0xd7, 0xdd, 0x2e, 0x7d, 0x4f, 0x15, 0x94, 0xc9, 0xa4, 0xe7, 0x16, 0x54, 0xb4, 0x45, - 0x74, 0x25, 0x95, 0xee, 0x2c, 0xa7, 0xfa, 0x95, 0x3c, 0x64, 0xb7, 0x6b, 0x8a, 0x27, 0x59, 0x36, - 0xaa, 0x64, 0x36, 0x4a, 0x0d, 0x36, 0x01, 0x09, 0x75, 0x09, 0xb2, 0x7a, 0x70, 0x12, 0xd0, 0x57, - 0xa2, 0xbc, 0x27, 0x9a, 0xa3, 0x47, 0xc1, 0xf4, 0xbd, 0xbb, 0x61, 0x1e, 0xbb, 0x10, 0x1f, 0x49, - 0xbc, 0xbb, 0x44, 0x2c, 0xe1, 0xe7, 0x21, 0x47, 0xbc, 0xbb, 0xa8, 0x09, 0xe0, 0xdb, 0x6e, 0x8f, - 0xde, 0x8e, 0x2a, 0xa8, 0x2a, 0xd1, 0x20, 0x33, 0x12, 0x87, 0x35, 0x38, 0xae, 0xdf, 0x48, 0xaa, - 0x7b, 0x15, 0x8a, 0xaf, 0x8f, 0x74, 0x71, 0xd5, 0x52, 0xe2, 0x92, 0x85, 0x7a, 0x88, 0xc4, 0x6d, - 0x06, 0x62, 0x38, 0x3a, 0x03, 0x65, 0x66, 0x6f, 0xf7, 0xe9, 0xcd, 0xd8, 0xcd, 0xc5, 0x00, 0xbe, - 0xca, 0x8b, 0xbf, 0xdb, 0x5a, 0x06, 0x14, 0x03, 0xd0, 0x13, 0xb0, 0x14, 0xdf, 0xf9, 0x96, 0x4f, - 0x77, 0x9c, 0xf7, 0x84, 0x86, 0xab, 0xe4, 0x10, 0x1c, 0x9d, 0x85, 0x63, 0x31, 0x6c, 0x53, 0x64, - 0x1a, 0xa6, 0x40, 0x4d, 0x83, 0xb9, 0x6c, 0x04, 0xbb, 0x2f, 0xdd, 0x19, 0xd9, 0x7d, 0xf1, 0xf8, - 0xaa, 0x44, 0x83, 0xe0, 0xbf, 0x1a, 0x70, 0x5c, 0xaa, 0x9a, 0xd9, 0xec, 0xa1, 0xb4, 0xfa, 0xdf, - 0x1a, 0x80, 0x74, 0x0e, 0x94, 0x69, 0xfd, 0xbf, 0xde, 0x08, 0xe2, 0xa9, 0x4c, 0x45, 0xd4, 0xb4, - 0x12, 0x14, 0xf7, 0x72, 0x30, 0x14, 0x44, 0x3a, 0x24, 0x8b, 0x6b, 0x53, 0x16, 0xcd, 0x12, 0x42, - 0xd4, 0x2f, 0xaf, 0xf5, 0xb7, 0xc7, 0x8c, 0x06, 0xaa, 0xe4, 0x15, 0xb5, 0xbe, 0x00, 0x10, 0xf9, - 0xc3, 0xcf, 0xa2, 0x2e, 0x13, 0x56, 0x63, 0xc6, 0x67, 0x29, 0x10, 0x09, 0x07, 0xf8, 0xf7, 0x59, - 0x58, 0xb8, 0xed, 0xf5, 0x47, 0x71, 0x60, 0x7c, 0x98, 0x02, 0x46, 0xa2, 0x0e, 0xcf, 0x87, 0x75, - 0x38, 0x02, 0x33, 0x60, 0x74, 0x28, 0x2c, 0x2b, 0x47, 0xc4, 0x18, 0x61, 0xa8, 0x32, 0xdb, 0xef, - 0x51, 0x26, 0xab, 0x9b, 0x7a, 0x41, 0xa4, 0x9d, 0x09, 0x18, 0x5a, 0x81, 0x8a, 0xdd, 0xeb, 0xf9, - 0xb4, 0x67, 0x33, 0xda, 0x1e, 0xd7, 0x8b, 0xe2, 0x30, 0x1d, 0x84, 0xdf, 0x82, 0xc5, 0x50, 0x58, - 0x4a, 0xa5, 0x4f, 0x41, 0xf1, 0x5d, 0x01, 0x99, 0xd2, 0x17, 0x93, 0xa8, 0xca, 0x8d, 0x85, 0x68, - 0xc9, 0x3e, 0x7b, 0x78, 0x67, 0x7c, 0x03, 0x0a, 0x12, 0x1d, 0x9d, 0xd1, 0x6b, 0x14, 0xd9, 0xa4, - 0xe1, 0x73, 0x55, 0x70, 0x60, 0x28, 0x48, 0x42, 0x4a, 0xf1, 0xc2, 0x36, 0x24, 0x84, 0xa8, 0x5f, - 0xfc, 0x1f, 0x03, 0x4e, 0xac, 0x53, 0x46, 0x3b, 0x8c, 0x76, 0xaf, 0x3a, 0xb4, 0xdf, 0xfd, 0x5a, - 0xcb, 0xe7, 0xa8, 0x09, 0x96, 0xd3, 0x9a, 0x60, 0xdc, 0xef, 0xf4, 0x1d, 0x97, 0x6e, 0x68, 0x5d, - 0x94, 0x18, 0xc0, 0x3d, 0xc4, 0x0e, 0xbf, 0xb8, 0x5c, 0x96, 0x1f, 0x36, 0x34, 0x48, 0xa4, 0xe1, - 0x42, 0xac, 0x61, 0xfc, 0x23, 0x03, 0x4e, 0xa6, 0xb9, 0x56, 0x4a, 0x6a, 0x41, 0x41, 0x6c, 0x9e, - 0xd2, 0x7f, 0x4d, 0xec, 0x20, 0x0a, 0x0d, 0x5d, 0x4a, 0x9c, 0x2f, 0x3e, 0x88, 0xb4, 0xeb, 0x07, - 0x13, 0xab, 0x16, 0x43, 0xb5, 0x12, 0x5f, 0xc3, 0xc5, 0xbf, 0xe2, 0x85, 0xb0, 0x4e, 0x53, 0xe8, - 0x9b, 0xdb, 0x97, 0xf2, 0xbd, 0x72, 0x82, 0xbe, 0x01, 0x26, 0x1b, 0x0f, 0x95, 0xcb, 0x6d, 0x9f, - 0xf8, 0x7c, 0x62, 0x1d, 0x4f, 0x6c, 0xdb, 0x1a, 0x0f, 0x29, 0x11, 0x28, 0xdc, 0x2c, 0x3b, 0xb6, - 0xdf, 0x75, 0x5c, 0xbb, 0xef, 0x30, 0x29, 0x46, 0x93, 0xe8, 0x20, 0xd1, 0x89, 0xd8, 0xa3, 0xac, - 0x23, 0x93, 0xea, 0xaa, 0xea, 0x44, 0x08, 0x48, 0xa2, 0x13, 0x21, 0x20, 0xf8, 0xd7, 0x9a, 0x79, - 0x48, 0xcb, 0x3f, 0xa2, 0x79, 0x18, 0x47, 0x36, 0x0f, 0xe3, 0x3e, 0xe6, 0x81, 0xbf, 0x17, 0xeb, - 0x32, 0xbc, 0xa2, 0xd2, 0xe5, 0x8b, 0xb0, 0xd8, 0x4d, 0xac, 0xcc, 0xd6, 0xa9, 0xec, 0xb2, 0xa6, - 0xd0, 0xf1, 0xb5, 0x58, 0x41, 0x02, 0x32, 0x43, 0x41, 0x29, 0xa9, 0x67, 0x0f, 0x49, 0xfd, 0x89, - 0xc7, 0xa0, 0x1c, 0x7d, 0x8b, 0x42, 0x15, 0x28, 0x5e, 0x7d, 0x8d, 0xbc, 0x79, 0x85, 0xac, 0x2f, - 0x65, 0x50, 0x15, 0x4a, 0xed, 0x2b, 0x6b, 0xaf, 0x88, 0x99, 0x71, 0xf1, 0x83, 0x42, 0x18, 0xc0, - 0x7d, 0xf4, 0x6d, 0xc8, 0xcb, 0xa8, 0x7c, 0x32, 0xbe, 0xae, 0xfe, 0xc9, 0xa7, 0x71, 0xea, 0x10, - 0x5c, 0xf2, 0x8d, 0x33, 0x4f, 0x19, 0xe8, 0x26, 0x54, 0x04, 0x50, 0x35, 0x68, 0xcf, 0xa4, 0xfb, - 0xa4, 0x09, 0x4a, 0x8f, 0xcc, 0x58, 0xd5, 0xe8, 0x5d, 0x86, 0xbc, 0x14, 0xc1, 0xc9, 0x54, 0xf2, - 0x34, 0xe5, 0x36, 0x89, 0x96, 0x35, 0xce, 0xa0, 0xe7, 0xc0, 0xdc, 0xb2, 0x9d, 0x3e, 0xd2, 0x72, - 0x37, 0xad, 0xaf, 0xda, 0x38, 0x99, 0x06, 0x6b, 0xc7, 0xbe, 0x10, 0xb5, 0x87, 0x4f, 0xa5, 0x7b, - 0x54, 0xe1, 0xf6, 0xfa, 0xe1, 0x85, 0xe8, 0xe4, 0xd7, 0x64, 0x13, 0x33, 0xec, 0x94, 0xa0, 0x47, - 0x92, 0x47, 0xa5, 0x1a, 0x2b, 0x8d, 0xe6, 0xac, 0xe5, 0x88, 0xe0, 0x06, 0x54, 0xb4, 0x2e, 0x85, - 0x2e, 0xd6, 0xc3, 0x2d, 0x16, 0x5d, 0xac, 0x53, 0x5a, 0x1b, 0x38, 0x83, 0xae, 0x41, 0x89, 0x67, - 0xbc, 0xe2, 0x6b, 0xc6, 0xe9, 0x74, 0x62, 0xab, 0x25, 0x34, 0x8d, 0x33, 0xd3, 0x17, 0x23, 0x42, - 0xdf, 0x85, 0xf2, 0x35, 0xca, 0x54, 0x54, 0x38, 0x95, 0x0e, 0x2b, 0x53, 0x24, 0x95, 0x0c, 0x4d, - 0x38, 0x83, 0xde, 0x12, 0xc9, 0x77, 0xd2, 0x29, 0x22, 0x6b, 0x86, 0xf3, 0x8b, 0xee, 0xb5, 0x32, - 0x1b, 0x21, 0xa2, 0xfc, 0x66, 0x82, 0xb2, 0x8a, 0x9f, 0xd6, 0x8c, 0x27, 0x18, 0x51, 0xb6, 0xee, - 0xf3, 0x3f, 0x05, 0x38, 0x73, 0xf1, 0xed, 0xf0, 0xb3, 0xfa, 0xba, 0xcd, 0x6c, 0xf4, 0x1a, 0x2c, - 0x0a, 0x59, 0x46, 0xdf, 0xdd, 0x13, 0x36, 0x7f, 0xe8, 0x23, 0x7f, 0xc2, 0xe6, 0x0f, 0x7f, 0xec, - 0xc7, 0x99, 0xf6, 0xdb, 0x1f, 0xdd, 0x6b, 0x66, 0x3e, 0xbe, 0xd7, 0xcc, 0x7c, 0x76, 0xaf, 0x69, - 0xfc, 0x70, 0xbf, 0x69, 0xfc, 0x6e, 0xbf, 0x69, 0x7c, 0xb8, 0xdf, 0x34, 0x3e, 0xda, 0x6f, 0x1a, - 0xff, 0xda, 0x6f, 0x1a, 0xff, 0xde, 0x6f, 0x66, 0x3e, 0xdb, 0x6f, 0x1a, 0xef, 0x7f, 0xda, 0xcc, - 0x7c, 0xf4, 0x69, 0x33, 0xf3, 0xf1, 0xa7, 0xcd, 0xcc, 0xf7, 0x1f, 0xbf, 0x7f, 0xa1, 0x29, 0x1d, - 0x5d, 0x41, 0xfc, 0x3c, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xfa, 0x1a, 0x95, 0xfc, - 0x21, 0x00, 0x00, + // 2602 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6c, 0x1b, 0xc7, + 0x95, 0x4b, 0x2e, 0x7f, 0x8f, 0x94, 0x2c, 0x8f, 0x68, 0x9b, 0xa0, 0x1d, 0xae, 0x32, 0x68, 0x13, + 0x37, 0x76, 0xc4, 0xd8, 0x69, 0x52, 0xc7, 0x69, 0x9a, 0x9a, 0x52, 0xec, 0xc8, 0x51, 0x1c, 0x67, + 0xa4, 0x38, 0x69, 0xd1, 0x20, 0x58, 0x91, 0x23, 0x6a, 0x21, 0x72, 0x97, 0xde, 0x1d, 0xc6, 0xe1, + 0xad, 0x40, 0xcf, 0x45, 0x03, 0xf4, 0xd0, 0xf6, 0x52, 0xb4, 0x40, 0x81, 0x16, 0x29, 0x7a, 0x29, + 0x7a, 0x2c, 0xda, 0x4b, 0x0f, 0xe9, 0x2d, 0xbd, 0x05, 0x39, 0xb0, 0xb5, 0x72, 0x29, 0x74, 0x0a, + 0xd0, 0x5b, 0x4e, 0xc5, 0x7c, 0x76, 0x77, 0x76, 0x45, 0xd6, 0xa1, 0xe3, 0x20, 0xcd, 0x45, 0x9c, + 0x79, 0xf3, 0xe6, 0xcd, 0xbc, 0xcf, 0xbc, 0xdf, 0x0a, 0x4e, 0x0f, 0xf7, 0x7b, 0xad, 0xbe, 0xd7, + 0x1b, 0xfa, 0x1e, 0xf3, 0xa2, 0xc1, 0xaa, 0xf8, 0x8b, 0x4a, 0xe1, 0xbc, 0x51, 0xeb, 0x79, 0x3d, + 0x4f, 0xe2, 0xf0, 0x91, 0x5c, 0x6f, 0x58, 0x3d, 0xcf, 0xeb, 0xf5, 0x69, 0x4b, 0xcc, 0x76, 0x46, + 0xbb, 0x2d, 0xe6, 0x0c, 0x68, 0xc0, 0xec, 0xc1, 0x50, 0x21, 0xac, 0x28, 0xea, 0xb7, 0xfb, 0x03, + 0xaf, 0x4b, 0xfb, 0xad, 0x80, 0xd9, 0x2c, 0x90, 0x7f, 0x15, 0xc6, 0x32, 0xc7, 0x18, 0x8e, 0x82, + 0x3d, 0xf1, 0x47, 0x02, 0xf1, 0x9f, 0x0c, 0x38, 0xb1, 0x69, 0xef, 0xd0, 0xfe, 0xb6, 0x77, 0xcb, + 0xee, 0x8f, 0x68, 0x40, 0x68, 0x30, 0xf4, 0xdc, 0x80, 0xa2, 0x35, 0x28, 0xf4, 0xf9, 0x42, 0x50, + 0x37, 0x56, 0x72, 0x67, 0x2b, 0x17, 0xcf, 0xad, 0x46, 0x57, 0x9e, 0xba, 0x41, 0x42, 0x83, 0x17, + 0x5c, 0xe6, 0x8f, 0x89, 0xda, 0xda, 0xb8, 0x05, 0x15, 0x0d, 0x8c, 0x96, 0x20, 0xb7, 0x4f, 0xc7, + 0x75, 0x63, 0xc5, 0x38, 0x5b, 0x26, 0x7c, 0x88, 0x2e, 0x40, 0xfe, 0x6d, 0x4e, 0xa6, 0x9e, 0x5d, + 0x31, 0xce, 0x56, 0x2e, 0x9e, 0x8e, 0x0f, 0x79, 0xcd, 0x75, 0x6e, 0x8f, 0xa8, 0xd8, 0xad, 0x0e, + 0x92, 0x98, 0x97, 0xb3, 0x97, 0x0c, 0x7c, 0x0e, 0x8e, 0x1f, 0x59, 0x47, 0x27, 0xa1, 0x20, 0x30, + 0xe4, 0x8d, 0xcb, 0x44, 0xcd, 0x70, 0x0d, 0xd0, 0x16, 0xf3, 0xa9, 0x3d, 0x20, 0x36, 0xe3, 0xf7, + 0xbd, 0x3d, 0xa2, 0x01, 0xc3, 0x2f, 0xc3, 0x72, 0x02, 0xaa, 0xd8, 0x7e, 0x1a, 0x2a, 0x41, 0x0c, + 0x56, 0xbc, 0xd7, 0xe2, 0x6b, 0xc5, 0x7b, 0x88, 0x8e, 0x88, 0x7f, 0x69, 0x00, 0xc4, 0x6b, 0xa8, + 0x09, 0x20, 0x57, 0x5f, 0xb4, 0x83, 0x3d, 0xc1, 0xb0, 0x49, 0x34, 0x08, 0x3a, 0x0f, 0xc7, 0xe3, + 0xd9, 0x0d, 0x6f, 0x6b, 0xcf, 0xf6, 0xbb, 0x42, 0x06, 0x26, 0x39, 0xba, 0x80, 0x10, 0x98, 0xbe, + 0xcd, 0x68, 0x3d, 0xb7, 0x62, 0x9c, 0xcd, 0x11, 0x31, 0xe6, 0xdc, 0x32, 0xea, 0xda, 0x2e, 0xab, + 0x9b, 0x42, 0x9c, 0x6a, 0xc6, 0xe1, 0x5c, 0xbf, 0x34, 0xa8, 0xe7, 0x57, 0x8c, 0xb3, 0x0b, 0x44, + 0xcd, 0xf0, 0x7b, 0x39, 0xa8, 0xbe, 0x3a, 0xa2, 0xfe, 0x58, 0x09, 0x00, 0x35, 0xa1, 0x14, 0xd0, + 0x3e, 0xed, 0x30, 0xcf, 0x97, 0x1a, 0x69, 0x67, 0xeb, 0x06, 0x89, 0x60, 0xa8, 0x06, 0xf9, 0xbe, + 0x33, 0x70, 0x98, 0xb8, 0xd6, 0x02, 0x91, 0x13, 0x74, 0x19, 0xf2, 0x01, 0xb3, 0x7d, 0x26, 0xee, + 0x52, 0xb9, 0xd8, 0x58, 0x95, 0x86, 0xb9, 0x1a, 0x1a, 0xe6, 0xea, 0x76, 0x68, 0x98, 0xed, 0xd2, + 0xfb, 0x13, 0x2b, 0xf3, 0xee, 0x3f, 0x2d, 0x83, 0xc8, 0x2d, 0xe8, 0x69, 0xc8, 0x51, 0xb7, 0x2b, + 0xee, 0xfb, 0x59, 0x77, 0xf2, 0x0d, 0xe8, 0x02, 0x94, 0xbb, 0x8e, 0x4f, 0x3b, 0xcc, 0xf1, 0x5c, + 0xc1, 0xd5, 0xe2, 0xc5, 0xe5, 0x58, 0x23, 0xeb, 0xe1, 0x12, 0x89, 0xb1, 0xd0, 0x79, 0x28, 0x04, + 0x5c, 0x74, 0x41, 0xbd, 0xc8, 0x6d, 0xa1, 0x5d, 0x3b, 0x9c, 0x58, 0x4b, 0x12, 0x72, 0xde, 0x1b, + 0x38, 0x8c, 0x0e, 0x86, 0x6c, 0x4c, 0x14, 0x0e, 0x7a, 0x0c, 0x8a, 0x5d, 0xda, 0xa7, 0x5c, 0xe1, + 0x25, 0xa1, 0xf0, 0x25, 0x8d, 0xbc, 0x58, 0x20, 0x21, 0x02, 0x7a, 0x13, 0xcc, 0x61, 0xdf, 0x76, + 0xeb, 0x65, 0xc1, 0xc5, 0x62, 0x8c, 0x78, 0xb3, 0x6f, 0xbb, 0xed, 0x67, 0x3e, 0x9a, 0x58, 0x4f, + 0xf5, 0x1c, 0xb6, 0x37, 0xda, 0x59, 0xed, 0x78, 0x83, 0x56, 0xcf, 0xb7, 0x77, 0x6d, 0xd7, 0x6e, + 0xf5, 0xbd, 0x7d, 0xa7, 0xf5, 0xf6, 0x93, 0x2d, 0xfe, 0x06, 0x6f, 0x8f, 0xa8, 0xef, 0x50, 0xbf, + 0xc5, 0xc9, 0xac, 0x0a, 0x95, 0xf0, 0xad, 0x44, 0x90, 0xbd, 0x6e, 0x96, 0x0a, 0x4b, 0x45, 0x7c, + 0x37, 0x0b, 0x68, 0xcb, 0x1e, 0x0c, 0xfb, 0x74, 0x2e, 0x95, 0x45, 0xca, 0xc9, 0xde, 0xb7, 0x72, + 0x72, 0xf3, 0x2a, 0x27, 0x96, 0xb4, 0x39, 0x9f, 0xa4, 0xf3, 0x9f, 0x55, 0xd2, 0x85, 0x2f, 0x44, + 0xd2, 0xb8, 0x0e, 0x26, 0x9f, 0x71, 0xa7, 0xe4, 0xdb, 0x77, 0x84, 0x3c, 0xab, 0x84, 0x0f, 0xf1, + 0x26, 0x14, 0xe4, 0x5d, 0x50, 0x23, 0x2d, 0xf0, 0xe4, 0xfb, 0x88, 0x85, 0x9d, 0x0b, 0xc5, 0xb8, + 0x14, 0x8b, 0x31, 0x27, 0x04, 0x84, 0xff, 0x6c, 0xc0, 0x82, 0xd2, 0xa2, 0xf2, 0x31, 0x3b, 0x50, + 0x94, 0x6f, 0x3c, 0xf4, 0x2f, 0xa7, 0xd2, 0xfe, 0xe5, 0x4a, 0xd7, 0x1e, 0x32, 0xea, 0xb7, 0x5b, + 0xef, 0x4f, 0x2c, 0xe3, 0xa3, 0x89, 0xf5, 0xe8, 0x2c, 0x46, 0x43, 0x9f, 0x1e, 0xfa, 0xa5, 0x90, + 0x30, 0x3a, 0x27, 0x6e, 0xc7, 0x02, 0x65, 0x0a, 0xc7, 0x56, 0x65, 0x28, 0xd8, 0x70, 0x7b, 0x34, + 0xe0, 0x94, 0x4d, 0xae, 0x45, 0x22, 0x71, 0x38, 0x9b, 0x77, 0x6c, 0xdf, 0x75, 0xdc, 0x5e, 0x50, + 0xcf, 0x09, 0xdf, 0x19, 0xcd, 0xf1, 0xcf, 0x0d, 0x58, 0x4e, 0x98, 0xa2, 0x62, 0xe2, 0x12, 0x14, + 0x02, 0x2e, 0xdd, 0x90, 0x07, 0x4d, 0x91, 0x5b, 0x02, 0xde, 0x5e, 0x54, 0x97, 0x2f, 0xc8, 0x39, + 0x51, 0xf8, 0x0f, 0xee, 0x6a, 0x7f, 0x33, 0xa0, 0x2a, 0x02, 0x40, 0xf8, 0x3e, 0x10, 0x98, 0xae, + 0x3d, 0xa0, 0x4a, 0x55, 0x62, 0xac, 0x45, 0x05, 0x7e, 0x5c, 0x29, 0x8c, 0x0a, 0xf3, 0x3a, 0x32, + 0xe3, 0xbe, 0x1d, 0x99, 0x11, 0xbf, 0x95, 0x1a, 0xe4, 0xb9, 0x49, 0x8e, 0x85, 0x13, 0x2b, 0x13, + 0x39, 0xc1, 0x8f, 0xc2, 0x82, 0xe2, 0x42, 0x89, 0x76, 0x56, 0x20, 0x1b, 0x40, 0x41, 0x6a, 0x02, + 0x7d, 0x0d, 0xca, 0x51, 0x02, 0x20, 0xb8, 0xcd, 0xb5, 0x0b, 0x87, 0x13, 0x2b, 0xcb, 0x02, 0x12, + 0x2f, 0x20, 0x4b, 0x0f, 0xae, 0x46, 0xbb, 0x7c, 0x38, 0xb1, 0x24, 0x40, 0x85, 0x52, 0x74, 0x06, + 0xcc, 0x3d, 0x1e, 0x9f, 0xb8, 0x08, 0xcc, 0x76, 0xe9, 0x70, 0x62, 0x89, 0x39, 0x11, 0x7f, 0xf1, + 0x35, 0xa8, 0x6e, 0xd2, 0x9e, 0xdd, 0x19, 0xab, 0x43, 0x6b, 0x21, 0x39, 0x7e, 0xa0, 0x11, 0xd2, + 0x78, 0x18, 0xaa, 0xd1, 0x89, 0x6f, 0x0d, 0x02, 0xf5, 0x1a, 0x2a, 0x11, 0xec, 0xe5, 0x00, 0xff, + 0xc2, 0x00, 0x65, 0x03, 0x08, 0x6b, 0x59, 0x05, 0xf7, 0x5f, 0x70, 0x38, 0xb1, 0x14, 0x24, 0x4c, + 0x1a, 0xd0, 0xb3, 0x50, 0x0c, 0xc4, 0x89, 0x9c, 0x58, 0xda, 0xb4, 0xc4, 0x42, 0xfb, 0x18, 0x37, + 0x91, 0xc3, 0x89, 0x15, 0x22, 0x92, 0x70, 0x80, 0x56, 0x13, 0x81, 0x57, 0x32, 0xb6, 0x78, 0x38, + 0xb1, 0x34, 0xa8, 0x1e, 0x88, 0xf1, 0xa7, 0x06, 0x54, 0xb6, 0x6d, 0x27, 0x32, 0xa1, 0x7a, 0xa8, + 0xa2, 0xd8, 0xbf, 0x4a, 0x00, 0xb7, 0xc4, 0x2e, 0xed, 0xdb, 0xe3, 0xab, 0x9e, 0x2f, 0xe8, 0x2e, + 0x90, 0x68, 0x1e, 0xc7, 0x4a, 0x73, 0x6a, 0xac, 0xcc, 0xcf, 0xef, 0x8e, 0xbf, 0x58, 0xe7, 0x77, + 0xdd, 0x2c, 0x65, 0x97, 0x72, 0xf8, 0x0f, 0x06, 0x54, 0x25, 0xf3, 0xca, 0xf2, 0x7e, 0x00, 0x05, + 0x29, 0x1b, 0xc1, 0xfe, 0xff, 0x70, 0x4c, 0xe7, 0xe6, 0x71, 0x4a, 0x8a, 0x26, 0x7a, 0x1e, 0x16, + 0xbb, 0xbe, 0x37, 0x1c, 0xd2, 0xee, 0x96, 0x72, 0x7f, 0xd9, 0xb4, 0xfb, 0x5b, 0xd7, 0xd7, 0x49, + 0x0a, 0x1d, 0xff, 0xdd, 0x80, 0x05, 0xe5, 0x4c, 0x94, 0xba, 0x22, 0x11, 0x1b, 0xf7, 0x1d, 0xf1, + 0xb2, 0xf3, 0x46, 0xbc, 0x93, 0x50, 0xe8, 0xf9, 0xde, 0x68, 0x18, 0x3a, 0x24, 0x35, 0x9b, 0x2f, + 0x12, 0xe2, 0xeb, 0xb0, 0x18, 0xb2, 0x32, 0xc3, 0xa3, 0x36, 0xd2, 0x1e, 0x75, 0xa3, 0x4b, 0x5d, + 0xe6, 0xec, 0x3a, 0x91, 0x8f, 0x54, 0xf8, 0xf8, 0x27, 0x06, 0x2c, 0xa5, 0x51, 0xd0, 0x7a, 0x2a, + 0x81, 0x7f, 0x64, 0x36, 0x39, 0x3d, 0x77, 0x0f, 0x49, 0xab, 0x0c, 0xfe, 0xa9, 0x7b, 0x65, 0xf0, + 0x35, 0xdd, 0xc9, 0x94, 0x95, 0x57, 0xc0, 0x3f, 0x33, 0x60, 0x21, 0xa1, 0x4b, 0x74, 0x09, 0xcc, + 0x5d, 0xdf, 0x1b, 0xcc, 0xa5, 0x28, 0xb1, 0x03, 0x7d, 0x13, 0xb2, 0xcc, 0x9b, 0x4b, 0x4d, 0x59, + 0xe6, 0x71, 0x2d, 0x29, 0xf6, 0x73, 0x32, 0x3f, 0x96, 0x33, 0xfc, 0x14, 0x94, 0x05, 0x43, 0x37, + 0x6d, 0xc7, 0x9f, 0x1a, 0x30, 0xa6, 0x33, 0xf4, 0x2c, 0x1c, 0x93, 0xce, 0x70, 0xfa, 0xe6, 0xea, + 0xb4, 0xcd, 0xd5, 0x70, 0xf3, 0x69, 0xc8, 0xaf, 0xed, 0x8d, 0xdc, 0x7d, 0xbe, 0xa5, 0x6b, 0x33, + 0x3b, 0xdc, 0xc2, 0xc7, 0xf8, 0x04, 0x2c, 0xf3, 0x37, 0x48, 0xfd, 0x60, 0xcd, 0x1b, 0xb9, 0x2c, + 0xac, 0x4f, 0xce, 0x43, 0x2d, 0x09, 0x56, 0x56, 0x52, 0x83, 0x7c, 0x87, 0x03, 0x04, 0x8d, 0x05, + 0x22, 0x27, 0xf8, 0x37, 0x06, 0xa0, 0x6b, 0x94, 0x89, 0x53, 0x36, 0xd6, 0xa3, 0xe7, 0xd1, 0x80, + 0xd2, 0xc0, 0x66, 0x9d, 0x3d, 0xea, 0x07, 0x61, 0xfe, 0x12, 0xce, 0xbf, 0x8c, 0x64, 0x11, 0x5f, + 0x80, 0xe5, 0xc4, 0x2d, 0x15, 0x4f, 0x0d, 0x28, 0x75, 0x14, 0x4c, 0x85, 0xbc, 0x68, 0x8e, 0xff, + 0x98, 0x85, 0x92, 0xd8, 0x40, 0xe8, 0x2e, 0xba, 0x00, 0x95, 0x5d, 0xc7, 0xed, 0x51, 0x7f, 0xe8, + 0x3b, 0x4a, 0x04, 0x66, 0xfb, 0xd8, 0xe1, 0xc4, 0xd2, 0xc1, 0x44, 0x9f, 0xa0, 0xc7, 0xa1, 0x38, + 0x0a, 0xa8, 0xff, 0x96, 0x23, 0x5f, 0x7a, 0xb9, 0x5d, 0x3b, 0x98, 0x58, 0x85, 0xd7, 0x02, 0xea, + 0x6f, 0xac, 0xf3, 0xe0, 0x33, 0x12, 0x23, 0x22, 0x7f, 0xbb, 0xe8, 0x25, 0x65, 0xa6, 0x22, 0x81, + 0x6b, 0x7f, 0x8b, 0x5f, 0x3f, 0xe5, 0xea, 0x86, 0xbe, 0x37, 0xa0, 0x6c, 0x8f, 0x8e, 0x82, 0x56, + 0xc7, 0x1b, 0x0c, 0x3c, 0xb7, 0x25, 0x2a, 0x6e, 0xc1, 0x34, 0x8f, 0xa0, 0x7c, 0xbb, 0xb2, 0xdc, + 0x6d, 0x28, 0xb2, 0x3d, 0xdf, 0x1b, 0xf5, 0xf6, 0x44, 0x60, 0xc8, 0xb5, 0x2f, 0xcf, 0x4f, 0x2f, + 0xa4, 0x40, 0xc2, 0x01, 0x7a, 0x98, 0x4b, 0x8b, 0x76, 0xf6, 0x83, 0xd1, 0x40, 0xd6, 0x78, 0xed, + 0xfc, 0xe1, 0xc4, 0x32, 0x1e, 0x27, 0x11, 0x18, 0xff, 0x38, 0x0b, 0x96, 0x56, 0x1a, 0x5f, 0xf5, + 0xfc, 0x97, 0x29, 0xf3, 0x9d, 0xce, 0x0d, 0x7b, 0x40, 0x43, 0xdb, 0xb0, 0xa0, 0x32, 0x10, 0xc0, + 0xb7, 0xb4, 0x27, 0x00, 0x83, 0x08, 0x0f, 0x3d, 0x04, 0x20, 0xde, 0x8c, 0x5c, 0x97, 0xaf, 0xa1, + 0x2c, 0x20, 0x62, 0x79, 0x2d, 0x21, 0xa9, 0xd6, 0x9c, 0x9c, 0x29, 0x09, 0x6d, 0xa4, 0x25, 0x34, + 0x37, 0x9d, 0x48, 0x2c, 0xba, 0xad, 0xe7, 0x93, 0xb6, 0x8e, 0xff, 0x61, 0x40, 0x73, 0x33, 0xbc, + 0xf9, 0x7d, 0x8a, 0x23, 0xe4, 0x37, 0xfb, 0x80, 0xf8, 0xcd, 0x7d, 0x3e, 0x7e, 0x71, 0x13, 0x60, + 0xd3, 0x71, 0xe9, 0x55, 0xa7, 0xcf, 0xa8, 0x3f, 0xa5, 0x8a, 0xf9, 0x69, 0x2e, 0x76, 0x09, 0x84, + 0xee, 0x86, 0x7c, 0xae, 0x69, 0x7e, 0xf8, 0x41, 0xb0, 0x91, 0x7d, 0x80, 0x6a, 0xcb, 0xa5, 0x5c, + 0x94, 0x0b, 0xc5, 0x5d, 0xc1, 0x9e, 0x0c, 0xa9, 0x89, 0x46, 0x4c, 0xcc, 0x7b, 0xfb, 0x3b, 0xea, + 0xf0, 0xa7, 0xef, 0x91, 0x11, 0x89, 0xf6, 0x58, 0x2b, 0x18, 0xbb, 0xcc, 0x7e, 0x47, 0xdb, 0x4f, + 0xc2, 0x43, 0x90, 0xad, 0x92, 0xae, 0xfc, 0xd4, 0xa4, 0xeb, 0x39, 0x75, 0xcc, 0xe7, 0xaa, 0x3a, + 0x9f, 0x8b, 0x3d, 0xa0, 0x50, 0x8a, 0xf2, 0x80, 0x8f, 0x80, 0xe9, 0xd3, 0xdd, 0x30, 0x54, 0xa3, + 0xf8, 0xe4, 0x08, 0x53, 0xac, 0xe3, 0xbf, 0x18, 0xb0, 0x74, 0x8d, 0xb2, 0x64, 0x12, 0xf4, 0x15, + 0x52, 0x29, 0x7e, 0x11, 0x8e, 0x6b, 0xf7, 0x57, 0xdc, 0x3f, 0x99, 0xca, 0x7c, 0x4e, 0xc4, 0xfc, + 0x6f, 0xb8, 0x5d, 0xfa, 0x8e, 0x2a, 0x28, 0x93, 0x49, 0xcf, 0x4d, 0xa8, 0x68, 0x8b, 0xe8, 0x4a, + 0x2a, 0xdd, 0x59, 0x4e, 0xf5, 0x2b, 0x79, 0xc8, 0x6e, 0xd7, 0x14, 0x4f, 0xb2, 0x6c, 0x54, 0xc9, + 0x6c, 0x94, 0x1a, 0x6c, 0x01, 0x12, 0xea, 0x12, 0x64, 0xf5, 0xe0, 0x24, 0xa0, 0x2f, 0x45, 0x79, + 0x4f, 0x34, 0x47, 0x0f, 0x83, 0xe9, 0x7b, 0x77, 0xc2, 0x3c, 0x76, 0x21, 0x3e, 0x92, 0x78, 0x77, + 0x88, 0x58, 0xc2, 0xcf, 0x42, 0x8e, 0x78, 0x77, 0x50, 0x13, 0xc0, 0xb7, 0xdd, 0x1e, 0xbd, 0x15, + 0x55, 0x50, 0x55, 0xa2, 0x41, 0x66, 0x24, 0x0e, 0x6b, 0x70, 0x5c, 0xbf, 0x91, 0x54, 0xf7, 0x2a, + 0x14, 0x5f, 0x1d, 0xe9, 0xe2, 0xaa, 0xa5, 0xc4, 0x25, 0x0b, 0xf5, 0x10, 0x89, 0xdb, 0x0c, 0xc4, + 0x70, 0x74, 0x06, 0xca, 0xcc, 0xde, 0xe9, 0xd3, 0x1b, 0xb1, 0x9b, 0x8b, 0x01, 0x7c, 0x95, 0x17, + 0x7f, 0xb7, 0xb4, 0x0c, 0x28, 0x06, 0xa0, 0xc7, 0x60, 0x29, 0xbe, 0xf3, 0x4d, 0x9f, 0xee, 0x3a, + 0xef, 0x08, 0x0d, 0x57, 0xc9, 0x11, 0x38, 0x3a, 0x0b, 0xc7, 0x62, 0xd8, 0x96, 0xc8, 0x34, 0x4c, + 0x81, 0x9a, 0x06, 0x73, 0xd9, 0x08, 0x76, 0x5f, 0xb8, 0x3d, 0xb2, 0xfb, 0xe2, 0xf1, 0x55, 0x89, + 0x06, 0xc1, 0x7f, 0x35, 0xe0, 0xb8, 0x54, 0x35, 0xb3, 0xd9, 0x57, 0xd2, 0xea, 0x7f, 0x6b, 0x00, + 0xd2, 0x39, 0x50, 0xa6, 0xf5, 0x75, 0xbd, 0x11, 0xc4, 0x53, 0x99, 0x8a, 0xa8, 0x69, 0x25, 0x28, + 0xee, 0xe5, 0x60, 0x28, 0x88, 0x74, 0x48, 0x16, 0xd7, 0xa6, 0x2c, 0x9a, 0x25, 0x84, 0xa8, 0x5f, + 0x5e, 0xeb, 0xef, 0x8c, 0x19, 0x0d, 0x54, 0xc9, 0x2b, 0x6a, 0x7d, 0x01, 0x20, 0xf2, 0x87, 0x9f, + 0x45, 0x5d, 0x26, 0xac, 0xc6, 0x8c, 0xcf, 0x52, 0x20, 0x12, 0x0e, 0xf0, 0xef, 0xb3, 0xb0, 0x70, + 0xcb, 0xeb, 0x8f, 0xe2, 0xc0, 0xf8, 0x55, 0x0a, 0x18, 0x89, 0x3a, 0x3c, 0x1f, 0xd6, 0xe1, 0x08, + 0xcc, 0x80, 0xd1, 0xa1, 0xb0, 0xac, 0x1c, 0x11, 0x63, 0x84, 0xa1, 0xca, 0x6c, 0xbf, 0x47, 0x99, + 0xac, 0x6e, 0xea, 0x05, 0x91, 0x76, 0x26, 0x60, 0x68, 0x05, 0x2a, 0x76, 0xaf, 0xe7, 0xd3, 0x9e, + 0xcd, 0x68, 0x7b, 0x5c, 0x2f, 0x8a, 0xc3, 0x74, 0x10, 0x7e, 0x03, 0x16, 0x43, 0x61, 0x29, 0x95, + 0x3e, 0x01, 0xc5, 0xb7, 0x05, 0x64, 0x4a, 0x5f, 0x4c, 0xa2, 0x2a, 0x37, 0x16, 0xa2, 0x25, 0xfb, + 0xec, 0xe1, 0x9d, 0xf1, 0x75, 0x28, 0x48, 0x74, 0x74, 0x46, 0xaf, 0x51, 0x64, 0x93, 0x86, 0xcf, + 0x55, 0xc1, 0x81, 0xa1, 0x20, 0x09, 0x29, 0xc5, 0x0b, 0xdb, 0x90, 0x10, 0xa2, 0x7e, 0xf1, 0x7f, + 0x0c, 0x38, 0xb1, 0x4e, 0x19, 0xed, 0x30, 0xda, 0xbd, 0xea, 0xd0, 0x7e, 0xf7, 0x4b, 0x2d, 0x9f, + 0xa3, 0x26, 0x58, 0x4e, 0x6b, 0x82, 0x71, 0xbf, 0xd3, 0x77, 0x5c, 0xba, 0xa9, 0x75, 0x51, 0x62, + 0x00, 0xf7, 0x10, 0xbb, 0xfc, 0xe2, 0x72, 0x59, 0x7e, 0xd8, 0xd0, 0x20, 0x91, 0x86, 0x0b, 0xb1, + 0x86, 0xf1, 0x8f, 0x0c, 0x38, 0x99, 0xe6, 0x5a, 0x29, 0xa9, 0x05, 0x05, 0xb1, 0x79, 0x4a, 0xff, + 0x35, 0xb1, 0x83, 0x28, 0x34, 0x74, 0x29, 0x71, 0xbe, 0xf8, 0x20, 0xd2, 0xae, 0x1f, 0x4e, 0xac, + 0x5a, 0x0c, 0xd5, 0x4a, 0x7c, 0x0d, 0x17, 0xff, 0x8a, 0x17, 0xc2, 0x3a, 0x4d, 0xa1, 0x6f, 0x6e, + 0x5f, 0xca, 0xf7, 0xca, 0x09, 0xfa, 0x06, 0x98, 0x6c, 0x3c, 0x54, 0x2e, 0xb7, 0x7d, 0xe2, 0xd3, + 0x89, 0x75, 0x3c, 0xb1, 0x6d, 0x7b, 0x3c, 0xa4, 0x44, 0xa0, 0x70, 0xb3, 0xec, 0xd8, 0x7e, 0xd7, + 0x71, 0xed, 0xbe, 0xc3, 0xa4, 0x18, 0x4d, 0xa2, 0x83, 0x44, 0x27, 0x62, 0x9f, 0xb2, 0x8e, 0x4c, + 0xaa, 0xab, 0xaa, 0x13, 0x21, 0x20, 0x89, 0x4e, 0x84, 0x80, 0xe0, 0x5f, 0x6b, 0xe6, 0x21, 0x2d, + 0xff, 0xff, 0xce, 0x3c, 0xf0, 0xf7, 0x62, 0x5d, 0x86, 0x57, 0x54, 0xba, 0x7c, 0x1e, 0x16, 0xbb, + 0x89, 0x95, 0xd9, 0x3a, 0x95, 0x5d, 0xd6, 0x14, 0x3a, 0xbe, 0x16, 0x2b, 0x48, 0x40, 0x66, 0x28, + 0x28, 0x25, 0xf5, 0xec, 0x11, 0xa9, 0x3f, 0xf6, 0x08, 0x94, 0xa3, 0x6f, 0x51, 0xa8, 0x02, 0xc5, + 0xab, 0xaf, 0x90, 0xd7, 0xaf, 0x90, 0xf5, 0xa5, 0x0c, 0xaa, 0x42, 0xa9, 0x7d, 0x65, 0xed, 0x25, + 0x31, 0x33, 0x2e, 0xbe, 0x57, 0x08, 0x03, 0xb8, 0x8f, 0xbe, 0x0d, 0x79, 0x19, 0x95, 0x4f, 0xc6, + 0xd7, 0xd5, 0x3f, 0xf9, 0x34, 0x4e, 0x1d, 0x81, 0x4b, 0xbe, 0x71, 0xe6, 0x09, 0x03, 0xdd, 0x80, + 0x8a, 0x00, 0xaa, 0x06, 0xed, 0x99, 0x74, 0x9f, 0x34, 0x41, 0xe9, 0xa1, 0x19, 0xab, 0x1a, 0xbd, + 0xcb, 0x90, 0x97, 0x22, 0x38, 0x99, 0x4a, 0x9e, 0xa6, 0xdc, 0x26, 0xd1, 0xb2, 0xc6, 0x19, 0xf4, + 0x0c, 0x98, 0xdb, 0xb6, 0xd3, 0x47, 0x5a, 0xee, 0xa6, 0xf5, 0x55, 0x1b, 0x27, 0xd3, 0x60, 0xed, + 0xd8, 0xe7, 0xa2, 0xf6, 0xf0, 0xa9, 0x74, 0x8f, 0x2a, 0xdc, 0x5e, 0x3f, 0xba, 0x10, 0x9d, 0xfc, + 0x8a, 0x6c, 0x62, 0x86, 0x9d, 0x12, 0xf4, 0x50, 0xf2, 0xa8, 0x54, 0x63, 0xa5, 0xd1, 0x9c, 0xb5, + 0x1c, 0x11, 0xdc, 0x84, 0x8a, 0xd6, 0xa5, 0xd0, 0xc5, 0x7a, 0xb4, 0xc5, 0xa2, 0x8b, 0x75, 0x4a, + 0x6b, 0x03, 0x67, 0xd0, 0x35, 0x28, 0xf1, 0x8c, 0x57, 0x7c, 0xcd, 0x38, 0x9d, 0x4e, 0x6c, 0xb5, + 0x84, 0xa6, 0x71, 0x66, 0xfa, 0x62, 0x44, 0xe8, 0xbb, 0x50, 0xbe, 0x46, 0x99, 0x8a, 0x0a, 0xa7, + 0xd2, 0x61, 0x65, 0x8a, 0xa4, 0x92, 0xa1, 0x09, 0x67, 0xd0, 0x1b, 0x22, 0xf9, 0x4e, 0x3a, 0x45, + 0x64, 0xcd, 0x70, 0x7e, 0xd1, 0xbd, 0x56, 0x66, 0x23, 0x44, 0x94, 0x5f, 0x4f, 0x50, 0x56, 0xf1, + 0xd3, 0x9a, 0xf1, 0x04, 0x23, 0xca, 0xd6, 0x3d, 0xfe, 0xa7, 0x00, 0x67, 0x2e, 0xbe, 0x19, 0x7e, + 0x56, 0x5f, 0xb7, 0x99, 0x8d, 0x5e, 0x81, 0x45, 0x21, 0xcb, 0xe8, 0xbb, 0x7b, 0xc2, 0xe6, 0x8f, + 0x7c, 0xe4, 0x4f, 0xd8, 0xfc, 0xd1, 0x8f, 0xfd, 0x38, 0xd3, 0x7e, 0xf3, 0x83, 0xbb, 0xcd, 0xcc, + 0x87, 0x77, 0x9b, 0x99, 0x4f, 0xee, 0x36, 0x8d, 0x1f, 0x1e, 0x34, 0x8d, 0xdf, 0x1d, 0x34, 0x8d, + 0xf7, 0x0f, 0x9a, 0xc6, 0x07, 0x07, 0x4d, 0xe3, 0x5f, 0x07, 0x4d, 0xe3, 0xdf, 0x07, 0xcd, 0xcc, + 0x27, 0x07, 0x4d, 0xe3, 0xdd, 0x8f, 0x9b, 0x99, 0x0f, 0x3e, 0x6e, 0x66, 0x3e, 0xfc, 0xb8, 0x99, + 0xf9, 0xfe, 0xa3, 0xf7, 0x2e, 0x34, 0xa5, 0xa3, 0x2b, 0x88, 0x9f, 0x27, 0xff, 0x1b, 0x00, 0x00, + 0xff, 0xff, 0x64, 0x2a, 0x49, 0xe1, 0xfc, 0x21, 0x00, 0x00, } func (x Direction) String() string { @@ -4878,18 +4877,10 @@ func (this *DetectedLabelsRequest) Equal(that interface{}) bool { } else if this == nil { return false } - if that1.Start == nil { - if this.Start != nil { - return false - } - } else if !this.Start.Equal(*that1.Start) { + if !this.Start.Equal(that1.Start) { return false } - if that1.End == nil { - if this.End != nil { - return false - } - } else if !this.End.Equal(*that1.End) { + if !this.End.Equal(that1.End) { return false } if this.Query != that1.Query { @@ -8547,26 +8538,22 @@ func (m *DetectedLabelsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if m.End != nil { - n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.End):]) - if err24 != nil { - return 0, err24 - } - i -= n24 - i = encodeVarintLogproto(dAtA, i, uint64(n24)) - i-- - dAtA[i] = 0x12 + n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):]) + if err24 != nil { + return 0, err24 } - if m.Start != nil { - n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Start):]) - if err25 != nil { - return 0, err25 - } - i -= n25 - i = encodeVarintLogproto(dAtA, i, uint64(n25)) - i-- - dAtA[i] = 0xa + i -= n24 + i = encodeVarintLogproto(dAtA, i, uint64(n24)) + i-- + dAtA[i] = 0x12 + n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err25 != nil { + return 0, err25 } + i -= n25 + i = encodeVarintLogproto(dAtA, i, uint64(n25)) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -9658,14 +9645,10 @@ func (m *DetectedLabelsRequest) Size() (n int) { } var l int _ = l - if m.Start != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.Start) - n += 1 + l + sovLogproto(uint64(l)) - } - if m.End != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.End) - 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) + n += 1 + l + sovLogproto(uint64(l)) l = len(m.Query) if l > 0 { n += 1 + l + sovLogproto(uint64(l)) @@ -10388,8 +10371,8 @@ func (this *DetectedLabelsRequest) String() string { return "nil" } s := strings.Join([]string{`&DetectedLabelsRequest{`, - `Start:` + strings.Replace(fmt.Sprintf("%v", this.Start), "Timestamp", "types.Timestamp", 1) + `,`, - `End:` + strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1) + `,`, + `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) + `,`, `}`, }, "") @@ -17205,10 +17188,7 @@ func (m *DetectedLabelsRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Start == nil { - m.Start = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.Start, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Start, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -17241,10 +17221,7 @@ func (m *DetectedLabelsRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.End == nil { - m.End = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.End, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.End, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index 830fbfe627ab9..ccb35c115c515 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -467,11 +467,11 @@ message DetectedField { message DetectedLabelsRequest { google.protobuf.Timestamp start = 1 [ (gogoproto.stdtime) = true, - (gogoproto.nullable) = true + (gogoproto.nullable) = false ]; google.protobuf.Timestamp end = 2 [ (gogoproto.stdtime) = true, - (gogoproto.nullable) = true + (gogoproto.nullable) = false ]; string query = 3; } diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 3fb46b1da7df0..87898680e99d2 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -924,18 +924,18 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. defer cancel() g, ctx := errgroup.WithContext(ctx) - if *req.Start, *req.End, err = validateQueryTimeRangeLimits(ctx, userID, q.limits, *req.Start, *req.End); err != nil { + if req.Start, req.End, err = validateQueryTimeRangeLimits(ctx, userID, q.limits, req.Start, req.End); err != nil { return nil, err } - ingesterQueryInterval, storeQueryInterval := q.buildQueryIntervals(*req.Start, *req.End) + ingesterQueryInterval, storeQueryInterval := q.buildQueryIntervals(req.Start, req.End) var ingesterLabels *logproto.LabelToValuesResponse if !q.cfg.QueryStoreOnly && ingesterQueryInterval != nil { g.Go(func() error { var err error splitReq := *req - splitReq.Start = &ingesterQueryInterval.start - splitReq.End = &ingesterQueryInterval.end + splitReq.Start = ingesterQueryInterval.start + splitReq.End = ingesterQueryInterval.end ingesterLabels, err = q.ingesterQuerier.DetectedLabel(ctx, &splitReq) return err @@ -979,14 +979,14 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. }, nil } - // append static labels before so they are in sorted order - for l := range staticLabels { - if values, present := ingesterLabels.Labels[l]; present { - detectedLabels = append(detectedLabels, &logproto.DetectedLabel{Label: l, Cardinality: uint64(len(values.Values))}) + if ingesterLabels != nil { + // append static labels before so they are in sorted order + for l := range staticLabels { + if values, present := ingesterLabels.Labels[l]; present { + detectedLabels = append(detectedLabels, &logproto.DetectedLabel{Label: l, Cardinality: uint64(len(values.Values))}) + } } - } - if ingesterLabels != nil { for label, values := range ingesterLabels.Labels { if q.isLabelRelevant(label, values.Values, staticLabels) { combinedValues := values.Values diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index 99392878ef9b5..58fbf0b94451f 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -274,19 +274,19 @@ func (r *DetectedLabelsRequest) AsProto() *logproto.DetectedLabelsRequest { } func (r *DetectedLabelsRequest) GetEnd() time.Time { - return *r.End + return r.End } func (r *DetectedLabelsRequest) GetEndTs() time.Time { - return *r.End + return r.End } func (r *DetectedLabelsRequest) GetStart() time.Time { - return *r.Start + return r.Start } func (r *DetectedLabelsRequest) GetStartTs() time.Time { - return *r.Start + return r.Start } func (r *DetectedLabelsRequest) GetStep() int64 { @@ -295,8 +295,8 @@ func (r *DetectedLabelsRequest) GetStep() int64 { func (r *DetectedLabelsRequest) WithStartEnd(s, e time.Time) queryrangebase.Request { clone := *r - clone.Start = &s - clone.End = &e + clone.Start = s + clone.End = e return &clone } @@ -1603,6 +1603,25 @@ func (Codec) MergeResponse(responses ...queryrangebase.Response) (queryrangebase }, Headers: headers, }, nil + case *DetectedLabelsResponse: + resp0 := responses[0].(*DetectedLabelsResponse) + headers := resp0.Headers + var labels []*logproto.DetectedLabel + + for _, r := range responses { + labels = append(labels, r.(*DetectedLabelsResponse).Response.DetectedLabels...) + } + mergedLabels, err := detected.MergeLabels(labels) + if err != nil { + return nil, err + } + + return &DetectedLabelsResponse{ + Response: &logproto.DetectedLabelsResponse{ + DetectedLabels: mergedLabels, + }, + Headers: headers, + }, nil default: return nil, fmt.Errorf("unknown response type (%T) in merging responses", responses[0]) } @@ -1801,6 +1820,10 @@ func ParamsFromRequest(req queryrangebase.Request) (logql.Params, error) { return ¶msDetectedFieldsWrapper{ DetectedFieldsRequest: r, }, nil + case *DetectedLabelsRequest: + return ¶msDetectedLabelsWrapper{ + DetectedLabelsRequest: r, + }, nil default: return nil, fmt.Errorf("expected one of the *LokiRequest, *LokiInstantRequest, *LokiSeriesRequest, *LokiLabelNamesRequest, *DetectedFieldsRequest, got (%T)", r) } @@ -2011,6 +2034,47 @@ func (p paramsDetectedFieldsWrapper) Shards() []string { return make([]string, 0) } +type paramsDetectedLabelsWrapper struct { + *DetectedLabelsRequest +} + +func (p paramsDetectedLabelsWrapper) QueryString() string { + return p.GetQuery() +} + +func (p paramsDetectedLabelsWrapper) GetExpression() syntax.Expr { + expr, err := syntax.ParseExpr(p.GetQuery()) + if err != nil { + return nil + } + + return expr +} + +func (p paramsDetectedLabelsWrapper) Start() time.Time { + return p.GetStartTs() +} + +func (p paramsDetectedLabelsWrapper) End() time.Time { + return p.GetEndTs() +} + +func (p paramsDetectedLabelsWrapper) Step() time.Duration { + return time.Duration(p.GetStep() * 1e6) +} + +func (p paramsDetectedLabelsWrapper) Interval() time.Duration { + return 0 +} + +func (p paramsDetectedLabelsWrapper) Direction() logproto.Direction { + return logproto.BACKWARD +} +func (p paramsDetectedLabelsWrapper) Limit() uint32 { return 0 } +func (p paramsDetectedLabelsWrapper) Shards() []string { + return make([]string, 0) +} + func httpResponseHeadersToPromResponseHeaders(httpHeaders http.Header) []queryrangebase.PrometheusResponseHeader { var promHeaders []queryrangebase.PrometheusResponseHeader for h, hv := range httpHeaders { diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index ff7c4ba4dbff1..15eccf7c86f35 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -261,7 +261,8 @@ func NewMiddleware( schema, metrics, indexStatsTripperware, - metricsNamespace) + metricsNamespace, + codec, limits, iqo) if err != nil { return nil, nil, err @@ -284,16 +285,17 @@ func NewMiddleware( }), StopperWrapper{resultsCache, statsCache, volumeCache}, nil } -func NewDetectedLabelsTripperware(cfg Config, opts logql.EngineOpts, logger log.Logger, l Limits, schema config.SchemaConfig, metrics *Metrics, mw base.Middleware, namespace string) (base.Middleware, error) { +func NewDetectedLabelsTripperware(cfg Config, opts logql.EngineOpts, logger log.Logger, l Limits, schema config.SchemaConfig, metrics *Metrics, mw base.Middleware, namespace string, merger base.Merger, limits Limits, iqo util.IngesterQueryOptions) (base.Middleware, error) { return base.MiddlewareFunc(func(next base.Handler) base.Handler { statsHandler := mw.Wrap(next) + splitter := newDefaultSplitter(limits, iqo) queryRangeMiddleware := []base.Middleware{ StatsCollectorMiddleware(), NewLimitsMiddleware(l), NewQuerySizeLimiterMiddleware(schema.Configs, opts, logger, l, statsHandler), base.InstrumentMiddleware("split_by_interval", metrics.InstrumentMiddlewareMetrics), - } + SplitByIntervalMiddleware(schema.Configs, limits, merger, splitter, metrics.SplitByMetrics)} // The sharding middleware takes care of enforcing this limit for both shardable and non-shardable queries. // If we are not using sharding, we enforce the limit by adding this middleware after time splitting. @@ -442,7 +444,16 @@ func (r roundTripper) Do(ctx context.Context, req base.Request) (base.Response, ) return r.detectedFields.Do(ctx, req) - // TODO(shantanu): Add DetectedLabels + case *DetectedLabelsRequest: + level.Info(logger).Log( + "msg", "executing query", + "type", "detected_label", + "end", op.End, + "length", op.End.Sub(op.Start), + "query", op.Query, + "start", op.Start, + ) + return r.detectedLabels.Do(ctx, req) default: return r.next.Do(ctx, req) } diff --git a/pkg/querier/queryrange/split_by_interval.go b/pkg/querier/queryrange/split_by_interval.go index fc71742859798..7dfeb729e149a 100644 --- a/pkg/querier/queryrange/split_by_interval.go +++ b/pkg/querier/queryrange/split_by_interval.go @@ -228,7 +228,7 @@ func (h *splitByInterval) Do(ctx context.Context, r queryrangebase.Request) (que for i, j := 0, len(intervals)-1; i < j; i, j = i+1, j-1 { intervals[i], intervals[j] = intervals[j], intervals[i] } - case *LokiSeriesRequest, *LabelRequest, *logproto.IndexStatsRequest, *logproto.VolumeRequest, *logproto.ShardsRequest: + case *LokiSeriesRequest, *LabelRequest, *logproto.IndexStatsRequest, *logproto.VolumeRequest, *logproto.ShardsRequest, *DetectedLabelsRequest: // Set this to 0 since this is not used in Series/Labels/Index Request. limit = 0 default: diff --git a/pkg/querier/queryrange/splitters.go b/pkg/querier/queryrange/splitters.go index 42a81f6defd39..478a22cd19d0c 100644 --- a/pkg/querier/queryrange/splitters.go +++ b/pkg/querier/queryrange/splitters.go @@ -1,8 +1,11 @@ package queryrange import ( + "fmt" "time" + "github.com/go-kit/log/level" + util_log "github.com/grafana/loki/v3/pkg/util/log" "github.com/prometheus/common/model" "github.com/grafana/loki/v3/pkg/logproto" @@ -109,7 +112,19 @@ func (s *defaultSplitter) split(execTime time.Time, tenantIDs []string, req quer path: r.path, }) } + case *DetectedLabelsRequest: + factory = func(start, end time.Time) { + reqs = append(reqs, &DetectedLabelsRequest{ + DetectedLabelsRequest: logproto.DetectedLabelsRequest{ + Start: start, + End: end, + Query: r.Query, + }, + path: r.path, + }) + } default: + level.Warn(util_log.Logger).Log("msg", fmt.Sprintf("splitter: unsupported request type: %T", req)) return nil, nil } diff --git a/pkg/querier/queryrange/stats.go b/pkg/querier/queryrange/stats.go index 384ee7ceed53c..67ca803d52964 100644 --- a/pkg/querier/queryrange/stats.go +++ b/pkg/querier/queryrange/stats.go @@ -179,6 +179,10 @@ func StatsCollectorMiddleware() queryrangebase.Middleware { responseStats = &stats.Result{} // TODO: support stats in query patterns totalEntries = len(r.Response.Series) queryType = queryTypeQueryPatterns + case *DetectedLabelsResponse: + responseStats = &stats.Result{} + totalEntries = 1 + queryType = queryTypeDetectedLabels default: level.Warn(logger).Log("msg", fmt.Sprintf("cannot compute stats, unexpected type: %T", resp)) } diff --git a/pkg/storage/detected/labels.go b/pkg/storage/detected/labels.go new file mode 100644 index 0000000000000..0b8e6ea5325b0 --- /dev/null +++ b/pkg/storage/detected/labels.go @@ -0,0 +1,7 @@ +package detected + +import "github.com/grafana/loki/v3/pkg/logproto" + +func MergeLabels(_ []*logproto.DetectedLabel) ([]*logproto.DetectedLabel, error) { + return nil, nil +} From 99b92f2795b6b7496ba5c144d031ad7b8cdeed9d Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Mon, 29 Apr 2024 17:58:51 +0530 Subject: [PATCH 03/11] Change detected labels implementation to use hyperloglog --- pkg/ingester/ingester_test.go | 8 +- pkg/logproto/logproto.pb.go | 389 ++++++++++++++++------------ pkg/logproto/logproto.proto | 1 + pkg/querier/querier.go | 77 +++--- pkg/querier/querier_test.go | 327 ++++++++++++----------- pkg/querier/queryrange/splitters.go | 3 +- pkg/storage/detected/labels.go | 65 ++++- 7 files changed, 508 insertions(+), 362 deletions(-) diff --git a/pkg/ingester/ingester_test.go b/pkg/ingester/ingester_test.go index 6722e6cfccf3a..54cdc9bcd665d 100644 --- a/pkg/ingester/ingester_test.go +++ b/pkg/ingester/ingester_test.go @@ -833,8 +833,8 @@ func TestIngester_GetDetectedLabels(t *testing.T) { require.NoError(t, err) res, err := i.GetDetectedLabels(ctx, &logproto.DetectedLabelsRequest{ - Start: &[]time.Time{time.Now().Add(11 * time.Nanosecond)}[0], - End: nil, + Start: []time.Time{time.Now().Add(11 * time.Nanosecond)}[0], + End: []time.Time{time.Now().Add(11 * time.Nanosecond)}[0], Query: "", }) @@ -893,8 +893,8 @@ func TestIngester_GetDetectedLabelsWithQuery(t *testing.T) { require.NoError(t, err) res, err := i.GetDetectedLabels(ctx, &logproto.DetectedLabelsRequest{ - Start: &[]time.Time{time.Now().Add(11 * time.Nanosecond)}[0], - End: nil, + Start: []time.Time{time.Now().Add(11 * time.Nanosecond)}[0], + End: []time.Time{time.Now().Add(11 * time.Nanosecond)}[0], Query: `{foo="bar"}`, }) diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index 1d4e6953614c9..97f364752c8f8 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -2923,6 +2923,7 @@ func (m *DetectedLabelsResponse) GetDetectedLabels() []*DetectedLabel { type DetectedLabel struct { Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` Cardinality uint64 `protobuf:"varint,2,opt,name=cardinality,proto3" json:"cardinality,omitempty"` + Sketch []byte `protobuf:"bytes,3,opt,name=sketch,proto3" json:"sketch,omitempty"` } func (m *DetectedLabel) Reset() { *m = DetectedLabel{} } @@ -2971,6 +2972,13 @@ func (m *DetectedLabel) GetCardinality() uint64 { return 0 } +func (m *DetectedLabel) GetSketch() []byte { + if m != nil { + return m.Sketch + } + return nil +} + func init() { proto.RegisterEnum("logproto.Direction", Direction_name, Direction_value) proto.RegisterType((*LabelToValuesResponse)(nil), "logproto.LabelToValuesResponse") @@ -3033,170 +3041,171 @@ func init() { func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2602 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6c, 0x1b, 0xc7, - 0x95, 0x4b, 0x2e, 0x7f, 0x8f, 0x94, 0x2c, 0x8f, 0x68, 0x9b, 0xa0, 0x1d, 0xae, 0x32, 0x68, 0x13, - 0x37, 0x76, 0xc4, 0xd8, 0x69, 0x52, 0xc7, 0x69, 0x9a, 0x9a, 0x52, 0xec, 0xc8, 0x51, 0x1c, 0x67, - 0xa4, 0x38, 0x69, 0xd1, 0x20, 0x58, 0x91, 0x23, 0x6a, 0x21, 0x72, 0x97, 0xde, 0x1d, 0xc6, 0xe1, - 0xad, 0x40, 0xcf, 0x45, 0x03, 0xf4, 0xd0, 0xf6, 0x52, 0xb4, 0x40, 0x81, 0x16, 0x29, 0x7a, 0x29, - 0x7a, 0x2c, 0xda, 0x4b, 0x0f, 0xe9, 0x2d, 0xbd, 0x05, 0x39, 0xb0, 0xb5, 0x72, 0x29, 0x74, 0x0a, - 0xd0, 0x5b, 0x4e, 0xc5, 0x7c, 0x76, 0x77, 0x76, 0x45, 0xd6, 0xa1, 0xe3, 0x20, 0xcd, 0x45, 0x9c, - 0x79, 0xf3, 0xe6, 0xcd, 0xbc, 0xcf, 0xbc, 0xdf, 0x0a, 0x4e, 0x0f, 0xf7, 0x7b, 0xad, 0xbe, 0xd7, - 0x1b, 0xfa, 0x1e, 0xf3, 0xa2, 0xc1, 0xaa, 0xf8, 0x8b, 0x4a, 0xe1, 0xbc, 0x51, 0xeb, 0x79, 0x3d, - 0x4f, 0xe2, 0xf0, 0x91, 0x5c, 0x6f, 0x58, 0x3d, 0xcf, 0xeb, 0xf5, 0x69, 0x4b, 0xcc, 0x76, 0x46, - 0xbb, 0x2d, 0xe6, 0x0c, 0x68, 0xc0, 0xec, 0xc1, 0x50, 0x21, 0xac, 0x28, 0xea, 0xb7, 0xfb, 0x03, - 0xaf, 0x4b, 0xfb, 0xad, 0x80, 0xd9, 0x2c, 0x90, 0x7f, 0x15, 0xc6, 0x32, 0xc7, 0x18, 0x8e, 0x82, - 0x3d, 0xf1, 0x47, 0x02, 0xf1, 0x9f, 0x0c, 0x38, 0xb1, 0x69, 0xef, 0xd0, 0xfe, 0xb6, 0x77, 0xcb, - 0xee, 0x8f, 0x68, 0x40, 0x68, 0x30, 0xf4, 0xdc, 0x80, 0xa2, 0x35, 0x28, 0xf4, 0xf9, 0x42, 0x50, - 0x37, 0x56, 0x72, 0x67, 0x2b, 0x17, 0xcf, 0xad, 0x46, 0x57, 0x9e, 0xba, 0x41, 0x42, 0x83, 0x17, - 0x5c, 0xe6, 0x8f, 0x89, 0xda, 0xda, 0xb8, 0x05, 0x15, 0x0d, 0x8c, 0x96, 0x20, 0xb7, 0x4f, 0xc7, - 0x75, 0x63, 0xc5, 0x38, 0x5b, 0x26, 0x7c, 0x88, 0x2e, 0x40, 0xfe, 0x6d, 0x4e, 0xa6, 0x9e, 0x5d, - 0x31, 0xce, 0x56, 0x2e, 0x9e, 0x8e, 0x0f, 0x79, 0xcd, 0x75, 0x6e, 0x8f, 0xa8, 0xd8, 0xad, 0x0e, - 0x92, 0x98, 0x97, 0xb3, 0x97, 0x0c, 0x7c, 0x0e, 0x8e, 0x1f, 0x59, 0x47, 0x27, 0xa1, 0x20, 0x30, - 0xe4, 0x8d, 0xcb, 0x44, 0xcd, 0x70, 0x0d, 0xd0, 0x16, 0xf3, 0xa9, 0x3d, 0x20, 0x36, 0xe3, 0xf7, - 0xbd, 0x3d, 0xa2, 0x01, 0xc3, 0x2f, 0xc3, 0x72, 0x02, 0xaa, 0xd8, 0x7e, 0x1a, 0x2a, 0x41, 0x0c, - 0x56, 0xbc, 0xd7, 0xe2, 0x6b, 0xc5, 0x7b, 0x88, 0x8e, 0x88, 0x7f, 0x69, 0x00, 0xc4, 0x6b, 0xa8, - 0x09, 0x20, 0x57, 0x5f, 0xb4, 0x83, 0x3d, 0xc1, 0xb0, 0x49, 0x34, 0x08, 0x3a, 0x0f, 0xc7, 0xe3, - 0xd9, 0x0d, 0x6f, 0x6b, 0xcf, 0xf6, 0xbb, 0x42, 0x06, 0x26, 0x39, 0xba, 0x80, 0x10, 0x98, 0xbe, - 0xcd, 0x68, 0x3d, 0xb7, 0x62, 0x9c, 0xcd, 0x11, 0x31, 0xe6, 0xdc, 0x32, 0xea, 0xda, 0x2e, 0xab, - 0x9b, 0x42, 0x9c, 0x6a, 0xc6, 0xe1, 0x5c, 0xbf, 0x34, 0xa8, 0xe7, 0x57, 0x8c, 0xb3, 0x0b, 0x44, - 0xcd, 0xf0, 0x7b, 0x39, 0xa8, 0xbe, 0x3a, 0xa2, 0xfe, 0x58, 0x09, 0x00, 0x35, 0xa1, 0x14, 0xd0, - 0x3e, 0xed, 0x30, 0xcf, 0x97, 0x1a, 0x69, 0x67, 0xeb, 0x06, 0x89, 0x60, 0xa8, 0x06, 0xf9, 0xbe, - 0x33, 0x70, 0x98, 0xb8, 0xd6, 0x02, 0x91, 0x13, 0x74, 0x19, 0xf2, 0x01, 0xb3, 0x7d, 0x26, 0xee, - 0x52, 0xb9, 0xd8, 0x58, 0x95, 0x86, 0xb9, 0x1a, 0x1a, 0xe6, 0xea, 0x76, 0x68, 0x98, 0xed, 0xd2, - 0xfb, 0x13, 0x2b, 0xf3, 0xee, 0x3f, 0x2d, 0x83, 0xc8, 0x2d, 0xe8, 0x69, 0xc8, 0x51, 0xb7, 0x2b, - 0xee, 0xfb, 0x59, 0x77, 0xf2, 0x0d, 0xe8, 0x02, 0x94, 0xbb, 0x8e, 0x4f, 0x3b, 0xcc, 0xf1, 0x5c, - 0xc1, 0xd5, 0xe2, 0xc5, 0xe5, 0x58, 0x23, 0xeb, 0xe1, 0x12, 0x89, 0xb1, 0xd0, 0x79, 0x28, 0x04, - 0x5c, 0x74, 0x41, 0xbd, 0xc8, 0x6d, 0xa1, 0x5d, 0x3b, 0x9c, 0x58, 0x4b, 0x12, 0x72, 0xde, 0x1b, - 0x38, 0x8c, 0x0e, 0x86, 0x6c, 0x4c, 0x14, 0x0e, 0x7a, 0x0c, 0x8a, 0x5d, 0xda, 0xa7, 0x5c, 0xe1, - 0x25, 0xa1, 0xf0, 0x25, 0x8d, 0xbc, 0x58, 0x20, 0x21, 0x02, 0x7a, 0x13, 0xcc, 0x61, 0xdf, 0x76, - 0xeb, 0x65, 0xc1, 0xc5, 0x62, 0x8c, 0x78, 0xb3, 0x6f, 0xbb, 0xed, 0x67, 0x3e, 0x9a, 0x58, 0x4f, - 0xf5, 0x1c, 0xb6, 0x37, 0xda, 0x59, 0xed, 0x78, 0x83, 0x56, 0xcf, 0xb7, 0x77, 0x6d, 0xd7, 0x6e, - 0xf5, 0xbd, 0x7d, 0xa7, 0xf5, 0xf6, 0x93, 0x2d, 0xfe, 0x06, 0x6f, 0x8f, 0xa8, 0xef, 0x50, 0xbf, - 0xc5, 0xc9, 0xac, 0x0a, 0x95, 0xf0, 0xad, 0x44, 0x90, 0xbd, 0x6e, 0x96, 0x0a, 0x4b, 0x45, 0x7c, - 0x37, 0x0b, 0x68, 0xcb, 0x1e, 0x0c, 0xfb, 0x74, 0x2e, 0x95, 0x45, 0xca, 0xc9, 0xde, 0xb7, 0x72, - 0x72, 0xf3, 0x2a, 0x27, 0x96, 0xb4, 0x39, 0x9f, 0xa4, 0xf3, 0x9f, 0x55, 0xd2, 0x85, 0x2f, 0x44, - 0xd2, 0xb8, 0x0e, 0x26, 0x9f, 0x71, 0xa7, 0xe4, 0xdb, 0x77, 0x84, 0x3c, 0xab, 0x84, 0x0f, 0xf1, - 0x26, 0x14, 0xe4, 0x5d, 0x50, 0x23, 0x2d, 0xf0, 0xe4, 0xfb, 0x88, 0x85, 0x9d, 0x0b, 0xc5, 0xb8, - 0x14, 0x8b, 0x31, 0x27, 0x04, 0x84, 0xff, 0x6c, 0xc0, 0x82, 0xd2, 0xa2, 0xf2, 0x31, 0x3b, 0x50, - 0x94, 0x6f, 0x3c, 0xf4, 0x2f, 0xa7, 0xd2, 0xfe, 0xe5, 0x4a, 0xd7, 0x1e, 0x32, 0xea, 0xb7, 0x5b, - 0xef, 0x4f, 0x2c, 0xe3, 0xa3, 0x89, 0xf5, 0xe8, 0x2c, 0x46, 0x43, 0x9f, 0x1e, 0xfa, 0xa5, 0x90, - 0x30, 0x3a, 0x27, 0x6e, 0xc7, 0x02, 0x65, 0x0a, 0xc7, 0x56, 0x65, 0x28, 0xd8, 0x70, 0x7b, 0x34, - 0xe0, 0x94, 0x4d, 0xae, 0x45, 0x22, 0x71, 0x38, 0x9b, 0x77, 0x6c, 0xdf, 0x75, 0xdc, 0x5e, 0x50, - 0xcf, 0x09, 0xdf, 0x19, 0xcd, 0xf1, 0xcf, 0x0d, 0x58, 0x4e, 0x98, 0xa2, 0x62, 0xe2, 0x12, 0x14, - 0x02, 0x2e, 0xdd, 0x90, 0x07, 0x4d, 0x91, 0x5b, 0x02, 0xde, 0x5e, 0x54, 0x97, 0x2f, 0xc8, 0x39, - 0x51, 0xf8, 0x0f, 0xee, 0x6a, 0x7f, 0x33, 0xa0, 0x2a, 0x02, 0x40, 0xf8, 0x3e, 0x10, 0x98, 0xae, - 0x3d, 0xa0, 0x4a, 0x55, 0x62, 0xac, 0x45, 0x05, 0x7e, 0x5c, 0x29, 0x8c, 0x0a, 0xf3, 0x3a, 0x32, - 0xe3, 0xbe, 0x1d, 0x99, 0x11, 0xbf, 0x95, 0x1a, 0xe4, 0xb9, 0x49, 0x8e, 0x85, 0x13, 0x2b, 0x13, - 0x39, 0xc1, 0x8f, 0xc2, 0x82, 0xe2, 0x42, 0x89, 0x76, 0x56, 0x20, 0x1b, 0x40, 0x41, 0x6a, 0x02, - 0x7d, 0x0d, 0xca, 0x51, 0x02, 0x20, 0xb8, 0xcd, 0xb5, 0x0b, 0x87, 0x13, 0x2b, 0xcb, 0x02, 0x12, - 0x2f, 0x20, 0x4b, 0x0f, 0xae, 0x46, 0xbb, 0x7c, 0x38, 0xb1, 0x24, 0x40, 0x85, 0x52, 0x74, 0x06, - 0xcc, 0x3d, 0x1e, 0x9f, 0xb8, 0x08, 0xcc, 0x76, 0xe9, 0x70, 0x62, 0x89, 0x39, 0x11, 0x7f, 0xf1, - 0x35, 0xa8, 0x6e, 0xd2, 0x9e, 0xdd, 0x19, 0xab, 0x43, 0x6b, 0x21, 0x39, 0x7e, 0xa0, 0x11, 0xd2, - 0x78, 0x18, 0xaa, 0xd1, 0x89, 0x6f, 0x0d, 0x02, 0xf5, 0x1a, 0x2a, 0x11, 0xec, 0xe5, 0x00, 0xff, - 0xc2, 0x00, 0x65, 0x03, 0x08, 0x6b, 0x59, 0x05, 0xf7, 0x5f, 0x70, 0x38, 0xb1, 0x14, 0x24, 0x4c, - 0x1a, 0xd0, 0xb3, 0x50, 0x0c, 0xc4, 0x89, 0x9c, 0x58, 0xda, 0xb4, 0xc4, 0x42, 0xfb, 0x18, 0x37, - 0x91, 0xc3, 0x89, 0x15, 0x22, 0x92, 0x70, 0x80, 0x56, 0x13, 0x81, 0x57, 0x32, 0xb6, 0x78, 0x38, - 0xb1, 0x34, 0xa8, 0x1e, 0x88, 0xf1, 0xa7, 0x06, 0x54, 0xb6, 0x6d, 0x27, 0x32, 0xa1, 0x7a, 0xa8, - 0xa2, 0xd8, 0xbf, 0x4a, 0x00, 0xb7, 0xc4, 0x2e, 0xed, 0xdb, 0xe3, 0xab, 0x9e, 0x2f, 0xe8, 0x2e, - 0x90, 0x68, 0x1e, 0xc7, 0x4a, 0x73, 0x6a, 0xac, 0xcc, 0xcf, 0xef, 0x8e, 0xbf, 0x58, 0xe7, 0x77, - 0xdd, 0x2c, 0x65, 0x97, 0x72, 0xf8, 0x0f, 0x06, 0x54, 0x25, 0xf3, 0xca, 0xf2, 0x7e, 0x00, 0x05, - 0x29, 0x1b, 0xc1, 0xfe, 0xff, 0x70, 0x4c, 0xe7, 0xe6, 0x71, 0x4a, 0x8a, 0x26, 0x7a, 0x1e, 0x16, - 0xbb, 0xbe, 0x37, 0x1c, 0xd2, 0xee, 0x96, 0x72, 0x7f, 0xd9, 0xb4, 0xfb, 0x5b, 0xd7, 0xd7, 0x49, - 0x0a, 0x1d, 0xff, 0xdd, 0x80, 0x05, 0xe5, 0x4c, 0x94, 0xba, 0x22, 0x11, 0x1b, 0xf7, 0x1d, 0xf1, - 0xb2, 0xf3, 0x46, 0xbc, 0x93, 0x50, 0xe8, 0xf9, 0xde, 0x68, 0x18, 0x3a, 0x24, 0x35, 0x9b, 0x2f, - 0x12, 0xe2, 0xeb, 0xb0, 0x18, 0xb2, 0x32, 0xc3, 0xa3, 0x36, 0xd2, 0x1e, 0x75, 0xa3, 0x4b, 0x5d, - 0xe6, 0xec, 0x3a, 0x91, 0x8f, 0x54, 0xf8, 0xf8, 0x27, 0x06, 0x2c, 0xa5, 0x51, 0xd0, 0x7a, 0x2a, - 0x81, 0x7f, 0x64, 0x36, 0x39, 0x3d, 0x77, 0x0f, 0x49, 0xab, 0x0c, 0xfe, 0xa9, 0x7b, 0x65, 0xf0, - 0x35, 0xdd, 0xc9, 0x94, 0x95, 0x57, 0xc0, 0x3f, 0x33, 0x60, 0x21, 0xa1, 0x4b, 0x74, 0x09, 0xcc, - 0x5d, 0xdf, 0x1b, 0xcc, 0xa5, 0x28, 0xb1, 0x03, 0x7d, 0x13, 0xb2, 0xcc, 0x9b, 0x4b, 0x4d, 0x59, - 0xe6, 0x71, 0x2d, 0x29, 0xf6, 0x73, 0x32, 0x3f, 0x96, 0x33, 0xfc, 0x14, 0x94, 0x05, 0x43, 0x37, - 0x6d, 0xc7, 0x9f, 0x1a, 0x30, 0xa6, 0x33, 0xf4, 0x2c, 0x1c, 0x93, 0xce, 0x70, 0xfa, 0xe6, 0xea, - 0xb4, 0xcd, 0xd5, 0x70, 0xf3, 0x69, 0xc8, 0xaf, 0xed, 0x8d, 0xdc, 0x7d, 0xbe, 0xa5, 0x6b, 0x33, - 0x3b, 0xdc, 0xc2, 0xc7, 0xf8, 0x04, 0x2c, 0xf3, 0x37, 0x48, 0xfd, 0x60, 0xcd, 0x1b, 0xb9, 0x2c, - 0xac, 0x4f, 0xce, 0x43, 0x2d, 0x09, 0x56, 0x56, 0x52, 0x83, 0x7c, 0x87, 0x03, 0x04, 0x8d, 0x05, - 0x22, 0x27, 0xf8, 0x37, 0x06, 0xa0, 0x6b, 0x94, 0x89, 0x53, 0x36, 0xd6, 0xa3, 0xe7, 0xd1, 0x80, - 0xd2, 0xc0, 0x66, 0x9d, 0x3d, 0xea, 0x07, 0x61, 0xfe, 0x12, 0xce, 0xbf, 0x8c, 0x64, 0x11, 0x5f, - 0x80, 0xe5, 0xc4, 0x2d, 0x15, 0x4f, 0x0d, 0x28, 0x75, 0x14, 0x4c, 0x85, 0xbc, 0x68, 0x8e, 0xff, - 0x98, 0x85, 0x92, 0xd8, 0x40, 0xe8, 0x2e, 0xba, 0x00, 0x95, 0x5d, 0xc7, 0xed, 0x51, 0x7f, 0xe8, - 0x3b, 0x4a, 0x04, 0x66, 0xfb, 0xd8, 0xe1, 0xc4, 0xd2, 0xc1, 0x44, 0x9f, 0xa0, 0xc7, 0xa1, 0x38, - 0x0a, 0xa8, 0xff, 0x96, 0x23, 0x5f, 0x7a, 0xb9, 0x5d, 0x3b, 0x98, 0x58, 0x85, 0xd7, 0x02, 0xea, - 0x6f, 0xac, 0xf3, 0xe0, 0x33, 0x12, 0x23, 0x22, 0x7f, 0xbb, 0xe8, 0x25, 0x65, 0xa6, 0x22, 0x81, - 0x6b, 0x7f, 0x8b, 0x5f, 0x3f, 0xe5, 0xea, 0x86, 0xbe, 0x37, 0xa0, 0x6c, 0x8f, 0x8e, 0x82, 0x56, - 0xc7, 0x1b, 0x0c, 0x3c, 0xb7, 0x25, 0x2a, 0x6e, 0xc1, 0x34, 0x8f, 0xa0, 0x7c, 0xbb, 0xb2, 0xdc, - 0x6d, 0x28, 0xb2, 0x3d, 0xdf, 0x1b, 0xf5, 0xf6, 0x44, 0x60, 0xc8, 0xb5, 0x2f, 0xcf, 0x4f, 0x2f, - 0xa4, 0x40, 0xc2, 0x01, 0x7a, 0x98, 0x4b, 0x8b, 0x76, 0xf6, 0x83, 0xd1, 0x40, 0xd6, 0x78, 0xed, - 0xfc, 0xe1, 0xc4, 0x32, 0x1e, 0x27, 0x11, 0x18, 0xff, 0x38, 0x0b, 0x96, 0x56, 0x1a, 0x5f, 0xf5, - 0xfc, 0x97, 0x29, 0xf3, 0x9d, 0xce, 0x0d, 0x7b, 0x40, 0x43, 0xdb, 0xb0, 0xa0, 0x32, 0x10, 0xc0, - 0xb7, 0xb4, 0x27, 0x00, 0x83, 0x08, 0x0f, 0x3d, 0x04, 0x20, 0xde, 0x8c, 0x5c, 0x97, 0xaf, 0xa1, - 0x2c, 0x20, 0x62, 0x79, 0x2d, 0x21, 0xa9, 0xd6, 0x9c, 0x9c, 0x29, 0x09, 0x6d, 0xa4, 0x25, 0x34, - 0x37, 0x9d, 0x48, 0x2c, 0xba, 0xad, 0xe7, 0x93, 0xb6, 0x8e, 0xff, 0x61, 0x40, 0x73, 0x33, 0xbc, - 0xf9, 0x7d, 0x8a, 0x23, 0xe4, 0x37, 0xfb, 0x80, 0xf8, 0xcd, 0x7d, 0x3e, 0x7e, 0x71, 0x13, 0x60, - 0xd3, 0x71, 0xe9, 0x55, 0xa7, 0xcf, 0xa8, 0x3f, 0xa5, 0x8a, 0xf9, 0x69, 0x2e, 0x76, 0x09, 0x84, - 0xee, 0x86, 0x7c, 0xae, 0x69, 0x7e, 0xf8, 0x41, 0xb0, 0x91, 0x7d, 0x80, 0x6a, 0xcb, 0xa5, 0x5c, - 0x94, 0x0b, 0xc5, 0x5d, 0xc1, 0x9e, 0x0c, 0xa9, 0x89, 0x46, 0x4c, 0xcc, 0x7b, 0xfb, 0x3b, 0xea, - 0xf0, 0xa7, 0xef, 0x91, 0x11, 0x89, 0xf6, 0x58, 0x2b, 0x18, 0xbb, 0xcc, 0x7e, 0x47, 0xdb, 0x4f, - 0xc2, 0x43, 0x90, 0xad, 0x92, 0xae, 0xfc, 0xd4, 0xa4, 0xeb, 0x39, 0x75, 0xcc, 0xe7, 0xaa, 0x3a, - 0x9f, 0x8b, 0x3d, 0xa0, 0x50, 0x8a, 0xf2, 0x80, 0x8f, 0x80, 0xe9, 0xd3, 0xdd, 0x30, 0x54, 0xa3, - 0xf8, 0xe4, 0x08, 0x53, 0xac, 0xe3, 0xbf, 0x18, 0xb0, 0x74, 0x8d, 0xb2, 0x64, 0x12, 0xf4, 0x15, - 0x52, 0x29, 0x7e, 0x11, 0x8e, 0x6b, 0xf7, 0x57, 0xdc, 0x3f, 0x99, 0xca, 0x7c, 0x4e, 0xc4, 0xfc, - 0x6f, 0xb8, 0x5d, 0xfa, 0x8e, 0x2a, 0x28, 0x93, 0x49, 0xcf, 0x4d, 0xa8, 0x68, 0x8b, 0xe8, 0x4a, - 0x2a, 0xdd, 0x59, 0x4e, 0xf5, 0x2b, 0x79, 0xc8, 0x6e, 0xd7, 0x14, 0x4f, 0xb2, 0x6c, 0x54, 0xc9, - 0x6c, 0x94, 0x1a, 0x6c, 0x01, 0x12, 0xea, 0x12, 0x64, 0xf5, 0xe0, 0x24, 0xa0, 0x2f, 0x45, 0x79, - 0x4f, 0x34, 0x47, 0x0f, 0x83, 0xe9, 0x7b, 0x77, 0xc2, 0x3c, 0x76, 0x21, 0x3e, 0x92, 0x78, 0x77, - 0x88, 0x58, 0xc2, 0xcf, 0x42, 0x8e, 0x78, 0x77, 0x50, 0x13, 0xc0, 0xb7, 0xdd, 0x1e, 0xbd, 0x15, - 0x55, 0x50, 0x55, 0xa2, 0x41, 0x66, 0x24, 0x0e, 0x6b, 0x70, 0x5c, 0xbf, 0x91, 0x54, 0xf7, 0x2a, - 0x14, 0x5f, 0x1d, 0xe9, 0xe2, 0xaa, 0xa5, 0xc4, 0x25, 0x0b, 0xf5, 0x10, 0x89, 0xdb, 0x0c, 0xc4, - 0x70, 0x74, 0x06, 0xca, 0xcc, 0xde, 0xe9, 0xd3, 0x1b, 0xb1, 0x9b, 0x8b, 0x01, 0x7c, 0x95, 0x17, - 0x7f, 0xb7, 0xb4, 0x0c, 0x28, 0x06, 0xa0, 0xc7, 0x60, 0x29, 0xbe, 0xf3, 0x4d, 0x9f, 0xee, 0x3a, - 0xef, 0x08, 0x0d, 0x57, 0xc9, 0x11, 0x38, 0x3a, 0x0b, 0xc7, 0x62, 0xd8, 0x96, 0xc8, 0x34, 0x4c, - 0x81, 0x9a, 0x06, 0x73, 0xd9, 0x08, 0x76, 0x5f, 0xb8, 0x3d, 0xb2, 0xfb, 0xe2, 0xf1, 0x55, 0x89, - 0x06, 0xc1, 0x7f, 0x35, 0xe0, 0xb8, 0x54, 0x35, 0xb3, 0xd9, 0x57, 0xd2, 0xea, 0x7f, 0x6b, 0x00, - 0xd2, 0x39, 0x50, 0xa6, 0xf5, 0x75, 0xbd, 0x11, 0xc4, 0x53, 0x99, 0x8a, 0xa8, 0x69, 0x25, 0x28, - 0xee, 0xe5, 0x60, 0x28, 0x88, 0x74, 0x48, 0x16, 0xd7, 0xa6, 0x2c, 0x9a, 0x25, 0x84, 0xa8, 0x5f, - 0x5e, 0xeb, 0xef, 0x8c, 0x19, 0x0d, 0x54, 0xc9, 0x2b, 0x6a, 0x7d, 0x01, 0x20, 0xf2, 0x87, 0x9f, - 0x45, 0x5d, 0x26, 0xac, 0xc6, 0x8c, 0xcf, 0x52, 0x20, 0x12, 0x0e, 0xf0, 0xef, 0xb3, 0xb0, 0x70, - 0xcb, 0xeb, 0x8f, 0xe2, 0xc0, 0xf8, 0x55, 0x0a, 0x18, 0x89, 0x3a, 0x3c, 0x1f, 0xd6, 0xe1, 0x08, - 0xcc, 0x80, 0xd1, 0xa1, 0xb0, 0xac, 0x1c, 0x11, 0x63, 0x84, 0xa1, 0xca, 0x6c, 0xbf, 0x47, 0x99, - 0xac, 0x6e, 0xea, 0x05, 0x91, 0x76, 0x26, 0x60, 0x68, 0x05, 0x2a, 0x76, 0xaf, 0xe7, 0xd3, 0x9e, - 0xcd, 0x68, 0x7b, 0x5c, 0x2f, 0x8a, 0xc3, 0x74, 0x10, 0x7e, 0x03, 0x16, 0x43, 0x61, 0x29, 0x95, - 0x3e, 0x01, 0xc5, 0xb7, 0x05, 0x64, 0x4a, 0x5f, 0x4c, 0xa2, 0x2a, 0x37, 0x16, 0xa2, 0x25, 0xfb, - 0xec, 0xe1, 0x9d, 0xf1, 0x75, 0x28, 0x48, 0x74, 0x74, 0x46, 0xaf, 0x51, 0x64, 0x93, 0x86, 0xcf, - 0x55, 0xc1, 0x81, 0xa1, 0x20, 0x09, 0x29, 0xc5, 0x0b, 0xdb, 0x90, 0x10, 0xa2, 0x7e, 0xf1, 0x7f, - 0x0c, 0x38, 0xb1, 0x4e, 0x19, 0xed, 0x30, 0xda, 0xbd, 0xea, 0xd0, 0x7e, 0xf7, 0x4b, 0x2d, 0x9f, - 0xa3, 0x26, 0x58, 0x4e, 0x6b, 0x82, 0x71, 0xbf, 0xd3, 0x77, 0x5c, 0xba, 0xa9, 0x75, 0x51, 0x62, - 0x00, 0xf7, 0x10, 0xbb, 0xfc, 0xe2, 0x72, 0x59, 0x7e, 0xd8, 0xd0, 0x20, 0x91, 0x86, 0x0b, 0xb1, - 0x86, 0xf1, 0x8f, 0x0c, 0x38, 0x99, 0xe6, 0x5a, 0x29, 0xa9, 0x05, 0x05, 0xb1, 0x79, 0x4a, 0xff, - 0x35, 0xb1, 0x83, 0x28, 0x34, 0x74, 0x29, 0x71, 0xbe, 0xf8, 0x20, 0xd2, 0xae, 0x1f, 0x4e, 0xac, - 0x5a, 0x0c, 0xd5, 0x4a, 0x7c, 0x0d, 0x17, 0xff, 0x8a, 0x17, 0xc2, 0x3a, 0x4d, 0xa1, 0x6f, 0x6e, - 0x5f, 0xca, 0xf7, 0xca, 0x09, 0xfa, 0x06, 0x98, 0x6c, 0x3c, 0x54, 0x2e, 0xb7, 0x7d, 0xe2, 0xd3, - 0x89, 0x75, 0x3c, 0xb1, 0x6d, 0x7b, 0x3c, 0xa4, 0x44, 0xa0, 0x70, 0xb3, 0xec, 0xd8, 0x7e, 0xd7, - 0x71, 0xed, 0xbe, 0xc3, 0xa4, 0x18, 0x4d, 0xa2, 0x83, 0x44, 0x27, 0x62, 0x9f, 0xb2, 0x8e, 0x4c, - 0xaa, 0xab, 0xaa, 0x13, 0x21, 0x20, 0x89, 0x4e, 0x84, 0x80, 0xe0, 0x5f, 0x6b, 0xe6, 0x21, 0x2d, - 0xff, 0xff, 0xce, 0x3c, 0xf0, 0xf7, 0x62, 0x5d, 0x86, 0x57, 0x54, 0xba, 0x7c, 0x1e, 0x16, 0xbb, - 0x89, 0x95, 0xd9, 0x3a, 0x95, 0x5d, 0xd6, 0x14, 0x3a, 0xbe, 0x16, 0x2b, 0x48, 0x40, 0x66, 0x28, - 0x28, 0x25, 0xf5, 0xec, 0x11, 0xa9, 0x3f, 0xf6, 0x08, 0x94, 0xa3, 0x6f, 0x51, 0xa8, 0x02, 0xc5, - 0xab, 0xaf, 0x90, 0xd7, 0xaf, 0x90, 0xf5, 0xa5, 0x0c, 0xaa, 0x42, 0xa9, 0x7d, 0x65, 0xed, 0x25, - 0x31, 0x33, 0x2e, 0xbe, 0x57, 0x08, 0x03, 0xb8, 0x8f, 0xbe, 0x0d, 0x79, 0x19, 0x95, 0x4f, 0xc6, - 0xd7, 0xd5, 0x3f, 0xf9, 0x34, 0x4e, 0x1d, 0x81, 0x4b, 0xbe, 0x71, 0xe6, 0x09, 0x03, 0xdd, 0x80, - 0x8a, 0x00, 0xaa, 0x06, 0xed, 0x99, 0x74, 0x9f, 0x34, 0x41, 0xe9, 0xa1, 0x19, 0xab, 0x1a, 0xbd, - 0xcb, 0x90, 0x97, 0x22, 0x38, 0x99, 0x4a, 0x9e, 0xa6, 0xdc, 0x26, 0xd1, 0xb2, 0xc6, 0x19, 0xf4, - 0x0c, 0x98, 0xdb, 0xb6, 0xd3, 0x47, 0x5a, 0xee, 0xa6, 0xf5, 0x55, 0x1b, 0x27, 0xd3, 0x60, 0xed, - 0xd8, 0xe7, 0xa2, 0xf6, 0xf0, 0xa9, 0x74, 0x8f, 0x2a, 0xdc, 0x5e, 0x3f, 0xba, 0x10, 0x9d, 0xfc, - 0x8a, 0x6c, 0x62, 0x86, 0x9d, 0x12, 0xf4, 0x50, 0xf2, 0xa8, 0x54, 0x63, 0xa5, 0xd1, 0x9c, 0xb5, - 0x1c, 0x11, 0xdc, 0x84, 0x8a, 0xd6, 0xa5, 0xd0, 0xc5, 0x7a, 0xb4, 0xc5, 0xa2, 0x8b, 0x75, 0x4a, - 0x6b, 0x03, 0x67, 0xd0, 0x35, 0x28, 0xf1, 0x8c, 0x57, 0x7c, 0xcd, 0x38, 0x9d, 0x4e, 0x6c, 0xb5, - 0x84, 0xa6, 0x71, 0x66, 0xfa, 0x62, 0x44, 0xe8, 0xbb, 0x50, 0xbe, 0x46, 0x99, 0x8a, 0x0a, 0xa7, - 0xd2, 0x61, 0x65, 0x8a, 0xa4, 0x92, 0xa1, 0x09, 0x67, 0xd0, 0x1b, 0x22, 0xf9, 0x4e, 0x3a, 0x45, - 0x64, 0xcd, 0x70, 0x7e, 0xd1, 0xbd, 0x56, 0x66, 0x23, 0x44, 0x94, 0x5f, 0x4f, 0x50, 0x56, 0xf1, - 0xd3, 0x9a, 0xf1, 0x04, 0x23, 0xca, 0xd6, 0x3d, 0xfe, 0xa7, 0x00, 0x67, 0x2e, 0xbe, 0x19, 0x7e, - 0x56, 0x5f, 0xb7, 0x99, 0x8d, 0x5e, 0x81, 0x45, 0x21, 0xcb, 0xe8, 0xbb, 0x7b, 0xc2, 0xe6, 0x8f, - 0x7c, 0xe4, 0x4f, 0xd8, 0xfc, 0xd1, 0x8f, 0xfd, 0x38, 0xd3, 0x7e, 0xf3, 0x83, 0xbb, 0xcd, 0xcc, - 0x87, 0x77, 0x9b, 0x99, 0x4f, 0xee, 0x36, 0x8d, 0x1f, 0x1e, 0x34, 0x8d, 0xdf, 0x1d, 0x34, 0x8d, - 0xf7, 0x0f, 0x9a, 0xc6, 0x07, 0x07, 0x4d, 0xe3, 0x5f, 0x07, 0x4d, 0xe3, 0xdf, 0x07, 0xcd, 0xcc, - 0x27, 0x07, 0x4d, 0xe3, 0xdd, 0x8f, 0x9b, 0x99, 0x0f, 0x3e, 0x6e, 0x66, 0x3e, 0xfc, 0xb8, 0x99, - 0xf9, 0xfe, 0xa3, 0xf7, 0x2e, 0x34, 0xa5, 0xa3, 0x2b, 0x88, 0x9f, 0x27, 0xff, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0x64, 0x2a, 0x49, 0xe1, 0xfc, 0x21, 0x00, 0x00, + // 2609 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x6c, 0x1b, 0xc7, + 0xd5, 0x5c, 0x72, 0xf9, 0xf7, 0x48, 0xc9, 0xf2, 0x88, 0xb6, 0x09, 0xda, 0xe1, 0x2a, 0x83, 0xef, + 0x4b, 0xdc, 0xd8, 0x11, 0x63, 0xa7, 0x49, 0x1d, 0xa7, 0x69, 0x6a, 0x4a, 0xb1, 0x23, 0x47, 0x71, + 0x9c, 0x91, 0xe2, 0xa4, 0x45, 0x83, 0x60, 0x45, 0x8e, 0xa8, 0x85, 0xc8, 0x5d, 0x7a, 0x77, 0x18, + 0x87, 0xb7, 0x02, 0x3d, 0x17, 0x0d, 0xd0, 0x43, 0xdb, 0x4b, 0xd1, 0x02, 0x05, 0x5a, 0xa4, 0xe8, + 0xa5, 0xe8, 0xb1, 0x68, 0x2f, 0x3d, 0xa4, 0xb7, 0xf4, 0x16, 0xe4, 0xc0, 0xd6, 0xca, 0xa5, 0xd0, + 0x29, 0x40, 0x6f, 0x39, 0x15, 0xf3, 0xb3, 0xbb, 0xb3, 0x2b, 0x32, 0x0e, 0x1d, 0x07, 0x69, 0x2e, + 0xe2, 0xcc, 0x9b, 0x37, 0x6f, 0xe6, 0xfd, 0xcc, 0xfb, 0x5b, 0xc1, 0xe9, 0xe1, 0x7e, 0xaf, 0xd5, + 0xf7, 0x7a, 0x43, 0xdf, 0x63, 0x5e, 0x34, 0x58, 0x15, 0x7f, 0x51, 0x29, 0x9c, 0x37, 0x6a, 0x3d, + 0xaf, 0xe7, 0x49, 0x1c, 0x3e, 0x92, 0xeb, 0x0d, 0xab, 0xe7, 0x79, 0xbd, 0x3e, 0x6d, 0x89, 0xd9, + 0xce, 0x68, 0xb7, 0xc5, 0x9c, 0x01, 0x0d, 0x98, 0x3d, 0x18, 0x2a, 0x84, 0x15, 0x45, 0xfd, 0x76, + 0x7f, 0xe0, 0x75, 0x69, 0xbf, 0x15, 0x30, 0x9b, 0x05, 0xf2, 0xaf, 0xc2, 0x58, 0xe6, 0x18, 0xc3, + 0x51, 0xb0, 0x27, 0xfe, 0x48, 0x20, 0xfe, 0x93, 0x01, 0x27, 0x36, 0xed, 0x1d, 0xda, 0xdf, 0xf6, + 0x6e, 0xd9, 0xfd, 0x11, 0x0d, 0x08, 0x0d, 0x86, 0x9e, 0x1b, 0x50, 0xb4, 0x06, 0x85, 0x3e, 0x5f, + 0x08, 0xea, 0xc6, 0x4a, 0xee, 0x6c, 0xe5, 0xe2, 0xb9, 0xd5, 0xe8, 0xca, 0x53, 0x37, 0x48, 0x68, + 0xf0, 0x82, 0xcb, 0xfc, 0x31, 0x51, 0x5b, 0x1b, 0xb7, 0xa0, 0xa2, 0x81, 0xd1, 0x12, 0xe4, 0xf6, + 0xe9, 0xb8, 0x6e, 0xac, 0x18, 0x67, 0xcb, 0x84, 0x0f, 0xd1, 0x05, 0xc8, 0xbf, 0xcd, 0xc9, 0xd4, + 0xb3, 0x2b, 0xc6, 0xd9, 0xca, 0xc5, 0xd3, 0xf1, 0x21, 0xaf, 0xb9, 0xce, 0xed, 0x11, 0x15, 0xbb, + 0xd5, 0x41, 0x12, 0xf3, 0x72, 0xf6, 0x92, 0x81, 0xcf, 0xc1, 0xf1, 0x23, 0xeb, 0xe8, 0x24, 0x14, + 0x04, 0x86, 0xbc, 0x71, 0x99, 0xa8, 0x19, 0xae, 0x01, 0xda, 0x62, 0x3e, 0xb5, 0x07, 0xc4, 0x66, + 0xfc, 0xbe, 0xb7, 0x47, 0x34, 0x60, 0xf8, 0x65, 0x58, 0x4e, 0x40, 0x15, 0xdb, 0x4f, 0x43, 0x25, + 0x88, 0xc1, 0x8a, 0xf7, 0x5a, 0x7c, 0xad, 0x78, 0x0f, 0xd1, 0x11, 0xf1, 0x2f, 0x0d, 0x80, 0x78, + 0x0d, 0x35, 0x01, 0xe4, 0xea, 0x8b, 0x76, 0xb0, 0x27, 0x18, 0x36, 0x89, 0x06, 0x41, 0xe7, 0xe1, + 0x78, 0x3c, 0xbb, 0xe1, 0x6d, 0xed, 0xd9, 0x7e, 0x57, 0xc8, 0xc0, 0x24, 0x47, 0x17, 0x10, 0x02, + 0xd3, 0xb7, 0x19, 0xad, 0xe7, 0x56, 0x8c, 0xb3, 0x39, 0x22, 0xc6, 0x9c, 0x5b, 0x46, 0x5d, 0xdb, + 0x65, 0x75, 0x53, 0x88, 0x53, 0xcd, 0x38, 0x9c, 0xeb, 0x97, 0x06, 0xf5, 0xfc, 0x8a, 0x71, 0x76, + 0x81, 0xa8, 0x19, 0x7e, 0x2f, 0x07, 0xd5, 0x57, 0x47, 0xd4, 0x1f, 0x2b, 0x01, 0xa0, 0x26, 0x94, + 0x02, 0xda, 0xa7, 0x1d, 0xe6, 0xf9, 0x52, 0x23, 0xed, 0x6c, 0xdd, 0x20, 0x11, 0x0c, 0xd5, 0x20, + 0xdf, 0x77, 0x06, 0x0e, 0x13, 0xd7, 0x5a, 0x20, 0x72, 0x82, 0x2e, 0x43, 0x3e, 0x60, 0xb6, 0xcf, + 0xc4, 0x5d, 0x2a, 0x17, 0x1b, 0xab, 0xd2, 0x30, 0x57, 0x43, 0xc3, 0x5c, 0xdd, 0x0e, 0x0d, 0xb3, + 0x5d, 0x7a, 0x7f, 0x62, 0x65, 0xde, 0xfd, 0xa7, 0x65, 0x10, 0xb9, 0x05, 0x3d, 0x0d, 0x39, 0xea, + 0x76, 0xc5, 0x7d, 0x3f, 0xef, 0x4e, 0xbe, 0x01, 0x5d, 0x80, 0x72, 0xd7, 0xf1, 0x69, 0x87, 0x39, + 0x9e, 0x2b, 0xb8, 0x5a, 0xbc, 0xb8, 0x1c, 0x6b, 0x64, 0x3d, 0x5c, 0x22, 0x31, 0x16, 0x3a, 0x0f, + 0x85, 0x80, 0x8b, 0x2e, 0xa8, 0x17, 0xb9, 0x2d, 0xb4, 0x6b, 0x87, 0x13, 0x6b, 0x49, 0x42, 0xce, + 0x7b, 0x03, 0x87, 0xd1, 0xc1, 0x90, 0x8d, 0x89, 0xc2, 0x41, 0x8f, 0x41, 0xb1, 0x4b, 0xfb, 0x94, + 0x2b, 0xbc, 0x24, 0x14, 0xbe, 0xa4, 0x91, 0x17, 0x0b, 0x24, 0x44, 0x40, 0x6f, 0x82, 0x39, 0xec, + 0xdb, 0x6e, 0xbd, 0x2c, 0xb8, 0x58, 0x8c, 0x11, 0x6f, 0xf6, 0x6d, 0xb7, 0xfd, 0xcc, 0x47, 0x13, + 0xeb, 0xa9, 0x9e, 0xc3, 0xf6, 0x46, 0x3b, 0xab, 0x1d, 0x6f, 0xd0, 0xea, 0xf9, 0xf6, 0xae, 0xed, + 0xda, 0xad, 0xbe, 0xb7, 0xef, 0xb4, 0xde, 0x7e, 0xb2, 0xc5, 0xdf, 0xe0, 0xed, 0x11, 0xf5, 0x1d, + 0xea, 0xb7, 0x38, 0x99, 0x55, 0xa1, 0x12, 0xbe, 0x95, 0x08, 0xb2, 0xd7, 0xcd, 0x52, 0x61, 0xa9, + 0x88, 0xef, 0x66, 0x01, 0x6d, 0xd9, 0x83, 0x61, 0x9f, 0xce, 0xa5, 0xb2, 0x48, 0x39, 0xd9, 0xfb, + 0x56, 0x4e, 0x6e, 0x5e, 0xe5, 0xc4, 0x92, 0x36, 0xe7, 0x93, 0x74, 0xfe, 0xf3, 0x4a, 0xba, 0xf0, + 0xa5, 0x48, 0x1a, 0xd7, 0xc1, 0xe4, 0x33, 0xee, 0x94, 0x7c, 0xfb, 0x8e, 0x90, 0x67, 0x95, 0xf0, + 0x21, 0xde, 0x84, 0x82, 0xbc, 0x0b, 0x6a, 0xa4, 0x05, 0x9e, 0x7c, 0x1f, 0xb1, 0xb0, 0x73, 0xa1, + 0x18, 0x97, 0x62, 0x31, 0xe6, 0x84, 0x80, 0xf0, 0x9f, 0x0d, 0x58, 0x50, 0x5a, 0x54, 0x3e, 0x66, + 0x07, 0x8a, 0xf2, 0x8d, 0x87, 0xfe, 0xe5, 0x54, 0xda, 0xbf, 0x5c, 0xe9, 0xda, 0x43, 0x46, 0xfd, + 0x76, 0xeb, 0xfd, 0x89, 0x65, 0x7c, 0x34, 0xb1, 0x1e, 0x9d, 0xc5, 0x68, 0xe8, 0xd3, 0x43, 0xbf, + 0x14, 0x12, 0x46, 0xe7, 0xc4, 0xed, 0x58, 0xa0, 0x4c, 0xe1, 0xd8, 0xaa, 0x0c, 0x05, 0x1b, 0x6e, + 0x8f, 0x06, 0x9c, 0xb2, 0xc9, 0xb5, 0x48, 0x24, 0x0e, 0x67, 0xf3, 0x8e, 0xed, 0xbb, 0x8e, 0xdb, + 0x0b, 0xea, 0x39, 0xe1, 0x3b, 0xa3, 0x39, 0xfe, 0xb9, 0x01, 0xcb, 0x09, 0x53, 0x54, 0x4c, 0x5c, + 0x82, 0x42, 0xc0, 0xa5, 0x1b, 0xf2, 0xa0, 0x29, 0x72, 0x4b, 0xc0, 0xdb, 0x8b, 0xea, 0xf2, 0x05, + 0x39, 0x27, 0x0a, 0xff, 0xc1, 0x5d, 0xed, 0x6f, 0x06, 0x54, 0x45, 0x00, 0x08, 0xdf, 0x07, 0x02, + 0xd3, 0xb5, 0x07, 0x54, 0xa9, 0x4a, 0x8c, 0xb5, 0xa8, 0xc0, 0x8f, 0x2b, 0x85, 0x51, 0x61, 0x5e, + 0x47, 0x66, 0xdc, 0xb7, 0x23, 0x33, 0xe2, 0xb7, 0x52, 0x83, 0x3c, 0x37, 0xc9, 0xb1, 0x70, 0x62, + 0x65, 0x22, 0x27, 0xf8, 0x51, 0x58, 0x50, 0x5c, 0x28, 0xd1, 0xce, 0x0a, 0x64, 0x03, 0x28, 0x48, + 0x4d, 0xa0, 0xff, 0x83, 0x72, 0x94, 0x00, 0x08, 0x6e, 0x73, 0xed, 0xc2, 0xe1, 0xc4, 0xca, 0xb2, + 0x80, 0xc4, 0x0b, 0xc8, 0xd2, 0x83, 0xab, 0xd1, 0x2e, 0x1f, 0x4e, 0x2c, 0x09, 0x50, 0xa1, 0x14, + 0x9d, 0x01, 0x73, 0x8f, 0xc7, 0x27, 0x2e, 0x02, 0xb3, 0x5d, 0x3a, 0x9c, 0x58, 0x62, 0x4e, 0xc4, + 0x5f, 0x7c, 0x0d, 0xaa, 0x9b, 0xb4, 0x67, 0x77, 0xc6, 0xea, 0xd0, 0x5a, 0x48, 0x8e, 0x1f, 0x68, + 0x84, 0x34, 0x1e, 0x86, 0x6a, 0x74, 0xe2, 0x5b, 0x83, 0x40, 0xbd, 0x86, 0x4a, 0x04, 0x7b, 0x39, + 0xc0, 0xbf, 0x30, 0x40, 0xd9, 0x00, 0xc2, 0x5a, 0x56, 0xc1, 0xfd, 0x17, 0x1c, 0x4e, 0x2c, 0x05, + 0x09, 0x93, 0x06, 0xf4, 0x2c, 0x14, 0x03, 0x71, 0x22, 0x27, 0x96, 0x36, 0x2d, 0xb1, 0xd0, 0x3e, + 0xc6, 0x4d, 0xe4, 0x70, 0x62, 0x85, 0x88, 0x24, 0x1c, 0xa0, 0xd5, 0x44, 0xe0, 0x95, 0x8c, 0x2d, + 0x1e, 0x4e, 0x2c, 0x0d, 0xaa, 0x07, 0x62, 0xfc, 0xa9, 0x01, 0x95, 0x6d, 0xdb, 0x89, 0x4c, 0xa8, + 0x1e, 0xaa, 0x28, 0xf6, 0xaf, 0x12, 0xc0, 0x2d, 0xb1, 0x4b, 0xfb, 0xf6, 0xf8, 0xaa, 0xe7, 0x0b, + 0xba, 0x0b, 0x24, 0x9a, 0xc7, 0xb1, 0xd2, 0x9c, 0x1a, 0x2b, 0xf3, 0xf3, 0xbb, 0xe3, 0x2f, 0xd7, + 0xf9, 0x5d, 0x37, 0x4b, 0xd9, 0xa5, 0x1c, 0xfe, 0x83, 0x01, 0x55, 0xc9, 0xbc, 0xb2, 0xbc, 0x1f, + 0x40, 0x41, 0xca, 0x46, 0xb0, 0xff, 0x19, 0x8e, 0xe9, 0xdc, 0x3c, 0x4e, 0x49, 0xd1, 0x44, 0xcf, + 0xc3, 0x62, 0xd7, 0xf7, 0x86, 0x43, 0xda, 0xdd, 0x52, 0xee, 0x2f, 0x9b, 0x76, 0x7f, 0xeb, 0xfa, + 0x3a, 0x49, 0xa1, 0xe3, 0xbf, 0x1b, 0xb0, 0xa0, 0x9c, 0x89, 0x52, 0x57, 0x24, 0x62, 0xe3, 0xbe, + 0x23, 0x5e, 0x76, 0xde, 0x88, 0x77, 0x12, 0x0a, 0x3d, 0xdf, 0x1b, 0x0d, 0x43, 0x87, 0xa4, 0x66, + 0xf3, 0x45, 0x42, 0x7c, 0x1d, 0x16, 0x43, 0x56, 0x66, 0x78, 0xd4, 0x46, 0xda, 0xa3, 0x6e, 0x74, + 0xa9, 0xcb, 0x9c, 0x5d, 0x27, 0xf2, 0x91, 0x0a, 0x1f, 0xff, 0xc4, 0x80, 0xa5, 0x34, 0x0a, 0x5a, + 0x4f, 0x25, 0xf0, 0x8f, 0xcc, 0x26, 0xa7, 0xe7, 0xee, 0x21, 0x69, 0x95, 0xc1, 0x3f, 0x75, 0xaf, + 0x0c, 0xbe, 0xa6, 0x3b, 0x99, 0xb2, 0xf2, 0x0a, 0xf8, 0x67, 0x06, 0x2c, 0x24, 0x74, 0x89, 0x2e, + 0x81, 0xb9, 0xeb, 0x7b, 0x83, 0xb9, 0x14, 0x25, 0x76, 0xa0, 0x6f, 0x42, 0x96, 0x79, 0x73, 0xa9, + 0x29, 0xcb, 0x3c, 0xae, 0x25, 0xc5, 0x7e, 0x4e, 0xe6, 0xc7, 0x72, 0x86, 0x9f, 0x82, 0xb2, 0x60, + 0xe8, 0xa6, 0xed, 0xf8, 0x53, 0x03, 0xc6, 0x74, 0x86, 0x9e, 0x85, 0x63, 0xd2, 0x19, 0x4e, 0xdf, + 0x5c, 0x9d, 0xb6, 0xb9, 0x1a, 0x6e, 0x3e, 0x0d, 0xf9, 0xb5, 0xbd, 0x91, 0xbb, 0xcf, 0xb7, 0x74, + 0x6d, 0x66, 0x87, 0x5b, 0xf8, 0x18, 0x9f, 0x80, 0x65, 0xfe, 0x06, 0xa9, 0x1f, 0xac, 0x79, 0x23, + 0x97, 0x85, 0xf5, 0xc9, 0x79, 0xa8, 0x25, 0xc1, 0xca, 0x4a, 0x6a, 0x90, 0xef, 0x70, 0x80, 0xa0, + 0xb1, 0x40, 0xe4, 0x04, 0xff, 0xc6, 0x00, 0x74, 0x8d, 0x32, 0x71, 0xca, 0xc6, 0x7a, 0xf4, 0x3c, + 0x1a, 0x50, 0x1a, 0xd8, 0xac, 0xb3, 0x47, 0xfd, 0x20, 0xcc, 0x5f, 0xc2, 0xf9, 0x57, 0x91, 0x2c, + 0xe2, 0x0b, 0xb0, 0x9c, 0xb8, 0xa5, 0xe2, 0xa9, 0x01, 0xa5, 0x8e, 0x82, 0xa9, 0x90, 0x17, 0xcd, + 0xf1, 0x1f, 0xb3, 0x50, 0x12, 0x1b, 0x08, 0xdd, 0x45, 0x17, 0xa0, 0xb2, 0xeb, 0xb8, 0x3d, 0xea, + 0x0f, 0x7d, 0x47, 0x89, 0xc0, 0x6c, 0x1f, 0x3b, 0x9c, 0x58, 0x3a, 0x98, 0xe8, 0x13, 0xf4, 0x38, + 0x14, 0x47, 0x01, 0xf5, 0xdf, 0x72, 0xe4, 0x4b, 0x2f, 0xb7, 0x6b, 0x07, 0x13, 0xab, 0xf0, 0x5a, + 0x40, 0xfd, 0x8d, 0x75, 0x1e, 0x7c, 0x46, 0x62, 0x44, 0xe4, 0x6f, 0x17, 0xbd, 0xa4, 0xcc, 0x54, + 0x24, 0x70, 0xed, 0x6f, 0xf1, 0xeb, 0xa7, 0x5c, 0xdd, 0xd0, 0xf7, 0x06, 0x94, 0xed, 0xd1, 0x51, + 0xd0, 0xea, 0x78, 0x83, 0x81, 0xe7, 0xb6, 0x44, 0xc5, 0x2d, 0x98, 0xe6, 0x11, 0x94, 0x6f, 0x57, + 0x96, 0xbb, 0x0d, 0x45, 0xb6, 0xe7, 0x7b, 0xa3, 0xde, 0x9e, 0x08, 0x0c, 0xb9, 0xf6, 0xe5, 0xf9, + 0xe9, 0x85, 0x14, 0x48, 0x38, 0x40, 0x0f, 0x73, 0x69, 0xd1, 0xce, 0x7e, 0x30, 0x1a, 0xc8, 0x1a, + 0xaf, 0x9d, 0x3f, 0x9c, 0x58, 0xc6, 0xe3, 0x24, 0x02, 0xe3, 0x1f, 0x67, 0xc1, 0xd2, 0x4a, 0xe3, + 0xab, 0x9e, 0xff, 0x32, 0x65, 0xbe, 0xd3, 0xb9, 0x61, 0x0f, 0x68, 0x68, 0x1b, 0x16, 0x54, 0x06, + 0x02, 0xf8, 0x96, 0xf6, 0x04, 0x60, 0x10, 0xe1, 0xa1, 0x87, 0x00, 0xc4, 0x9b, 0x91, 0xeb, 0xf2, + 0x35, 0x94, 0x05, 0x44, 0x2c, 0xaf, 0x25, 0x24, 0xd5, 0x9a, 0x93, 0x33, 0x25, 0xa1, 0x8d, 0xb4, + 0x84, 0xe6, 0xa6, 0x13, 0x89, 0x45, 0xb7, 0xf5, 0x7c, 0xd2, 0xd6, 0xf1, 0x3f, 0x0c, 0x68, 0x6e, + 0x86, 0x37, 0xbf, 0x4f, 0x71, 0x84, 0xfc, 0x66, 0x1f, 0x10, 0xbf, 0xb9, 0x2f, 0xc6, 0x2f, 0x6e, + 0x02, 0x6c, 0x3a, 0x2e, 0xbd, 0xea, 0xf4, 0x19, 0xf5, 0xa7, 0x54, 0x31, 0x3f, 0xcd, 0xc5, 0x2e, + 0x81, 0xd0, 0xdd, 0x90, 0xcf, 0x35, 0xcd, 0x0f, 0x3f, 0x08, 0x36, 0xb2, 0x0f, 0x50, 0x6d, 0xb9, + 0x94, 0x8b, 0x72, 0xa1, 0xb8, 0x2b, 0xd8, 0x93, 0x21, 0x35, 0xd1, 0x88, 0x89, 0x79, 0x6f, 0x7f, + 0x47, 0x1d, 0xfe, 0xf4, 0x3d, 0x32, 0x22, 0xd1, 0x1e, 0x6b, 0x05, 0x63, 0x97, 0xd9, 0xef, 0x68, + 0xfb, 0x49, 0x78, 0x08, 0xb2, 0x55, 0xd2, 0x95, 0x9f, 0x9a, 0x74, 0x3d, 0xa7, 0x8e, 0xf9, 0x42, + 0x55, 0xe7, 0x73, 0xb1, 0x07, 0x14, 0x4a, 0x51, 0x1e, 0xf0, 0x11, 0x30, 0x7d, 0xba, 0x1b, 0x86, + 0x6a, 0x14, 0x9f, 0x1c, 0x61, 0x8a, 0x75, 0xfc, 0x17, 0x03, 0x96, 0xae, 0x51, 0x96, 0x4c, 0x82, + 0xbe, 0x46, 0x2a, 0xc5, 0x2f, 0xc2, 0x71, 0xed, 0xfe, 0x8a, 0xfb, 0x27, 0x53, 0x99, 0xcf, 0x89, + 0x98, 0xff, 0x0d, 0xb7, 0x4b, 0xdf, 0x51, 0x05, 0x65, 0x32, 0xe9, 0xb9, 0x09, 0x15, 0x6d, 0x11, + 0x5d, 0x49, 0xa5, 0x3b, 0xcb, 0xa9, 0x7e, 0x25, 0x0f, 0xd9, 0xed, 0x9a, 0xe2, 0x49, 0x96, 0x8d, + 0x2a, 0x99, 0x8d, 0x52, 0x83, 0x2d, 0x40, 0x42, 0x5d, 0x82, 0xac, 0x1e, 0x9c, 0x04, 0xf4, 0xa5, + 0x28, 0xef, 0x89, 0xe6, 0xe8, 0x61, 0x30, 0x7d, 0xef, 0x4e, 0x98, 0xc7, 0x2e, 0xc4, 0x47, 0x12, + 0xef, 0x0e, 0x11, 0x4b, 0xf8, 0x59, 0xc8, 0x11, 0xef, 0x0e, 0x6a, 0x02, 0xf8, 0xb6, 0xdb, 0xa3, + 0xb7, 0xa2, 0x0a, 0xaa, 0x4a, 0x34, 0xc8, 0x8c, 0xc4, 0x61, 0x0d, 0x8e, 0xeb, 0x37, 0x92, 0xea, + 0x5e, 0x85, 0xe2, 0xab, 0x23, 0x5d, 0x5c, 0xb5, 0x94, 0xb8, 0x64, 0xa1, 0x1e, 0x22, 0x71, 0x9b, + 0x81, 0x18, 0x8e, 0xce, 0x40, 0x99, 0xd9, 0x3b, 0x7d, 0x7a, 0x23, 0x76, 0x73, 0x31, 0x80, 0xaf, + 0xf2, 0xe2, 0xef, 0x96, 0x96, 0x01, 0xc5, 0x00, 0xf4, 0x18, 0x2c, 0xc5, 0x77, 0xbe, 0xe9, 0xd3, + 0x5d, 0xe7, 0x1d, 0xa1, 0xe1, 0x2a, 0x39, 0x02, 0x47, 0x67, 0xe1, 0x58, 0x0c, 0xdb, 0x12, 0x99, + 0x86, 0x29, 0x50, 0xd3, 0x60, 0x2e, 0x1b, 0xc1, 0xee, 0x0b, 0xb7, 0x47, 0x76, 0x5f, 0x3c, 0xbe, + 0x2a, 0xd1, 0x20, 0xf8, 0xaf, 0x06, 0x1c, 0x97, 0xaa, 0x66, 0x36, 0xfb, 0x5a, 0x5a, 0xfd, 0x6f, + 0x0d, 0x40, 0x3a, 0x07, 0xca, 0xb4, 0xfe, 0x5f, 0x6f, 0x04, 0xf1, 0x54, 0xa6, 0x22, 0x6a, 0x5a, + 0x09, 0x8a, 0x7b, 0x39, 0x18, 0x0a, 0x22, 0x1d, 0x92, 0xc5, 0xb5, 0x29, 0x8b, 0x66, 0x09, 0x21, + 0xea, 0x97, 0xd7, 0xfa, 0x3b, 0x63, 0x46, 0x03, 0x55, 0xf2, 0x8a, 0x5a, 0x5f, 0x00, 0x88, 0xfc, + 0xe1, 0x67, 0x51, 0x97, 0x09, 0xab, 0x31, 0xe3, 0xb3, 0x14, 0x88, 0x84, 0x03, 0xfc, 0xfb, 0x2c, + 0x2c, 0xdc, 0xf2, 0xfa, 0xa3, 0x38, 0x30, 0x7e, 0x9d, 0x02, 0x46, 0xa2, 0x0e, 0xcf, 0x87, 0x75, + 0x38, 0x02, 0x33, 0x60, 0x74, 0x28, 0x2c, 0x2b, 0x47, 0xc4, 0x18, 0x61, 0xa8, 0x32, 0xdb, 0xef, + 0x51, 0x26, 0xab, 0x9b, 0x7a, 0x41, 0xa4, 0x9d, 0x09, 0x18, 0x5a, 0x81, 0x8a, 0xdd, 0xeb, 0xf9, + 0xb4, 0x67, 0x33, 0xda, 0x1e, 0xd7, 0x8b, 0xe2, 0x30, 0x1d, 0x84, 0xdf, 0x80, 0xc5, 0x50, 0x58, + 0x4a, 0xa5, 0x4f, 0x40, 0xf1, 0x6d, 0x01, 0x99, 0xd2, 0x17, 0x93, 0xa8, 0xca, 0x8d, 0x85, 0x68, + 0xc9, 0x3e, 0x7b, 0x78, 0x67, 0x7c, 0x1d, 0x0a, 0x12, 0x1d, 0x9d, 0xd1, 0x6b, 0x14, 0xd9, 0xa4, + 0xe1, 0x73, 0x55, 0x70, 0x60, 0x28, 0x48, 0x42, 0x4a, 0xf1, 0xc2, 0x36, 0x24, 0x84, 0xa8, 0x5f, + 0xfc, 0x1f, 0x03, 0x4e, 0xac, 0x53, 0x46, 0x3b, 0x8c, 0x76, 0xaf, 0x3a, 0xb4, 0xdf, 0xfd, 0x4a, + 0xcb, 0xe7, 0xa8, 0x09, 0x96, 0xd3, 0x9a, 0x60, 0xdc, 0xef, 0xf4, 0x1d, 0x97, 0x6e, 0x6a, 0x5d, + 0x94, 0x18, 0xc0, 0x3d, 0xc4, 0x2e, 0xbf, 0xb8, 0x5c, 0x96, 0x1f, 0x36, 0x34, 0x48, 0xa4, 0xe1, + 0x42, 0xac, 0x61, 0xfc, 0x23, 0x03, 0x4e, 0xa6, 0xb9, 0x56, 0x4a, 0x6a, 0x41, 0x41, 0x6c, 0x9e, + 0xd2, 0x7f, 0x4d, 0xec, 0x20, 0x0a, 0x0d, 0x5d, 0x4a, 0x9c, 0x2f, 0x3e, 0x88, 0xb4, 0xeb, 0x87, + 0x13, 0xab, 0x16, 0x43, 0xb5, 0x12, 0x5f, 0xc3, 0xc5, 0xbf, 0xe2, 0x85, 0xb0, 0x4e, 0x53, 0xe8, + 0x9b, 0xdb, 0x97, 0xf2, 0xbd, 0x72, 0x82, 0xbe, 0x01, 0x26, 0x1b, 0x0f, 0x95, 0xcb, 0x6d, 0x9f, + 0xf8, 0x74, 0x62, 0x1d, 0x4f, 0x6c, 0xdb, 0x1e, 0x0f, 0x29, 0x11, 0x28, 0xdc, 0x2c, 0x3b, 0xb6, + 0xdf, 0x75, 0x5c, 0xbb, 0xef, 0x30, 0x29, 0x46, 0x93, 0xe8, 0x20, 0xd1, 0x89, 0xd8, 0xa7, 0xac, + 0x23, 0x93, 0xea, 0xaa, 0xea, 0x44, 0x08, 0x48, 0xa2, 0x13, 0x21, 0x20, 0xf8, 0xd7, 0x9a, 0x79, + 0x48, 0xcb, 0xff, 0x9f, 0x33, 0x0f, 0xfc, 0xbd, 0x58, 0x97, 0xe1, 0x15, 0x95, 0x2e, 0x9f, 0x87, + 0xc5, 0x6e, 0x62, 0x65, 0xb6, 0x4e, 0x65, 0x97, 0x35, 0x85, 0x8e, 0x47, 0xb1, 0x82, 0x04, 0x64, + 0x86, 0x82, 0x52, 0x52, 0xcf, 0x7e, 0x96, 0xd4, 0x73, 0xf7, 0x96, 0xfa, 0x63, 0x8f, 0x40, 0x39, + 0xfa, 0x72, 0x85, 0x2a, 0x50, 0xbc, 0xfa, 0x0a, 0x79, 0xfd, 0x0a, 0x59, 0x5f, 0xca, 0xa0, 0x2a, + 0x94, 0xda, 0x57, 0xd6, 0x5e, 0x12, 0x33, 0xe3, 0xe2, 0x7b, 0x85, 0x30, 0xdc, 0xfb, 0xe8, 0xdb, + 0x90, 0x97, 0x31, 0xfc, 0x64, 0xcc, 0x9c, 0xfe, 0x81, 0xa8, 0x71, 0xea, 0x08, 0x5c, 0x4a, 0x09, + 0x67, 0x9e, 0x30, 0xd0, 0x0d, 0xa8, 0x08, 0xa0, 0x6a, 0xe7, 0x9e, 0x49, 0x77, 0x55, 0x13, 0x94, + 0x1e, 0x9a, 0xb1, 0xaa, 0xd1, 0xbb, 0x0c, 0x79, 0x29, 0xb0, 0x93, 0xa9, 0x54, 0x6b, 0xca, 0x6d, + 0x12, 0x0d, 0x6e, 0x9c, 0x41, 0xcf, 0x80, 0xb9, 0x6d, 0x3b, 0x7d, 0xa4, 0x65, 0x7a, 0x5a, 0x17, + 0xb6, 0x71, 0x32, 0x0d, 0xd6, 0x8e, 0x7d, 0x2e, 0x6a, 0x26, 0x9f, 0x4a, 0x77, 0xb4, 0xc2, 0xed, + 0xf5, 0xa3, 0x0b, 0xd1, 0xc9, 0xaf, 0xc8, 0x96, 0x67, 0xd8, 0x57, 0x41, 0x0f, 0x25, 0x8f, 0x4a, + 0xb5, 0x61, 0x1a, 0xcd, 0x59, 0xcb, 0x11, 0xc1, 0x4d, 0xa8, 0x68, 0x3d, 0x0d, 0x5d, 0xac, 0x47, + 0x1b, 0x32, 0xba, 0x58, 0xa7, 0x34, 0x42, 0x70, 0x06, 0x5d, 0x83, 0x12, 0xcf, 0x8f, 0xc5, 0xb7, + 0x8f, 0xd3, 0xe9, 0x34, 0x58, 0x4b, 0x7f, 0x1a, 0x67, 0xa6, 0x2f, 0x46, 0x84, 0xbe, 0x0b, 0xe5, + 0x6b, 0x94, 0xa9, 0x18, 0x72, 0x2a, 0x1d, 0x84, 0xa6, 0x48, 0x2a, 0x19, 0xc8, 0x70, 0x06, 0xbd, + 0x21, 0x52, 0xf5, 0xa4, 0x0b, 0x45, 0xd6, 0x0c, 0x57, 0x19, 0xdd, 0x6b, 0x65, 0x36, 0x42, 0x44, + 0xf9, 0xf5, 0x04, 0x65, 0x15, 0x6d, 0xad, 0x19, 0x0f, 0x36, 0xa2, 0x6c, 0xdd, 0xe3, 0x3f, 0x10, + 0x70, 0xe6, 0xe2, 0x9b, 0xe1, 0x47, 0xf8, 0x75, 0x9b, 0xd9, 0xe8, 0x15, 0x58, 0x14, 0xb2, 0x8c, + 0xbe, 0xd2, 0x27, 0x6c, 0xfe, 0xc8, 0xbf, 0x04, 0x24, 0x6c, 0xfe, 0xe8, 0xbf, 0x06, 0xe0, 0x4c, + 0xfb, 0xcd, 0x0f, 0xee, 0x36, 0x33, 0x1f, 0xde, 0x6d, 0x66, 0x3e, 0xb9, 0xdb, 0x34, 0x7e, 0x78, + 0xd0, 0x34, 0x7e, 0x77, 0xd0, 0x34, 0xde, 0x3f, 0x68, 0x1a, 0x1f, 0x1c, 0x34, 0x8d, 0x7f, 0x1d, + 0x34, 0x8d, 0x7f, 0x1f, 0x34, 0x33, 0x9f, 0x1c, 0x34, 0x8d, 0x77, 0x3f, 0x6e, 0x66, 0x3e, 0xf8, + 0xb8, 0x99, 0xf9, 0xf0, 0xe3, 0x66, 0xe6, 0xfb, 0x8f, 0xde, 0xbb, 0x2c, 0x95, 0x6e, 0xb1, 0x20, + 0x7e, 0x9e, 0xfc, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x22, 0x59, 0x73, 0x2a, 0x22, 0x00, + 0x00, } func (x Direction) String() string { @@ -4942,6 +4951,9 @@ func (this *DetectedLabel) Equal(that interface{}) bool { if this.Cardinality != that1.Cardinality { return false } + if !bytes.Equal(this.Sketch, that1.Sketch) { + return false + } return true } func (this *LabelToValuesResponse) GoString() string { @@ -5628,10 +5640,11 @@ func (this *DetectedLabel) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 7) s = append(s, "&logproto.DetectedLabel{") s = append(s, "Label: "+fmt.Sprintf("%#v", this.Label)+",\n") s = append(s, "Cardinality: "+fmt.Sprintf("%#v", this.Cardinality)+",\n") + s = append(s, "Sketch: "+fmt.Sprintf("%#v", this.Sketch)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -8614,6 +8627,13 @@ func (m *DetectedLabel) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Sketch) > 0 { + i -= len(m.Sketch) + copy(dAtA[i:], m.Sketch) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Sketch))) + i-- + dAtA[i] = 0x1a + } if m.Cardinality != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Cardinality)) i-- @@ -9684,6 +9704,10 @@ func (m *DetectedLabel) Size() (n int) { if m.Cardinality != 0 { n += 1 + sovLogproto(uint64(m.Cardinality)) } + l = len(m.Sketch) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } return n } @@ -10400,6 +10424,7 @@ func (this *DetectedLabel) String() string { s := strings.Join([]string{`&DetectedLabel{`, `Label:` + fmt.Sprintf("%v", this.Label) + `,`, `Cardinality:` + fmt.Sprintf("%v", this.Cardinality) + `,`, + `Sketch:` + fmt.Sprintf("%v", this.Sketch) + `,`, `}`, }, "") return s @@ -17448,6 +17473,40 @@ func (m *DetectedLabel) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sketch", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sketch = append(m.Sketch[:0], dAtA[iNdEx:postIndex]...) + if m.Sketch == nil { + m.Sketch = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index ccb35c115c515..1d5b8a5f1f2a9 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -483,4 +483,5 @@ message DetectedLabelsResponse { message DetectedLabel { string label = 1; uint64 cardinality = 2; + bytes sketch = 3 [(gogoproto.jsontag) = "sketch,omitempty"]; } diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 87898680e99d2..192a444b3c5b1 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -21,7 +21,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" - "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" "google.golang.org/grpc/health/grpc_health_v1" @@ -915,8 +914,7 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. if err != nil { return nil, err } - var detectedLabels []*logproto.DetectedLabel - staticLabels := map[string]struct{}{"cluster": {}, "namespace": {}, "instance": {}, "pod": {}} + //staticLabels := map[string]struct{}{"cluster": {}, "namespace": {}, "instance": {}, "pod": {}} // Enforce the query timeout while querying backends queryTimeout := q.limits.QueryTimeout(ctx, userID) @@ -929,6 +927,7 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. } ingesterQueryInterval, storeQueryInterval := q.buildQueryIntervals(req.Start, req.End) + // Fetch labels from ingesters var ingesterLabels *logproto.LabelToValuesResponse if !q.cfg.QueryStoreOnly && ingesterQueryInterval != nil { g.Go(func() error { @@ -942,6 +941,7 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. }) } + // Fetch labels from the store storeLabelsMap := make(map[string][]string) if !q.cfg.QueryIngesterOnly && storeQueryInterval != nil { var matchers []*labels.Matcher @@ -961,9 +961,9 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. if err != nil { return err } - if q.isLabelRelevant(label, values, staticLabels) { - storeLabelsMap[label] = values - } + //if isLabelRelevant(label, values, staticLabels) { + storeLabelsMap[label] = values + //} } return err }) @@ -979,40 +979,53 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. }, nil } + return &logproto.DetectedLabelsResponse{ + DetectedLabels: countLabelsAndCardinality(storeLabelsMap, ingesterLabels), + }, nil +} + +func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabels *logproto.LabelToValuesResponse) []*logproto.DetectedLabel { + dlMap := make(map[string]*parsedFields) + if ingesterLabels != nil { - // append static labels before so they are in sorted order - for l := range staticLabels { - if values, present := ingesterLabels.Labels[l]; present { - detectedLabels = append(detectedLabels, &logproto.DetectedLabel{Label: l, Cardinality: uint64(len(values.Values))}) + for label, val := range ingesterLabels.Labels { + _, ok := dlMap[label] + if !ok { + dlMap[label] = newParsedFields() } - } - - for label, values := range ingesterLabels.Labels { - if q.isLabelRelevant(label, values.Values, staticLabels) { - combinedValues := values.Values - storeValues, storeHasLabel := storeLabelsMap[label] - if storeHasLabel { - combinedValues = append(combinedValues, storeValues...) - } - slices.Sort(combinedValues) - uniqueValues := slices.Compact(combinedValues) - // TODO(shantanu): There's a bug here. Unique values can go above 50. Will need a bit of refactoring - detectedLabels = append(detectedLabels, &logproto.DetectedLabel{Label: label, Cardinality: uint64(len(uniqueValues))}) - delete(storeLabelsMap, label) + parsedFields := dlMap[label] + for _, v := range val.Values { + parsedFields.Insert(v) } } } for label, values := range storeLabelsMap { - slices.Sort(values) - uniqueValues := slices.Compact(values) - detectedLabels = append(detectedLabels, &logproto.DetectedLabel{Label: label, Cardinality: uint64(len(uniqueValues))}) - } + _, ok := dlMap[label] + if !ok { + dlMap[label] = newParsedFields() + } - return &logproto.DetectedLabelsResponse{ - DetectedLabels: detectedLabels, - }, nil + parsedFields := dlMap[label] + for _, v := range values { + parsedFields.Insert(v) + } + } + var detectedLabels []*logproto.DetectedLabel + for k, v := range dlMap { + sketch, err := v.sketch.MarshalBinary() + if err != nil { + // TODO: add log here + continue + } + detectedLabels = append(detectedLabels, &logproto.DetectedLabel{ + Label: k, + Cardinality: v.Estimate(), + Sketch: sketch, + }) + } + return detectedLabels } type PatterQuerier interface { @@ -1033,7 +1046,7 @@ func (q *SingleTenantQuerier) Patterns(ctx context.Context, req *logproto.QueryP // isLabelRelevant returns if the label is relevant for logs app. A label is relevant if it is not of any numeric, UUID or GUID type // It is also not relevant to return if the values are less than 1 or beyond 50. -func (q *SingleTenantQuerier) isLabelRelevant(label string, values []string, staticLabels map[string]struct{}) bool { +func isLabelRelevant(label string, values []string, staticLabels map[string]struct{}) bool { cardinality := len(values) _, isStaticLabel := staticLabels[label] if isStaticLabel || (cardinality < 2 || cardinality > 50) || diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index 7491d559f9aad..fd114a337da76 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -1379,51 +1379,52 @@ func (d *mockDeleteGettter) GetAllDeleteRequestsForUser(_ context.Context, userI return d.results, nil } -func TestQuerier_isLabelRelevant(t *testing.T) { - for _, tc := range []struct { - name string - label string - values []string - expected bool - }{ - { - label: "uuidv4 values are not relevant", - values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}, - expected: false, - }, - { - label: "guid values are not relevant", - values: []string{"57808f62-f117-4a22-84a0-bc3282c7f106", "5076e837-cd8d-4dd7-95ff-fecb087dccf6", "2e2a6554-1744-4399-b89a-88ae79c27096", "d3c31248-ec0c-4bc4-b11c-8fb1cfb42e62"}, - expected: false, - }, - { - label: "integer values are not relevant", - values: []string{"1", "2", "3", "4"}, - expected: false, - }, - { - label: "string values are relevant", - values: []string{"ingester", "querier", "query-frontend", "index-gateway"}, - expected: true, - }, - { - label: "guid with braces are not relevant", - values: []string{"{E9550CF7-58D9-48B9-8845-D9800C651AAC}", "{1617921B-1749-4FF0-A058-31AFB5D98149}", "{C119D92E-A4B9-48A3-A92C-6CA8AA8A6CCC}", "{228AAF1D-2DE7-4909-A4E9-246A7FA9D988}"}, - expected: false, - }, - { - label: "float values are not relevant", - values: []string{"1.2", "2.5", "3.3", "4.1"}, - expected: false, - }, - } { - t.Run(tc.name, func(t *testing.T) { - querier := &SingleTenantQuerier{cfg: mockQuerierConfig()} - assert.Equal(t, tc.expected, querier.isLabelRelevant(tc.label, tc.values, map[string]struct{}{"host": {}, "cluster": {}, "namespace": {}, "instance": {}, "pod": {}})) - }) - - } -} +// +//func TestQuerier_isLabelRelevant(t *testing.T) { +// for _, tc := range []struct { +// name string +// label string +// values []string +// expected bool +// }{ +// { +// label: "uuidv4 values are not relevant", +// values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}, +// expected: false, +// }, +// { +// label: "guid values are not relevant", +// values: []string{"57808f62-f117-4a22-84a0-bc3282c7f106", "5076e837-cd8d-4dd7-95ff-fecb087dccf6", "2e2a6554-1744-4399-b89a-88ae79c27096", "d3c31248-ec0c-4bc4-b11c-8fb1cfb42e62"}, +// expected: false, +// }, +// { +// label: "integer values are not relevant", +// values: []string{"1", "2", "3", "4"}, +// expected: false, +// }, +// { +// label: "string values are relevant", +// values: []string{"ingester", "querier", "query-frontend", "index-gateway"}, +// expected: true, +// }, +// { +// label: "guid with braces are not relevant", +// values: []string{"{E9550CF7-58D9-48B9-8845-D9800C651AAC}", "{1617921B-1749-4FF0-A058-31AFB5D98149}", "{C119D92E-A4B9-48A3-A92C-6CA8AA8A6CCC}", "{228AAF1D-2DE7-4909-A4E9-246A7FA9D988}"}, +// expected: false, +// }, +// { +// label: "float values are not relevant", +// values: []string{"1.2", "2.5", "3.3", "4.1"}, +// expected: false, +// }, +// } { +// t.Run(tc.name, func(t *testing.T) { +// querier := &SingleTenantQuerier{cfg: mockQuerierConfig()} +// assert.Equal(t, tc.expected, querier.isLabelRelevant(tc.label, tc.values, map[string]struct{}{"host": {}, "cluster": {}, "namespace": {}, "instance": {}, "pod": {}})) +// }) +// +// } +//} func TestQuerier_DetectedLabels(t *testing.T) { manyValues := []string{} @@ -1440,8 +1441,8 @@ func TestQuerier_DetectedLabels(t *testing.T) { conf.IngesterQueryStoreMaxLookback = 0 request := logproto.DetectedLabelsRequest{ - Start: &now, - End: &now, + Start: now, + End: now, Query: "", } @@ -1478,8 +1479,11 @@ func TestQuerier_DetectedLabels(t *testing.T) { detectedLabels := resp.DetectedLabels assert.Len(t, detectedLabels, 3) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "storeLabel", Cardinality: 2}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "ingesterLabel", Cardinality: 3}) + expectedCardinality := map[string]uint64{"storeLabel": 2, "ingesterLabel": 3, "cluster": 1} + for _, d := range detectedLabels { + card := expectedCardinality[d.Label] + assert.Equal(t, d.Cardinality, card, "Expected cardinality mismatch for: ", d.Label) + } }) t.Run("when both store and ingester responses are present, duplicates are removed", func(t *testing.T) { @@ -1518,9 +1522,12 @@ func TestQuerier_DetectedLabels(t *testing.T) { detectedLabels := resp.DetectedLabels assert.Len(t, detectedLabels, 4) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "storeLabel", Cardinality: 2}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "ingesterLabel", Cardinality: 3}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "commonLabel", Cardinality: 5}) + + 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) { @@ -1550,8 +1557,11 @@ func TestQuerier_DetectedLabels(t *testing.T) { detectedLabels := resp.DetectedLabels assert.Len(t, detectedLabels, 2) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "storeLabel1", Cardinality: 2}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "storeLabel2", Cardinality: 2}) + expectedCardinality := map[string]uint64{"storeLabel1": 2, "storeLabel2": 2} + 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 store data is empty", func(t *testing.T) { @@ -1582,109 +1592,112 @@ func TestQuerier_DetectedLabels(t *testing.T) { detectedLabels := resp.DetectedLabels assert.Len(t, detectedLabels, 2) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "cluster", Cardinality: 1}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "ingesterLabel", Cardinality: 3}) - }) - - t.Run("id types like uuids, guids and numbers are not relevant detected labels", func(t *testing.T) { - ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ - "all-ints": {Values: []string{"1", "2", "3", "4"}}, - "all-floats": {Values: []string{"1.2", "2.3", "3.4", "4.5"}}, - "all-uuids": {Values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}}, - }} - - ingesterClient := newQuerierClientMock() - storeClient := newStoreMock() - - ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - Return(&ingesterResponse, nil) - storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) - - detectedLabels := resp.DetectedLabels - assert.Len(t, detectedLabels, 0) - }) - - t.Run("labels with more than required cardinality are not relevant", func(t *testing.T) { - ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ - "less-than-m-values": {Values: []string{"val1"}}, - "more-than-n-values": {Values: manyValues}, - }} - - ingesterClient := newQuerierClientMock() - storeClient := newStoreMock() - - ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - Return(&ingesterResponse, nil) - storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) - - detectedLabels := resp.DetectedLabels - assert.Len(t, detectedLabels, 0) - }) - - t.Run("static labels are always returned no matter their cardinality or value types", func(t *testing.T) { - ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ - "cluster": {Values: []string{"val1"}}, - "namespace": {Values: manyValues}, - "pod": {Values: []string{"1", "2", "3", "4"}}, - }} - - ingesterClient := newQuerierClientMock() - storeClient := newStoreMock() - - ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - Return(&ingesterResponse, nil) - storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - Return([]string{}, nil) - request := logproto.DetectedLabelsRequest{ - Start: &now, - End: &now, - Query: "", + expectedCardinality := map[string]uint64{"cluster": 1, "ingesterLabel": 3} + for _, d := range detectedLabels { + card := expectedCardinality[d.Label] + assert.Equal(t, d.Cardinality, card, "Expected cardinality mismatch for: ", d.Label) } - - 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) - - detectedLabels := resp.DetectedLabels - assert.Len(t, detectedLabels, 3) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "cluster", Cardinality: 1}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "pod", Cardinality: 4}) - assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "namespace", Cardinality: 60}) }) + // + //t.Run("id types like uuids, guids and numbers are not relevant detected labels", func(t *testing.T) { + // ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ + // "all-ints": {Values: []string{"1", "2", "3", "4"}}, + // "all-floats": {Values: []string{"1.2", "2.3", "3.4", "4.5"}}, + // "all-uuids": {Values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}}, + // }} + // + // ingesterClient := newQuerierClientMock() + // storeClient := newStoreMock() + // + // ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + // Return(&ingesterResponse, nil) + // storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) + // + // detectedLabels := resp.DetectedLabels + // assert.Len(t, detectedLabels, 0) + //}) + // + //t.Run("labels with more than required cardinality are not relevant", func(t *testing.T) { + // ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ + // "less-than-m-values": {Values: []string{"val1"}}, + // "more-than-n-values": {Values: manyValues}, + // }} + // + // ingesterClient := newQuerierClientMock() + // storeClient := newStoreMock() + // + // ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + // Return(&ingesterResponse, nil) + // storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) + // + // detectedLabels := resp.DetectedLabels + // assert.Len(t, detectedLabels, 0) + //}) + // + //t.Run("static labels are always returned no matter their cardinality or value types", func(t *testing.T) { + // ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ + // "cluster": {Values: []string{"val1"}}, + // "namespace": {Values: manyValues}, + // "pod": {Values: []string{"1", "2", "3", "4"}}, + // }} + // + // ingesterClient := newQuerierClientMock() + // storeClient := newStoreMock() + // + // ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + // Return(&ingesterResponse, nil) + // storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + // Return([]string{}, nil) + // request := logproto.DetectedLabelsRequest{ + // Start: now, + // End: now, + // Query: "", + // } + // + // 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) + // + // detectedLabels := resp.DetectedLabels + // assert.Len(t, detectedLabels, 3) + // assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "cluster", Cardinality: 1}) + // assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "pod", Cardinality: 4}) + // assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "namespace", Cardinality: 60}) + //}) } func BenchmarkQuerierDetectedLabels(b *testing.B) { @@ -1697,8 +1710,8 @@ func BenchmarkQuerierDetectedLabels(b *testing.B) { conf.IngesterQueryStoreMaxLookback = 0 request := logproto.DetectedLabelsRequest{ - Start: &now, - End: &now, + Start: now, + End: now, Query: "", } ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ diff --git a/pkg/querier/queryrange/splitters.go b/pkg/querier/queryrange/splitters.go index 478a22cd19d0c..fe3453b2ee717 100644 --- a/pkg/querier/queryrange/splitters.go +++ b/pkg/querier/queryrange/splitters.go @@ -5,9 +5,10 @@ import ( "time" "github.com/go-kit/log/level" - util_log "github.com/grafana/loki/v3/pkg/util/log" "github.com/prometheus/common/model" + util_log "github.com/grafana/loki/v3/pkg/util/log" + "github.com/grafana/loki/v3/pkg/logproto" "github.com/grafana/loki/v3/pkg/querier/queryrange/queryrangebase" "github.com/grafana/loki/v3/pkg/util" diff --git a/pkg/storage/detected/labels.go b/pkg/storage/detected/labels.go index 0b8e6ea5325b0..9a8b9c905ec78 100644 --- a/pkg/storage/detected/labels.go +++ b/pkg/storage/detected/labels.go @@ -1,7 +1,66 @@ package detected -import "github.com/grafana/loki/v3/pkg/logproto" +import ( + "github.com/axiomhq/hyperloglog" -func MergeLabels(_ []*logproto.DetectedLabel) ([]*logproto.DetectedLabel, error) { - return nil, nil + "github.com/grafana/loki/v3/pkg/logproto" +) + +type UnmarshaledDetectedLabel struct { + Label string + Sketch *hyperloglog.Sketch +} + +func unmarshalDetectedLabel(l *logproto.DetectedLabel) (*UnmarshaledDetectedLabel, error) { + sketch := hyperloglog.New() + err := sketch.UnmarshalBinary(l.Sketch) + if err != nil { + return nil, err + } + return &UnmarshaledDetectedLabel{ + Label: l.Label, + Sketch: sketch, + }, nil +} + +func (m *UnmarshaledDetectedLabel) Merge(dl *logproto.DetectedLabel) error { + sketch := hyperloglog.New() + err := sketch.UnmarshalBinary(dl.Sketch) + if err != nil { + return err + } + return m.Sketch.Merge(sketch) +} + +func MergeLabels(labels []*logproto.DetectedLabel) (result []*logproto.DetectedLabel, err error) { + mergedLabels := make(map[string]*UnmarshaledDetectedLabel) + for _, label := range labels { + l, ok := mergedLabels[label.Label] + if !ok { + unmarshaledLabel, err := unmarshalDetectedLabel(label) + if err != nil { + return nil, err + } + mergedLabels[label.Label] = unmarshaledLabel + } + + if ok { + err := l.Merge(label) + if err != nil { + return nil, err + } + } + } + + for _, label := range mergedLabels { + detectedLabel := &logproto.DetectedLabel{ + Label: label.Label, + Cardinality: label.Sketch.Estimate(), + Sketch: nil, + } + + result = append(result, detectedLabel) + } + + return } From b81abc0209b2ed7571df7e95e40242377542c99f Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Tue, 30 Apr 2024 17:22:03 +0530 Subject: [PATCH 04/11] Move cardinality filter to tripperware --- pkg/querier/querier.go | 50 ++++---- pkg/querier/querier_test.go | 172 ++++++++++++---------------- pkg/querier/queryrange/roundtrip.go | 32 +++++- 3 files changed, 121 insertions(+), 133 deletions(-) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 192a444b3c5b1..2301f3e2ad31b 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -914,7 +914,7 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. if err != nil { return nil, err } - //staticLabels := map[string]struct{}{"cluster": {}, "namespace": {}, "instance": {}, "pod": {}} + staticLabels := map[string]struct{}{"cluster": {}, "namespace": {}, "instance": {}, "pod": {}} // Enforce the query timeout while querying backends queryTimeout := q.limits.QueryTimeout(ctx, userID) @@ -961,9 +961,7 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. if err != nil { return err } - //if isLabelRelevant(label, values, staticLabels) { storeLabelsMap[label] = values - //} } return err }) @@ -980,38 +978,43 @@ func (q *SingleTenantQuerier) DetectedLabels(ctx context.Context, req *logproto. } return &logproto.DetectedLabelsResponse{ - DetectedLabels: countLabelsAndCardinality(storeLabelsMap, ingesterLabels), + DetectedLabels: countLabelsAndCardinality(storeLabelsMap, ingesterLabels, staticLabels), }, nil } -func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabels *logproto.LabelToValuesResponse) []*logproto.DetectedLabel { +func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabels *logproto.LabelToValuesResponse, staticLabels map[string]struct{}) []*logproto.DetectedLabel { dlMap := make(map[string]*parsedFields) if ingesterLabels != nil { for label, val := range ingesterLabels.Labels { + if _, isStatic := staticLabels[label]; isStatic || !containsAllIDTypes(val.Values) { + _, ok := dlMap[label] + if !ok { + dlMap[label] = newParsedFields() + } + + parsedFields := dlMap[label] + for _, v := range val.Values { + parsedFields.Insert(v) + } + } + } + } + + for label, values := range storeLabelsMap { + if _, isStatic := staticLabels[label]; isStatic || !containsAllIDTypes(values) { _, ok := dlMap[label] if !ok { dlMap[label] = newParsedFields() } parsedFields := dlMap[label] - for _, v := range val.Values { + for _, v := range values { parsedFields.Insert(v) } } } - for label, values := range storeLabelsMap { - _, ok := dlMap[label] - if !ok { - dlMap[label] = newParsedFields() - } - - parsedFields := dlMap[label] - for _, v := range values { - parsedFields.Insert(v) - } - } var detectedLabels []*logproto.DetectedLabel for k, v := range dlMap { sketch, err := v.sketch.MarshalBinary() @@ -1044,19 +1047,6 @@ func (q *SingleTenantQuerier) Patterns(ctx context.Context, req *logproto.QueryP return res, err } -// isLabelRelevant returns if the label is relevant for logs app. A label is relevant if it is not of any numeric, UUID or GUID type -// It is also not relevant to return if the values are less than 1 or beyond 50. -func isLabelRelevant(label string, values []string, staticLabels map[string]struct{}) bool { - cardinality := len(values) - _, isStaticLabel := staticLabels[label] - if isStaticLabel || (cardinality < 2 || cardinality > 50) || - containsAllIDTypes(values) { - return false - } - - return true -} - // containsAllIDTypes filters out all UUID, GUID and numeric types. Returns false if even one value is not of the type func containsAllIDTypes(values []string) bool { for _, v := range values { diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index fd114a337da76..d1760fff76770 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -1598,106 +1598,78 @@ func TestQuerier_DetectedLabels(t *testing.T) { assert.Equal(t, d.Cardinality, card, "Expected cardinality mismatch for: ", d.Label) } }) - // - //t.Run("id types like uuids, guids and numbers are not relevant detected labels", func(t *testing.T) { - // ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ - // "all-ints": {Values: []string{"1", "2", "3", "4"}}, - // "all-floats": {Values: []string{"1.2", "2.3", "3.4", "4.5"}}, - // "all-uuids": {Values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}}, - // }} - // - // ingesterClient := newQuerierClientMock() - // storeClient := newStoreMock() - // - // ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - // Return(&ingesterResponse, nil) - // storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) - // - // detectedLabels := resp.DetectedLabels - // assert.Len(t, detectedLabels, 0) - //}) - // - //t.Run("labels with more than required cardinality are not relevant", func(t *testing.T) { - // ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ - // "less-than-m-values": {Values: []string{"val1"}}, - // "more-than-n-values": {Values: manyValues}, - // }} - // - // ingesterClient := newQuerierClientMock() - // storeClient := newStoreMock() - // - // ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - // Return(&ingesterResponse, nil) - // storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) - // - // detectedLabels := resp.DetectedLabels - // assert.Len(t, detectedLabels, 0) - //}) - // - //t.Run("static labels are always returned no matter their cardinality or value types", func(t *testing.T) { - // ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ - // "cluster": {Values: []string{"val1"}}, - // "namespace": {Values: manyValues}, - // "pod": {Values: []string{"1", "2", "3", "4"}}, - // }} - // - // ingesterClient := newQuerierClientMock() - // storeClient := newStoreMock() - // - // ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - // Return(&ingesterResponse, nil) - // storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). - // Return([]string{}, nil) - // request := logproto.DetectedLabelsRequest{ - // Start: now, - // End: now, - // Query: "", - // } - // - // 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) - // - // detectedLabels := resp.DetectedLabels - // assert.Len(t, detectedLabels, 3) - // assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "cluster", Cardinality: 1}) - // assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "pod", Cardinality: 4}) - // assert.Contains(t, detectedLabels, &logproto.DetectedLabel{Label: "namespace", Cardinality: 60}) - //}) + + t.Run("id types like uuids, guids and numbers are not relevant detected labels", func(t *testing.T) { + ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ + "all-ints": {Values: []string{"1", "2", "3", "4"}}, + "all-floats": {Values: []string{"1.2", "2.3", "3.4", "4.5"}}, + "all-uuids": {Values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}}, + }} + + ingesterClient := newQuerierClientMock() + storeClient := newStoreMock() + + ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(&ingesterResponse, nil) + storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, 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) + + detectedLabels := resp.DetectedLabels + assert.Len(t, detectedLabels, 0) + }) + + t.Run("static labels are always returned no matter their cardinality or value types", func(t *testing.T) { + ingesterResponse := logproto.LabelToValuesResponse{Labels: map[string]*logproto.UniqueLabelValues{ + "cluster": {Values: []string{"val1"}}, + "namespace": {Values: manyValues}, + "pod": {Values: []string{"1", "2", "3", "4"}}, + }} + + ingesterClient := newQuerierClientMock() + storeClient := newStoreMock() + + ingesterClient.On("GetDetectedLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(&ingesterResponse, nil) + storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return([]string{}, nil) + request := logproto.DetectedLabelsRequest{ + Start: now, + End: now, + Query: "", + } + + 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) + + detectedLabels := resp.DetectedLabels + assert.Len(t, detectedLabels, 3) + expectedCardinality := map[string]uint64{"cluster": 1, "pod": 4, "namespace": 60} + for _, d := range detectedLabels { + card := expectedCardinality[d.Label] + assert.Equal(t, d.Cardinality, card, "Expected cardinality mismatch for: ", d.Label) + } + }) } func BenchmarkQuerierDetectedLabels(b *testing.B) { diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index 15eccf7c86f35..05ddc7ee7a03b 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -263,7 +263,6 @@ func NewMiddleware( indexStatsTripperware, metricsNamespace, codec, limits, iqo) - if err != nil { return nil, nil, err } @@ -309,11 +308,38 @@ func NewDetectedLabelsTripperware(cfg Config, opts logql.EngineOpts, logger log. base.NewRetryMiddleware(logger, cfg.MaxRetries, metrics.RetryMiddlewareMetrics, namespace), ) } - - return NewLimitedRoundTripper(next, l, schema.Configs, queryRangeMiddleware...) + limitedRt := NewLimitedRoundTripper(next, l, schema.Configs, queryRangeMiddleware...) + return NewDetectedLabelsCardinalityFilter(limitedRt) }), nil } +func NewDetectedLabelsCardinalityFilter(rt queryrangebase.Handler) queryrangebase.Handler { + return queryrangebase.HandlerFunc( + func(ctx context.Context, req queryrangebase.Request) (queryrangebase.Response, error) { + res, err := rt.Do(ctx, req) + if err != nil { + return nil, err + } + + resp, ok := res.(*DetectedLabelsResponse) + if !ok { + return res, nil + } + + var result []*logproto.DetectedLabel + + for _, dl := range resp.Response.DetectedLabels { + if dl.Cardinality > 2 && dl.Cardinality < 50 { + result = append(result, dl) + } + } + return &DetectedLabelsResponse{ + Response: &logproto.DetectedLabelsResponse{DetectedLabels: result}, + Headers: resp.Headers, + }, nil + }) +} + type roundTripper struct { logger log.Logger From 4b7103520b2df51bc43595bab57cb74420c72f81 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Tue, 7 May 2024 14:17:46 +0530 Subject: [PATCH 05/11] Fix problems after merge --- pkg/logproto/logproto.pb.go | 478 +++++++++++++++++--------------- pkg/querier/querier.go | 12 +- pkg/querier/queryrange/codec.go | 4 + 3 files changed, 271 insertions(+), 223 deletions(-) diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index ac9bd37a06186..4329e41447b3e 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -2890,9 +2890,9 @@ func (m *DetectedField) GetSketch() []byte { } type DetectedLabelsRequest struct { - Start *time.Time `protobuf:"bytes,1,opt,name=start,proto3,stdtime" json:"start,omitempty"` - End *time.Time `protobuf:"bytes,2,opt,name=end,proto3,stdtime" json:"end,omitempty"` - Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,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"` } func (m *DetectedLabelsRequest) Reset() { *m = DetectedLabelsRequest{} } @@ -2927,18 +2927,18 @@ func (m *DetectedLabelsRequest) XXX_DiscardUnknown() { var xxx_messageInfo_DetectedLabelsRequest proto.InternalMessageInfo -func (m *DetectedLabelsRequest) GetStart() *time.Time { +func (m *DetectedLabelsRequest) GetStart() time.Time { if m != nil { return m.Start } - return nil + return time.Time{} } -func (m *DetectedLabelsRequest) GetEnd() *time.Time { +func (m *DetectedLabelsRequest) GetEnd() time.Time { if m != nil { return m.End } - return nil + return time.Time{} } func (m *DetectedLabelsRequest) GetQuery() string { @@ -2994,6 +2994,7 @@ func (m *DetectedLabelsResponse) GetDetectedLabels() []*DetectedLabel { type DetectedLabel struct { Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` Cardinality uint64 `protobuf:"varint,2,opt,name=cardinality,proto3" json:"cardinality,omitempty"` + Sketch []byte `protobuf:"bytes,3,opt,name=sketch,proto3" json:"sketch,omitempty"` } func (m *DetectedLabel) Reset() { *m = DetectedLabel{} } @@ -3042,6 +3043,13 @@ func (m *DetectedLabel) GetCardinality() uint64 { return 0 } +func (m *DetectedLabel) GetSketch() []byte { + if m != nil { + return m.Sketch + } + return nil +} + func init() { proto.RegisterEnum("logproto.Direction", Direction_name, Direction_value) proto.RegisterType((*LabelToValuesResponse)(nil), "logproto.LabelToValuesResponse") @@ -3106,173 +3114,173 @@ func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c var fileDescriptor_c28a5f14f1f4c79a = []byte{ // 2671 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x8c, 0x1b, 0x57, - 0xd9, 0x63, 0x8f, 0xbd, 0xf6, 0x67, 0xef, 0x66, 0xf3, 0xd6, 0x49, 0xac, 0x4d, 0xea, 0xd9, 0x3e, - 0x41, 0x1b, 0x9a, 0x74, 0xdd, 0xa4, 0xb4, 0xa4, 0x29, 0xa5, 0xc4, 0xbb, 0xcd, 0x36, 0xe9, 0x36, - 0x4d, 0xdf, 0xa6, 0x69, 0x41, 0x54, 0xd5, 0xc4, 0x7e, 0xeb, 0x1d, 0xc5, 0x9e, 0x71, 0x66, 0x9e, - 0x9b, 0xee, 0x0d, 0x89, 0x33, 0xa2, 0x12, 0x07, 0xe0, 0x82, 0x84, 0x84, 0x04, 0x02, 0xf5, 0x82, - 0x38, 0x70, 0x40, 0x70, 0xe1, 0x50, 0x6e, 0xe5, 0x56, 0xf5, 0x60, 0xe8, 0xf6, 0x82, 0xf6, 0x54, - 0x09, 0x89, 0x43, 0x4f, 0xe8, 0xfd, 0xcd, 0xbc, 0x99, 0xb5, 0x49, 0xbd, 0x0d, 0x2a, 0xb9, 0xd8, - 0xf3, 0xbe, 0xf7, 0xbd, 0xef, 0xbd, 0xef, 0xe7, 0x7d, 0x7f, 0x33, 0x70, 0x72, 0x78, 0xbb, 0xd7, - 0xea, 0x07, 0xbd, 0x61, 0x18, 0xb0, 0x20, 0x7e, 0x58, 0x15, 0xbf, 0xa8, 0xac, 0xc7, 0xcb, 0xf5, - 0x5e, 0xd0, 0x0b, 0x24, 0x0e, 0x7f, 0x92, 0xf3, 0xcb, 0x4e, 0x2f, 0x08, 0x7a, 0x7d, 0xda, 0x12, - 0xa3, 0x5b, 0xa3, 0xed, 0x16, 0xf3, 0x06, 0x34, 0x62, 0xee, 0x60, 0xa8, 0x10, 0x56, 0x14, 0xf5, - 0x3b, 0xfd, 0x41, 0xd0, 0xa5, 0xfd, 0x56, 0xc4, 0x5c, 0x16, 0xc9, 0x5f, 0x85, 0xb1, 0xc4, 0x31, - 0x86, 0xa3, 0x68, 0x47, 0xfc, 0x48, 0x20, 0xfe, 0xbd, 0x05, 0xc7, 0x36, 0xdd, 0x5b, 0xb4, 0x7f, - 0x23, 0xb8, 0xe9, 0xf6, 0x47, 0x34, 0x22, 0x34, 0x1a, 0x06, 0x7e, 0x44, 0xd1, 0x1a, 0x94, 0xfa, - 0x7c, 0x22, 0x6a, 0x58, 0x2b, 0x85, 0xd3, 0xd5, 0xf3, 0x67, 0x56, 0xe3, 0x23, 0x4f, 0x5c, 0x20, - 0xa1, 0xd1, 0x0b, 0x3e, 0x0b, 0x77, 0x89, 0x5a, 0xba, 0x7c, 0x13, 0xaa, 0x06, 0x18, 0x2d, 0x42, - 0xe1, 0x36, 0xdd, 0x6d, 0x58, 0x2b, 0xd6, 0xe9, 0x0a, 0xe1, 0x8f, 0xe8, 0x1c, 0x14, 0xdf, 0xe6, - 0x64, 0x1a, 0xf9, 0x15, 0xeb, 0x74, 0xf5, 0xfc, 0xc9, 0x64, 0x93, 0xd7, 0x7c, 0xef, 0xce, 0x88, - 0x8a, 0xd5, 0x6a, 0x23, 0x89, 0x79, 0x31, 0x7f, 0xc1, 0xc2, 0x67, 0xe0, 0xe8, 0x81, 0x79, 0x74, - 0x1c, 0x4a, 0x02, 0x43, 0x9e, 0xb8, 0x42, 0xd4, 0x08, 0xd7, 0x01, 0x6d, 0xb1, 0x90, 0xba, 0x03, - 0xe2, 0x32, 0x7e, 0xde, 0x3b, 0x23, 0x1a, 0x31, 0xfc, 0x32, 0x2c, 0xa5, 0xa0, 0x8a, 0xed, 0xa7, - 0xa1, 0x1a, 0x25, 0x60, 0xc5, 0x7b, 0x3d, 0x39, 0x56, 0xb2, 0x86, 0x98, 0x88, 0xf8, 0xe7, 0x16, - 0x40, 0x32, 0x87, 0x9a, 0x00, 0x72, 0xf6, 0x45, 0x37, 0xda, 0x11, 0x0c, 0xdb, 0xc4, 0x80, 0xa0, - 0xb3, 0x70, 0x34, 0x19, 0x5d, 0x0b, 0xb6, 0x76, 0xdc, 0xb0, 0x2b, 0x64, 0x60, 0x93, 0x83, 0x13, - 0x08, 0x81, 0x1d, 0xba, 0x8c, 0x36, 0x0a, 0x2b, 0xd6, 0xe9, 0x02, 0x11, 0xcf, 0x9c, 0x5b, 0x46, - 0x7d, 0xd7, 0x67, 0x0d, 0x5b, 0x88, 0x53, 0x8d, 0x38, 0x9c, 0xeb, 0x97, 0x46, 0x8d, 0xe2, 0x8a, - 0x75, 0x7a, 0x9e, 0xa8, 0x11, 0xfe, 0x77, 0x01, 0x6a, 0xaf, 0x8e, 0x68, 0xb8, 0xab, 0x04, 0x80, - 0x9a, 0x50, 0x8e, 0x68, 0x9f, 0x76, 0x58, 0x10, 0x4a, 0x8d, 0xb4, 0xf3, 0x0d, 0x8b, 0xc4, 0x30, - 0x54, 0x87, 0x62, 0xdf, 0x1b, 0x78, 0x4c, 0x1c, 0x6b, 0x9e, 0xc8, 0x01, 0xba, 0x08, 0xc5, 0x88, - 0xb9, 0x21, 0x13, 0x67, 0xa9, 0x9e, 0x5f, 0x5e, 0x95, 0x86, 0xb9, 0xaa, 0x0d, 0x73, 0xf5, 0x86, - 0x36, 0xcc, 0x76, 0xf9, 0xfd, 0xb1, 0x93, 0x7b, 0xf7, 0xef, 0x8e, 0x45, 0xe4, 0x12, 0xf4, 0x34, - 0x14, 0xa8, 0xdf, 0x15, 0xe7, 0xfd, 0xbc, 0x2b, 0xf9, 0x02, 0x74, 0x0e, 0x2a, 0x5d, 0x2f, 0xa4, - 0x1d, 0xe6, 0x05, 0xbe, 0xe0, 0x6a, 0xe1, 0xfc, 0x52, 0xa2, 0x91, 0x75, 0x3d, 0x45, 0x12, 0x2c, - 0x74, 0x16, 0x4a, 0x11, 0x17, 0x5d, 0xd4, 0x98, 0xe3, 0xb6, 0xd0, 0xae, 0xef, 0x8f, 0x9d, 0x45, - 0x09, 0x39, 0x1b, 0x0c, 0x3c, 0x46, 0x07, 0x43, 0xb6, 0x4b, 0x14, 0x0e, 0x7a, 0x0c, 0xe6, 0xba, - 0xb4, 0x4f, 0xb9, 0xc2, 0xcb, 0x42, 0xe1, 0x8b, 0x06, 0x79, 0x31, 0x41, 0x34, 0x02, 0x7a, 0x13, - 0xec, 0x61, 0xdf, 0xf5, 0x1b, 0x15, 0xc1, 0xc5, 0x42, 0x82, 0x78, 0xbd, 0xef, 0xfa, 0xed, 0x67, - 0x3e, 0x1a, 0x3b, 0x4f, 0xf5, 0x3c, 0xb6, 0x33, 0xba, 0xb5, 0xda, 0x09, 0x06, 0xad, 0x5e, 0xe8, - 0x6e, 0xbb, 0xbe, 0xdb, 0xea, 0x07, 0xb7, 0xbd, 0xd6, 0xdb, 0x4f, 0xb6, 0xf8, 0x1d, 0xbc, 0x33, - 0xa2, 0xa1, 0x47, 0xc3, 0x16, 0x27, 0xb3, 0x2a, 0x54, 0xc2, 0x97, 0x12, 0x41, 0x16, 0x5d, 0xe5, - 0xf6, 0x17, 0x84, 0x74, 0x6d, 0x67, 0xe4, 0xdf, 0x8e, 0x1a, 0x20, 0x76, 0x39, 0x91, 0xec, 0x22, - 0xe0, 0x84, 0x6e, 0x6f, 0x84, 0xc1, 0x68, 0xd8, 0x3e, 0xb2, 0x3f, 0x76, 0x4c, 0x7c, 0x62, 0x0e, - 0xae, 0xda, 0xe5, 0xd2, 0xe2, 0x1c, 0x7e, 0xaf, 0x00, 0x68, 0xcb, 0x1d, 0x0c, 0xfb, 0x74, 0x26, - 0xf5, 0xc7, 0x8a, 0xce, 0x1f, 0x5a, 0xd1, 0x85, 0x59, 0x15, 0x9d, 0x68, 0xcd, 0x9e, 0x4d, 0x6b, - 0xc5, 0xcf, 0xab, 0xb5, 0xd2, 0xff, 0xbd, 0xd6, 0x70, 0x03, 0x6c, 0x4e, 0x99, 0x3b, 0xcb, 0xd0, - 0xbd, 0x2b, 0x74, 0x53, 0x23, 0xfc, 0x11, 0x6f, 0x42, 0x49, 0xf2, 0x85, 0x96, 0xb3, 0xca, 0x4b, - 0xdf, 0xdb, 0x44, 0x71, 0x05, 0xad, 0x92, 0xc5, 0x44, 0x25, 0x05, 0x21, 0x6c, 0xfc, 0x47, 0x0b, - 0xe6, 0x95, 0x45, 0x28, 0xdf, 0x77, 0x0b, 0xe6, 0xa4, 0xef, 0xd1, 0x7e, 0xef, 0x44, 0xd6, 0xef, - 0x5d, 0xea, 0xba, 0x43, 0x46, 0xc3, 0x76, 0xeb, 0xfd, 0xb1, 0x63, 0x7d, 0x34, 0x76, 0x1e, 0x9d, - 0x26, 0x34, 0x1d, 0x6b, 0xb4, 0xbf, 0xd4, 0x84, 0xd1, 0x19, 0x71, 0x3a, 0x16, 0x29, 0xb3, 0x3a, - 0xb2, 0x2a, 0x43, 0xd4, 0x15, 0xbf, 0x47, 0x23, 0x4e, 0xd9, 0xe6, 0x16, 0x41, 0x24, 0x0e, 0x67, - 0xf3, 0xae, 0x1b, 0xfa, 0x9e, 0xdf, 0x8b, 0x1a, 0x05, 0xe1, 0xd3, 0xe3, 0x31, 0xfe, 0xa9, 0x05, - 0x4b, 0x29, 0xb3, 0x56, 0x4c, 0x5c, 0x80, 0x52, 0xc4, 0x35, 0xa5, 0x79, 0x30, 0x8c, 0x62, 0x4b, - 0xc0, 0xdb, 0x0b, 0xea, 0xf0, 0x25, 0x39, 0x26, 0x0a, 0xff, 0xfe, 0x1d, 0xed, 0x2f, 0x16, 0xd4, - 0x44, 0x60, 0xd2, 0x77, 0x0d, 0x81, 0xed, 0xbb, 0x03, 0xaa, 0x54, 0x25, 0x9e, 0x8d, 0x68, 0xc5, - 0xb7, 0x2b, 0xeb, 0x68, 0x35, 0xab, 0x83, 0xb5, 0x0e, 0xed, 0x60, 0xad, 0xe4, 0xde, 0xd5, 0xa1, - 0xc8, 0xcd, 0x7b, 0x57, 0x38, 0xd7, 0x0a, 0x91, 0x03, 0xfc, 0x28, 0xcc, 0x2b, 0x2e, 0x94, 0x68, - 0xa7, 0x05, 0xd8, 0x01, 0x94, 0xa4, 0x26, 0xd0, 0x57, 0xa0, 0x12, 0x27, 0x26, 0x82, 0xdb, 0x42, - 0xbb, 0xb4, 0x3f, 0x76, 0xf2, 0x2c, 0x22, 0xc9, 0x04, 0x72, 0xcc, 0xa0, 0x6f, 0xb5, 0x2b, 0xfb, - 0x63, 0x47, 0x02, 0x54, 0x88, 0x47, 0xa7, 0xc0, 0xde, 0xe1, 0x71, 0x93, 0x8b, 0xc0, 0x6e, 0x97, - 0xf7, 0xc7, 0x8e, 0x18, 0x13, 0xf1, 0x8b, 0x37, 0xa0, 0xb6, 0x49, 0x7b, 0x6e, 0x67, 0x57, 0x6d, - 0x5a, 0xd7, 0xe4, 0xf8, 0x86, 0x96, 0xa6, 0xf1, 0x30, 0xd4, 0xe2, 0x1d, 0xdf, 0x1a, 0x44, 0xea, - 0x36, 0x54, 0x63, 0xd8, 0xcb, 0x11, 0xfe, 0x99, 0x05, 0xca, 0x06, 0x10, 0x36, 0xb2, 0x1d, 0xee, - 0x0b, 0x61, 0x7f, 0xec, 0x28, 0x88, 0x4e, 0x66, 0xd0, 0xb3, 0x30, 0x17, 0x89, 0x1d, 0x39, 0xb1, - 0xac, 0x69, 0x89, 0x89, 0xf6, 0x11, 0x6e, 0x22, 0xfb, 0x63, 0x47, 0x23, 0x12, 0xfd, 0x80, 0x56, - 0x53, 0x09, 0x81, 0x64, 0x6c, 0x61, 0x7f, 0xec, 0x18, 0x50, 0x33, 0x41, 0xc0, 0x9f, 0x59, 0x50, - 0xbd, 0xe1, 0x7a, 0xb1, 0x09, 0x35, 0xb4, 0x8a, 0x12, 0x5f, 0x2d, 0x01, 0xdc, 0x12, 0xbb, 0xb4, - 0xef, 0xee, 0x5e, 0x0e, 0x42, 0x41, 0x77, 0x9e, 0xc4, 0xe3, 0x24, 0x86, 0xdb, 0x13, 0x63, 0x78, - 0x71, 0x76, 0xd7, 0xfe, 0xbf, 0x75, 0xa4, 0x57, 0xed, 0x72, 0x7e, 0xb1, 0x80, 0xdf, 0xb3, 0xa0, - 0x26, 0x99, 0x57, 0x96, 0xf7, 0x3d, 0x28, 0x49, 0xd9, 0x08, 0xf6, 0xff, 0x8b, 0x63, 0x3a, 0x33, - 0x8b, 0x53, 0x52, 0x34, 0xd1, 0xf3, 0xb0, 0xd0, 0x0d, 0x83, 0xe1, 0x90, 0x76, 0xb7, 0x94, 0xfb, - 0xcb, 0x67, 0xdd, 0xdf, 0xba, 0x39, 0x4f, 0x32, 0xe8, 0xf8, 0xaf, 0x16, 0xcc, 0x2b, 0x67, 0xa2, - 0xd4, 0x15, 0x8b, 0xd8, 0x3a, 0x74, 0xf4, 0xcc, 0xcf, 0x1a, 0x3d, 0x8f, 0x43, 0xa9, 0xc7, 0xe3, - 0x8b, 0x76, 0x48, 0x6a, 0x34, 0x5b, 0x54, 0xc5, 0x57, 0x61, 0x41, 0xb3, 0x32, 0xc5, 0xa3, 0x2e, - 0x67, 0x3d, 0xea, 0x95, 0x2e, 0xf5, 0x99, 0xb7, 0xed, 0xc5, 0x3e, 0x52, 0xe1, 0xe3, 0x1f, 0x59, - 0xb0, 0x98, 0x45, 0x41, 0xeb, 0x99, 0xc2, 0xe2, 0x91, 0xe9, 0xe4, 0xcc, 0x9a, 0x42, 0x93, 0x56, - 0x95, 0xc5, 0x53, 0xf7, 0xaa, 0x2c, 0xea, 0xa6, 0x93, 0xa9, 0x28, 0xaf, 0x80, 0x7f, 0x62, 0xc1, - 0x7c, 0x4a, 0x97, 0xe8, 0x02, 0xd8, 0xdb, 0x61, 0x30, 0x98, 0x49, 0x51, 0x62, 0x05, 0xfa, 0x3a, - 0xe4, 0x59, 0x30, 0x93, 0x9a, 0xf2, 0x2c, 0xe0, 0x5a, 0x52, 0xec, 0x17, 0x64, 0xde, 0x2e, 0x47, - 0xf8, 0x29, 0xa8, 0x08, 0x86, 0xae, 0xbb, 0x5e, 0x38, 0x31, 0x60, 0x4c, 0x66, 0xe8, 0x59, 0x38, - 0x22, 0x9d, 0xe1, 0xe4, 0xc5, 0xb5, 0x49, 0x8b, 0x6b, 0x7a, 0xf1, 0x49, 0x28, 0x8a, 0xa4, 0x83, - 0x2f, 0xe9, 0xba, 0xcc, 0xd5, 0x4b, 0xf8, 0x33, 0x3e, 0x06, 0x4b, 0xfc, 0x0e, 0xd2, 0x30, 0x5a, - 0x0b, 0x46, 0x3e, 0xd3, 0x75, 0xd3, 0x59, 0xa8, 0xa7, 0xc1, 0xca, 0x4a, 0xea, 0x50, 0xec, 0x70, - 0x80, 0xa0, 0x31, 0x4f, 0xe4, 0x00, 0xff, 0xd2, 0x02, 0xb4, 0x41, 0x99, 0xd8, 0xe5, 0xca, 0x7a, - 0x7c, 0x3d, 0x96, 0xa1, 0x3c, 0x70, 0x59, 0x67, 0x87, 0x86, 0x91, 0xce, 0x5f, 0xf4, 0xf8, 0xcb, - 0x48, 0x3c, 0xf1, 0x39, 0x58, 0x4a, 0x9d, 0x52, 0xf1, 0xb4, 0x0c, 0xe5, 0x8e, 0x82, 0xa9, 0x90, - 0x17, 0x8f, 0xf1, 0xef, 0xf2, 0x50, 0xd6, 0x69, 0x1d, 0x3a, 0x07, 0xd5, 0x6d, 0xcf, 0xef, 0xd1, - 0x70, 0x18, 0x7a, 0x4a, 0x04, 0xb6, 0x4c, 0xf3, 0x0c, 0x30, 0x31, 0x07, 0xe8, 0x71, 0x98, 0x1b, - 0x45, 0x34, 0x7c, 0xcb, 0x93, 0x37, 0xbd, 0xd2, 0xae, 0xef, 0x8d, 0x9d, 0xd2, 0x6b, 0x11, 0x0d, - 0xaf, 0xac, 0xf3, 0xe0, 0x33, 0x12, 0x4f, 0x44, 0xfe, 0x77, 0xd1, 0x4b, 0xca, 0x4c, 0x45, 0x02, - 0xd7, 0xfe, 0x06, 0x3f, 0x7e, 0xc6, 0xd5, 0x0d, 0xc3, 0x60, 0x40, 0xd9, 0x0e, 0x1d, 0x45, 0xad, - 0x4e, 0x30, 0x18, 0x04, 0x7e, 0x4b, 0x74, 0x02, 0x04, 0xd3, 0x3c, 0x82, 0xf2, 0xe5, 0xca, 0x72, - 0x6f, 0xc0, 0x1c, 0xdb, 0x09, 0x83, 0x51, 0x6f, 0x47, 0x04, 0x86, 0x42, 0xfb, 0xe2, 0xec, 0xf4, - 0x34, 0x05, 0xa2, 0x1f, 0xd0, 0xc3, 0x5c, 0x5a, 0xb4, 0x73, 0x3b, 0x1a, 0x0d, 0x64, 0xed, 0xd9, - 0x2e, 0xee, 0x8f, 0x1d, 0xeb, 0x71, 0x12, 0x83, 0xf1, 0x25, 0x98, 0x4f, 0xa5, 0xc2, 0xe8, 0x09, - 0xb0, 0x43, 0xba, 0xad, 0x5d, 0x01, 0x3a, 0x98, 0x31, 0xcb, 0xe8, 0xcf, 0x71, 0x88, 0xf8, 0xc5, - 0x3f, 0xcc, 0x83, 0x63, 0x54, 0xfd, 0x97, 0x83, 0xf0, 0x65, 0xca, 0x42, 0xaf, 0x73, 0xcd, 0x1d, - 0x50, 0x6d, 0x5e, 0x0e, 0x54, 0x07, 0x02, 0xf8, 0x96, 0x71, 0x8b, 0x60, 0x10, 0xe3, 0xa1, 0x87, - 0x00, 0xc4, 0xb5, 0x93, 0xf3, 0xf2, 0x42, 0x55, 0x04, 0x44, 0x4c, 0xaf, 0xa5, 0x84, 0xdd, 0x9a, - 0x51, 0x38, 0x4a, 0xc8, 0x57, 0xb2, 0x42, 0x9e, 0x99, 0x4e, 0x2c, 0x59, 0xf3, 0xba, 0x14, 0xd3, - 0xd7, 0x05, 0xff, 0xcd, 0x82, 0xe6, 0xa6, 0x3e, 0xf9, 0x21, 0xc5, 0xa1, 0xf9, 0xcd, 0xdf, 0x27, - 0x7e, 0x0b, 0x5f, 0x8c, 0x5f, 0xdc, 0x04, 0xd8, 0xf4, 0x7c, 0x7a, 0xd9, 0xeb, 0x33, 0x1a, 0x4e, - 0x28, 0x84, 0x7e, 0x5c, 0x48, 0xbc, 0x0a, 0xa1, 0xdb, 0x9a, 0xcf, 0x35, 0xc3, 0x95, 0xdf, 0x0f, - 0x36, 0xf2, 0xf7, 0x51, 0x6d, 0x85, 0x8c, 0x97, 0xf3, 0x61, 0x6e, 0x5b, 0xb0, 0x27, 0xa3, 0x72, - 0xaa, 0xc7, 0x94, 0xf0, 0xde, 0xfe, 0x96, 0xda, 0xfc, 0xe9, 0x7b, 0x24, 0x55, 0xa2, 0xf3, 0xd7, - 0x8a, 0x76, 0x7d, 0xe6, 0xbe, 0x63, 0xac, 0x27, 0x7a, 0x13, 0xe4, 0xaa, 0xbc, 0xad, 0x38, 0x31, - 0x6f, 0x7b, 0x4e, 0x6d, 0xf3, 0x45, 0x72, 0x37, 0xfc, 0x5c, 0xe2, 0x44, 0x85, 0x52, 0x94, 0x13, - 0x7d, 0xe4, 0x5e, 0x57, 0x5c, 0x5d, 0xec, 0x3f, 0x59, 0xb0, 0xb8, 0x41, 0x59, 0x3a, 0x8f, 0x7a, - 0x80, 0x54, 0x8a, 0x5f, 0x84, 0xa3, 0xc6, 0xf9, 0x15, 0xf7, 0x4f, 0x66, 0x92, 0xa7, 0x63, 0x09, - 0xff, 0x57, 0xfc, 0x2e, 0x7d, 0x47, 0xd5, 0xa4, 0xe9, 0xbc, 0xe9, 0x3a, 0x54, 0x8d, 0x49, 0x74, - 0x29, 0x93, 0x31, 0x2d, 0x65, 0x5a, 0xb1, 0x3c, 0xea, 0xb7, 0xeb, 0x8a, 0x27, 0x59, 0x79, 0xaa, - 0x7c, 0x38, 0xce, 0x2e, 0xb6, 0x00, 0x09, 0x75, 0x09, 0xb2, 0x66, 0x7c, 0x13, 0xd0, 0x97, 0xe2, - 0xd4, 0x29, 0x1e, 0xa3, 0x87, 0xc1, 0x0e, 0x83, 0xbb, 0x3a, 0x15, 0x9e, 0x4f, 0xb6, 0x24, 0xc1, - 0x5d, 0x22, 0xa6, 0xf0, 0xb3, 0x50, 0x20, 0xc1, 0x5d, 0xd4, 0x04, 0x08, 0x5d, 0xbf, 0x47, 0x6f, - 0xc6, 0x45, 0x58, 0x8d, 0x18, 0x90, 0x29, 0xb9, 0xc7, 0x1a, 0x1c, 0x35, 0x4f, 0x24, 0xd5, 0xbd, - 0x0a, 0x73, 0xaf, 0x8e, 0x4c, 0x71, 0xd5, 0x33, 0xe2, 0x92, 0xb5, 0xbe, 0x46, 0xe2, 0x36, 0x03, - 0x09, 0x1c, 0x9d, 0x82, 0x0a, 0x73, 0x6f, 0xf5, 0xe9, 0xb5, 0xc4, 0xcd, 0x25, 0x00, 0x3e, 0xcb, - 0xeb, 0xc7, 0x9b, 0x46, 0x12, 0x95, 0x00, 0xd0, 0x63, 0xb0, 0x98, 0x9c, 0xf9, 0x7a, 0x48, 0xb7, - 0xbd, 0x77, 0x84, 0x86, 0x6b, 0xe4, 0x00, 0x1c, 0x9d, 0x86, 0x23, 0x09, 0x6c, 0x4b, 0x24, 0x2b, - 0xb6, 0x40, 0xcd, 0x82, 0xb9, 0x6c, 0x04, 0xbb, 0x2f, 0xdc, 0x19, 0xb9, 0x7d, 0x71, 0xf9, 0x6a, - 0xc4, 0x80, 0xe0, 0x3f, 0x5b, 0x70, 0x54, 0xaa, 0x9a, 0xb9, 0xec, 0x81, 0xb4, 0xfa, 0x5f, 0x59, - 0x80, 0x4c, 0x0e, 0x94, 0x69, 0x7d, 0xd5, 0xec, 0x25, 0xf1, 0x6c, 0xa8, 0x2a, 0xca, 0x62, 0x09, - 0x4a, 0xda, 0x41, 0x18, 0x4a, 0x1d, 0xd9, 0x33, 0x13, 0xcd, 0x6f, 0x59, 0x77, 0x4b, 0x08, 0x51, - 0xff, 0xc8, 0x81, 0xe2, 0xad, 0x5d, 0x46, 0x23, 0x55, 0x35, 0x8b, 0x76, 0x81, 0x00, 0x10, 0xf9, - 0xc7, 0xf7, 0xa2, 0x3e, 0x13, 0x56, 0x63, 0x27, 0x7b, 0x29, 0x10, 0xd1, 0x0f, 0xf8, 0xb7, 0x79, - 0x98, 0xbf, 0x19, 0xf4, 0x47, 0x49, 0x60, 0x7c, 0x90, 0x02, 0x46, 0xaa, 0x94, 0x2f, 0xea, 0x52, - 0x1e, 0x81, 0x1d, 0x31, 0x3a, 0x14, 0x96, 0x55, 0x20, 0xe2, 0x19, 0x61, 0xa8, 0x31, 0x37, 0xec, - 0x51, 0x26, 0x0b, 0xa4, 0x46, 0x49, 0x64, 0xae, 0x29, 0x18, 0x5a, 0x81, 0xaa, 0xdb, 0xeb, 0x85, - 0xb4, 0xe7, 0x32, 0xda, 0xde, 0x6d, 0xcc, 0x89, 0xcd, 0x4c, 0x10, 0x7e, 0x03, 0x16, 0xb4, 0xb0, - 0x94, 0x4a, 0x9f, 0x80, 0xb9, 0xb7, 0x05, 0x64, 0x42, 0x6b, 0x4d, 0xa2, 0x2a, 0x37, 0xa6, 0xd1, - 0xd2, 0xaf, 0x10, 0xf4, 0x99, 0xf1, 0x55, 0x28, 0x49, 0x74, 0x74, 0xca, 0x2c, 0x73, 0x64, 0xa6, - 0xc7, 0xc7, 0xaa, 0x66, 0xc1, 0x50, 0x92, 0x84, 0x94, 0xe2, 0x85, 0x6d, 0x48, 0x08, 0x51, 0xff, - 0xf8, 0x5f, 0x16, 0x1c, 0x5b, 0xa7, 0x8c, 0x76, 0x18, 0xed, 0x5e, 0xf6, 0x68, 0xbf, 0xfb, 0xa5, - 0x56, 0xe0, 0x71, 0x1f, 0xad, 0x60, 0xf4, 0xd1, 0xb8, 0xdf, 0xe9, 0x7b, 0x3e, 0xdd, 0x34, 0x1a, - 0x31, 0x09, 0x80, 0x7b, 0x88, 0x6d, 0x7e, 0x70, 0x39, 0x2d, 0xdf, 0xd9, 0x18, 0x90, 0x58, 0xc3, - 0xa5, 0x44, 0xc3, 0xf8, 0x07, 0x16, 0x1c, 0xcf, 0x72, 0xad, 0x94, 0xd4, 0x82, 0x92, 0x58, 0x3c, - 0xa1, 0x85, 0x9b, 0x5a, 0x41, 0x14, 0x1a, 0xba, 0x90, 0xda, 0x5f, 0xbc, 0xeb, 0x69, 0x37, 0xf6, - 0xc7, 0x4e, 0x3d, 0x81, 0x1a, 0x5d, 0x02, 0x03, 0x17, 0xff, 0x81, 0xd7, 0xd2, 0x26, 0x4d, 0xa1, - 0x6f, 0x6e, 0x5f, 0xca, 0xf7, 0xca, 0x01, 0xfa, 0x1a, 0xd8, 0x6c, 0x77, 0xa8, 0x5c, 0x6e, 0xfb, - 0xd8, 0x67, 0x63, 0xe7, 0x68, 0x6a, 0xd9, 0x8d, 0xdd, 0x21, 0x25, 0x02, 0x85, 0x9b, 0x65, 0xc7, - 0x0d, 0xbb, 0x9e, 0xef, 0xf6, 0x3d, 0x26, 0xc5, 0x68, 0x13, 0x13, 0x24, 0x5e, 0x6f, 0xb9, 0x61, - 0x44, 0x43, 0xfd, 0xda, 0x4b, 0x8e, 0x44, 0x93, 0xe3, 0x36, 0x65, 0x9d, 0x1d, 0xe9, 0x64, 0x55, - 0x93, 0x43, 0x40, 0x52, 0x4d, 0x0e, 0x01, 0xc1, 0xbf, 0x30, 0xcc, 0x46, 0xde, 0x88, 0x43, 0x9a, - 0x8d, 0x75, 0x68, 0xb3, 0xb1, 0xee, 0x61, 0x36, 0xf8, 0x3b, 0x89, 0x8e, 0xf5, 0x11, 0x95, 0x8e, - 0x9f, 0x87, 0x85, 0x6e, 0x6a, 0x66, 0xba, 0xae, 0x65, 0x03, 0x37, 0x83, 0x8e, 0x37, 0x12, 0xc5, - 0x09, 0xc8, 0x14, 0xc5, 0x65, 0xb4, 0x91, 0x3f, 0xa0, 0x8d, 0xc7, 0x1e, 0x81, 0x4a, 0xfc, 0xfa, - 0x0d, 0x55, 0x61, 0xee, 0xf2, 0x2b, 0xe4, 0xf5, 0x4b, 0x64, 0x7d, 0x31, 0x87, 0x6a, 0x50, 0x6e, - 0x5f, 0x5a, 0x7b, 0x49, 0x8c, 0xac, 0xf3, 0xbf, 0x29, 0xe9, 0xc0, 0x1e, 0xa2, 0x6f, 0x42, 0x51, - 0x46, 0xeb, 0xe3, 0xc9, 0x71, 0xcd, 0x37, 0x53, 0xcb, 0x27, 0x0e, 0xc0, 0x25, 0xdf, 0x38, 0xf7, - 0x84, 0x85, 0xae, 0x41, 0x55, 0x00, 0x55, 0xef, 0xf7, 0x54, 0xb6, 0x05, 0x9b, 0xa2, 0xf4, 0xd0, - 0x94, 0x59, 0x83, 0xde, 0x45, 0x28, 0x4a, 0x11, 0x1c, 0xcf, 0x24, 0x55, 0x13, 0x4e, 0x93, 0xea, - 0x86, 0xe3, 0x1c, 0x7a, 0x06, 0xec, 0x1b, 0xae, 0xd7, 0x47, 0x46, 0x4e, 0x67, 0xb4, 0x6c, 0x97, - 0x8f, 0x67, 0xc1, 0xc6, 0xb6, 0xcf, 0xc5, 0x9d, 0xe7, 0x13, 0xd9, 0xf6, 0x97, 0x5e, 0xde, 0x38, - 0x38, 0x11, 0xef, 0xfc, 0x8a, 0xec, 0x8f, 0xea, 0x26, 0x0c, 0x7a, 0x28, 0xbd, 0x55, 0xa6, 0x67, - 0xb3, 0xdc, 0x9c, 0x36, 0x1d, 0x13, 0xdc, 0x84, 0xaa, 0xd1, 0x00, 0x31, 0xc5, 0x7a, 0xb0, 0x7b, - 0x63, 0x8a, 0x75, 0x42, 0xd7, 0x04, 0xe7, 0xd0, 0x06, 0x94, 0x79, 0x26, 0x2c, 0x5e, 0x94, 0x9c, - 0xcc, 0x26, 0xbc, 0x46, 0xa2, 0xb3, 0x7c, 0x6a, 0xf2, 0x64, 0x4c, 0xe8, 0xdb, 0x50, 0xd9, 0xa0, - 0x4c, 0x45, 0x8b, 0x13, 0xd9, 0x70, 0x33, 0x41, 0x52, 0xe9, 0x90, 0x85, 0x73, 0xe8, 0x0d, 0x91, - 0x94, 0xa7, 0x9d, 0x25, 0x72, 0xa6, 0x38, 0xc5, 0xf8, 0x5c, 0x2b, 0xd3, 0x11, 0x62, 0xca, 0xaf, - 0xa7, 0x28, 0xab, 0xb8, 0xea, 0x4c, 0xb9, 0x82, 0x31, 0x65, 0xe7, 0x1e, 0x9f, 0x51, 0xe0, 0xdc, - 0xf9, 0x37, 0xf5, 0x97, 0x04, 0xeb, 0x2e, 0x73, 0xd1, 0x2b, 0xb0, 0x20, 0x64, 0x19, 0x7f, 0x6a, - 0x90, 0xb2, 0xf9, 0x03, 0xdf, 0x35, 0xa4, 0x6c, 0xfe, 0xe0, 0xf7, 0x0d, 0x38, 0xd7, 0x7e, 0xf3, - 0x83, 0x8f, 0x9b, 0xb9, 0x0f, 0x3f, 0x6e, 0xe6, 0x3e, 0xfd, 0xb8, 0x69, 0x7d, 0x7f, 0xaf, 0x69, - 0xfd, 0x7a, 0xaf, 0x69, 0xbd, 0xbf, 0xd7, 0xb4, 0x3e, 0xd8, 0x6b, 0x5a, 0xff, 0xd8, 0x6b, 0x5a, - 0xff, 0xdc, 0x6b, 0xe6, 0x3e, 0xdd, 0x6b, 0x5a, 0xef, 0x7e, 0xd2, 0xcc, 0x7d, 0xf0, 0x49, 0x33, - 0xf7, 0xe1, 0x27, 0xcd, 0xdc, 0x77, 0x1f, 0xbd, 0x77, 0x01, 0x2a, 0x1d, 0x5d, 0x49, 0xfc, 0x3d, - 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x82, 0x5c, 0x85, 0xa1, 0xef, 0x22, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4f, 0x8c, 0x1b, 0x57, + 0xf9, 0x1e, 0x7b, 0xec, 0xb5, 0x3f, 0x7b, 0x37, 0x9b, 0xb7, 0x4e, 0x62, 0x6d, 0x52, 0xcf, 0xf6, + 0xe9, 0xf7, 0x6b, 0x43, 0x93, 0xae, 0x9b, 0x94, 0x96, 0x34, 0xa5, 0x94, 0x78, 0xb7, 0x49, 0x93, + 0x6e, 0xd3, 0xf4, 0x6d, 0x9a, 0x16, 0x44, 0x55, 0x4d, 0xec, 0xb7, 0xde, 0x51, 0xec, 0x19, 0x67, + 0xe6, 0xb9, 0xa9, 0x6f, 0x48, 0x9c, 0x11, 0x95, 0x38, 0x00, 0x17, 0x24, 0x24, 0x24, 0x10, 0xa8, + 0x17, 0xc4, 0x81, 0x03, 0x82, 0x0b, 0x87, 0x72, 0x2b, 0xb7, 0xaa, 0x07, 0x43, 0xb7, 0x17, 0xb4, + 0xa7, 0x4a, 0x48, 0x1c, 0x7a, 0x42, 0xef, 0xdf, 0xcc, 0x9b, 0x59, 0x9b, 0xd4, 0x69, 0x50, 0x9b, + 0x8b, 0x3d, 0xef, 0x7b, 0xdf, 0xfb, 0xde, 0xfb, 0xfe, 0xbc, 0xef, 0xdf, 0x0c, 0x1c, 0x1f, 0xde, + 0xea, 0xb5, 0xfa, 0x41, 0x6f, 0x18, 0x06, 0x2c, 0x88, 0x1f, 0xd6, 0xc5, 0x2f, 0x2a, 0xeb, 0xf1, + 0x6a, 0xbd, 0x17, 0xf4, 0x02, 0x89, 0xc3, 0x9f, 0xe4, 0xfc, 0xaa, 0xd3, 0x0b, 0x82, 0x5e, 0x9f, + 0xb6, 0xc4, 0xe8, 0xe6, 0x68, 0xa7, 0xc5, 0xbc, 0x01, 0x8d, 0x98, 0x3b, 0x18, 0x2a, 0x84, 0x35, + 0x45, 0xfd, 0x76, 0x7f, 0x10, 0x74, 0x69, 0xbf, 0x15, 0x31, 0x97, 0x45, 0xf2, 0x57, 0x61, 0xac, + 0x70, 0x8c, 0xe1, 0x28, 0xda, 0x15, 0x3f, 0x12, 0x88, 0x7f, 0x6f, 0xc1, 0x91, 0x2d, 0xf7, 0x26, + 0xed, 0x5f, 0x0f, 0x6e, 0xb8, 0xfd, 0x11, 0x8d, 0x08, 0x8d, 0x86, 0x81, 0x1f, 0x51, 0xb4, 0x01, + 0xa5, 0x3e, 0x9f, 0x88, 0x1a, 0xd6, 0x5a, 0xe1, 0x64, 0xf5, 0xec, 0xa9, 0xf5, 0xf8, 0xc8, 0x53, + 0x17, 0x48, 0x68, 0xf4, 0x82, 0xcf, 0xc2, 0x31, 0x51, 0x4b, 0x57, 0x6f, 0x40, 0xd5, 0x00, 0xa3, + 0x65, 0x28, 0xdc, 0xa2, 0xe3, 0x86, 0xb5, 0x66, 0x9d, 0xac, 0x10, 0xfe, 0x88, 0xce, 0x40, 0xf1, + 0x6d, 0x4e, 0xa6, 0x91, 0x5f, 0xb3, 0x4e, 0x56, 0xcf, 0x1e, 0x4f, 0x36, 0x79, 0xcd, 0xf7, 0x6e, + 0x8f, 0xa8, 0x58, 0xad, 0x36, 0x92, 0x98, 0xe7, 0xf3, 0xe7, 0x2c, 0x7c, 0x0a, 0x0e, 0x1f, 0x98, + 0x47, 0x47, 0xa1, 0x24, 0x30, 0xe4, 0x89, 0x2b, 0x44, 0x8d, 0x70, 0x1d, 0xd0, 0x36, 0x0b, 0xa9, + 0x3b, 0x20, 0x2e, 0xe3, 0xe7, 0xbd, 0x3d, 0xa2, 0x11, 0xc3, 0x2f, 0xc3, 0x4a, 0x0a, 0xaa, 0xd8, + 0x7e, 0x1a, 0xaa, 0x51, 0x02, 0x56, 0xbc, 0xd7, 0x93, 0x63, 0x25, 0x6b, 0x88, 0x89, 0x88, 0x7f, + 0x6e, 0x01, 0x24, 0x73, 0xa8, 0x09, 0x20, 0x67, 0x5f, 0x74, 0xa3, 0x5d, 0xc1, 0xb0, 0x4d, 0x0c, + 0x08, 0x3a, 0x0d, 0x87, 0x93, 0xd1, 0xd5, 0x60, 0x7b, 0xd7, 0x0d, 0xbb, 0x42, 0x06, 0x36, 0x39, + 0x38, 0x81, 0x10, 0xd8, 0xa1, 0xcb, 0x68, 0xa3, 0xb0, 0x66, 0x9d, 0x2c, 0x10, 0xf1, 0xcc, 0xb9, + 0x65, 0xd4, 0x77, 0x7d, 0xd6, 0xb0, 0x85, 0x38, 0xd5, 0x88, 0xc3, 0xb9, 0x7e, 0x69, 0xd4, 0x28, + 0xae, 0x59, 0x27, 0x17, 0x89, 0x1a, 0xe1, 0x7f, 0x17, 0xa0, 0xf6, 0xea, 0x88, 0x86, 0x63, 0x25, + 0x00, 0xd4, 0x84, 0x72, 0x44, 0xfb, 0xb4, 0xc3, 0x82, 0x50, 0x6a, 0xa4, 0x9d, 0x6f, 0x58, 0x24, + 0x86, 0xa1, 0x3a, 0x14, 0xfb, 0xde, 0xc0, 0x63, 0xe2, 0x58, 0x8b, 0x44, 0x0e, 0xd0, 0x79, 0x28, + 0x46, 0xcc, 0x0d, 0x99, 0x38, 0x4b, 0xf5, 0xec, 0xea, 0xba, 0x34, 0xcc, 0x75, 0x6d, 0x98, 0xeb, + 0xd7, 0xb5, 0x61, 0xb6, 0xcb, 0xef, 0x4f, 0x9c, 0xdc, 0xbb, 0x7f, 0x77, 0x2c, 0x22, 0x97, 0xa0, + 0xa7, 0xa1, 0x40, 0xfd, 0xae, 0x38, 0xef, 0xe7, 0x5d, 0xc9, 0x17, 0xa0, 0x33, 0x50, 0xe9, 0x7a, + 0x21, 0xed, 0x30, 0x2f, 0xf0, 0x05, 0x57, 0x4b, 0x67, 0x57, 0x12, 0x8d, 0x6c, 0xea, 0x29, 0x92, + 0x60, 0xa1, 0xd3, 0x50, 0x8a, 0xb8, 0xe8, 0xa2, 0xc6, 0x02, 0xb7, 0x85, 0x76, 0x7d, 0x7f, 0xe2, + 0x2c, 0x4b, 0xc8, 0xe9, 0x60, 0xe0, 0x31, 0x3a, 0x18, 0xb2, 0x31, 0x51, 0x38, 0xe8, 0x31, 0x58, + 0xe8, 0xd2, 0x3e, 0xe5, 0x0a, 0x2f, 0x0b, 0x85, 0x2f, 0x1b, 0xe4, 0xc5, 0x04, 0xd1, 0x08, 0xe8, + 0x4d, 0xb0, 0x87, 0x7d, 0xd7, 0x6f, 0x54, 0x04, 0x17, 0x4b, 0x09, 0xe2, 0xb5, 0xbe, 0xeb, 0xb7, + 0x9f, 0xf9, 0x68, 0xe2, 0x3c, 0xd5, 0xf3, 0xd8, 0xee, 0xe8, 0xe6, 0x7a, 0x27, 0x18, 0xb4, 0x7a, + 0xa1, 0xbb, 0xe3, 0xfa, 0x6e, 0xab, 0x1f, 0xdc, 0xf2, 0x5a, 0x6f, 0x3f, 0xd9, 0xe2, 0x77, 0xf0, + 0xf6, 0x88, 0x86, 0x1e, 0x0d, 0x5b, 0x9c, 0xcc, 0xba, 0x50, 0x09, 0x5f, 0x4a, 0x04, 0x59, 0x74, + 0x85, 0xdb, 0x5f, 0x10, 0xd2, 0x8d, 0xdd, 0x91, 0x7f, 0x2b, 0x6a, 0x80, 0xd8, 0xe5, 0x58, 0xb2, + 0x8b, 0x80, 0x13, 0xba, 0x73, 0x29, 0x0c, 0x46, 0xc3, 0xf6, 0xa1, 0xfd, 0x89, 0x63, 0xe2, 0x13, + 0x73, 0x70, 0xc5, 0x2e, 0x97, 0x96, 0x17, 0xf0, 0x7b, 0x05, 0x40, 0xdb, 0xee, 0x60, 0xd8, 0xa7, + 0x73, 0xa9, 0x3f, 0x56, 0x74, 0xfe, 0x9e, 0x15, 0x5d, 0x98, 0x57, 0xd1, 0x89, 0xd6, 0xec, 0xf9, + 0xb4, 0x56, 0xfc, 0xbc, 0x5a, 0x2b, 0x7d, 0xe5, 0xb5, 0x86, 0x1b, 0x60, 0x73, 0xca, 0xdc, 0x59, + 0x86, 0xee, 0x1d, 0xa1, 0x9b, 0x1a, 0xe1, 0x8f, 0x78, 0x0b, 0x4a, 0x92, 0x2f, 0xb4, 0x9a, 0x55, + 0x5e, 0xfa, 0xde, 0x26, 0x8a, 0x2b, 0x68, 0x95, 0x2c, 0x27, 0x2a, 0x29, 0x08, 0x61, 0xe3, 0x3f, + 0x5a, 0xb0, 0xa8, 0x2c, 0x42, 0xf9, 0xbe, 0x9b, 0xb0, 0x20, 0x7d, 0x8f, 0xf6, 0x7b, 0xc7, 0xb2, + 0x7e, 0xef, 0x42, 0xd7, 0x1d, 0x32, 0x1a, 0xb6, 0x5b, 0xef, 0x4f, 0x1c, 0xeb, 0xa3, 0x89, 0xf3, + 0xe8, 0x2c, 0xa1, 0xe9, 0x58, 0xa3, 0xfd, 0xa5, 0x26, 0x8c, 0x4e, 0x89, 0xd3, 0xb1, 0x48, 0x99, + 0xd5, 0xa1, 0x75, 0x19, 0xa2, 0x2e, 0xfb, 0x3d, 0x1a, 0x71, 0xca, 0x36, 0xb7, 0x08, 0x22, 0x71, + 0x38, 0x9b, 0x77, 0xdc, 0xd0, 0xf7, 0xfc, 0x5e, 0xd4, 0x28, 0x08, 0x9f, 0x1e, 0x8f, 0xf1, 0x4f, + 0x2d, 0x58, 0x49, 0x99, 0xb5, 0x62, 0xe2, 0x1c, 0x94, 0x22, 0xae, 0x29, 0xcd, 0x83, 0x61, 0x14, + 0xdb, 0x02, 0xde, 0x5e, 0x52, 0x87, 0x2f, 0xc9, 0x31, 0x51, 0xf8, 0xf7, 0xef, 0x68, 0x7f, 0xb1, + 0xa0, 0x26, 0x02, 0x93, 0xbe, 0x6b, 0x08, 0x6c, 0xdf, 0x1d, 0x50, 0xa5, 0x2a, 0xf1, 0x6c, 0x44, + 0x2b, 0xbe, 0x5d, 0x59, 0x47, 0xab, 0x79, 0x1d, 0xac, 0x75, 0xcf, 0x0e, 0xd6, 0x4a, 0xee, 0x5d, + 0x1d, 0x8a, 0xdc, 0xbc, 0xc7, 0xc2, 0xb9, 0x56, 0x88, 0x1c, 0xe0, 0x47, 0x61, 0x51, 0x71, 0xa1, + 0x44, 0x3b, 0x2b, 0xc0, 0x0e, 0xa0, 0x24, 0x35, 0x81, 0xfe, 0x0f, 0x2a, 0x71, 0x62, 0x22, 0xb8, + 0x2d, 0xb4, 0x4b, 0xfb, 0x13, 0x27, 0xcf, 0x22, 0x92, 0x4c, 0x20, 0xc7, 0x0c, 0xfa, 0x56, 0xbb, + 0xb2, 0x3f, 0x71, 0x24, 0x40, 0x85, 0x78, 0x74, 0x02, 0xec, 0x5d, 0x1e, 0x37, 0xb9, 0x08, 0xec, + 0x76, 0x79, 0x7f, 0xe2, 0x88, 0x31, 0x11, 0xbf, 0xf8, 0x12, 0xd4, 0xb6, 0x68, 0xcf, 0xed, 0x8c, + 0xd5, 0xa6, 0x75, 0x4d, 0x8e, 0x6f, 0x68, 0x69, 0x1a, 0x0f, 0x43, 0x2d, 0xde, 0xf1, 0xad, 0x41, + 0xa4, 0x6e, 0x43, 0x35, 0x86, 0xbd, 0x1c, 0xe1, 0x9f, 0x59, 0xa0, 0x6c, 0x00, 0x61, 0x23, 0xdb, + 0xe1, 0xbe, 0x10, 0xf6, 0x27, 0x8e, 0x82, 0xe8, 0x64, 0x06, 0x3d, 0x0b, 0x0b, 0x91, 0xd8, 0x91, + 0x13, 0xcb, 0x9a, 0x96, 0x98, 0x68, 0x1f, 0xe2, 0x26, 0xb2, 0x3f, 0x71, 0x34, 0x22, 0xd1, 0x0f, + 0x68, 0x3d, 0x95, 0x10, 0x48, 0xc6, 0x96, 0xf6, 0x27, 0x8e, 0x01, 0x35, 0x13, 0x04, 0xfc, 0x99, + 0x05, 0xd5, 0xeb, 0xae, 0x17, 0x9b, 0x50, 0x43, 0xab, 0x28, 0xf1, 0xd5, 0x12, 0xc0, 0x2d, 0xb1, + 0x4b, 0xfb, 0xee, 0xf8, 0x62, 0x10, 0x0a, 0xba, 0x8b, 0x24, 0x1e, 0x27, 0x31, 0xdc, 0x9e, 0x1a, + 0xc3, 0x8b, 0xf3, 0xbb, 0xf6, 0xff, 0xad, 0x23, 0xbd, 0x62, 0x97, 0xf3, 0xcb, 0x05, 0xfc, 0x9e, + 0x05, 0x35, 0xc9, 0xbc, 0xb2, 0xbc, 0xef, 0x41, 0x49, 0xca, 0x46, 0xb0, 0xff, 0x5f, 0x1c, 0xd3, + 0xa9, 0x79, 0x9c, 0x92, 0xa2, 0x89, 0x9e, 0x87, 0xa5, 0x6e, 0x18, 0x0c, 0x87, 0xb4, 0xbb, 0xad, + 0xdc, 0x5f, 0x3e, 0xeb, 0xfe, 0x36, 0xcd, 0x79, 0x92, 0x41, 0xc7, 0x7f, 0xb5, 0x60, 0x51, 0x39, + 0x13, 0xa5, 0xae, 0x58, 0xc4, 0xd6, 0x3d, 0x47, 0xcf, 0xfc, 0xbc, 0xd1, 0xf3, 0x28, 0x94, 0x7a, + 0x3c, 0xbe, 0x68, 0x87, 0xa4, 0x46, 0xf3, 0x45, 0x55, 0x7c, 0x05, 0x96, 0x34, 0x2b, 0x33, 0x3c, + 0xea, 0x6a, 0xd6, 0xa3, 0x5e, 0xee, 0x52, 0x9f, 0x79, 0x3b, 0x5e, 0xec, 0x23, 0x15, 0x3e, 0xfe, + 0x91, 0x05, 0xcb, 0x59, 0x14, 0xb4, 0x99, 0x29, 0x2c, 0x1e, 0x99, 0x4d, 0xce, 0xac, 0x29, 0x34, + 0x69, 0x55, 0x59, 0x3c, 0x75, 0xb7, 0xca, 0xa2, 0x6e, 0x3a, 0x99, 0x8a, 0xf2, 0x0a, 0xf8, 0x27, + 0x16, 0x2c, 0xa6, 0x74, 0x89, 0xce, 0x81, 0xbd, 0x13, 0x06, 0x83, 0xb9, 0x14, 0x25, 0x56, 0xa0, + 0xaf, 0x43, 0x9e, 0x05, 0x73, 0xa9, 0x29, 0xcf, 0x02, 0xae, 0x25, 0xc5, 0x7e, 0x41, 0xe6, 0xed, + 0x72, 0x84, 0x9f, 0x82, 0x8a, 0x60, 0xe8, 0x9a, 0xeb, 0x85, 0x53, 0x03, 0xc6, 0x74, 0x86, 0x9e, + 0x85, 0x43, 0xd2, 0x19, 0x4e, 0x5f, 0x5c, 0x9b, 0xb6, 0xb8, 0xa6, 0x17, 0x1f, 0x87, 0xa2, 0x48, + 0x3a, 0xf8, 0x92, 0xae, 0xcb, 0x5c, 0xbd, 0x84, 0x3f, 0xe3, 0x23, 0xb0, 0xc2, 0xef, 0x20, 0x0d, + 0xa3, 0x8d, 0x60, 0xe4, 0x33, 0x5d, 0x37, 0x9d, 0x86, 0x7a, 0x1a, 0xac, 0xac, 0xa4, 0x0e, 0xc5, + 0x0e, 0x07, 0x08, 0x1a, 0x8b, 0x44, 0x0e, 0xf0, 0x2f, 0x2d, 0x40, 0x97, 0x28, 0x13, 0xbb, 0x5c, + 0xde, 0x8c, 0xaf, 0xc7, 0x2a, 0x94, 0x07, 0x2e, 0xeb, 0xec, 0xd2, 0x30, 0xd2, 0xf9, 0x8b, 0x1e, + 0x7f, 0x19, 0x89, 0x27, 0x3e, 0x03, 0x2b, 0xa9, 0x53, 0x2a, 0x9e, 0x56, 0xa1, 0xdc, 0x51, 0x30, + 0x15, 0xf2, 0xe2, 0x31, 0xfe, 0x5d, 0x1e, 0xca, 0x3a, 0xad, 0x43, 0x67, 0xa0, 0xba, 0xe3, 0xf9, + 0x3d, 0x1a, 0x0e, 0x43, 0x4f, 0x89, 0xc0, 0x96, 0x69, 0x9e, 0x01, 0x26, 0xe6, 0x00, 0x3d, 0x0e, + 0x0b, 0xa3, 0x88, 0x86, 0x6f, 0x79, 0xf2, 0xa6, 0x57, 0xda, 0xf5, 0xbd, 0x89, 0x53, 0x7a, 0x2d, + 0xa2, 0xe1, 0xe5, 0x4d, 0x1e, 0x7c, 0x46, 0xe2, 0x89, 0xc8, 0xff, 0x2e, 0x7a, 0x49, 0x99, 0xa9, + 0x48, 0xe0, 0xda, 0xdf, 0xe0, 0xc7, 0xcf, 0xb8, 0xba, 0x61, 0x18, 0x0c, 0x28, 0xdb, 0xa5, 0xa3, + 0xa8, 0xd5, 0x09, 0x06, 0x83, 0xc0, 0x6f, 0x89, 0x4e, 0x80, 0x60, 0x9a, 0x47, 0x50, 0xbe, 0x5c, + 0x59, 0xee, 0x75, 0x58, 0x60, 0xbb, 0x61, 0x30, 0xea, 0xed, 0x8a, 0xc0, 0x50, 0x68, 0x9f, 0x9f, + 0x9f, 0x9e, 0xa6, 0x40, 0xf4, 0x03, 0x7a, 0x98, 0x4b, 0x8b, 0x76, 0x6e, 0x45, 0xa3, 0x81, 0xac, + 0x3d, 0xdb, 0xc5, 0xfd, 0x89, 0x63, 0x3d, 0x4e, 0x62, 0x30, 0xbe, 0x00, 0x8b, 0xa9, 0x54, 0x18, + 0x3d, 0x01, 0x76, 0x48, 0x77, 0xb4, 0x2b, 0x40, 0x07, 0x33, 0x66, 0x19, 0xfd, 0x39, 0x0e, 0x11, + 0xbf, 0xf8, 0x87, 0x79, 0x70, 0x8c, 0xaa, 0xff, 0x62, 0x10, 0xbe, 0x4c, 0x59, 0xe8, 0x75, 0xae, + 0xba, 0x03, 0xaa, 0xcd, 0xcb, 0x81, 0xea, 0x40, 0x00, 0xdf, 0x32, 0x6e, 0x11, 0x0c, 0x62, 0x3c, + 0xf4, 0x10, 0x80, 0xb8, 0x76, 0x72, 0x5e, 0x5e, 0xa8, 0x8a, 0x80, 0x88, 0xe9, 0x8d, 0x94, 0xb0, + 0x5b, 0x73, 0x0a, 0x47, 0x09, 0xf9, 0x72, 0x56, 0xc8, 0x73, 0xd3, 0x89, 0x25, 0x6b, 0x5e, 0x97, + 0x62, 0xfa, 0xba, 0xe0, 0xbf, 0x59, 0xd0, 0xdc, 0xd2, 0x27, 0xbf, 0x47, 0x71, 0x68, 0x7e, 0xf3, + 0xf7, 0x89, 0xdf, 0xc2, 0x17, 0xe3, 0x17, 0x37, 0x01, 0xb6, 0x3c, 0x9f, 0x5e, 0xf4, 0xfa, 0x8c, + 0x86, 0x53, 0x0a, 0xa1, 0x1f, 0x17, 0x12, 0xaf, 0x42, 0xe8, 0x8e, 0xe6, 0x73, 0xc3, 0x70, 0xe5, + 0xf7, 0x83, 0x8d, 0xfc, 0x7d, 0x54, 0x5b, 0x21, 0xe3, 0xe5, 0x7c, 0x58, 0xd8, 0x11, 0xec, 0xc9, + 0xa8, 0x9c, 0xea, 0x31, 0x25, 0xbc, 0xb7, 0xbf, 0xa5, 0x36, 0x7f, 0xfa, 0x2e, 0x49, 0x95, 0xe8, + 0xfc, 0xb5, 0xa2, 0xb1, 0xcf, 0xdc, 0x77, 0x8c, 0xf5, 0x44, 0x6f, 0x82, 0x5c, 0x95, 0xb7, 0x15, + 0xa7, 0xe6, 0x6d, 0xcf, 0xa9, 0x6d, 0xbe, 0x48, 0xee, 0x86, 0x9f, 0x4b, 0x9c, 0xa8, 0x50, 0x8a, + 0x72, 0xa2, 0x8f, 0xdc, 0xed, 0x8a, 0xab, 0x8b, 0xfd, 0x27, 0x0b, 0x96, 0x2f, 0x51, 0x96, 0xce, + 0xa3, 0x1e, 0x20, 0x95, 0xe2, 0x17, 0xe1, 0xb0, 0x71, 0x7e, 0xc5, 0xfd, 0x93, 0x99, 0xe4, 0xe9, + 0x48, 0xc2, 0xff, 0x65, 0xbf, 0x4b, 0xdf, 0x51, 0x35, 0x69, 0x3a, 0x6f, 0xba, 0x06, 0x55, 0x63, + 0x12, 0x5d, 0xc8, 0x64, 0x4c, 0x2b, 0x99, 0x56, 0x2c, 0x8f, 0xfa, 0xed, 0xba, 0xe2, 0x49, 0x56, + 0x9e, 0x2a, 0x1f, 0x8e, 0xb3, 0x8b, 0x6d, 0x40, 0x42, 0x5d, 0x82, 0xac, 0x19, 0xdf, 0x04, 0xf4, + 0xa5, 0x38, 0x75, 0x8a, 0xc7, 0xe8, 0x61, 0xb0, 0xc3, 0xe0, 0x8e, 0x4e, 0x85, 0x17, 0x93, 0x2d, + 0x49, 0x70, 0x87, 0x88, 0x29, 0xfc, 0x2c, 0x14, 0x48, 0x70, 0x07, 0x35, 0x01, 0x42, 0xd7, 0xef, + 0xd1, 0x1b, 0x71, 0x11, 0x56, 0x23, 0x06, 0x64, 0x46, 0xee, 0xb1, 0x01, 0x87, 0xcd, 0x13, 0x49, + 0x75, 0xaf, 0xc3, 0xc2, 0xab, 0x23, 0x53, 0x5c, 0xf5, 0x8c, 0xb8, 0x64, 0xad, 0xaf, 0x91, 0xb8, + 0xcd, 0x40, 0x02, 0x47, 0x27, 0xa0, 0xc2, 0xdc, 0x9b, 0x7d, 0x7a, 0x35, 0x71, 0x73, 0x09, 0x80, + 0xcf, 0xf2, 0xfa, 0xf1, 0x86, 0x91, 0x44, 0x25, 0x00, 0xf4, 0x18, 0x2c, 0x27, 0x67, 0xbe, 0x16, + 0xd2, 0x1d, 0xef, 0x1d, 0xa1, 0xe1, 0x1a, 0x39, 0x00, 0x47, 0x27, 0xe1, 0x50, 0x02, 0xdb, 0x16, + 0xc9, 0x8a, 0x2d, 0x50, 0xb3, 0x60, 0x2e, 0x1b, 0xc1, 0xee, 0x0b, 0xb7, 0x47, 0x6e, 0x5f, 0x5c, + 0xbe, 0x1a, 0x31, 0x20, 0xf8, 0xcf, 0x16, 0x1c, 0x96, 0xaa, 0x66, 0x2e, 0x7b, 0x20, 0xad, 0xfe, + 0x57, 0x16, 0x20, 0x93, 0x03, 0x65, 0x5a, 0xff, 0x6f, 0xf6, 0x92, 0x78, 0x36, 0x54, 0x15, 0x65, + 0xb1, 0x04, 0x25, 0xed, 0x20, 0x0c, 0xa5, 0x8e, 0xec, 0x99, 0x89, 0xe6, 0xb7, 0xac, 0xbb, 0x25, + 0x84, 0xa8, 0x7f, 0xe4, 0x40, 0xf1, 0xe6, 0x98, 0xd1, 0x48, 0x55, 0xcd, 0xa2, 0x5d, 0x20, 0x00, + 0x44, 0xfe, 0xf1, 0xbd, 0xa8, 0xcf, 0x84, 0xd5, 0xd8, 0xc9, 0x5e, 0x0a, 0x44, 0xf4, 0x03, 0xfe, + 0x6d, 0x1e, 0x16, 0x6f, 0x04, 0xfd, 0x51, 0x12, 0x18, 0x1f, 0xa4, 0x80, 0x91, 0x2a, 0xe5, 0x8b, + 0xba, 0x94, 0x47, 0x60, 0x47, 0x8c, 0x0e, 0x85, 0x65, 0x15, 0x88, 0x78, 0x46, 0x18, 0x6a, 0xcc, + 0x0d, 0x7b, 0x94, 0xc9, 0x02, 0xa9, 0x51, 0x12, 0x99, 0x6b, 0x0a, 0x86, 0xd6, 0xa0, 0xea, 0xf6, + 0x7a, 0x21, 0xed, 0xb9, 0x8c, 0xb6, 0xc7, 0x8d, 0x05, 0xb1, 0x99, 0x09, 0xc2, 0x6f, 0xc0, 0x92, + 0x16, 0x96, 0x52, 0xe9, 0x13, 0xb0, 0xf0, 0xb6, 0x80, 0x4c, 0x69, 0xad, 0x49, 0x54, 0xe5, 0xc6, + 0x34, 0x5a, 0xfa, 0x15, 0x82, 0x3e, 0x33, 0xbe, 0x02, 0x25, 0x89, 0x8e, 0x4e, 0x98, 0x65, 0x8e, + 0xcc, 0xf4, 0xf8, 0x58, 0xd5, 0x2c, 0x18, 0x4a, 0x92, 0x90, 0x52, 0xbc, 0xb0, 0x0d, 0x09, 0x21, + 0xea, 0x1f, 0xff, 0xcb, 0x82, 0x23, 0x9b, 0x94, 0xd1, 0x0e, 0xa3, 0xdd, 0x8b, 0x1e, 0xed, 0x77, + 0xbf, 0xd4, 0x0a, 0x3c, 0xee, 0xa3, 0x15, 0x8c, 0x3e, 0x1a, 0xf7, 0x3b, 0x7d, 0xcf, 0xa7, 0x5b, + 0x46, 0x23, 0x26, 0x01, 0x70, 0x0f, 0xb1, 0xc3, 0x0f, 0x2e, 0xa7, 0xe5, 0x3b, 0x1b, 0x03, 0x12, + 0x6b, 0xb8, 0x94, 0x68, 0x18, 0xff, 0xc0, 0x82, 0xa3, 0x59, 0xae, 0x95, 0x92, 0x5a, 0x50, 0x12, + 0x8b, 0xa7, 0xb4, 0x70, 0x53, 0x2b, 0x88, 0x42, 0x43, 0xe7, 0x52, 0xfb, 0x8b, 0x77, 0x3d, 0xed, + 0xc6, 0xfe, 0xc4, 0xa9, 0x27, 0x50, 0xa3, 0x4b, 0x60, 0xe0, 0xe2, 0x3f, 0xf0, 0x5a, 0xda, 0xa4, + 0x29, 0xf4, 0xcd, 0xed, 0x4b, 0xf9, 0x5e, 0x39, 0x40, 0x5f, 0x03, 0x9b, 0x8d, 0x87, 0xca, 0xe5, + 0xb6, 0x8f, 0x7c, 0x36, 0x71, 0x0e, 0xa7, 0x96, 0x5d, 0x1f, 0x0f, 0x29, 0x11, 0x28, 0xdc, 0x2c, + 0x3b, 0x6e, 0xd8, 0xf5, 0x7c, 0xb7, 0xef, 0x31, 0x29, 0x46, 0x9b, 0x98, 0x20, 0xf1, 0x7a, 0xcb, + 0x0d, 0x23, 0x1a, 0xea, 0xd7, 0x5e, 0x72, 0x24, 0x9a, 0x1c, 0xb7, 0x28, 0xeb, 0xec, 0x4a, 0x27, + 0xab, 0x9a, 0x1c, 0x02, 0x92, 0x6a, 0x72, 0x08, 0x08, 0xfe, 0x85, 0x61, 0x36, 0xf2, 0x46, 0x7c, + 0xe5, 0xcc, 0x06, 0x7f, 0x27, 0xd1, 0xb1, 0x3e, 0xa2, 0xd2, 0xf1, 0xf3, 0xb0, 0xd4, 0x4d, 0xcd, + 0xcc, 0xd6, 0xb5, 0x6c, 0xe0, 0x66, 0xd0, 0xf1, 0x28, 0x51, 0x9c, 0x80, 0xcc, 0x50, 0x5c, 0x46, + 0x1b, 0xf9, 0x83, 0xda, 0x48, 0xa4, 0x5e, 0xb8, 0xbb, 0xd4, 0x1f, 0x7b, 0x04, 0x2a, 0xf1, 0xcb, + 0x3a, 0x54, 0x85, 0x85, 0x8b, 0xaf, 0x90, 0xd7, 0x2f, 0x90, 0xcd, 0xe5, 0x1c, 0xaa, 0x41, 0xb9, + 0x7d, 0x61, 0xe3, 0x25, 0x31, 0xb2, 0xce, 0xfe, 0xa6, 0xa4, 0xd3, 0x80, 0x10, 0x7d, 0x13, 0x8a, + 0x32, 0xb6, 0x1f, 0x4d, 0x98, 0x33, 0xdf, 0x63, 0xad, 0x1e, 0x3b, 0x00, 0x97, 0x52, 0xc2, 0xb9, + 0x27, 0x2c, 0x74, 0x15, 0xaa, 0x02, 0xa8, 0x3a, 0xc5, 0x27, 0xb2, 0x0d, 0xdb, 0x14, 0xa5, 0x87, + 0x66, 0xcc, 0x1a, 0xf4, 0xce, 0x43, 0x51, 0x0a, 0xec, 0x68, 0x26, 0x05, 0x9b, 0x72, 0x9a, 0x54, + 0xef, 0x1c, 0xe7, 0xd0, 0x33, 0x60, 0x5f, 0x77, 0xbd, 0x3e, 0x32, 0x32, 0x40, 0xa3, 0xc1, 0xbb, + 0x7a, 0x34, 0x0b, 0x36, 0xb6, 0x7d, 0x2e, 0xee, 0x53, 0x1f, 0xcb, 0x36, 0xcb, 0xf4, 0xf2, 0xc6, + 0xc1, 0x89, 0x78, 0xe7, 0x57, 0x64, 0x37, 0x55, 0xb7, 0x6c, 0xd0, 0x43, 0xe9, 0xad, 0x32, 0x1d, + 0x9e, 0xd5, 0xe6, 0xac, 0xe9, 0x98, 0xe0, 0x16, 0x54, 0x8d, 0x76, 0x89, 0x29, 0xd6, 0x83, 0xbd, + 0x1e, 0x53, 0xac, 0x53, 0x7a, 0x2c, 0x38, 0x87, 0x2e, 0x41, 0x99, 0xe7, 0xcd, 0xe2, 0xb5, 0xca, + 0xf1, 0x6c, 0x7a, 0x6c, 0xa4, 0x45, 0xab, 0x27, 0xa6, 0x4f, 0xc6, 0x84, 0xbe, 0x0d, 0x95, 0x4b, + 0x94, 0xa9, 0xd8, 0x72, 0x2c, 0x1b, 0x9c, 0xa6, 0x48, 0x2a, 0x1d, 0xe0, 0x70, 0x0e, 0xbd, 0x21, + 0x52, 0xf8, 0xb4, 0x6b, 0x45, 0xce, 0x0c, 0x17, 0x1a, 0x9f, 0x6b, 0x6d, 0x36, 0x42, 0x4c, 0xf9, + 0xf5, 0x14, 0x65, 0x15, 0x85, 0x9d, 0x19, 0x17, 0x36, 0xa6, 0xec, 0xdc, 0xe5, 0xa3, 0x0b, 0x9c, + 0x3b, 0xfb, 0xa6, 0xfe, 0xee, 0x60, 0xd3, 0x65, 0x2e, 0x7a, 0x05, 0x96, 0x84, 0x2c, 0xe3, 0x0f, + 0x13, 0x52, 0x36, 0x7f, 0xe0, 0x2b, 0x88, 0x94, 0xcd, 0x1f, 0xfc, 0x1a, 0x02, 0xe7, 0xda, 0x6f, + 0x7e, 0xf0, 0x71, 0x33, 0xf7, 0xe1, 0xc7, 0xcd, 0xdc, 0xa7, 0x1f, 0x37, 0xad, 0xef, 0xef, 0x35, + 0xad, 0x5f, 0xef, 0x35, 0xad, 0xf7, 0xf7, 0x9a, 0xd6, 0x07, 0x7b, 0x4d, 0xeb, 0x1f, 0x7b, 0x4d, + 0xeb, 0x9f, 0x7b, 0xcd, 0xdc, 0xa7, 0x7b, 0x4d, 0xeb, 0xdd, 0x4f, 0x9a, 0xb9, 0x0f, 0x3e, 0x69, + 0xe6, 0x3e, 0xfc, 0xa4, 0x99, 0xfb, 0xee, 0xa3, 0x77, 0x2f, 0x57, 0xa5, 0x5b, 0x2c, 0x89, 0xbf, + 0x27, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x67, 0x13, 0x0e, 0x6a, 0x1d, 0x23, 0x00, 0x00, } func (x Direction) String() string { @@ -4991,18 +4999,10 @@ func (this *DetectedLabelsRequest) Equal(that interface{}) bool { } else if this == nil { return false } - if that1.Start == nil { - if this.Start != nil { - return false - } - } else if !this.Start.Equal(*that1.Start) { + if !this.Start.Equal(that1.Start) { return false } - if that1.End == nil { - if this.End != nil { - return false - } - } else if !this.End.Equal(*that1.End) { + if !this.End.Equal(that1.End) { return false } if this.Query != that1.Query { @@ -5064,6 +5064,9 @@ func (this *DetectedLabel) Equal(that interface{}) bool { if this.Cardinality != that1.Cardinality { return false } + if !bytes.Equal(this.Sketch, that1.Sketch) { + return false + } return true } func (this *LabelToValuesResponse) GoString() string { @@ -5769,10 +5772,11 @@ func (this *DetectedLabel) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 7) s = append(s, "&logproto.DetectedLabel{") s = append(s, "Label: "+fmt.Sprintf("%#v", this.Label)+",\n") s = append(s, "Cardinality: "+fmt.Sprintf("%#v", this.Cardinality)+",\n") + s = append(s, "Sketch: "+fmt.Sprintf("%#v", this.Sketch)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -8747,26 +8751,22 @@ func (m *DetectedLabelsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if m.End != nil { - n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.End):]) - if err26 != nil { - return 0, err26 - } - i -= n26 - i = encodeVarintLogproto(dAtA, i, uint64(n26)) - i-- - dAtA[i] = 0x12 + n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.End, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.End):]) + if err26 != nil { + return 0, err26 } - if m.Start != nil { - n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Start):]) - if err27 != nil { - return 0, err27 - } - i -= n27 - i = encodeVarintLogproto(dAtA, i, uint64(n27)) - i-- - dAtA[i] = 0xa + i -= n26 + i = encodeVarintLogproto(dAtA, i, uint64(n26)) + i-- + dAtA[i] = 0x12 + n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err27 != nil { + return 0, err27 } + i -= n27 + i = encodeVarintLogproto(dAtA, i, uint64(n27)) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -8827,6 +8827,13 @@ func (m *DetectedLabel) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Sketch) > 0 { + i -= len(m.Sketch) + copy(dAtA[i:], m.Sketch) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Sketch))) + i-- + dAtA[i] = 0x1a + } if m.Cardinality != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Cardinality)) i-- @@ -9885,14 +9892,10 @@ func (m *DetectedLabelsRequest) Size() (n int) { } var l int _ = l - if m.Start != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.Start) - n += 1 + l + sovLogproto(uint64(l)) - } - if m.End != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.End) - 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) + n += 1 + l + sovLogproto(uint64(l)) l = len(m.Query) if l > 0 { n += 1 + l + sovLogproto(uint64(l)) @@ -9928,6 +9931,10 @@ func (m *DetectedLabel) Size() (n int) { if m.Cardinality != 0 { n += 1 + sovLogproto(uint64(m.Cardinality)) } + l = len(m.Sketch) + if l > 0 { + n += 1 + l + sovLogproto(uint64(l)) + } return n } @@ -10633,8 +10640,8 @@ func (this *DetectedLabelsRequest) String() string { return "nil" } s := strings.Join([]string{`&DetectedLabelsRequest{`, - `Start:` + strings.Replace(fmt.Sprintf("%v", this.Start), "Timestamp", "types.Timestamp", 1) + `,`, - `End:` + strings.Replace(fmt.Sprintf("%v", this.End), "Timestamp", "types.Timestamp", 1) + `,`, + `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) + `,`, `}`, }, "") @@ -10662,6 +10669,7 @@ func (this *DetectedLabel) String() string { s := strings.Join([]string{`&DetectedLabel{`, `Label:` + fmt.Sprintf("%v", this.Label) + `,`, `Cardinality:` + fmt.Sprintf("%v", this.Cardinality) + `,`, + `Sketch:` + fmt.Sprintf("%v", this.Sketch) + `,`, `}`, }, "") return s @@ -17641,10 +17649,7 @@ func (m *DetectedLabelsRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Start == nil { - m.Start = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.Start, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Start, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -17677,10 +17682,7 @@ func (m *DetectedLabelsRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.End == nil { - m.End = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.End, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.End, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -17907,6 +17909,40 @@ func (m *DetectedLabel) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sketch", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogproto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthLogproto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthLogproto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sketch = append(m.Sketch[:0], dAtA[iNdEx:postIndex]...) + if m.Sketch == nil { + m.Sketch = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogproto(dAtA[iNdEx:]) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 0c0b6dde14ad5..742060195fb96 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -990,7 +990,7 @@ func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabel if _, isStatic := staticLabels[label]; isStatic || !containsAllIDTypes(val.Values) { _, ok := dlMap[label] if !ok { - dlMap[label] = newParsedFields() + dlMap[label] = newParsedLabels() } parsedFields := dlMap[label] @@ -1005,7 +1005,7 @@ func countLabelsAndCardinality(storeLabelsMap map[string][]string, ingesterLabel if _, isStatic := staticLabels[label]; isStatic || !containsAllIDTypes(values) { _, ok := dlMap[label] if !ok { - dlMap[label] = newParsedFields() + dlMap[label] = newParsedLabels() } parsedFields := dlMap[label] @@ -1144,6 +1144,14 @@ func newParsedFields(parser *string) *parsedFields { } } +func newParsedLabels() *parsedFields { + return &parsedFields{ + sketch: hyperloglog.New(), + isTypeDetected: false, + fieldType: logproto.DetectedFieldString, + } +} + func (p *parsedFields) Insert(value string) { p.sketch.Insert([]byte(value)) } diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index f0618019abd09..84e42f14f4451 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -2032,6 +2032,10 @@ func (p paramsDetectedLabelsWrapper) Shards() []string { return make([]string, 0) } +func (p paramsDetectedLabelsWrapper) GetStoreChunks() *logproto.ChunkRefGroup { + return nil +} + func (p paramsDetectedFieldsWrapper) GetStoreChunks() *logproto.ChunkRefGroup { return nil } From 5a336b09c3dfa57ec632c46f7bcdda8cbc3365b6 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Wed, 8 May 2024 12:02:34 +0530 Subject: [PATCH 06/11] Remove unnecessary tests --- pkg/querier/querier_test.go | 47 ------------------------------------- 1 file changed, 47 deletions(-) diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index d1760fff76770..a651a47f00aee 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -1379,53 +1379,6 @@ func (d *mockDeleteGettter) GetAllDeleteRequestsForUser(_ context.Context, userI return d.results, nil } -// -//func TestQuerier_isLabelRelevant(t *testing.T) { -// for _, tc := range []struct { -// name string -// label string -// values []string -// expected bool -// }{ -// { -// label: "uuidv4 values are not relevant", -// values: []string{"751e8ee6-b377-4b2e-b7b5-5508fbe980ef", "6b7e2663-8ecb-42e1-8bdc-0c5de70185b3", "2e1e67ff-be4f-47b8-aee1-5d67ff1ddabf", "c95b2d62-74ed-4ed7-a8a1-eb72fc67946e"}, -// expected: false, -// }, -// { -// label: "guid values are not relevant", -// values: []string{"57808f62-f117-4a22-84a0-bc3282c7f106", "5076e837-cd8d-4dd7-95ff-fecb087dccf6", "2e2a6554-1744-4399-b89a-88ae79c27096", "d3c31248-ec0c-4bc4-b11c-8fb1cfb42e62"}, -// expected: false, -// }, -// { -// label: "integer values are not relevant", -// values: []string{"1", "2", "3", "4"}, -// expected: false, -// }, -// { -// label: "string values are relevant", -// values: []string{"ingester", "querier", "query-frontend", "index-gateway"}, -// expected: true, -// }, -// { -// label: "guid with braces are not relevant", -// values: []string{"{E9550CF7-58D9-48B9-8845-D9800C651AAC}", "{1617921B-1749-4FF0-A058-31AFB5D98149}", "{C119D92E-A4B9-48A3-A92C-6CA8AA8A6CCC}", "{228AAF1D-2DE7-4909-A4E9-246A7FA9D988}"}, -// expected: false, -// }, -// { -// label: "float values are not relevant", -// values: []string{"1.2", "2.5", "3.3", "4.1"}, -// expected: false, -// }, -// } { -// t.Run(tc.name, func(t *testing.T) { -// querier := &SingleTenantQuerier{cfg: mockQuerierConfig()} -// assert.Equal(t, tc.expected, querier.isLabelRelevant(tc.label, tc.values, map[string]struct{}{"host": {}, "cluster": {}, "namespace": {}, "instance": {}, "pod": {}})) -// }) -// -// } -//} - func TestQuerier_DetectedLabels(t *testing.T) { manyValues := []string{} now := time.Now() From 3090bb7733cbb25cc2f40dfd201734b7faf2662d Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Wed, 8 May 2024 12:13:41 +0530 Subject: [PATCH 07/11] Minor fixes after merge --- pkg/querier/querier.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index fd9104a2369c8..00b6f146fa196 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -21,6 +21,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" + "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" "google.golang.org/grpc/health/grpc_health_v1" @@ -1144,9 +1145,8 @@ func newParsedFields(parser *string) *parsedFields { func newParsedLabels() *parsedFields { return &parsedFields{ - sketch: hyperloglog.New(), - isTypeDetected: false, - fieldType: logproto.DetectedFieldString, + sketch: hyperloglog.New(), + fieldType: logproto.DetectedFieldString, } } From 2022c7f91316f177917989bd5ba4f8ee602eccd1 Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Wed, 8 May 2024 13:54:14 +0530 Subject: [PATCH 08/11] Minor fix to empty-response --- pkg/querier/queryrange/codec.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index 84e42f14f4451..01ff8772a4c75 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -2104,6 +2104,10 @@ func NewEmptyResponse(r queryrangebase.Request) (queryrangebase.Response, error) return &VolumeResponse{ Response: &logproto.VolumeResponse{}, }, nil + case *DetectedLabelsRequest: + return &DetectedLabelsResponse{ + Response: &logproto.DetectedLabelsResponse{}, + }, nil default: return nil, fmt.Errorf("unsupported request type %T", req) } From 9cb2fd25ff1756c1824fca6c95541c149446601e Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Fri, 10 May 2024 16:38:52 +0530 Subject: [PATCH 09/11] Fix PR comments --- pkg/ingester/ingester_test.go | 2 +- pkg/storage/detected/labels.go | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/ingester/ingester_test.go b/pkg/ingester/ingester_test.go index f8480f336dbe8..b31053a5ded17 100644 --- a/pkg/ingester/ingester_test.go +++ b/pkg/ingester/ingester_test.go @@ -834,7 +834,7 @@ func TestIngester_GetDetectedLabels(t *testing.T) { res, err := i.GetDetectedLabels(ctx, &logproto.DetectedLabelsRequest{ Start: []time.Time{time.Now().Add(11 * time.Nanosecond)}[0], - End: []time.Time{time.Now().Add(11 * time.Nanosecond)}[0], + End: []time.Time{time.Now().Add(12 * time.Nanosecond)}[0], Query: "", }) diff --git a/pkg/storage/detected/labels.go b/pkg/storage/detected/labels.go index 9a8b9c905ec78..66b721a79b800 100644 --- a/pkg/storage/detected/labels.go +++ b/pkg/storage/detected/labels.go @@ -42,9 +42,7 @@ func MergeLabels(labels []*logproto.DetectedLabel) (result []*logproto.DetectedL return nil, err } mergedLabels[label.Label] = unmarshaledLabel - } - - if ok { + } else { err := l.Merge(label) if err != nil { return nil, err From a7ab4b74f23a655d9cc8c60435e80f9995b37c6c Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Fri, 10 May 2024 17:16:01 +0530 Subject: [PATCH 10/11] Fix bug that returned sketch in case of 1 split --- pkg/querier/queryrange/roundtrip.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index 05ddc7ee7a03b..61da06929fe14 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -330,7 +330,7 @@ func NewDetectedLabelsCardinalityFilter(rt queryrangebase.Handler) queryrangebas for _, dl := range resp.Response.DetectedLabels { if dl.Cardinality > 2 && dl.Cardinality < 50 { - result = append(result, dl) + result = append(result, &logproto.DetectedLabel{Label: dl.Label, Cardinality: dl.Cardinality}) } } return &DetectedLabelsResponse{ From 8b04d5ce8847ffd51a22a7ce6d18a5fd26a7839b Mon Sep 17 00:00:00 2001 From: shantanualshi Date: Tue, 14 May 2024 21:54:54 +0530 Subject: [PATCH 11/11] Fix tests --- pkg/querier/querier_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/querier/querier_test.go b/pkg/querier/querier_test.go index 538bcdaa9c47c..a787616efeeee 100644 --- a/pkg/querier/querier_test.go +++ b/pkg/querier/querier_test.go @@ -1633,8 +1633,8 @@ func TestQuerier_DetectedLabels(t *testing.T) { storeClient.On("LabelNamesForMetricName", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return([]string{}, nil) request := logproto.DetectedLabelsRequest{ - Start: &now, - End: &now, + Start: now, + End: now.Add(2 * time.Hour), Query: "", }