diff --git a/go.work.sum b/go.work.sum
index 14b6d21..cb45cc7 100644
--- a/go.work.sum
+++ b/go.work.sum
@@ -76,7 +76,9 @@
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -85,6 +87,7 @@
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
@@ -208,6 +211,7 @@
 golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
 golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
@@ -216,6 +220,7 @@
 google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
 google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg=
 google.golang.org/api v0.170.0/go.mod h1:/xql9M2btF85xac/VAm4PsLMTLVGUOpq4BE9R8jyNy8=
+google.golang.org/api v0.172.0/go.mod h1:+fJZq6QXWfa9pXhnIzsjx4yI22d4aI9ZpLb58gvXjis=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
@@ -230,13 +235,18 @@
 google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
 google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro=
 google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M=
+google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA=
+google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8=
 google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s=
 google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA=
 google.golang.org/genproto/googleapis/bytestream v0.0.0-20240311132316-a219d84964c2/go.mod h1:vh/N7795ftP0AkN1w8XKqN4w1OdUKXW5Eummda+ofv8=
+google.golang.org/genproto/googleapis/bytestream v0.0.0-20240318140521-94a12d6c2237/go.mod h1:IN9OQUXZ0xT+26MDwZL8fJcYw+y99b0eYPA2U15Jt8o=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
@@ -249,6 +259,7 @@
 google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
 google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
 google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
