diff --git a/datacatalog/pkg/manager/impl/artifact_manager_test.go b/datacatalog/pkg/manager/impl/artifact_manager_test.go index a9bb05c428..c19b6ae788 100644 --- a/datacatalog/pkg/manager/impl/artifact_manager_test.go +++ b/datacatalog/pkg/manager/impl/artifact_manager_test.go @@ -49,16 +49,16 @@ func getTestStringLiteral() *core.Literal { } func getTestArtifact() *datacatalog.Artifact { - + datasetID := &datacatalog.DatasetID{ + Project: "test-project", + Domain: "test-domain", + Name: "test-name", + Version: "test-version", + UUID: "test-uuid", + } return &datacatalog.Artifact{ - Id: "test-id", - Dataset: &datacatalog.DatasetID{ - Project: "test-project", - Domain: "test-domain", - Name: "test-name", - Version: "test-version", - UUID: "test-uuid", - }, + Id: "test-id", + Dataset: datasetID, Metadata: &datacatalog.Metadata{ KeyMap: map[string]string{"key1": "value1"}, }, @@ -72,6 +72,9 @@ func getTestArtifact() *datacatalog.Artifact { {Key: "key1", Value: "value1"}, {Key: "key2", Value: "value2"}, }, + Tags: []*datacatalog.Tag{ + {Name: "test-tag", Dataset: datasetID, ArtifactId: "test-id"}, + }, } } @@ -128,6 +131,9 @@ func getExpectedArtifactModel(ctx context.Context, t *testing.T, datastore *stor {Key: "key1", Value: "value1"}, {Key: "key2", Value: "value2"}, }, + Tags: []models.Tag{ + {TagKey: models.TagKey{TagName: "test-tag"}, DatasetUUID: expectedDataset.UUID, ArtifactID: artifact.Id}, + }, } } diff --git a/datacatalog/pkg/repositories/gormimpl/artifact.go b/datacatalog/pkg/repositories/gormimpl/artifact.go index c29aafc918..85de06dfd4 100644 --- a/datacatalog/pkg/repositories/gormimpl/artifact.go +++ b/datacatalog/pkg/repositories/gormimpl/artifact.go @@ -53,9 +53,12 @@ func (h *artifactRepo) Get(ctx context.Context, in models.ArtifactKey) (models.A defer timer.Stop() var artifact models.Artifact - result := h.db.Preload("ArtifactData").Preload("Partitions").First(&artifact, &models.Artifact{ - ArtifactKey: in, - }) + result := h.db.Preload("ArtifactData").Preload("Partitions").Preload("Tags"). + Order("artifacts.created_at DESC"). + First( + &artifact, + &models.Artifact{ArtifactKey: in}, + ) if result.Error != nil { return models.Artifact{}, h.errorTransformer.ToDataCatalogError(result.Error) @@ -99,10 +102,9 @@ func (h *artifactRepo) List(ctx context.Context, datasetKey models.DatasetKey, i return []models.Artifact{}, h.errorTransformer.ToDataCatalogError(tx.Error) } - tx = tx.Preload("ArtifactData").Preload("Partitions").Find(&artifacts) + tx = tx.Preload("ArtifactData").Preload("Partitions").Preload("Tags").Find(&artifacts) if tx.Error != nil { return []models.Artifact{}, h.errorTransformer.ToDataCatalogError(tx.Error) } - return artifacts, nil } diff --git a/datacatalog/pkg/repositories/gormimpl/artifact_test.go b/datacatalog/pkg/repositories/gormimpl/artifact_test.go index 3ec56b2bfa..0979963840 100644 --- a/datacatalog/pkg/repositories/gormimpl/artifact_test.go +++ b/datacatalog/pkg/repositories/gormimpl/artifact_test.go @@ -90,6 +90,21 @@ func getDBPartitionResponse(artifact models.Artifact) []map[string]interface{} { return expectedPartitionResponse } +// Raw db response to return on raw queries for tags +func getDBTagResponse(artifact models.Artifact) []map[string]interface{} { + expectedTagResponse := make([]map[string]interface{}, 0) + sampleTag := make(map[string]interface{}) + sampleTag["tag_name"] = "test-tag" + sampleTag["artifact_id"] = artifact.ArtifactID + sampleTag["dataset_uuid"] = "test-uuid" + sampleTag["dataset_project"] = artifact.DatasetProject + sampleTag["dataset_domain"] = artifact.DatasetDomain + sampleTag["dataset_name"] = artifact.DatasetName + sampleTag["dataset_version"] = artifact.DatasetVersion + expectedTagResponse = append(expectedTagResponse, sampleTag) + return expectedTagResponse +} + func TestCreateArtifact(t *testing.T) { artifact := getTestArtifact() @@ -153,17 +168,20 @@ func TestGetArtifact(t *testing.T) { expectedArtifactDataResponse := getDBArtifactDataResponse(artifact) expectedArtifactResponse := getDBArtifactResponse(artifact) expectedPartitionResponse := getDBPartitionResponse(artifact) + expectedTagResponse := getDBTagResponse(artifact) GlobalMock := mocket.Catcher.Reset() GlobalMock.Logging = true // Only match on queries that append expected filters GlobalMock.NewMock().WithQuery( - `SELECT * FROM "artifacts" WHERE "artifacts"."deleted_at" IS NULL AND (("artifacts"."dataset_project" = testProject) AND ("artifacts"."dataset_name" = testName) AND ("artifacts"."dataset_domain" = testDomain) AND ("artifacts"."dataset_version" = testVersion) AND ("artifacts"."artifact_id" = 123)) ORDER BY "artifacts"."dataset_project" ASC LIMIT 1`).WithReply(expectedArtifactResponse) + `SELECT * FROM "artifacts" WHERE "artifacts"."deleted_at" IS NULL AND (("artifacts"."dataset_project" = testProject) AND ("artifacts"."dataset_name" = testName) AND ("artifacts"."dataset_domain" = testDomain) AND ("artifacts"."dataset_version" = testVersion) AND ("artifacts"."artifact_id" = 123)) ORDER BY artifacts.created_at DESC,"artifacts"."dataset_project" ASC LIMIT 1`).WithReply(expectedArtifactResponse) GlobalMock.NewMock().WithQuery( `SELECT * FROM "artifact_data" WHERE "artifact_data"."deleted_at" IS NULL AND ((("dataset_project","dataset_name","dataset_domain","dataset_version","artifact_id") IN ((testProject,testName,testDomain,testVersion,123)))) ORDER BY "artifact_data"."dataset_project" ASC`).WithReply(expectedArtifactDataResponse) GlobalMock.NewMock().WithQuery( `SELECT * FROM "partitions" WHERE "partitions"."deleted_at" IS NULL AND (("artifact_id" IN (123))) ORDER BY "partitions"."dataset_uuid" ASC`).WithReply(expectedPartitionResponse) + GlobalMock.NewMock().WithQuery( + `SELECT * FROM "tags" WHERE "tags"."deleted_at" IS NULL AND ((("artifact_id","dataset_uuid") IN ((123,test-uuid)))) ORDER BY "tags"."dataset_project" ASC`).WithReply(expectedTagResponse) getInput := models.ArtifactKey{ DatasetProject: artifact.DatasetProject, DatasetDomain: artifact.DatasetDomain, @@ -183,6 +201,7 @@ func TestGetArtifact(t *testing.T) { assert.Equal(t, 1, len(response.ArtifactData)) assert.Equal(t, 1, len(response.Partitions)) + assert.EqualValues(t, 1, len(response.Tags)) } func TestGetArtifactDoesNotExist(t *testing.T) { @@ -238,13 +257,15 @@ func TestListArtifactsWithPartition(t *testing.T) { expectedArtifactDataResponse := getDBArtifactDataResponse(artifact) expectedArtifactResponse := getDBArtifactResponse(artifact) expectedPartitionResponse := getDBPartitionResponse(artifact) - + expectedTagResponse := getDBTagResponse(artifact) GlobalMock.NewMock().WithQuery( `SELECT "artifacts".* FROM "artifacts" JOIN partitions partitions0 ON artifacts.artifact_id = partitions0.artifact_id WHERE "artifacts"."deleted_at" IS NULL AND ((partitions0.key = val1) AND (partitions0.val = val2) AND (artifacts.dataset_uuid = test-uuid)) ORDER BY artifacts.created_at desc LIMIT 10 OFFSET 10`).WithReply(expectedArtifactResponse) GlobalMock.NewMock().WithQuery( `SELECT * FROM "artifact_data" WHERE "artifact_data"."deleted_at" IS NULL AND ((("dataset_project","dataset_name","dataset_domain","dataset_version","artifact_id") IN ((testProject,testName,testDomain,testVersion,123))))`).WithReply(expectedArtifactDataResponse) GlobalMock.NewMock().WithQuery( `SELECT * FROM "partitions" WHERE "partitions"."deleted_at" IS NULL AND (("artifact_id" IN (123)))`).WithReply(expectedPartitionResponse) + GlobalMock.NewMock().WithQuery( + `SELECT * FROM "tags" WHERE "tags"."deleted_at" IS NULL AND ((("artifact_id","dataset_uuid") IN ((123,test-uuid))))`).WithReply(expectedTagResponse) artifactRepo := NewArtifactRepo(utils.GetDbForTest(t), errors.NewPostgresErrorTransformer(), promutils.NewTestScope()) listInput := models.ListModelsInput{ @@ -267,6 +288,7 @@ func TestListArtifactsWithPartition(t *testing.T) { assert.Equal(t, artifacts[0].ArtifactID, artifact.ArtifactID) assert.Len(t, artifacts[0].ArtifactData, 1) assert.Len(t, artifacts[0].Partitions, 1) + assert.Len(t, artifacts[0].Tags, 1) } func TestListArtifactsNoPartitions(t *testing.T) { diff --git a/datacatalog/pkg/repositories/gormimpl/tag.go b/datacatalog/pkg/repositories/gormimpl/tag.go index adb9cbbf1a..d3c60452f6 100644 --- a/datacatalog/pkg/repositories/gormimpl/tag.go +++ b/datacatalog/pkg/repositories/gormimpl/tag.go @@ -42,9 +42,12 @@ func (h *tagRepo) Get(ctx context.Context, in models.TagKey) (models.Tag, error) defer timer.Stop() var tag models.Tag - result := h.db.Preload("Artifact").Preload("Artifact.ArtifactData").Find(&tag, &models.Tag{ - TagKey: in, - }) + result := h.db.Preload("Artifact").Preload("Artifact.ArtifactData"). + Preload("Artifact.Partitions").Preload("Artifact.Tags"). + Order("tags.created_at DESC"). + First(&tag, &models.Tag{ + TagKey: in, + }) if result.Error != nil { return models.Tag{}, h.errorTransformer.ToDataCatalogError(result.Error) diff --git a/datacatalog/pkg/repositories/gormimpl/tag_test.go b/datacatalog/pkg/repositories/gormimpl/tag_test.go index 0fc15074c7..d625f45f74 100644 --- a/datacatalog/pkg/repositories/gormimpl/tag_test.go +++ b/datacatalog/pkg/repositories/gormimpl/tag_test.go @@ -66,51 +66,20 @@ func TestCreateTag(t *testing.T) { func TestGetTag(t *testing.T) { artifact := getTestArtifact() - expectedArtifactDataResponse := make([]map[string]interface{}, 0) - sampleArtifactData := make(map[string]interface{}) - sampleArtifactData["dataset_project"] = artifact.DatasetProject - sampleArtifactData["dataset_domain"] = artifact.DatasetDomain - sampleArtifactData["dataset_name"] = artifact.DatasetName - sampleArtifactData["dataset_version"] = artifact.DatasetVersion - sampleArtifactData["artifact_id"] = artifact.ArtifactID - sampleArtifactData["name"] = "test-dataloc-name" - sampleArtifactData["location"] = "test-dataloc-location" - sampleArtifactData["dataset_uuid"] = artifact.DatasetUUID - - expectedArtifactDataResponse = append(expectedArtifactDataResponse, sampleArtifactData) - - expectedArtifactResponse := make([]map[string]interface{}, 0) - sampleArtifact := make(map[string]interface{}) - sampleArtifact["dataset_project"] = artifact.DatasetProject - sampleArtifact["dataset_domain"] = artifact.DatasetDomain - sampleArtifact["dataset_name"] = artifact.DatasetName - sampleArtifact["dataset_version"] = artifact.DatasetVersion - sampleArtifact["artifact_id"] = artifact.ArtifactID - sampleArtifact["dataset_uuid"] = artifact.DatasetUUID - expectedArtifactResponse = append(expectedArtifactResponse, sampleArtifact) - - expectedTagResponse := make([]map[string]interface{}, 0) - sampleTag := make(map[string]interface{}) - sampleTag["dataset_project"] = artifact.DatasetProject - sampleTag["dataset_domain"] = artifact.DatasetDomain - sampleTag["dataset_name"] = artifact.DatasetName - sampleTag["dataset_version"] = artifact.DatasetVersion - sampleTag["artifact_id"] = artifact.ArtifactID - sampleTag["name"] = "test-tag" - sampleTag["dataset_uuid"] = artifact.DatasetUUID - expectedTagResponse = append(expectedTagResponse, sampleTag) - GlobalMock := mocket.Catcher.Reset() GlobalMock.Logging = true // Only match on queries that append expected filters GlobalMock.NewMock().WithQuery( - `SELECT * FROM "tags" WHERE "tags"."deleted_at" IS NULL AND (("tags"."dataset_project" = testProject) AND ("tags"."dataset_name" = testName) AND ("tags"."dataset_domain" = testDomain) AND ("tags"."dataset_version" = testVersion) AND ("tags"."tag_name" = test-tag))`).WithReply(expectedTagResponse) + `SELECT * FROM "tags" WHERE "tags"."deleted_at" IS NULL AND (("tags"."dataset_project" = testProject) AND ("tags"."dataset_name" = testName) AND ("tags"."dataset_domain" = testDomain) AND ("tags"."dataset_version" = testVersion) AND ("tags"."tag_name" = test-tag)) ORDER BY tags.created_at DESC,"tags"."dataset_project" ASC LIMIT 1`).WithReply(getDBTagResponse(artifact)) GlobalMock.NewMock().WithQuery( - `SELECT * FROM "artifacts" WHERE "artifacts"."deleted_at" IS NULL AND ((("dataset_project","dataset_name","dataset_domain","dataset_version","artifact_id") IN ((testProject,testName,testDomain,testVersion,123))))`).WithReply(expectedArtifactResponse) + `SELECT * FROM "artifacts" WHERE "artifacts"."deleted_at" IS NULL AND ((("dataset_project","dataset_name","dataset_domain","dataset_version","artifact_id") IN ((testProject,testName,testDomain,testVersion,123))))`).WithReply(getDBArtifactResponse(artifact)) GlobalMock.NewMock().WithQuery( - `SELECT * FROM "artifact_data" WHERE "artifact_data"."deleted_at" IS NULL AND ((("dataset_project","dataset_name","dataset_domain","dataset_version","artifact_id") IN ((testProject,testName,testDomain,testVersion,123))))`).WithReply(expectedArtifactDataResponse) - + `SELECT * FROM "artifact_data" WHERE "artifact_data"."deleted_at" IS NULL AND ((("dataset_project","dataset_name","dataset_domain","dataset_version","artifact_id") IN ((testProject,testName,testDomain,testVersion,123))))`).WithReply(getDBArtifactDataResponse(artifact)) + GlobalMock.NewMock().WithQuery( + `SELECT * FROM "partitions" WHERE "partitions"."deleted_at" IS NULL AND (("artifact_id" IN (123)))`).WithReply(getDBPartitionResponse(artifact)) + GlobalMock.NewMock().WithQuery( + `SELECT * FROM "tags" WHERE "tags"."deleted_at" IS NULL AND ((("artifact_id","dataset_uuid") IN ((123,test-uuid))))`).WithReply(getDBTagResponse(artifact)) getInput := models.TagKey{ DatasetProject: artifact.DatasetProject, DatasetDomain: artifact.DatasetDomain, @@ -125,6 +94,8 @@ func TestGetTag(t *testing.T) { assert.Equal(t, artifact.ArtifactID, response.ArtifactID) assert.Equal(t, artifact.ArtifactID, response.Artifact.ArtifactID) assert.Len(t, response.Artifact.ArtifactData, 1) + assert.Len(t, response.Artifact.Partitions, 1) + assert.Len(t, response.Artifact.Tags, 1) } func TestTagAlreadyExists(t *testing.T) { diff --git a/datacatalog/pkg/repositories/models/artifact.go b/datacatalog/pkg/repositories/models/artifact.go index 509a52d125..4856c37cd3 100644 --- a/datacatalog/pkg/repositories/models/artifact.go +++ b/datacatalog/pkg/repositories/models/artifact.go @@ -15,6 +15,7 @@ type Artifact struct { Dataset Dataset `gorm:"association_autocreate:false"` ArtifactData []ArtifactData `gorm:"association_foreignkey:DatasetProject,DatasetName,DatasetDomain,DatasetVersion,ArtifactID;foreignkey:DatasetProject,DatasetName,DatasetDomain,DatasetVersion,ArtifactID"` Partitions []Partition `gorm:"association_foreignkey:ArtifactID;foreignkey:ArtifactID"` + Tags []Tag `gorm:"association_foreignkey:ArtifactID,DatasetUUID;foreignkey:ArtifactID,DatasetUUID"` SerializedMetadata []byte } diff --git a/datacatalog/pkg/repositories/transformers/artifact.go b/datacatalog/pkg/repositories/transformers/artifact.go index 7ccc19afa1..67eb0efaa3 100644 --- a/datacatalog/pkg/repositories/transformers/artifact.go +++ b/datacatalog/pkg/repositories/transformers/artifact.go @@ -38,6 +38,14 @@ func CreateArtifactModel(request datacatalog.CreateArtifactRequest, artifactData } func FromArtifactModel(artifact models.Artifact) (datacatalog.Artifact, error) { + datasetID := datacatalog.DatasetID{ + Project: artifact.DatasetProject, + Domain: artifact.DatasetDomain, + Name: artifact.DatasetName, + Version: artifact.DatasetVersion, + UUID: artifact.DatasetUUID, + } + metadata, err := unmarshalMetadata(artifact.SerializedMetadata) if err != nil { return datacatalog.Artifact{}, err @@ -51,17 +59,16 @@ func FromArtifactModel(artifact models.Artifact) (datacatalog.Artifact, error) { } } + tags := make([]*datacatalog.Tag, len(artifact.Tags)) + for i, tag := range artifact.Tags { + tags[i] = FromTagModel(datasetID, tag) + } return datacatalog.Artifact{ - Id: artifact.ArtifactID, - Dataset: &datacatalog.DatasetID{ - Project: artifact.DatasetProject, - Domain: artifact.DatasetDomain, - Name: artifact.DatasetName, - Version: artifact.DatasetVersion, - UUID: artifact.DatasetUUID, - }, + Id: artifact.ArtifactID, + Dataset: &datasetID, Metadata: metadata, Partitions: partitions, + Tags: tags, }, nil } diff --git a/datacatalog/pkg/repositories/transformers/artifact_test.go b/datacatalog/pkg/repositories/transformers/artifact_test.go index f5e58bbfde..93ffa97eb6 100644 --- a/datacatalog/pkg/repositories/transformers/artifact_test.go +++ b/datacatalog/pkg/repositories/transformers/artifact_test.go @@ -32,6 +32,12 @@ func getTestPartitions() []models.Partition { } } +func getTestTags() []models.Tag { + return []models.Tag{ + {TagKey: models.TagKey{TagName: "test"}}, + } +} + func getDatasetModel() models.Dataset { return models.Dataset{ DatasetKey: models.DatasetKey{ @@ -104,10 +110,8 @@ func TestFromArtifactModel(t *testing.T) { ArtifactID: "id1", }, SerializedMetadata: []byte{}, - Partitions: []models.Partition{ - {DatasetUUID: "test-uuid", Key: "key1", Value: "value1"}, - {DatasetUUID: "test-uuid", Key: "key2", Value: "value2"}, - }, + Partitions: getTestPartitions(), + Tags: getTestTags(), } actual, err := FromArtifactModel(artifactModel) @@ -119,7 +123,13 @@ func TestFromArtifactModel(t *testing.T) { assert.Equal(t, artifactModel.DatasetVersion, actual.Dataset.Version) assert.Len(t, actual.Partitions, 2) - assert.EqualValues(t, artifactModel.Partitions, getTestPartitions()) + assert.EqualValues(t, artifactModel.Partitions[0].Key, actual.Partitions[0].Key) + assert.EqualValues(t, artifactModel.Partitions[0].Value, actual.Partitions[0].Value) + assert.EqualValues(t, artifactModel.Partitions[1].Value, actual.Partitions[1].Value) + assert.EqualValues(t, artifactModel.Partitions[1].Value, actual.Partitions[1].Value) + + assert.Len(t, actual.Tags, 1) + assert.EqualValues(t, artifactModel.Tags[0].TagName, actual.Tags[0].Name) } func TestToArtifactKey(t *testing.T) { diff --git a/datacatalog/pkg/repositories/transformers/tag.go b/datacatalog/pkg/repositories/transformers/tag.go index 9921e22157..e96bef0a7c 100644 --- a/datacatalog/pkg/repositories/transformers/tag.go +++ b/datacatalog/pkg/repositories/transformers/tag.go @@ -14,3 +14,11 @@ func ToTagKey(datasetID datacatalog.DatasetID, tagName string) models.TagKey { TagName: tagName, } } + +func FromTagModel(datasetID datacatalog.DatasetID, tag models.Tag) *datacatalog.Tag { + return &datacatalog.Tag{ + Name: tag.TagName, + ArtifactId: tag.ArtifactID, + Dataset: &datasetID, + } +} diff --git a/datacatalog/pkg/repositories/transformers/tag_test.go b/datacatalog/pkg/repositories/transformers/tag_test.go index 4eabb9a416..2abf81a89e 100644 --- a/datacatalog/pkg/repositories/transformers/tag_test.go +++ b/datacatalog/pkg/repositories/transformers/tag_test.go @@ -3,6 +3,7 @@ package transformers import ( "testing" + "github.com/lyft/datacatalog/pkg/repositories/models" datacatalog "github.com/lyft/datacatalog/protos/gen" "github.com/stretchr/testify/assert" ) @@ -25,3 +26,29 @@ func TestToTagKey(t *testing.T) { assert.Equal(t, datasetID.Name, tagKey.DatasetName) assert.Equal(t, datasetID.Version, tagKey.DatasetVersion) } + +func TestFromTagModel(t *testing.T) { + datasetID := datacatalog.DatasetID{ + Project: "testProj", + Domain: "testDomain", + Name: "testName", + Version: "testVersion", + UUID: "test-uuid", + } + + tagModel := models.Tag{ + TagKey: models.TagKey{ + TagName: "test-tag", + }, + DatasetUUID: "dataset-uuid", + } + + tag := FromTagModel(datasetID, tagModel) + + assert.Equal(t, tag.Name, tagModel.TagName) + assert.Equal(t, datasetID.Project, tag.Dataset.Project) + assert.Equal(t, datasetID.Domain, tag.Dataset.Domain) + assert.Equal(t, datasetID.Name, tag.Dataset.Name) + assert.Equal(t, datasetID.Version, tag.Dataset.Version) + assert.Equal(t, datasetID.UUID, tag.Dataset.UUID) +} diff --git a/datacatalog/protos/gen/service.pb.go b/datacatalog/protos/gen/service.pb.go index d5035761c8..257f9817db 100644 --- a/datacatalog/protos/gen/service.pb.go +++ b/datacatalog/protos/gen/service.pb.go @@ -797,6 +797,7 @@ type Artifact struct { Data []*ArtifactData `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty"` Metadata *Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` Partitions []*Partition `protobuf:"bytes,5,rep,name=partitions,proto3" json:"partitions,omitempty"` + Tags []*Tag `protobuf:"bytes,6,rep,name=tags,proto3" json:"tags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -862,6 +863,13 @@ func (m *Artifact) GetPartitions() []*Partition { return nil } +func (m *Artifact) GetTags() []*Tag { + if m != nil { + return m.Tags + } + return nil +} + type ArtifactData struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Value *core.Literal `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` @@ -1625,84 +1633,85 @@ func init() { func init() { proto.RegisterFile("service.proto", fileDescriptor_a0b84a42fa06f626) } var fileDescriptor_a0b84a42fa06f626 = []byte{ - // 1225 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x97, 0xdd, 0x72, 0xdb, 0x44, - 0x14, 0xc7, 0x2d, 0x3b, 0xb1, 0xad, 0xe3, 0xd8, 0x71, 0x16, 0x27, 0x15, 0x6e, 0x4b, 0x5d, 0xb5, - 0xd3, 0xc9, 0x30, 0xe0, 0x82, 0x53, 0x3a, 0x50, 0x18, 0xc0, 0x89, 0x9d, 0xc4, 0xe4, 0xcb, 0x55, - 0x9c, 0xcc, 0x30, 0x5c, 0x78, 0x96, 0x68, 0x63, 0x44, 0x64, 0x4b, 0x95, 0x36, 0x99, 0xfa, 0x8a, - 0xe1, 0x16, 0x2e, 0x99, 0xe1, 0x75, 0x78, 0x03, 0x1e, 0x83, 0xa7, 0xe0, 0x82, 0x59, 0xed, 0x4a, - 0xd1, 0xca, 0x4a, 0x6a, 0x72, 0x93, 0xd1, 0xee, 0x9e, 0xf3, 0xcb, 0xd9, 0xf3, 0x3f, 0x3a, 0x3a, - 0x86, 0xb2, 0x4f, 0xbc, 0x2b, 0xeb, 0x8c, 0x34, 0x5d, 0xcf, 0xa1, 0x0e, 0x2a, 0x99, 0x98, 0xe2, - 0x33, 0x4c, 0xb1, 0xed, 0x8c, 0xea, 0x0f, 0xce, 0xed, 0x29, 0x25, 0x96, 0x69, 0x3f, 0x3f, 0x73, - 0x3c, 0xf2, 0xdc, 0xb6, 0x28, 0xf1, 0xb0, 0xed, 0x73, 0x53, 0x7d, 0x1b, 0x6a, 0x5b, 0x1e, 0xc1, - 0x94, 0x74, 0x30, 0xc5, 0x3e, 0xa1, 0x06, 0x79, 0x73, 0x49, 0x7c, 0x8a, 0x9a, 0x50, 0x30, 0xf9, - 0x8e, 0xa6, 0x34, 0x94, 0xf5, 0x52, 0xab, 0xd6, 0x8c, 0x41, 0x9b, 0xa1, 0x75, 0x68, 0xa4, 0xdf, - 0x83, 0xd5, 0x04, 0xc7, 0x77, 0x9d, 0x89, 0x4f, 0xf4, 0x2e, 0xac, 0xec, 0x10, 0x9a, 0xa0, 0x7f, - 0x92, 0xa4, 0xaf, 0xa5, 0xd1, 0x7b, 0x9d, 0x6b, 0x7e, 0x07, 0x50, 0x1c, 0xc3, 0xe1, 0xff, 0x3b, - 0xca, 0x3f, 0x95, 0x00, 0xd3, 0xf6, 0xa8, 0x75, 0x8e, 0xcf, 0xee, 0x1e, 0x0e, 0x7a, 0x0c, 0x25, - 0x2c, 0x20, 0x43, 0xcb, 0xd4, 0xb2, 0x0d, 0x65, 0x5d, 0xdd, 0xcd, 0x18, 0x10, 0x6e, 0xf6, 0x4c, - 0x74, 0x1f, 0x8a, 0x14, 0x8f, 0x86, 0x13, 0x3c, 0x26, 0x5a, 0x4e, 0x9c, 0x17, 0x28, 0x1e, 0x1d, - 0xe2, 0x31, 0xd9, 0xac, 0xc0, 0xd2, 0x9b, 0x4b, 0xe2, 0x4d, 0x87, 0x3f, 0xe1, 0x89, 0x69, 0x13, - 0x7d, 0x17, 0xde, 0x93, 0xe2, 0x12, 0xf7, 0xfb, 0x14, 0x8a, 0x21, 0x51, 0x44, 0xb6, 0x2a, 0x45, - 0x16, 0x39, 0x44, 0x66, 0xfa, 0x77, 0xa1, 0x10, 0xc9, 0x4b, 0xde, 0x81, 0xa5, 0xc1, 0x5a, 0x92, - 0x25, 0x54, 0xdd, 0x80, 0x72, 0xdb, 0x34, 0x07, 0x78, 0x14, 0xd2, 0x75, 0xc8, 0x51, 0x3c, 0x12, - 0xe0, 0xaa, 0x04, 0x66, 0x56, 0xec, 0x50, 0xaf, 0x42, 0x25, 0x74, 0x12, 0x98, 0xbf, 0x14, 0xa8, - 0xed, 0x5b, 0x7e, 0x74, 0x71, 0xff, 0xee, 0x8a, 0x7c, 0x06, 0xf9, 0x73, 0xcb, 0xa6, 0xc4, 0x0b, - 0xc4, 0x28, 0xb5, 0x1e, 0x4a, 0x0e, 0xdb, 0xc1, 0x51, 0xf7, 0xad, 0xeb, 0x11, 0xdf, 0xb7, 0x9c, - 0x89, 0x21, 0x8c, 0xd1, 0xd7, 0x00, 0x2e, 0x1e, 0x59, 0x13, 0x4c, 0x2d, 0x67, 0x12, 0xe8, 0x54, - 0x6a, 0x7d, 0x20, 0xb9, 0xf6, 0xa3, 0xe3, 0x23, 0x97, 0xfd, 0xf5, 0x8d, 0x98, 0x87, 0x7e, 0x01, - 0xab, 0x89, 0x0b, 0x08, 0xe9, 0x36, 0x40, 0x0d, 0xf3, 0xe8, 0x6b, 0x4a, 0x23, 0x77, 0x73, 0xbe, - 0xaf, 0xed, 0xd0, 0x43, 0x80, 0x09, 0x79, 0x4b, 0x87, 0xd4, 0xb9, 0x20, 0x13, 0x5e, 0x55, 0x86, - 0xca, 0x76, 0x06, 0x6c, 0x43, 0xff, 0x4d, 0x81, 0x82, 0xb8, 0x3a, 0x7a, 0x06, 0x59, 0xcb, 0x7c, - 0x47, 0x72, 0xb2, 0x96, 0xc9, 0x64, 0x1f, 0x13, 0x8a, 0x99, 0x81, 0xc8, 0x8c, 0x1c, 0xc6, 0x81, - 0x38, 0x34, 0x22, 0x33, 0xf4, 0x14, 0xca, 0x2e, 0x8b, 0x89, 0x5d, 0x70, 0x8f, 0x4c, 0x7d, 0x2d, - 0xd7, 0xc8, 0xad, 0xab, 0x86, 0xbc, 0xa9, 0x6f, 0x80, 0xda, 0x0f, 0x37, 0x50, 0x15, 0x72, 0x17, - 0x64, 0x1a, 0x84, 0xa3, 0x1a, 0xec, 0x11, 0xd5, 0x60, 0xf1, 0x0a, 0xdb, 0x97, 0x44, 0xdc, 0x82, - 0x2f, 0xf4, 0x5f, 0x40, 0x8d, 0xc2, 0x43, 0x1a, 0x14, 0x5c, 0xcf, 0xf9, 0x99, 0x88, 0x82, 0x54, - 0x8d, 0x70, 0x89, 0x10, 0x2c, 0x04, 0xef, 0x0d, 0xf7, 0x0d, 0x9e, 0xd1, 0x1a, 0xe4, 0x4d, 0x67, - 0x8c, 0x2d, 0xae, 0x92, 0x6a, 0x88, 0x15, 0xa3, 0x5c, 0x11, 0x8f, 0x89, 0xaa, 0x2d, 0x70, 0x8a, - 0x58, 0x32, 0xca, 0xc9, 0x49, 0xaf, 0xa3, 0x2d, 0x72, 0x0a, 0x7b, 0xd6, 0xff, 0x51, 0xa0, 0x18, - 0x66, 0x1e, 0x55, 0xa2, 0x1c, 0xaa, 0x41, 0xae, 0x62, 0x55, 0x97, 0x9d, 0xaf, 0xea, 0x3e, 0x86, - 0x85, 0x20, 0xb3, 0xb9, 0x40, 0xe0, 0xf7, 0x53, 0x05, 0x66, 0x6e, 0x46, 0x60, 0x26, 0x89, 0xb1, - 0x30, 0x9f, 0x18, 0x2f, 0x59, 0x81, 0x8a, 0x34, 0xfb, 0xda, 0x62, 0xf0, 0x7f, 0xd6, 0x12, 0x05, - 0x2a, 0x8e, 0x8d, 0x98, 0xa5, 0xde, 0x87, 0xa5, 0x78, 0x00, 0x51, 0x4a, 0x95, 0x58, 0x4a, 0x3f, - 0x8a, 0x6b, 0xc4, 0xb0, 0xe1, 0xa7, 0xa2, 0xc9, 0x3e, 0x15, 0xcd, 0x7d, 0xfe, 0xa9, 0x08, 0xb5, - 0xb3, 0x21, 0x37, 0xc0, 0xa3, 0x54, 0xd0, 0xa3, 0x94, 0x76, 0x28, 0x35, 0xc3, 0x58, 0x66, 0x73, - 0xf3, 0x35, 0xfc, 0x5f, 0x15, 0x28, 0x86, 0xe9, 0x40, 0xaf, 0xa0, 0x70, 0x41, 0xa6, 0xc3, 0x31, - 0x76, 0xc5, 0xab, 0xf4, 0x38, 0x35, 0x6d, 0xcd, 0x3d, 0x32, 0x3d, 0xc0, 0x6e, 0x77, 0x42, 0xbd, - 0xa9, 0x91, 0xbf, 0x08, 0x16, 0xf5, 0x2f, 0xa0, 0x14, 0xdb, 0x9e, 0xb7, 0x52, 0x5f, 0x65, 0x3f, - 0x57, 0xf4, 0x23, 0xa8, 0x26, 0x1b, 0x07, 0xfa, 0x12, 0x0a, 0xbc, 0x75, 0xf8, 0xa9, 0xa1, 0x1c, - 0x5b, 0x93, 0x91, 0x4d, 0xfa, 0x9e, 0xe3, 0x12, 0x8f, 0x4e, 0xb9, 0xb7, 0x11, 0x7a, 0xe8, 0x7f, - 0xe7, 0xa0, 0x96, 0x66, 0x81, 0xbe, 0x01, 0x60, 0x1f, 0x0b, 0xd1, 0xc1, 0x94, 0x94, 0x36, 0x34, - 0xc0, 0x23, 0xd9, 0x67, 0x37, 0x63, 0xa8, 0x14, 0x8f, 0x04, 0xe0, 0x35, 0x54, 0x23, 0xf1, 0x87, - 0x52, 0x23, 0x7c, 0x9a, 0x5e, 0x2c, 0x33, 0xb0, 0xe5, 0xc8, 0x5f, 0x20, 0x0f, 0x61, 0x39, 0x12, - 0x55, 0x10, 0xb9, 0x76, 0x4f, 0x52, 0xcb, 0x7c, 0x06, 0x58, 0x09, 0xbd, 0x05, 0x6f, 0x0f, 0x2a, - 0x42, 0xdc, 0x10, 0xc7, 0x5f, 0x01, 0x3d, 0xad, 0x14, 0x66, 0x68, 0x65, 0xe1, 0x2b, 0x60, 0x7d, - 0x28, 0x32, 0x03, 0x4c, 0x1d, 0x4f, 0x83, 0x86, 0xb2, 0x5e, 0x69, 0xbd, 0x78, 0xa7, 0x0e, 0xcd, - 0x2d, 0x67, 0xec, 0x62, 0xcf, 0xf2, 0x59, 0x2b, 0xe7, 0xbe, 0x46, 0x44, 0xd1, 0x1b, 0x80, 0x66, - 0xcf, 0x11, 0x40, 0xbe, 0xfb, 0xfa, 0xa4, 0xbd, 0x7f, 0x5c, 0xcd, 0x6c, 0xae, 0xc0, 0xb2, 0x2b, - 0x80, 0xe2, 0x06, 0xfa, 0x0e, 0xac, 0xa5, 0xdf, 0x3f, 0x39, 0x21, 0x28, 0xb3, 0x13, 0xc2, 0x26, - 0x40, 0x31, 0xe4, 0xe9, 0x5f, 0xc1, 0xca, 0x8c, 0xc2, 0xd2, 0x08, 0xa1, 0x24, 0x47, 0x88, 0xb8, - 0xf7, 0x0f, 0x70, 0xef, 0x06, 0x61, 0xd1, 0x0b, 0xfe, 0xea, 0x5c, 0x61, 0x5b, 0x94, 0x95, 0xdc, - 0xa4, 0xf6, 0xc8, 0xf4, 0x94, 0xd5, 0x7b, 0x1f, 0x5b, 0x2c, 0xcb, 0xec, 0xa5, 0x39, 0xc5, 0xb6, - 0x04, 0x7f, 0x09, 0x4b, 0x71, 0xab, 0xb9, 0x7b, 0xfd, 0xef, 0x0a, 0xac, 0xa6, 0xaa, 0x89, 0xea, - 0x89, 0xc6, 0xcf, 0xae, 0x15, 0xb6, 0xfe, 0x5a, 0xbc, 0xf5, 0xef, 0x66, 0x44, 0x83, 0xd1, 0xe4, - 0xe6, 0xcf, 0x22, 0x15, 0xed, 0xbf, 0x9e, 0x68, 0xff, 0x8c, 0x25, 0x36, 0xa4, 0x5b, 0xfc, 0x91, - 0x85, 0x95, 0x99, 0x4f, 0x39, 0x8b, 0xdc, 0xb6, 0xc6, 0x16, 0x8f, 0xa3, 0x6c, 0xf0, 0x05, 0xdb, - 0x8d, 0x7f, 0x81, 0xf9, 0x02, 0x7d, 0x0b, 0x05, 0xdf, 0xf1, 0xe8, 0x1e, 0x99, 0x06, 0x41, 0x54, - 0x5a, 0xcf, 0x6e, 0x9f, 0x13, 0x9a, 0xc7, 0xdc, 0xda, 0x08, 0xdd, 0xd0, 0x36, 0xa8, 0xec, 0xf1, - 0xc8, 0x33, 0x45, 0xf1, 0x57, 0x5a, 0xeb, 0x73, 0x30, 0x02, 0x7b, 0xe3, 0xda, 0x55, 0xff, 0x10, - 0xd4, 0x68, 0x1f, 0x55, 0x00, 0x3a, 0xdd, 0xe3, 0xad, 0xee, 0x61, 0xa7, 0x77, 0xb8, 0x53, 0xcd, - 0xa0, 0x32, 0xa8, 0xed, 0x68, 0xa9, 0xe8, 0x0f, 0xa0, 0x20, 0xe2, 0x40, 0x2b, 0x50, 0xde, 0x32, - 0xba, 0xed, 0x41, 0xef, 0xe8, 0x70, 0x38, 0xe8, 0x1d, 0x74, 0xab, 0x99, 0xd6, 0xbf, 0x39, 0x28, - 0x31, 0x8d, 0xb6, 0x78, 0x00, 0xe8, 0x14, 0xca, 0xd2, 0x18, 0x8f, 0xe4, 0xee, 0x96, 0xf6, 0x53, - 0xa1, 0xae, 0xdf, 0x66, 0x22, 0xa6, 0xa1, 0x03, 0x80, 0xeb, 0xf1, 0x1d, 0xc9, 0x9d, 0x6d, 0xe6, - 0xe7, 0x41, 0xfd, 0xd1, 0x8d, 0xe7, 0x02, 0xf7, 0x3d, 0x54, 0xe4, 0xc1, 0x14, 0xa5, 0x05, 0x91, - 0x98, 0x80, 0xeb, 0x4f, 0x6e, 0xb5, 0x11, 0xe8, 0x3e, 0x94, 0x62, 0x93, 0x38, 0x9a, 0x09, 0x25, - 0x09, 0x6d, 0xdc, 0x6c, 0x20, 0x88, 0x6d, 0xc8, 0xf3, 0xb1, 0x17, 0xd5, 0xe5, 0xc6, 0x19, 0x1f, - 0xa0, 0xeb, 0xf7, 0x53, 0xcf, 0x04, 0xe2, 0x14, 0xca, 0xd2, 0x94, 0x99, 0x90, 0x25, 0x6d, 0x84, - 0x4e, 0xc8, 0x92, 0x3a, 0xa4, 0xfe, 0x98, 0x0f, 0x7e, 0x04, 0x6e, 0xfc, 0x17, 0x00, 0x00, 0xff, - 0xff, 0x22, 0x14, 0x72, 0xd7, 0x40, 0x0e, 0x00, 0x00, + // 1238 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x5f, 0x73, 0xdb, 0x44, + 0x10, 0xb7, 0xec, 0xd4, 0xb6, 0xd6, 0xb1, 0xe3, 0x1c, 0x4e, 0x2a, 0xdc, 0x96, 0xba, 0x6a, 0xa6, + 0x93, 0x61, 0xc0, 0x05, 0xa7, 0x74, 0xa0, 0x30, 0x80, 0x13, 0x3b, 0x89, 0xc9, 0x3f, 0x57, 0x71, + 0x32, 0xc3, 0xf0, 0xe0, 0x39, 0xa2, 0x8b, 0x11, 0x91, 0x2d, 0x55, 0xba, 0x64, 0xea, 0x27, 0x86, + 0x57, 0xe0, 0x8d, 0x19, 0xbe, 0x0e, 0xdf, 0x80, 0x4f, 0xc4, 0x03, 0x73, 0xba, 0x93, 0xa2, 0x93, + 0x95, 0xd4, 0xe4, 0x25, 0xa3, 0xbb, 0xdd, 0xfd, 0x65, 0x77, 0x7f, 0x7b, 0xbb, 0x6b, 0x28, 0xfb, + 0xc4, 0xbb, 0xb2, 0xce, 0x48, 0xd3, 0xf5, 0x1c, 0xea, 0xa0, 0x92, 0x89, 0x29, 0x3e, 0xc3, 0x14, + 0xdb, 0xce, 0xa8, 0xfe, 0xf0, 0xdc, 0x9e, 0x52, 0x62, 0x99, 0xf6, 0xf3, 0x33, 0xc7, 0x23, 0xcf, + 0x6d, 0x8b, 0x12, 0x0f, 0xdb, 0x3e, 0x57, 0xd5, 0xb7, 0xa1, 0xb6, 0xe5, 0x11, 0x4c, 0x49, 0x07, + 0x53, 0xec, 0x13, 0x6a, 0x90, 0x37, 0x97, 0xc4, 0xa7, 0xa8, 0x09, 0x05, 0x93, 0xdf, 0x68, 0x4a, + 0x43, 0x59, 0x2f, 0xb5, 0x6a, 0xcd, 0x18, 0x68, 0x33, 0xd4, 0x0e, 0x95, 0xf4, 0xfb, 0xb0, 0x92, + 0xc0, 0xf1, 0x5d, 0x67, 0xe2, 0x13, 0xbd, 0x0b, 0xcb, 0x3b, 0x84, 0x26, 0xd0, 0x3f, 0x49, 0xa2, + 0xaf, 0xa6, 0xa1, 0xf7, 0x3a, 0xd7, 0xf8, 0x1d, 0x40, 0x71, 0x18, 0x0e, 0xfe, 0xbf, 0xbd, 0xfc, + 0x4b, 0x09, 0x60, 0xda, 0x1e, 0xb5, 0xce, 0xf1, 0xd9, 0xdd, 0xdd, 0x41, 0x4f, 0xa0, 0x84, 0x05, + 0xc8, 0xd0, 0x32, 0xb5, 0x6c, 0x43, 0x59, 0x57, 0x77, 0x33, 0x06, 0x84, 0x97, 0x3d, 0x13, 0x3d, + 0x80, 0x22, 0xc5, 0xa3, 0xe1, 0x04, 0x8f, 0x89, 0x96, 0x13, 0xf2, 0x02, 0xc5, 0xa3, 0x43, 0x3c, + 0x26, 0x9b, 0x15, 0x58, 0x7c, 0x73, 0x49, 0xbc, 0xe9, 0xf0, 0x27, 0x3c, 0x31, 0x6d, 0xa2, 0xef, + 0xc2, 0x7b, 0x92, 0x5f, 0x22, 0xbe, 0x4f, 0xa1, 0x18, 0x22, 0x0a, 0xcf, 0x56, 0x24, 0xcf, 0x22, + 0x83, 0x48, 0x4d, 0xff, 0x2e, 0x24, 0x22, 0x19, 0xe4, 0x1d, 0xb0, 0x34, 0x58, 0x4d, 0x62, 0x09, + 0x56, 0x37, 0xa0, 0xdc, 0x36, 0xcd, 0x01, 0x1e, 0x85, 0xe8, 0x3a, 0xe4, 0x28, 0x1e, 0x09, 0xe0, + 0xaa, 0x04, 0xcc, 0xb4, 0x98, 0x50, 0xaf, 0x42, 0x25, 0x34, 0x12, 0x30, 0x7f, 0x2b, 0x50, 0xdb, + 0xb7, 0xfc, 0x28, 0x70, 0xff, 0xee, 0x8c, 0x7c, 0x06, 0xf9, 0x73, 0xcb, 0xa6, 0xc4, 0x0b, 0xc8, + 0x28, 0xb5, 0x1e, 0x49, 0x06, 0xdb, 0x81, 0xa8, 0xfb, 0xd6, 0xf5, 0x88, 0xef, 0x5b, 0xce, 0xc4, + 0x10, 0xca, 0xe8, 0x6b, 0x00, 0x17, 0x8f, 0xac, 0x09, 0xa6, 0x96, 0x33, 0x09, 0x78, 0x2a, 0xb5, + 0x3e, 0x90, 0x4c, 0xfb, 0x91, 0xf8, 0xc8, 0x65, 0x7f, 0x7d, 0x23, 0x66, 0xa1, 0x5f, 0xc0, 0x4a, + 0x22, 0x00, 0x41, 0xdd, 0x06, 0xa8, 0x61, 0x1e, 0x7d, 0x4d, 0x69, 0xe4, 0x6e, 0xce, 0xf7, 0xb5, + 0x1e, 0x7a, 0x04, 0x30, 0x21, 0x6f, 0xe9, 0x90, 0x3a, 0x17, 0x64, 0xc2, 0xab, 0xca, 0x50, 0xd9, + 0xcd, 0x80, 0x5d, 0xe8, 0xbf, 0x29, 0x50, 0x10, 0xa1, 0xa3, 0x67, 0x90, 0xb5, 0xcc, 0x77, 0x24, + 0x27, 0x6b, 0x99, 0x8c, 0xf6, 0x31, 0xa1, 0x98, 0x29, 0x88, 0xcc, 0xc8, 0x6e, 0x1c, 0x08, 0xa1, + 0x11, 0xa9, 0xa1, 0x35, 0x28, 0xbb, 0xcc, 0x27, 0x16, 0xe0, 0x1e, 0x99, 0xfa, 0x5a, 0xae, 0x91, + 0x5b, 0x57, 0x0d, 0xf9, 0x52, 0xdf, 0x00, 0xb5, 0x1f, 0x5e, 0xa0, 0x2a, 0xe4, 0x2e, 0xc8, 0x34, + 0x70, 0x47, 0x35, 0xd8, 0x27, 0xaa, 0xc1, 0xbd, 0x2b, 0x6c, 0x5f, 0x12, 0x11, 0x05, 0x3f, 0xe8, + 0xbf, 0x80, 0x1a, 0xb9, 0x87, 0x34, 0x28, 0xb8, 0x9e, 0xf3, 0x33, 0x11, 0x05, 0xa9, 0x1a, 0xe1, + 0x11, 0x21, 0x58, 0x08, 0xde, 0x0d, 0xb7, 0x0d, 0xbe, 0xd1, 0x2a, 0xe4, 0x4d, 0x67, 0x8c, 0x2d, + 0xce, 0x92, 0x6a, 0x88, 0x13, 0x43, 0xb9, 0x22, 0x1e, 0x23, 0x55, 0x5b, 0xe0, 0x28, 0xe2, 0xc8, + 0x50, 0x4e, 0x4e, 0x7a, 0x1d, 0xed, 0x1e, 0x47, 0x61, 0xdf, 0xfa, 0x1f, 0x59, 0x28, 0x86, 0x99, + 0x47, 0x95, 0x28, 0x87, 0x6a, 0x90, 0xab, 0x58, 0xd5, 0x65, 0xe7, 0xab, 0xba, 0x8f, 0x61, 0x21, + 0xc8, 0x6c, 0x2e, 0x20, 0xf8, 0xfd, 0x54, 0x82, 0x99, 0x99, 0x11, 0xa8, 0x49, 0x64, 0x2c, 0xcc, + 0x47, 0xc6, 0x4b, 0x56, 0xa0, 0x22, 0xcd, 0xbe, 0x76, 0x2f, 0xf8, 0x3f, 0xab, 0x89, 0x02, 0x15, + 0x62, 0x23, 0xa6, 0x89, 0xd6, 0x60, 0x81, 0xe2, 0x91, 0xaf, 0xe5, 0x03, 0x8b, 0xd9, 0x17, 0x19, + 0x48, 0xf5, 0x3e, 0x2c, 0xc6, 0xdd, 0x8c, 0x12, 0xaf, 0xc4, 0x12, 0xff, 0x51, 0x9c, 0x49, 0xf6, + 0xcf, 0xc3, 0x81, 0xd2, 0x64, 0x03, 0xa5, 0xb9, 0xcf, 0x07, 0x4a, 0xc8, 0xb0, 0x0d, 0xb9, 0x01, + 0x1e, 0xa5, 0x02, 0x3d, 0x4e, 0x69, 0x9a, 0x52, 0xcb, 0x8c, 0xe5, 0x3f, 0x37, 0xdf, 0x58, 0xf8, + 0x55, 0x81, 0x62, 0x98, 0x34, 0xf4, 0x0a, 0x0a, 0x17, 0x64, 0x3a, 0x1c, 0x63, 0x57, 0x3c, 0xb8, + 0x27, 0xa9, 0xc9, 0x6d, 0xee, 0x91, 0xe9, 0x01, 0x76, 0xbb, 0x13, 0xea, 0x4d, 0x8d, 0xfc, 0x45, + 0x70, 0xa8, 0x7f, 0x01, 0xa5, 0xd8, 0xf5, 0xbc, 0xf5, 0xfc, 0x2a, 0xfb, 0xb9, 0xa2, 0x1f, 0x41, + 0x35, 0xd9, 0x5e, 0xd0, 0x97, 0x50, 0xe0, 0x0d, 0xc6, 0x4f, 0x75, 0xe5, 0xd8, 0x9a, 0x8c, 0x6c, + 0xd2, 0xf7, 0x1c, 0x97, 0x78, 0x74, 0xca, 0xad, 0x8d, 0xd0, 0x42, 0xff, 0x27, 0x07, 0xb5, 0x34, + 0x0d, 0xf4, 0x0d, 0x00, 0x1b, 0x29, 0xa2, 0xcf, 0x29, 0x29, 0xcd, 0x6a, 0x80, 0x47, 0xb2, 0xcd, + 0x6e, 0xc6, 0x50, 0x29, 0x1e, 0x09, 0x80, 0xd7, 0x50, 0x8d, 0x4a, 0x64, 0x28, 0xb5, 0xcb, 0xb5, + 0xf4, 0x92, 0x9a, 0x01, 0x5b, 0x8a, 0xec, 0x05, 0xe4, 0x21, 0x2c, 0x45, 0xa4, 0x0a, 0x44, 0xce, + 0xdd, 0xd3, 0xd4, 0xc7, 0x30, 0x03, 0x58, 0x09, 0xad, 0x05, 0xde, 0x1e, 0x54, 0x04, 0xb9, 0x21, + 0x1c, 0x7f, 0x28, 0x7a, 0x5a, 0x29, 0xcc, 0xa0, 0x95, 0x85, 0xad, 0x00, 0xeb, 0x43, 0x91, 0x29, + 0x60, 0xea, 0x78, 0x1a, 0x34, 0x94, 0xf5, 0x4a, 0xeb, 0xc5, 0x3b, 0x79, 0x68, 0x6e, 0x39, 0x63, + 0x17, 0x7b, 0x96, 0xcf, 0x1a, 0x3e, 0xb7, 0x35, 0x22, 0x14, 0xbd, 0x01, 0x68, 0x56, 0x8e, 0x00, + 0xf2, 0xdd, 0xd7, 0x27, 0xed, 0xfd, 0xe3, 0x6a, 0x66, 0x73, 0x19, 0x96, 0x5c, 0x01, 0x28, 0x22, + 0xd0, 0x77, 0x60, 0x35, 0x3d, 0xfe, 0xe4, 0x1e, 0xa1, 0xcc, 0xee, 0x11, 0x9b, 0x00, 0xc5, 0x10, + 0x4f, 0xff, 0x0a, 0x96, 0x67, 0x18, 0x96, 0x16, 0x0d, 0x25, 0xb9, 0x68, 0xc4, 0xad, 0x7f, 0x80, + 0xfb, 0x37, 0x10, 0x8b, 0x5e, 0xf0, 0xa7, 0x73, 0x85, 0x6d, 0x51, 0x56, 0x72, 0x2b, 0xdb, 0x23, + 0xd3, 0x53, 0x56, 0xef, 0x7d, 0x6c, 0xb1, 0x2c, 0xb3, 0x47, 0x73, 0x8a, 0x6d, 0x09, 0xfc, 0x25, + 0x2c, 0xc6, 0xb5, 0xe6, 0x9e, 0x08, 0xbf, 0x2b, 0xb0, 0x92, 0xca, 0x26, 0xaa, 0x27, 0xc6, 0x03, + 0x0b, 0x2b, 0x1c, 0x10, 0xb5, 0xf8, 0x80, 0xd8, 0xcd, 0x88, 0x06, 0xa3, 0xc9, 0x23, 0x82, 0x79, + 0x2a, 0x86, 0x44, 0x3d, 0x31, 0x24, 0x18, 0x96, 0xb8, 0x90, 0xa2, 0xf8, 0x33, 0x0b, 0xcb, 0x33, + 0x03, 0x9f, 0x79, 0x6e, 0x5b, 0x63, 0x8b, 0xfb, 0x51, 0x36, 0xf8, 0x81, 0xdd, 0xc6, 0xe7, 0x34, + 0x3f, 0xa0, 0x6f, 0xa1, 0xe0, 0x3b, 0x1e, 0xdd, 0x23, 0xd3, 0xc0, 0x89, 0x4a, 0xeb, 0xd9, 0xed, + 0xdb, 0x44, 0xf3, 0x98, 0x6b, 0x1b, 0xa1, 0x19, 0xda, 0x06, 0x95, 0x7d, 0x1e, 0x79, 0xa6, 0x28, + 0xfe, 0x4a, 0x6b, 0x7d, 0x0e, 0x8c, 0x40, 0xdf, 0xb8, 0x36, 0xd5, 0x3f, 0x04, 0x35, 0xba, 0x47, + 0x15, 0x80, 0x4e, 0xf7, 0x78, 0xab, 0x7b, 0xd8, 0xe9, 0x1d, 0xee, 0x54, 0x33, 0xa8, 0x0c, 0x6a, + 0x3b, 0x3a, 0x2a, 0xfa, 0x43, 0x28, 0x08, 0x3f, 0xd0, 0x32, 0x94, 0xb7, 0x8c, 0x6e, 0x7b, 0xd0, + 0x3b, 0x3a, 0x1c, 0x0e, 0x7a, 0x07, 0xdd, 0x6a, 0xa6, 0xf5, 0x6f, 0x0e, 0x4a, 0x8c, 0xa3, 0x2d, + 0xee, 0x00, 0x3a, 0x85, 0xb2, 0xb4, 0xec, 0x23, 0xb9, 0xbb, 0xa5, 0xfd, 0xa0, 0xa8, 0xeb, 0xb7, + 0xa9, 0x88, 0x9d, 0xe9, 0x00, 0xe0, 0x7a, 0xc9, 0x47, 0x72, 0x67, 0x9b, 0xf9, 0x11, 0x51, 0x7f, + 0x7c, 0xa3, 0x5c, 0xc0, 0x7d, 0x0f, 0x15, 0x79, 0x7d, 0x45, 0x69, 0x4e, 0x24, 0xf6, 0xe4, 0xfa, + 0xd3, 0x5b, 0x75, 0x04, 0x74, 0x1f, 0x4a, 0xb1, 0x7d, 0x1d, 0xcd, 0xb8, 0x92, 0x04, 0x6d, 0xdc, + 0xac, 0x20, 0x10, 0xdb, 0x90, 0xe7, 0xcb, 0x31, 0xaa, 0xcb, 0x8d, 0x33, 0xbe, 0x66, 0xd7, 0x1f, + 0xa4, 0xca, 0x04, 0xc4, 0x29, 0x94, 0xa5, 0x5d, 0x34, 0x41, 0x4b, 0xda, 0xa2, 0x9d, 0xa0, 0x25, + 0x75, 0x95, 0xfd, 0x31, 0x1f, 0xfc, 0x54, 0xdc, 0xf8, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x58, + 0x51, 0xf2, 0x66, 0x0e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/datacatalog/protos/idl/service.proto b/datacatalog/protos/idl/service.proto index c9f1da1c34..552e0744cc 100644 --- a/datacatalog/protos/idl/service.proto +++ b/datacatalog/protos/idl/service.proto @@ -100,6 +100,7 @@ message Artifact { repeated ArtifactData data = 3; Metadata metadata = 4; repeated Partition partitions = 5; + repeated Tag tags = 6; } message ArtifactData {