From ebf80bb317f126f85e69a813651054fbf77a2bae Mon Sep 17 00:00:00 2001
From: Alena Petraki <a.petraki@perx.ru>
Date: Mon, 8 Jul 2024 11:14:00 +0000
Subject: [PATCH] =?UTF-8?q?feat(core):=20=D0=92=D0=BD=D0=B5=D1=81=D0=B5?=
 =?UTF-8?q?=D0=BD=D1=8B=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?=
 =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?=
 =?UTF-8?q?=D1=8B=20=D1=81=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?=
 =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Items=20A?=
 =?UTF-8?q?PI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 perxis-proto                                  |    2 +-
 .../grpc/protobuf_type_converters.microgen.go |    4 +-
 pkg/items/errors.go                           |    2 +
 pkg/items/item.go                             |  153 +-
 pkg/items/middleware/caching_middleware.go    |  171 +-
 .../middleware/caching_middleware_test.go     |    3 +-
 pkg/items/mocks/Storage.go                    |   48 +-
 pkg/items/options.go                          |  319 ++-
 pkg/items/storage.go                          |   12 +-
 pkg/items/storage_options.go                  |   94 +
 .../protobuf_endpoint_converters.microgen.go  |   35 +-
 .../grpc/protobuf_type_converters.microgen.go |  242 +--
 proto/items/items.pb.go                       | 1709 ++++++++++-------
 proto/items/items_grpc.pb.go                  |   68 +-
 14 files changed, 1709 insertions(+), 1153 deletions(-)
 create mode 100644 pkg/items/storage_options.go

diff --git a/perxis-proto b/perxis-proto
index 63073e8b..fc23183a 160000
--- a/perxis-proto
+++ b/perxis-proto
@@ -1 +1 @@
-Subproject commit 63073e8bf4bf41368a71e7e2e207625c4c67838d
+Subproject commit fc23183a86463b2aa81e3b7570fad1f873c1e435
diff --git a/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go b/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go
index 6961c709..05ba3008 100644
--- a/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go
@@ -199,7 +199,7 @@ func PtrItemsItemToProto(item *items.Item) (*itemspb.Item, error) {
 		CreatedBy:    item.CreatedBy,
 		UpdatedBy:    item.UpdatedBy,
 		RevisionId:   item.RevisionID,
-		Locale:       item.Locale,
+		LocaleId:     item.LocaleID,
 		//Hidden, Template, Deleted - не передается для delivery
 	}
 
@@ -235,7 +235,7 @@ func ProtoToPtrItemsItem(protoItem *itemspb.Item) (*items.Item, error) {
 		CreatedBy:    protoItem.CreatedBy,
 		UpdatedBy:    protoItem.UpdatedBy,
 		RevisionID:   protoItem.RevisionId,
-		Locale:       protoItem.Locale,
+		LocaleID:     protoItem.LocaleId,
 		//Hidden, Template, Deleted - не передается для delivery
 	}
 
diff --git a/pkg/items/errors.go b/pkg/items/errors.go
index 2d6cc1cf..1dfd328f 100644
--- a/pkg/items/errors.go
+++ b/pkg/items/errors.go
@@ -11,4 +11,6 @@ var (
 	ErrNotFound              = service.ErrNotFound
 	ErrUniqueValueRequired   = errors.New("unique value required")
 	ErrTextSearchNotAvaluble = errors.New("fulltext search is not available in this collection")
+
+	ErrCreateLocalizedItem = errors.New("create only supports default locale")
 )