+google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -259,6 +270,8 @@
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/googleapis/apps/card/v1/card.pb.go b/googleapis/apps/card/v1/card.pb.go
new file mode 100644
index 0000000..fae54ed
--- /dev/null
+++ b/googleapis/apps/card/v1/card.pb.go
@@ -0,0 +1,6448 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v4.24.4
+// source: google/apps/card/v1/card.proto
+
+package card
+
+import (
+	reflect "reflect"
+	sync "sync"
+
+	color "google.golang.org/genproto/googleapis/type/color"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// The divider style of a card. Currently only used for dividers betweens card
+// sections.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Card_DividerStyle int32
+
+const (
+	// Don't use. Unspecified.
+	Card_DIVIDER_STYLE_UNSPECIFIED Card_DividerStyle = 0
+	// Default option. Render a solid divider between sections.
+	Card_SOLID_DIVIDER Card_DividerStyle = 1
+	// If set, no divider is rendered between sections.
+	Card_NO_DIVIDER Card_DividerStyle = 2
+)
+
+// Enum value maps for Card_DividerStyle.
+var (
+	Card_DividerStyle_name = map[int32]string{
+		0: "DIVIDER_STYLE_UNSPECIFIED",
+		1: "SOLID_DIVIDER",
+		2: "NO_DIVIDER",
+	}
+	Card_DividerStyle_value = map[string]int32{
+		"DIVIDER_STYLE_UNSPECIFIED": 0,
+		"SOLID_DIVIDER":             1,
+		"NO_DIVIDER":                2,
+	}
+)
+
+func (x Card_DividerStyle) Enum() *Card_DividerStyle {
+	p := new(Card_DividerStyle)
+	*p = x
+	return p
+}
+
+func (x Card_DividerStyle) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Card_DividerStyle) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[0].Descriptor()
+}
+
+func (Card_DividerStyle) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[0]
+}
+
+func (x Card_DividerStyle) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Card_DividerStyle.Descriptor instead.
+func (Card_DividerStyle) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0, 0}
+}
+
+// In Google Workspace Add-ons,
+// determines how a card is displayed.
+//
+// [Google Workspace
+// Add-ons](https://developers.google.com/workspace/add-ons):
+type Card_DisplayStyle int32
+
+const (
+	// Don't use. Unspecified.
+	Card_DISPLAY_STYLE_UNSPECIFIED Card_DisplayStyle = 0
+	// The header of the card appears at the bottom of the
+	// sidebar, partially covering the current top card of the stack. Clicking
+	// the header pops the card into the card stack. If the card has no header,
+	// a generated header is used instead.
+	Card_PEEK Card_DisplayStyle = 1
+	// Default value. The card is shown by replacing the view of the top card in
+	// the card stack.
+	Card_REPLACE Card_DisplayStyle = 2
+)
+
+// Enum value maps for Card_DisplayStyle.
+var (
+	Card_DisplayStyle_name = map[int32]string{
+		0: "DISPLAY_STYLE_UNSPECIFIED",
+		1: "PEEK",
+		2: "REPLACE",
+	}
+	Card_DisplayStyle_value = map[string]int32{
+		"DISPLAY_STYLE_UNSPECIFIED": 0,
+		"PEEK":                      1,
+		"REPLACE":                   2,
+	}
+)
+
+func (x Card_DisplayStyle) Enum() *Card_DisplayStyle {
+	p := new(Card_DisplayStyle)
+	*p = x
+	return p
+}
+
+func (x Card_DisplayStyle) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Card_DisplayStyle) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[1].Descriptor()
+}
+
+func (Card_DisplayStyle) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[1]
+}
+
+func (x Card_DisplayStyle) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Card_DisplayStyle.Descriptor instead.
+func (Card_DisplayStyle) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0, 1}
+}
+
+// The shape used to crop the image.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Widget_ImageType int32
+
+const (
+	// Default value. Applies a square mask to the image. For example, a 4x3
+	// image becomes 3x3.
+	Widget_SQUARE Widget_ImageType = 0
+	// Applies a circular mask to the image. For example, a 4x3 image becomes a
+	// circle with a diameter of 3.
+	Widget_CIRCLE Widget_ImageType = 1
+)
+
+// Enum value maps for Widget_ImageType.
+var (
+	Widget_ImageType_name = map[int32]string{
+		0: "SQUARE",
+		1: "CIRCLE",
+	}
+	Widget_ImageType_value = map[string]int32{
+		"SQUARE": 0,
+		"CIRCLE": 1,
+	}
+)
+
+func (x Widget_ImageType) Enum() *Widget_ImageType {
+	p := new(Widget_ImageType)
+	*p = x
+	return p
+}
+
+func (x Widget_ImageType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Widget_ImageType) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[2].Descriptor()
+}
+
+func (Widget_ImageType) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[2]
+}
+
+func (x Widget_ImageType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Widget_ImageType.Descriptor instead.
+func (Widget_ImageType) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{1, 0}
+}
+
+// Specifies whether widgets align to the left, right, or center of a column.
+//
+// [Google Chat apps](https://developers.google.com/workspace/chat):
+type Widget_HorizontalAlignment int32
+
+const (
+	// Don't use. Unspecified.
+	Widget_HORIZONTAL_ALIGNMENT_UNSPECIFIED Widget_HorizontalAlignment = 0
+	// Default value. Aligns widgets to the start position of the column. For
+	// left-to-right layouts, aligns to the left. For right-to-left layouts,
+	// aligns to the right.
+	Widget_START Widget_HorizontalAlignment = 1
+	// Aligns widgets to the center of the column.
+	Widget_CENTER Widget_HorizontalAlignment = 2
+	// Aligns widgets to the end position of the column. For left-to-right
+	// layouts, aligns widgets to the right. For right-to-left layouts, aligns
+	// widgets to the left.
+	Widget_END Widget_HorizontalAlignment = 3
+)
+
+// Enum value maps for Widget_HorizontalAlignment.
+var (
+	Widget_HorizontalAlignment_name = map[int32]string{
+		0: "HORIZONTAL_ALIGNMENT_UNSPECIFIED",
+		1: "START",
+		2: "CENTER",
+		3: "END",
+	}
+	Widget_HorizontalAlignment_value = map[string]int32{
+		"HORIZONTAL_ALIGNMENT_UNSPECIFIED": 0,
+		"START":                            1,
+		"CENTER":                           2,
+		"END":                              3,
+	}
+)
+
+func (x Widget_HorizontalAlignment) Enum() *Widget_HorizontalAlignment {
+	p := new(Widget_HorizontalAlignment)
+	*p = x
+	return p
+}
+
+func (x Widget_HorizontalAlignment) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Widget_HorizontalAlignment) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[3].Descriptor()
+}
+
+func (Widget_HorizontalAlignment) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[3]
+}
+
+func (x Widget_HorizontalAlignment) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Widget_HorizontalAlignment.Descriptor instead.
+func (Widget_HorizontalAlignment) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{1, 1}
+}
+
+// How the switch appears in the user interface.
+//
+// [Google Workspace Add-ons
+// and Chat apps](https://developers.google.com/workspace/extend):
+type DecoratedText_SwitchControl_ControlType int32
+
+const (
+	// A toggle-style switch.
+	DecoratedText_SwitchControl_SWITCH DecoratedText_SwitchControl_ControlType = 0
+	// Deprecated in favor of `CHECK_BOX`.
+	DecoratedText_SwitchControl_CHECKBOX DecoratedText_SwitchControl_ControlType = 1
+	// A checkbox.
+	DecoratedText_SwitchControl_CHECK_BOX DecoratedText_SwitchControl_ControlType = 2
+)
+
+// Enum value maps for DecoratedText_SwitchControl_ControlType.
+var (
+	DecoratedText_SwitchControl_ControlType_name = map[int32]string{
+		0: "SWITCH",
+		1: "CHECKBOX",
+		2: "CHECK_BOX",
+	}
+	DecoratedText_SwitchControl_ControlType_value = map[string]int32{
+		"SWITCH":    0,
+		"CHECKBOX":  1,
+		"CHECK_BOX": 2,
+	}
+)
+
+func (x DecoratedText_SwitchControl_ControlType) Enum() *DecoratedText_SwitchControl_ControlType {
+	p := new(DecoratedText_SwitchControl_ControlType)
+	*p = x
+	return p
+}
+
+func (x DecoratedText_SwitchControl_ControlType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DecoratedText_SwitchControl_ControlType) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[4].Descriptor()
+}
+
+func (DecoratedText_SwitchControl_ControlType) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[4]
+}
+
+func (x DecoratedText_SwitchControl_ControlType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DecoratedText_SwitchControl_ControlType.Descriptor instead.
+func (DecoratedText_SwitchControl_ControlType) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{5, 0, 0}
+}
+
+// How a text input field appears in the user interface. For example,
+// whether it's a single line input field, or a multi-line input. If
+// `initialSuggestions` is specified, `type` is always `SINGLE_LINE`,
+// even if it's set to `MULTIPLE_LINE`.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type TextInput_Type int32
+
+const (
+	// The text input field has a fixed height of one line.
+	TextInput_SINGLE_LINE TextInput_Type = 0
+	// The text input field has a fixed height of multiple lines.
+	TextInput_MULTIPLE_LINE TextInput_Type = 1
+)
+
+// Enum value maps for TextInput_Type.
+var (
+	TextInput_Type_name = map[int32]string{
+		0: "SINGLE_LINE",
+		1: "MULTIPLE_LINE",
+	}
+	TextInput_Type_value = map[string]int32{
+		"SINGLE_LINE":   0,
+		"MULTIPLE_LINE": 1,
+	}
+)
+
+func (x TextInput_Type) Enum() *TextInput_Type {
+	p := new(TextInput_Type)
+	*p = x
+	return p
+}
+
+func (x TextInput_Type) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (TextInput_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[5].Descriptor()
+}
+
+func (TextInput_Type) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[5]
+}
+
+func (x TextInput_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use TextInput_Type.Descriptor instead.
+func (TextInput_Type) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{6, 0}
+}
+
+// The format for the items that users can select. Different options support
+// different types of interactions. For example, users can select multiple
+// checkboxes, but can only select one item from a dropdown menu.
+//
+// Each selection input supports one type of selection. Mixing checkboxes
+// and switches, for example, isn't supported.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type SelectionInput_SelectionType int32
+
+const (
+	// A set of checkboxes. Users can select one or more checkboxes.
+	SelectionInput_CHECK_BOX SelectionInput_SelectionType = 0
+	// A set of radio buttons. Users can select one radio button.
+	SelectionInput_RADIO_BUTTON SelectionInput_SelectionType = 1
+	// A set of switches. Users can turn on one or more switches.
+	SelectionInput_SWITCH SelectionInput_SelectionType = 2
+	// A dropdown menu. Users can select one item from the menu.
+	SelectionInput_DROPDOWN SelectionInput_SelectionType = 3
+	// A multiselect menu for static or dynamic data. From the menu bar,
+	// users select one or more items. Users can also input values to populate
+	// dynamic data. For example, users can start typing the name of a Google
+	// Chat space and the widget autosuggests the space.
+	//
+	// To populate items for a multiselect menu, you can use one of the
+	// following types of data sources:
+	//
+	//   - Static data: Items are specified as `SelectionItem` objects in the
+	//     widget. Up to 100 items.
+	//   - Google Workspace data: Items are populated using data from Google
+	//     Workspace, such as Google Workspace users or Google Chat spaces.
+	//   - External data: Items are populated from an external data
+	//     source outside of Google Workspace.
+	//
+	// For examples of how to implement multiselect menus, see
+	// [Add a multiselect
+	// menu](https://developers.google.com/workspace/chat/design-interactive-card-dialog#multiselect-menu).
+	//
+	// [Google Workspace Add-ons and Chat
+	// apps](https://developers.google.com/workspace/extend):
+	// Multiselect for Google Workspace Add-ons are in
+	// Developer Preview.
+	SelectionInput_MULTI_SELECT SelectionInput_SelectionType = 4
+)
+
+// Enum value maps for SelectionInput_SelectionType.
+var (
+	SelectionInput_SelectionType_name = map[int32]string{
+		0: "CHECK_BOX",
+		1: "RADIO_BUTTON",
+		2: "SWITCH",
+		3: "DROPDOWN",
+		4: "MULTI_SELECT",
+	}
+	SelectionInput_SelectionType_value = map[string]int32{
+		"CHECK_BOX":    0,
+		"RADIO_BUTTON": 1,
+		"SWITCH":       2,
+		"DROPDOWN":     3,
+		"MULTI_SELECT": 4,
+	}
+)
+
+func (x SelectionInput_SelectionType) Enum() *SelectionInput_SelectionType {
+	p := new(SelectionInput_SelectionType)
+	*p = x
+	return p
+}
+
+func (x SelectionInput_SelectionType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SelectionInput_SelectionType) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[6].Descriptor()
+}
+
+func (SelectionInput_SelectionType) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[6]
+}
+
+func (x SelectionInput_SelectionType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SelectionInput_SelectionType.Descriptor instead.
+func (SelectionInput_SelectionType) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{9, 0}
+}
+
+// A data source shared by all [Google Workspace
+// applications]
+// (https://developers.google.com/workspace/chat/api/reference/rest/v1/HostApp).
+//
+// [Google Chat apps](https://developers.google.com/workspace/chat):
+type SelectionInput_PlatformDataSource_CommonDataSource int32
+
+const (
+	// Default value. Don't use.
+	SelectionInput_PlatformDataSource_UNKNOWN SelectionInput_PlatformDataSource_CommonDataSource = 0
+	// Google Workspace users. The user can only view and select users from
+	// their Google Workspace organization.
+	SelectionInput_PlatformDataSource_USER SelectionInput_PlatformDataSource_CommonDataSource = 1
+)
+
+// Enum value maps for SelectionInput_PlatformDataSource_CommonDataSource.
+var (
+	SelectionInput_PlatformDataSource_CommonDataSource_name = map[int32]string{
+		0: "UNKNOWN",
+		1: "USER",
+	}
+	SelectionInput_PlatformDataSource_CommonDataSource_value = map[string]int32{
+		"UNKNOWN": 0,
+		"USER":    1,
+	}
+)
+
+func (x SelectionInput_PlatformDataSource_CommonDataSource) Enum() *SelectionInput_PlatformDataSource_CommonDataSource {
+	p := new(SelectionInput_PlatformDataSource_CommonDataSource)
+	*p = x
+	return p
+}
+
+func (x SelectionInput_PlatformDataSource_CommonDataSource) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SelectionInput_PlatformDataSource_CommonDataSource) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[7].Descriptor()
+}
+
+func (SelectionInput_PlatformDataSource_CommonDataSource) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[7]
+}
+
+func (x SelectionInput_PlatformDataSource_CommonDataSource) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SelectionInput_PlatformDataSource_CommonDataSource.Descriptor instead.
+func (SelectionInput_PlatformDataSource_CommonDataSource) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{9, 1, 0}
+}
+
+// The format for the date and time in the `DateTimePicker` widget.
+// Determines whether users can input a date, a time, or both a date and time.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type DateTimePicker_DateTimePickerType int32
+
+const (
+	// Users input a date and time.
+	DateTimePicker_DATE_AND_TIME DateTimePicker_DateTimePickerType = 0
+	// Users input a date.
+	DateTimePicker_DATE_ONLY DateTimePicker_DateTimePickerType = 1
+	// Users input a time.
+	DateTimePicker_TIME_ONLY DateTimePicker_DateTimePickerType = 2
+)
+
+// Enum value maps for DateTimePicker_DateTimePickerType.
+var (
+	DateTimePicker_DateTimePickerType_name = map[int32]string{
+		0: "DATE_AND_TIME",
+		1: "DATE_ONLY",
+		2: "TIME_ONLY",
+	}
+	DateTimePicker_DateTimePickerType_value = map[string]int32{
+		"DATE_AND_TIME": 0,
+		"DATE_ONLY":     1,
+		"TIME_ONLY":     2,
+	}
+)
+
+func (x DateTimePicker_DateTimePickerType) Enum() *DateTimePicker_DateTimePickerType {
+	p := new(DateTimePicker_DateTimePickerType)
+	*p = x
+	return p
+}
+
+func (x DateTimePicker_DateTimePickerType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DateTimePicker_DateTimePickerType) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[8].Descriptor()
+}
+
+func (DateTimePicker_DateTimePickerType) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[8]
+}
+
+func (x DateTimePicker_DateTimePickerType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DateTimePicker_DateTimePickerType.Descriptor instead.
+func (DateTimePicker_DateTimePickerType) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{10, 0}
+}
+
+// Represents the crop style applied to an image.
+//
+// [Google Workspace Add-ons
+// and Chat apps](https://developers.google.com/workspace/extend):
+type ImageCropStyle_ImageCropType int32
+
+const (
+	// Don't use. Unspecified.
+	ImageCropStyle_IMAGE_CROP_TYPE_UNSPECIFIED ImageCropStyle_ImageCropType = 0
+	// Default value. Applies a square crop.
+	ImageCropStyle_SQUARE ImageCropStyle_ImageCropType = 1
+	// Applies a circular crop.
+	ImageCropStyle_CIRCLE ImageCropStyle_ImageCropType = 2
+	// Applies a rectangular crop with a custom aspect ratio. Set the custom
+	// aspect ratio with `aspectRatio`.
+	ImageCropStyle_RECTANGLE_CUSTOM ImageCropStyle_ImageCropType = 3
+	// Applies a rectangular crop with a 4:3 aspect ratio.
+	ImageCropStyle_RECTANGLE_4_3 ImageCropStyle_ImageCropType = 4
+)
+
+// Enum value maps for ImageCropStyle_ImageCropType.
+var (
+	ImageCropStyle_ImageCropType_name = map[int32]string{
+		0: "IMAGE_CROP_TYPE_UNSPECIFIED",
+		1: "SQUARE",
+		2: "CIRCLE",
+		3: "RECTANGLE_CUSTOM",
+		4: "RECTANGLE_4_3",
+	}
+	ImageCropStyle_ImageCropType_value = map[string]int32{
+		"IMAGE_CROP_TYPE_UNSPECIFIED": 0,
+		"SQUARE":                      1,
+		"CIRCLE":                      2,
+		"RECTANGLE_CUSTOM":            3,
+		"RECTANGLE_4_3":               4,
+	}
+)
+
+func (x ImageCropStyle_ImageCropType) Enum() *ImageCropStyle_ImageCropType {
+	p := new(ImageCropStyle_ImageCropType)
+	*p = x
+	return p
+}
+
+func (x ImageCropStyle_ImageCropType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ImageCropStyle_ImageCropType) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[9].Descriptor()
+}
+
+func (ImageCropStyle_ImageCropType) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[9]
+}
+
+func (x ImageCropStyle_ImageCropType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ImageCropStyle_ImageCropType.Descriptor instead.
+func (ImageCropStyle_ImageCropType) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{14, 0}
+}
+
+// Represents the border types applied to widgets.
+//
+// [Google Workspace Add-ons
+// and Chat apps](https://developers.google.com/workspace/extend):
+type BorderStyle_BorderType int32
+
+const (
+	// Don't use. Unspecified.
+	BorderStyle_BORDER_TYPE_UNSPECIFIED BorderStyle_BorderType = 0
+	// Default value. No border.
+	BorderStyle_NO_BORDER BorderStyle_BorderType = 1
+	// Outline.
+	BorderStyle_STROKE BorderStyle_BorderType = 2
+)
+
+// Enum value maps for BorderStyle_BorderType.
+var (
+	BorderStyle_BorderType_name = map[int32]string{
+		0: "BORDER_TYPE_UNSPECIFIED",
+		1: "NO_BORDER",
+		2: "STROKE",
+	}
+	BorderStyle_BorderType_value = map[string]int32{
+		"BORDER_TYPE_UNSPECIFIED": 0,
+		"NO_BORDER":               1,
+		"STROKE":                  2,
+	}
+)
+
+func (x BorderStyle_BorderType) Enum() *BorderStyle_BorderType {
+	p := new(BorderStyle_BorderType)
+	*p = x
+	return p
+}
+
+func (x BorderStyle_BorderType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (BorderStyle_BorderType) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[10].Descriptor()
+}
+
+func (BorderStyle_BorderType) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[10]
+}
+
+func (x BorderStyle_BorderType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use BorderStyle_BorderType.Descriptor instead.
+func (BorderStyle_BorderType) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{15, 0}
+}
+
+// Represents the various layout options available for a grid item.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Grid_GridItem_GridItemLayout int32
+
+const (
+	// Don't use. Unspecified.
+	Grid_GridItem_GRID_ITEM_LAYOUT_UNSPECIFIED Grid_GridItem_GridItemLayout = 0
+	// The title and subtitle are shown below the grid item's image.
+	Grid_GridItem_TEXT_BELOW Grid_GridItem_GridItemLayout = 1
+	// The title and subtitle are shown above the grid item's image.
+	Grid_GridItem_TEXT_ABOVE Grid_GridItem_GridItemLayout = 2
+)
+
+// Enum value maps for Grid_GridItem_GridItemLayout.
+var (
+	Grid_GridItem_GridItemLayout_name = map[int32]string{
+		0: "GRID_ITEM_LAYOUT_UNSPECIFIED",
+		1: "TEXT_BELOW",
+		2: "TEXT_ABOVE",
+	}
+	Grid_GridItem_GridItemLayout_value = map[string]int32{
+		"GRID_ITEM_LAYOUT_UNSPECIFIED": 0,
+		"TEXT_BELOW":                   1,
+		"TEXT_ABOVE":                   2,
+	}
+)
+
+func (x Grid_GridItem_GridItemLayout) Enum() *Grid_GridItem_GridItemLayout {
+	p := new(Grid_GridItem_GridItemLayout)
+	*p = x
+	return p
+}
+
+func (x Grid_GridItem_GridItemLayout) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Grid_GridItem_GridItemLayout) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[11].Descriptor()
+}
+
+func (Grid_GridItem_GridItemLayout) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[11]
+}
+
+func (x Grid_GridItem_GridItemLayout) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Grid_GridItem_GridItemLayout.Descriptor instead.
+func (Grid_GridItem_GridItemLayout) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{17, 0, 0}
+}
+
+// Specifies how a column fills the width of the card. The width of each
+// column depends on both the `HorizontalSizeStyle` and the width of the
+// widgets within the column.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+// Columns for Google Workspace Add-ons are in
+// Developer Preview.
+type Columns_Column_HorizontalSizeStyle int32
+
+const (
+	// Don't use. Unspecified.
+	Columns_Column_HORIZONTAL_SIZE_STYLE_UNSPECIFIED Columns_Column_HorizontalSizeStyle = 0
+	// Default value. Column fills the available space, up to 70% of the
+	// card's width. If both columns are set to `FILL_AVAILABLE_SPACE`, each
+	// column fills 50% of the space.
+	Columns_Column_FILL_AVAILABLE_SPACE Columns_Column_HorizontalSizeStyle = 1
+	// Column fills the least amount of space possible and no more than 30% of
+	// the card's width.
+	Columns_Column_FILL_MINIMUM_SPACE Columns_Column_HorizontalSizeStyle = 2
+)
+
+// Enum value maps for Columns_Column_HorizontalSizeStyle.
+var (
+	Columns_Column_HorizontalSizeStyle_name = map[int32]string{
+		0: "HORIZONTAL_SIZE_STYLE_UNSPECIFIED",
+		1: "FILL_AVAILABLE_SPACE",
+		2: "FILL_MINIMUM_SPACE",
+	}
+	Columns_Column_HorizontalSizeStyle_value = map[string]int32{
+		"HORIZONTAL_SIZE_STYLE_UNSPECIFIED": 0,
+		"FILL_AVAILABLE_SPACE":              1,
+		"FILL_MINIMUM_SPACE":                2,
+	}
+)
+
+func (x Columns_Column_HorizontalSizeStyle) Enum() *Columns_Column_HorizontalSizeStyle {
+	p := new(Columns_Column_HorizontalSizeStyle)
+	*p = x
+	return p
+}
+
+func (x Columns_Column_HorizontalSizeStyle) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Columns_Column_HorizontalSizeStyle) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[12].Descriptor()
+}
+
+func (Columns_Column_HorizontalSizeStyle) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[12]
+}
+
+func (x Columns_Column_HorizontalSizeStyle) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Columns_Column_HorizontalSizeStyle.Descriptor instead.
+func (Columns_Column_HorizontalSizeStyle) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{18, 0, 0}
+}
+
+// Specifies whether widgets align to the top, bottom, or center of a
+// column.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+// Columns for Google Workspace Add-ons are in
+// Developer Preview.
+type Columns_Column_VerticalAlignment int32
+
+const (
+	// Don't use. Unspecified.
+	Columns_Column_VERTICAL_ALIGNMENT_UNSPECIFIED Columns_Column_VerticalAlignment = 0
+	// Default value. Aligns widgets to the center of a column.
+	Columns_Column_CENTER Columns_Column_VerticalAlignment = 1
+	// Aligns widgets to the top of a column.
+	Columns_Column_TOP Columns_Column_VerticalAlignment = 2
+	// Aligns widgets to the bottom of a column.
+	Columns_Column_BOTTOM Columns_Column_VerticalAlignment = 3
+)
+
+// Enum value maps for Columns_Column_VerticalAlignment.
+var (
+	Columns_Column_VerticalAlignment_name = map[int32]string{
+		0: "VERTICAL_ALIGNMENT_UNSPECIFIED",
+		1: "CENTER",
+		2: "TOP",
+		3: "BOTTOM",
+	}
+	Columns_Column_VerticalAlignment_value = map[string]int32{
+		"VERTICAL_ALIGNMENT_UNSPECIFIED": 0,
+		"CENTER":                         1,
+		"TOP":                            2,
+		"BOTTOM":                         3,
+	}
+)
+
+func (x Columns_Column_VerticalAlignment) Enum() *Columns_Column_VerticalAlignment {
+	p := new(Columns_Column_VerticalAlignment)
+	*p = x
+	return p
+}
+
+func (x Columns_Column_VerticalAlignment) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Columns_Column_VerticalAlignment) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[13].Descriptor()
+}
+
+func (Columns_Column_VerticalAlignment) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[13]
+}
+
+func (x Columns_Column_VerticalAlignment) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Columns_Column_VerticalAlignment.Descriptor instead.
+func (Columns_Column_VerticalAlignment) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{18, 0, 1}
+}
+
+// When an `OnClick` action opens a link, then the client can either open it
+// as a full-size window (if that's the frame used by the client), or an
+// overlay (such as a pop-up). The implementation depends on the client
+// platform capabilities, and the value selected might be ignored if the
+// client doesn't support it. `FULL_SIZE` is supported by all clients.
+//
+// [Google Workspace
+// Add-ons](https://developers.google.com/workspace/add-ons):
+type OpenLink_OpenAs int32
+
+const (
+	// The link opens as a full-size window (if that's the frame used by the
+	// client).
+	OpenLink_FULL_SIZE OpenLink_OpenAs = 0
+	// The link opens as an overlay, such as a pop-up.
+	OpenLink_OVERLAY OpenLink_OpenAs = 1
+)
+
+// Enum value maps for OpenLink_OpenAs.
+var (
+	OpenLink_OpenAs_name = map[int32]string{
+		0: "FULL_SIZE",
+		1: "OVERLAY",
+	}
+	OpenLink_OpenAs_value = map[string]int32{
+		"FULL_SIZE": 0,
+		"OVERLAY":   1,
+	}
+)
+
+func (x OpenLink_OpenAs) Enum() *OpenLink_OpenAs {
+	p := new(OpenLink_OpenAs)
+	*p = x
+	return p
+}
+
+func (x OpenLink_OpenAs) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (OpenLink_OpenAs) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[14].Descriptor()
+}
+
+func (OpenLink_OpenAs) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[14]
+}
+
+func (x OpenLink_OpenAs) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use OpenLink_OpenAs.Descriptor instead.
+func (OpenLink_OpenAs) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{20, 0}
+}
+
+// What the client does when a link opened by an `OnClick` action is closed.
+//
+// Implementation depends on client platform capabilities. For example, a web
+// browser might open a link in a pop-up window with an `OnClose` handler.
+//
+// If both `OnOpen` and `OnClose` handlers are set, and the client platform
+// can't support both values, `OnClose` takes precedence.
+//
+// [Google Workspace
+// Add-ons](https://developers.google.com/workspace/add-ons):
+type OpenLink_OnClose int32
+
+const (
+	// Default value. The card doesn't reload; nothing happens.
+	OpenLink_NOTHING OpenLink_OnClose = 0
+	// Reloads the card after the child window closes.
+	//
+	// If used in conjunction with
+	// [`OpenAs.OVERLAY`](https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1#openas),
+	// the child window acts as a modal dialog and the parent card is blocked
+	// until the child window closes.
+	OpenLink_RELOAD OpenLink_OnClose = 1
+)
+
+// Enum value maps for OpenLink_OnClose.
+var (
+	OpenLink_OnClose_name = map[int32]string{
+		0: "NOTHING",
+		1: "RELOAD",
+	}
+	OpenLink_OnClose_value = map[string]int32{
+		"NOTHING": 0,
+		"RELOAD":  1,
+	}
+)
+
+func (x OpenLink_OnClose) Enum() *OpenLink_OnClose {
+	p := new(OpenLink_OnClose)
+	*p = x
+	return p
+}
+
+func (x OpenLink_OnClose) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (OpenLink_OnClose) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[15].Descriptor()
+}
+
+func (OpenLink_OnClose) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[15]
+}
+
+func (x OpenLink_OnClose) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use OpenLink_OnClose.Descriptor instead.
+func (OpenLink_OnClose) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{20, 1}
+}
+
+// Specifies the loading indicator that the action displays while
+// making the call to the action.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Action_LoadIndicator int32
+
+const (
+	// Displays a spinner to indicate that content is loading.
+	Action_SPINNER Action_LoadIndicator = 0
+	// Nothing is displayed.
+	Action_NONE Action_LoadIndicator = 1
+)
+
+// Enum value maps for Action_LoadIndicator.
+var (
+	Action_LoadIndicator_name = map[int32]string{
+		0: "SPINNER",
+		1: "NONE",
+	}
+	Action_LoadIndicator_value = map[string]int32{
+		"SPINNER": 0,
+		"NONE":    1,
+	}
+)
+
+func (x Action_LoadIndicator) Enum() *Action_LoadIndicator {
+	p := new(Action_LoadIndicator)
+	*p = x
+	return p
+}
+
+func (x Action_LoadIndicator) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Action_LoadIndicator) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[16].Descriptor()
+}
+
+func (Action_LoadIndicator) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[16]
+}
+
+func (x Action_LoadIndicator) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Action_LoadIndicator.Descriptor instead.
+func (Action_LoadIndicator) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{21, 0}
+}
+
+// Optional. Required when opening a
+// [dialog](https://developers.google.com/workspace/chat/dialogs).
+//
+// What to do in response to an interaction with a user, such as a user
+// clicking a button in a card message.
+//
+// If unspecified, the app responds by executing an `action`—like opening a
+// link or running a function—as normal.
+//
+// By specifying an `interaction`, the app can respond in special interactive
+// ways. For example, by setting `interaction` to `OPEN_DIALOG`, the app can
+// open a [dialog](https://developers.google.com/workspace/chat/dialogs).
+//
+// When specified, a loading indicator isn't shown. If specified for
+// an add-on, the entire card is stripped and nothing is shown in the client.
+//
+// [Google Chat apps](https://developers.google.com/workspace/chat):
+type Action_Interaction int32
+
+const (
+	// Default value. The `action` executes as normal.
+	Action_INTERACTION_UNSPECIFIED Action_Interaction = 0
+	// Opens a [dialog](https://developers.google.com/workspace/chat/dialogs), a
+	// windowed, card-based interface that Chat apps use to interact with users.
+	//
+	// Only supported by Chat apps in response to button-clicks on card
+	// messages. If specified for
+	// an add-on, the entire card is stripped and nothing is shown in the
+	// client.
+	//
+	// [Google Chat apps](https://developers.google.com/workspace/chat):
+	Action_OPEN_DIALOG Action_Interaction = 1
+)
+
+// Enum value maps for Action_Interaction.
+var (
+	Action_Interaction_name = map[int32]string{
+		0: "INTERACTION_UNSPECIFIED",
+		1: "OPEN_DIALOG",
+	}
+	Action_Interaction_value = map[string]int32{
+		"INTERACTION_UNSPECIFIED": 0,
+		"OPEN_DIALOG":             1,
+	}
+)
+
+func (x Action_Interaction) Enum() *Action_Interaction {
+	p := new(Action_Interaction)
+	*p = x
+	return p
+}
+
+func (x Action_Interaction) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Action_Interaction) Descriptor() protoreflect.EnumDescriptor {
+	return file_google_apps_card_v1_card_proto_enumTypes[17].Descriptor()
+}
+
+func (Action_Interaction) Type() protoreflect.EnumType {
+	return &file_google_apps_card_v1_card_proto_enumTypes[17]
+}
+
+func (x Action_Interaction) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Action_Interaction.Descriptor instead.
+func (Action_Interaction) EnumDescriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{21, 1}
+}
+
+// A card interface displayed in a Google Chat message or Google Workspace
+// Add-on.
+//
+// Cards support a defined layout, interactive UI elements like buttons, and
+// rich media like images. Use cards to present detailed information,
+// gather information from users, and guide users to take a next step.
+//
+// [Card builder](https://addons.gsuite.google.com/uikit/builder)
+//
+// To learn how
+// to build cards, see the following documentation:
+//
+//   - For Google Chat apps, see [Design the components of a card or
+//     dialog](https://developers.google.com/workspace/chat/design-components-card-dialog).
+//   - For Google Workspace Add-ons, see [Card-based
+//
+// interfaces](https://developers.google.com/apps-script/add-ons/concepts/cards).
+//
+// **Example: Card message for a Google Chat app**
+//
+// ![Example contact
+// card](https://developers.google.com/workspace/chat/images/card_api_reference.png)
+//
+// To create the sample card message in Google Chat, use the following JSON:
+//
+// ```
+//
+//	{
+//	  "cardsV2": [
+//	    {
+//	      "cardId": "unique-card-id",
+//	      "card": {
+//	        "header": {
+//	           "title": "Sasha",
+//	           "subtitle": "Software Engineer",
+//	           "imageUrl":
+//	           "https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png",
+//	           "imageType": "CIRCLE",
+//	           "imageAltText": "Avatar for Sasha"
+//	         },
+//	         "sections": [
+//	           {
+//	             "header": "Contact Info",
+//	             "collapsible": true,
+//	             "uncollapsibleWidgetsCount": 1,
+//	             "widgets": [
+//	               {
+//	                 "decoratedText": {
+//	                   "startIcon": {
+//	                     "knownIcon": "EMAIL"
+//	                   },
+//	                   "text": "sasha@example.com"
+//	                 }
+//	               },
+//	               {
+//	                 "decoratedText": {
+//	                   "startIcon": {
+//	                     "knownIcon": "PERSON"
+//	                   },
+//	                   "text": "<font color=\"#80e27e\">Online</font>"
+//	                 }
+//	               },
+//	               {
+//	                 "decoratedText": {
+//	                   "startIcon": {
+//	                     "knownIcon": "PHONE"
+//	                   },
+//	                   "text": "+1 (555) 555-1234"
+//	                 }
+//	               },
+//	               {
+//	                 "buttonList": {
+//	                   "buttons": [
+//	                     {
+//	                       "text": "Share",
+//	                       "onClick": {
+//	                        "openLink": {
+//	                           "url": "https://example.com/share"
+//	                         }
+//	                       }
+//	                     },
+//	                     {
+//	                       "text": "Edit",
+//	                       "onClick": {
+//	                         "action": {
+//	                           "function": "goToView",
+//	                           "parameters": [
+//	                             {
+//	                               "key": "viewType",
+//	                               "value": "EDIT"
+//	                             }
+//	                           ]
+//	                         }
+//	                       }
+//	                     }
+//	                   ]
+//	                 }
+//	               }
+//	             ]
+//	           }
+//	         ]
+//	       }
+//	    }
+//	  ]
+//	}
+//
+// ```
+type Card struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The header of the card. A header usually contains a leading image and a
+	// title. Headers always appear at the top of a card.
+	Header *Card_CardHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
+	// Contains a collection of widgets. Each section has its own, optional
+	// header. Sections are visually separated by a line divider. For an example
+	// in Google Chat apps, see [Define a section of a
+	// card](https://developers.google.com/workspace/chat/design-components-card-dialog#define_a_section_of_a_card).
+	Sections []*Card_Section `protobuf:"bytes,2,rep,name=sections,proto3" json:"sections,omitempty"`
+	// The divider style between sections.
+	SectionDividerStyle Card_DividerStyle `protobuf:"varint,9,opt,name=section_divider_style,json=sectionDividerStyle,proto3,enum=google.apps.card.v1.Card_DividerStyle" json:"section_divider_style,omitempty"`
+	// The card's actions. Actions are added to the card's toolbar menu.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	//
+	// For example, the following JSON constructs a card action menu with
+	// `Settings` and `Send Feedback` options:
+	//
+	// ```
+	// "card_actions": [
+	//
+	//	{
+	//	  "actionLabel": "Settings",
+	//	  "onClick": {
+	//	    "action": {
+	//	      "functionName": "goToView",
+	//	      "parameters": [
+	//	        {
+	//	          "key": "viewType",
+	//	          "value": "SETTING"
+	//	       }
+	//	      ],
+	//	      "loadIndicator": "LoadIndicator.SPINNER"
+	//	    }
+	//	  }
+	//	},
+	//	{
+	//	  "actionLabel": "Send Feedback",
+	//	  "onClick": {
+	//	    "openLink": {
+	//	      "url": "https://example.com/feedback"
+	//	    }
+	//	  }
+	//	}
+	//
+	// ]
+	// ```
+	CardActions []*Card_CardAction `protobuf:"bytes,3,rep,name=card_actions,json=cardActions,proto3" json:"card_actions,omitempty"`
+	// Name of the card. Used as a card identifier in card navigation.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// The fixed footer shown at the bottom of this card.
+	//
+	// Setting `fixedFooter` without specifying a `primaryButton` or a
+	// `secondaryButton` causes an error. For Chat apps, you can use fixed footers
+	// in
+	// [dialogs](https://developers.google.com/workspace/chat/dialogs), but not
+	// [card
+	// messages](https://developers.google.com/workspace/chat/create-messages#create).
+	//
+	// [Google Workspace Add-ons and Chat
+	// apps](https://developers.google.com/workspace/extend):
+	FixedFooter *Card_CardFixedFooter `protobuf:"bytes,5,opt,name=fixed_footer,json=fixedFooter,proto3" json:"fixed_footer,omitempty"`
+	// In Google Workspace Add-ons, sets the display properties of the
+	// `peekCardHeader`.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	DisplayStyle Card_DisplayStyle `protobuf:"varint,6,opt,name=display_style,json=displayStyle,proto3,enum=google.apps.card.v1.Card_DisplayStyle" json:"display_style,omitempty"`
+	// When displaying contextual content, the peek card header acts as a
+	// placeholder so that the user can navigate forward between the homepage
+	// cards and the contextual cards.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	PeekCardHeader *Card_CardHeader `protobuf:"bytes,7,opt,name=peek_card_header,json=peekCardHeader,proto3" json:"peek_card_header,omitempty"`
+}
+
+func (x *Card) Reset() {
+	*x = Card{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Card) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Card) ProtoMessage() {}
+
+func (x *Card) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[0]
+	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 Card.ProtoReflect.Descriptor instead.
+func (*Card) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Card) GetHeader() *Card_CardHeader {
+	if x != nil {
+		return x.Header
+	}
+	return nil
+}
+
+func (x *Card) GetSections() []*Card_Section {
+	if x != nil {
+		return x.Sections
+	}
+	return nil
+}
+
+func (x *Card) GetSectionDividerStyle() Card_DividerStyle {
+	if x != nil {
+		return x.SectionDividerStyle
+	}
+	return Card_DIVIDER_STYLE_UNSPECIFIED
+}
+
+func (x *Card) GetCardActions() []*Card_CardAction {
+	if x != nil {
+		return x.CardActions
+	}
+	return nil
+}
+
+func (x *Card) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Card) GetFixedFooter() *Card_CardFixedFooter {
+	if x != nil {
+		return x.FixedFooter
+	}
+	return nil
+}
+
+func (x *Card) GetDisplayStyle() Card_DisplayStyle {
+	if x != nil {
+		return x.DisplayStyle
+	}
+	return Card_DISPLAY_STYLE_UNSPECIFIED
+}
+
+func (x *Card) GetPeekCardHeader() *Card_CardHeader {
+	if x != nil {
+		return x.PeekCardHeader
+	}
+	return nil
+}
+
+// Each card is made up of widgets.
+//
+// A widget is a composite object that can represent one of text, images,
+// buttons, and other object types.
+type Widget struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A widget can only have one of the following items. You can use multiple
+	// widget fields to display more items.
+	//
+	// Types that are assignable to Data:
+	//
+	//	*Widget_TextParagraph
+	//	*Widget_Image
+	//	*Widget_DecoratedText
+	//	*Widget_ButtonList
+	//	*Widget_TextInput
+	//	*Widget_SelectionInput
+	//	*Widget_DateTimePicker
+	//	*Widget_Divider
+	//	*Widget_Grid
+	//	*Widget_Columns
+	Data isWidget_Data `protobuf_oneof:"data"`
+	// Specifies whether widgets align to the left, right, or center of a column.
+	HorizontalAlignment Widget_HorizontalAlignment `protobuf:"varint,8,opt,name=horizontal_alignment,json=horizontalAlignment,proto3,enum=google.apps.card.v1.Widget_HorizontalAlignment" json:"horizontal_alignment,omitempty"`
+}
+
+func (x *Widget) Reset() {
+	*x = Widget{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Widget) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Widget) ProtoMessage() {}
+
+func (x *Widget) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[1]
+	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 Widget.ProtoReflect.Descriptor instead.
+func (*Widget) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *Widget) GetData() isWidget_Data {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+func (x *Widget) GetTextParagraph() *TextParagraph {
+	if x, ok := x.GetData().(*Widget_TextParagraph); ok {
+		return x.TextParagraph
+	}
+	return nil
+}
+
+func (x *Widget) GetImage() *Image {
+	if x, ok := x.GetData().(*Widget_Image); ok {
+		return x.Image
+	}
+	return nil
+}
+
+func (x *Widget) GetDecoratedText() *DecoratedText {
+	if x, ok := x.GetData().(*Widget_DecoratedText); ok {
+		return x.DecoratedText
+	}
+	return nil
+}
+
+func (x *Widget) GetButtonList() *ButtonList {
+	if x, ok := x.GetData().(*Widget_ButtonList); ok {
+		return x.ButtonList
+	}
+	return nil
+}
+
+func (x *Widget) GetTextInput() *TextInput {
+	if x, ok := x.GetData().(*Widget_TextInput); ok {
+		return x.TextInput
+	}
+	return nil
+}
+
+func (x *Widget) GetSelectionInput() *SelectionInput {
+	if x, ok := x.GetData().(*Widget_SelectionInput); ok {
+		return x.SelectionInput
+	}
+	return nil
+}
+
+func (x *Widget) GetDateTimePicker() *DateTimePicker {
+	if x, ok := x.GetData().(*Widget_DateTimePicker); ok {
+		return x.DateTimePicker
+	}
+	return nil
+}
+
+func (x *Widget) GetDivider() *Divider {
+	if x, ok := x.GetData().(*Widget_Divider); ok {
+		return x.Divider
+	}
+	return nil
+}
+
+func (x *Widget) GetGrid() *Grid {
+	if x, ok := x.GetData().(*Widget_Grid); ok {
+		return x.Grid
+	}
+	return nil
+}
+
+func (x *Widget) GetColumns() *Columns {
+	if x, ok := x.GetData().(*Widget_Columns); ok {
+		return x.Columns
+	}
+	return nil
+}
+
+func (x *Widget) GetHorizontalAlignment() Widget_HorizontalAlignment {
+	if x != nil {
+		return x.HorizontalAlignment
+	}
+	return Widget_HORIZONTAL_ALIGNMENT_UNSPECIFIED
+}
+
+type isWidget_Data interface {
+	isWidget_Data()
+}
+
+type Widget_TextParagraph struct {
+	// Displays a text paragraph. Supports simple HTML formatted text. For more
+	// information about formatting text, see
+	// [Formatting text in Google Chat
+	// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
+	// and
+	// [Formatting
+	// text in Google Workspace
+	// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
+	//
+	// For example, the following JSON creates a bolded text:
+	// ```
+	//
+	//	"textParagraph": {
+	//	  "text": "  <b>bold text</b>"
+	//	}
+	//
+	// ```
+	TextParagraph *TextParagraph `protobuf:"bytes,1,opt,name=text_paragraph,json=textParagraph,proto3,oneof"`
+}
+
+type Widget_Image struct {
+	// Displays an image.
+	//
+	// For example, the following JSON creates an image with alternative text:
+	// ```
+	//
+	//	"image": {
+	//	  "imageUrl":
+	//	  "https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png",
+	//	  "altText": "Chat app avatar"
+	//	}
+	//
+	// ```
+	Image *Image `protobuf:"bytes,2,opt,name=image,proto3,oneof"`
+}
+
+type Widget_DecoratedText struct {
+	// Displays a decorated text item.
+	//
+	// For example, the following JSON creates a decorated text widget showing
+	// email address:
+	//
+	// ```
+	//
+	//	"decoratedText": {
+	//	  "icon": {
+	//	    "knownIcon": "EMAIL"
+	//	  },
+	//	  "topLabel": "Email Address",
+	//	  "text": "sasha@example.com",
+	//	  "bottomLabel": "This is a new Email address!",
+	//	  "switchControl": {
+	//	    "name": "has_send_welcome_email_to_sasha",
+	//	    "selected": false,
+	//	    "controlType": "CHECKBOX"
+	//	  }
+	//	}
+	//
+	// ```
+	DecoratedText *DecoratedText `protobuf:"bytes,3,opt,name=decorated_text,json=decoratedText,proto3,oneof"`
+}
+
+type Widget_ButtonList struct {
+	// A list of buttons.
+	//
+	// For example, the following JSON creates two buttons. The first
+	// is a blue text button and the second is an image button that opens a
+	// link:
+	// ```
+	//
+	//	"buttonList": {
+	//	  "buttons": [
+	//	    {
+	//	      "text": "Edit",
+	//	      "color": {
+	//	        "red": 0,
+	//	        "green": 0,
+	//	        "blue": 1,
+	//	        "alpha": 1
+	//	      },
+	//	      "disabled": true,
+	//	    },
+	//	    {
+	//	      "icon": {
+	//	        "knownIcon": "INVITE",
+	//	        "altText": "check calendar"
+	//	      },
+	//	      "onClick": {
+	//	        "openLink": {
+	//	          "url": "https://example.com/calendar"
+	//	        }
+	//	      }
+	//	    }
+	//	  ]
+	//	}
+	//
+	// ```
+	ButtonList *ButtonList `protobuf:"bytes,4,opt,name=button_list,json=buttonList,proto3,oneof"`
+}
+
+type Widget_TextInput struct {
+	// Displays a text box that users can type into.
+	//
+	// For example, the following JSON creates a text input for an email
+	// address:
+	//
+	// ```
+	//
+	//	"textInput": {
+	//	  "name": "mailing_address",
+	//	  "label": "Mailing Address"
+	//	}
+	//
+	// ```
+	//
+	// As another example, the following JSON creates a text input for a
+	// programming language with static suggestions:
+	// ```
+	//
+	//	"textInput": {
+	//	  "name": "preferred_programing_language",
+	//	  "label": "Preferred Language",
+	//	  "initialSuggestions": {
+	//	    "items": [
+	//	      {
+	//	        "text": "C++"
+	//	      },
+	//	      {
+	//	        "text": "Java"
+	//	      },
+	//	      {
+	//	        "text": "JavaScript"
+	//	      },
+	//	      {
+	//	        "text": "Python"
+	//	      }
+	//	    ]
+	//	  }
+	//	}
+	//
+	// ```
+	TextInput *TextInput `protobuf:"bytes,5,opt,name=text_input,json=textInput,proto3,oneof"`
+}
+
+type Widget_SelectionInput struct {
+	// Displays a selection control that lets users select items. Selection
+	// controls can be checkboxes, radio buttons, switches, or dropdown menus.
+	//
+	// For example, the following JSON creates a dropdown menu that lets users
+	// choose a size:
+	//
+	// ```
+	//
+	//	"selectionInput": {
+	//	  "name": "size",
+	//	  "label": "Size"
+	//	  "type": "DROPDOWN",
+	//	  "items": [
+	//	    {
+	//	      "text": "S",
+	//	      "value": "small",
+	//	      "selected": false
+	//	    },
+	//	    {
+	//	      "text": "M",
+	//	      "value": "medium",
+	//	      "selected": true
+	//	    },
+	//	    {
+	//	      "text": "L",
+	//	      "value": "large",
+	//	      "selected": false
+	//	    },
+	//	    {
+	//	      "text": "XL",
+	//	      "value": "extra_large",
+	//	      "selected": false
+	//	    }
+	//	  ]
+	//	}
+	//
+	// ```
+	SelectionInput *SelectionInput `protobuf:"bytes,6,opt,name=selection_input,json=selectionInput,proto3,oneof"`
+}
+
+type Widget_DateTimePicker struct {
+	// Displays a widget that lets users input a date, time, or date and time.
+	//
+	// For example, the following JSON creates a date time picker to schedule an
+	// appointment:
+	//
+	// ```
+	//
+	//	"dateTimePicker": {
+	//	  "name": "appointment_time",
+	//	  "label": "Book your appointment at:",
+	//	  "type": "DATE_AND_TIME",
+	//	  "valueMsEpoch": "796435200000"
+	//	}
+	//
+	// ```
+	DateTimePicker *DateTimePicker `protobuf:"bytes,7,opt,name=date_time_picker,json=dateTimePicker,proto3,oneof"`
+}
+
+type Widget_Divider struct {
+	// Displays a horizontal line divider between widgets.
+	//
+	// For example, the following JSON creates a divider:
+	// ```
+	// "divider": {
+	// }
+	// ```
+	Divider *Divider `protobuf:"bytes,9,opt,name=divider,proto3,oneof"`
+}
+
+type Widget_Grid struct {
+	// Displays a grid with a collection of items.
+	//
+	// A grid supports any number of columns and items. The number of rows is
+	// determined by the upper bounds of the number items divided by the number
+	// of columns. A grid with 10 items and 2 columns has 5 rows. A grid with 11
+	// items and 2 columns has 6 rows.
+	//
+	// [Google Workspace Add-ons and
+	// Chat apps](https://developers.google.com/workspace/extend):
+	//
+	// For example, the following JSON creates a 2 column grid with a single
+	// item:
+	//
+	// ```
+	//
+	//	"grid": {
+	//	  "title": "A fine collection of items",
+	//	  "columnCount": 2,
+	//	  "borderStyle": {
+	//	    "type": "STROKE",
+	//	    "cornerRadius": 4
+	//	  },
+	//	  "items": [
+	//	    {
+	//	      "image": {
+	//	        "imageUri": "https://www.example.com/image.png",
+	//	        "cropStyle": {
+	//	          "type": "SQUARE"
+	//	        },
+	//	        "borderStyle": {
+	//	          "type": "STROKE"
+	//	        }
+	//	      },
+	//	      "title": "An item",
+	//	      "textAlignment": "CENTER"
+	//	    }
+	//	  ],
+	//	  "onClick": {
+	//	    "openLink": {
+	//	      "url": "https://www.example.com"
+	//	    }
+	//	  }
+	//	}
+	//
+	// ```
+	Grid *Grid `protobuf:"bytes,10,opt,name=grid,proto3,oneof"`
+}
+
+type Widget_Columns struct {
+	// Displays up to 2 columns.
+	//
+	// To include more than 2 columns, or to use rows, use the `Grid` widget.
+	//
+	// For example, the following JSON creates 2 columns that each contain
+	// text paragraphs:
+	//
+	// ```
+	//
+	//	"columns": {
+	//	  "columnItems": [
+	//	    {
+	//	      "horizontalSizeStyle": "FILL_AVAILABLE_SPACE",
+	//	      "horizontalAlignment": "CENTER",
+	//	      "verticalAlignment": "CENTER",
+	//	      "widgets": [
+	//	        {
+	//	          "textParagraph": {
+	//	            "text": "First column text paragraph"
+	//	          }
+	//	        }
+	//	      ]
+	//	    },
+	//	    {
+	//	      "horizontalSizeStyle": "FILL_AVAILABLE_SPACE",
+	//	      "horizontalAlignment": "CENTER",
+	//	      "verticalAlignment": "CENTER",
+	//	      "widgets": [
+	//	        {
+	//	          "textParagraph": {
+	//	            "text": "Second column text paragraph"
+	//	          }
+	//	        }
+	//	      ]
+	//	    }
+	//	  ]
+	//	}
+	//
+	// ```
+	Columns *Columns `protobuf:"bytes,11,opt,name=columns,proto3,oneof"`
+}
+
+func (*Widget_TextParagraph) isWidget_Data() {}
+
+func (*Widget_Image) isWidget_Data() {}
+
+func (*Widget_DecoratedText) isWidget_Data() {}
+
+func (*Widget_ButtonList) isWidget_Data() {}
+
+func (*Widget_TextInput) isWidget_Data() {}
+
+func (*Widget_SelectionInput) isWidget_Data() {}
+
+func (*Widget_DateTimePicker) isWidget_Data() {}
+
+func (*Widget_Divider) isWidget_Data() {}
+
+func (*Widget_Grid) isWidget_Data() {}
+
+func (*Widget_Columns) isWidget_Data() {}
+
+// A paragraph of text that supports formatting. For an example in
+// Google Chat apps, see [Add a paragraph of formatted
+// text](https://developers.google.com/workspace/chat/add-text-image-card-dialog#add_a_paragraph_of_formatted_text).
+// For more information
+// about formatting text, see
+// [Formatting text in Google Chat
+// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
+// and
+// [Formatting
+// text in Google Workspace
+// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
+//
+// [Google Workspace Add-ons and
+// Chat apps](https://developers.google.com/workspace/extend):
+type TextParagraph struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The text that's shown in the widget.
+	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+}
+
+func (x *TextParagraph) Reset() {
+	*x = TextParagraph{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TextParagraph) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TextParagraph) ProtoMessage() {}
+
+func (x *TextParagraph) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[2]
+	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 TextParagraph.ProtoReflect.Descriptor instead.
+func (*TextParagraph) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *TextParagraph) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+// An image that is specified by a URL and can have an `onClick` action. For an
+// example, see [Add an
+// image](https://developers.google.com/workspace/chat/add-text-image-card-dialog#add_an_image).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Image struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The HTTPS URL that hosts the image.
+	//
+	// For example:
+	//
+	// ```
+	// https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png
+	// ```
+	ImageUrl string `protobuf:"bytes,1,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
+	// When a user clicks the image, the click triggers this action.
+	OnClick *OnClick `protobuf:"bytes,2,opt,name=on_click,json=onClick,proto3" json:"on_click,omitempty"`
+	// The alternative text of this image that's used for accessibility.
+	AltText string `protobuf:"bytes,3,opt,name=alt_text,json=altText,proto3" json:"alt_text,omitempty"`
+}
+
+func (x *Image) Reset() {
+	*x = Image{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Image) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Image) ProtoMessage() {}
+
+func (x *Image) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[3]
+	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 Image.ProtoReflect.Descriptor instead.
+func (*Image) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Image) GetImageUrl() string {
+	if x != nil {
+		return x.ImageUrl
+	}
+	return ""
+}
+
+func (x *Image) GetOnClick() *OnClick {
+	if x != nil {
+		return x.OnClick
+	}
+	return nil
+}
+
+func (x *Image) GetAltText() string {
+	if x != nil {
+		return x.AltText
+	}
+	return ""
+}
+
+// Displays a divider between widgets as a horizontal line. For an example in
+// Google Chat apps, see
+// [Add a horizontal divider between
+// widgets](https://developers.google.com/workspace/chat/format-structure-card-dialog#add_a_horizontal_divider_between_widgets).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+//
+// For example, the following JSON creates a divider:
+//
+// ```
+// "divider": {}
+// ```
+type Divider struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Divider) Reset() {
+	*x = Divider{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Divider) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Divider) ProtoMessage() {}
+
+func (x *Divider) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[4]
+	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 Divider.ProtoReflect.Descriptor instead.
+func (*Divider) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{4}
+}
+
+// A widget that displays text with optional decorations such as a label above
+// or below the text, an icon in front of the text, a selection widget, or a
+// button after the text. For an example in
+// Google Chat apps, see [Display text with decorative
+// text](https://developers.google.com/workspace/chat/add-text-image-card-dialog#display_text_with_decorative_elements).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type DecoratedText struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Deprecated in favor of `startIcon`.
+	//
+	// Deprecated: Do not use.
+	Icon *Icon `protobuf:"bytes,1,opt,name=icon,proto3" json:"icon,omitempty"`
+	// The icon displayed in front of the text.
+	StartIcon *Icon `protobuf:"bytes,12,opt,name=start_icon,json=startIcon,proto3" json:"start_icon,omitempty"`
+	// The text that appears above `text`. Always truncates.
+	TopLabel string `protobuf:"bytes,3,opt,name=top_label,json=topLabel,proto3" json:"top_label,omitempty"`
+	// Required. The primary text.
+	//
+	// Supports simple formatting. For more information
+	// about formatting text, see
+	// [Formatting text in Google Chat
+	// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
+	// and
+	// [Formatting
+	// text in Google Workspace
+	// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
+	Text string `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"`
+	// The wrap text setting. If `true`, the text wraps and displays on
+	// multiple lines. Otherwise, the text is truncated.
+	//
+	// Only applies to `text`, not `topLabel` and `bottomLabel`.
+	WrapText bool `protobuf:"varint,5,opt,name=wrap_text,json=wrapText,proto3" json:"wrap_text,omitempty"`
+	// The text that appears below `text`. Always wraps.
+	BottomLabel string `protobuf:"bytes,6,opt,name=bottom_label,json=bottomLabel,proto3" json:"bottom_label,omitempty"`
+	// This action is triggered when users click `topLabel` or `bottomLabel`.
+	OnClick *OnClick `protobuf:"bytes,7,opt,name=on_click,json=onClick,proto3" json:"on_click,omitempty"`
+	// A button, switch, checkbox, or image that appears to the right-hand side
+	// of text in the `decoratedText` widget.
+	//
+	// Types that are assignable to Control:
+	//
+	//	*DecoratedText_Button
+	//	*DecoratedText_SwitchControl_
+	//	*DecoratedText_EndIcon
+	Control isDecoratedText_Control `protobuf_oneof:"control"`
+}
+
+func (x *DecoratedText) Reset() {
+	*x = DecoratedText{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DecoratedText) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DecoratedText) ProtoMessage() {}
+
+func (x *DecoratedText) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[5]
+	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 DecoratedText.ProtoReflect.Descriptor instead.
+func (*DecoratedText) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{5}
+}
+
+// Deprecated: Do not use.
+func (x *DecoratedText) GetIcon() *Icon {
+	if x != nil {
+		return x.Icon
+	}
+	return nil
+}
+
+func (x *DecoratedText) GetStartIcon() *Icon {
+	if x != nil {
+		return x.StartIcon
+	}
+	return nil
+}
+
+func (x *DecoratedText) GetTopLabel() string {
+	if x != nil {
+		return x.TopLabel
+	}
+	return ""
+}
+
+func (x *DecoratedText) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+func (x *DecoratedText) GetWrapText() bool {
+	if x != nil {
+		return x.WrapText
+	}
+	return false
+}
+
+func (x *DecoratedText) GetBottomLabel() string {
+	if x != nil {
+		return x.BottomLabel
+	}
+	return ""
+}
+
+func (x *DecoratedText) GetOnClick() *OnClick {
+	if x != nil {
+		return x.OnClick
+	}
+	return nil
+}
+
+func (m *DecoratedText) GetControl() isDecoratedText_Control {
+	if m != nil {
+		return m.Control
+	}
+	return nil
+}
+
+func (x *DecoratedText) GetButton() *Button {
+	if x, ok := x.GetControl().(*DecoratedText_Button); ok {
+		return x.Button
+	}
+	return nil
+}
+
+func (x *DecoratedText) GetSwitchControl() *DecoratedText_SwitchControl {
+	if x, ok := x.GetControl().(*DecoratedText_SwitchControl_); ok {
+		return x.SwitchControl
+	}
+	return nil
+}
+
+func (x *DecoratedText) GetEndIcon() *Icon {
+	if x, ok := x.GetControl().(*DecoratedText_EndIcon); ok {
+		return x.EndIcon
+	}
+	return nil
+}
+
+type isDecoratedText_Control interface {
+	isDecoratedText_Control()
+}
+
+type DecoratedText_Button struct {
+	// A button that a user can click to trigger an action.
+	Button *Button `protobuf:"bytes,8,opt,name=button,proto3,oneof"`
+}
+
+type DecoratedText_SwitchControl_ struct {
+	// A switch widget that a user can click to change its state and trigger an
+	// action.
+	SwitchControl *DecoratedText_SwitchControl `protobuf:"bytes,9,opt,name=switch_control,json=switchControl,proto3,oneof"`
+}
+
+type DecoratedText_EndIcon struct {
+	// An icon displayed after the text.
+	//
+	// Supports
+	// [built-in](https://developers.google.com/workspace/chat/format-messages#builtinicons)
+	// and
+	// [custom](https://developers.google.com/workspace/chat/format-messages#customicons)
+	// icons.
+	EndIcon *Icon `protobuf:"bytes,11,opt,name=end_icon,json=endIcon,proto3,oneof"`
+}
+
+func (*DecoratedText_Button) isDecoratedText_Control() {}
+
+func (*DecoratedText_SwitchControl_) isDecoratedText_Control() {}
+
+func (*DecoratedText_EndIcon) isDecoratedText_Control() {}
+
+// A field in which users can enter text. Supports suggestions and on-change
+// actions. For an example in Google Chat apps, see [Add a field in which a user
+// can enter
+// text](https://developers.google.com/workspace/chat/design-interactive-card-dialog#add_a_field_in_which_a_user_can_enter_text).
+//
+// Chat apps receive and can process the value of entered text during form input
+// events. For details about working with form inputs, see [Receive form
+// data](https://developers.google.com/workspace/chat/read-form-data).
+//
+// When you need to collect undefined or abstract data from users,
+// use a text input. To collect defined or enumerated data from users, use the
+// [SelectionInput][google.apps.card.v1.SelectionInput] widget.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type TextInput struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name by which the text input is identified in a form input event.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The text that appears above the text input field in the user interface.
+	//
+	// Specify text that helps the user enter the information your app needs.
+	// For example, if you are asking someone's name, but specifically need their
+	// surname, write `surname` instead of `name`.
+	//
+	// Required if `hintText` is unspecified. Otherwise, optional.
+	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+	// Text that appears below the text input field meant to assist users by
+	// prompting them to enter a certain value. This text is always visible.
+	//
+	// Required if `label` is unspecified. Otherwise, optional.
+	HintText string `protobuf:"bytes,3,opt,name=hint_text,json=hintText,proto3" json:"hint_text,omitempty"`
+	// The value entered by a user, returned as part of a form input event.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Value string `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
+	// How a text input field appears in the user interface.
+	// For example, whether the field is single or multi-line.
+	Type TextInput_Type `protobuf:"varint,5,opt,name=type,proto3,enum=google.apps.card.v1.TextInput_Type" json:"type,omitempty"`
+	// What to do when a change occurs in the text input field. For example, a
+	// user adding to the field or deleting text.
+	//
+	// Examples of actions to take include running a custom function or opening
+	// a [dialog](https://developers.google.com/workspace/chat/dialogs)
+	// in Google Chat.
+	OnChangeAction *Action `protobuf:"bytes,6,opt,name=on_change_action,json=onChangeAction,proto3" json:"on_change_action,omitempty"`
+	// Suggested values that users can enter. These values appear when users click
+	// inside the text input field. As users type, the suggested values
+	// dynamically filter to match what the users have typed.
+	//
+	// For example, a text input field for programming language might suggest
+	// Java, JavaScript, Python, and C++. When users start typing `Jav`, the list
+	// of suggestions filters to show just `Java` and `JavaScript`.
+	//
+	// Suggested values help guide users to enter values that your app can make
+	// sense of. When referring to JavaScript, some users might enter `javascript`
+	// and others `java script`. Suggesting `JavaScript` can standardize how users
+	// interact with your app.
+	//
+	// When specified, `TextInput.type` is always `SINGLE_LINE`, even if it's set
+	// to `MULTIPLE_LINE`.
+	//
+	// [Google Workspace
+	// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
+	InitialSuggestions *Suggestions `protobuf:"bytes,7,opt,name=initial_suggestions,json=initialSuggestions,proto3" json:"initial_suggestions,omitempty"`
+	// Optional. Specify what action to take when the text input field provides
+	// suggestions to users who interact with it.
+	//
+	// If unspecified, the suggestions are set by `initialSuggestions` and
+	// are processed by the client.
+	//
+	// If specified, the app takes the action specified here, such as running
+	// a custom function.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	AutoCompleteAction *Action `protobuf:"bytes,8,opt,name=auto_complete_action,json=autoCompleteAction,proto3" json:"auto_complete_action,omitempty"`
+	// Text that appears in the text input field when the field is empty.
+	// Use this text to prompt users to enter a value. For example, `Enter a
+	// number from 0 to 100`.
+	//
+	// [Google Chat apps](https://developers.google.com/workspace/chat):
+	PlaceholderText string `protobuf:"bytes,12,opt,name=placeholder_text,json=placeholderText,proto3" json:"placeholder_text,omitempty"`
+}
+
+func (x *TextInput) Reset() {
+	*x = TextInput{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TextInput) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TextInput) ProtoMessage() {}
+
+func (x *TextInput) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[6]
+	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 TextInput.ProtoReflect.Descriptor instead.
+func (*TextInput) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *TextInput) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *TextInput) GetLabel() string {
+	if x != nil {
+		return x.Label
+	}
+	return ""
+}
+
+func (x *TextInput) GetHintText() string {
+	if x != nil {
+		return x.HintText
+	}
+	return ""
+}
+
+func (x *TextInput) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+func (x *TextInput) GetType() TextInput_Type {
+	if x != nil {
+		return x.Type
+	}
+	return TextInput_SINGLE_LINE
+}
+
+func (x *TextInput) GetOnChangeAction() *Action {
+	if x != nil {
+		return x.OnChangeAction
+	}
+	return nil
+}
+
+func (x *TextInput) GetInitialSuggestions() *Suggestions {
+	if x != nil {
+		return x.InitialSuggestions
+	}
+	return nil
+}
+
+func (x *TextInput) GetAutoCompleteAction() *Action {
+	if x != nil {
+		return x.AutoCompleteAction
+	}
+	return nil
+}
+
+func (x *TextInput) GetPlaceholderText() string {
+	if x != nil {
+		return x.PlaceholderText
+	}
+	return ""
+}
+
+// Suggested values that users can enter. These values appear when users click
+// inside the text input field. As users type, the suggested values
+// dynamically filter to match what the users have typed.
+//
+// For example, a text input field for programming language might suggest
+// Java, JavaScript, Python, and C++. When users start typing `Jav`, the list
+// of suggestions filters to show `Java` and `JavaScript`.
+//
+// Suggested values help guide users to enter values that your app can make
+// sense of. When referring to JavaScript, some users might enter `javascript`
+// and others `java script`. Suggesting `JavaScript` can standardize how users
+// interact with your app.
+//
+// When specified, `TextInput.type` is always `SINGLE_LINE`, even if it's set
+// to `MULTIPLE_LINE`.
+//
+// [Google Workspace
+// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
+type Suggestions struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A list of suggestions used for autocomplete recommendations in text input
+	// fields.
+	Items []*Suggestions_SuggestionItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
+}
+
+func (x *Suggestions) Reset() {
+	*x = Suggestions{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Suggestions) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Suggestions) ProtoMessage() {}
+
+func (x *Suggestions) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[7]
+	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 Suggestions.ProtoReflect.Descriptor instead.
+func (*Suggestions) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *Suggestions) GetItems() []*Suggestions_SuggestionItem {
+	if x != nil {
+		return x.Items
+	}
+	return nil
+}
+
+// A list of buttons layed out horizontally. For an example in
+// Google Chat apps, see
+// [Add a
+// button](https://developers.google.com/workspace/chat/design-interactive-card-dialog#add_a_button).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type ButtonList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// An array of buttons.
+	Buttons []*Button `protobuf:"bytes,1,rep,name=buttons,proto3" json:"buttons,omitempty"`
+}
+
+func (x *ButtonList) Reset() {
+	*x = ButtonList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ButtonList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ButtonList) ProtoMessage() {}
+
+func (x *ButtonList) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[8]
+	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 ButtonList.ProtoReflect.Descriptor instead.
+func (*ButtonList) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ButtonList) GetButtons() []*Button {
+	if x != nil {
+		return x.Buttons
+	}
+	return nil
+}
+
+// A widget that creates one or more UI items that users can select.
+// For example, a dropdown menu or checkboxes. You can use this widget to
+// collect data that can be predicted or enumerated. For an example in Google
+// Chat apps, see [Add selectable UI
+// elements](/workspace/chat/design-interactive-card-dialog#add_selectable_ui_elements).
+//
+// Chat apps can process the value of items that users select or input. For
+// details about working with form inputs, see [Receive form
+// data](https://developers.google.com/workspace/chat/read-form-data).
+//
+// To collect undefined or abstract data from users, use
+// the [TextInput][google.apps.card.v1.TextInput] widget.
+//
+// [Google Workspace Add-ons
+// and Chat apps](https://developers.google.com/workspace/extend):
+type SelectionInput struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name that identifies the selection input in a form input event.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The text that appears above the selection input field in the user
+	// interface.
+	//
+	// Specify text that helps the user enter the information your app needs.
+	// For example, if users are selecting the urgency of a work ticket from a
+	// drop-down menu, the label might be "Urgency" or "Select urgency".
+	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+	// The type of items that are displayed to users in a `SelectionInput` widget.
+	// Selection types support different types of interactions. For example, users
+	// can select one or more checkboxes, but they can only select one value from
+	// a dropdown menu.
+	Type SelectionInput_SelectionType `protobuf:"varint,3,opt,name=type,proto3,enum=google.apps.card.v1.SelectionInput_SelectionType" json:"type,omitempty"`
+	// An array of selectable items. For example, an array of radio buttons or
+	// checkboxes. Supports up to 100 items.
+	Items []*SelectionInput_SelectionItem `protobuf:"bytes,4,rep,name=items,proto3" json:"items,omitempty"`
+	// If specified, the form is submitted when the selection changes. If not
+	// specified, you must specify a separate button that submits the form.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	OnChangeAction *Action `protobuf:"bytes,5,opt,name=on_change_action,json=onChangeAction,proto3" json:"on_change_action,omitempty"`
+	// For multiselect menus, the maximum number of items that a user can select.
+	// Minimum value is 1 item. If unspecified, defaults to 3 items.
+	MultiSelectMaxSelectedItems int32 `protobuf:"varint,6,opt,name=multi_select_max_selected_items,json=multiSelectMaxSelectedItems,proto3" json:"multi_select_max_selected_items,omitempty"`
+	// For multiselect menus, the number of text characters that a user inputs
+	// before the app queries autocomplete and displays suggested items
+	// in the menu.
+	//
+	// If unspecified, defaults to 0 characters for static data sources and 3
+	// characters for external data sources.
+	MultiSelectMinQueryLength int32 `protobuf:"varint,7,opt,name=multi_select_min_query_length,json=multiSelectMinQueryLength,proto3" json:"multi_select_min_query_length,omitempty"`
+	// For a multiselect menu, the data source that populates
+	// selection items.
+	//
+	// [Google Chat apps](https://developers.google.com/workspace/chat):
+	//
+	// Types that are assignable to MultiSelectDataSource:
+	//
+	//	*SelectionInput_ExternalDataSource
+	//	*SelectionInput_PlatformDataSource_
+	MultiSelectDataSource isSelectionInput_MultiSelectDataSource `protobuf_oneof:"multi_select_data_source"`
+}
+
+func (x *SelectionInput) Reset() {
+	*x = SelectionInput{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SelectionInput) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SelectionInput) ProtoMessage() {}
+
+func (x *SelectionInput) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[9]
+	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 SelectionInput.ProtoReflect.Descriptor instead.
+func (*SelectionInput) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *SelectionInput) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *SelectionInput) GetLabel() string {
+	if x != nil {
+		return x.Label
+	}
+	return ""
+}
+
+func (x *SelectionInput) GetType() SelectionInput_SelectionType {
+	if x != nil {
+		return x.Type
+	}
+	return SelectionInput_CHECK_BOX
+}
+
+func (x *SelectionInput) GetItems() []*SelectionInput_SelectionItem {
+	if x != nil {
+		return x.Items
+	}
+	return nil
+}
+
+func (x *SelectionInput) GetOnChangeAction() *Action {
+	if x != nil {
+		return x.OnChangeAction
+	}
+	return nil
+}
+
+func (x *SelectionInput) GetMultiSelectMaxSelectedItems() int32 {
+	if x != nil {
+		return x.MultiSelectMaxSelectedItems
+	}
+	return 0
+}
+
+func (x *SelectionInput) GetMultiSelectMinQueryLength() int32 {
+	if x != nil {
+		return x.MultiSelectMinQueryLength
+	}
+	return 0
+}
+
+func (m *SelectionInput) GetMultiSelectDataSource() isSelectionInput_MultiSelectDataSource {
+	if m != nil {
+		return m.MultiSelectDataSource
+	}
+	return nil
+}
+
+func (x *SelectionInput) GetExternalDataSource() *Action {
+	if x, ok := x.GetMultiSelectDataSource().(*SelectionInput_ExternalDataSource); ok {
+		return x.ExternalDataSource
+	}
+	return nil
+}
+
+func (x *SelectionInput) GetPlatformDataSource() *SelectionInput_PlatformDataSource {
+	if x, ok := x.GetMultiSelectDataSource().(*SelectionInput_PlatformDataSource_); ok {
+		return x.PlatformDataSource
+	}
+	return nil
+}
+
+type isSelectionInput_MultiSelectDataSource interface {
+	isSelectionInput_MultiSelectDataSource()
+}
+
+type SelectionInput_ExternalDataSource struct {
+	// An external data source, such as a relational data base.
+	ExternalDataSource *Action `protobuf:"bytes,8,opt,name=external_data_source,json=externalDataSource,proto3,oneof"`
+}
+
+type SelectionInput_PlatformDataSource_ struct {
+	// A data source from Google Workspace.
+	PlatformDataSource *SelectionInput_PlatformDataSource `protobuf:"bytes,9,opt,name=platform_data_source,json=platformDataSource,proto3,oneof"`
+}
+
+func (*SelectionInput_ExternalDataSource) isSelectionInput_MultiSelectDataSource() {}
+
+func (*SelectionInput_PlatformDataSource_) isSelectionInput_MultiSelectDataSource() {}
+
+// Lets users input a date, a time, or both a date and a time. For an example in
+// Google Chat apps, see [Let a user pick a date and
+// time](https://developers.google.com/workspace/chat/design-interactive-card-dialog#let_a_user_pick_a_date_and_time).
+//
+// Users can input text or use the picker to select dates and times. If users
+// input an invalid date or time, the picker shows an error that prompts users
+// to input the information correctly.
+//
+// [Google Workspace
+// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
+type DateTimePicker struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name by which the `DateTimePicker` is identified in a form input event.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The text that prompts users to input a date, a time, or a date and time.
+	// For example, if users are scheduling an appointment, use a label such as
+	// `Appointment date` or `Appointment date and time`.
+	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+	// Whether the widget supports inputting a date, a time, or the date and time.
+	Type DateTimePicker_DateTimePickerType `protobuf:"varint,3,opt,name=type,proto3,enum=google.apps.card.v1.DateTimePicker_DateTimePickerType" json:"type,omitempty"`
+	// The default value displayed in the widget, in milliseconds since [Unix
+	// epoch time](https://en.wikipedia.org/wiki/Unix_time).
+	//
+	// Specify the value based on the type of picker (`DateTimePickerType`):
+	//
+	//   - `DATE_AND_TIME`: a calendar date and time in UTC. For example, to
+	//     represent January 1, 2023 at 12:00 PM UTC, use `1672574400000`.
+	//   - `DATE_ONLY`: a calendar date at 00:00:00 UTC. For example, to represent
+	//     January 1, 2023, use `1672531200000`.
+	//   - `TIME_ONLY`: a time in UTC. For example, to represent 12:00 PM, use
+	//     `43200000` (or `12 * 60 * 60 * 1000`).
+	ValueMsEpoch int64 `protobuf:"varint,4,opt,name=value_ms_epoch,json=valueMsEpoch,proto3" json:"value_ms_epoch,omitempty"`
+	// The number representing the time zone offset from UTC, in minutes.
+	// If set, the `value_ms_epoch` is displayed in the specified time zone.
+	// If unset, the value defaults to the user's time zone setting.
+	TimezoneOffsetDate int32 `protobuf:"varint,5,opt,name=timezone_offset_date,json=timezoneOffsetDate,proto3" json:"timezone_offset_date,omitempty"`
+	// Triggered when the user clicks **Save** or **Clear** from the
+	// `DateTimePicker` interface.
+	OnChangeAction *Action `protobuf:"bytes,6,opt,name=on_change_action,json=onChangeAction,proto3" json:"on_change_action,omitempty"`
+}
+
+func (x *DateTimePicker) Reset() {
+	*x = DateTimePicker{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DateTimePicker) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DateTimePicker) ProtoMessage() {}
+
+func (x *DateTimePicker) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[10]
+	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 DateTimePicker.ProtoReflect.Descriptor instead.
+func (*DateTimePicker) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *DateTimePicker) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DateTimePicker) GetLabel() string {
+	if x != nil {
+		return x.Label
+	}
+	return ""
+}
+
+func (x *DateTimePicker) GetType() DateTimePicker_DateTimePickerType {
+	if x != nil {
+		return x.Type
+	}
+	return DateTimePicker_DATE_AND_TIME
+}
+
+func (x *DateTimePicker) GetValueMsEpoch() int64 {
+	if x != nil {
+		return x.ValueMsEpoch
+	}
+	return 0
+}
+
+func (x *DateTimePicker) GetTimezoneOffsetDate() int32 {
+	if x != nil {
+		return x.TimezoneOffsetDate
+	}
+	return 0
+}
+
+func (x *DateTimePicker) GetOnChangeAction() *Action {
+	if x != nil {
+		return x.OnChangeAction
+	}
+	return nil
+}
+
+// A text, icon, or text and icon button that users can click. For an example in
+// Google Chat apps, see
+// [Add a
+// button](https://developers.google.com/workspace/chat/design-interactive-card-dialog#add_a_button).
+//
+// To make an image a clickable button, specify an
+// [`Image`][google.apps.card.v1.Image] (not an
+// [`ImageComponent`][google.apps.card.v1.ImageComponent]) and set an
+// `onClick` action.
+//
+// [Google Workspace
+// Add-ons and Chat apps](https://developers.google.com/workspace/extend):
+type Button struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The text displayed inside the button.
+	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// The icon image. If both `icon` and `text` are set, then the icon appears
+	// before the text.
+	Icon *Icon `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"`
+	// If set, the button is filled with a solid background color and the font
+	// color changes to maintain contrast with the background color. For example,
+	// setting a blue background likely results in white text.
+	//
+	// If unset, the image background is white and the font color is blue.
+	//
+	// For red, green, and blue, the value of each field is a `float` number that
+	// you can express in either of two ways: as a number between 0 and 255
+	// divided by 255 (153/255), or as a value between 0 and 1 (0.6). 0 represents
+	// the absence of a color and 1 or 255/255 represent the full presence of that
+	// color on the RGB scale.
+	//
+	// Optionally set `alpha`, which sets a level of transparency using this
+	// equation:
+	//
+	// ```
+	// pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
+	// ```
+	//
+	// For `alpha`, a value of `1` corresponds with a solid color, and a value of
+	// `0` corresponds with a completely transparent color.
+	//
+	// For example, the following color represents a half transparent red:
+	//
+	// ```
+	//
+	//	"color": {
+	//	   "red": 1,
+	//	   "green": 0,
+	//	   "blue": 0,
+	//	   "alpha": 0.5
+	//	}
+	//
+	// ```
+	Color *color.Color `protobuf:"bytes,3,opt,name=color,proto3" json:"color,omitempty"`
+	// Required. The action to perform when a user clicks the button, such as
+	// opening a hyperlink or running a custom function.
+	OnClick *OnClick `protobuf:"bytes,4,opt,name=on_click,json=onClick,proto3" json:"on_click,omitempty"`
+	// If `true`, the button is displayed in an inactive state and doesn't respond
+	// to user actions.
+	Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"`
+	// The alternative text that's used for accessibility.
+	//
+	// Set descriptive text that lets users know what the button does. For
+	// example, if a button opens a hyperlink, you might write: "Opens a new
+	// browser tab and navigates to the Google Chat developer documentation at
+	// https://developers.google.com/workspace/chat".
+	AltText string `protobuf:"bytes,6,opt,name=alt_text,json=altText,proto3" json:"alt_text,omitempty"`
+}
+
+func (x *Button) Reset() {
+	*x = Button{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Button) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Button) ProtoMessage() {}
+
+func (x *Button) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[11]
+	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 Button.ProtoReflect.Descriptor instead.
+func (*Button) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *Button) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+func (x *Button) GetIcon() *Icon {
+	if x != nil {
+		return x.Icon
+	}
+	return nil
+}
+
+func (x *Button) GetColor() *color.Color {
+	if x != nil {
+		return x.Color
+	}
+	return nil
+}
+
+func (x *Button) GetOnClick() *OnClick {
+	if x != nil {
+		return x.OnClick
+	}
+	return nil
+}
+
+func (x *Button) GetDisabled() bool {
+	if x != nil {
+		return x.Disabled
+	}
+	return false
+}
+
+func (x *Button) GetAltText() string {
+	if x != nil {
+		return x.AltText
+	}
+	return ""
+}
+
+// An icon displayed in a widget on a card. For an example in Google Chat apps,
+// see [Add an
+// icon](https://developers.google.com/workspace/chat/add-text-image-card-dialog#add_an_icon).
+//
+// Supports
+// [built-in](https://developers.google.com/workspace/chat/format-messages#builtinicons)
+// and
+// [custom](https://developers.google.com/workspace/chat/format-messages#customicons)
+// icons.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Icon struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The icon displayed in the widget on the card.
+	//
+	// Types that are assignable to Icons:
+	//
+	//	*Icon_KnownIcon
+	//	*Icon_IconUrl
+	//	*Icon_MaterialIcon
+	Icons isIcon_Icons `protobuf_oneof:"icons"`
+	// Optional. A description of the icon used for accessibility.
+	// If unspecified, the default value `Button` is provided. As a best practice,
+	// you should set a helpful description for what the icon displays, and if
+	// applicable, what it does. For example, `A user's account portrait`, or
+	// `Opens a new browser tab and navigates to the Google Chat developer
+	// documentation at https://developers.google.com/workspace/chat`.
+	//
+	// If the icon is set in a [`Button`][google.apps.card.v1.Button], the
+	// `altText` appears as helper text when the user hovers over the button.
+	// However, if the button also sets `text`, the icon's `altText` is ignored.
+	AltText string `protobuf:"bytes,3,opt,name=alt_text,json=altText,proto3" json:"alt_text,omitempty"`
+	// The crop style applied to the image. In some cases, applying a
+	// `CIRCLE` crop causes the image to be drawn larger than a built-in
+	// icon.
+	ImageType Widget_ImageType `protobuf:"varint,4,opt,name=image_type,json=imageType,proto3,enum=google.apps.card.v1.Widget_ImageType" json:"image_type,omitempty"`
+}
+
+func (x *Icon) Reset() {
+	*x = Icon{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Icon) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Icon) ProtoMessage() {}
+
+func (x *Icon) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[12]
+	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 Icon.ProtoReflect.Descriptor instead.
+func (*Icon) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{12}
+}
+
+func (m *Icon) GetIcons() isIcon_Icons {
+	if m != nil {
+		return m.Icons
+	}
+	return nil
+}
+
+func (x *Icon) GetKnownIcon() string {
+	if x, ok := x.GetIcons().(*Icon_KnownIcon); ok {
+		return x.KnownIcon
+	}
+	return ""
+}
+
+func (x *Icon) GetIconUrl() string {
+	if x, ok := x.GetIcons().(*Icon_IconUrl); ok {
+		return x.IconUrl
+	}
+	return ""
+}
+
+func (x *Icon) GetMaterialIcon() *MaterialIcon {
+	if x, ok := x.GetIcons().(*Icon_MaterialIcon); ok {
+		return x.MaterialIcon
+	}
+	return nil
+}
+
+func (x *Icon) GetAltText() string {
+	if x != nil {
+		return x.AltText
+	}
+	return ""
+}
+
+func (x *Icon) GetImageType() Widget_ImageType {
+	if x != nil {
+		return x.ImageType
+	}
+	return Widget_SQUARE
+}
+
+type isIcon_Icons interface {
+	isIcon_Icons()
+}
+
+type Icon_KnownIcon struct {
+	// Display one of the built-in icons provided by Google Workspace.
+	//
+	// For example, to display an airplane icon, specify `AIRPLANE`.
+	// For a bus, specify `BUS`.
+	//
+	// For a full list of supported icons, see [built-in
+	// icons](https://developers.google.com/workspace/chat/format-messages#builtinicons).
+	KnownIcon string `protobuf:"bytes,1,opt,name=known_icon,json=knownIcon,proto3,oneof"`
+}
+
+type Icon_IconUrl struct {
+	// Display a custom icon hosted at an HTTPS URL.
+	//
+	// For example:
+	//
+	// ```
+	// "iconUrl":
+	// "https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png"
+	// ```
+	//
+	// Supported file types include `.png` and `.jpg`.
+	IconUrl string `protobuf:"bytes,2,opt,name=icon_url,json=iconUrl,proto3,oneof"`
+}
+
+type Icon_MaterialIcon struct {
+	// Display one of the [Google Material
+	// Icons](https://fonts.google.com/icons).
+	//
+	// For example, to display a [checkbox
+	// icon](https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Acheck_box%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4048),
+	// use
+	// ```
+	//
+	//	"material_icon": {
+	//	  "name": "check_box"
+	//	}
+	//
+	// ```
+	//
+	// [Google Chat apps](https://developers.google.com/workspace/chat):
+	MaterialIcon *MaterialIcon `protobuf:"bytes,5,opt,name=material_icon,json=materialIcon,proto3,oneof"`
+}
+
+func (*Icon_KnownIcon) isIcon_Icons() {}
+
+func (*Icon_IconUrl) isIcon_Icons() {}
+
+func (*Icon_MaterialIcon) isIcon_Icons() {}
+
+// A [Google Material Icon](https://fonts.google.com/icons), which includes over
+// 2500+ options.
+//
+// For example, to display a [checkbox
+// icon](https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Acheck_box%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4048)
+// with customized weight and grade, write the following:
+//
+// ```
+//
+//	{
+//	  "name": "check_box",
+//	  "fill": true,
+//	  "weight": 300,
+//	  "grade": -25
+//	}
+//
+// ```
+//
+// [Google Chat apps](https://developers.google.com/workspace/chat):
+type MaterialIcon struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The icon name defined in the [Google Material
+	// Icon](https://fonts.google.com/icons), for example, `check_box`. Any
+	// invalid names are abandoned and replaced with empty string and
+	// results in the icon failing to render.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Whether the icon renders as filled. Default value is false.
+	//
+	// To preview different icon settings, go to
+	// [Google Font Icons](https://fonts.google.com/icons) and adjust the
+	// settings under **Customize**.
+	Fill bool `protobuf:"varint,2,opt,name=fill,proto3" json:"fill,omitempty"`
+	// The stroke weight of the icon. Choose from {100, 200, 300, 400,
+	// 500, 600, 700}. If absent, default value is 400. If any other value is
+	// specified, the default value is used.
+	//
+	// To preview different icon settings, go to
+	// [Google Font Icons](https://fonts.google.com/icons) and adjust the
+	// settings under **Customize**.
+	Weight int32 `protobuf:"varint,3,opt,name=weight,proto3" json:"weight,omitempty"`
+	// Weight and grade affect a symbol’s thickness. Adjustments to grade are more
+	// granular than adjustments to weight and have a small impact on the size of
+	// the symbol. Choose from {-25, 0, 200}. If absent, default value is 0. If
+	// any other value is specified, the default value is used.
+	//
+	// To preview different icon settings, go to
+	// [Google Font Icons](https://fonts.google.com/icons) and adjust the
+	// settings under **Customize**.
+	Grade int32 `protobuf:"varint,4,opt,name=grade,proto3" json:"grade,omitempty"`
+}
+
+func (x *MaterialIcon) Reset() {
+	*x = MaterialIcon{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MaterialIcon) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MaterialIcon) ProtoMessage() {}
+
+func (x *MaterialIcon) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[13]
+	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 MaterialIcon.ProtoReflect.Descriptor instead.
+func (*MaterialIcon) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *MaterialIcon) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *MaterialIcon) GetFill() bool {
+	if x != nil {
+		return x.Fill
+	}
+	return false
+}
+
+func (x *MaterialIcon) GetWeight() int32 {
+	if x != nil {
+		return x.Weight
+	}
+	return 0
+}
+
+func (x *MaterialIcon) GetGrade() int32 {
+	if x != nil {
+		return x.Grade
+	}
+	return 0
+}
+
+// Represents the crop style applied to an image.
+//
+// [Google Workspace Add-ons and
+// Chat apps](https://developers.google.com/workspace/extend):
+//
+// For example, here's how to apply a 16:9 aspect ratio:
+//
+// ```
+//
+//	cropStyle {
+//	 "type": "RECTANGLE_CUSTOM",
+//	 "aspectRatio": 16/9
+//	}
+//
+// ```
+type ImageCropStyle struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The crop type.
+	Type ImageCropStyle_ImageCropType `protobuf:"varint,1,opt,name=type,proto3,enum=google.apps.card.v1.ImageCropStyle_ImageCropType" json:"type,omitempty"`
+	// The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+	//
+	// For example, here's how to apply a 16:9 aspect ratio:
+	//
+	// ```
+	//
+	//	cropStyle {
+	//	 "type": "RECTANGLE_CUSTOM",
+	//	 "aspectRatio": 16/9
+	//	}
+	//
+	// ```
+	AspectRatio float64 `protobuf:"fixed64,2,opt,name=aspect_ratio,json=aspectRatio,proto3" json:"aspect_ratio,omitempty"`
+}
+
+func (x *ImageCropStyle) Reset() {
+	*x = ImageCropStyle{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ImageCropStyle) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ImageCropStyle) ProtoMessage() {}
+
+func (x *ImageCropStyle) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[14]
+	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 ImageCropStyle.ProtoReflect.Descriptor instead.
+func (*ImageCropStyle) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ImageCropStyle) GetType() ImageCropStyle_ImageCropType {
+	if x != nil {
+		return x.Type
+	}
+	return ImageCropStyle_IMAGE_CROP_TYPE_UNSPECIFIED
+}
+
+func (x *ImageCropStyle) GetAspectRatio() float64 {
+	if x != nil {
+		return x.AspectRatio
+	}
+	return 0
+}
+
+// The style options for the border of a card or widget, including the border
+// type and color.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type BorderStyle struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The border type.
+	Type BorderStyle_BorderType `protobuf:"varint,1,opt,name=type,proto3,enum=google.apps.card.v1.BorderStyle_BorderType" json:"type,omitempty"`
+	// The colors to use when the type is `BORDER_TYPE_STROKE`.
+	StrokeColor *color.Color `protobuf:"bytes,2,opt,name=stroke_color,json=strokeColor,proto3" json:"stroke_color,omitempty"`
+	// The corner radius for the border.
+	CornerRadius int32 `protobuf:"varint,3,opt,name=corner_radius,json=cornerRadius,proto3" json:"corner_radius,omitempty"`
+}
+
+func (x *BorderStyle) Reset() {
+	*x = BorderStyle{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BorderStyle) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BorderStyle) ProtoMessage() {}
+
+func (x *BorderStyle) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[15]
+	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 BorderStyle.ProtoReflect.Descriptor instead.
+func (*BorderStyle) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *BorderStyle) GetType() BorderStyle_BorderType {
+	if x != nil {
+		return x.Type
+	}
+	return BorderStyle_BORDER_TYPE_UNSPECIFIED
+}
+
+func (x *BorderStyle) GetStrokeColor() *color.Color {
+	if x != nil {
+		return x.StrokeColor
+	}
+	return nil
+}
+
+func (x *BorderStyle) GetCornerRadius() int32 {
+	if x != nil {
+		return x.CornerRadius
+	}
+	return 0
+}
+
+// Represents an image.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type ImageComponent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The image URL.
+	ImageUri string `protobuf:"bytes,1,opt,name=image_uri,json=imageUri,proto3" json:"image_uri,omitempty"`
+	// The accessibility label for the image.
+	AltText string `protobuf:"bytes,2,opt,name=alt_text,json=altText,proto3" json:"alt_text,omitempty"`
+	// The crop style to apply to the image.
+	CropStyle *ImageCropStyle `protobuf:"bytes,3,opt,name=crop_style,json=cropStyle,proto3" json:"crop_style,omitempty"`
+	// The border style to apply to the image.
+	BorderStyle *BorderStyle `protobuf:"bytes,4,opt,name=border_style,json=borderStyle,proto3" json:"border_style,omitempty"`
+}
+
+func (x *ImageComponent) Reset() {
+	*x = ImageComponent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ImageComponent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ImageComponent) ProtoMessage() {}
+
+func (x *ImageComponent) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[16]
+	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 ImageComponent.ProtoReflect.Descriptor instead.
+func (*ImageComponent) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ImageComponent) GetImageUri() string {
+	if x != nil {
+		return x.ImageUri
+	}
+	return ""
+}
+
+func (x *ImageComponent) GetAltText() string {
+	if x != nil {
+		return x.AltText
+	}
+	return ""
+}
+
+func (x *ImageComponent) GetCropStyle() *ImageCropStyle {
+	if x != nil {
+		return x.CropStyle
+	}
+	return nil
+}
+
+func (x *ImageComponent) GetBorderStyle() *BorderStyle {
+	if x != nil {
+		return x.BorderStyle
+	}
+	return nil
+}
+
+// Displays a grid with a collection of items. Items can only include text or
+// images. For responsive columns, or to include more than text or images, use
+// [`Columns`][google.apps.card.v1.Columns]. For an example in Google Chat apps,
+// see [Display a Grid with a collection of
+// items](https://developers.google.com/workspace/chat/format-structure-card-dialog#display_a_grid_with_a_collection_of_items).
+//
+// A grid supports any number of columns and items. The number of rows is
+// determined by items divided by columns. A grid with
+// 10 items and 2 columns has 5 rows. A grid with 11 items and 2 columns
+// has 6 rows.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+//
+// For example, the following JSON creates a 2 column grid with a single
+// item:
+//
+// ```
+//
+//	"grid": {
+//	  "title": "A fine collection of items",
+//	  "columnCount": 2,
+//	  "borderStyle": {
+//	    "type": "STROKE",
+//	    "cornerRadius": 4
+//	  },
+//	  "items": [
+//	    {
+//	      "image": {
+//	        "imageUri": "https://www.example.com/image.png",
+//	        "cropStyle": {
+//	          "type": "SQUARE"
+//	        },
+//	        "borderStyle": {
+//	          "type": "STROKE"
+//	        }
+//	      },
+//	      "title": "An item",
+//	      "textAlignment": "CENTER"
+//	    }
+//	  ],
+//	  "onClick": {
+//	    "openLink": {
+//	      "url": "https://www.example.com"
+//	    }
+//	  }
+//	}
+//
+// ```
+type Grid struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The text that displays in the grid header.
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// The items to display in the grid.
+	Items []*Grid_GridItem `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"`
+	// The border style to apply to each grid item.
+	BorderStyle *BorderStyle `protobuf:"bytes,3,opt,name=border_style,json=borderStyle,proto3" json:"border_style,omitempty"`
+	// The number of columns to display in the grid. A default value
+	// is used if this field isn't specified, and that default value is
+	// different depending on where the grid is shown (dialog versus companion).
+	ColumnCount int32 `protobuf:"varint,4,opt,name=column_count,json=columnCount,proto3" json:"column_count,omitempty"`
+	// This callback is reused by each individual grid item, but with the
+	// item's identifier and index in the items list added to the callback's
+	// parameters.
+	OnClick *OnClick `protobuf:"bytes,5,opt,name=on_click,json=onClick,proto3" json:"on_click,omitempty"`
+}
+
+func (x *Grid) Reset() {
+	*x = Grid{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Grid) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Grid) ProtoMessage() {}
+
+func (x *Grid) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[17]
+	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 Grid.ProtoReflect.Descriptor instead.
+func (*Grid) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *Grid) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *Grid) GetItems() []*Grid_GridItem {
+	if x != nil {
+		return x.Items
+	}
+	return nil
+}
+
+func (x *Grid) GetBorderStyle() *BorderStyle {
+	if x != nil {
+		return x.BorderStyle
+	}
+	return nil
+}
+
+func (x *Grid) GetColumnCount() int32 {
+	if x != nil {
+		return x.ColumnCount
+	}
+	return 0
+}
+
+func (x *Grid) GetOnClick() *OnClick {
+	if x != nil {
+		return x.OnClick
+	}
+	return nil
+}
+
+// The `Columns` widget displays up to 2 columns in a card or dialog. You can
+// add widgets to each column; the widgets appear in the order that they are
+// specified. For an example in Google Chat apps, see
+// [Display cards and dialogs in
+// columns](https://developers.google.com/workspace/chat/format-structure-card-dialog#display_cards_and_dialogs_in_columns).
+//
+// The height of each column is determined by the taller column. For example, if
+// the first column is taller than the second column, both columns have the
+// height of the first column. Because each column can contain a different
+// number of widgets, you can't define rows or align widgets between the
+// columns.
+//
+// Columns are displayed side-by-side. You can customize the width of each
+// column using the `HorizontalSizeStyle` field. If the user's
+// screen width is too narrow, the second column wraps below the first:
+//
+//   - On web, the second column wraps if the screen width is less than or equal
+//     to 480 pixels.
+//   - On iOS devices, the second column wraps if the screen width is
+//     less than or equal to 300 pt.
+//   - On Android devices, the second column wraps if the screen width is
+//     less than or equal to 320 dp.
+//
+// To include more than 2 columns, or to use rows, use the
+// [`Grid`][google.apps.card.v1.Grid] widget.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+// Columns for Google Workspace Add-ons are in
+// Developer Preview.
+type Columns struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// An array of columns. You can include up to 2 columns in a card or dialog.
+	ColumnItems []*Columns_Column `protobuf:"bytes,2,rep,name=column_items,json=columnItems,proto3" json:"column_items,omitempty"`
+}
+
+func (x *Columns) Reset() {
+	*x = Columns{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Columns) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Columns) ProtoMessage() {}
+
+func (x *Columns) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[18]
+	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 Columns.ProtoReflect.Descriptor instead.
+func (*Columns) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *Columns) GetColumnItems() []*Columns_Column {
+	if x != nil {
+		return x.ColumnItems
+	}
+	return nil
+}
+
+// Represents how to respond when users click an interactive element on
+// a card, such as a button.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type OnClick struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Data:
+	//
+	//	*OnClick_Action
+	//	*OnClick_OpenLink
+	//	*OnClick_OpenDynamicLinkAction
+	//	*OnClick_Card
+	Data isOnClick_Data `protobuf_oneof:"data"`
+}
+
+func (x *OnClick) Reset() {
+	*x = OnClick{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OnClick) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnClick) ProtoMessage() {}
+
+func (x *OnClick) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[19]
+	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 OnClick.ProtoReflect.Descriptor instead.
+func (*OnClick) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{19}
+}
+
+func (m *OnClick) GetData() isOnClick_Data {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+func (x *OnClick) GetAction() *Action {
+	if x, ok := x.GetData().(*OnClick_Action); ok {
+		return x.Action
+	}
+	return nil
+}
+
+func (x *OnClick) GetOpenLink() *OpenLink {
+	if x, ok := x.GetData().(*OnClick_OpenLink); ok {
+		return x.OpenLink
+	}
+	return nil
+}
+
+func (x *OnClick) GetOpenDynamicLinkAction() *Action {
+	if x, ok := x.GetData().(*OnClick_OpenDynamicLinkAction); ok {
+		return x.OpenDynamicLinkAction
+	}
+	return nil
+}
+
+func (x *OnClick) GetCard() *Card {
+	if x, ok := x.GetData().(*OnClick_Card); ok {
+		return x.Card
+	}
+	return nil
+}
+
+type isOnClick_Data interface {
+	isOnClick_Data()
+}
+
+type OnClick_Action struct {
+	// If specified, an action is triggered by this `onClick`.
+	Action *Action `protobuf:"bytes,1,opt,name=action,proto3,oneof"`
+}
+
+type OnClick_OpenLink struct {
+	// If specified, this `onClick` triggers an open link action.
+	OpenLink *OpenLink `protobuf:"bytes,2,opt,name=open_link,json=openLink,proto3,oneof"`
+}
+
+type OnClick_OpenDynamicLinkAction struct {
+	// An add-on triggers this action when the action needs to open a
+	// link. This differs from the `open_link` above in that this needs to talk
+	// to server to get the link. Thus some preparation work is required for
+	// web client to do before the open link action response comes back.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	OpenDynamicLinkAction *Action `protobuf:"bytes,3,opt,name=open_dynamic_link_action,json=openDynamicLinkAction,proto3,oneof"`
+}
+
+type OnClick_Card struct {
+	// A new card is pushed to the card stack after clicking if specified.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	Card *Card `protobuf:"bytes,4,opt,name=card,proto3,oneof"`
+}
+
+func (*OnClick_Action) isOnClick_Data() {}
+
+func (*OnClick_OpenLink) isOnClick_Data() {}
+
+func (*OnClick_OpenDynamicLinkAction) isOnClick_Data() {}
+
+func (*OnClick_Card) isOnClick_Data() {}
+
+// Represents an `onClick` event that opens a hyperlink.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type OpenLink struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The URL to open.
+	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	// How to open a link.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	OpenAs OpenLink_OpenAs `protobuf:"varint,2,opt,name=open_as,json=openAs,proto3,enum=google.apps.card.v1.OpenLink_OpenAs" json:"open_as,omitempty"`
+	// Whether the client forgets about a link after opening it, or observes it
+	// until the window closes.
+	//
+	// [Google Workspace
+	// Add-ons](https://developers.google.com/workspace/add-ons):
+	OnClose OpenLink_OnClose `protobuf:"varint,3,opt,name=on_close,json=onClose,proto3,enum=google.apps.card.v1.OpenLink_OnClose" json:"on_close,omitempty"`
+}
+
+func (x *OpenLink) Reset() {
+	*x = OpenLink{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OpenLink) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OpenLink) ProtoMessage() {}
+
+func (x *OpenLink) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[20]
+	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 OpenLink.ProtoReflect.Descriptor instead.
+func (*OpenLink) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *OpenLink) GetUrl() string {
+	if x != nil {
+		return x.Url
+	}
+	return ""
+}
+
+func (x *OpenLink) GetOpenAs() OpenLink_OpenAs {
+	if x != nil {
+		return x.OpenAs
+	}
+	return OpenLink_FULL_SIZE
+}
+
+func (x *OpenLink) GetOnClose() OpenLink_OnClose {
+	if x != nil {
+		return x.OnClose
+	}
+	return OpenLink_NOTHING
+}
+
+// An action that describes the behavior when the form is submitted.
+// For example, you can invoke an Apps Script script to handle the form.
+// If the action is triggered, the form values are sent to the server.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Action struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A custom function to invoke when the containing element is
+	// clicked or othrwise activated.
+	//
+	// For example usage, see [Read form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Function string `protobuf:"bytes,1,opt,name=function,proto3" json:"function,omitempty"`
+	// List of action parameters.
+	Parameters []*Action_ActionParameter `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty"`
+	// Specifies the loading indicator that the action displays while
+	// making the call to the action.
+	LoadIndicator Action_LoadIndicator `protobuf:"varint,3,opt,name=load_indicator,json=loadIndicator,proto3,enum=google.apps.card.v1.Action_LoadIndicator" json:"load_indicator,omitempty"`
+	// Indicates whether form values persist after the action. The default value
+	// is `false`.
+	//
+	// If `true`, form values remain after the action is triggered. To let the
+	// user make changes while the action is being processed, set
+	// [`LoadIndicator`](https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator)
+	// to `NONE`. For [card
+	// messages](https://developers.google.com/workspace/chat/api/guides/v1/messages/create#create)
+	// in Chat apps, you must also set the action's
+	// [`ResponseType`](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages#responsetype)
+	// to `UPDATE_MESSAGE` and use the same
+	// [`card_id`](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages#CardWithId)
+	// from the card that contained the action.
+	//
+	// If `false`, the form values are cleared when the action is triggered.
+	// To prevent the user from making changes while the action is being
+	// processed, set
+	// [`LoadIndicator`](https://developers.google.com/workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator)
+	// to `SPINNER`.
+	PersistValues bool `protobuf:"varint,4,opt,name=persist_values,json=persistValues,proto3" json:"persist_values,omitempty"`
+	// Optional. Required when opening a
+	// [dialog](https://developers.google.com/workspace/chat/dialogs).
+	//
+	// What to do in response to an interaction with a user, such as a user
+	// clicking a button in a card message.
+	//
+	// If unspecified, the app responds by executing an `action`—like opening a
+	// link or running a function—as normal.
+	//
+	// By specifying an `interaction`, the app can respond in special interactive
+	// ways. For example, by setting `interaction` to `OPEN_DIALOG`, the app can
+	// open a [dialog](https://developers.google.com/workspace/chat/dialogs). When
+	// specified, a loading indicator isn't shown. If specified for
+	// an add-on, the entire card is stripped and nothing is shown in the client.
+	//
+	// [Google Chat apps](https://developers.google.com/workspace/chat):
+	Interaction Action_Interaction `protobuf:"varint,5,opt,name=interaction,proto3,enum=google.apps.card.v1.Action_Interaction" json:"interaction,omitempty"`
+}
+
+func (x *Action) Reset() {
+	*x = Action{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action) ProtoMessage() {}
+
+func (x *Action) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[21]
+	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 Action.ProtoReflect.Descriptor instead.
+func (*Action) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *Action) GetFunction() string {
+	if x != nil {
+		return x.Function
+	}
+	return ""
+}
+
+func (x *Action) GetParameters() []*Action_ActionParameter {
+	if x != nil {
+		return x.Parameters
+	}
+	return nil
+}
+
+func (x *Action) GetLoadIndicator() Action_LoadIndicator {
+	if x != nil {
+		return x.LoadIndicator
+	}
+	return Action_SPINNER
+}
+
+func (x *Action) GetPersistValues() bool {
+	if x != nil {
+		return x.PersistValues
+	}
+	return false
+}
+
+func (x *Action) GetInteraction() Action_Interaction {
+	if x != nil {
+		return x.Interaction
+	}
+	return Action_INTERACTION_UNSPECIFIED
+}
+
+// Represents a card header. For an example in Google Chat apps, see [Add a
+// header](https://developers.google.com/workspace/chat/design-components-card-dialog#add_a_header).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Card_CardHeader struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Required. The title of the card header.
+	// The header has a fixed height: if both a
+	// title and subtitle are specified, each takes up one line. If only the
+	// title is specified, it takes up both lines.
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// The subtitle of the card header. If specified, appears on its own line
+	// below the `title`.
+	Subtitle string `protobuf:"bytes,2,opt,name=subtitle,proto3" json:"subtitle,omitempty"`
+	// The shape used to crop the image.
+	//
+	// [Google Workspace Add-ons and Chat
+	// apps](https://developers.google.com/workspace/extend):
+	ImageType Widget_ImageType `protobuf:"varint,3,opt,name=image_type,json=imageType,proto3,enum=google.apps.card.v1.Widget_ImageType" json:"image_type,omitempty"`
+	// The HTTPS URL of the image in the card header.
+	ImageUrl string `protobuf:"bytes,4,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
+	// The alternative text of this image that's used for accessibility.
+	ImageAltText string `protobuf:"bytes,5,opt,name=image_alt_text,json=imageAltText,proto3" json:"image_alt_text,omitempty"`
+}
+
+func (x *Card_CardHeader) Reset() {
+	*x = Card_CardHeader{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Card_CardHeader) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Card_CardHeader) ProtoMessage() {}
+
+func (x *Card_CardHeader) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[22]
+	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 Card_CardHeader.ProtoReflect.Descriptor instead.
+func (*Card_CardHeader) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Card_CardHeader) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *Card_CardHeader) GetSubtitle() string {
+	if x != nil {
+		return x.Subtitle
+	}
+	return ""
+}
+
+func (x *Card_CardHeader) GetImageType() Widget_ImageType {
+	if x != nil {
+		return x.ImageType
+	}
+	return Widget_SQUARE
+}
+
+func (x *Card_CardHeader) GetImageUrl() string {
+	if x != nil {
+		return x.ImageUrl
+	}
+	return ""
+}
+
+func (x *Card_CardHeader) GetImageAltText() string {
+	if x != nil {
+		return x.ImageAltText
+	}
+	return ""
+}
+
+// A section contains a collection of widgets that are rendered
+// vertically in the order that they're specified.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Card_Section struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Text that appears at the top of a section.
+	// Supports simple HTML formatted text. For more information
+	// about formatting text, see
+	// [Formatting text in Google Chat
+	// apps](https://developers.google.com/workspace/chat/format-messages#card-formatting)
+	// and
+	// [Formatting
+	// text in Google Workspace
+	// Add-ons](https://developers.google.com/apps-script/add-ons/concepts/widgets#text_formatting).
+	Header string `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
+	// All the widgets in the section.
+	// Must contain at least one widget.
+	Widgets []*Widget `protobuf:"bytes,2,rep,name=widgets,proto3" json:"widgets,omitempty"`
+	// Indicates whether this section is collapsible.
+	//
+	// Collapsible sections hide some or all widgets, but users can expand the
+	// section to reveal the hidden widgets by clicking **Show more**. Users
+	// can hide the widgets again by clicking **Show less**.
+	//
+	// To determine which widgets are hidden, specify
+	// `uncollapsibleWidgetsCount`.
+	Collapsible bool `protobuf:"varint,5,opt,name=collapsible,proto3" json:"collapsible,omitempty"`
+	// The number of uncollapsible widgets which remain visible even when a
+	// section is collapsed.
+	//
+	// For example, when a section
+	// contains five widgets and the `uncollapsibleWidgetsCount` is set to `2`,
+	// the first two widgets are always shown and the last three are collapsed
+	// by default. The `uncollapsibleWidgetsCount` is taken into account only
+	// when `collapsible` is `true`.
+	UncollapsibleWidgetsCount int32 `protobuf:"varint,6,opt,name=uncollapsible_widgets_count,json=uncollapsibleWidgetsCount,proto3" json:"uncollapsible_widgets_count,omitempty"`
+}
+
+func (x *Card_Section) Reset() {
+	*x = Card_Section{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Card_Section) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Card_Section) ProtoMessage() {}
+
+func (x *Card_Section) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_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 Card_Section.ProtoReflect.Descriptor instead.
+func (*Card_Section) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0, 1}
+}
+
+func (x *Card_Section) GetHeader() string {
+	if x != nil {
+		return x.Header
+	}
+	return ""
+}
+
+func (x *Card_Section) GetWidgets() []*Widget {
+	if x != nil {
+		return x.Widgets
+	}
+	return nil
+}
+
+func (x *Card_Section) GetCollapsible() bool {
+	if x != nil {
+		return x.Collapsible
+	}
+	return false
+}
+
+func (x *Card_Section) GetUncollapsibleWidgetsCount() int32 {
+	if x != nil {
+		return x.UncollapsibleWidgetsCount
+	}
+	return 0
+}
+
+// A card action is the action associated with the card. For example,
+// an invoice card might include actions such as delete invoice, email
+// invoice, or open the invoice in a browser.
+//
+// [Google Workspace
+// Add-ons](https://developers.google.com/workspace/add-ons):
+type Card_CardAction struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The label that displays as the action menu item.
+	ActionLabel string `protobuf:"bytes,1,opt,name=action_label,json=actionLabel,proto3" json:"action_label,omitempty"`
+	// The `onClick` action for this action item.
+	OnClick *OnClick `protobuf:"bytes,2,opt,name=on_click,json=onClick,proto3" json:"on_click,omitempty"`
+}
+
+func (x *Card_CardAction) Reset() {
+	*x = Card_CardAction{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Card_CardAction) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Card_CardAction) ProtoMessage() {}
+
+func (x *Card_CardAction) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[24]
+	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 Card_CardAction.ProtoReflect.Descriptor instead.
+func (*Card_CardAction) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0, 2}
+}
+
+func (x *Card_CardAction) GetActionLabel() string {
+	if x != nil {
+		return x.ActionLabel
+	}
+	return ""
+}
+
+func (x *Card_CardAction) GetOnClick() *OnClick {
+	if x != nil {
+		return x.OnClick
+	}
+	return nil
+}
+
+// A persistent (sticky) footer that that appears at the bottom of the card.
+//
+// Setting `fixedFooter` without specifying a `primaryButton` or a
+// `secondaryButton` causes an error.
+//
+// For Chat apps, you can use fixed footers in
+// [dialogs](https://developers.google.com/workspace/chat/dialogs), but not
+// [card
+// messages](https://developers.google.com/workspace/chat/create-messages#create).
+// For an example in Google Chat apps, see [Add a persistent
+// footer](https://developers.google.com/workspace/chat/design-components-card-dialog#add_a_persistent_footer).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Card_CardFixedFooter struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The primary button of the fixed footer. The button must be a text button
+	// with text and color set.
+	PrimaryButton *Button `protobuf:"bytes,1,opt,name=primary_button,json=primaryButton,proto3" json:"primary_button,omitempty"`
+	// The secondary button of the fixed footer.  The button must be a text
+	// button with text and color set.
+	// If `secondaryButton` is set, you must also set `primaryButton`.
+	SecondaryButton *Button `protobuf:"bytes,2,opt,name=secondary_button,json=secondaryButton,proto3" json:"secondary_button,omitempty"`
+}
+
+func (x *Card_CardFixedFooter) Reset() {
+	*x = Card_CardFixedFooter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Card_CardFixedFooter) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Card_CardFixedFooter) ProtoMessage() {}
+
+func (x *Card_CardFixedFooter) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[25]
+	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 Card_CardFixedFooter.ProtoReflect.Descriptor instead.
+func (*Card_CardFixedFooter) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{0, 3}
+}
+
+func (x *Card_CardFixedFooter) GetPrimaryButton() *Button {
+	if x != nil {
+		return x.PrimaryButton
+	}
+	return nil
+}
+
+func (x *Card_CardFixedFooter) GetSecondaryButton() *Button {
+	if x != nil {
+		return x.SecondaryButton
+	}
+	return nil
+}
+
+// Either a toggle-style switch or a checkbox inside a `decoratedText` widget.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+//
+// Only supported in the `decoratedText` widget.
+type DecoratedText_SwitchControl struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name by which the switch widget is identified in a form input event.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The value entered by a user, returned as part of a form input event.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	// When `true`, the switch is selected.
+	Selected bool `protobuf:"varint,3,opt,name=selected,proto3" json:"selected,omitempty"`
+	// The action to perform when the switch state is changed, such as what
+	//
+	//	function to run.
+	OnChangeAction *Action `protobuf:"bytes,4,opt,name=on_change_action,json=onChangeAction,proto3" json:"on_change_action,omitempty"`
+	// How the switch appears in the user interface.
+	//
+	// [Google Workspace Add-ons
+	// and Chat apps](https://developers.google.com/workspace/extend):
+	ControlType DecoratedText_SwitchControl_ControlType `protobuf:"varint,5,opt,name=control_type,json=controlType,proto3,enum=google.apps.card.v1.DecoratedText_SwitchControl_ControlType" json:"control_type,omitempty"`
+}
+
+func (x *DecoratedText_SwitchControl) Reset() {
+	*x = DecoratedText_SwitchControl{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DecoratedText_SwitchControl) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DecoratedText_SwitchControl) ProtoMessage() {}
+
+func (x *DecoratedText_SwitchControl) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[26]
+	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 DecoratedText_SwitchControl.ProtoReflect.Descriptor instead.
+func (*DecoratedText_SwitchControl) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{5, 0}
+}
+
+func (x *DecoratedText_SwitchControl) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DecoratedText_SwitchControl) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+func (x *DecoratedText_SwitchControl) GetSelected() bool {
+	if x != nil {
+		return x.Selected
+	}
+	return false
+}
+
+func (x *DecoratedText_SwitchControl) GetOnChangeAction() *Action {
+	if x != nil {
+		return x.OnChangeAction
+	}
+	return nil
+}
+
+func (x *DecoratedText_SwitchControl) GetControlType() DecoratedText_SwitchControl_ControlType {
+	if x != nil {
+		return x.ControlType
+	}
+	return DecoratedText_SwitchControl_SWITCH
+}
+
+// One suggested value that users can enter in a text input field.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Suggestions_SuggestionItem struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Content:
+	//
+	//	*Suggestions_SuggestionItem_Text
+	Content isSuggestions_SuggestionItem_Content `protobuf_oneof:"content"`
+}
+
+func (x *Suggestions_SuggestionItem) Reset() {
+	*x = Suggestions_SuggestionItem{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Suggestions_SuggestionItem) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Suggestions_SuggestionItem) ProtoMessage() {}
+
+func (x *Suggestions_SuggestionItem) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[27]
+	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 Suggestions_SuggestionItem.ProtoReflect.Descriptor instead.
+func (*Suggestions_SuggestionItem) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{7, 0}
+}
+
+func (m *Suggestions_SuggestionItem) GetContent() isSuggestions_SuggestionItem_Content {
+	if m != nil {
+		return m.Content
+	}
+	return nil
+}
+
+func (x *Suggestions_SuggestionItem) GetText() string {
+	if x, ok := x.GetContent().(*Suggestions_SuggestionItem_Text); ok {
+		return x.Text
+	}
+	return ""
+}
+
+type isSuggestions_SuggestionItem_Content interface {
+	isSuggestions_SuggestionItem_Content()
+}
+
+type Suggestions_SuggestionItem_Text struct {
+	// The value of a suggested input to a text input field. This is
+	// equivalent to what users enter themselves.
+	Text string `protobuf:"bytes,1,opt,name=text,proto3,oneof"`
+}
+
+func (*Suggestions_SuggestionItem_Text) isSuggestions_SuggestionItem_Content() {}
+
+// An item that users can select in a selection input, such as a checkbox
+// or switch.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type SelectionInput_SelectionItem struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The text that identifies or describes the item to users.
+	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// The value associated with this item. The client should use this as a form
+	// input value.
+	//
+	// For details about working with form inputs, see [Receive form
+	// data](https://developers.google.com/workspace/chat/read-form-data).
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	// Whether the item is selected by default. If the selection input only
+	// accepts one value (such as for radio buttons or a dropdown menu), only
+	// set this field for one item.
+	Selected bool `protobuf:"varint,3,opt,name=selected,proto3" json:"selected,omitempty"`
+	// For multiselect menus, the URL for the icon displayed next to
+	// the item's `text` field. Supports PNG and JPEG files. Must be an `HTTPS`
+	// URL. For example,
+	// `https://developers.google.com/workspace/chat/images/quickstart-app-avatar.png`.
+	StartIconUri string `protobuf:"bytes,4,opt,name=start_icon_uri,json=startIconUri,proto3" json:"start_icon_uri,omitempty"`
+	// For multiselect menus, a text description or label that's
+	// displayed below the item's `text` field.
+	BottomText string `protobuf:"bytes,5,opt,name=bottom_text,json=bottomText,proto3" json:"bottom_text,omitempty"`
+}
+
+func (x *SelectionInput_SelectionItem) Reset() {
+	*x = SelectionInput_SelectionItem{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SelectionInput_SelectionItem) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SelectionInput_SelectionItem) ProtoMessage() {}
+
+func (x *SelectionInput_SelectionItem) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[28]
+	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 SelectionInput_SelectionItem.ProtoReflect.Descriptor instead.
+func (*SelectionInput_SelectionItem) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{9, 0}
+}
+
+func (x *SelectionInput_SelectionItem) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+func (x *SelectionInput_SelectionItem) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+func (x *SelectionInput_SelectionItem) GetSelected() bool {
+	if x != nil {
+		return x.Selected
+	}
+	return false
+}
+
+func (x *SelectionInput_SelectionItem) GetStartIconUri() string {
+	if x != nil {
+		return x.StartIconUri
+	}
+	return ""
+}
+
+func (x *SelectionInput_SelectionItem) GetBottomText() string {
+	if x != nil {
+		return x.BottomText
+	}
+	return ""
+}
+
+// For a
+// [`SelectionInput`][google.apps.card.v1.SelectionInput] widget that uses a
+// multiselect menu, a data source from Google Workspace. Used to populate
+// items in a multiselect menu.
+//
+// [Google Chat apps](https://developers.google.com/workspace/chat):
+type SelectionInput_PlatformDataSource struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The data source.
+	//
+	// Types that are assignable to DataSource:
+	//
+	//	*SelectionInput_PlatformDataSource_CommonDataSource_
+	DataSource isSelectionInput_PlatformDataSource_DataSource `protobuf_oneof:"data_source"`
+}
+
+func (x *SelectionInput_PlatformDataSource) Reset() {
+	*x = SelectionInput_PlatformDataSource{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SelectionInput_PlatformDataSource) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SelectionInput_PlatformDataSource) ProtoMessage() {}
+
+func (x *SelectionInput_PlatformDataSource) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[29]
+	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 SelectionInput_PlatformDataSource.ProtoReflect.Descriptor instead.
+func (*SelectionInput_PlatformDataSource) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{9, 1}
+}
+
+func (m *SelectionInput_PlatformDataSource) GetDataSource() isSelectionInput_PlatformDataSource_DataSource {
+	if m != nil {
+		return m.DataSource
+	}
+	return nil
+}
+
+func (x *SelectionInput_PlatformDataSource) GetCommonDataSource() SelectionInput_PlatformDataSource_CommonDataSource {
+	if x, ok := x.GetDataSource().(*SelectionInput_PlatformDataSource_CommonDataSource_); ok {
+		return x.CommonDataSource
+	}
+	return SelectionInput_PlatformDataSource_UNKNOWN
+}
+
+type isSelectionInput_PlatformDataSource_DataSource interface {
+	isSelectionInput_PlatformDataSource_DataSource()
+}
+
+type SelectionInput_PlatformDataSource_CommonDataSource_ struct {
+	// A data source shared by all Google Workspace applications, such as
+	// users in a Google Workspace organization.
+	CommonDataSource SelectionInput_PlatformDataSource_CommonDataSource `protobuf:"varint,1,opt,name=common_data_source,json=commonDataSource,proto3,enum=google.apps.card.v1.SelectionInput_PlatformDataSource_CommonDataSource,oneof"`
+}
+
+func (*SelectionInput_PlatformDataSource_CommonDataSource_) isSelectionInput_PlatformDataSource_DataSource() {
+}
+
+// Represents an item in a grid layout. Items can contain text, an image, or
+// both text and an image.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Grid_GridItem struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A user-specified identifier for this grid item. This identifier is
+	// returned in the parent grid's `onClick` callback parameters.
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// The image that displays in the grid item.
+	Image *ImageComponent `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"`
+	// The grid item's title.
+	Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"`
+	// The grid item's subtitle.
+	Subtitle string `protobuf:"bytes,4,opt,name=subtitle,proto3" json:"subtitle,omitempty"`
+	// The layout to use for the grid item.
+	Layout Grid_GridItem_GridItemLayout `protobuf:"varint,9,opt,name=layout,proto3,enum=google.apps.card.v1.Grid_GridItem_GridItemLayout" json:"layout,omitempty"`
+}
+
+func (x *Grid_GridItem) Reset() {
+	*x = Grid_GridItem{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Grid_GridItem) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Grid_GridItem) ProtoMessage() {}
+
+func (x *Grid_GridItem) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_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 Grid_GridItem.ProtoReflect.Descriptor instead.
+func (*Grid_GridItem) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{17, 0}
+}
+
+func (x *Grid_GridItem) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Grid_GridItem) GetImage() *ImageComponent {
+	if x != nil {
+		return x.Image
+	}
+	return nil
+}
+
+func (x *Grid_GridItem) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *Grid_GridItem) GetSubtitle() string {
+	if x != nil {
+		return x.Subtitle
+	}
+	return ""
+}
+
+func (x *Grid_GridItem) GetLayout() Grid_GridItem_GridItemLayout {
+	if x != nil {
+		return x.Layout
+	}
+	return Grid_GridItem_GRID_ITEM_LAYOUT_UNSPECIFIED
+}
+
+// A column.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+// Columns for Google Workspace Add-ons are in
+// Developer Preview.
+type Columns_Column struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Specifies how a column fills the width of the card.
+	HorizontalSizeStyle Columns_Column_HorizontalSizeStyle `protobuf:"varint,1,opt,name=horizontal_size_style,json=horizontalSizeStyle,proto3,enum=google.apps.card.v1.Columns_Column_HorizontalSizeStyle" json:"horizontal_size_style,omitempty"`
+	// Specifies whether widgets align to the left, right, or center of a
+	// column.
+	HorizontalAlignment Widget_HorizontalAlignment `protobuf:"varint,2,opt,name=horizontal_alignment,json=horizontalAlignment,proto3,enum=google.apps.card.v1.Widget_HorizontalAlignment" json:"horizontal_alignment,omitempty"`
+	// Specifies whether widgets align to the top, bottom, or center of a
+	// column.
+	VerticalAlignment Columns_Column_VerticalAlignment `protobuf:"varint,3,opt,name=vertical_alignment,json=verticalAlignment,proto3,enum=google.apps.card.v1.Columns_Column_VerticalAlignment" json:"vertical_alignment,omitempty"`
+	// An array of widgets included in a column. Widgets appear in the order
+	// that they are specified.
+	Widgets []*Columns_Column_Widgets `protobuf:"bytes,4,rep,name=widgets,proto3" json:"widgets,omitempty"`
+}
+
+func (x *Columns_Column) Reset() {
+	*x = Columns_Column{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Columns_Column) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Columns_Column) ProtoMessage() {}
+
+func (x *Columns_Column) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[31]
+	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 Columns_Column.ProtoReflect.Descriptor instead.
+func (*Columns_Column) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{18, 0}
+}
+
+func (x *Columns_Column) GetHorizontalSizeStyle() Columns_Column_HorizontalSizeStyle {
+	if x != nil {
+		return x.HorizontalSizeStyle
+	}
+	return Columns_Column_HORIZONTAL_SIZE_STYLE_UNSPECIFIED
+}
+
+func (x *Columns_Column) GetHorizontalAlignment() Widget_HorizontalAlignment {
+	if x != nil {
+		return x.HorizontalAlignment
+	}
+	return Widget_HORIZONTAL_ALIGNMENT_UNSPECIFIED
+}
+
+func (x *Columns_Column) GetVerticalAlignment() Columns_Column_VerticalAlignment {
+	if x != nil {
+		return x.VerticalAlignment
+	}
+	return Columns_Column_VERTICAL_ALIGNMENT_UNSPECIFIED
+}
+
+func (x *Columns_Column) GetWidgets() []*Columns_Column_Widgets {
+	if x != nil {
+		return x.Widgets
+	}
+	return nil
+}
+
+// The supported widgets that you can include in a column.
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+// Columns for Google Workspace Add-ons are in
+// Developer Preview.
+type Columns_Column_Widgets struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to Data:
+	//
+	//	*Columns_Column_Widgets_TextParagraph
+	//	*Columns_Column_Widgets_Image
+	//	*Columns_Column_Widgets_DecoratedText
+	//	*Columns_Column_Widgets_ButtonList
+	//	*Columns_Column_Widgets_TextInput
+	//	*Columns_Column_Widgets_SelectionInput
+	//	*Columns_Column_Widgets_DateTimePicker
+	Data isColumns_Column_Widgets_Data `protobuf_oneof:"data"`
+}
+
+func (x *Columns_Column_Widgets) Reset() {
+	*x = Columns_Column_Widgets{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Columns_Column_Widgets) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Columns_Column_Widgets) ProtoMessage() {}
+
+func (x *Columns_Column_Widgets) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[32]
+	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 Columns_Column_Widgets.ProtoReflect.Descriptor instead.
+func (*Columns_Column_Widgets) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{18, 0, 0}
+}
+
+func (m *Columns_Column_Widgets) GetData() isColumns_Column_Widgets_Data {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetTextParagraph() *TextParagraph {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_TextParagraph); ok {
+		return x.TextParagraph
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetImage() *Image {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_Image); ok {
+		return x.Image
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetDecoratedText() *DecoratedText {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_DecoratedText); ok {
+		return x.DecoratedText
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetButtonList() *ButtonList {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_ButtonList); ok {
+		return x.ButtonList
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetTextInput() *TextInput {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_TextInput); ok {
+		return x.TextInput
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetSelectionInput() *SelectionInput {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_SelectionInput); ok {
+		return x.SelectionInput
+	}
+	return nil
+}
+
+func (x *Columns_Column_Widgets) GetDateTimePicker() *DateTimePicker {
+	if x, ok := x.GetData().(*Columns_Column_Widgets_DateTimePicker); ok {
+		return x.DateTimePicker
+	}
+	return nil
+}
+
+type isColumns_Column_Widgets_Data interface {
+	isColumns_Column_Widgets_Data()
+}
+
+type Columns_Column_Widgets_TextParagraph struct {
+	// [TextParagraph][google.apps.card.v1.TextParagraph] widget.
+	TextParagraph *TextParagraph `protobuf:"bytes,1,opt,name=text_paragraph,json=textParagraph,proto3,oneof"`
+}
+
+type Columns_Column_Widgets_Image struct {
+	// [Image][google.apps.card.v1.Image] widget.
+	Image *Image `protobuf:"bytes,2,opt,name=image,proto3,oneof"`
+}
+
+type Columns_Column_Widgets_DecoratedText struct {
+	// [DecoratedText][google.apps.card.v1.DecoratedText] widget.
+	DecoratedText *DecoratedText `protobuf:"bytes,3,opt,name=decorated_text,json=decoratedText,proto3,oneof"`
+}
+
+type Columns_Column_Widgets_ButtonList struct {
+	// [ButtonList][google.apps.card.v1.ButtonList] widget.
+	ButtonList *ButtonList `protobuf:"bytes,4,opt,name=button_list,json=buttonList,proto3,oneof"`
+}
+
+type Columns_Column_Widgets_TextInput struct {
+	// [TextInput][google.apps.card.v1.TextInput] widget.
+	TextInput *TextInput `protobuf:"bytes,5,opt,name=text_input,json=textInput,proto3,oneof"`
+}
+
+type Columns_Column_Widgets_SelectionInput struct {
+	// [SelectionInput][google.apps.card.v1.SelectionInput] widget.
+	SelectionInput *SelectionInput `protobuf:"bytes,6,opt,name=selection_input,json=selectionInput,proto3,oneof"`
+}
+
+type Columns_Column_Widgets_DateTimePicker struct {
+	// [DateTimePicker][google.apps.card.v1.DateTimePicker] widget.
+	DateTimePicker *DateTimePicker `protobuf:"bytes,7,opt,name=date_time_picker,json=dateTimePicker,proto3,oneof"`
+}
+
+func (*Columns_Column_Widgets_TextParagraph) isColumns_Column_Widgets_Data() {}
+
+func (*Columns_Column_Widgets_Image) isColumns_Column_Widgets_Data() {}
+
+func (*Columns_Column_Widgets_DecoratedText) isColumns_Column_Widgets_Data() {}
+
+func (*Columns_Column_Widgets_ButtonList) isColumns_Column_Widgets_Data() {}
+
+func (*Columns_Column_Widgets_TextInput) isColumns_Column_Widgets_Data() {}
+
+func (*Columns_Column_Widgets_SelectionInput) isColumns_Column_Widgets_Data() {}
+
+func (*Columns_Column_Widgets_DateTimePicker) isColumns_Column_Widgets_Data() {}
+
+// List of string parameters to supply when the action method is invoked.
+// For example, consider three snooze buttons: snooze now, snooze one day,
+// or snooze next week. You might use `action method = snooze()`, passing the
+// snooze type and snooze time in the list of string parameters.
+//
+// To learn more, see
+// [`CommonEventObject`](https://developers.google.com/workspace/chat/api/reference/rest/v1/Event#commoneventobject).
+//
+// [Google Workspace Add-ons and Chat
+// apps](https://developers.google.com/workspace/extend):
+type Action_ActionParameter struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the parameter for the action script.
+	Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	// The value of the parameter.
+	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Action_ActionParameter) Reset() {
+	*x = Action_ActionParameter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_google_apps_card_v1_card_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action_ActionParameter) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action_ActionParameter) ProtoMessage() {}
+
+func (x *Action_ActionParameter) ProtoReflect() protoreflect.Message {
+	mi := &file_google_apps_card_v1_card_proto_msgTypes[33]
+	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 Action_ActionParameter.ProtoReflect.Descriptor instead.
+func (*Action_ActionParameter) Descriptor() ([]byte, []int) {
+	return file_google_apps_card_v1_card_proto_rawDescGZIP(), []int{21, 0}
+}
+
+func (x *Action_ActionParameter) GetKey() string {
+	if x != nil {
+		return x.Key
+	}
+	return ""
+}
+
+func (x *Action_ActionParameter) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+var File_google_apps_card_v1_card_proto protoreflect.FileDescriptor
+
+var file_google_apps_card_v1_card_proto_rawDesc = []byte{
+	0x0a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x63, 0x61,
+	0x72, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x13, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61,
+	0x72, 0x64, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79,
+	0x70, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd0,
+	0x0a, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61,
+	0x72, 0x64, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68,
+	0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61,
+	0x72, 0x64, 0x2e, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x15, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+	0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x09, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70,
+	0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x44,
+	0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x52, 0x13, 0x73, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c, 0x65,
+	0x12, 0x47, 0x0a, 0x0c, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72,
+	0x64, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x61,
+	0x72, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a,
+	0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70,
+	0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x43,
+	0x61, 0x72, 0x64, 0x46, 0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x52, 0x0b,
+	0x66, 0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0d, 0x64,
+	0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x44, 0x69,
+	0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70,
+	0x6c, 0x61, 0x79, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x70, 0x65, 0x65, 0x6b,
+	0x5f, 0x63, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x43, 0x61,
+	0x72, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x70, 0x65, 0x65, 0x6b, 0x43, 0x61,
+	0x72, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x1a, 0xc7, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x72,
+	0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a,
+	0x08, 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x69, 0x6d, 0x61,
+	0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64,
+	0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x24, 0x0a, 0x0e,
+	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x41, 0x6c, 0x74, 0x54, 0x65,
+	0x78, 0x74, 0x1a, 0xba, 0x01, 0x0a, 0x07, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16,
+	0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x07, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69,
+	0x64, 0x67, 0x65, 0x74, 0x52, 0x07, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x12, 0x20, 0x0a,
+	0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12,
+	0x3e, 0x0a, 0x1b, 0x75, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x69, 0x62, 0x6c, 0x65,
+	0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x75, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x69,
+	0x62, 0x6c, 0x65, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a,
+	0x68, 0x0a, 0x0a, 0x43, 0x61, 0x72, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a,
+	0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+	0x12, 0x37, 0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b,
+	0x52, 0x07, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x1a, 0x9d, 0x01, 0x0a, 0x0f, 0x43, 0x61,
+	0x72, 0x64, 0x46, 0x69, 0x78, 0x65, 0x64, 0x46, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a,
+	0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x74, 0x74,
+	0x6f, 0x6e, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x75, 0x74, 0x74, 0x6f,
+	0x6e, 0x12, 0x46, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62,
+	0x75, 0x74, 0x74, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76,
+	0x31, 0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64,
+	0x61, 0x72, 0x79, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x0c, 0x44, 0x69, 0x76,
+	0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x49, 0x56,
+	0x49, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x4c, 0x49,
+	0x44, 0x5f, 0x44, 0x49, 0x56, 0x49, 0x44, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e,
+	0x4f, 0x5f, 0x44, 0x49, 0x56, 0x49, 0x44, 0x45, 0x52, 0x10, 0x02, 0x22, 0x44, 0x0a, 0x0c, 0x44,
+	0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x44,
+	0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53,
+	0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x45,
+	0x45, 0x4b, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10,
+	0x02, 0x22, 0x8f, 0x07, 0x0a, 0x06, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0e,
+	0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70,
+	0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x50,
+	0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x65, 0x78, 0x74,
+	0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6d, 0x61,
+	0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x49,
+	0x6d, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x4b, 0x0a,
+	0x0e, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x6f,
+	0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x63,
+	0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x62, 0x75,
+	0x74, 0x74, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61,
+	0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74,
+	0x48, 0x00, 0x52, 0x0a, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3f,
+	0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x70,
+	0x75, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12,
+	0x4e, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x70,
+	0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53,
+	0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52,
+	0x0e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12,
+	0x4f, 0x0a, 0x10, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x69, 0x63,
+	0x6b, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e,
+	0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x48, 0x00,
+	0x52, 0x0e, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72,
+	0x12, 0x38, 0x0a, 0x07, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e,
+	0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48,
+	0x00, 0x52, 0x07, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x04, 0x67, 0x72,
+	0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47,
+	0x72, 0x69, 0x64, 0x48, 0x00, 0x52, 0x04, 0x67, 0x72, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x07, 0x63,
+	0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e,
+	0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f,
+	0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x14, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e,
+	0x74, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70,
+	0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74,
+	0x2e, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x69, 0x67, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x52, 0x13, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c,
+	0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x23, 0x0a, 0x09, 0x49, 0x6d, 0x61,
+	0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x51, 0x55, 0x41, 0x52, 0x45,
+	0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x10, 0x01, 0x22, 0x5b,
+	0x0a, 0x13, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x69, 0x67,
+	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e,
+	0x54, 0x41, 0x4c, 0x5f, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e,
+	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53,
+	0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x45, 0x4e, 0x54, 0x45, 0x52,
+	0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4e, 0x44, 0x10, 0x03, 0x42, 0x06, 0x0a, 0x04, 0x64,
+	0x61, 0x74, 0x61, 0x22, 0x23, 0x0a, 0x0d, 0x54, 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x61, 0x67,
+	0x72, 0x61, 0x70, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x78, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67,
+	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x37,
+	0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63,
+	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x52, 0x07,
+	0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x5f, 0x74,
+	0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x74, 0x54, 0x65,
+	0x78, 0x74, 0x22, 0x09, 0x0a, 0x07, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xb3, 0x06,
+	0x0a, 0x0d, 0x44, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x12,
+	0x31, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64,
+	0x2e, 0x76, 0x31, 0x2e, 0x49, 0x63, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x69, 0x63,
+	0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x63, 0x6f, 0x6e,
+	0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x63, 0x6f,
+	0x6e, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09,
+	0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x74, 0x6f, 0x70, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78,
+	0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a,
+	0x09, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x08, 0x77, 0x72, 0x61, 0x70, 0x54, 0x65, 0x78, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6f,
+	0x74, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x37, 0x0a,
+	0x08, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61,
+	0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x52, 0x07, 0x6f,
+	0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x06, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x74,
+	0x74, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x59, 0x0a,
+	0x0e, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x6f,
+	0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68,
+	0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x77, 0x69, 0x74, 0x63,
+	0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f,
+	0x69, 0x63, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31,
+	0x2e, 0x49, 0x63, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x49, 0x63, 0x6f, 0x6e,
+	0x1a, 0xb5, 0x02, 0x0a, 0x0d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72,
+	0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08,
+	0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,
+	0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x6f, 0x6e, 0x5f, 0x63,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x0e, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x5f, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x6f,
+	0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68,
+	0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x54,
+	0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65,
+	0x22, 0x36, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x0a, 0x0a, 0x06, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43,
+	0x48, 0x45, 0x43, 0x4b, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x48, 0x45,
+	0x43, 0x4b, 0x5f, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74,
+	0x72, 0x6f, 0x6c, 0x22, 0xe1, 0x03, 0x0a, 0x09, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x70, 0x75,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x68,
+	0x69, 0x6e, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x68, 0x69, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37,
+	0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e,
+	0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x79, 0x70,
+	0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x6f, 0x6e, 0x5f, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e,
+	0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e,
+	0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51,
+	0x0a, 0x13, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x69,
+	0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x12, 0x4d, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
+	0x74, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61,
+	0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x61, 0x75,
+	0x74, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x29, 0x0a, 0x10, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f,
+	0x74, 0x65, 0x78, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x6c, 0x61, 0x63,
+	0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x65, 0x78, 0x74, 0x22, 0x2a, 0x0a, 0x04, 0x54,
+	0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4c, 0x49,
+	0x4e, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x4c, 0x45,
+	0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x22, 0x87, 0x01, 0x0a, 0x0b, 0x53, 0x75, 0x67, 0x67,
+	0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67,
+	0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74,
+	0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x31,
+	0x0a, 0x0e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d,
+	0x12, 0x14, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,
+	0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x22, 0x43, 0x0a, 0x0a, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x35, 0x0a, 0x07, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63,
+	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x52, 0x07, 0x62,
+	0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x22, 0xb9, 0x08, 0x0a, 0x0e, 0x53, 0x65, 0x6c, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a,
+	0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61,
+	0x62, 0x65, 0x6c, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e,
+	0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e,
+	0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x53,
+	0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74,
+	0x65, 0x6d, 0x73, 0x12, 0x45, 0x0a, 0x10, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64,
+	0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x6e, 0x43, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x1f, 0x6d, 0x75,
+	0x6c, 0x74, 0x69, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73,
+	0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x1b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,
+	0x4d, 0x61, 0x78, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73,
+	0x12, 0x40, 0x0a, 0x1d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74,
+	0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74,
+	0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x65,
+	0x6c, 0x65, 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67,
+	0x74, 0x68, 0x12, 0x4f, 0x0a, 0x14, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64,
+	0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63,
+	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52,
+	0x12, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x14, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f,
+	0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e,
+	0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44,
+	0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x12, 0x70, 0x6c, 0x61,
+	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a,
+	0x9c, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65,
+	0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73,
+	0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73,
+	0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74,
+	0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x69, 0x12, 0x1f, 0x0a,
+	0x0b, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0a, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x54, 0x65, 0x78, 0x74, 0x1a, 0xc7,
+	0x01, 0x0a, 0x12, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x53,
+	0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f,
+	0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x47, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e,
+	0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x44,
+	0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+	0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x29,
+	0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
+	0x08, 0x0a, 0x04, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x61, 0x74,
+	0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x5c, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x48, 0x45,
+	0x43, 0x4b, 0x5f, 0x42, 0x4f, 0x58, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x41, 0x44, 0x49,
+	0x4f, 0x5f, 0x42, 0x55, 0x54, 0x54, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x57,
+	0x49, 0x54, 0x43, 0x48, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x52, 0x4f, 0x50, 0x44, 0x4f,
+	0x57, 0x4e, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x45,
+	0x4c, 0x45, 0x43, 0x54, 0x10, 0x04, 0x42, 0x1a, 0x0a, 0x18, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f,
+	0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x22, 0xec, 0x02, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50,
+	0x69, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62,
+	0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12,
+	0x4a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64,
+	0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b,
+	0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b, 0x65,
+	0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x73, 0x45, 0x70, 0x6f, 0x63,
+	0x68, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66,
+	0x66, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52,
+	0x12, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x44,
+	0x61, 0x74, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64,
+	0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x6e, 0x43, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x12, 0x44, 0x61,
+	0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
+	0x12, 0x11, 0x0a, 0x0d, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x54, 0x49, 0x4d,
+	0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59,
+	0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10,
+	0x02, 0x22, 0xe5, 0x01, 0x0a, 0x06, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04,
+	0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74,
+	0x12, 0x2d, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72,
+	0x64, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x63, 0x6f, 0x6e, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12,
+	0x28, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x6f, 0x6c,
+	0x6f, 0x72, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x6f, 0x6e, 0x5f,
+	0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76,
+	0x31, 0x2e, 0x4f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x52, 0x07, 0x6f, 0x6e, 0x43, 0x6c, 0x69,
+	0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x19,
+	0x0a, 0x08, 0x61, 0x6c, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x07, 0x61, 0x6c, 0x74, 0x54, 0x65, 0x78, 0x74, 0x22, 0xf8, 0x01, 0x0a, 0x04, 0x49, 0x63,
+	0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0a, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x69, 0x63, 0x6f, 0x6e,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x49,
+	0x63, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c,
+	0x12, 0x48, 0x0a, 0x0d, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x63, 0x6f,
+	0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61,
+	0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x63, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61,
+	0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x49, 0x63, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c,
+	0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c,
+	0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x44, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e,
+	0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65,
+	0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x69,
+	0x63, 0x6f, 0x6e, 0x73, 0x22, 0x64, 0x0a, 0x0c, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c,
+	0x49, 0x63, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x6c,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x6c, 0x12, 0x16, 0x0a, 0x06,
+	0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x65,
+	0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x05, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0xed, 0x01, 0x0a, 0x0e, 0x49,
+	0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x6f, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x45, 0x0a,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76,
+	0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x6f, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x65,
+	0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5f, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x61, 0x73, 0x70, 0x65,
+	0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x22, 0x71, 0x0a, 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65,
+	0x43, 0x72, 0x6f, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x49, 0x4d, 0x41, 0x47,
+	0x45, 0x5f, 0x43, 0x52, 0x4f, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
+	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x51, 0x55,
+	0x41, 0x52, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x10,
+	0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x43, 0x54, 0x41, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x43,
+	0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x43, 0x54, 0x41,
+	0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x34, 0x5f, 0x33, 0x10, 0x04, 0x22, 0xf0, 0x01, 0x0a, 0x0b, 0x42,
+	0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79,
+	0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42,
+	0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x42, 0x6f, 0x72, 0x64, 0x65,
+	0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x73,
+	0x74, 0x72, 0x6f, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e,
+	0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x43, 0x6f, 0x6c,
+	0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x64,
+	0x69, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x6f, 0x72, 0x6e, 0x65,
+	0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x22, 0x44, 0x0a, 0x0a, 0x42, 0x6f, 0x72, 0x64, 0x65,
+	0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f,
+	0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
+	0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x42, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10,
+	0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x4f, 0x4b, 0x45, 0x10, 0x02, 0x22, 0xd1, 0x01,
+	0x0a, 0x0e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,
+	0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x69, 0x12, 0x19, 0x0a,
+	0x08, 0x61, 0x6c, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x61, 0x6c, 0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x72, 0x6f, 0x70,
+	0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e,
+	0x76, 0x31, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x72, 0x6f, 0x70, 0x53, 0x74, 0x79, 0x6c,
+	0x65, 0x52, 0x09, 0x63, 0x72, 0x6f, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x43, 0x0a, 0x0c,
+	0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x53,
+	0x74, 0x79, 0x6c, 0x65, 0x52, 0x0b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c,
+	0x65, 0x22, 0xa0, 0x04, 0x0a, 0x04, 0x47, 0x72, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69,
+	0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65,
+	0x12, 0x38, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61,
+	0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x69, 0x64, 0x2e, 0x47, 0x72, 0x69, 0x64, 0x49,
+	0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x62, 0x6f,
+	0x72, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63,
+	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79,
+	0x6c, 0x65, 0x52, 0x0b, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12,
+	0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x12, 0x37, 0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70,
+	0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x43, 0x6c, 0x69,
+	0x63, 0x6b, 0x52, 0x07, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x1a, 0xa6, 0x02, 0x0a, 0x08,
+	0x47, 0x72, 0x69, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d,
+	0x61, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x6d,
+	0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x62,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x69, 0x64,
+	0x2e, 0x47, 0x72, 0x69, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x47, 0x72, 0x69, 0x64, 0x49, 0x74,
+	0x65, 0x6d, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74,
+	0x22, 0x52, 0x0a, 0x0e, 0x47, 0x72, 0x69, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x4c, 0x61, 0x79, 0x6f,
+	0x75, 0x74, 0x12, 0x20, 0x0a, 0x1c, 0x47, 0x52, 0x49, 0x44, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x5f,
+	0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
+	0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x42, 0x45, 0x4c,
+	0x4f, 0x57, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x41, 0x42, 0x4f,
+	0x56, 0x45, 0x10, 0x02, 0x22, 0xac, 0x09, 0x0a, 0x07, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73,
+	0x12, 0x46, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c,
+	0x75, 0x6d, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c,
+	0x75, 0x6d, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0xd8, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6c,
+	0x75, 0x6d, 0x6e, 0x12, 0x6b, 0x0a, 0x15, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61,
+	0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73,
+	0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73,
+	0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2e, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74,
+	0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x52, 0x13, 0x68, 0x6f, 0x72,
+	0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65,
+	0x12, 0x62, 0x0a, 0x14, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x61,
+	0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72,
+	0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2e, 0x48, 0x6f, 0x72, 0x69,
+	0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52,
+	0x13, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x69, 0x67, 0x6e,
+	0x6d, 0x65, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x12, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c,
+	0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63,
+	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x2e, 0x43,
+	0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x6c,
+	0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61,
+	0x6c, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x07, 0x77, 0x69,
+	0x64, 0x67, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76,
+	0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+	0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x52, 0x07, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
+	0x73, 0x1a, 0x85, 0x04, 0x0a, 0x07, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x12, 0x4b, 0x0a,
+	0x0e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74,
+	0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x65, 0x78,
+	0x74, 0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x32, 0x0a, 0x05, 0x69, 0x6d,
+	0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e,
+	0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x4b,
+	0x0a, 0x0e, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x78, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63,
+	0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65,
+	0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x62,
+	0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63,
+	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x69, 0x73,
+	0x74, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x3f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70,
+	0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6e,
+	0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74,
+	0x12, 0x4e, 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e,
+	0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e,
+	0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x00,
+	0x52, 0x0e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74,
+	0x12, 0x4f, 0x0a, 0x10, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x69,
+	0x63, 0x6b, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31,
+	0x2e, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x48,
+	0x00, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x69, 0x63, 0x6b, 0x65,
+	0x72, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6e, 0x0a, 0x13, 0x48, 0x6f, 0x72,
+	0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65,
+	0x12, 0x25, 0x0a, 0x21, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x53,
+	0x49, 0x5a, 0x45, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
+	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x49, 0x4c, 0x4c, 0x5f,
+	0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10,
+	0x01, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x49, 0x4c, 0x4c, 0x5f, 0x4d, 0x49, 0x4e, 0x49, 0x4d, 0x55,
+	0x4d, 0x5f, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x02, 0x22, 0x58, 0x0a, 0x11, 0x56, 0x65, 0x72,
+	0x74, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22,
+	0x0a, 0x1e, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x41, 0x4c, 0x49, 0x47, 0x4e,
+	0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
+	0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x07,
+	0x0a, 0x03, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x4f, 0x54, 0x54, 0x4f,
+	0x4d, 0x10, 0x03, 0x22, 0x8f, 0x02, 0x0a, 0x07, 0x4f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12,
+	0x35, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61,
+	0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x06,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x6c,
+	0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e,
+	0x4f, 0x70, 0x65, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x6e,
+	0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x56, 0x0a, 0x18, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x64, 0x79, 0x6e,
+	0x61, 0x6d, 0x69, 0x63, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x6f, 0x70, 0x65, 0x6e, 0x44, 0x79, 0x6e, 0x61, 0x6d,
+	0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04,
+	0x63, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31,
+	0x2e, 0x43, 0x61, 0x72, 0x64, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x72, 0x64, 0x42, 0x06, 0x0a,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe7, 0x01, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x6e, 0x4c, 0x69,
+	0x6e, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x75, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x61, 0x73, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
+	0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x73, 0x52, 0x06, 0x6f, 0x70, 0x65,
+	0x6e, 0x41, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
+	0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e,
+	0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x4f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x07, 0x6f, 0x6e,
+	0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x73, 0x12,
+	0x0d, 0x0a, 0x09, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x00, 0x12, 0x0b,
+	0x0a, 0x07, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x41, 0x59, 0x10, 0x01, 0x22, 0x22, 0x0a, 0x07, 0x4f,
+	0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x54, 0x48, 0x49, 0x4e,
+	0x47, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x01, 0x22,
+	0xd5, 0x03, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75,
+	0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75,
+	0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
+	0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31,
+	0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61,
+	0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
+	0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x69,
+	0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64, 0x2e, 0x76,
+	0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x64,
+	0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x64, 0x69,
+	0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74,
+	0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x70,
+	0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0b,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e,
+	0x63, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 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, 0x22, 0x26, 0x0a, 0x0d, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61,
+	0x74, 0x6f, 0x72, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x50, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00,
+	0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x22, 0x3b, 0x0a, 0x0b, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x4e, 0x54,
+	0x45, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
+	0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x45, 0x4e, 0x5f, 0x44,
+	0x49, 0x41, 0x4c, 0x4f, 0x47, 0x10, 0x01, 0x42, 0xa4, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x73, 0x2e, 0x63, 0x61, 0x72, 0x64,
+	0x2e, 0x76, 0x31, 0x42, 0x09, 0x43, 0x61, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
+	0x5a, 0x37, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e,
+	0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x63, 0x61, 0x72,
+	0x64, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x61, 0x72, 0x64, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x73, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x2e, 0x56, 0x31, 0xca,
+	0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x70, 0x70, 0x73, 0x5c, 0x43, 0x61,
+	0x72, 0x64, 0x5c, 0x56, 0x31, 0xea, 0x02, 0x16, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a,
+	0x41, 0x70, 0x70, 0x73, 0x3a, 0x3a, 0x43, 0x61, 0x72, 0x64, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_google_apps_card_v1_card_proto_rawDescOnce sync.Once
+	file_google_apps_card_v1_card_proto_rawDescData = file_google_apps_card_v1_card_proto_rawDesc
+)
+
+func file_google_apps_card_v1_card_proto_rawDescGZIP() []byte {
+	file_google_apps_card_v1_card_proto_rawDescOnce.Do(func() {
+		file_google_apps_card_v1_card_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_apps_card_v1_card_proto_rawDescData)
+	})
+	return file_google_apps_card_v1_card_proto_rawDescData
+}
+
+var file_google_apps_card_v1_card_proto_enumTypes = make([]protoimpl.EnumInfo, 18)
+var file_google_apps_card_v1_card_proto_msgTypes = make([]protoimpl.MessageInfo, 34)
+var file_google_apps_card_v1_card_proto_goTypes = []interface{}{
+	(Card_DividerStyle)(0),                                  // 0: google.apps.card.v1.Card.DividerStyle
+	(Card_DisplayStyle)(0),                                  // 1: google.apps.card.v1.Card.DisplayStyle
+	(Widget_ImageType)(0),                                   // 2: google.apps.card.v1.Widget.ImageType
+	(Widget_HorizontalAlignment)(0),                         // 3: google.apps.card.v1.Widget.HorizontalAlignment
+	(DecoratedText_SwitchControl_ControlType)(0),            // 4: google.apps.card.v1.DecoratedText.SwitchControl.ControlType
+	(TextInput_Type)(0),                                     // 5: google.apps.card.v1.TextInput.Type
+	(SelectionInput_SelectionType)(0),                       // 6: google.apps.card.v1.SelectionInput.SelectionType
+	(SelectionInput_PlatformDataSource_CommonDataSource)(0), // 7: google.apps.card.v1.SelectionInput.PlatformDataSource.CommonDataSource
+	(DateTimePicker_DateTimePickerType)(0),                  // 8: google.apps.card.v1.DateTimePicker.DateTimePickerType
+	(ImageCropStyle_ImageCropType)(0),                       // 9: google.apps.card.v1.ImageCropStyle.ImageCropType
+	(BorderStyle_BorderType)(0),                             // 10: google.apps.card.v1.BorderStyle.BorderType
+	(Grid_GridItem_GridItemLayout)(0),                       // 11: google.apps.card.v1.Grid.GridItem.GridItemLayout
+	(Columns_Column_HorizontalSizeStyle)(0),                 // 12: google.apps.card.v1.Columns.Column.HorizontalSizeStyle
+	(Columns_Column_VerticalAlignment)(0),                   // 13: google.apps.card.v1.Columns.Column.VerticalAlignment
+	(OpenLink_OpenAs)(0),                                    // 14: google.apps.card.v1.OpenLink.OpenAs
+	(OpenLink_OnClose)(0),                                   // 15: google.apps.card.v1.OpenLink.OnClose
+	(Action_LoadIndicator)(0),                               // 16: google.apps.card.v1.Action.LoadIndicator
+	(Action_Interaction)(0),                                 // 17: google.apps.card.v1.Action.Interaction
+	(*Card)(nil),                                            // 18: google.apps.card.v1.Card
+	(*Widget)(nil),                                          // 19: google.apps.card.v1.Widget
+	(*TextParagraph)(nil),                                   // 20: google.apps.card.v1.TextParagraph
+	(*Image)(nil),                                           // 21: google.apps.card.v1.Image
+	(*Divider)(nil),                                         // 22: google.apps.card.v1.Divider
+	(*DecoratedText)(nil),                                   // 23: google.apps.card.v1.DecoratedText
+	(*TextInput)(nil),                                       // 24: google.apps.card.v1.TextInput
+	(*Suggestions)(nil),                                     // 25: google.apps.card.v1.Suggestions
+	(*ButtonList)(nil),                                      // 26: google.apps.card.v1.ButtonList
+	(*SelectionInput)(nil),                                  // 27: google.apps.card.v1.SelectionInput
+	(*DateTimePicker)(nil),                                  // 28: google.apps.card.v1.DateTimePicker
+	(*Button)(nil),                                          // 29: google.apps.card.v1.Button
+	(*Icon)(nil),                                            // 30: google.apps.card.v1.Icon
+	(*MaterialIcon)(nil),                                    // 31: google.apps.card.v1.MaterialIcon
+	(*ImageCropStyle)(nil),                                  // 32: google.apps.card.v1.ImageCropStyle
+	(*BorderStyle)(nil),                                     // 33: google.apps.card.v1.BorderStyle
+	(*ImageComponent)(nil),                                  // 34: google.apps.card.v1.ImageComponent
+	(*Grid)(nil),                                            // 35: google.apps.card.v1.Grid
+	(*Columns)(nil),                                         // 36: google.apps.card.v1.Columns
+	(*OnClick)(nil),                                         // 37: google.apps.card.v1.OnClick
+	(*OpenLink)(nil),                                        // 38: google.apps.card.v1.OpenLink
+	(*Action)(nil),                                          // 39: google.apps.card.v1.Action
+	(*Card_CardHeader)(nil),                                 // 40: google.apps.card.v1.Card.CardHeader
+	(*Card_Section)(nil),                                    // 41: google.apps.card.v1.Card.Section
+	(*Card_CardAction)(nil),                                 // 42: google.apps.card.v1.Card.CardAction
+	(*Card_CardFixedFooter)(nil),                            // 43: google.apps.card.v1.Card.CardFixedFooter
+	(*DecoratedText_SwitchControl)(nil),                     // 44: google.apps.card.v1.DecoratedText.SwitchControl
+	(*Suggestions_SuggestionItem)(nil),                      // 45: google.apps.card.v1.Suggestions.SuggestionItem
+	(*SelectionInput_SelectionItem)(nil),                    // 46: google.apps.card.v1.SelectionInput.SelectionItem
+	(*SelectionInput_PlatformDataSource)(nil),               // 47: google.apps.card.v1.SelectionInput.PlatformDataSource
+	(*Grid_GridItem)(nil),                                   // 48: google.apps.card.v1.Grid.GridItem
+	(*Columns_Column)(nil),                                  // 49: google.apps.card.v1.Columns.Column
+	(*Columns_Column_Widgets)(nil),                          // 50: google.apps.card.v1.Columns.Column.Widgets
+	(*Action_ActionParameter)(nil),                          // 51: google.apps.card.v1.Action.ActionParameter
+	(*color.Color)(nil),                                     // 52: google.type.Color
+}
+var file_google_apps_card_v1_card_proto_depIdxs = []int32{
+	40, // 0: google.apps.card.v1.Card.header:type_name -> google.apps.card.v1.Card.CardHeader
+	41, // 1: google.apps.card.v1.Card.sections:type_name -> google.apps.card.v1.Card.Section
+	0,  // 2: google.apps.card.v1.Card.section_divider_style:type_name -> google.apps.card.v1.Card.DividerStyle
+	42, // 3: google.apps.card.v1.Card.card_actions:type_name -> google.apps.card.v1.Card.CardAction
+	43, // 4: google.apps.card.v1.Card.fixed_footer:type_name -> google.apps.card.v1.Card.CardFixedFooter
+	1,  // 5: google.apps.card.v1.Card.display_style:type_name -> google.apps.card.v1.Card.DisplayStyle
+	40, // 6: google.apps.card.v1.Card.peek_card_header:type_name -> google.apps.card.v1.Card.CardHeader
+	20, // 7: google.apps.card.v1.Widget.text_paragraph:type_name -> google.apps.card.v1.TextParagraph
+	21, // 8: google.apps.card.v1.Widget.image:type_name -> google.apps.card.v1.Image
+	23, // 9: google.apps.card.v1.Widget.decorated_text:type_name -> google.apps.card.v1.DecoratedText
+	26, // 10: google.apps.card.v1.Widget.button_list:type_name -> google.apps.card.v1.ButtonList
+	24, // 11: google.apps.card.v1.Widget.text_input:type_name -> google.apps.card.v1.TextInput
+	27, // 12: google.apps.card.v1.Widget.selection_input:type_name -> google.apps.card.v1.SelectionInput
+	28, // 13: google.apps.card.v1.Widget.date_time_picker:type_name -> google.apps.card.v1.DateTimePicker
+	22, // 14: google.apps.card.v1.Widget.divider:type_name -> google.apps.card.v1.Divider
+	35, // 15: google.apps.card.v1.Widget.grid:type_name -> google.apps.card.v1.Grid
+	36, // 16: google.apps.card.v1.Widget.columns:type_name -> google.apps.card.v1.Columns
+	3,  // 17: google.apps.card.v1.Widget.horizontal_alignment:type_name -> google.apps.card.v1.Widget.HorizontalAlignment
+	37, // 18: google.apps.card.v1.Image.on_click:type_name -> google.apps.card.v1.OnClick
+	30, // 19: google.apps.card.v1.DecoratedText.icon:type_name -> google.apps.card.v1.Icon
+	30, // 20: google.apps.card.v1.DecoratedText.start_icon:type_name -> google.apps.card.v1.Icon
+	37, // 21: google.apps.card.v1.DecoratedText.on_click:type_name -> google.apps.card.v1.OnClick
+	29, // 22: google.apps.card.v1.DecoratedText.button:type_name -> google.apps.card.v1.Button
+	44, // 23: google.apps.card.v1.DecoratedText.switch_control:type_name -> google.apps.card.v1.DecoratedText.SwitchControl
+	30, // 24: google.apps.card.v1.DecoratedText.end_icon:type_name -> google.apps.card.v1.Icon
+	5,  // 25: google.apps.card.v1.TextInput.type:type_name -> google.apps.card.v1.TextInput.Type
+	39, // 26: google.apps.card.v1.TextInput.on_change_action:type_name -> google.apps.card.v1.Action
+	25, // 27: google.apps.card.v1.TextInput.initial_suggestions:type_name -> google.apps.card.v1.Suggestions
+	39, // 28: google.apps.card.v1.TextInput.auto_complete_action:type_name -> google.apps.card.v1.Action
+	45, // 29: google.apps.card.v1.Suggestions.items:type_name -> google.apps.card.v1.Suggestions.SuggestionItem
+	29, // 30: google.apps.card.v1.ButtonList.buttons:type_name -> google.apps.card.v1.Button
+	6,  // 31: google.apps.card.v1.SelectionInput.type:type_name -> google.apps.card.v1.SelectionInput.SelectionType
+	46, // 32: google.apps.card.v1.SelectionInput.items:type_name -> google.apps.card.v1.SelectionInput.SelectionItem
+	39, // 33: google.apps.card.v1.SelectionInput.on_change_action:type_name -> google.apps.card.v1.Action
+	39, // 34: google.apps.card.v1.SelectionInput.external_data_source:type_name -> google.apps.card.v1.Action
+	47, // 35: google.apps.card.v1.SelectionInput.platform_data_source:type_name -> google.apps.card.v1.SelectionInput.PlatformDataSource
+	8,  // 36: google.apps.card.v1.DateTimePicker.type:type_name -> google.apps.card.v1.DateTimePicker.DateTimePickerType
+	39, // 37: google.apps.card.v1.DateTimePicker.on_change_action:type_name -> google.apps.card.v1.Action
+	30, // 38: google.apps.card.v1.Button.icon:type_name -> google.apps.card.v1.Icon
+	52, // 39: google.apps.card.v1.Button.color:type_name -> google.type.Color
+	37, // 40: google.apps.card.v1.Button.on_click:type_name -> google.apps.card.v1.OnClick
+	31, // 41: google.apps.card.v1.Icon.material_icon:type_name -> google.apps.card.v1.MaterialIcon
+	2,  // 42: google.apps.card.v1.Icon.image_type:type_name -> google.apps.card.v1.Widget.ImageType
+	9,  // 43: google.apps.card.v1.ImageCropStyle.type:type_name -> google.apps.card.v1.ImageCropStyle.ImageCropType
+	10, // 44: google.apps.card.v1.BorderStyle.type:type_name -> google.apps.card.v1.BorderStyle.BorderType
+	52, // 45: google.apps.card.v1.BorderStyle.stroke_color:type_name -> google.type.Color
+	32, // 46: google.apps.card.v1.ImageComponent.crop_style:type_name -> google.apps.card.v1.ImageCropStyle
+	33, // 47: google.apps.card.v1.ImageComponent.border_style:type_name -> google.apps.card.v1.BorderStyle
+	48, // 48: google.apps.card.v1.Grid.items:type_name -> google.apps.card.v1.Grid.GridItem
+	33, // 49: google.apps.card.v1.Grid.border_style:type_name -> google.apps.card.v1.BorderStyle
+	37, // 50: google.apps.card.v1.Grid.on_click:type_name -> google.apps.card.v1.OnClick
+	49, // 51: google.apps.card.v1.Columns.column_items:type_name -> google.apps.card.v1.Columns.Column
+	39, // 52: google.apps.card.v1.OnClick.action:type_name -> google.apps.card.v1.Action
+	38, // 53: google.apps.card.v1.OnClick.open_link:type_name -> google.apps.card.v1.OpenLink
+	39, // 54: google.apps.card.v1.OnClick.open_dynamic_link_action:type_name -> google.apps.card.v1.Action
+	18, // 55: google.apps.card.v1.OnClick.card:type_name -> google.apps.card.v1.Card
+	14, // 56: google.apps.card.v1.OpenLink.open_as:type_name -> google.apps.card.v1.OpenLink.OpenAs
+	15, // 57: google.apps.card.v1.OpenLink.on_close:type_name -> google.apps.card.v1.OpenLink.OnClose
+	51, // 58: google.apps.card.v1.Action.parameters:type_name -> google.apps.card.v1.Action.ActionParameter
+	16, // 59: google.apps.card.v1.Action.load_indicator:type_name -> google.apps.card.v1.Action.LoadIndicator
+	17, // 60: google.apps.card.v1.Action.interaction:type_name -> google.apps.card.v1.Action.Interaction
+	2,  // 61: google.apps.card.v1.Card.CardHeader.image_type:type_name -> google.apps.card.v1.Widget.ImageType
+	19, // 62: google.apps.card.v1.Card.Section.widgets:type_name -> google.apps.card.v1.Widget
+	37, // 63: google.apps.card.v1.Card.CardAction.on_click:type_name -> google.apps.card.v1.OnClick
+	29, // 64: google.apps.card.v1.Card.CardFixedFooter.primary_button:type_name -> google.apps.card.v1.Button
+	29, // 65: google.apps.card.v1.Card.CardFixedFooter.secondary_button:type_name -> google.apps.card.v1.Button
+	39, // 66: google.apps.card.v1.DecoratedText.SwitchControl.on_change_action:type_name -> google.apps.card.v1.Action
+	4,  // 67: google.apps.card.v1.DecoratedText.SwitchControl.control_type:type_name -> google.apps.card.v1.DecoratedText.SwitchControl.ControlType
+	7,  // 68: google.apps.card.v1.SelectionInput.PlatformDataSource.common_data_source:type_name -> google.apps.card.v1.SelectionInput.PlatformDataSource.CommonDataSource
+	34, // 69: google.apps.card.v1.Grid.GridItem.image:type_name -> google.apps.card.v1.ImageComponent
+	11, // 70: google.apps.card.v1.Grid.GridItem.layout:type_name -> google.apps.card.v1.Grid.GridItem.GridItemLayout
+	12, // 71: google.apps.card.v1.Columns.Column.horizontal_size_style:type_name -> google.apps.card.v1.Columns.Column.HorizontalSizeStyle
+	3,  // 72: google.apps.card.v1.Columns.Column.horizontal_alignment:type_name -> google.apps.card.v1.Widget.HorizontalAlignment
+	13, // 73: google.apps.card.v1.Columns.Column.vertical_alignment:type_name -> google.apps.card.v1.Columns.Column.VerticalAlignment
+	50, // 74: google.apps.card.v1.Columns.Column.widgets:type_name -> google.apps.card.v1.Columns.Column.Widgets
+	20, // 75: google.apps.card.v1.Columns.Column.Widgets.text_paragraph:type_name -> google.apps.card.v1.TextParagraph
+	21, // 76: google.apps.card.v1.Columns.Column.Widgets.image:type_name -> google.apps.card.v1.Image
+	23, // 77: google.apps.card.v1.Columns.Column.Widgets.decorated_text:type_name -> google.apps.card.v1.DecoratedText
+	26, // 78: google.apps.card.v1.Columns.Column.Widgets.button_list:type_name -> google.apps.card.v1.ButtonList
+	24, // 79: google.apps.card.v1.Columns.Column.Widgets.text_input:type_name -> google.apps.card.v1.TextInput
+	27, // 80: google.apps.card.v1.Columns.Column.Widgets.selection_input:type_name -> google.apps.card.v1.SelectionInput
+	28, // 81: google.apps.card.v1.Columns.Column.Widgets.date_time_picker:type_name -> google.apps.card.v1.DateTimePicker
+	82, // [82:82] is the sub-list for method output_type
+	82, // [82:82] is the sub-list for method input_type
+	82, // [82:82] is the sub-list for extension type_name
+	82, // [82:82] is the sub-list for extension extendee
+	0,  // [0:82] is the sub-list for field type_name
+}
+
+func init() { file_google_apps_card_v1_card_proto_init() }
+func file_google_apps_card_v1_card_proto_init() {
+	if File_google_apps_card_v1_card_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_google_apps_card_v1_card_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Card); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Widget); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TextParagraph); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Image); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Divider); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DecoratedText); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TextInput); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Suggestions); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ButtonList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SelectionInput); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DateTimePicker); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Button); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Icon); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MaterialIcon); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ImageCropStyle); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BorderStyle); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ImageComponent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Grid); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Columns); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OnClick); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OpenLink); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Card_CardHeader); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Card_Section); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Card_CardAction); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Card_CardFixedFooter); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DecoratedText_SwitchControl); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Suggestions_SuggestionItem); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SelectionInput_SelectionItem); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SelectionInput_PlatformDataSource); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Grid_GridItem); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Columns_Column); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Columns_Column_Widgets); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_apps_card_v1_card_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action_ActionParameter); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[1].OneofWrappers = []interface{}{
+		(*Widget_TextParagraph)(nil),
+		(*Widget_Image)(nil),
+		(*Widget_DecoratedText)(nil),
+		(*Widget_ButtonList)(nil),
+		(*Widget_TextInput)(nil),
+		(*Widget_SelectionInput)(nil),
+		(*Widget_DateTimePicker)(nil),
+		(*Widget_Divider)(nil),
+		(*Widget_Grid)(nil),
+		(*Widget_Columns)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[5].OneofWrappers = []interface{}{
+		(*DecoratedText_Button)(nil),
+		(*DecoratedText_SwitchControl_)(nil),
+		(*DecoratedText_EndIcon)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[9].OneofWrappers = []interface{}{
+		(*SelectionInput_ExternalDataSource)(nil),
+		(*SelectionInput_PlatformDataSource_)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[12].OneofWrappers = []interface{}{
+		(*Icon_KnownIcon)(nil),
+		(*Icon_IconUrl)(nil),
+		(*Icon_MaterialIcon)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[19].OneofWrappers = []interface{}{
+		(*OnClick_Action)(nil),
+		(*OnClick_OpenLink)(nil),
+		(*OnClick_OpenDynamicLinkAction)(nil),
+		(*OnClick_Card)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[27].OneofWrappers = []interface{}{
+		(*Suggestions_SuggestionItem_Text)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[29].OneofWrappers = []interface{}{
+		(*SelectionInput_PlatformDataSource_CommonDataSource_)(nil),
+	}
+	file_google_apps_card_v1_card_proto_msgTypes[32].OneofWrappers = []interface{}{
+		(*Columns_Column_Widgets_TextParagraph)(nil),
+		(*Columns_Column_Widgets_Image)(nil),
+		(*Columns_Column_Widgets_DecoratedText)(nil),
+		(*Columns_Column_Widgets_ButtonList)(nil),
+		(*Columns_Column_Widgets_TextInput)(nil),
+		(*Columns_Column_Widgets_SelectionInput)(nil),
+		(*Columns_Column_Widgets_DateTimePicker)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_google_apps_card_v1_card_proto_rawDesc,
+			NumEnums:      18,
+			NumMessages:   34,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_google_apps_card_v1_card_proto_goTypes,
+		DependencyIndexes: file_google_apps_card_v1_card_proto_depIdxs,
+		EnumInfos:         file_google_apps_card_v1_card_proto_enumTypes,
+		MessageInfos:      file_google_apps_card_v1_card_proto_msgTypes,
+	}.Build()
+	File_google_apps_card_v1_card_proto = out.File
+	file_google_apps_card_v1_card_proto_rawDesc = nil
+	file_google_apps_card_v1_card_proto_goTypes = nil
+	file_google_apps_card_v1_card_proto_depIdxs = nil
+}
diff --git a/regen.txt b/regen.txt
index 631a229..8b5940d 100644
--- a/regen.txt
+++ b/regen.txt
@@ -1 +1 @@
-1cbeafa1527735b8c0cec1112be169b146892c48
\ No newline at end of file
+436a34a5da04978e98859afe7487ce93d08e9c03
\ No newline at end of file