diff --git a/pkg/items/item.go b/pkg/items/item.go
index 1fc48d61..b29dfe98 100644
--- a/pkg/items/item.go
+++ b/pkg/items/item.go
@@ -3,13 +3,14 @@ package items
 import (
 	"context"
 	"fmt"
-	"reflect"
 	"time"
 
 	"git.perx.ru/perxis/perxis-go/pkg/data"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
+	"git.perx.ru/perxis/perxis-go/pkg/locales"
 	"git.perx.ru/perxis/perxis-go/pkg/schema"
 	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
+	"git.perx.ru/perxis/perxis-go/pkg/schema/localizer"
 	pb "git.perx.ru/perxis/perxis-go/proto/items"
 	"google.golang.org/protobuf/types/known/structpb"
 	"google.golang.org/protobuf/types/known/timestamppb"
@@ -73,7 +74,8 @@ var SystemFields = []string{
 	"revision_description",
 	"data",
 	"translations",
-	"locale",
+	"translations_ids",
+	"locale_id",
 	"deleted",
 	"hidden",
 	"template",
@@ -89,25 +91,37 @@ type Permissions struct {
 }
 
 type Item struct {
-	ID                  string                            `json:"id" bson:"_id"` // ID - Идентификатор записи. Автоматически генерируется системой при сохранении первой ревизии.
-	SpaceID             string                            `json:"spaceId" bson:"-"`
-	EnvID               string                            `json:"envId" bson:"-"`
-	CollectionID        string                            `json:"collectionId" bson:"-"`
-	State               State                             `json:"state" bson:"state"`
-	CreatedRevAt        time.Time                         `json:"createdRevAt,omitempty" bson:"created_rev_at,omitempty"`
-	CreatedBy           string                            `json:"createdBy,omitempty" bson:"created_by,omitempty"`
-	CreatedAt           time.Time                         `json:"createdAt,omitempty" bson:"created_at,omitempty"`
-	UpdatedAt           time.Time                         `json:"updatedAt,omitempty" bson:"updated_at,omitempty"`
-	UpdatedBy           string                            `json:"updatedBy,omitempty" bson:"updated_by,omitempty"`
-	Data                map[string]interface{}            `json:"data" bson:"data"`
-	Locale              string                            `json:"locale" bson:"-"`
-	Translations        map[string]map[string]interface{} `json:"translations" bson:"translations,omitempty"`
-	RevisionID          string                            `json:"revId,omitempty" bson:"revision_id"`
-	RevisionDescription string                            `json:"revDescription,omitempty" bson:"revision_description"`
-	Permissions         *Permissions                      `json:"permissions,omitempty" bson:"-"`
-	SearchScore         float64                           `json:"searchScore,omitempty" bson:"search_score,omitempty"`
-
-	// Флаги записи
+	ID           string                 `json:"id" bson:"_id"` // ID - Идентификатор записи. Автоматически генерируется системой при сохранении первой ревизии.
+	SpaceID      string                 `json:"spaceId" bson:"-"`
+	EnvID        string                 `json:"envId" bson:"-"`
+	CollectionID string                 `json:"collectionId" bson:"-"`
+	State        State                  `json:"state" bson:"state"`
+	CreatedRevAt time.Time              `json:"createdRevAt,omitempty" bson:"created_rev_at,omitempty"`
+	CreatedBy    string                 `json:"createdBy,omitempty" bson:"created_by,omitempty"`
+	CreatedAt    time.Time              `json:"createdAt,omitempty" bson:"created_at,omitempty"`
+	UpdatedAt    time.Time              `json:"updatedAt,omitempty" bson:"updated_at,omitempty"`
+	UpdatedBy    string                 `json:"updatedBy,omitempty" bson:"updated_by,omitempty"`
+	Data         map[string]interface{} `json:"data" bson:"data"`
+
+	// При создании или обновлении идентификатор локали в котором создается запись, опционально.
+	// Если указан, то создается перевод для указанного языка, поле translations игнорируется
+	LocaleID string `json:"locale_id" bson:"-"`
+
+	// Используется при одновременной установке/получении нескольких переводов
+	// Ключами является идентификатор локали, значениями - данные переводов
+	Translations map[string]map[string]interface{} `json:"translations" bson:"translations,omitempty"`
+
+	// Список идентификаторов локалей, для которых есть переводы.
+	// Соответствует ключам в translations
+	TranslationsIDs []string `json:"translations_ids" bson:"translations_ids"`
+
+	RevisionID          string       `json:"revId,omitempty" bson:"revision_id"`
+	RevisionDescription string       `json:"revDescription,omitempty" bson:"revision_description"`
+	Permissions         *Permissions `json:"permissions,omitempty" bson:"-"`
+
+	// Релеватность элемента при полнотекстовом поиске
+	SearchScore float64 `json:"searchScore,omitempty" bson:"search_score,omitempty"`
+
 	Deleted  bool `json:"deleted" bson:"deleted,omitempty"`
 	Hidden   bool `json:"hidden" bson:"hidden,omitempty"`
 	Template bool `json:"template" bson:"template,omitempty"`
@@ -153,8 +167,9 @@ func (i *Item) ToMap() map[string]interface{} {
 		"revision_id":          i.RevisionID,
 		"revision_description": i.RevisionDescription,
 		"data":                 i.Data,
+		"locale_id":            i.LocaleID,
 		"translations":         i.Translations,
-		"locale":               i.Locale,
+		"translations_ids":     i.TranslationsIDs,
 		"deleted":              i.Deleted,
 		"hidden":               i.Hidden,
 		"template":             i.Template,
@@ -162,23 +177,44 @@ func (i *Item) ToMap() map[string]interface{} {
 	}
 }
 
-func (i *Item) SetData(locale string, data map[string]interface{}) {
-	if locale != "" {
+// SetData устанавливает перевод в нужное поле записи, предварительно рассчитав из него дельту по
+// отношению к основным данным
+func (i *Item) SetData(dt map[string]interface{}, localizer *localizer.Localizer) (err error) {
+	if localizer != nil && localizer.LocaleID() != locales.DefaultID {
 		if i.Translations == nil {
 			i.Translations = make(map[string]map[string]interface{})
 		}
-		i.Translations[locale] = data
+		i.Translations[localizer.LocaleID()] = dt
+		i.Translations[localizer.LocaleID()], err = localizer.ExtractTranslation(i.Data, i.Translations)
+		if !data.Contains(localizer.LocaleID(), i.TranslationsIDs) {
+			i.TranslationsIDs = append(i.TranslationsIDs, localizer.LocaleID())
+		}
 		return
 	}
-	i.Data = data
+
+	i.Data = dt
+	return
 }
 
-func (i *Item) GetData(locale string) map[string]interface{} {
-	if locale != "" && i.Translations != nil {
-		translation := i.Translations[locale]
-		return MergeData(i.Data, translation)
+// GetData возвращает полные локализованные данные записи
+func (i *Item) GetData(localizer *localizer.Localizer) (map[string]interface{}, error) {
+	if localizer != nil {
+		return localizer.Localize(i.Data, i.Translations)
 	}
-	return i.Data
+	return i.Data, nil
+}
+
+func (i *Item) Localize(localizer *localizer.Localizer) (err error) {
+	if localizer == nil {
+		return nil
+	}
+	i.Data, err = localizer.Localize(i.Data, i.Translations)
+	if err != nil {
+		return err
+	}
+	i.LocaleID = localizer.LocaleID()
+	i.Translations = nil
+	return nil
 }
 
 func (i Item) Encode(ctx context.Context, s *schema.Schema) (*Item, error) {
@@ -216,40 +252,9 @@ func (i Item) Decode(ctx context.Context, s *schema.Schema) (res *Item, err erro
 	return &i, nil
 }
 
-// MergeData дополняет отсутствующие данные из оригинальных данных
-func MergeData(data ...map[string]interface{}) map[string]interface{} {
-	merge := make(map[string]interface{})
-	for _, d := range data {
-		for k, v := range d {
-			merge[k] = v
-		}
-	}
-	return merge
-}
-
-// ClearData убирает данные которые не изменились по сравнению с оригинальными данными
-func ClearData(data ...map[string]interface{}) map[string]interface{} {
-	var clear map[string]interface{}
-
-	for _, d := range data {
-		if clear == nil {
-			clear = d
-			continue
-		}
-
-		for k, v := range d {
-			if reflect.DeepEqual(clear[k], v) {
-				delete(clear, k)
-			}
-		}
-	}
-
-	return clear
-}
-
 type ProcessDataFunc func(ctx context.Context, sch *schema.Schema, data map[string]interface{}) (map[string]interface{}, error)
 
-func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDataFunc, locales ...string) (*Item, error) {
+func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDataFunc, locales ...*locales.Locale) (*Item, error) {
 	if i.Data != nil {
 		dt, err := fn(ctx, sch, i.Data)
 		if err != nil {
@@ -260,14 +265,22 @@ func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDat
 
 	tr := make(map[string]map[string]interface{})
 	for _, l := range locales {
-
-		data := i.GetData(l)
+		data, err := i.GetData(localizer.NewLocalizer(localizer.Config{
+			Schema:           sch,
+			Locales:          locales,
+			LocaleID:         l.ID,
+			AllowNoPublished: false,
+			AllowDisabled:    false,
+		}))
+		if err != nil {
+			return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l.ID))
+		}
 
 		dt, err := fn(ctx, sch, data)
 		if err != nil {
-			return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l))
+			return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l.ID))
 		}
-		tr[l] = dt
+		tr[l.ID] = dt
 
 	}
 
@@ -472,7 +485,8 @@ func ItemToProto(item *Item) *pb.Item {
 		UpdatedBy:           item.UpdatedBy,
 		RevisionId:          item.RevisionID,
 		RevisionDescription: item.RevisionDescription,
-		Locale:              item.Locale,
+		LocaleId:            item.LocaleID,
+		TranslationsIds:     item.TranslationsIDs,
 		Hidden:              item.Hidden,
 		Template:            item.Template,
 		Deleted:             item.Deleted,
@@ -522,7 +536,8 @@ func ItemFromProto(protoItem *pb.Item) *Item {
 		UpdatedBy:           protoItem.UpdatedBy,
 		RevisionID:          protoItem.RevisionId,
 		RevisionDescription: protoItem.RevisionDescription,
-		Locale:              protoItem.Locale,
+		LocaleID:            protoItem.LocaleId,
+		TranslationsIDs:     protoItem.TranslationsIds,
 		Hidden:              protoItem.Hidden,
 		Template:            protoItem.Template,
 		Deleted:             protoItem.Deleted,
diff --git a/pkg/items/middleware/caching_middleware.go b/pkg/items/middleware/caching_middleware.go
index 44f32a66..60d3bf80 100644
--- a/pkg/items/middleware/caching_middleware.go
+++ b/pkg/items/middleware/caching_middleware.go
@@ -6,7 +6,9 @@ import (
 
 	"git.perx.ru/perxis/perxis-go/pkg/cache"
 	envService "git.perx.ru/perxis/perxis-go/pkg/environments"
+	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	service "git.perx.ru/perxis/perxis-go/pkg/items"
+	"git.perx.ru/perxis/perxis-go/pkg/locales"
 )
 
 func makeKey(ss ...string) string {
@@ -32,20 +34,40 @@ type cachingMiddleware struct {
 }
 
 func (m cachingMiddleware) Get(ctx context.Context, spaceId, envId, collectionId, itemId string, options ...*service.GetOptions) (itm *service.Item, err error) {
+	opts := service.MergeGetOptions(options...)
+	localeID := opts.LocaleID
+	if localeID == "" {
+		localeID = locales.DefaultID
+	}
 
-	value, e := m.cache.Get(makeKey(spaceId, envId, collectionId, itemId))
-	if e == nil {
-		return value.(*service.Item).Clone(), err
+	// Значение из кэша можно достать только в случае, когда не запрашиваются переводы. Для
+	// списка переводов (`item.Translations`) кэш не предусмотрен: предполагается, что это
+	// нечастый запрос и содержание кэша с разными переводами себя не оправдывает
+	var value = make(map[string]*service.Item)
+	if len(opts.TranslationsIDs) == 0 {
+		val, e := m.cache.Get(makeKey(spaceId, envId, collectionId, itemId))
+		if e == nil {
+			value = val.(map[string]*service.Item)
+			if i, ok := value[localeID]; ok {
+				return i.Clone(), nil
+			}
+		}
 	}
+
 	itm, err = m.Items.Get(ctx, spaceId, envId, collectionId, itemId, options...)
 	if err == nil {
 		env, err := m.envs.Get(ctx, itm.SpaceID, itm.EnvID)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrap(err, "get environment")
 		}
-		_ = m.cache.Set(makeKey(itm.SpaceID, env.ID, itm.CollectionID, itm.ID), itm)
-		for _, al := range env.Aliases {
-			_ = m.cache.Set(makeKey(itm.SpaceID, al, itm.CollectionID, itm.ID), itm)
+
+		// Сохраняем в кэш запись без Translations, поскольку значение из кэша также
+		// возвращается только если переводы не запрашиваются
+		itmCached := *itm
+		itmCached.Translations = nil
+		value[localeID] = &itmCached
+		for _, envID := range append(env.Aliases, env.ID) {
+			_ = m.cache.Set(makeKey(itm.SpaceID, envID, itm.CollectionID, itm.ID), value)
 		}
 		return itm.Clone(), err
 	}
@@ -53,106 +75,89 @@ func (m cachingMiddleware) Get(ctx context.Context, spaceId, envId, collectionId
 	return nil, err
 }
 
-func (m cachingMiddleware) Update(ctx context.Context, item *service.Item, options ...*service.UpdateOptions) (err error) {
+func (m cachingMiddleware) invalidateCache(ctx context.Context, item *service.Item) (err error) {
+	env, err := m.envs.Get(ctx, item.SpaceID, item.EnvID)
+	if err != nil {
+		return errors.Wrap(err, "get environment")
+	}
+	for _, a := range append(env.Aliases, env.ID) {
+		key := makeKey(item.SpaceID, a, item.CollectionID, item.ID)
+		_ = m.cache.Remove(key)
+		_ = m.cachePublished.Remove(key)
+	}
+	return nil
+}
 
+// Update вызывает удаление всех сохраненных в кэше значений для записи:
+//   - Каждую из локализаций записи
+//   - С ключами, составленных из разных алиасов окружения
+func (m cachingMiddleware) Update(ctx context.Context, item *service.Item, options ...*service.UpdateOptions) (err error) {
 	err = m.Items.Update(ctx, item, options...)
-	if err == nil {
-		env, err := m.envs.Get(ctx, item.SpaceID, item.EnvID)
-		if err != nil {
-			return err
-		}
-		_ = m.cache.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		_ = m.cachePublished.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		for _, al := range env.Aliases {
-			_ = m.cache.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-			_ = m.cachePublished.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-		}
+	if err != nil {
+		return err
 	}
-	return err
+	return m.invalidateCache(ctx, item)
 }
 
 func (m cachingMiddleware) Delete(ctx context.Context, del *service.Item, options ...*service.DeleteOptions) (err error) {
-
 	err = m.Items.Delete(ctx, del, options...)
-	if err == nil {
-		env, err := m.envs.Get(ctx, del.SpaceID, del.EnvID)
-		if err != nil {
-			return err
-		}
-		_ = m.cache.Remove(makeKey(del.SpaceID, env.ID, del.CollectionID, del.ID))
-		_ = m.cachePublished.Remove(makeKey(del.SpaceID, env.ID, del.CollectionID, del.ID))
-		for _, al := range env.Aliases {
-			_ = m.cache.Remove(makeKey(del.SpaceID, al, del.CollectionID, del.ID))
-			_ = m.cachePublished.Remove(makeKey(del.SpaceID, al, del.CollectionID, del.ID))
-		}
-
+	if err != nil {
+		return err
 	}
-	return err
+	return m.invalidateCache(ctx, del)
 }
 
 func (m cachingMiddleware) Publish(ctx context.Context, item *service.Item, options ...*service.PublishOptions) (err error) {
-
 	err = m.Items.Publish(ctx, item, options...)
-	if err == nil {
-		env, err := m.envs.Get(ctx, item.SpaceID, item.EnvID)
-		if err != nil {
-			return err
-		}
-		_ = m.cache.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		_ = m.cachePublished.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		for _, al := range env.Aliases {
-			_ = m.cache.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-			_ = m.cachePublished.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-		}
+	if err != nil {
+		return err
 	}
-	return err
+	return m.invalidateCache(ctx, item)
 }
 
 func (m cachingMiddleware) Unpublish(ctx context.Context, item *service.Item, options ...*service.UnpublishOptions) (err error) {
-
 	err = m.Items.Unpublish(ctx, item, options...)
-	if err == nil {
-		env, err := m.envs.Get(ctx, item.SpaceID, item.EnvID)
-		if err != nil {
-			return err
-		}
-		_ = m.cache.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		_ = m.cachePublished.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		for _, al := range env.Aliases {
-			_ = m.cache.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-			_ = m.cachePublished.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-		}
+	if err != nil {
+		return err
 	}
-	return err
+	return m.invalidateCache(ctx, item)
 }
 
 func (m cachingMiddleware) GetPublished(ctx context.Context, spaceId, envId, collectionId, itemId string, options ...*service.GetPublishedOptions) (itm *service.Item, err error) {
-
 	opts := service.MergeGetPublishedOptions(options...)
+	localeID := opts.LocaleID
+	if localeID == "" {
+		localeID = locales.DefaultID
+	}
 
-	val, e := m.cachePublished.Get(makeKey(spaceId, envId, collectionId, itemId))
-	if e == nil {
-		value := val.(map[string]*service.Item)
-		if i, ok := value[opts.LocaleID]; ok {
-			return i.Clone(), nil
+	// Значение из кэша можно достать только в случае, когда не запрашиваются переводы. Для
+	// списка переводов (`item.Translations`) кэш не предусмотрен: предполагается, что это
+	// нечастый запрос и содержание кэша с разными переводами себя не оправдывает
+	var value = make(map[string]*service.Item)
+	if len(opts.TranslationsIDs) == 0 {
+		val, e := m.cachePublished.Get(makeKey(spaceId, envId, collectionId, itemId))
+		if e == nil {
+			value = val.(map[string]*service.Item)
+			if i, ok := value[localeID]; ok {
+				return i.Clone(), nil
+			}
 		}
 	}
 
 	itm, err = m.Items.GetPublished(ctx, spaceId, envId, collectionId, itemId, opts)
-
 	if err == nil {
 		env, err := m.envs.Get(ctx, itm.SpaceID, itm.EnvID)
 		if err != nil {
 			return nil, err
 		}
-		var value = make(map[string]*service.Item)
-		if val != nil {
-			value = val.(map[string]*service.Item)
-		}
-		value[opts.LocaleID] = itm
-		_ = m.cachePublished.Set(makeKey(itm.SpaceID, env.ID, itm.CollectionID, itm.ID), value)
-		for _, al := range env.Aliases {
-			_ = m.cachePublished.Set(makeKey(itm.SpaceID, al, itm.CollectionID, itm.ID), value)
+
+		// Сохраняем в кэш запись без Translations, поскольку значение из кэша также
+		// возвращается только если переводы не запрашиваются
+		itmCached := *itm
+		itmCached.Translations = nil
+		value[localeID] = &itmCached
+		for _, envID := range append(env.Aliases, env.ID) {
+			_ = m.cachePublished.Set(makeKey(itm.SpaceID, envID, itm.CollectionID, itm.ID), value)
 		}
 		return itm.Clone(), err
 	}
@@ -161,19 +166,9 @@ func (m cachingMiddleware) GetPublished(ctx context.Context, spaceId, envId, col
 }
 
 func (m cachingMiddleware) Archive(ctx context.Context, item *service.Item, options ...*service.ArchiveOptions) (err error) {
-
 	err = m.Items.Archive(ctx, item, options...)
-	if err == nil {
-		env, err := m.envs.Get(ctx, item.SpaceID, item.EnvID)
-		if err != nil {
-			return err
-		}
-		_ = m.cache.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		_ = m.cachePublished.Remove(makeKey(item.SpaceID, env.ID, item.CollectionID, item.ID))
-		for _, al := range env.Aliases {
-			_ = m.cache.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-			_ = m.cachePublished.Remove(makeKey(item.SpaceID, al, item.CollectionID, item.ID))
-		}
+	if err != nil {
+		return err
 	}
-	return err
+	return m.invalidateCache(ctx, item)
 }
diff --git a/pkg/items/middleware/caching_middleware_test.go b/pkg/items/middleware/caching_middleware_test.go
index 20fd583e..4d777647 100644
--- a/pkg/items/middleware/caching_middleware_test.go
+++ b/pkg/items/middleware/caching_middleware_test.go
@@ -71,7 +71,8 @@ func TestItemsCache(t *testing.T) {
 
 		v2, err := svc.Get(ctx, spaceID, envAlias, colID, itemID)
 		require.NoError(t, err)
-		assert.Equal(t, v1, v2, "Ожидается получение объекта из кеша, при повторном запросе.")
+		assert.Equal(t, v1, v2, "Ожидается получение равного объекта из кеша при повторном запросе.")
+		assert.NotSame(t, v1, v2, "Создается копия объекта для хранения в кэше")
 
 		v3, err := svc.Get(ctx, spaceID, envID, colID, itemID)
 		assert.Equal(t, v3, v2, "Ожидается получение объекта из кеша, при запросе того же объекта по ID окружения.")
diff --git a/pkg/items/mocks/Storage.go b/pkg/items/mocks/Storage.go
index 583310ec..c8add5d9 100644
--- a/pkg/items/mocks/Storage.go
+++ b/pkg/items/mocks/Storage.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
+// Code generated by mockery v2.40.3. DO NOT EDIT.
 
 package mocks
 
@@ -217,7 +217,7 @@ func (_m *Storage) CreateRevision(ctx context.Context, spaceId string, envId str
 }
 
 // Find provides a mock function with given fields: ctx, coll, filter, opts
-func (_m *Storage) Find(ctx context.Context, coll *collections.Collection, filter *items.Filter, opts ...*items.FindOptions) ([]*items.Item, int, error) {
+func (_m *Storage) Find(ctx context.Context, coll *collections.Collection, filter *items.Filter, opts ...*items.StorageFindOptions) ([]*items.Item, int, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -234,10 +234,10 @@ func (_m *Storage) Find(ctx context.Context, coll *collections.Collection, filte
 	var r0 []*items.Item
 	var r1 int
 	var r2 error
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindOptions) ([]*items.Item, int, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) ([]*items.Item, int, error)); ok {
 		return rf(ctx, coll, filter, opts...)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindOptions) []*items.Item); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) []*items.Item); ok {
 		r0 = rf(ctx, coll, filter, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -245,13 +245,13 @@ func (_m *Storage) Find(ctx context.Context, coll *collections.Collection, filte
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindOptions) int); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) int); ok {
 		r1 = rf(ctx, coll, filter, opts...)
 	} else {
 		r1 = ret.Get(1).(int)
 	}
 
-	if rf, ok := ret.Get(2).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindOptions) error); ok {
+	if rf, ok := ret.Get(2).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) error); ok {
 		r2 = rf(ctx, coll, filter, opts...)
 	} else {
 		r2 = ret.Error(2)
@@ -261,7 +261,7 @@ func (_m *Storage) Find(ctx context.Context, coll *collections.Collection, filte
 }
 
 // FindArchived provides a mock function with given fields: ctx, coll, filter, opts
-func (_m *Storage) FindArchived(ctx context.Context, coll *collections.Collection, filter *items.Filter, opts ...*items.FindArchivedOptions) ([]*items.Item, int, error) {
+func (_m *Storage) FindArchived(ctx context.Context, coll *collections.Collection, filter *items.Filter, opts ...*items.StorageFindOptions) ([]*items.Item, int, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -278,10 +278,10 @@ func (_m *Storage) FindArchived(ctx context.Context, coll *collections.Collectio
 	var r0 []*items.Item
 	var r1 int
 	var r2 error
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindArchivedOptions) ([]*items.Item, int, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) ([]*items.Item, int, error)); ok {
 		return rf(ctx, coll, filter, opts...)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindArchivedOptions) []*items.Item); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) []*items.Item); ok {
 		r0 = rf(ctx, coll, filter, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -289,13 +289,13 @@ func (_m *Storage) FindArchived(ctx context.Context, coll *collections.Collectio
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindArchivedOptions) int); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) int); ok {
 		r1 = rf(ctx, coll, filter, opts...)
 	} else {
 		r1 = ret.Get(1).(int)
 	}
 
-	if rf, ok := ret.Get(2).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindArchivedOptions) error); ok {
+	if rf, ok := ret.Get(2).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) error); ok {
 		r2 = rf(ctx, coll, filter, opts...)
 	} else {
 		r2 = ret.Error(2)
@@ -305,7 +305,7 @@ func (_m *Storage) FindArchived(ctx context.Context, coll *collections.Collectio
 }
 
 // FindPublished provides a mock function with given fields: ctx, coll, filter, opts
-func (_m *Storage) FindPublished(ctx context.Context, coll *collections.Collection, filter *items.Filter, opts ...*items.FindPublishedOptions) ([]*items.Item, int, error) {
+func (_m *Storage) FindPublished(ctx context.Context, coll *collections.Collection, filter *items.Filter, opts ...*items.StorageFindOptions) ([]*items.Item, int, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -322,10 +322,10 @@ func (_m *Storage) FindPublished(ctx context.Context, coll *collections.Collecti
 	var r0 []*items.Item
 	var r1 int
 	var r2 error
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindPublishedOptions) ([]*items.Item, int, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) ([]*items.Item, int, error)); ok {
 		return rf(ctx, coll, filter, opts...)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindPublishedOptions) []*items.Item); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) []*items.Item); ok {
 		r0 = rf(ctx, coll, filter, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -333,13 +333,13 @@ func (_m *Storage) FindPublished(ctx context.Context, coll *collections.Collecti
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindPublishedOptions) int); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) int); ok {
 		r1 = rf(ctx, coll, filter, opts...)
 	} else {
 		r1 = ret.Get(1).(int)
 	}
 
-	if rf, ok := ret.Get(2).(func(context.Context, *collections.Collection, *items.Filter, ...*items.FindPublishedOptions) error); ok {
+	if rf, ok := ret.Get(2).(func(context.Context, *collections.Collection, *items.Filter, ...*items.StorageFindOptions) error); ok {
 		r2 = rf(ctx, coll, filter, opts...)
 	} else {
 		r2 = ret.Error(2)
@@ -349,7 +349,7 @@ func (_m *Storage) FindPublished(ctx context.Context, coll *collections.Collecti
 }
 
 // GetRevision provides a mock function with given fields: ctx, coll, itemId, revisionId, options
-func (_m *Storage) GetRevision(ctx context.Context, coll *collections.Collection, itemId string, revisionId string, options ...*items.GetRevisionOptions) (*items.Item, error) {
+func (_m *Storage) GetRevision(ctx context.Context, coll *collections.Collection, itemId string, revisionId string, options ...*items.StorageFindOptions) (*items.Item, error) {
 	_va := make([]interface{}, len(options))
 	for _i := range options {
 		_va[_i] = options[_i]
@@ -365,10 +365,10 @@ func (_m *Storage) GetRevision(ctx context.Context, coll *collections.Collection
 
 	var r0 *items.Item
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, string, ...*items.GetRevisionOptions) (*items.Item, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, string, ...*items.StorageFindOptions) (*items.Item, error)); ok {
 		return rf(ctx, coll, itemId, revisionId, options...)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, string, ...*items.GetRevisionOptions) *items.Item); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, string, ...*items.StorageFindOptions) *items.Item); ok {
 		r0 = rf(ctx, coll, itemId, revisionId, options...)
 	} else {
 		if ret.Get(0) != nil {
@@ -376,7 +376,7 @@ func (_m *Storage) GetRevision(ctx context.Context, coll *collections.Collection
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, string, string, ...*items.GetRevisionOptions) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, string, string, ...*items.StorageFindOptions) error); ok {
 		r1 = rf(ctx, coll, itemId, revisionId, options...)
 	} else {
 		r1 = ret.Error(1)
@@ -411,7 +411,7 @@ func (_m *Storage) Init(ctx context.Context, collection *collections.Collection,
 }
 
 // ListRevisions provides a mock function with given fields: ctx, coll, itemId, options
-func (_m *Storage) ListRevisions(ctx context.Context, coll *collections.Collection, itemId string, options ...*items.ListRevisionsOptions) ([]*items.Item, error) {
+func (_m *Storage) ListRevisions(ctx context.Context, coll *collections.Collection, itemId string, options ...*items.StorageFindOptions) ([]*items.Item, error) {
 	_va := make([]interface{}, len(options))
 	for _i := range options {
 		_va[_i] = options[_i]
@@ -427,10 +427,10 @@ func (_m *Storage) ListRevisions(ctx context.Context, coll *collections.Collecti
 
 	var r0 []*items.Item
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, ...*items.ListRevisionsOptions) ([]*items.Item, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, ...*items.StorageFindOptions) ([]*items.Item, error)); ok {
 		return rf(ctx, coll, itemId, options...)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, ...*items.ListRevisionsOptions) []*items.Item); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *collections.Collection, string, ...*items.StorageFindOptions) []*items.Item); ok {
 		r0 = rf(ctx, coll, itemId, options...)
 	} else {
 		if ret.Get(0) != nil {
@@ -438,7 +438,7 @@ func (_m *Storage) ListRevisions(ctx context.Context, coll *collections.Collecti
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, string, ...*items.ListRevisionsOptions) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *collections.Collection, string, ...*items.StorageFindOptions) error); ok {
 		r1 = rf(ctx, coll, itemId, options...)
 	} else {
 		r1 = ret.Error(1)
diff --git a/pkg/items/options.go b/pkg/items/options.go
index 0c6bd909..a6a81a12 100644
--- a/pkg/items/options.go
+++ b/pkg/items/options.go
@@ -1,6 +1,9 @@
 package items
 
-import "git.perx.ru/perxis/perxis-go/pkg/options"
+import (
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+	pb "git.perx.ru/perxis/perxis-go/proto/items"
+)
 
 type Options struct {
 	Env               map[string]interface{}
@@ -48,9 +51,27 @@ func MergeCreateOptions(opts ...*CreateOptions) *CreateOptions {
 	return o
 }
 
+func CreateOptionsToProto(opts ...*CreateOptions) *pb.CreateOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeCreateOptions(opts...)
+	return &pb.CreateOptions{
+		UpdateAttrs: o.UpdateAttrs,
+	}
+}
+
+func CreateOptionsFromProto(opts *pb.CreateOptions) *CreateOptions {
+	if opts == nil {
+		return nil
+	}
+	return &CreateOptions{
+		UpdateAttrs: opts.UpdateAttrs,
+	}
+}
+
 type IntrospectOptions struct {
 	Options
-	Locale string
 }
 
 func MergeIntrospectOptions(opts ...*IntrospectOptions) *IntrospectOptions {
@@ -66,6 +87,12 @@ func MergeIntrospectOptions(opts ...*IntrospectOptions) *IntrospectOptions {
 
 type GetOptions struct {
 	Options
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func MergeGetOptions(opts ...*GetOptions) *GetOptions {
@@ -75,17 +102,49 @@ func MergeGetOptions(opts ...*GetOptions) *GetOptions {
 			continue
 		}
 		o.Options = MergeOptions(o.Options, opt.Options)
+		if opt.LocaleID != "" {
+			o.LocaleID = opt.LocaleID
+		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
 	}
 	return o
 }
 
+func GetOptionsToProto(opts ...*GetOptions) *pb.GetOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeGetOptions(opts...)
+	return &pb.GetOptions{
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+	}
+}
+
+func GetOptionsFromProto(opts *pb.GetOptions) *GetOptions {
+	if opts == nil {
+		return nil
+	}
+	return &GetOptions{
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
+	}
+}
+
 type FindOptions struct {
 	Options
 	options.FindOptions
+
 	Deleted   bool
 	Regular   bool
 	Hidden    bool
 	Templates bool
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func NewFindOptions(opts ...interface{}) *FindOptions {
@@ -106,6 +165,44 @@ func MergeFindOptions(opts ...*FindOptions) *FindOptions {
 		o.Deleted = o.Deleted || opt.Deleted
 		o.Options = MergeOptions(o.Options, opt.Options)
 		o.FindOptions = *options.MergeFindOptions(&o.FindOptions, &opt.FindOptions)
+		if opt.LocaleID != "" {
+			o.LocaleID = opt.LocaleID
+		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
+	}
+	return o
+}
+
+func FindOptionsToProto(opts ...*FindOptions) *pb.FindOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeFindOptions(opts...)
+	return &pb.FindOptions{
+		Deleted:         o.Deleted,
+		Regular:         o.Regular,
+		Hidden:          o.Hidden,
+		Templates:       o.Templates,
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+		Options:         options.FindOptionsToPB(&o.FindOptions),
+	}
+}
+
+func FindOptionsFromProto(opts *pb.FindOptions) *FindOptions {
+	if opts == nil {
+		return nil
+	}
+	o := &FindOptions{
+		Deleted:         opts.Deleted,
+		Regular:         opts.Regular,
+		Hidden:          opts.Hidden,
+		Templates:       opts.Templates,
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
+	}
+	if fo := options.FindOptionsFromPB(opts.Options); fo != nil {
+		o.FindOptions = *fo
 	}
 	return o
 }
@@ -131,6 +228,25 @@ func MergeUpdateOptions(opts ...*UpdateOptions) *UpdateOptions {
 	return o
 }
 
+func UpdateOptionsToProto(opts ...*UpdateOptions) *pb.UpdateOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeUpdateOptions(opts...)
+	return &pb.UpdateOptions{
+		UpdateAttrs: o.UpdateAttrs,
+	}
+}
+
+func UpdateOptionsFromProto(opts *pb.UpdateOptions) *UpdateOptions {
+	if opts == nil {
+		return nil
+	}
+	return &UpdateOptions{
+		UpdateAttrs: opts.UpdateAttrs,
+	}
+}
+
 type DeleteOptions struct {
 	Options
 
@@ -156,6 +272,27 @@ func MergeDeleteOptions(options ...*DeleteOptions) *DeleteOptions {
 	return o
 }
 
+func DeleteOptionsToProto(opts ...*DeleteOptions) *pb.DeleteOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeDeleteOptions(opts...)
+	return &pb.DeleteOptions{
+		UpdateAttrs: o.UpdateAttrs,
+		Erase:       o.Erase,
+	}
+}
+
+func DeleteOptionsFromProto(opts *pb.DeleteOptions) *DeleteOptions {
+	if opts == nil {
+		return nil
+	}
+	return &DeleteOptions{
+		UpdateAttrs: opts.UpdateAttrs,
+		Erase:       opts.Erase,
+	}
+}
+
 type SoftDeleteOptions struct {
 	Options
 }
@@ -236,7 +373,12 @@ func MergeUnpublishOptions(opts ...*UnpublishOptions) *UnpublishOptions {
 
 type GetPublishedOptions struct {
 	Options
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
 	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func NewGetPublishedOptions(oo ...interface{}) *GetPublishedOptions {
@@ -245,6 +387,8 @@ func NewGetPublishedOptions(oo ...interface{}) *GetPublishedOptions {
 		switch o := o.(type) {
 		case string:
 			fo.LocaleID = o
+		case []string:
+			fo.TranslationsIDs = o
 		}
 	}
 	return fo
@@ -260,17 +404,46 @@ func MergeGetPublishedOptions(opts ...*GetPublishedOptions) *GetPublishedOptions
 		if opt.LocaleID != "" {
 			o.LocaleID = opt.LocaleID
 		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
 	}
 	return o
 }
 
+func GetPublishedOptionsToProto(opts ...*GetPublishedOptions) *pb.GetPublishedOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeGetPublishedOptions(opts...)
+	return &pb.GetPublishedOptions{
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+	}
+}
+
+func GetPublishedOptionsFromProto(opts *pb.GetPublishedOptions) *GetPublishedOptions {
+	if opts == nil {
+		return nil
+	}
+	return &GetPublishedOptions{
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
+	}
+}
+
 type FindPublishedOptions struct {
 	Options
 	options.FindOptions
-	LocaleID  string
+
+	Deleted   bool
 	Regular   bool
 	Hidden    bool
 	Templates bool
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func NewFindPublishedOptions(opts ...interface{}) *FindPublishedOptions {
@@ -301,12 +474,51 @@ func MergeFindPublishedOptions(opts ...*FindPublishedOptions) *FindPublishedOpti
 		if opt.LocaleID != "" {
 			o.LocaleID = opt.LocaleID
 		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
+	}
+	return o
+}
+
+func FindPublishedOptionsToProto(opts ...*FindPublishedOptions) *pb.FindPublishedOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeFindPublishedOptions(opts...)
+	return &pb.FindPublishedOptions{
+		Regular:         o.Regular,
+		Hidden:          o.Hidden,
+		Templates:       o.Templates,
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+		Options:         options.FindOptionsToPB(&o.FindOptions),
+	}
+}
+
+func FindPublishedOptionsFromProto(opts *pb.FindPublishedOptions) *FindPublishedOptions {
+	if opts == nil {
+		return nil
+	}
+	o := &FindPublishedOptions{
+		Regular:         opts.Regular,
+		Hidden:          opts.Hidden,
+		Templates:       opts.Templates,
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
+	}
+	if fo := options.FindOptionsFromPB(opts.Options); fo != nil {
+		o.FindOptions = *fo
 	}
 	return o
 }
 
 type GetRevisionOptions struct {
 	Options
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func MergeGetRevisionOptions(opts ...*GetRevisionOptions) *GetRevisionOptions {
@@ -316,6 +528,33 @@ func MergeGetRevisionOptions(opts ...*GetRevisionOptions) *GetRevisionOptions {
 			continue
 		}
 		o.Options = MergeOptions(o.Options, opt.Options)
+
+		if opt.LocaleID != "" {
+			o.LocaleID = opt.LocaleID
+		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
+	}
+	return o
+}
+
+func GetRevisionOptionsToProto(opts ...*GetRevisionOptions) *pb.GetRevisionOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeGetRevisionOptions(opts...)
+	return &pb.GetRevisionOptions{
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+	}
+}
+
+func GetRevisionOptionsFromProto(opts *pb.GetRevisionOptions) *GetRevisionOptions {
+	if opts == nil {
+		return nil
+	}
+	o := &GetRevisionOptions{
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
 	}
 	return o
 }
@@ -323,6 +562,12 @@ func MergeGetRevisionOptions(opts ...*GetRevisionOptions) *GetRevisionOptions {
 type ListRevisionsOptions struct {
 	Options
 	options.FindOptions
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func MergeListRevisionsOptions(opts ...*ListRevisionsOptions) *ListRevisionsOptions {
@@ -333,6 +578,37 @@ func MergeListRevisionsOptions(opts ...*ListRevisionsOptions) *ListRevisionsOpti
 		}
 		o.Options = MergeOptions(o.Options, opt.Options)
 		o.FindOptions = *options.MergeFindOptions(&o.FindOptions, &opt.FindOptions)
+
+		if opt.LocaleID != "" {
+			o.LocaleID = opt.LocaleID
+		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
+	}
+	return o
+}
+
+func ListRevisionsOptionsToProto(opts ...*ListRevisionsOptions) *pb.ListRevisionsOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeListRevisionsOptions(opts...)
+	return &pb.ListRevisionsOptions{
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+		Options:         options.FindOptionsToPB(&o.FindOptions),
+	}
+}
+
+func ListRevisionsOptionsFromProto(opts *pb.ListRevisionsOptions) *ListRevisionsOptions {
+	if opts == nil {
+		return nil
+	}
+	o := &ListRevisionsOptions{
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
+	}
+	if fo := options.FindOptionsFromPB(opts.Options); fo != nil {
+		o.FindOptions = *fo
 	}
 	return o
 }
@@ -355,6 +631,12 @@ func MergeArchiveOptions(opts ...*ArchiveOptions) *ArchiveOptions {
 type FindArchivedOptions struct {
 	Options
 	options.FindOptions
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
 }
 
 func NewFindArchivedOptions(oo ...interface{}) *FindArchivedOptions {
@@ -371,6 +653,37 @@ func MergeFindArchivedOptions(opts ...*FindArchivedOptions) *FindArchivedOptions
 		}
 		o.Options = MergeOptions(o.Options, opt.Options)
 		o.FindOptions = *options.MergeFindOptions(o.FindOptions, opt.FindOptions)
+
+		if opt.LocaleID != "" {
+			o.LocaleID = opt.LocaleID
+		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
+	}
+	return o
+}
+
+func FindArchivedOptionsToProto(opts ...*FindArchivedOptions) *pb.FindArchivedOptions {
+	if opts == nil {
+		return nil
+	}
+	o := MergeFindArchivedOptions(opts...)
+	return &pb.FindArchivedOptions{
+		LocaleId:        o.LocaleID,
+		TranslationsIds: o.TranslationsIDs,
+		Options:         options.FindOptionsToPB(&o.FindOptions),
+	}
+}
+
+func FindArchivedOptionsFromProto(opts *pb.FindArchivedOptions) *FindArchivedOptions {
+	if opts == nil {
+		return nil
+	}
+	o := &FindArchivedOptions{
+		LocaleID:        opts.LocaleId,
+		TranslationsIDs: opts.TranslationsIds,
+	}
+	if fo := options.FindOptionsFromPB(opts.Options); fo != nil {
+		o.FindOptions = *fo
 	}
 	return o
 }
diff --git a/pkg/items/storage.go b/pkg/items/storage.go
index 19b98c9c..2c2d041f 100644
--- a/pkg/items/storage.go
+++ b/pkg/items/storage.go
@@ -32,17 +32,17 @@ type Storage interface {
 	// CreateRevision - перенести ревизию в коллекцию Revisions
 	CreateRevision(ctx context.Context, spaceId, envId, collectionId, itemId string) error
 
-	// Update - Обновление текущей ревизии или создание новой, если в опциях передан флаг `ReplacePublishedRevision`
+	// Update - Обновление текущей ревизии
 	Update(ctx context.Context, coll *collections.Collection, item *Item, options ...*UpdateOptions) error
 
 	// Find - поиск записей по рабочим записям, коллекция 'items'
-	Find(ctx context.Context, coll *collections.Collection, filter *Filter, opts ...*FindOptions) ([]*Item, int, error)
+	Find(ctx context.Context, coll *collections.Collection, filter *Filter, opts ...*StorageFindOptions) ([]*Item, int, error)
 
 	// GetRevision - поиск одной ревизии одной записи
-	GetRevision(ctx context.Context, coll *collections.Collection, itemId, revisionId string, options ...*GetRevisionOptions) (*Item, error)
+	GetRevision(ctx context.Context, coll *collections.Collection, itemId, revisionId string, options ...*StorageFindOptions) (*Item, error)
 
 	// ListRevisions - поиск всех ревизий одной записи
-	ListRevisions(ctx context.Context, coll *collections.Collection, itemId string, options ...*ListRevisionsOptions) ([]*Item, error)
+	ListRevisions(ctx context.Context, coll *collections.Collection, itemId string, options ...*StorageFindOptions) ([]*Item, error)
 
 	// ChangeRevisionsItemID - заменить ID элемента у его ревизий
 	ChangeRevisionsItemID(ctx context.Context, spaceId, envId, collectionId, itemId, newItemId string) error
@@ -54,7 +54,7 @@ type Storage interface {
 	Unpublish(ctx context.Context, unpublished *Item, options ...*UnpublishOptions) error
 
 	// FindPublished - поиск по опубликованным записям, коллекция 'items_published'
-	FindPublished(ctx context.Context, coll *collections.Collection, filter *Filter, opts ...*FindPublishedOptions) ([]*Item, int, error)
+	FindPublished(ctx context.Context, coll *collections.Collection, filter *Filter, opts ...*StorageFindOptions) ([]*Item, int, error)
 
 	// Archive - архивация записи
 	Archive(ctx context.Context, archived *Item, options ...*ArchiveOptions) error
@@ -63,7 +63,7 @@ type Storage interface {
 	Unarchive(ctx context.Context, unarchived *Item, options ...*UnarchiveOptions) error
 
 	// FindArchived - поиск по архивированным записям, коллекция 'items_archived'
-	FindArchived(ctx context.Context, coll *collections.Collection, filter *Filter, opts ...*FindArchivedOptions) ([]*Item, int, error)
+	FindArchived(ctx context.Context, coll *collections.Collection, filter *Filter, opts ...*StorageFindOptions) ([]*Item, int, error)
 
 	// RemoveItems - удаление записи из коллекций Items
 	RemoveItems(ctx context.Context, spaceId, envId, collectionId, itemId string, options ...*DeleteOptions) error
diff --git a/pkg/items/storage_options.go b/pkg/items/storage_options.go
new file mode 100644
index 00000000..a56232fb
--- /dev/null
+++ b/pkg/items/storage_options.go
@@ -0,0 +1,94 @@
+package items
+
+import (
+	"git.perx.ru/perxis/perxis-go/pkg/locales"
+	"git.perx.ru/perxis/perxis-go/pkg/options"
+)
+
+type StorageFindOptions struct {
+	Options
+	options.FindOptions
+
+	Deleted   bool
+	Regular   bool
+	Hidden    bool
+	Templates bool
+
+	// Язык перевода, который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	LocaleID string
+
+	// Список идентификаторов переводов/локалей, которых должны быть включены в результат
+	TranslationsIDs []string
+
+	// Список локалей пространства
+	Locales []*locales.Locale
+}
+
+func NewStorageFindOptions(opts ...interface{}) *StorageFindOptions {
+	fo := &StorageFindOptions{}
+	for _, o := range opts {
+		switch o := o.(type) {
+		case *FindOptions:
+			fo.Options = o.Options
+			fo.FindOptions = o.FindOptions
+			fo.Deleted = o.Deleted
+			fo.Regular = o.Regular
+			fo.Hidden = o.Hidden
+			fo.Templates = o.Templates
+			fo.LocaleID = o.LocaleID
+			fo.TranslationsIDs = o.TranslationsIDs
+		case *FindPublishedOptions:
+			fo.Options = o.Options
+			fo.FindOptions = o.FindOptions
+			fo.Deleted = o.Deleted
+			fo.Regular = o.Regular
+			fo.Hidden = o.Hidden
+			fo.Templates = o.Templates
+			fo.LocaleID = o.LocaleID
+			fo.TranslationsIDs = o.TranslationsIDs
+		case *FindArchivedOptions:
+			fo.Options = o.Options
+			fo.FindOptions = o.FindOptions
+			fo.LocaleID = o.LocaleID
+			fo.TranslationsIDs = o.TranslationsIDs
+		case *GetRevisionOptions:
+			fo.Options = o.Options
+			fo.LocaleID = o.LocaleID
+			fo.TranslationsIDs = o.TranslationsIDs
+		case *ListRevisionsOptions:
+			fo.Options = o.Options
+			fo.FindOptions = o.FindOptions
+			fo.LocaleID = o.LocaleID
+			fo.TranslationsIDs = o.TranslationsIDs
+		case *locales.Locale:
+			fo.Locales = []*locales.Locale{o}
+		case []*locales.Locale:
+			fo.Locales = o
+		}
+	}
+	return fo
+}
+
+func MergeStorageFindOptions(opts ...*StorageFindOptions) *StorageFindOptions {
+	o := NewStorageFindOptions()
+	for _, opt := range opts {
+		if opt == nil {
+			continue
+		}
+
+		o.Options = MergeOptions(o.Options, opt.Options)
+		o.FindOptions = *options.MergeFindOptions(&o.FindOptions, &opt.FindOptions)
+
+		o.Deleted = o.Deleted || opt.Deleted
+		o.Regular = o.Regular || opt.Regular
+		o.Templates = o.Templates || opt.Templates
+		o.Hidden = o.Hidden || opt.Hidden
+
+		if opt.LocaleID != "" {
+			o.LocaleID = opt.LocaleID
+		}
+		o.TranslationsIDs = append(o.TranslationsIDs, opt.TranslationsIDs...)
+		o.Locales = append(o.Locales, opt.Locales...)
+	}
+	return o
+}
diff --git a/pkg/items/transport/grpc/protobuf_endpoint_converters.microgen.go b/pkg/items/transport/grpc/protobuf_endpoint_converters.microgen.go
index b111a616..47208ce5 100644
--- a/pkg/items/transport/grpc/protobuf_endpoint_converters.microgen.go
+++ b/pkg/items/transport/grpc/protobuf_endpoint_converters.microgen.go
@@ -7,6 +7,7 @@ import (
 	"context"
 	"errors"
 
+	"git.perx.ru/perxis/perxis-go/pkg/items"
 	transport "git.perx.ru/perxis/perxis-go/pkg/items/transport"
 	pb "git.perx.ru/perxis/perxis-go/proto/items"
 	empty "google.golang.org/protobuf/types/known/emptypb"
@@ -37,11 +38,16 @@ func _Encode_Get_Request(ctx context.Context, request interface{}) (interface{},
 		return nil, errors.New("nil GetRequest")
 	}
 	req := request.(*transport.GetRequest)
+	opts, err := GetOptionsToProto(req.Options)
+	if err != nil {
+		return nil, err
+	}
 	return &pb.GetRequest{
 		CollectionId: req.CollectionId,
 		EnvId:        req.EnvId,
 		ItemId:       req.ItemId,
 		SpaceId:      req.SpaceId,
+		Options:      opts,
 	}, nil
 }
 
@@ -54,15 +60,11 @@ func _Encode_Find_Request(ctx context.Context, request interface{}) (interface{}
 	if err != nil {
 		return nil, err
 	}
-	reqOptions, err := ElPtrFindOptionsToProto(req.Options)
-	if err != nil {
-		return nil, err
-	}
 	return &pb.FindRequest{
 		CollectionId: req.CollectionId,
 		EnvId:        req.EnvId,
 		SpaceId:      req.SpaceId,
-		Options:      reqOptions,
+		Options:      items.FindOptionsToProto(req.Options...),
 		Filter:       reqFilter,
 	}, nil
 }
@@ -212,12 +214,17 @@ func _Encode_GetRevision_Request(ctx context.Context, request interface{}) (inte
 		return nil, errors.New("nil GetRevisionRequest")
 	}
 	req := request.(*transport.GetRevisionRequest)
+	opts, err := GetRevisionOptionsToProto(req.Options)
+	if err != nil {
+		return nil, err
+	}
 	return &pb.GetRevisionRequest{
 		CollectionId: req.CollectionId,
 		EnvId:        req.EnvId,
 		ItemId:       req.ItemId,
 		RevisionId:   req.RevisionId,
 		SpaceId:      req.SpaceId,
+		Options:      opts,
 	}, nil
 }
 
@@ -226,7 +233,7 @@ func _Encode_ListRevisions_Request(ctx context.Context, request interface{}) (in
 		return nil, errors.New("nil ListRevisionsRequest")
 	}
 	req := request.(*transport.ListRevisionsRequest)
-	reqOptions, err := ElPtrListRevisionsOptionsToProto(req.Options)
+	reqOptions, err := ListRevisionsOptionsToProto(req.Options)
 	if err != nil {
 		return nil, err
 	}
@@ -260,7 +267,7 @@ func _Encode_FindArchived_Request(ctx context.Context, request interface{}) (int
 	if err != nil {
 		return nil, err
 	}
-	reqOptions, err := ElPtrFindArchivedOptionsToProto(req.Options)
+	reqOptions, err := FindArchivedOptionsToProto(req.Options)
 	if err != nil {
 		return nil, err
 	}
@@ -515,11 +522,16 @@ func _Decode_Get_Request(ctx context.Context, request interface{}) (interface{},
 		return nil, errors.New("nil GetRequest")
 	}
 	req := request.(*pb.GetRequest)
+	opts, err := ProtoToGetOptions(req.Options)
+	if err != nil {
+		return nil, err
+	}
 	return &transport.GetRequest{
 		CollectionId: string(req.CollectionId),
 		EnvId:        string(req.EnvId),
 		ItemId:       string(req.ItemId),
 		SpaceId:      string(req.SpaceId),
+		Options:      opts,
 	}, nil
 }
 
@@ -734,12 +746,17 @@ func _Decode_GetRevision_Request(ctx context.Context, request interface{}) (inte
 		return nil, errors.New("nil GetRevisionRequest")
 	}
 	req := request.(*pb.GetRevisionRequest)
+	opts, err := ProtoToGetRevisionOptions(req.Options)
+	if err != nil {
+		return nil, err
+	}
 	return &transport.GetRevisionRequest{
 		CollectionId: string(req.CollectionId),
 		EnvId:        string(req.EnvId),
 		ItemId:       string(req.ItemId),
 		RevisionId:   string(req.RevisionId),
 		SpaceId:      string(req.SpaceId),
+		Options:      opts,
 	}, nil
 }
 
@@ -748,7 +765,7 @@ func _Decode_ListRevisions_Request(ctx context.Context, request interface{}) (in
 		return nil, errors.New("nil ListRevisionsRequest")
 	}
 	req := request.(*pb.ListRevisionsRequest)
-	reqOptions, err := ProtoToElPtrListRevisionsOptions(req.Options)
+	reqOptions, err := ProtoToListRevisionsOptions(req.Options)
 	if err != nil {
 		return nil, err
 	}
@@ -782,7 +799,7 @@ func _Decode_FindArchived_Request(ctx context.Context, request interface{}) (int
 	if err != nil {
 		return nil, err
 	}
-	reqOptions, err := ProtoToElPtrFindArchivedOptions(req.Options)
+	reqOptions, err := ProtoToFindArchivedOptions(req.Options)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/items/transport/grpc/protobuf_type_converters.microgen.go b/pkg/items/transport/grpc/protobuf_type_converters.microgen.go
index ade05bff..1aba4865 100644
--- a/pkg/items/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/items/transport/grpc/protobuf_type_converters.microgen.go
@@ -176,80 +176,43 @@ func ProtoToListPtrItem(protoItems []*pb.Item) ([]*service.Item, error) {
 }
 
 func ProtoToCreateOptions(protoOptions *pb.CreateOptions) ([]*service.CreateOptions, error) {
-	if protoOptions == nil {
-		return nil, nil
-	}
-	return []*service.CreateOptions{
-		{UpdateAttrs: protoOptions.UpdateAttrs},
-	}, nil
+	return []*service.CreateOptions{service.CreateOptionsFromProto(protoOptions)}, nil
 }
 
 func CreateOptionsToProto(options []*service.CreateOptions) (*pb.CreateOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeCreateOptions(options...)
-
-	return &pb.CreateOptions{
-		UpdateAttrs: opts.UpdateAttrs,
-	}, nil
+	return service.CreateOptionsToProto(options...), nil
 }
 
-func ElPtrGetOptionsToProto() {
-	panic("function not provided") // TODO: provide converter
+func GetRevisionOptionsToProto(options []*service.GetRevisionOptions) (*pb.GetRevisionOptions, error) {
+	return service.GetRevisionOptionsToProto(options...), nil
 }
 
-func ProtoToElPtrGetOptions() {
-	panic("function not provided") // TODO: provide converter
+func ProtoToGetRevisionOptions(protoOptions *pb.GetRevisionOptions) ([]*service.GetRevisionOptions, error) {
+	return []*service.GetRevisionOptions{service.GetRevisionOptionsFromProto(protoOptions)}, nil
 }
 
-func ElPtrFindOptionsToProto(options []*service.FindOptions) (*pb.FindOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeFindOptions(options...)
+func ListRevisionsOptionsToProto(options []*service.ListRevisionsOptions) (*pb.ListRevisionsOptions, error) {
+	return service.ListRevisionsOptionsToProto(options...), nil
+}
 
-	var err error
+func ProtoToListRevisionsOptions(protoOptions *pb.ListRevisionsOptions) ([]*service.ListRevisionsOptions, error) {
+	return []*service.ListRevisionsOptions{service.ListRevisionsOptionsFromProto(protoOptions)}, nil
+}
 
-	fo := &pb.FindOptions{
-		Deleted:   opts.Deleted,
-		Regular:   opts.Regular,
-		Hidden:    opts.Hidden,
-		Templates: opts.Templates,
-	}
+func GetOptionsToProto(options []*service.GetOptions) (*pb.GetOptions, error) {
+	return service.GetOptionsToProto(options...), nil
+}
 
-	fo.Options, err = PtrServicesFindOptionsToProto(&opts.FindOptions)
-	if err != nil {
-		return nil, err
-	}
+func ProtoToGetOptions(protoOptions *pb.GetOptions) ([]*service.GetOptions, error) {
+	return []*service.GetOptions{service.GetOptionsFromProto(protoOptions)}, nil
+}
 
-	return fo, nil
+func ElPtrFindOptionsToProto(options []*service.FindOptions) (*pb.FindOptions, error) {
+	return service.FindOptionsToProto(options...), nil
 }
 
 func ProtoToElPtrFindOptions(protoOptions *pb.FindOptions) ([]*service.FindOptions, error) {
-	if protoOptions == nil {
-		return nil, nil
-	}
-
-	var err error
-	fo := &service.FindOptions{
-		Deleted:   protoOptions.Deleted,
-		Regular:   protoOptions.Regular,
-		Hidden:    protoOptions.Hidden,
-		Templates: protoOptions.Templates,
-	}
-
-	o, err := ProtoToPtrServicesFindOptions(protoOptions.Options)
-	if err != nil {
-		return nil, err
-	}
-	if o != nil {
-		fo.FindOptions = *o
-	}
-
-	return []*service.FindOptions{fo}, nil
+	return []*service.FindOptions{service.FindOptionsFromProto(protoOptions)}, nil
 }
 
 func ProtoToUpdateOptions(protoOptions *pb.UpdateOptions) ([]*service.UpdateOptions, error) {
@@ -262,40 +225,18 @@ func ProtoToUpdateOptions(protoOptions *pb.UpdateOptions) ([]*service.UpdateOpti
 }
 
 func UpdateOptionsToProto(options []*service.UpdateOptions) (*pb.UpdateOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeUpdateOptions(options...)
-
-	return &pb.UpdateOptions{
-		UpdateAttrs: opts.UpdateAttrs,
-	}, nil
+	return service.UpdateOptionsToProto(options...), nil
 }
 
 func ProtoToDeleteOptions(protoOptions *pb.DeleteOptions) ([]*service.DeleteOptions, error) {
 	if protoOptions == nil {
 		return nil, nil
 	}
-	return []*service.DeleteOptions{
-		{
-			UpdateAttrs: protoOptions.UpdateAttrs,
-			Erase:       protoOptions.Erase,
-		},
-	}, nil
+	return []*service.DeleteOptions{service.DeleteOptionsFromProto(protoOptions)}, nil
 }
 
 func DeleteOptionsToProto(options []*service.DeleteOptions) (*pb.DeleteOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeDeleteOptions(options...)
-
-	return &pb.DeleteOptions{
-		UpdateAttrs: opts.UpdateAttrs,
-		Erase:       opts.Erase,
-	}, nil
+	return service.DeleteOptionsToProto(options...), nil
 }
 
 func ProtoToUndeleteOptions(protoOptions *pb.UndeleteOptions) ([]*service.UndeleteOptions, error) {
@@ -363,70 +304,19 @@ func UnpublishOptionsToProto(options []*service.UnpublishOptions) (*pb.Unpublish
 }
 
 func ElPtrGetPublishedOptionsToProto(options []*service.GetPublishedOptions) (*pb.GetPublishedOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeGetPublishedOptions(options...)
-
-	return &pb.GetPublishedOptions{LocaleId: opts.LocaleID}, nil
+	return service.GetPublishedOptionsToProto(options...), nil
 }
 
 func ProtoToElPtrGetPublishedOptions(protoOptions *pb.GetPublishedOptions) ([]*service.GetPublishedOptions, error) {
-	if protoOptions == nil {
-		return nil, nil
-	}
-
-	return []*service.GetPublishedOptions{{LocaleID: protoOptions.LocaleId}}, nil
+	return []*service.GetPublishedOptions{service.GetPublishedOptionsFromProto(protoOptions)}, nil
 }
 
 func ElPtrFindPublishedOptionsToProto(options []*service.FindPublishedOptions) (*pb.FindPublishedOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeFindPublishedOptions(options...)
-
-	var err error
-
-	fo := &pb.FindPublishedOptions{
-		Regular:   opts.Regular,
-		Hidden:    opts.Hidden,
-		Templates: opts.Templates,
-	}
-	fo.Options, err = PtrServicesFindOptionsToProto(&opts.FindOptions)
-	if err != nil {
-		return nil, err
-	}
-
-	fo.LocaleId = opts.LocaleID
-
-	return fo, nil
+	return service.FindPublishedOptionsToProto(options...), nil
 }
 
 func ProtoToElPtrFindPublishedOptions(protoOptions *pb.FindPublishedOptions) ([]*service.FindPublishedOptions, error) {
-	if protoOptions == nil {
-		return nil, nil
-	}
-
-	var err error
-	fo := &service.FindPublishedOptions{
-		Regular:   protoOptions.Regular,
-		Hidden:    protoOptions.Hidden,
-		Templates: protoOptions.Templates,
-	}
-
-	o, err := ProtoToPtrServicesFindOptions(protoOptions.Options)
-	if err != nil {
-		return nil, err
-	}
-	if o != nil {
-		fo.FindOptions = *o
-	}
-
-	fo.LocaleID = protoOptions.LocaleId
-
-	return []*service.FindPublishedOptions{fo}, nil
+	return []*service.FindPublishedOptions{service.FindPublishedOptionsFromProto(protoOptions)}, nil
 }
 
 func ElPtrGetRevisionOptionsToProto() {
@@ -437,44 +327,6 @@ func ProtoToElPtrGetRevisionOptions() {
 	panic("function not provided") // TODO: provide converter
 }
 
-func ElPtrListRevisionsOptionsToProto(options []*service.ListRevisionsOptions) (*pb.ListRevisionsOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeListRevisionsOptions(options...)
-
-	var err error
-
-	fo := &pb.ListRevisionsOptions{}
-
-	fo.Options, err = PtrServicesFindOptionsToProto(&opts.FindOptions)
-	if err != nil {
-		return nil, err
-	}
-
-	return fo, nil
-}
-
-func ProtoToElPtrListRevisionsOptions(protoOptions *pb.ListRevisionsOptions) ([]*service.ListRevisionsOptions, error) {
-	if protoOptions == nil {
-		return nil, nil
-	}
-
-	var err error
-	fo := &service.ListRevisionsOptions{}
-
-	o, err := ProtoToPtrServicesFindOptions(protoOptions.Options)
-	if err != nil {
-		return nil, err
-	}
-	if o != nil {
-		fo.FindOptions = *o
-	}
-
-	return []*service.ListRevisionsOptions{fo}, nil
-}
-
 func ElPtrArchiveOptionsToProto() {
 	panic("function not provided") // TODO: provide converter
 }
@@ -483,42 +335,12 @@ func ProtoToElPtrArchiveOptions() {
 	panic("function not provided") // TODO: provide converter
 }
 
-func ElPtrFindArchivedOptionsToProto(options []*service.FindArchivedOptions) (*pb.FindArchivedOptions, error) {
-	if options == nil {
-		return nil, nil
-	}
-
-	opts := service.MergeFindArchivedOptions(options...)
-
-	var err error
-
-	fo := &pb.FindArchivedOptions{}
-
-	fo.Options, err = PtrServicesFindOptionsToProto(&opts.FindOptions)
-	if err != nil {
-		return nil, err
-	}
-
-	return fo, nil
+func FindArchivedOptionsToProto(options []*service.FindArchivedOptions) (*pb.FindArchivedOptions, error) {
+	return service.FindArchivedOptionsToProto(options...), nil
 }
 
-func ProtoToElPtrFindArchivedOptions(protoOptions *pb.FindArchivedOptions) ([]*service.FindArchivedOptions, error) {
-	if protoOptions == nil {
-		return nil, nil
-	}
-
-	var err error
-	fo := &service.FindArchivedOptions{}
-
-	o, err := ProtoToPtrServicesFindOptions(protoOptions.Options)
-	if err != nil {
-		return nil, err
-	}
-	if o != nil {
-		fo.FindOptions = *o
-	}
-
-	return []*service.FindArchivedOptions{fo}, nil
+func ProtoToFindArchivedOptions(protoOptions *pb.FindArchivedOptions) ([]*service.FindArchivedOptions, error) {
+	return []*service.FindArchivedOptions{service.FindArchivedOptionsFromProto(protoOptions)}, nil
 }
 
 func ElPtrUnarchiveOptionsToProto() {
diff --git a/proto/items/items.pb.go b/proto/items/items.pb.go
index f75ca1e5..c71dcb83 100644
--- a/proto/items/items.pb.go
+++ b/proto/items/items.pb.go
@@ -8,8 +8,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.31.0
-// 	protoc        v4.25.1
+// 	protoc-gen-go v1.34.2
+// 	protoc        v5.27.0
 // source: items/items.proto
 
 package items
@@ -366,26 +366,33 @@ type Item struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id                  string                      `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	SpaceId             string                      `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId               string                      `protobuf:"bytes,3,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId        string                      `protobuf:"bytes,4,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	State               Item_State                  `protobuf:"varint,5,opt,name=state,proto3,enum=content.items.Item_State" json:"state,omitempty"`
-	CreatedRevAt        *timestamppb.Timestamp      `protobuf:"bytes,6,opt,name=created_rev_at,json=createdRevAt,proto3" json:"created_rev_at,omitempty"` // дата создания текущей ревизии
-	CreatedBy           string                      `protobuf:"bytes,7,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"`            // id пользователя создавшего первую ревизию
-	CreatedAt           *timestamppb.Timestamp      `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`            // дата создания первой ревизии
-	UpdatedBy           string                      `protobuf:"bytes,9,opt,name=updated_by,json=updatedBy,proto3" json:"updated_by,omitempty"`            // id пользователя обновившего текущую ревизию
-	UpdatedAt           *timestamppb.Timestamp      `protobuf:"bytes,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`           // дата обновления текущей ревизии
-	Data                *structpb.Struct            `protobuf:"bytes,11,opt,name=data,proto3" json:"data,omitempty"`
-	Translations        map[string]*structpb.Struct `protobuf:"bytes,12,rep,name=translations,proto3" json:"translations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	RevisionId          string                      `protobuf:"bytes,13,opt,name=revision_id,json=revisionId,proto3" json:"revision_id,omitempty"`
-	RevisionDescription string                      `protobuf:"bytes,14,opt,name=revision_description,json=revisionDescription,proto3" json:"revision_description,omitempty"`
-	Locale              string                      `protobuf:"bytes,18,opt,name=locale,proto3" json:"locale,omitempty"`
-	Deleted             bool                        `protobuf:"varint,19,opt,name=deleted,proto3" json:"deleted,omitempty"`
-	Hidden              bool                        `protobuf:"varint,20,opt,name=hidden,proto3" json:"hidden,omitempty"`
-	Template            bool                        `protobuf:"varint,21,opt,name=template,proto3" json:"template,omitempty"`
-	Permissions         *Permissions                `protobuf:"bytes,22,opt,name=permissions,proto3" json:"permissions,omitempty"`
-	SearchScore         float64                     `protobuf:"fixed64,23,opt,name=search_score,json=searchScore,proto3" json:"search_score,omitempty"` // релеватность элемента при полнотекстовом поиске
+	Id                  string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	SpaceId             string                 `protobuf:"bytes,2,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId               string                 `protobuf:"bytes,3,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	CollectionId        string                 `protobuf:"bytes,4,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	State               Item_State             `protobuf:"varint,5,opt,name=state,proto3,enum=content.items.Item_State" json:"state,omitempty"`
+	CreatedRevAt        *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_rev_at,json=createdRevAt,proto3" json:"created_rev_at,omitempty"` // дата создания текущей ревизии
+	CreatedBy           string                 `protobuf:"bytes,7,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"`            // id пользователя создавшего первую ревизию
+	CreatedAt           *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`            // дата создания первой ревизии
+	UpdatedBy           string                 `protobuf:"bytes,9,opt,name=updated_by,json=updatedBy,proto3" json:"updated_by,omitempty"`            // id пользователя обновившего текущую ревизию
+	UpdatedAt           *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`           // дата обновления текущей ревизии
+	Data                *structpb.Struct       `protobuf:"bytes,11,opt,name=data,proto3" json:"data,omitempty"`
+	RevisionId          string                 `protobuf:"bytes,13,opt,name=revision_id,json=revisionId,proto3" json:"revision_id,omitempty"`
+	RevisionDescription string                 `protobuf:"bytes,14,opt,name=revision_description,json=revisionDescription,proto3" json:"revision_description,omitempty"`
+	Deleted             bool                   `protobuf:"varint,19,opt,name=deleted,proto3" json:"deleted,omitempty"`
+	Hidden              bool                   `protobuf:"varint,20,opt,name=hidden,proto3" json:"hidden,omitempty"`
+	Template            bool                   `protobuf:"varint,21,opt,name=template,proto3" json:"template,omitempty"`
+	Permissions         *Permissions           `protobuf:"bytes,22,opt,name=permissions,proto3" json:"permissions,omitempty"`
+	SearchScore         float64                `protobuf:"fixed64,23,opt,name=search_score,json=searchScore,proto3" json:"search_score,omitempty"` // релеватность элемента при полнотекстовом поиске
+	// При создании или обновлении идентификатор локали в котором создается запись, опционально.
+	// Если указан, то создается перевод для указанного языка, поле translations игнорируется
+	LocaleId string `protobuf:"bytes,100,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"` // идентификатор локали полученной записи
+	// Позволяет одновременно установить/получить несколько переводов и производить манипуляции с переводами
+	// Ключами является идентификатор локали, значениями - данные переводы
+	Translations map[string]*structpb.Struct `protobuf:"bytes,12,rep,name=translations,proto3" json:"translations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	// список идентификаторов локалей для которых есть переводы
+	// соотвествует ключам в translations
+	TranslationsIds []string `protobuf:"bytes,101,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"`
 }
 
 func (x *Item) Reset() {
@@ -497,13 +504,6 @@ func (x *Item) GetData() *structpb.Struct {
 	return nil
 }
 
-func (x *Item) GetTranslations() map[string]*structpb.Struct {
-	if x != nil {
-		return x.Translations
-	}
-	return nil
-}
-
 func (x *Item) GetRevisionId() string {
 	if x != nil {
 		return x.RevisionId
@@ -518,13 +518,6 @@ func (x *Item) GetRevisionDescription() string {
 	return ""
 }
 
-func (x *Item) GetLocale() string {
-	if x != nil {
-		return x.Locale
-	}
-	return ""
-}
-
 func (x *Item) GetDeleted() bool {
 	if x != nil {
 		return x.Deleted
@@ -560,6 +553,27 @@ func (x *Item) GetSearchScore() float64 {
 	return 0
 }
 
+func (x *Item) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *Item) GetTranslations() map[string]*structpb.Struct {
+	if x != nil {
+		return x.Translations
+	}
+	return nil
+}
+
+func (x *Item) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 type EventCreate struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1030,11 +1044,13 @@ type FindOptions struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Options   *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
-	Deleted   bool                `protobuf:"varint,3,opt,name=deleted,proto3" json:"deleted,omitempty"`
-	Regular   bool                `protobuf:"varint,4,opt,name=regular,proto3" json:"regular,omitempty"`
-	Hidden    bool                `protobuf:"varint,5,opt,name=hidden,proto3" json:"hidden,omitempty"`
-	Templates bool                `protobuf:"varint,6,opt,name=templates,proto3" json:"templates,omitempty"`
+	Options         *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
+	Deleted         bool                `protobuf:"varint,3,opt,name=deleted,proto3" json:"deleted,omitempty"`
+	Regular         bool                `protobuf:"varint,4,opt,name=regular,proto3" json:"regular,omitempty"`
+	Hidden          bool                `protobuf:"varint,5,opt,name=hidden,proto3" json:"hidden,omitempty"`
+	Templates       bool                `protobuf:"varint,6,opt,name=templates,proto3" json:"templates,omitempty"`
+	LocaleId        string              `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string            `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
 }
 
 func (x *FindOptions) Reset() {
@@ -1104,6 +1120,20 @@ func (x *FindOptions) GetTemplates() bool {
 	return false
 }
 
+func (x *FindOptions) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *FindOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 type UpdateOptions struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1156,7 +1186,8 @@ type GetPublishedOptions struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	LocaleId string `protobuf:"bytes,1,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`
+	LocaleId        string   `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
 }
 
 func (x *GetPublishedOptions) Reset() {
@@ -1198,6 +1229,13 @@ func (x *GetPublishedOptions) GetLocaleId() string {
 	return ""
 }
 
+func (x *GetPublishedOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 type DeleteOptions struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1399,11 +1437,13 @@ type FindPublishedOptions struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Options   *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
-	LocaleId  string              `protobuf:"bytes,3,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`
-	Regular   bool                `protobuf:"varint,4,opt,name=regular,proto3" json:"regular,omitempty"`
-	Hidden    bool                `protobuf:"varint,5,opt,name=hidden,proto3" json:"hidden,omitempty"`
-	Templates bool                `protobuf:"varint,6,opt,name=templates,proto3" json:"templates,omitempty"`
+	Options *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
+	// string locale_id = 3; // язык для поиска переводов. Если не указан, то возвращаются данные для языка по умолчанию
+	Regular         bool     `protobuf:"varint,4,opt,name=regular,proto3" json:"regular,omitempty"`
+	Hidden          bool     `protobuf:"varint,5,opt,name=hidden,proto3" json:"hidden,omitempty"`
+	Templates       bool     `protobuf:"varint,6,opt,name=templates,proto3" json:"templates,omitempty"`
+	LocaleId        string   `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
 }
 
 func (x *FindPublishedOptions) Reset() {
@@ -1445,13 +1485,6 @@ func (x *FindPublishedOptions) GetOptions() *common.FindOptions {
 	return nil
 }
 
-func (x *FindPublishedOptions) GetLocaleId() string {
-	if x != nil {
-		return x.LocaleId
-	}
-	return ""
-}
-
 func (x *FindPublishedOptions) GetRegular() bool {
 	if x != nil {
 		return x.Regular
@@ -1473,12 +1506,28 @@ func (x *FindPublishedOptions) GetTemplates() bool {
 	return false
 }
 
+func (x *FindPublishedOptions) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *FindPublishedOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 type FindArchivedOptions struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Options *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
+	Options         *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
+	LocaleId        string              `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string            `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
 }
 
 func (x *FindArchivedOptions) Reset() {
@@ -1520,12 +1569,28 @@ func (x *FindArchivedOptions) GetOptions() *common.FindOptions {
 	return nil
 }
 
+func (x *FindArchivedOptions) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *FindArchivedOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 type ListRevisionsOptions struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Options *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
+	Options         *common.FindOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"`
+	LocaleId        string              `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string            `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
 }
 
 func (x *ListRevisionsOptions) Reset() {
@@ -1567,6 +1632,75 @@ func (x *ListRevisionsOptions) GetOptions() *common.FindOptions {
 	return nil
 }
 
+func (x *ListRevisionsOptions) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *ListRevisionsOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
+type GetRevisionOptions struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	LocaleId        string   `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
+}
+
+func (x *GetRevisionOptions) Reset() {
+	*x = GetRevisionOptions{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_items_items_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetRevisionOptions) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetRevisionOptions) ProtoMessage() {}
+
+func (x *GetRevisionOptions) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetRevisionOptions.ProtoReflect.Descriptor instead.
+func (*GetRevisionOptions) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *GetRevisionOptions) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *GetRevisionOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 // Fields - поля которые должны быть возвращены или вычислены в результате.
 // Ключ (string) - имя поля под которым будет добавляться результат.
 // Значение (string) - является выражением, вычисление которого сформирует результат
@@ -1589,7 +1723,7 @@ type AggregateOptions struct {
 func (x *AggregateOptions) Reset() {
 	*x = AggregateOptions{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[23]
+		mi := &file_items_items_proto_msgTypes[24]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1602,7 +1736,7 @@ func (x *AggregateOptions) String() string {
 func (*AggregateOptions) ProtoMessage() {}
 
 func (x *AggregateOptions) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[23]
+	mi := &file_items_items_proto_msgTypes[24]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1615,7 +1749,7 @@ func (x *AggregateOptions) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AggregateOptions.ProtoReflect.Descriptor instead.
 func (*AggregateOptions) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{23}
+	return file_items_items_proto_rawDescGZIP(), []int{24}
 }
 
 func (x *AggregateOptions) GetFields() map[string]string {
@@ -1636,7 +1770,7 @@ type AggregatePublishedOptions struct {
 func (x *AggregatePublishedOptions) Reset() {
 	*x = AggregatePublishedOptions{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[24]
+		mi := &file_items_items_proto_msgTypes[25]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1649,7 +1783,7 @@ func (x *AggregatePublishedOptions) String() string {
 func (*AggregatePublishedOptions) ProtoMessage() {}
 
 func (x *AggregatePublishedOptions) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[24]
+	mi := &file_items_items_proto_msgTypes[25]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1662,7 +1796,7 @@ func (x *AggregatePublishedOptions) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AggregatePublishedOptions.ProtoReflect.Descriptor instead.
 func (*AggregatePublishedOptions) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{24}
+	return file_items_items_proto_rawDescGZIP(), []int{25}
 }
 
 func (x *AggregatePublishedOptions) GetFields() map[string]string {
@@ -1684,7 +1818,7 @@ type CreateRequest struct {
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[25]
+		mi := &file_items_items_proto_msgTypes[26]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1697,7 +1831,7 @@ func (x *CreateRequest) String() string {
 func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[25]
+	mi := &file_items_items_proto_msgTypes[26]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1710,7 +1844,7 @@ func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateRequest.ProtoReflect.Descriptor instead.
 func (*CreateRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{25}
+	return file_items_items_proto_rawDescGZIP(), []int{26}
 }
 
 func (x *CreateRequest) GetItem() *Item {
@@ -1738,7 +1872,7 @@ type CreateResponse struct {
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[26]
+		mi := &file_items_items_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1751,7 +1885,7 @@ func (x *CreateResponse) String() string {
 func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[26]
+	mi := &file_items_items_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1764,7 +1898,7 @@ func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateResponse.ProtoReflect.Descriptor instead.
 func (*CreateResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{26}
+	return file_items_items_proto_rawDescGZIP(), []int{27}
 }
 
 func (x *CreateResponse) GetCreated() *Item {
@@ -1785,7 +1919,7 @@ type IntrospectRequest struct {
 func (x *IntrospectRequest) Reset() {
 	*x = IntrospectRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[27]
+		mi := &file_items_items_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1798,7 +1932,7 @@ func (x *IntrospectRequest) String() string {
 func (*IntrospectRequest) ProtoMessage() {}
 
 func (x *IntrospectRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[27]
+	mi := &file_items_items_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1811,7 +1945,7 @@ func (x *IntrospectRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IntrospectRequest.ProtoReflect.Descriptor instead.
 func (*IntrospectRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{27}
+	return file_items_items_proto_rawDescGZIP(), []int{28}
 }
 
 func (x *IntrospectRequest) GetItem() *Item {
@@ -1834,7 +1968,7 @@ type IntrospectResponse struct {
 func (x *IntrospectResponse) Reset() {
 	*x = IntrospectResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[28]
+		mi := &file_items_items_proto_msgTypes[29]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1847,7 +1981,7 @@ func (x *IntrospectResponse) String() string {
 func (*IntrospectResponse) ProtoMessage() {}
 
 func (x *IntrospectResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[28]
+	mi := &file_items_items_proto_msgTypes[29]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1860,7 +1994,7 @@ func (x *IntrospectResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IntrospectResponse.ProtoReflect.Descriptor instead.
 func (*IntrospectResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{28}
+	return file_items_items_proto_rawDescGZIP(), []int{29}
 }
 
 func (x *IntrospectResponse) GetItem() *Item {
@@ -1884,21 +2018,77 @@ func (x *IntrospectResponse) GetValidationErrors() []*common.Error_BadRequest_Fi
 	return nil
 }
 
+type GetOptions struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	LocaleId        string   `protobuf:"bytes,7,opt,name=locale_id,json=localeId,proto3" json:"locale_id,omitempty"`                      // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
+	TranslationsIds []string `protobuf:"bytes,8,rep,name=translations_ids,json=translationsIds,proto3" json:"translations_ids,omitempty"` // Список идентификаторов переводов/локалей, которых должны быть включены в результат
+}
+
+func (x *GetOptions) Reset() {
+	*x = GetOptions{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_items_items_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetOptions) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOptions) ProtoMessage() {}
+
+func (x *GetOptions) ProtoReflect() protoreflect.Message {
+	mi := &file_items_items_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetOptions.ProtoReflect.Descriptor instead.
+func (*GetOptions) Descriptor() ([]byte, []int) {
+	return file_items_items_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *GetOptions) GetLocaleId() string {
+	if x != nil {
+		return x.LocaleId
+	}
+	return ""
+}
+
+func (x *GetOptions) GetTranslationsIds() []string {
+	if x != nil {
+		return x.TranslationsIds
+	}
+	return nil
+}
+
 type GetRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId      string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId        string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId string `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	ItemId       string `protobuf:"bytes,4,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
+	SpaceId      string      `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId        string      `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	CollectionId string      `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	ItemId       string      `protobuf:"bytes,4,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
+	Options      *GetOptions `protobuf:"bytes,5,opt,name=options,proto3" json:"options,omitempty"`
 }
 
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[29]
+		mi := &file_items_items_proto_msgTypes[31]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1911,7 +2101,7 @@ func (x *GetRequest) String() string {
 func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[29]
+	mi := &file_items_items_proto_msgTypes[31]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1924,7 +2114,7 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
 func (*GetRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{29}
+	return file_items_items_proto_rawDescGZIP(), []int{31}
 }
 
 func (x *GetRequest) GetSpaceId() string {
@@ -1955,6 +2145,13 @@ func (x *GetRequest) GetItemId() string {
 	return ""
 }
 
+func (x *GetRequest) GetOptions() *GetOptions {
+	if x != nil {
+		return x.Options
+	}
+	return nil
+}
+
 type GetResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1966,7 +2163,7 @@ type GetResponse struct {
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[30]
+		mi := &file_items_items_proto_msgTypes[32]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1979,7 +2176,7 @@ func (x *GetResponse) String() string {
 func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[30]
+	mi := &file_items_items_proto_msgTypes[32]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1992,7 +2189,7 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.
 func (*GetResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{30}
+	return file_items_items_proto_rawDescGZIP(), []int{32}
 }
 
 func (x *GetResponse) GetItem() *Item {
@@ -2017,7 +2214,7 @@ type FindRequest struct {
 func (x *FindRequest) Reset() {
 	*x = FindRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[31]
+		mi := &file_items_items_proto_msgTypes[33]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2030,7 +2227,7 @@ func (x *FindRequest) String() string {
 func (*FindRequest) ProtoMessage() {}
 
 func (x *FindRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[31]
+	mi := &file_items_items_proto_msgTypes[33]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2043,7 +2240,7 @@ func (x *FindRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindRequest.ProtoReflect.Descriptor instead.
 func (*FindRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{31}
+	return file_items_items_proto_rawDescGZIP(), []int{33}
 }
 
 func (x *FindRequest) GetSpaceId() string {
@@ -2093,7 +2290,7 @@ type FindResponse struct {
 func (x *FindResponse) Reset() {
 	*x = FindResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[32]
+		mi := &file_items_items_proto_msgTypes[34]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2106,7 +2303,7 @@ func (x *FindResponse) String() string {
 func (*FindResponse) ProtoMessage() {}
 
 func (x *FindResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[32]
+	mi := &file_items_items_proto_msgTypes[34]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2119,7 +2316,7 @@ func (x *FindResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindResponse.ProtoReflect.Descriptor instead.
 func (*FindResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{32}
+	return file_items_items_proto_rawDescGZIP(), []int{34}
 }
 
 func (x *FindResponse) GetItems() []*Item {
@@ -2148,7 +2345,7 @@ type UpdateRequest struct {
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[33]
+		mi := &file_items_items_proto_msgTypes[35]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2161,7 +2358,7 @@ func (x *UpdateRequest) String() string {
 func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[33]
+	mi := &file_items_items_proto_msgTypes[35]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2174,7 +2371,7 @@ func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead.
 func (*UpdateRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{33}
+	return file_items_items_proto_rawDescGZIP(), []int{35}
 }
 
 func (x *UpdateRequest) GetItem() *Item {
@@ -2203,7 +2400,7 @@ type DeleteRequest struct {
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[34]
+		mi := &file_items_items_proto_msgTypes[36]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2216,7 +2413,7 @@ func (x *DeleteRequest) String() string {
 func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[34]
+	mi := &file_items_items_proto_msgTypes[36]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2229,7 +2426,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
 func (*DeleteRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{34}
+	return file_items_items_proto_rawDescGZIP(), []int{36}
 }
 
 func (x *DeleteRequest) GetItem() *Item {
@@ -2258,7 +2455,7 @@ type UndeleteRequest struct {
 func (x *UndeleteRequest) Reset() {
 	*x = UndeleteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[35]
+		mi := &file_items_items_proto_msgTypes[37]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2271,7 +2468,7 @@ func (x *UndeleteRequest) String() string {
 func (*UndeleteRequest) ProtoMessage() {}
 
 func (x *UndeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[35]
+	mi := &file_items_items_proto_msgTypes[37]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2284,7 +2481,7 @@ func (x *UndeleteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UndeleteRequest.ProtoReflect.Descriptor instead.
 func (*UndeleteRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{35}
+	return file_items_items_proto_rawDescGZIP(), []int{37}
 }
 
 func (x *UndeleteRequest) GetItem() *Item {
@@ -2313,7 +2510,7 @@ type PublishRequest struct {
 func (x *PublishRequest) Reset() {
 	*x = PublishRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[36]
+		mi := &file_items_items_proto_msgTypes[38]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2326,7 +2523,7 @@ func (x *PublishRequest) String() string {
 func (*PublishRequest) ProtoMessage() {}
 
 func (x *PublishRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[36]
+	mi := &file_items_items_proto_msgTypes[38]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2339,7 +2536,7 @@ func (x *PublishRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PublishRequest.ProtoReflect.Descriptor instead.
 func (*PublishRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{36}
+	return file_items_items_proto_rawDescGZIP(), []int{38}
 }
 
 func (x *PublishRequest) GetItem() *Item {
@@ -2368,7 +2565,7 @@ type UnpublishRequest struct {
 func (x *UnpublishRequest) Reset() {
 	*x = UnpublishRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[37]
+		mi := &file_items_items_proto_msgTypes[39]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2381,7 +2578,7 @@ func (x *UnpublishRequest) String() string {
 func (*UnpublishRequest) ProtoMessage() {}
 
 func (x *UnpublishRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[37]
+	mi := &file_items_items_proto_msgTypes[39]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2394,7 +2591,7 @@ func (x *UnpublishRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UnpublishRequest.ProtoReflect.Descriptor instead.
 func (*UnpublishRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{37}
+	return file_items_items_proto_rawDescGZIP(), []int{39}
 }
 
 func (x *UnpublishRequest) GetItem() *Item {
@@ -2426,7 +2623,7 @@ type GetPublishedRequest struct {
 func (x *GetPublishedRequest) Reset() {
 	*x = GetPublishedRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[38]
+		mi := &file_items_items_proto_msgTypes[40]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2439,7 +2636,7 @@ func (x *GetPublishedRequest) String() string {
 func (*GetPublishedRequest) ProtoMessage() {}
 
 func (x *GetPublishedRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[38]
+	mi := &file_items_items_proto_msgTypes[40]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2452,7 +2649,7 @@ func (x *GetPublishedRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPublishedRequest.ProtoReflect.Descriptor instead.
 func (*GetPublishedRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{38}
+	return file_items_items_proto_rawDescGZIP(), []int{40}
 }
 
 func (x *GetPublishedRequest) GetSpaceId() string {
@@ -2501,7 +2698,7 @@ type GetPublishedResponse struct {
 func (x *GetPublishedResponse) Reset() {
 	*x = GetPublishedResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[39]
+		mi := &file_items_items_proto_msgTypes[41]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2514,7 +2711,7 @@ func (x *GetPublishedResponse) String() string {
 func (*GetPublishedResponse) ProtoMessage() {}
 
 func (x *GetPublishedResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[39]
+	mi := &file_items_items_proto_msgTypes[41]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2527,7 +2724,7 @@ func (x *GetPublishedResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetPublishedResponse.ProtoReflect.Descriptor instead.
 func (*GetPublishedResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{39}
+	return file_items_items_proto_rawDescGZIP(), []int{41}
 }
 
 func (x *GetPublishedResponse) GetItem() *Item {
@@ -2552,7 +2749,7 @@ type FindPublishedRequest struct {
 func (x *FindPublishedRequest) Reset() {
 	*x = FindPublishedRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[40]
+		mi := &file_items_items_proto_msgTypes[42]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2565,7 +2762,7 @@ func (x *FindPublishedRequest) String() string {
 func (*FindPublishedRequest) ProtoMessage() {}
 
 func (x *FindPublishedRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[40]
+	mi := &file_items_items_proto_msgTypes[42]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2578,7 +2775,7 @@ func (x *FindPublishedRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindPublishedRequest.ProtoReflect.Descriptor instead.
 func (*FindPublishedRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{40}
+	return file_items_items_proto_rawDescGZIP(), []int{42}
 }
 
 func (x *FindPublishedRequest) GetSpaceId() string {
@@ -2628,7 +2825,7 @@ type FindPublishedResponse struct {
 func (x *FindPublishedResponse) Reset() {
 	*x = FindPublishedResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[41]
+		mi := &file_items_items_proto_msgTypes[43]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2641,7 +2838,7 @@ func (x *FindPublishedResponse) String() string {
 func (*FindPublishedResponse) ProtoMessage() {}
 
 func (x *FindPublishedResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[41]
+	mi := &file_items_items_proto_msgTypes[43]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2654,7 +2851,7 @@ func (x *FindPublishedResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindPublishedResponse.ProtoReflect.Descriptor instead.
 func (*FindPublishedResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{41}
+	return file_items_items_proto_rawDescGZIP(), []int{43}
 }
 
 func (x *FindPublishedResponse) GetItems() []*Item {
@@ -2686,7 +2883,7 @@ type AggregateRequest struct {
 func (x *AggregateRequest) Reset() {
 	*x = AggregateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[42]
+		mi := &file_items_items_proto_msgTypes[44]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2699,7 +2896,7 @@ func (x *AggregateRequest) String() string {
 func (*AggregateRequest) ProtoMessage() {}
 
 func (x *AggregateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[42]
+	mi := &file_items_items_proto_msgTypes[44]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2712,7 +2909,7 @@ func (x *AggregateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AggregateRequest.ProtoReflect.Descriptor instead.
 func (*AggregateRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{42}
+	return file_items_items_proto_rawDescGZIP(), []int{44}
 }
 
 func (x *AggregateRequest) GetSpaceId() string {
@@ -2763,7 +2960,7 @@ type AggregateResponse struct {
 func (x *AggregateResponse) Reset() {
 	*x = AggregateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[43]
+		mi := &file_items_items_proto_msgTypes[45]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2776,7 +2973,7 @@ func (x *AggregateResponse) String() string {
 func (*AggregateResponse) ProtoMessage() {}
 
 func (x *AggregateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[43]
+	mi := &file_items_items_proto_msgTypes[45]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2789,7 +2986,7 @@ func (x *AggregateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AggregateResponse.ProtoReflect.Descriptor instead.
 func (*AggregateResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{43}
+	return file_items_items_proto_rawDescGZIP(), []int{45}
 }
 
 func (x *AggregateResponse) GetResult() *structpb.Struct {
@@ -2814,7 +3011,7 @@ type AggregatePublishedRequest struct {
 func (x *AggregatePublishedRequest) Reset() {
 	*x = AggregatePublishedRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[44]
+		mi := &file_items_items_proto_msgTypes[46]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2827,7 +3024,7 @@ func (x *AggregatePublishedRequest) String() string {
 func (*AggregatePublishedRequest) ProtoMessage() {}
 
 func (x *AggregatePublishedRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[44]
+	mi := &file_items_items_proto_msgTypes[46]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2840,7 +3037,7 @@ func (x *AggregatePublishedRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AggregatePublishedRequest.ProtoReflect.Descriptor instead.
 func (*AggregatePublishedRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{44}
+	return file_items_items_proto_rawDescGZIP(), []int{46}
 }
 
 func (x *AggregatePublishedRequest) GetSpaceId() string {
@@ -2889,7 +3086,7 @@ type AggregatePublishedResponse struct {
 func (x *AggregatePublishedResponse) Reset() {
 	*x = AggregatePublishedResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[45]
+		mi := &file_items_items_proto_msgTypes[47]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2902,7 +3099,7 @@ func (x *AggregatePublishedResponse) String() string {
 func (*AggregatePublishedResponse) ProtoMessage() {}
 
 func (x *AggregatePublishedResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[45]
+	mi := &file_items_items_proto_msgTypes[47]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2915,7 +3112,7 @@ func (x *AggregatePublishedResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AggregatePublishedResponse.ProtoReflect.Descriptor instead.
 func (*AggregatePublishedResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{45}
+	return file_items_items_proto_rawDescGZIP(), []int{47}
 }
 
 func (x *AggregatePublishedResponse) GetResult() *structpb.Struct {
@@ -2930,17 +3127,18 @@ type GetRevisionRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	SpaceId      string `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
-	EnvId        string `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
-	CollectionId string `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
-	ItemId       string `protobuf:"bytes,4,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
-	RevisionId   string `protobuf:"bytes,5,opt,name=revision_id,json=revisionId,proto3" json:"revision_id,omitempty"`
+	SpaceId      string              `protobuf:"bytes,1,opt,name=space_id,json=spaceId,proto3" json:"space_id,omitempty"`
+	EnvId        string              `protobuf:"bytes,2,opt,name=env_id,json=envId,proto3" json:"env_id,omitempty"`
+	CollectionId string              `protobuf:"bytes,3,opt,name=collection_id,json=collectionId,proto3" json:"collection_id,omitempty"`
+	ItemId       string              `protobuf:"bytes,4,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
+	RevisionId   string              `protobuf:"bytes,5,opt,name=revision_id,json=revisionId,proto3" json:"revision_id,omitempty"`
+	Options      *GetRevisionOptions `protobuf:"bytes,10,opt,name=options,proto3" json:"options,omitempty"`
 }
 
 func (x *GetRevisionRequest) Reset() {
 	*x = GetRevisionRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[46]
+		mi := &file_items_items_proto_msgTypes[48]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2953,7 +3151,7 @@ func (x *GetRevisionRequest) String() string {
 func (*GetRevisionRequest) ProtoMessage() {}
 
 func (x *GetRevisionRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[46]
+	mi := &file_items_items_proto_msgTypes[48]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2966,7 +3164,7 @@ func (x *GetRevisionRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRevisionRequest.ProtoReflect.Descriptor instead.
 func (*GetRevisionRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{46}
+	return file_items_items_proto_rawDescGZIP(), []int{48}
 }
 
 func (x *GetRevisionRequest) GetSpaceId() string {
@@ -3004,6 +3202,13 @@ func (x *GetRevisionRequest) GetRevisionId() string {
 	return ""
 }
 
+func (x *GetRevisionRequest) GetOptions() *GetRevisionOptions {
+	if x != nil {
+		return x.Options
+	}
+	return nil
+}
+
 type GetRevisionResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -3015,7 +3220,7 @@ type GetRevisionResponse struct {
 func (x *GetRevisionResponse) Reset() {
 	*x = GetRevisionResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[47]
+		mi := &file_items_items_proto_msgTypes[49]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3028,7 +3233,7 @@ func (x *GetRevisionResponse) String() string {
 func (*GetRevisionResponse) ProtoMessage() {}
 
 func (x *GetRevisionResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[47]
+	mi := &file_items_items_proto_msgTypes[49]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3041,7 +3246,7 @@ func (x *GetRevisionResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRevisionResponse.ProtoReflect.Descriptor instead.
 func (*GetRevisionResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{47}
+	return file_items_items_proto_rawDescGZIP(), []int{49}
 }
 
 func (x *GetRevisionResponse) GetItem() *Item {
@@ -3066,7 +3271,7 @@ type ListRevisionsRequest struct {
 func (x *ListRevisionsRequest) Reset() {
 	*x = ListRevisionsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[48]
+		mi := &file_items_items_proto_msgTypes[50]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3079,7 +3284,7 @@ func (x *ListRevisionsRequest) String() string {
 func (*ListRevisionsRequest) ProtoMessage() {}
 
 func (x *ListRevisionsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[48]
+	mi := &file_items_items_proto_msgTypes[50]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3092,7 +3297,7 @@ func (x *ListRevisionsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListRevisionsRequest.ProtoReflect.Descriptor instead.
 func (*ListRevisionsRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{48}
+	return file_items_items_proto_rawDescGZIP(), []int{50}
 }
 
 func (x *ListRevisionsRequest) GetSpaceId() string {
@@ -3141,7 +3346,7 @@ type ListRevisionsResponse struct {
 func (x *ListRevisionsResponse) Reset() {
 	*x = ListRevisionsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[49]
+		mi := &file_items_items_proto_msgTypes[51]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3154,7 +3359,7 @@ func (x *ListRevisionsResponse) String() string {
 func (*ListRevisionsResponse) ProtoMessage() {}
 
 func (x *ListRevisionsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[49]
+	mi := &file_items_items_proto_msgTypes[51]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3167,7 +3372,7 @@ func (x *ListRevisionsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListRevisionsResponse.ProtoReflect.Descriptor instead.
 func (*ListRevisionsResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{49}
+	return file_items_items_proto_rawDescGZIP(), []int{51}
 }
 
 func (x *ListRevisionsResponse) GetItems() []*Item {
@@ -3190,7 +3395,7 @@ type ArchiveRequest struct {
 func (x *ArchiveRequest) Reset() {
 	*x = ArchiveRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[50]
+		mi := &file_items_items_proto_msgTypes[52]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3203,7 +3408,7 @@ func (x *ArchiveRequest) String() string {
 func (*ArchiveRequest) ProtoMessage() {}
 
 func (x *ArchiveRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[50]
+	mi := &file_items_items_proto_msgTypes[52]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3216,7 +3421,7 @@ func (x *ArchiveRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ArchiveRequest.ProtoReflect.Descriptor instead.
 func (*ArchiveRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{50}
+	return file_items_items_proto_rawDescGZIP(), []int{52}
 }
 
 func (x *ArchiveRequest) GetItem() *Item {
@@ -3237,7 +3442,7 @@ type UnarchiveRequest struct {
 func (x *UnarchiveRequest) Reset() {
 	*x = UnarchiveRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[51]
+		mi := &file_items_items_proto_msgTypes[53]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3250,7 +3455,7 @@ func (x *UnarchiveRequest) String() string {
 func (*UnarchiveRequest) ProtoMessage() {}
 
 func (x *UnarchiveRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[51]
+	mi := &file_items_items_proto_msgTypes[53]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3263,7 +3468,7 @@ func (x *UnarchiveRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UnarchiveRequest.ProtoReflect.Descriptor instead.
 func (*UnarchiveRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{51}
+	return file_items_items_proto_rawDescGZIP(), []int{53}
 }
 
 func (x *UnarchiveRequest) GetItem() *Item {
@@ -3288,7 +3493,7 @@ type FindArchivedRequest struct {
 func (x *FindArchivedRequest) Reset() {
 	*x = FindArchivedRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[52]
+		mi := &file_items_items_proto_msgTypes[54]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3301,7 +3506,7 @@ func (x *FindArchivedRequest) String() string {
 func (*FindArchivedRequest) ProtoMessage() {}
 
 func (x *FindArchivedRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[52]
+	mi := &file_items_items_proto_msgTypes[54]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3314,7 +3519,7 @@ func (x *FindArchivedRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindArchivedRequest.ProtoReflect.Descriptor instead.
 func (*FindArchivedRequest) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{52}
+	return file_items_items_proto_rawDescGZIP(), []int{54}
 }
 
 func (x *FindArchivedRequest) GetSpaceId() string {
@@ -3364,7 +3569,7 @@ type FindArchivedResponse struct {
 func (x *FindArchivedResponse) Reset() {
 	*x = FindArchivedResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_items_items_proto_msgTypes[53]
+		mi := &file_items_items_proto_msgTypes[55]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3377,7 +3582,7 @@ func (x *FindArchivedResponse) String() string {
 func (*FindArchivedResponse) ProtoMessage() {}
 
 func (x *FindArchivedResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_items_items_proto_msgTypes[53]
+	mi := &file_items_items_proto_msgTypes[55]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3390,7 +3595,7 @@ func (x *FindArchivedResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FindArchivedResponse.ProtoReflect.Descriptor instead.
 func (*FindArchivedResponse) Descriptor() ([]byte, []int) {
-	return file_items_items_proto_rawDescGZIP(), []int{53}
+	return file_items_items_proto_rawDescGZIP(), []int{55}
 }
 
 func (x *FindArchivedResponse) GetItems() []*Item {
@@ -3445,7 +3650,7 @@ var file_items_items_proto_rawDesc = []byte{
 	0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a,
 	0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x61,
 	0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
-	0x0a, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0xbf, 0x07, 0x0a, 0x04,
+	0x0a, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0xef, 0x07, 0x0a, 0x04,
 	0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
 	0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64,
 	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12,
@@ -3474,29 +3679,32 @@ var file_items_items_proto_rawDesc = []byte{
 	0x41, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b,
 	0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
 	0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12,
+	0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0d,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64,
+	0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13,
+	0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x13,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a,
+	0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68,
+	0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
+	0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
+	0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18,
+	0x17, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x63, 0x6f,
+	0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x12,
 	0x49, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
 	0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
 	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73,
 	0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x74, 0x72,
-	0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65,
-	0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x72,
-	0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x76, 0x69, 0x73,
-	0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16,
-	0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
-	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
-	0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
-	0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x73, 0x63, 0x6f,
-	0x72, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
-	0x53, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x58, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+	0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x65,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x49, 0x64, 0x73, 0x1a, 0x58, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
 	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
 	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05,
 	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f,
@@ -3553,7 +3761,7 @@ var file_items_items_proto_rawDesc = []byte{
 	0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x01, 0x71, 0x22, 0x32, 0x0a, 0x0d, 0x43, 0x72, 0x65,
 	0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70,
 	0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0xa6, 0x01,
+	0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0xee, 0x01,
 	0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a,
 	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
 	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69,
@@ -3564,248 +3772,267 @@ var file_items_items_proto_rawDesc = []byte{
 	0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
 	0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6d, 0x70,
 	0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x65, 0x6d,
-	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
-	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0x32, 0x0a, 0x13, 0x47, 0x65,
-	0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x48,
-	0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+	0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x73, 0x22, 0x32,
+	0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
 	0x21, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18,
 	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74,
-	0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x05, 0x65, 0x72, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x0f, 0x55, 0x6e, 0x64, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0x33,
-	0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74,
-	0x74, 0x72, 0x73, 0x22, 0x35, 0x0a, 0x10, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
-	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74,
-	0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0xb2, 0x01, 0x0a, 0x14, 0x46,
-	0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69,
-	0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x12,
-	0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64,
-	0x64, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65,
-	0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22,
-	0x44, 0x0a, 0x13, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x4f,
+	0x72, 0x73, 0x22, 0x5d, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
+	0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63,
+	0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f,
+	0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64,
+	0x73, 0x22, 0x48, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74,
+	0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x41, 0x74, 0x74, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x61, 0x73, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, 0x72, 0x61, 0x73, 0x65, 0x22, 0x34, 0x0a, 0x0f, 0x55,
+	0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21,
+	0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72,
+	0x73, 0x22, 0x33, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74,
+	0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0x35, 0x0a, 0x10, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c,
+	0x69, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x73, 0x22, 0xdd, 0x01,
+	0x0a, 0x14, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f,
 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
 	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
 	0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x45, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76,
-	0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a,
-	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
-	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x01, 0x0a,
-	0x10, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
-	0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06,
-	0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
-	0x01, 0x22, 0xa4, 0x01, 0x0a, 0x19, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50,
-	0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
-	0x4c, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
-	0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x39, 0x0a,
-	0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
-	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
-	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x70, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65,
-	0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74,
-	0x65, 0x6d, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
-	0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3f, 0x0a, 0x0e, 0x43, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07,
-	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74,
-	0x65, 0x6d, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x49,
-	0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49,
-	0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xab, 0x01, 0x0a, 0x12, 0x49, 0x6e,
-	0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49,
-	0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68,
-	0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d,
-	0x61, 0x12, 0x54, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
-	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63,
-	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x42, 0x61, 0x64, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x7c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64,
-	0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
-	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,
-	0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69,
-	0x74, 0x65, 0x6d, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x12,
+	0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6d, 0x70, 0x6c,
+	0x61, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x65, 0x6d, 0x70,
+	0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f,
+	0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65,
+	0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72,
+	0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x73, 0x22, 0x8c, 0x01,
+	0x0a, 0x13, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49,
+	0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a,
+	0x14, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
+	0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49,
+	0x64, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x73, 0x22, 0x5c, 0x0a, 0x12,
+	0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64, 0x12,
+	0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f,
+	0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x10, 0x41,
+	0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x43, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x2b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
+	0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69,
+	0x65, 0x6c, 0x64, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+	0xa4, 0x01, 0x0a, 0x19, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62,
+	0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4c, 0x0a,
+	0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67,
+	0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e,
+	0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x46,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x70, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d,
+	0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d,
+	0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x49, 0x6e, 0x74,
+	0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27,
+	0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65,
+	0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xab, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x74, 0x72,
+	0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27,
+	0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65,
+	0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d,
+	0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12,
+	0x54, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6d,
+	0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x42, 0x61, 0x64, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45,
+	0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x54, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x49, 0x64,
+	0x12, 0x29, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x5f, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0a,
+	0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d,
+	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+	0x36, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27,
+	0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65,
+	0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xc9, 0x01, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c,
+	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d,
+	0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a,
+	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46,
+	0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03,
 	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xc9, 0x01,
-	0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
-	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f,
-	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12,
-	0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
-	0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c,
-	0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x0c, 0x46, 0x69, 0x6e,
-	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x70, 0x0a, 0x0d, 0x55, 0x70,
-	0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69,
+	0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x14,
+	0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74,
+	0x6f, 0x74, 0x61, 0x6c, 0x22, 0x70, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x36,
+	0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x70, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d,
+	0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x74, 0x0a, 0x0f, 0x55, 0x6e, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69,
 	0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
 	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04,
-	0x69, 0x74, 0x65, 0x6d, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x70, 0x0a, 0x0d,
-	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a,
-	0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d,
-	0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x74,
-	0x0a, 0x0f, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x64, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x22, 0x72, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52,
+	0x69, 0x74, 0x65, 0x6d, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x72,
+	0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49,
+	0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69,
+	0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x22, 0x76, 0x0a, 0x10, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01,
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
 	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x12,
-	0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52,
-	0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x76, 0x0a, 0x10, 0x55, 0x6e, 0x70, 0x75,
-	0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04,
-	0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52,
-	0x04, 0x69, 0x74, 0x65, 0x6d, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
+	0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
+	0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x47,
+	0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a,
+	0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
+	0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c,
+	0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x74, 0x65,
+	0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d,
+	0x49, 0x64, 0x12, 0x3c, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64,
 	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x22, 0xc3, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65,
-	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63,
-	0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f,
-	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12,
-	0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62,
-	0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f,
-	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62,
-	0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27,
-	0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65,
-	0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xdb, 0x01, 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x64,
-	0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65,
-	0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76,
-	0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-	0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,
-	0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06,
-	0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c,
-	0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x58, 0x0a, 0x15, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62,
-	0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29,
-	0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74,
-	0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74,
-	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22,
-	0xd3, 0x01, 0x0a, 0x10, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12,
-	0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63,
-	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66,
-	0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74,
-	0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72,
-	0x65, 0x67, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x44, 0x0a, 0x11, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65,
-	0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72,
-	0x75, 0x63, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xe5, 0x01, 0x0a, 0x19,
-	0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
-	0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63,
-	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
-	0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
-	0x42, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
-	0x68, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x22, 0x4d, 0x0a, 0x1a, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65,
-	0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75,
-	0x6c, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
-	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63,
-	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
-	0x12, 0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76,
-	0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
-	0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xc5, 0x01, 0x0a, 0x14, 0x4c,
-	0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x22, 0x3f, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65,
+	0x6d, 0x22, 0xdb, 0x01, 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d,
+	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
+	0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+	0x58, 0x0a, 0x15, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xd3, 0x01, 0x0a, 0x10, 0x41, 0x67,
+	0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19,
+	0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64,
+	0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
+	0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+	0x44, 0x0a, 0x11, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x72,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xe5, 0x01, 0x0a, 0x19, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67,
+	0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15,
+	0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x07, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65,
+	0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4d, 0x0a,
+	0x1a, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x72,
+	0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
+	0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xe2, 0x01, 0x0a,
+	0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
 	0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
 	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15,
 	0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
@@ -3813,135 +4040,153 @@ var file_items_items_proto_rawDesc = []byte{
 	0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f,
 	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x74,
 	0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x74, 0x65,
-	0x6d, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x22, 0x42, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52,
-	0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x39, 0x0a, 0x0e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d,
+	0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
+	0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69,
+	0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+	0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x22, 0x3e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d,
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
 	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65,
-	0x6d, 0x22, 0x3b, 0x0a, 0x10, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
-	0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xd9,
-	0x01, 0x0a, 0x13, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49,
-	0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c,
-	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a,
-	0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69,
-	0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x07,
-	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69,
-	0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x57, 0x0a, 0x14, 0x46, 0x69,
-	0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x6d, 0x22, 0xc5, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d,
+	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x42, 0x0a, 0x15, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 	0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
 	0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
-	0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a,
-	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f,
-	0x74, 0x61, 0x6c, 0x32, 0x93, 0x0b, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x47, 0x0a,
-	0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73,
-	0x70, 0x65, 0x63, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03, 0x47,
-	0x65, 0x74, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
-	0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x04, 0x46,
-	0x69, 0x6e, 0x64, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
-	0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40,
-	0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,
+	0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x39, 0x0a,
+	0x0e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x27, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74,
+	0x65, 0x6d, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3b, 0x0a, 0x10, 0x55, 0x6e, 0x61, 0x72,
+	0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04,
+	0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52,
+	0x04, 0x69, 0x74, 0x65, 0x6d, 0x22, 0xd9, 0x01, 0x0a, 0x13, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72,
+	0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x65, 0x6e, 0x76, 0x5f,
+	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12,
+	0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+	0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x22, 0x57, 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65,
+	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x32, 0x93, 0x0b, 0x0a, 0x05, 0x49,
+	0x74, 0x65, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1c,
+	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a,
+	0x0a, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x20, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x72,
+	0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x49, 0x6e,
+	0x74, 0x72, 0x6f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x00, 0x12, 0x41, 0x0a, 0x04, 0x46, 0x69, 0x6e, 0x64, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12,
+	0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x55, 0x6e, 0x64,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
+	0x42, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69,
+	0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
+	0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
+	0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x47,
+	0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x22, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
+	0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75,
+	0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c,
+	0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e,
+	0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x09, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74,
+	0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67,
+	0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67,
+	0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65,
+	0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
+	0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+	0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x07, 0x41, 0x72, 0x63,
+	0x68, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
+	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a,
+	0x0c, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x22, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69,
+	0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d,
+	0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x6e, 0x61, 0x72,
+	0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x12, 0x40, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1e,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55,
-	0x6e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c,
-	0x69, 0x73, 0x68, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74,
-	0x65, 0x6d, 0x73, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09,
-	0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c,
-	0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
-	0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69,
-	0x73, 0x68, 0x65, 0x64, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69,
-	0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65,
-	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c,
-	0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
-	0x5c, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64,
-	0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
-	0x68, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a,
-	0x09, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65,
-	0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72,
-	0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
-	0x6b, 0x0a, 0x12, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c,
-	0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50,
-	0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
-	0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
-	0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x0b,
-	0x47, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x47,
-	0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x42, 0x0a, 0x07, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x2e,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x41, 0x72,
-	0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
-	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72,
-	0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
-	0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x72, 0x63, 0x68, 0x69,
-	0x76, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6e,
-	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41,
-	0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1f,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x55,
-	0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74,
-	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
-	0x69, 0x74, 0x65, 0x6d, 0x73, 0x3b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
+	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3b, 0x69, 0x74, 0x65,
+	0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -3957,8 +4202,8 @@ func file_items_items_proto_rawDescGZIP() []byte {
 }
 
 var file_items_items_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_items_items_proto_msgTypes = make([]protoimpl.MessageInfo, 57)
-var file_items_items_proto_goTypes = []interface{}{
+var file_items_items_proto_msgTypes = make([]protoimpl.MessageInfo, 59)
+var file_items_items_proto_goTypes = []any{
 	(Item_State)(0),                                // 0: content.items.Item.State
 	(*Error)(nil),                                  // 1: content.items.Error
 	(*DecodeError)(nil),                            // 2: content.items.DecodeError
@@ -3983,146 +4228,150 @@ var file_items_items_proto_goTypes = []interface{}{
 	(*FindPublishedOptions)(nil),                   // 21: content.items.FindPublishedOptions
 	(*FindArchivedOptions)(nil),                    // 22: content.items.FindArchivedOptions
 	(*ListRevisionsOptions)(nil),                   // 23: content.items.ListRevisionsOptions
-	(*AggregateOptions)(nil),                       // 24: content.items.AggregateOptions
-	(*AggregatePublishedOptions)(nil),              // 25: content.items.AggregatePublishedOptions
-	(*CreateRequest)(nil),                          // 26: content.items.CreateRequest
-	(*CreateResponse)(nil),                         // 27: content.items.CreateResponse
-	(*IntrospectRequest)(nil),                      // 28: content.items.IntrospectRequest
-	(*IntrospectResponse)(nil),                     // 29: content.items.IntrospectResponse
-	(*GetRequest)(nil),                             // 30: content.items.GetRequest
-	(*GetResponse)(nil),                            // 31: content.items.GetResponse
-	(*FindRequest)(nil),                            // 32: content.items.FindRequest
-	(*FindResponse)(nil),                           // 33: content.items.FindResponse
-	(*UpdateRequest)(nil),                          // 34: content.items.UpdateRequest
-	(*DeleteRequest)(nil),                          // 35: content.items.DeleteRequest
-	(*UndeleteRequest)(nil),                        // 36: content.items.UndeleteRequest
-	(*PublishRequest)(nil),                         // 37: content.items.PublishRequest
-	(*UnpublishRequest)(nil),                       // 38: content.items.UnpublishRequest
-	(*GetPublishedRequest)(nil),                    // 39: content.items.GetPublishedRequest
-	(*GetPublishedResponse)(nil),                   // 40: content.items.GetPublishedResponse
-	(*FindPublishedRequest)(nil),                   // 41: content.items.FindPublishedRequest
-	(*FindPublishedResponse)(nil),                  // 42: content.items.FindPublishedResponse
-	(*AggregateRequest)(nil),                       // 43: content.items.AggregateRequest
-	(*AggregateResponse)(nil),                      // 44: content.items.AggregateResponse
-	(*AggregatePublishedRequest)(nil),              // 45: content.items.AggregatePublishedRequest
-	(*AggregatePublishedResponse)(nil),             // 46: content.items.AggregatePublishedResponse
-	(*GetRevisionRequest)(nil),                     // 47: content.items.GetRevisionRequest
-	(*GetRevisionResponse)(nil),                    // 48: content.items.GetRevisionResponse
-	(*ListRevisionsRequest)(nil),                   // 49: content.items.ListRevisionsRequest
-	(*ListRevisionsResponse)(nil),                  // 50: content.items.ListRevisionsResponse
-	(*ArchiveRequest)(nil),                         // 51: content.items.ArchiveRequest
-	(*UnarchiveRequest)(nil),                       // 52: content.items.UnarchiveRequest
-	(*FindArchivedRequest)(nil),                    // 53: content.items.FindArchivedRequest
-	(*FindArchivedResponse)(nil),                   // 54: content.items.FindArchivedResponse
-	nil,                                            // 55: content.items.Item.TranslationsEntry
-	nil,                                            // 56: content.items.AggregateOptions.FieldsEntry
-	nil,                                            // 57: content.items.AggregatePublishedOptions.FieldsEntry
-	(*timestamppb.Timestamp)(nil),                  // 58: google.protobuf.Timestamp
-	(*structpb.Struct)(nil),                        // 59: google.protobuf.Struct
-	(*common.Filter)(nil),                          // 60: common.Filter
-	(*common.FindOptions)(nil),                     // 61: common.FindOptions
-	(*common.Error_BadRequest_FieldViolation)(nil), // 62: common.Error.BadRequest.FieldViolation
-	(*emptypb.Empty)(nil),                          // 63: google.protobuf.Empty
+	(*GetRevisionOptions)(nil),                     // 24: content.items.GetRevisionOptions
+	(*AggregateOptions)(nil),                       // 25: content.items.AggregateOptions
+	(*AggregatePublishedOptions)(nil),              // 26: content.items.AggregatePublishedOptions
+	(*CreateRequest)(nil),                          // 27: content.items.CreateRequest
+	(*CreateResponse)(nil),                         // 28: content.items.CreateResponse
+	(*IntrospectRequest)(nil),                      // 29: content.items.IntrospectRequest
+	(*IntrospectResponse)(nil),                     // 30: content.items.IntrospectResponse
+	(*GetOptions)(nil),                             // 31: content.items.GetOptions
+	(*GetRequest)(nil),                             // 32: content.items.GetRequest
+	(*GetResponse)(nil),                            // 33: content.items.GetResponse
+	(*FindRequest)(nil),                            // 34: content.items.FindRequest
+	(*FindResponse)(nil),                           // 35: content.items.FindResponse
+	(*UpdateRequest)(nil),                          // 36: content.items.UpdateRequest
+	(*DeleteRequest)(nil),                          // 37: content.items.DeleteRequest
+	(*UndeleteRequest)(nil),                        // 38: content.items.UndeleteRequest
+	(*PublishRequest)(nil),                         // 39: content.items.PublishRequest
+	(*UnpublishRequest)(nil),                       // 40: content.items.UnpublishRequest
+	(*GetPublishedRequest)(nil),                    // 41: content.items.GetPublishedRequest
+	(*GetPublishedResponse)(nil),                   // 42: content.items.GetPublishedResponse
+	(*FindPublishedRequest)(nil),                   // 43: content.items.FindPublishedRequest
+	(*FindPublishedResponse)(nil),                  // 44: content.items.FindPublishedResponse
+	(*AggregateRequest)(nil),                       // 45: content.items.AggregateRequest
+	(*AggregateResponse)(nil),                      // 46: content.items.AggregateResponse
+	(*AggregatePublishedRequest)(nil),              // 47: content.items.AggregatePublishedRequest
+	(*AggregatePublishedResponse)(nil),             // 48: content.items.AggregatePublishedResponse
+	(*GetRevisionRequest)(nil),                     // 49: content.items.GetRevisionRequest
+	(*GetRevisionResponse)(nil),                    // 50: content.items.GetRevisionResponse
+	(*ListRevisionsRequest)(nil),                   // 51: content.items.ListRevisionsRequest
+	(*ListRevisionsResponse)(nil),                  // 52: content.items.ListRevisionsResponse
+	(*ArchiveRequest)(nil),                         // 53: content.items.ArchiveRequest
+	(*UnarchiveRequest)(nil),                       // 54: content.items.UnarchiveRequest
+	(*FindArchivedRequest)(nil),                    // 55: content.items.FindArchivedRequest
+	(*FindArchivedResponse)(nil),                   // 56: content.items.FindArchivedResponse
+	nil,                                            // 57: content.items.Item.TranslationsEntry
+	nil,                                            // 58: content.items.AggregateOptions.FieldsEntry
+	nil,                                            // 59: content.items.AggregatePublishedOptions.FieldsEntry
+	(*timestamppb.Timestamp)(nil),                  // 60: google.protobuf.Timestamp
+	(*structpb.Struct)(nil),                        // 61: google.protobuf.Struct
+	(*common.Filter)(nil),                          // 62: common.Filter
+	(*common.FindOptions)(nil),                     // 63: common.FindOptions
+	(*common.Error_BadRequest_FieldViolation)(nil), // 64: common.Error.BadRequest.FieldViolation
+	(*emptypb.Empty)(nil),                          // 65: google.protobuf.Empty
 }
 var file_items_items_proto_depIdxs = []int32{
 	1,  // 0: content.items.DecodeError.errors:type_name -> content.items.Error
 	1,  // 1: content.items.ValidationError.errors:type_name -> content.items.Error
 	1,  // 2: content.items.ModificationError.errors:type_name -> content.items.Error
 	0,  // 3: content.items.Item.state:type_name -> content.items.Item.State
-	58, // 4: content.items.Item.created_rev_at:type_name -> google.protobuf.Timestamp
-	58, // 5: content.items.Item.created_at:type_name -> google.protobuf.Timestamp
-	58, // 6: content.items.Item.updated_at:type_name -> google.protobuf.Timestamp
-	59, // 7: content.items.Item.data:type_name -> google.protobuf.Struct
-	55, // 8: content.items.Item.translations:type_name -> content.items.Item.TranslationsEntry
-	5,  // 9: content.items.Item.permissions:type_name -> content.items.Permissions
-	60, // 10: content.items.Filter.data:type_name -> common.Filter
-	61, // 11: content.items.FindOptions.options:type_name -> common.FindOptions
-	61, // 12: content.items.FindPublishedOptions.options:type_name -> common.FindOptions
-	61, // 13: content.items.FindArchivedOptions.options:type_name -> common.FindOptions
-	61, // 14: content.items.ListRevisionsOptions.options:type_name -> common.FindOptions
-	56, // 15: content.items.AggregateOptions.fields:type_name -> content.items.AggregateOptions.FieldsEntry
-	57, // 16: content.items.AggregatePublishedOptions.fields:type_name -> content.items.AggregatePublishedOptions.FieldsEntry
+	60, // 4: content.items.Item.created_rev_at:type_name -> google.protobuf.Timestamp
+	60, // 5: content.items.Item.created_at:type_name -> google.protobuf.Timestamp
+	60, // 6: content.items.Item.updated_at:type_name -> google.protobuf.Timestamp
+	61, // 7: content.items.Item.data:type_name -> google.protobuf.Struct
+	5,  // 8: content.items.Item.permissions:type_name -> content.items.Permissions
+	57, // 9: content.items.Item.translations:type_name -> content.items.Item.TranslationsEntry
+	62, // 10: content.items.Filter.data:type_name -> common.Filter
+	63, // 11: content.items.FindOptions.options:type_name -> common.FindOptions
+	63, // 12: content.items.FindPublishedOptions.options:type_name -> common.FindOptions
+	63, // 13: content.items.FindArchivedOptions.options:type_name -> common.FindOptions
+	63, // 14: content.items.ListRevisionsOptions.options:type_name -> common.FindOptions
+	58, // 15: content.items.AggregateOptions.fields:type_name -> content.items.AggregateOptions.FieldsEntry
+	59, // 16: content.items.AggregatePublishedOptions.fields:type_name -> content.items.AggregatePublishedOptions.FieldsEntry
 	6,  // 17: content.items.CreateRequest.item:type_name -> content.items.Item
 	13, // 18: content.items.CreateRequest.options:type_name -> content.items.CreateOptions
 	6,  // 19: content.items.CreateResponse.created:type_name -> content.items.Item
 	6,  // 20: content.items.IntrospectRequest.item:type_name -> content.items.Item
 	6,  // 21: content.items.IntrospectResponse.item:type_name -> content.items.Item
-	62, // 22: content.items.IntrospectResponse.validation_errors:type_name -> common.Error.BadRequest.FieldViolation
-	6,  // 23: content.items.GetResponse.item:type_name -> content.items.Item
-	12, // 24: content.items.FindRequest.filter:type_name -> content.items.Filter
-	14, // 25: content.items.FindRequest.options:type_name -> content.items.FindOptions
-	6,  // 26: content.items.FindResponse.items:type_name -> content.items.Item
-	6,  // 27: content.items.UpdateRequest.item:type_name -> content.items.Item
-	15, // 28: content.items.UpdateRequest.options:type_name -> content.items.UpdateOptions
-	6,  // 29: content.items.DeleteRequest.item:type_name -> content.items.Item
-	17, // 30: content.items.DeleteRequest.options:type_name -> content.items.DeleteOptions
-	6,  // 31: content.items.UndeleteRequest.item:type_name -> content.items.Item
-	18, // 32: content.items.UndeleteRequest.options:type_name -> content.items.UndeleteOptions
-	6,  // 33: content.items.PublishRequest.item:type_name -> content.items.Item
-	19, // 34: content.items.PublishRequest.options:type_name -> content.items.PublishOptions
-	6,  // 35: content.items.UnpublishRequest.item:type_name -> content.items.Item
-	20, // 36: content.items.UnpublishRequest.options:type_name -> content.items.UnpublishOptions
-	16, // 37: content.items.GetPublishedRequest.options:type_name -> content.items.GetPublishedOptions
-	6,  // 38: content.items.GetPublishedResponse.item:type_name -> content.items.Item
-	12, // 39: content.items.FindPublishedRequest.filter:type_name -> content.items.Filter
-	21, // 40: content.items.FindPublishedRequest.options:type_name -> content.items.FindPublishedOptions
-	6,  // 41: content.items.FindPublishedResponse.items:type_name -> content.items.Item
-	12, // 42: content.items.AggregateRequest.filter:type_name -> content.items.Filter
-	24, // 43: content.items.AggregateRequest.options:type_name -> content.items.AggregateOptions
-	59, // 44: content.items.AggregateResponse.result:type_name -> google.protobuf.Struct
-	12, // 45: content.items.AggregatePublishedRequest.filter:type_name -> content.items.Filter
-	25, // 46: content.items.AggregatePublishedRequest.options:type_name -> content.items.AggregatePublishedOptions
-	59, // 47: content.items.AggregatePublishedResponse.result:type_name -> google.protobuf.Struct
-	6,  // 48: content.items.GetRevisionResponse.item:type_name -> content.items.Item
-	23, // 49: content.items.ListRevisionsRequest.options:type_name -> content.items.ListRevisionsOptions
-	6,  // 50: content.items.ListRevisionsResponse.items:type_name -> content.items.Item
-	6,  // 51: content.items.ArchiveRequest.item:type_name -> content.items.Item
-	6,  // 52: content.items.UnarchiveRequest.item:type_name -> content.items.Item
-	12, // 53: content.items.FindArchivedRequest.filter:type_name -> content.items.Filter
-	22, // 54: content.items.FindArchivedRequest.options:type_name -> content.items.FindArchivedOptions
-	6,  // 55: content.items.FindArchivedResponse.items:type_name -> content.items.Item
-	59, // 56: content.items.Item.TranslationsEntry.value:type_name -> google.protobuf.Struct
-	26, // 57: content.items.Items.Create:input_type -> content.items.CreateRequest
-	28, // 58: content.items.Items.Introspect:input_type -> content.items.IntrospectRequest
-	30, // 59: content.items.Items.Get:input_type -> content.items.GetRequest
-	32, // 60: content.items.Items.Find:input_type -> content.items.FindRequest
-	34, // 61: content.items.Items.Update:input_type -> content.items.UpdateRequest
-	35, // 62: content.items.Items.Delete:input_type -> content.items.DeleteRequest
-	36, // 63: content.items.Items.Undelete:input_type -> content.items.UndeleteRequest
-	37, // 64: content.items.Items.Publish:input_type -> content.items.PublishRequest
-	38, // 65: content.items.Items.Unpublish:input_type -> content.items.UnpublishRequest
-	39, // 66: content.items.Items.GetPublished:input_type -> content.items.GetPublishedRequest
-	41, // 67: content.items.Items.FindPublished:input_type -> content.items.FindPublishedRequest
-	43, // 68: content.items.Items.Aggregate:input_type -> content.items.AggregateRequest
-	45, // 69: content.items.Items.AggregatePublished:input_type -> content.items.AggregatePublishedRequest
-	47, // 70: content.items.Items.GetRevision:input_type -> content.items.GetRevisionRequest
-	49, // 71: content.items.Items.ListRevisions:input_type -> content.items.ListRevisionsRequest
-	51, // 72: content.items.Items.Archive:input_type -> content.items.ArchiveRequest
-	53, // 73: content.items.Items.FindArchived:input_type -> content.items.FindArchivedRequest
-	52, // 74: content.items.Items.Unarchive:input_type -> content.items.UnarchiveRequest
-	27, // 75: content.items.Items.Create:output_type -> content.items.CreateResponse
-	29, // 76: content.items.Items.Introspect:output_type -> content.items.IntrospectResponse
-	31, // 77: content.items.Items.Get:output_type -> content.items.GetResponse
-	33, // 78: content.items.Items.Find:output_type -> content.items.FindResponse
-	63, // 79: content.items.Items.Update:output_type -> google.protobuf.Empty
-	63, // 80: content.items.Items.Delete:output_type -> google.protobuf.Empty
-	63, // 81: content.items.Items.Undelete:output_type -> google.protobuf.Empty
-	63, // 82: content.items.Items.Publish:output_type -> google.protobuf.Empty
-	63, // 83: content.items.Items.Unpublish:output_type -> google.protobuf.Empty
-	40, // 84: content.items.Items.GetPublished:output_type -> content.items.GetPublishedResponse
-	42, // 85: content.items.Items.FindPublished:output_type -> content.items.FindPublishedResponse
-	44, // 86: content.items.Items.Aggregate:output_type -> content.items.AggregateResponse
-	46, // 87: content.items.Items.AggregatePublished:output_type -> content.items.AggregatePublishedResponse
-	48, // 88: content.items.Items.GetRevision:output_type -> content.items.GetRevisionResponse
-	50, // 89: content.items.Items.ListRevisions:output_type -> content.items.ListRevisionsResponse
-	63, // 90: content.items.Items.Archive:output_type -> google.protobuf.Empty
-	54, // 91: content.items.Items.FindArchived:output_type -> content.items.FindArchivedResponse
-	63, // 92: content.items.Items.Unarchive:output_type -> google.protobuf.Empty
-	75, // [75:93] is the sub-list for method output_type
-	57, // [57:75] is the sub-list for method input_type
-	57, // [57:57] is the sub-list for extension type_name
-	57, // [57:57] is the sub-list for extension extendee
-	0,  // [0:57] is the sub-list for field type_name
+	64, // 22: content.items.IntrospectResponse.validation_errors:type_name -> common.Error.BadRequest.FieldViolation
+	31, // 23: content.items.GetRequest.options:type_name -> content.items.GetOptions
+	6,  // 24: content.items.GetResponse.item:type_name -> content.items.Item
+	12, // 25: content.items.FindRequest.filter:type_name -> content.items.Filter
+	14, // 26: content.items.FindRequest.options:type_name -> content.items.FindOptions
+	6,  // 27: content.items.FindResponse.items:type_name -> content.items.Item
+	6,  // 28: content.items.UpdateRequest.item:type_name -> content.items.Item
+	15, // 29: content.items.UpdateRequest.options:type_name -> content.items.UpdateOptions
+	6,  // 30: content.items.DeleteRequest.item:type_name -> content.items.Item
+	17, // 31: content.items.DeleteRequest.options:type_name -> content.items.DeleteOptions
+	6,  // 32: content.items.UndeleteRequest.item:type_name -> content.items.Item
+	18, // 33: content.items.UndeleteRequest.options:type_name -> content.items.UndeleteOptions
+	6,  // 34: content.items.PublishRequest.item:type_name -> content.items.Item
+	19, // 35: content.items.PublishRequest.options:type_name -> content.items.PublishOptions
+	6,  // 36: content.items.UnpublishRequest.item:type_name -> content.items.Item
+	20, // 37: content.items.UnpublishRequest.options:type_name -> content.items.UnpublishOptions
+	16, // 38: content.items.GetPublishedRequest.options:type_name -> content.items.GetPublishedOptions
+	6,  // 39: content.items.GetPublishedResponse.item:type_name -> content.items.Item
+	12, // 40: content.items.FindPublishedRequest.filter:type_name -> content.items.Filter
+	21, // 41: content.items.FindPublishedRequest.options:type_name -> content.items.FindPublishedOptions
+	6,  // 42: content.items.FindPublishedResponse.items:type_name -> content.items.Item
+	12, // 43: content.items.AggregateRequest.filter:type_name -> content.items.Filter
+	25, // 44: content.items.AggregateRequest.options:type_name -> content.items.AggregateOptions
+	61, // 45: content.items.AggregateResponse.result:type_name -> google.protobuf.Struct
+	12, // 46: content.items.AggregatePublishedRequest.filter:type_name -> content.items.Filter
+	26, // 47: content.items.AggregatePublishedRequest.options:type_name -> content.items.AggregatePublishedOptions
+	61, // 48: content.items.AggregatePublishedResponse.result:type_name -> google.protobuf.Struct
+	24, // 49: content.items.GetRevisionRequest.options:type_name -> content.items.GetRevisionOptions
+	6,  // 50: content.items.GetRevisionResponse.item:type_name -> content.items.Item
+	23, // 51: content.items.ListRevisionsRequest.options:type_name -> content.items.ListRevisionsOptions
+	6,  // 52: content.items.ListRevisionsResponse.items:type_name -> content.items.Item
+	6,  // 53: content.items.ArchiveRequest.item:type_name -> content.items.Item
+	6,  // 54: content.items.UnarchiveRequest.item:type_name -> content.items.Item
+	12, // 55: content.items.FindArchivedRequest.filter:type_name -> content.items.Filter
+	22, // 56: content.items.FindArchivedRequest.options:type_name -> content.items.FindArchivedOptions
+	6,  // 57: content.items.FindArchivedResponse.items:type_name -> content.items.Item
+	61, // 58: content.items.Item.TranslationsEntry.value:type_name -> google.protobuf.Struct
+	27, // 59: content.items.Items.Create:input_type -> content.items.CreateRequest
+	29, // 60: content.items.Items.Introspect:input_type -> content.items.IntrospectRequest
+	32, // 61: content.items.Items.Get:input_type -> content.items.GetRequest
+	34, // 62: content.items.Items.Find:input_type -> content.items.FindRequest
+	36, // 63: content.items.Items.Update:input_type -> content.items.UpdateRequest
+	37, // 64: content.items.Items.Delete:input_type -> content.items.DeleteRequest
+	38, // 65: content.items.Items.Undelete:input_type -> content.items.UndeleteRequest
+	39, // 66: content.items.Items.Publish:input_type -> content.items.PublishRequest
+	40, // 67: content.items.Items.Unpublish:input_type -> content.items.UnpublishRequest
+	41, // 68: content.items.Items.GetPublished:input_type -> content.items.GetPublishedRequest
+	43, // 69: content.items.Items.FindPublished:input_type -> content.items.FindPublishedRequest
+	45, // 70: content.items.Items.Aggregate:input_type -> content.items.AggregateRequest
+	47, // 71: content.items.Items.AggregatePublished:input_type -> content.items.AggregatePublishedRequest
+	49, // 72: content.items.Items.GetRevision:input_type -> content.items.GetRevisionRequest
+	51, // 73: content.items.Items.ListRevisions:input_type -> content.items.ListRevisionsRequest
+	53, // 74: content.items.Items.Archive:input_type -> content.items.ArchiveRequest
+	55, // 75: content.items.Items.FindArchived:input_type -> content.items.FindArchivedRequest
+	54, // 76: content.items.Items.Unarchive:input_type -> content.items.UnarchiveRequest
+	28, // 77: content.items.Items.Create:output_type -> content.items.CreateResponse
+	30, // 78: content.items.Items.Introspect:output_type -> content.items.IntrospectResponse
+	33, // 79: content.items.Items.Get:output_type -> content.items.GetResponse
+	35, // 80: content.items.Items.Find:output_type -> content.items.FindResponse
+	65, // 81: content.items.Items.Update:output_type -> google.protobuf.Empty
+	65, // 82: content.items.Items.Delete:output_type -> google.protobuf.Empty
+	65, // 83: content.items.Items.Undelete:output_type -> google.protobuf.Empty
+	65, // 84: content.items.Items.Publish:output_type -> google.protobuf.Empty
+	65, // 85: content.items.Items.Unpublish:output_type -> google.protobuf.Empty
+	42, // 86: content.items.Items.GetPublished:output_type -> content.items.GetPublishedResponse
+	44, // 87: content.items.Items.FindPublished:output_type -> content.items.FindPublishedResponse
+	46, // 88: content.items.Items.Aggregate:output_type -> content.items.AggregateResponse
+	48, // 89: content.items.Items.AggregatePublished:output_type -> content.items.AggregatePublishedResponse
+	50, // 90: content.items.Items.GetRevision:output_type -> content.items.GetRevisionResponse
+	52, // 91: content.items.Items.ListRevisions:output_type -> content.items.ListRevisionsResponse
+	65, // 92: content.items.Items.Archive:output_type -> google.protobuf.Empty
+	56, // 93: content.items.Items.FindArchived:output_type -> content.items.FindArchivedResponse
+	65, // 94: content.items.Items.Unarchive:output_type -> google.protobuf.Empty
+	77, // [77:95] is the sub-list for method output_type
+	59, // [59:77] is the sub-list for method input_type
+	59, // [59:59] is the sub-list for extension type_name
+	59, // [59:59] is the sub-list for extension extendee
+	0,  // [0:59] is the sub-list for field type_name
 }
 
 func init() { file_items_items_proto_init() }
@@ -4131,7 +4380,7 @@ func file_items_items_proto_init() {
 		return
 	}
 	if !protoimpl.UnsafeEnabled {
-		file_items_items_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[0].Exporter = func(v any, i int) any {
 			switch v := v.(*Error); i {
 			case 0:
 				return &v.state
@@ -4143,7 +4392,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[1].Exporter = func(v any, i int) any {
 			switch v := v.(*DecodeError); i {
 			case 0:
 				return &v.state
@@ -4155,7 +4404,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[2].Exporter = func(v any, i int) any {
 			switch v := v.(*ValidationError); i {
 			case 0:
 				return &v.state
@@ -4167,7 +4416,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[3].Exporter = func(v any, i int) any {
 			switch v := v.(*ModificationError); i {
 			case 0:
 				return &v.state
@@ -4179,7 +4428,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[4].Exporter = func(v any, i int) any {
 			switch v := v.(*Permissions); i {
 			case 0:
 				return &v.state
@@ -4191,7 +4440,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[5].Exporter = func(v any, i int) any {
 			switch v := v.(*Item); i {
 			case 0:
 				return &v.state
@@ -4203,7 +4452,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[6].Exporter = func(v any, i int) any {
 			switch v := v.(*EventCreate); i {
 			case 0:
 				return &v.state
@@ -4215,7 +4464,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[7].Exporter = func(v any, i int) any {
 			switch v := v.(*EventUpdate); i {
 			case 0:
 				return &v.state
@@ -4227,7 +4476,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[8].Exporter = func(v any, i int) any {
 			switch v := v.(*EventPublish); i {
 			case 0:
 				return &v.state
@@ -4239,7 +4488,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[9].Exporter = func(v any, i int) any {
 			switch v := v.(*EventUnpublish); i {
 			case 0:
 				return &v.state
@@ -4251,7 +4500,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[10].Exporter = func(v any, i int) any {
 			switch v := v.(*EventDelete); i {
 			case 0:
 				return &v.state
@@ -4263,7 +4512,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[11].Exporter = func(v any, i int) any {
 			switch v := v.(*Filter); i {
 			case 0:
 				return &v.state
@@ -4275,7 +4524,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[12].Exporter = func(v any, i int) any {
 			switch v := v.(*CreateOptions); i {
 			case 0:
 				return &v.state
@@ -4287,7 +4536,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[13].Exporter = func(v any, i int) any {
 			switch v := v.(*FindOptions); i {
 			case 0:
 				return &v.state
@@ -4299,7 +4548,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[14].Exporter = func(v any, i int) any {
 			switch v := v.(*UpdateOptions); i {
 			case 0:
 				return &v.state
@@ -4311,7 +4560,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[15].Exporter = func(v any, i int) any {
 			switch v := v.(*GetPublishedOptions); i {
 			case 0:
 				return &v.state
@@ -4323,7 +4572,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[16].Exporter = func(v any, i int) any {
 			switch v := v.(*DeleteOptions); i {
 			case 0:
 				return &v.state
@@ -4335,7 +4584,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[17].Exporter = func(v any, i int) any {
 			switch v := v.(*UndeleteOptions); i {
 			case 0:
 				return &v.state
@@ -4347,7 +4596,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[18].Exporter = func(v any, i int) any {
 			switch v := v.(*PublishOptions); i {
 			case 0:
 				return &v.state
@@ -4359,7 +4608,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[19].Exporter = func(v any, i int) any {
 			switch v := v.(*UnpublishOptions); i {
 			case 0:
 				return &v.state
@@ -4371,7 +4620,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[20].Exporter = func(v any, i int) any {
 			switch v := v.(*FindPublishedOptions); i {
 			case 0:
 				return &v.state
@@ -4383,7 +4632,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[21].Exporter = func(v any, i int) any {
 			switch v := v.(*FindArchivedOptions); i {
 			case 0:
 				return &v.state
@@ -4395,7 +4644,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[22].Exporter = func(v any, i int) any {
 			switch v := v.(*ListRevisionsOptions); i {
 			case 0:
 				return &v.state
@@ -4407,7 +4656,19 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[23].Exporter = func(v any, i int) any {
+			switch v := v.(*GetRevisionOptions); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_items_items_proto_msgTypes[24].Exporter = func(v any, i int) any {
 			switch v := v.(*AggregateOptions); i {
 			case 0:
 				return &v.state
@@ -4419,7 +4680,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[25].Exporter = func(v any, i int) any {
 			switch v := v.(*AggregatePublishedOptions); i {
 			case 0:
 				return &v.state
@@ -4431,7 +4692,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[26].Exporter = func(v any, i int) any {
 			switch v := v.(*CreateRequest); i {
 			case 0:
 				return &v.state
@@ -4443,7 +4704,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[27].Exporter = func(v any, i int) any {
 			switch v := v.(*CreateResponse); i {
 			case 0:
 				return &v.state
@@ -4455,7 +4716,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[28].Exporter = func(v any, i int) any {
 			switch v := v.(*IntrospectRequest); i {
 			case 0:
 				return &v.state
@@ -4467,7 +4728,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[29].Exporter = func(v any, i int) any {
 			switch v := v.(*IntrospectResponse); i {
 			case 0:
 				return &v.state
@@ -4479,7 +4740,19 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[30].Exporter = func(v any, i int) any {
+			switch v := v.(*GetOptions); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_items_items_proto_msgTypes[31].Exporter = func(v any, i int) any {
 			switch v := v.(*GetRequest); i {
 			case 0:
 				return &v.state
@@ -4491,7 +4764,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[32].Exporter = func(v any, i int) any {
 			switch v := v.(*GetResponse); i {
 			case 0:
 				return &v.state
@@ -4503,7 +4776,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[33].Exporter = func(v any, i int) any {
 			switch v := v.(*FindRequest); i {
 			case 0:
 				return &v.state
@@ -4515,7 +4788,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[34].Exporter = func(v any, i int) any {
 			switch v := v.(*FindResponse); i {
 			case 0:
 				return &v.state
@@ -4527,7 +4800,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[35].Exporter = func(v any, i int) any {
 			switch v := v.(*UpdateRequest); i {
 			case 0:
 				return &v.state
@@ -4539,7 +4812,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[36].Exporter = func(v any, i int) any {
 			switch v := v.(*DeleteRequest); i {
 			case 0:
 				return &v.state
@@ -4551,7 +4824,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[37].Exporter = func(v any, i int) any {
 			switch v := v.(*UndeleteRequest); i {
 			case 0:
 				return &v.state
@@ -4563,7 +4836,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[38].Exporter = func(v any, i int) any {
 			switch v := v.(*PublishRequest); i {
 			case 0:
 				return &v.state
@@ -4575,7 +4848,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[39].Exporter = func(v any, i int) any {
 			switch v := v.(*UnpublishRequest); i {
 			case 0:
 				return &v.state
@@ -4587,7 +4860,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[40].Exporter = func(v any, i int) any {
 			switch v := v.(*GetPublishedRequest); i {
 			case 0:
 				return &v.state
@@ -4599,7 +4872,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[41].Exporter = func(v any, i int) any {
 			switch v := v.(*GetPublishedResponse); i {
 			case 0:
 				return &v.state
@@ -4611,7 +4884,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[42].Exporter = func(v any, i int) any {
 			switch v := v.(*FindPublishedRequest); i {
 			case 0:
 				return &v.state
@@ -4623,7 +4896,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[43].Exporter = func(v any, i int) any {
 			switch v := v.(*FindPublishedResponse); i {
 			case 0:
 				return &v.state
@@ -4635,7 +4908,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[44].Exporter = func(v any, i int) any {
 			switch v := v.(*AggregateRequest); i {
 			case 0:
 				return &v.state
@@ -4647,7 +4920,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[45].Exporter = func(v any, i int) any {
 			switch v := v.(*AggregateResponse); i {
 			case 0:
 				return &v.state
@@ -4659,7 +4932,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[46].Exporter = func(v any, i int) any {
 			switch v := v.(*AggregatePublishedRequest); i {
 			case 0:
 				return &v.state
@@ -4671,7 +4944,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[47].Exporter = func(v any, i int) any {
 			switch v := v.(*AggregatePublishedResponse); i {
 			case 0:
 				return &v.state
@@ -4683,7 +4956,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[48].Exporter = func(v any, i int) any {
 			switch v := v.(*GetRevisionRequest); i {
 			case 0:
 				return &v.state
@@ -4695,7 +4968,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[49].Exporter = func(v any, i int) any {
 			switch v := v.(*GetRevisionResponse); i {
 			case 0:
 				return &v.state
@@ -4707,7 +4980,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[50].Exporter = func(v any, i int) any {
 			switch v := v.(*ListRevisionsRequest); i {
 			case 0:
 				return &v.state
@@ -4719,7 +4992,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[51].Exporter = func(v any, i int) any {
 			switch v := v.(*ListRevisionsResponse); i {
 			case 0:
 				return &v.state
@@ -4731,7 +5004,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[52].Exporter = func(v any, i int) any {
 			switch v := v.(*ArchiveRequest); i {
 			case 0:
 				return &v.state
@@ -4743,7 +5016,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[53].Exporter = func(v any, i int) any {
 			switch v := v.(*UnarchiveRequest); i {
 			case 0:
 				return &v.state
@@ -4755,7 +5028,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[54].Exporter = func(v any, i int) any {
 			switch v := v.(*FindArchivedRequest); i {
 			case 0:
 				return &v.state
@@ -4767,7 +5040,7 @@ func file_items_items_proto_init() {
 				return nil
 			}
 		}
-		file_items_items_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
+		file_items_items_proto_msgTypes[55].Exporter = func(v any, i int) any {
 			switch v := v.(*FindArchivedResponse); i {
 			case 0:
 				return &v.state
@@ -4786,7 +5059,7 @@ func file_items_items_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_items_items_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   57,
+			NumMessages:   59,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/items/items_grpc.pb.go b/proto/items/items_grpc.pb.go
index 90accf67..9d758579 100644
--- a/proto/items/items_grpc.pb.go
+++ b/proto/items/items_grpc.pb.go
@@ -8,8 +8,8 @@
 
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.3.0
-// - protoc             v4.25.1
+// - protoc-gen-go-grpc v1.4.0
+// - protoc             v5.27.0
 // source: items/items.proto
 
 package items
@@ -24,8 +24,8 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.32.0 or later.
-const _ = grpc.SupportPackageIsVersion7
+// Requires gRPC-Go v1.62.0 or later.
+const _ = grpc.SupportPackageIsVersion8
 
 const (
 	Items_Create_FullMethodName             = "/content.items.Items/Create"
@@ -51,6 +51,9 @@ const (
 // ItemsClient is the client API for Items service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+//
+// *
+// Сервис API элементов
 type ItemsClient interface {
 	// *
 	// Создать запись
@@ -93,8 +96,9 @@ func NewItemsClient(cc grpc.ClientConnInterface) ItemsClient {
 }
 
 func (c *itemsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, Items_Create_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Create_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -102,8 +106,9 @@ func (c *itemsClient) Create(ctx context.Context, in *CreateRequest, opts ...grp
 }
 
 func (c *itemsClient) Introspect(ctx context.Context, in *IntrospectRequest, opts ...grpc.CallOption) (*IntrospectResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(IntrospectResponse)
-	err := c.cc.Invoke(ctx, Items_Introspect_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Introspect_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -111,8 +116,9 @@ func (c *itemsClient) Introspect(ctx context.Context, in *IntrospectRequest, opt
 }
 
 func (c *itemsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, Items_Get_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Get_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -120,8 +126,9 @@ func (c *itemsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Call
 }
 
 func (c *itemsClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(FindResponse)
-	err := c.cc.Invoke(ctx, Items_Find_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Find_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -129,8 +136,9 @@ func (c *itemsClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.Ca
 }
 
 func (c *itemsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Update_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Update_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -138,8 +146,9 @@ func (c *itemsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grp
 }
 
 func (c *itemsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Delete_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Delete_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -147,8 +156,9 @@ func (c *itemsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grp
 }
 
 func (c *itemsClient) Undelete(ctx context.Context, in *UndeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Undelete_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Undelete_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -156,8 +166,9 @@ func (c *itemsClient) Undelete(ctx context.Context, in *UndeleteRequest, opts ..
 }
 
 func (c *itemsClient) Publish(ctx context.Context, in *PublishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Publish_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Publish_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -165,8 +176,9 @@ func (c *itemsClient) Publish(ctx context.Context, in *PublishRequest, opts ...g
 }
 
 func (c *itemsClient) Unpublish(ctx context.Context, in *UnpublishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Unpublish_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Unpublish_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -174,8 +186,9 @@ func (c *itemsClient) Unpublish(ctx context.Context, in *UnpublishRequest, opts
 }
 
 func (c *itemsClient) GetPublished(ctx context.Context, in *GetPublishedRequest, opts ...grpc.CallOption) (*GetPublishedResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(GetPublishedResponse)
-	err := c.cc.Invoke(ctx, Items_GetPublished_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_GetPublished_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -183,8 +196,9 @@ func (c *itemsClient) GetPublished(ctx context.Context, in *GetPublishedRequest,
 }
 
 func (c *itemsClient) FindPublished(ctx context.Context, in *FindPublishedRequest, opts ...grpc.CallOption) (*FindPublishedResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(FindPublishedResponse)
-	err := c.cc.Invoke(ctx, Items_FindPublished_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_FindPublished_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -192,8 +206,9 @@ func (c *itemsClient) FindPublished(ctx context.Context, in *FindPublishedReques
 }
 
 func (c *itemsClient) Aggregate(ctx context.Context, in *AggregateRequest, opts ...grpc.CallOption) (*AggregateResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(AggregateResponse)
-	err := c.cc.Invoke(ctx, Items_Aggregate_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Aggregate_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -201,8 +216,9 @@ func (c *itemsClient) Aggregate(ctx context.Context, in *AggregateRequest, opts
 }
 
 func (c *itemsClient) AggregatePublished(ctx context.Context, in *AggregatePublishedRequest, opts ...grpc.CallOption) (*AggregatePublishedResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(AggregatePublishedResponse)
-	err := c.cc.Invoke(ctx, Items_AggregatePublished_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_AggregatePublished_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -210,8 +226,9 @@ func (c *itemsClient) AggregatePublished(ctx context.Context, in *AggregatePubli
 }
 
 func (c *itemsClient) GetRevision(ctx context.Context, in *GetRevisionRequest, opts ...grpc.CallOption) (*GetRevisionResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(GetRevisionResponse)
-	err := c.cc.Invoke(ctx, Items_GetRevision_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_GetRevision_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -219,8 +236,9 @@ func (c *itemsClient) GetRevision(ctx context.Context, in *GetRevisionRequest, o
 }
 
 func (c *itemsClient) ListRevisions(ctx context.Context, in *ListRevisionsRequest, opts ...grpc.CallOption) (*ListRevisionsResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(ListRevisionsResponse)
-	err := c.cc.Invoke(ctx, Items_ListRevisions_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_ListRevisions_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -228,8 +246,9 @@ func (c *itemsClient) ListRevisions(ctx context.Context, in *ListRevisionsReques
 }
 
 func (c *itemsClient) Archive(ctx context.Context, in *ArchiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Archive_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Archive_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -237,8 +256,9 @@ func (c *itemsClient) Archive(ctx context.Context, in *ArchiveRequest, opts ...g
 }
 
 func (c *itemsClient) FindArchived(ctx context.Context, in *FindArchivedRequest, opts ...grpc.CallOption) (*FindArchivedResponse, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(FindArchivedResponse)
-	err := c.cc.Invoke(ctx, Items_FindArchived_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_FindArchived_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -246,8 +266,9 @@ func (c *itemsClient) FindArchived(ctx context.Context, in *FindArchivedRequest,
 }
 
 func (c *itemsClient) Unarchive(ctx context.Context, in *UnarchiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, Items_Unarchive_FullMethodName, in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Unarchive_FullMethodName, in, out, cOpts...)
 	if err != nil {
 		return nil, err
 	}
@@ -257,6 +278,9 @@ func (c *itemsClient) Unarchive(ctx context.Context, in *UnarchiveRequest, opts
 // ItemsServer is the server API for Items service.
 // All implementations must embed UnimplementedItemsServer
 // for forward compatibility
+//
+// *
+// Сервис API элементов
 type ItemsServer interface {
 	// *
 	// Создать запись
-- 
GitLab