Update protocol buffer messages for the booking server test client
diff --git a/api/api.go b/api/api.go
index 3d487fa..94ceb5b 100644
--- a/api/api.go
+++ b/api/api.go
@@ -438,11 +438,6 @@
 		return fmt.Errorf("CheckOrderFulfillability: Could not parse HTTP response to pb3: %v", err)
 	}
 
-	// Price is difficult to verify without knowing aggregator specific taxes/fees. We only check that it is present.
-	if resp.GetFeesAndTaxes() == nil || cmp.Diff(fpb.Price{}, *resp.GetFeesAndTaxes(), cmp.Comparer(proto.Equal)) == "" {
-		return fmt.Errorf("invalid response. CheckOrderFulfillability.FeesAndTaxes must be populated. Offending response: %v", resp)
-	}
-
 	orderFulfillability := resp.GetFulfillability()
 	// TODO(ccawdrey): Add validation cases for other OrderFulFillability enums.
 	if diff := cmp.Diff(orderFulfillability.GetResult(), mpb.OrderFulfillability_CAN_FULFILL); diff != "" {
diff --git a/feeds/feeds.pb.go b/feeds/feeds.pb.go
index 3766f8b..d64e87c 100644
--- a/feeds/feeds.pb.go
+++ b/feeds/feeds.pb.go
@@ -1,13 +1,39 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: feeds.proto
+// source: github.com/maps-booking-v3/feeds/feeds.proto
 
+/*
+Package maps_booking_feeds is a generated protocol buffer package.
+
+It is generated from these files:
+	github.com/maps-booking-v3/feeds/feeds.proto
+
+It has these top-level messages:
+	FeedMetadata
+	AvailabilityFeed
+	ServiceAvailability
+	Availability
+	Resources
+	TimeRange
+	ServiceFeed
+	Service
+	Price
+	SchedulingRules
+	TaxRate
+	ServiceIntakeFormField
+	ServiceIntakeForm
+	Deposit
+	NoShowFee
+	ActionLink
+	TicketType
+	RelatedMedia
+	ServiceAttributeValueId
+	WaitlistRules
+*/
 package maps_booking_feeds
 
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
-)
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -39,7 +65,6 @@
 	0: "FIXED_RATE_DEFAULT",
 	1: "PER_PERSON",
 }
-
 var PriceType_value = map[string]int32{
 	"FIXED_RATE_DEFAULT": 0,
 	"PER_PERSON":         1,
@@ -48,10 +73,7 @@
 func (x PriceType) String() string {
 	return proto.EnumName(PriceType_name, int32(x))
 }
-
-func (PriceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
-}
+func (PriceType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
 
 // Defines whether a credit card is required in order to book an appointment.
 type RequireCreditCard int32
@@ -76,7 +98,6 @@
 	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
 	2: "REQUIRE_CREDIT_CARD_ALWAYS",
 }
-
 var RequireCreditCard_value = map[string]int32{
 	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
 	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
@@ -86,10 +107,7 @@
 func (x RequireCreditCard) String() string {
 	return proto.EnumName(RequireCreditCard_name, int32(x))
 }
-
-func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
-}
+func (RequireCreditCard) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
 
 // The platform that the action is performed on. Web application is the general
 // fallback. It is recommended to have at least one ActionLink with
@@ -117,7 +135,6 @@
 	3: "ACTION_PLATFORM_ANDROID",
 	4: "ACTION_PLATFORM_IOS",
 }
-
 var ActionPlatform_value = map[string]int32{
 	"ACTION_PLATFORM_UNSPECIFIED":     0,
 	"ACTION_PLATFORM_WEB_APPLICATION": 1,
@@ -129,10 +146,7 @@
 func (x ActionPlatform) String() string {
 	return proto.EnumName(ActionPlatform_name, int32(x))
 }
-
-func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
-}
+func (ActionPlatform) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
 
 type FeedMetadata_ProcessingInstruction int32
 
@@ -153,7 +167,6 @@
 	1: "PROCESS_AS_COMPLETE",
 	2: "PROCESS_AS_INCREMENTAL",
 }
-
 var FeedMetadata_ProcessingInstruction_value = map[string]int32{
 	"PROCESS_UNKNOWN":        0,
 	"PROCESS_AS_COMPLETE":    1,
@@ -163,9 +176,8 @@
 func (x FeedMetadata_ProcessingInstruction) String() string {
 	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
 }
-
 func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{0, 0}
+	return fileDescriptor0, []int{0, 0}
 }
 
 // Enum to indicate the prepayment type.
@@ -189,7 +201,6 @@
 	2: "OPTIONAL",
 	3: "NOT_SUPPORTED",
 }
-
 var Service_PrepaymentType_value = map[string]int32{
 	"PREPAYMENT_TYPE_UNSPECIFIED": 0,
 	"REQUIRED":                    1,
@@ -200,10 +211,7 @@
 func (x Service_PrepaymentType) String() string {
 	return proto.EnumName(Service_PrepaymentType_name, int32(x))
 }
-
-func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 0}
-}
+func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} }
 
 type Service_ServiceType int32
 
@@ -222,7 +230,6 @@
 	3: "SERVICE_TYPE_EVENT_TICKET",
 	4: "SERVICE_TYPE_TRIP_TOUR",
 }
-
 var Service_ServiceType_value = map[string]int32{
 	"SERVICE_TYPE_UNSPECIFIED":        0,
 	"SERVICE_TYPE_DINING_RESERVATION": 1,
@@ -234,9 +241,62 @@
 func (x Service_ServiceType) String() string {
 	return proto.EnumName(Service_ServiceType_name, int32(x))
 }
+func (Service_ServiceType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 1} }
 
-func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 1}
+// The admission policy of this service.
+type SchedulingRules_AdmissionPolicy int32
+
+const (
+	// Unused.
+	SchedulingRules_ADMISSION_POLICY_UNSPECIFIED SchedulingRules_AdmissionPolicy = 0
+	// Customers are required to be present at the start time of the
+	// availability slot, and the service is expected to finish at the
+	// end time of the slot.
+	// Examples of TIME_STRICT use cases:
+	//   * A tour that starts at 9am that requires all attendees to arrive
+	//     at the start time, and returns at around 12pm.
+	//   * A haircut reservation at 3pm on Saturday that will take approximately
+	//   30 minutes.
+	//   * A fitness class from 6pm to 8pm.
+	SchedulingRules_TIME_STRICT SchedulingRules_AdmissionPolicy = 1
+	// Customers can arrive at any time between the start and end time of the
+	// availability slot to use this booking.
+	//
+	// Examples of TIME_FLEXIBLE use cases:
+	//   * A museum ticket that can be used during any time on the purchase
+	//     date.
+	//   * An afternoon admission to an amusement park that can be used from
+	//     12pm to 9pm.
+	SchedulingRules_TIME_FLEXIBLE SchedulingRules_AdmissionPolicy = 2
+	// Customers need to arrive at the merchant at the start time of the
+	// availability slot but can leave any time they want.
+	//
+	// For example, in the museum admission scenario, a timed entry ticket
+	// for 10am requires the user to be at the museum at 10am. The start time of
+	// availability slots for this service represents the designated entry
+	// time. The end time, however, is used solely as a key to identify the
+	// availability slot for booking.
+	SchedulingRules_TIMED_ENTRY_WITH_FLEXIBLE_DURATION SchedulingRules_AdmissionPolicy = 3
+)
+
+var SchedulingRules_AdmissionPolicy_name = map[int32]string{
+	0: "ADMISSION_POLICY_UNSPECIFIED",
+	1: "TIME_STRICT",
+	2: "TIME_FLEXIBLE",
+	3: "TIMED_ENTRY_WITH_FLEXIBLE_DURATION",
+}
+var SchedulingRules_AdmissionPolicy_value = map[string]int32{
+	"ADMISSION_POLICY_UNSPECIFIED":       0,
+	"TIME_STRICT":                        1,
+	"TIME_FLEXIBLE":                      2,
+	"TIMED_ENTRY_WITH_FLEXIBLE_DURATION": 3,
+}
+
+func (x SchedulingRules_AdmissionPolicy) String() string {
+	return proto.EnumName(SchedulingRules_AdmissionPolicy_name, int32(x))
+}
+func (SchedulingRules_AdmissionPolicy) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor0, []int{9, 0}
 }
 
 // Enum to indicate the type of field.
@@ -268,7 +328,6 @@
 	5: "DROPDOWN",
 	6: "BOOLEAN",
 }
-
 var ServiceIntakeFormField_FieldType_value = map[string]int32{
 	"FIELD_TYPE_UNSPECIFIED": 0,
 	"SHORT_ANSWER":           1,
@@ -282,14 +341,13 @@
 func (x ServiceIntakeFormField_FieldType) String() string {
 	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
 }
-
 func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{11, 0}
+	return fileDescriptor0, []int{11, 0}
 }
 
 // Enum to indicate the type of this media source. Only photos are supported.
-// Please reach out to Google if supporting animations or videos is
-// important to your feature and we will find the best solution for you.
+// Please reach out to the Reserve with Google team if other media beyond
+// photos need to be supported.
 type RelatedMedia_MediaType int32
 
 const (
@@ -303,7 +361,6 @@
 	0: "TYPE_UNSPECIFIED",
 	1: "PHOTO",
 }
-
 var RelatedMedia_MediaType_value = map[string]int32{
 	"TYPE_UNSPECIFIED": 0,
 	"PHOTO":            1,
@@ -312,15 +369,12 @@
 func (x RelatedMedia_MediaType) String() string {
 	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
 }
-
-func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
-}
+func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{17, 0} }
 
 type FeedMetadata struct {
 	// Instructs us how to process the feed: either as a shard of a complete feed,
 	// or as a shard of an incremental update.
-	ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,proto3,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
+	ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
 	// The current shard and total number of shards for this feed.
 	//
 	// Shard number is assumed to be zero-based.
@@ -329,8 +383,8 @@
 	//
 	// Shards do not need to be transferred in order, and they may not be
 	// processed in order.
-	ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber,proto3" json:"shard_number,omitempty"`
-	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards,proto3" json:"total_shards,omitempty"`
+	ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber" json:"shard_number,omitempty"`
+	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards" json:"total_shards,omitempty"`
 	// An identifier that must be consistent across all shards in a feed.
 	// This value must be globally unique across each feed type.
 	//
@@ -342,40 +396,17 @@
 	// total_shards).
 	//
 	// Feeds that span multiple shards must set this nonce to the same value.
-	Nonce uint64 `protobuf:"varint,5,opt,name=nonce,proto3" json:"nonce,omitempty"`
+	Nonce uint64 `protobuf:"varint,5,opt,name=nonce" json:"nonce,omitempty"`
 	// The timestamp at which this feed shard was generated.
 	//
 	// In Unix time format (seconds since the epoch).
-	GenerationTimestamp  int64    `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp,proto3" json:"generation_timestamp,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	GenerationTimestamp int64 `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp" json:"generation_timestamp,omitempty"`
 }
 
-func (m *FeedMetadata) Reset()         { *m = FeedMetadata{} }
-func (m *FeedMetadata) String() string { return proto.CompactTextString(m) }
-func (*FeedMetadata) ProtoMessage()    {}
-func (*FeedMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
-}
-
-func (m *FeedMetadata) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FeedMetadata.Unmarshal(m, b)
-}
-func (m *FeedMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FeedMetadata.Marshal(b, m, deterministic)
-}
-func (m *FeedMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FeedMetadata.Merge(m, src)
-}
-func (m *FeedMetadata) XXX_Size() int {
-	return xxx_messageInfo_FeedMetadata.Size(m)
-}
-func (m *FeedMetadata) XXX_DiscardUnknown() {
-	xxx_messageInfo_FeedMetadata.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_FeedMetadata proto.InternalMessageInfo
+func (m *FeedMetadata) Reset()                    { *m = FeedMetadata{} }
+func (m *FeedMetadata) String() string            { return proto.CompactTextString(m) }
+func (*FeedMetadata) ProtoMessage()               {}
+func (*FeedMetadata) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
 
 func (m *FeedMetadata) GetProcessingInstruction() FeedMetadata_ProcessingInstruction {
 	if m != nil {
@@ -413,37 +444,14 @@
 }
 
 type AvailabilityFeed struct {
-	Metadata             *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	ServiceAvailability  []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability,proto3" json:"service_availability,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	Metadata            *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"`
+	ServiceAvailability []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability" json:"service_availability,omitempty"`
 }
 
-func (m *AvailabilityFeed) Reset()         { *m = AvailabilityFeed{} }
-func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) }
-func (*AvailabilityFeed) ProtoMessage()    {}
-func (*AvailabilityFeed) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
-}
-
-func (m *AvailabilityFeed) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AvailabilityFeed.Unmarshal(m, b)
-}
-func (m *AvailabilityFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AvailabilityFeed.Marshal(b, m, deterministic)
-}
-func (m *AvailabilityFeed) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AvailabilityFeed.Merge(m, src)
-}
-func (m *AvailabilityFeed) XXX_Size() int {
-	return xxx_messageInfo_AvailabilityFeed.Size(m)
-}
-func (m *AvailabilityFeed) XXX_DiscardUnknown() {
-	xxx_messageInfo_AvailabilityFeed.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_AvailabilityFeed proto.InternalMessageInfo
+func (m *AvailabilityFeed) Reset()                    { *m = AvailabilityFeed{} }
+func (m *AvailabilityFeed) String() string            { return proto.CompactTextString(m) }
+func (*AvailabilityFeed) ProtoMessage()               {}
+func (*AvailabilityFeed) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
 
 func (m *AvailabilityFeed) GetMetadata() *FeedMetadata {
 	if m != nil {
@@ -483,8 +491,8 @@
 	// is interpreted to mean all time up to the end_timestamp_restrict.
 	//
 	// In Unix time format (seconds since the epoch).
-	StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict,proto3" json:"start_timestamp_restrict,omitempty"`
-	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict,proto3" json:"end_timestamp_restrict,omitempty"`
+	StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict" json:"start_timestamp_restrict,omitempty"`
+	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict" json:"end_timestamp_restrict,omitempty"`
 	// If provided, the timestamp restricts will be applied only to the given
 	// merchant or service.
 	//
@@ -494,42 +502,19 @@
 	//
 	// Leaving these fields unset, or setting these to the empty string or null,
 	// is interpreted to mean that no restrict is intended.
-	MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict,proto3" json:"merchant_id_restrict,omitempty"`
-	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict,proto3" json:"service_id_restrict,omitempty"`
+	MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict" json:"merchant_id_restrict,omitempty"`
+	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict" json:"service_id_restrict,omitempty"`
 	// Setting resources_restrict further restricts the scope of the update to
 	// just this set of resources. All id fields of the resources must match
 	// exactly.
-	ResourcesRestrict    *Resources      `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict,proto3" json:"resources_restrict,omitempty"`
-	Availability         []*Availability `protobuf:"bytes,5,rep,name=availability,proto3" json:"availability,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
+	ResourcesRestrict *Resources      `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict" json:"resources_restrict,omitempty"`
+	Availability      []*Availability `protobuf:"bytes,5,rep,name=availability" json:"availability,omitempty"`
 }
 
-func (m *ServiceAvailability) Reset()         { *m = ServiceAvailability{} }
-func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) }
-func (*ServiceAvailability) ProtoMessage()    {}
-func (*ServiceAvailability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
-}
-
-func (m *ServiceAvailability) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServiceAvailability.Unmarshal(m, b)
-}
-func (m *ServiceAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServiceAvailability.Marshal(b, m, deterministic)
-}
-func (m *ServiceAvailability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceAvailability.Merge(m, src)
-}
-func (m *ServiceAvailability) XXX_Size() int {
-	return xxx_messageInfo_ServiceAvailability.Size(m)
-}
-func (m *ServiceAvailability) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServiceAvailability.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServiceAvailability proto.InternalMessageInfo
+func (m *ServiceAvailability) Reset()                    { *m = ServiceAvailability{} }
+func (m *ServiceAvailability) String() string            { return proto.CompactTextString(m) }
+func (*ServiceAvailability) ProtoMessage()               {}
+func (*ServiceAvailability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
 
 func (m *ServiceAvailability) GetStartTimestampRestrict() int64 {
 	if m != nil {
@@ -588,16 +573,16 @@
 //
 type Availability struct {
 	// An opaque string from an aggregator to identify a merchant. (required)
-	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
+	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
 	// An opaque string from aggregator to identify a service of the
 	// merchant. (required)
-	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
+	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
 	// Start time of this availability, using epoch time in seconds in UTC.
 	// (required)
-	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
+	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"`
 	// Duration of the service in seconds, e.g. 30 minutes for a chair massage.
 	// (required)
-	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
+	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"`
 	// Number of total spots and open spots of this availability.
 	// E.g. a Yoga class of 10 spots with 3 booked.
 	//   availability {spots_total: 10, spots_open: 7 ...}
@@ -609,12 +594,12 @@
 	//       implies spots_total=1 and spots_open=1. A ScheduleException implies
 	//       spots_total=1 and spots_open=0.
 	// (both required if recurrence not set)
-	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal,proto3" json:"spots_total,omitempty"`
-	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
+	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal" json:"spots_total,omitempty"`
+	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen" json:"spots_open,omitempty"`
 	// An optional opaque string to identify this availability slot. If set, it
 	// will be included in the requests that book/update/cancel appointments.
 	// (optional)
-	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
+	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag" json:"availability_tag,omitempty"`
 	// Optional resources used to disambiguate this availability slot from
 	// others when different staff, room, or party_size values are part
 	// of the service.
@@ -625,7 +610,7 @@
 	//  availability { resources { staff_id: "2" staff_name: "John" }
 	//                 spots_total: 5 spots_open: 2 }
 	// (optional)
-	Resources *Resources `protobuf:"bytes,8,opt,name=resources,proto3" json:"resources,omitempty"`
+	Resources *Resources `protobuf:"bytes,8,opt,name=resources" json:"resources,omitempty"`
 	// A list of IDs referencing the payment options which can be used to pay
 	// for this slot. The actual payment options are defined at the Merchant
 	// level, and can also be shared among multiple Merchants.
@@ -638,28 +623,28 @@
 	// one element. Multiple payment_option_id are still allowed at the Service
 	// level, but an override at the availability slot level, is limited to a
 	// single payment_option_id. (optional)
-	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
+	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"`
 	// The recurrence information for the availability, representing more than one
 	// start time. A recurrence should contain appointments for one working day.
 	// (optional)
-	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence,proto3" json:"recurrence,omitempty"`
+	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence" json:"recurrence,omitempty"`
 	// Times when this service cannot be scheduled. To limit the number of
 	// schedule_exception messages, consider joining adjacent exceptions.
 	// (optional)
-	ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException,proto3" json:"schedule_exception,omitempty"`
+	ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException" json:"schedule_exception,omitempty"`
 	// Defines how a deposit may be charged to the user. Overrides the service
 	// deposit if one was specified. Setting this to an empty Deposit message
 	// removes any service-level deposit. (optional)
-	Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit,proto3" json:"deposit,omitempty"`
+	Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit" json:"deposit,omitempty"`
 	// Defines a no show fee that may be charged to the user. Overrides the
 	// service no show fee if one was specified. Setting this to an empty
 	// NoShowFee message removes any service-level no show fee. (optional)
-	NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
+	NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee" json:"no_show_fee,omitempty"`
 	// Indicates whether the user must provide a credit card in order to book this
 	// availability slot.
 	// If the value is not set, it is inherited from the service level if it's set
 	// there. (optional)
-	RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
+	RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
 	// Indicates a list of supported ticket types for this availability slot. If
 	// unset, all ticket types in the parent service are available for this slot.
 	// Note that the values of this field must be defined in the parent service.
@@ -689,36 +674,16 @@
 	//   `availability {...}' (do not set ticket_type_id in this slot).
 	//
 	//  (optional)
-	TicketTypeId         []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	TicketTypeId []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId" json:"ticket_type_id,omitempty"`
+	// Availability scheduling rules. If fields are populated, they will override
+	// any corresponding scheduling rules on the service-level SchedulingRules.
+	SchedulingRuleOverrides *Availability_SchedulingRuleOverrides `protobuf:"bytes,16,opt,name=scheduling_rule_overrides,json=schedulingRuleOverrides" json:"scheduling_rule_overrides,omitempty"`
 }
 
-func (m *Availability) Reset()         { *m = Availability{} }
-func (m *Availability) String() string { return proto.CompactTextString(m) }
-func (*Availability) ProtoMessage()    {}
-func (*Availability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{3}
-}
-
-func (m *Availability) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Availability.Unmarshal(m, b)
-}
-func (m *Availability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Availability.Marshal(b, m, deterministic)
-}
-func (m *Availability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Availability.Merge(m, src)
-}
-func (m *Availability) XXX_Size() int {
-	return xxx_messageInfo_Availability.Size(m)
-}
-func (m *Availability) XXX_DiscardUnknown() {
-	xxx_messageInfo_Availability.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Availability proto.InternalMessageInfo
+func (m *Availability) Reset()                    { *m = Availability{} }
+func (m *Availability) String() string            { return proto.CompactTextString(m) }
+func (*Availability) ProtoMessage()               {}
+func (*Availability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
 
 func (m *Availability) GetMerchantId() string {
 	if m != nil {
@@ -825,6 +790,13 @@
 	return nil
 }
 
+func (m *Availability) GetSchedulingRuleOverrides() *Availability_SchedulingRuleOverrides {
+	if m != nil {
+		return m.SchedulingRuleOverrides
+	}
+	return nil
+}
+
 // Recurrence messages are optional, but allow for a more compact
 // representation of consistently repeating availability slots. They typically
 // represent a day's working schedule.
@@ -842,43 +814,20 @@
 type Availability_Recurrence struct {
 	// The inclusive maximum UTC timestamp the availability repeats until.
 	// (required)
-	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"`
+	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec" json:"repeat_until_sec,omitempty"`
 	// Defines the time between successive availability slots.
 	//
 	// Example: An availability with a duration of 20 min, a repeat_every_sec of
 	// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
 	// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
 	// 11-11:20am. (required)
-	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	RepeatEverySec int32 `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec" json:"repeat_every_sec,omitempty"`
 }
 
-func (m *Availability_Recurrence) Reset()         { *m = Availability_Recurrence{} }
-func (m *Availability_Recurrence) String() string { return proto.CompactTextString(m) }
-func (*Availability_Recurrence) ProtoMessage()    {}
-func (*Availability_Recurrence) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 0}
-}
-
-func (m *Availability_Recurrence) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Availability_Recurrence.Unmarshal(m, b)
-}
-func (m *Availability_Recurrence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Availability_Recurrence.Marshal(b, m, deterministic)
-}
-func (m *Availability_Recurrence) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Availability_Recurrence.Merge(m, src)
-}
-func (m *Availability_Recurrence) XXX_Size() int {
-	return xxx_messageInfo_Availability_Recurrence.Size(m)
-}
-func (m *Availability_Recurrence) XXX_DiscardUnknown() {
-	xxx_messageInfo_Availability_Recurrence.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Availability_Recurrence proto.InternalMessageInfo
+func (m *Availability_Recurrence) Reset()                    { *m = Availability_Recurrence{} }
+func (m *Availability_Recurrence) String() string            { return proto.CompactTextString(m) }
+func (*Availability_Recurrence) ProtoMessage()               {}
+func (*Availability_Recurrence) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} }
 
 func (m *Availability_Recurrence) GetRepeatUntilSec() int64 {
 	if m != nil {
@@ -911,37 +860,16 @@
 	//
 	// Note that because the time range is closed-open, the slot beginning at
 	// 11am slot would not be impacted.
-	TimeRange            *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
+	TimeRange *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange" json:"time_range,omitempty"`
 }
 
 func (m *Availability_ScheduleException) Reset()         { *m = Availability_ScheduleException{} }
 func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) }
 func (*Availability_ScheduleException) ProtoMessage()    {}
 func (*Availability_ScheduleException) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 1}
+	return fileDescriptor0, []int{3, 1}
 }
 
-func (m *Availability_ScheduleException) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Availability_ScheduleException.Unmarshal(m, b)
-}
-func (m *Availability_ScheduleException) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Availability_ScheduleException.Marshal(b, m, deterministic)
-}
-func (m *Availability_ScheduleException) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Availability_ScheduleException.Merge(m, src)
-}
-func (m *Availability_ScheduleException) XXX_Size() int {
-	return xxx_messageInfo_Availability_ScheduleException.Size(m)
-}
-func (m *Availability_ScheduleException) XXX_DiscardUnknown() {
-	xxx_messageInfo_Availability_ScheduleException.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Availability_ScheduleException proto.InternalMessageInfo
-
 func (m *Availability_ScheduleException) GetTimeRange() *TimeRange {
 	if m != nil {
 		return m.TimeRange
@@ -949,6 +877,31 @@
 	return nil
 }
 
+// Availability level scheduling rules.
+type Availability_SchedulingRuleOverrides struct {
+	// The last time (in seconds) that this slot is able to be booked. This
+	// timestamp must be before the start_sec of the slot to be respected
+	// (if users should be able to book after the start time, use service level
+	// SchedulingRules.min_booking_before_end_time). If present, will override
+	// anything specified in the min_booking_buffer of the corresponding
+	// Service's SchedulingRules.
+	LastBookableSec int64 `protobuf:"varint,1,opt,name=last_bookable_sec,json=lastBookableSec" json:"last_bookable_sec,omitempty"`
+}
+
+func (m *Availability_SchedulingRuleOverrides) Reset()         { *m = Availability_SchedulingRuleOverrides{} }
+func (m *Availability_SchedulingRuleOverrides) String() string { return proto.CompactTextString(m) }
+func (*Availability_SchedulingRuleOverrides) ProtoMessage()    {}
+func (*Availability_SchedulingRuleOverrides) Descriptor() ([]byte, []int) {
+	return fileDescriptor0, []int{3, 2}
+}
+
+func (m *Availability_SchedulingRuleOverrides) GetLastBookableSec() int64 {
+	if m != nil {
+		return m.LastBookableSec
+	}
+	return 0
+}
+
 // A resource is used to disambiguate availability slots from one another when
 // different staff, room or party_size values are part of the service.
 // Multiple slots for the same service and time interval can co-exist when they
@@ -959,57 +912,34 @@
 	// It also needs to be stable over time to allow correlation with past
 	// bookings.
 	// This field must be present if staff_name is present.
-	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
+	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId" json:"staff_id,omitempty"`
 	// Optional name of a staff member providing the service. This field will be
 	// displayed to users making a booking, and should be human readable, as
 	// opposed to an opaque identifier.
 	// This field must be present if staff_id is present.
-	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"`
+	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName" json:"staff_name,omitempty"`
 	// An optional id for the room the service is located in. This field
 	// identifies the room across all merchants, services, and availability
 	// records. It also needs to be stable over time to allow correlation with
 	// past bookings.
 	// This field must be present if room_name is present.
-	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
+	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId" json:"room_id,omitempty"`
 	// An optional name for the room the service is located in. This
 	// field will be displayed to users making a booking, and should be human
 	// readable, as opposed to an opaque identifier.
 	// This field must be present if room_id is present.
-	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"`
+	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName" json:"room_name,omitempty"`
 	// Applicable only for Dining: The party size which can be accommodated
 	// during this time slot. A restaurant can be associated with multiple Slots
 	// for the same time, each specifying a different party_size, if for instance
 	// 2, 3, or 4 people can be seated with a reservation.
-	PartySize            int32    `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	PartySize int32 `protobuf:"varint,5,opt,name=party_size,json=partySize" json:"party_size,omitempty"`
 }
 
-func (m *Resources) Reset()         { *m = Resources{} }
-func (m *Resources) String() string { return proto.CompactTextString(m) }
-func (*Resources) ProtoMessage()    {}
-func (*Resources) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{4}
-}
-
-func (m *Resources) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Resources.Unmarshal(m, b)
-}
-func (m *Resources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Resources.Marshal(b, m, deterministic)
-}
-func (m *Resources) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Resources.Merge(m, src)
-}
-func (m *Resources) XXX_Size() int {
-	return xxx_messageInfo_Resources.Size(m)
-}
-func (m *Resources) XXX_DiscardUnknown() {
-	xxx_messageInfo_Resources.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Resources proto.InternalMessageInfo
+func (m *Resources) Reset()                    { *m = Resources{} }
+func (m *Resources) String() string            { return proto.CompactTextString(m) }
+func (*Resources) ProtoMessage()               {}
+func (*Resources) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
 
 func (m *Resources) GetStaffId() string {
 	if m != nil {
@@ -1047,37 +977,14 @@
 }
 
 type TimeRange struct {
-	BeginSec             int64    `protobuf:"varint,1,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"`
-	EndSec               int64    `protobuf:"varint,2,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	BeginSec int64 `protobuf:"varint,1,opt,name=begin_sec,json=beginSec" json:"begin_sec,omitempty"`
+	EndSec   int64 `protobuf:"varint,2,opt,name=end_sec,json=endSec" json:"end_sec,omitempty"`
 }
 
-func (m *TimeRange) Reset()         { *m = TimeRange{} }
-func (m *TimeRange) String() string { return proto.CompactTextString(m) }
-func (*TimeRange) ProtoMessage()    {}
-func (*TimeRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{5}
-}
-
-func (m *TimeRange) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TimeRange.Unmarshal(m, b)
-}
-func (m *TimeRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TimeRange.Marshal(b, m, deterministic)
-}
-func (m *TimeRange) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TimeRange.Merge(m, src)
-}
-func (m *TimeRange) XXX_Size() int {
-	return xxx_messageInfo_TimeRange.Size(m)
-}
-func (m *TimeRange) XXX_DiscardUnknown() {
-	xxx_messageInfo_TimeRange.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TimeRange proto.InternalMessageInfo
+func (m *TimeRange) Reset()                    { *m = TimeRange{} }
+func (m *TimeRange) String() string            { return proto.CompactTextString(m) }
+func (*TimeRange) ProtoMessage()               {}
+func (*TimeRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
 
 func (m *TimeRange) GetBeginSec() int64 {
 	if m != nil {
@@ -1094,37 +1001,14 @@
 }
 
 type ServiceFeed struct {
-	Metadata             *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
-	Service              []*Service    `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
-	XXX_unrecognized     []byte        `json:"-"`
-	XXX_sizecache        int32         `json:"-"`
+	Metadata *FeedMetadata `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"`
+	Service  []*Service    `protobuf:"bytes,2,rep,name=service" json:"service,omitempty"`
 }
 
-func (m *ServiceFeed) Reset()         { *m = ServiceFeed{} }
-func (m *ServiceFeed) String() string { return proto.CompactTextString(m) }
-func (*ServiceFeed) ProtoMessage()    {}
-func (*ServiceFeed) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{6}
-}
-
-func (m *ServiceFeed) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServiceFeed.Unmarshal(m, b)
-}
-func (m *ServiceFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServiceFeed.Marshal(b, m, deterministic)
-}
-func (m *ServiceFeed) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceFeed.Merge(m, src)
-}
-func (m *ServiceFeed) XXX_Size() int {
-	return xxx_messageInfo_ServiceFeed.Size(m)
-}
-func (m *ServiceFeed) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServiceFeed.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServiceFeed proto.InternalMessageInfo
+func (m *ServiceFeed) Reset()                    { *m = ServiceFeed{} }
+func (m *ServiceFeed) String() string            { return proto.CompactTextString(m) }
+func (*ServiceFeed) ProtoMessage()               {}
+func (*ServiceFeed) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
 
 func (m *ServiceFeed) GetMetadata() *FeedMetadata {
 	if m != nil {
@@ -1144,13 +1028,13 @@
 type Service struct {
 	// An opaque string from an aggregator partner which uniquely identifies a
 	// merchant. (required)
-	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
+	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
 	// An opaque string from an aggregator partner which uniquely identifies the
 	// service. (required)
-	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
+	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
 	// The name of the service, suitable for display to users, e.g. "Men's
 	// haircut". (required)
-	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	Name string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
 	// The description of the service, suitable for display to users.
 	//
 	// This field now supports both plain text and HTML-like formatting rules to
@@ -1219,91 +1103,68 @@
 	//   approach for you.
 	//
 	// (required)
-	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
+	Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
 	// The price of the service. (optional, overridden when payment options or
 	// ticket types present)
-	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
+	Price *Price `protobuf:"bytes,5,opt,name=price" json:"price,omitempty"`
 	// Rules to book/cancel an appointment. (optional)
-	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
+	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules" json:"rules,omitempty"`
 	// Intake forms to customize the service. (optional)
 	//
 	// Deprecated. Please see intake_form and per_ticket_intake_form.
-	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"` // Deprecated: Do not use.
+	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form" json:"form,omitempty"`
 	// A form requesting additional information from the user when they book this
 	// service. (optional)
-	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm,proto3" json:"intake_form,omitempty"`
+	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm" json:"intake_form,omitempty"`
 	// A form requesting additional information from the user when they book this
 	// service. This form must be filled out once for each ticket the user is
 	// booking. (optional)
-	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm,proto3" json:"per_ticket_intake_form,omitempty"`
+	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm" json:"per_ticket_intake_form,omitempty"`
 	// Whether a prepayment is required, optional or not supported. (optional)
-	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
+	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
 	// The service's tax rate. If present this field overrides any tax_rate set at
 	// the merchant level. An empty message (i.e. tax_rate { }) will reset the
 	// applied tax rate to zero. (optional)
-	TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate,proto3" json:"tax_rate,omitempty"`
+	TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate" json:"tax_rate,omitempty"`
 	// A list of ids referencing the payment options which can be used to pay
 	// for this service. The actual payment options are defined at the Merchant
 	// level, and can also be shared among multiple Merchants. (optional)
-	PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
+	PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"`
 	// Defines how a deposit may be charged to the user. Can be overridden at the
 	// availability level. (optional)
-	Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit,proto3" json:"deposit,omitempty"`
+	Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit" json:"deposit,omitempty"`
 	// Defines a no show fee that may be charged to the user. Can be overridden
 	// at the availability level. (optional)
-	NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
+	NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee" json:"no_show_fee,omitempty"`
 	// Indicates whether the user must provide a credit card in order to book this
 	// service.
 	// This value can be overridden at the availability level. (optional)
-	RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
+	RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
 	// An action link related to this service.
-	ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"`
+	ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink" json:"action_link,omitempty"`
 	// The predefined type of this service. Currently, only used with action_link.
-	Type Service_ServiceType `protobuf:"varint,15,opt,name=type,proto3,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
+	Type Service_ServiceType `protobuf:"varint,15,opt,name=type,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
 	// Types of tickets that can be booked/purchased for this service, if tickets
 	// are supported. (optional)
-	TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
+	TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType" json:"ticket_type,omitempty"`
 	// Photos related to this service. Google will crawl these media to
 	// ensure that they are displayed to end-users in the most efficient way.
 	// (optional)
-	RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia,proto3" json:"related_media,omitempty"`
+	RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia" json:"related_media,omitempty"`
 	// Service attribute values that apply to this service (optional).
 	// Each Service may have zero or more values for each service attribute
 	// defined in the corresponding Merchant.
-	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
+	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId" json:"service_attribute_value_id,omitempty"`
 	// Rules related to joining the waitlist. Should be populated if the service
 	// and merchant support waitlist functionality. Should not be populated
 	// otherwise.
-	WaitlistRules        *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules,proto3" json:"waitlist_rules,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
+	WaitlistRules *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules" json:"waitlist_rules,omitempty"`
 }
 
-func (m *Service) Reset()         { *m = Service{} }
-func (m *Service) String() string { return proto.CompactTextString(m) }
-func (*Service) ProtoMessage()    {}
-func (*Service) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{7}
-}
-
-func (m *Service) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Service.Unmarshal(m, b)
-}
-func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Service.Marshal(b, m, deterministic)
-}
-func (m *Service) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Service.Merge(m, src)
-}
-func (m *Service) XXX_Size() int {
-	return xxx_messageInfo_Service.Size(m)
-}
-func (m *Service) XXX_DiscardUnknown() {
-	xxx_messageInfo_Service.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Service proto.InternalMessageInfo
+func (m *Service) Reset()                    { *m = Service{} }
+func (m *Service) String() string            { return proto.CompactTextString(m) }
+func (*Service) ProtoMessage()               {}
+func (*Service) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
 
 func (m *Service) GetMerchantId() string {
 	if m != nil {
@@ -1347,7 +1208,6 @@
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *Service) GetForm() []*ServiceIntakeForm {
 	if m != nil {
 		return m.Form
@@ -1460,41 +1320,18 @@
 	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
 	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
 	// (required)
-	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"`
+	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros" json:"price_micros,omitempty"`
 	// The currency of the price that is defined in ISO 4217. (required)
-	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
+	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
 	// An optional and opaque string that identifies the pricing option that is
 	// associated with the extended price. (optional)
-	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	PricingOptionTag string `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag" json:"pricing_option_tag,omitempty"`
 }
 
-func (m *Price) Reset()         { *m = Price{} }
-func (m *Price) String() string { return proto.CompactTextString(m) }
-func (*Price) ProtoMessage()    {}
-func (*Price) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{8}
-}
-
-func (m *Price) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Price.Unmarshal(m, b)
-}
-func (m *Price) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Price.Marshal(b, m, deterministic)
-}
-func (m *Price) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Price.Merge(m, src)
-}
-func (m *Price) XXX_Size() int {
-	return xxx_messageInfo_Price.Size(m)
-}
-func (m *Price) XXX_DiscardUnknown() {
-	xxx_messageInfo_Price.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Price proto.InternalMessageInfo
+func (m *Price) Reset()                    { *m = Price{} }
+func (m *Price) String() string            { return proto.CompactTextString(m) }
+func (*Price) ProtoMessage()               {}
+func (*Price) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
 
 func (m *Price) GetPriceMicros() int64 {
 	if m != nil {
@@ -1519,49 +1356,80 @@
 
 // The scheduling rules for a service.
 type SchedulingRules struct {
-	// The minimum advance notice in seconds required to book an appointment.
+	// The duration (in seconds) from when the last booking can be made to
+	// when the availability slot starts or ends.
+	//
+	// If "min_advance_booking" is set, the last bookable time is calculated as
+	// (<slot start time> - "min_advance_booking").
+	// If "min_booking_buffer_before_end_time" is set, the last bookable time is
+	// calculated as (<slot end time> - "min_booking_buffer_before_end_time").
+	// Note that the value of "min_booking_buffer_before_end_time" must be
+	// positive if set.
+	// If both are unset, the slot is bookable until the slot begin time.
+	//
+	// Examples:
+	//  * A haircut that needs to be booked at least 1 hour before the start time.
+	//      'scheduling_rules{ min_advance_booking: 3600 ...}`
+	//
+	//  * A museum where the last ticket can be purchased 30 mins before closing:
+	//     'scheduling_rules{ min_booking_buffer_before_end_time: 1800 ...}'
+	//
+	//  * A movie ticket that needs to be purchased before the start time.
+	//        'scheduling_rules{ ...}' (leave this field empty)
 	// (optional)
-	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3" json:"min_advance_booking,omitempty"`
+	//
+	// Types that are valid to be assigned to MinBookingBuffer:
+	//	*SchedulingRules_MinAdvanceBooking
+	//	*SchedulingRules_MinBookingBufferBeforeEndTime
+	MinBookingBuffer isSchedulingRules_MinBookingBuffer `protobuf_oneof:"min_booking_buffer"`
 	// The minimum advance notice in seconds required to cancel a booked
 	// appointment online. (optional)
-	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling,proto3" json:"min_advance_online_canceling,omitempty"`
+	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling" json:"min_advance_online_canceling,omitempty"`
 	// The fee for canceling within the minimum advance notice period.
-	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
+	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee" json:"late_cancellation_fee,omitempty"`
 	// The fee for no-show without canceling.
-	NoshowFee            *Price   `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee" json:"noshow_fee,omitempty"`
+	// The admission policy that applied to this service. If unset, defaults to
+	// TIME_STRICT. (optional)
+	AdmissionPolicy SchedulingRules_AdmissionPolicy `protobuf:"varint,5,opt,name=admission_policy,json=admissionPolicy,enum=maps.booking.feeds.SchedulingRules_AdmissionPolicy" json:"admission_policy,omitempty"`
 }
 
-func (m *SchedulingRules) Reset()         { *m = SchedulingRules{} }
-func (m *SchedulingRules) String() string { return proto.CompactTextString(m) }
-func (*SchedulingRules) ProtoMessage()    {}
-func (*SchedulingRules) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{9}
+func (m *SchedulingRules) Reset()                    { *m = SchedulingRules{} }
+func (m *SchedulingRules) String() string            { return proto.CompactTextString(m) }
+func (*SchedulingRules) ProtoMessage()               {}
+func (*SchedulingRules) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
+
+type isSchedulingRules_MinBookingBuffer interface {
+	isSchedulingRules_MinBookingBuffer()
 }
 
-func (m *SchedulingRules) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SchedulingRules.Unmarshal(m, b)
+type SchedulingRules_MinAdvanceBooking struct {
+	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,oneof"`
 }
-func (m *SchedulingRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SchedulingRules.Marshal(b, m, deterministic)
-}
-func (m *SchedulingRules) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SchedulingRules.Merge(m, src)
-}
-func (m *SchedulingRules) XXX_Size() int {
-	return xxx_messageInfo_SchedulingRules.Size(m)
-}
-func (m *SchedulingRules) XXX_DiscardUnknown() {
-	xxx_messageInfo_SchedulingRules.DiscardUnknown(m)
+type SchedulingRules_MinBookingBufferBeforeEndTime struct {
+	MinBookingBufferBeforeEndTime int64 `protobuf:"varint,6,opt,name=min_booking_buffer_before_end_time,json=minBookingBufferBeforeEndTime,oneof"`
 }
 
-var xxx_messageInfo_SchedulingRules proto.InternalMessageInfo
+func (*SchedulingRules_MinAdvanceBooking) isSchedulingRules_MinBookingBuffer()             {}
+func (*SchedulingRules_MinBookingBufferBeforeEndTime) isSchedulingRules_MinBookingBuffer() {}
+
+func (m *SchedulingRules) GetMinBookingBuffer() isSchedulingRules_MinBookingBuffer {
+	if m != nil {
+		return m.MinBookingBuffer
+	}
+	return nil
+}
 
 func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
-	if m != nil {
-		return m.MinAdvanceBooking
+	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinAdvanceBooking); ok {
+		return x.MinAdvanceBooking
+	}
+	return 0
+}
+
+func (m *SchedulingRules) GetMinBookingBufferBeforeEndTime() int64 {
+	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinBookingBufferBeforeEndTime); ok {
+		return x.MinBookingBufferBeforeEndTime
 	}
 	return 0
 }
@@ -1573,7 +1441,6 @@
 	return 0
 }
 
-// Deprecated: Do not use.
 func (m *SchedulingRules) GetLateCancellationFee() *Price {
 	if m != nil {
 		return m.LateCancellationFee
@@ -1581,7 +1448,6 @@
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *SchedulingRules) GetNoshowFee() *Price {
 	if m != nil {
 		return m.NoshowFee
@@ -1589,6 +1455,77 @@
 	return nil
 }
 
+func (m *SchedulingRules) GetAdmissionPolicy() SchedulingRules_AdmissionPolicy {
+	if m != nil {
+		return m.AdmissionPolicy
+	}
+	return SchedulingRules_ADMISSION_POLICY_UNSPECIFIED
+}
+
+// XXX_OneofFuncs is for the internal use of the proto package.
+func (*SchedulingRules) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
+	return _SchedulingRules_OneofMarshaler, _SchedulingRules_OneofUnmarshaler, _SchedulingRules_OneofSizer, []interface{}{
+		(*SchedulingRules_MinAdvanceBooking)(nil),
+		(*SchedulingRules_MinBookingBufferBeforeEndTime)(nil),
+	}
+}
+
+func _SchedulingRules_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
+	m := msg.(*SchedulingRules)
+	// min_booking_buffer
+	switch x := m.MinBookingBuffer.(type) {
+	case *SchedulingRules_MinAdvanceBooking:
+		b.EncodeVarint(1<<3 | proto.WireVarint)
+		b.EncodeVarint(uint64(x.MinAdvanceBooking))
+	case *SchedulingRules_MinBookingBufferBeforeEndTime:
+		b.EncodeVarint(6<<3 | proto.WireVarint)
+		b.EncodeVarint(uint64(x.MinBookingBufferBeforeEndTime))
+	case nil:
+	default:
+		return fmt.Errorf("SchedulingRules.MinBookingBuffer has unexpected type %T", x)
+	}
+	return nil
+}
+
+func _SchedulingRules_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
+	m := msg.(*SchedulingRules)
+	switch tag {
+	case 1: // min_booking_buffer.min_advance_booking
+		if wire != proto.WireVarint {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeVarint()
+		m.MinBookingBuffer = &SchedulingRules_MinAdvanceBooking{int64(x)}
+		return true, err
+	case 6: // min_booking_buffer.min_booking_buffer_before_end_time
+		if wire != proto.WireVarint {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeVarint()
+		m.MinBookingBuffer = &SchedulingRules_MinBookingBufferBeforeEndTime{int64(x)}
+		return true, err
+	default:
+		return false, nil
+	}
+}
+
+func _SchedulingRules_OneofSizer(msg proto.Message) (n int) {
+	m := msg.(*SchedulingRules)
+	// min_booking_buffer
+	switch x := m.MinBookingBuffer.(type) {
+	case *SchedulingRules_MinAdvanceBooking:
+		n += proto.SizeVarint(1<<3 | proto.WireVarint)
+		n += proto.SizeVarint(uint64(x.MinAdvanceBooking))
+	case *SchedulingRules_MinBookingBufferBeforeEndTime:
+		n += proto.SizeVarint(6<<3 | proto.WireVarint)
+		n += proto.SizeVarint(uint64(x.MinBookingBufferBeforeEndTime))
+	case nil:
+	default:
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
+	}
+	return n
+}
+
 // A tax rate applied when charging the user for a service, and which can be set
 // on either a per merchant, or per service basis.
 type TaxRate struct {
@@ -1608,36 +1545,13 @@
 	// the smallest currency unit (for example, fractions of one cent) will be
 	// rounded using nearest even rounding. Taxes will be shown to the user as a
 	// separate line item. (required)
-	MicroPercent         int32    `protobuf:"varint,1,opt,name=micro_percent,json=microPercent,proto3" json:"micro_percent,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	MicroPercent int32 `protobuf:"varint,1,opt,name=micro_percent,json=microPercent" json:"micro_percent,omitempty"`
 }
 
-func (m *TaxRate) Reset()         { *m = TaxRate{} }
-func (m *TaxRate) String() string { return proto.CompactTextString(m) }
-func (*TaxRate) ProtoMessage()    {}
-func (*TaxRate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{10}
-}
-
-func (m *TaxRate) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TaxRate.Unmarshal(m, b)
-}
-func (m *TaxRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TaxRate.Marshal(b, m, deterministic)
-}
-func (m *TaxRate) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TaxRate.Merge(m, src)
-}
-func (m *TaxRate) XXX_Size() int {
-	return xxx_messageInfo_TaxRate.Size(m)
-}
-func (m *TaxRate) XXX_DiscardUnknown() {
-	xxx_messageInfo_TaxRate.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TaxRate proto.InternalMessageInfo
+func (m *TaxRate) Reset()                    { *m = TaxRate{} }
+func (m *TaxRate) String() string            { return proto.CompactTextString(m) }
+func (*TaxRate) ProtoMessage()               {}
+func (*TaxRate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
 
 func (m *TaxRate) GetMicroPercent() int32 {
 	if m != nil {
@@ -1651,45 +1565,22 @@
 	// A string from an aggregator partner which uniquely identifies a form field.
 	// This id should be the same as the id in the corresponding form field
 	// answer. (required)
-	Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"`
+	Id string `protobuf:"bytes,5,opt,name=id" json:"id,omitempty"`
 	// The type of this field. (required)
-	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
+	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
 	// The text shown to the user for this field. (required)
-	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+	Label string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"`
 	// For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate.
 	// (optional)
-	Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"`
+	Value []string `protobuf:"bytes,3,rep,name=value" json:"value,omitempty"`
 	// Indicates whether an answer to this field is required by a user. (optional)
-	IsRequired           bool     `protobuf:"varint,4,opt,name=is_required,json=isRequired,proto3" json:"is_required,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	IsRequired bool `protobuf:"varint,4,opt,name=is_required,json=isRequired" json:"is_required,omitempty"`
 }
 
-func (m *ServiceIntakeFormField) Reset()         { *m = ServiceIntakeFormField{} }
-func (m *ServiceIntakeFormField) String() string { return proto.CompactTextString(m) }
-func (*ServiceIntakeFormField) ProtoMessage()    {}
-func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{11}
-}
-
-func (m *ServiceIntakeFormField) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServiceIntakeFormField.Unmarshal(m, b)
-}
-func (m *ServiceIntakeFormField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServiceIntakeFormField.Marshal(b, m, deterministic)
-}
-func (m *ServiceIntakeFormField) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceIntakeFormField.Merge(m, src)
-}
-func (m *ServiceIntakeFormField) XXX_Size() int {
-	return xxx_messageInfo_ServiceIntakeFormField.Size(m)
-}
-func (m *ServiceIntakeFormField) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServiceIntakeFormField.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo
+func (m *ServiceIntakeFormField) Reset()                    { *m = ServiceIntakeFormField{} }
+func (m *ServiceIntakeFormField) String() string            { return proto.CompactTextString(m) }
+func (*ServiceIntakeFormField) ProtoMessage()               {}
+func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
 
 func (m *ServiceIntakeFormField) GetId() string {
 	if m != nil {
@@ -1729,42 +1620,19 @@
 // Defines an intake form that customizes the service provided by a merchant.
 type ServiceIntakeForm struct {
 	// Fields that will be displayed to the user. (required)
-	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
+	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field" json:"field,omitempty"`
 	// If true, this form will be shown to first time customers.
 	// Deprecated. This functionality is not supported for intake forms.
-	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"` // Deprecated: Do not use.
+	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers" json:"first_time_customers,omitempty"`
 	// If true, this form will be shown to repeat customers.
 	// Deprecated. This functionality is not supported for intake forms.
-	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"` // Deprecated: Do not use.
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	ReturningCustomers bool `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers" json:"returning_customers,omitempty"`
 }
 
-func (m *ServiceIntakeForm) Reset()         { *m = ServiceIntakeForm{} }
-func (m *ServiceIntakeForm) String() string { return proto.CompactTextString(m) }
-func (*ServiceIntakeForm) ProtoMessage()    {}
-func (*ServiceIntakeForm) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{12}
-}
-
-func (m *ServiceIntakeForm) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServiceIntakeForm.Unmarshal(m, b)
-}
-func (m *ServiceIntakeForm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServiceIntakeForm.Marshal(b, m, deterministic)
-}
-func (m *ServiceIntakeForm) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceIntakeForm.Merge(m, src)
-}
-func (m *ServiceIntakeForm) XXX_Size() int {
-	return xxx_messageInfo_ServiceIntakeForm.Size(m)
-}
-func (m *ServiceIntakeForm) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServiceIntakeForm.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServiceIntakeForm proto.InternalMessageInfo
+func (m *ServiceIntakeForm) Reset()                    { *m = ServiceIntakeForm{} }
+func (m *ServiceIntakeForm) String() string            { return proto.CompactTextString(m) }
+func (*ServiceIntakeForm) ProtoMessage()               {}
+func (*ServiceIntakeForm) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
 
 func (m *ServiceIntakeForm) GetField() []*ServiceIntakeFormField {
 	if m != nil {
@@ -1773,7 +1641,6 @@
 	return nil
 }
 
-// Deprecated: Do not use.
 func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
 	if m != nil {
 		return m.FirstTimeCustomers
@@ -1781,7 +1648,6 @@
 	return false
 }
 
-// Deprecated: Do not use.
 func (m *ServiceIntakeForm) GetReturningCustomers() bool {
 	if m != nil {
 		return m.ReturningCustomers
@@ -1793,40 +1659,17 @@
 // for.
 type Deposit struct {
 	// Deposit amount.
-	Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" json:"deposit,omitempty"`
+	Deposit *Price `protobuf:"bytes,1,opt,name=deposit" json:"deposit,omitempty"`
 	// Minimum advance cancellation for the deposit.
-	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec,proto3" json:"min_advance_cancellation_sec,omitempty"`
+	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec" json:"min_advance_cancellation_sec,omitempty"`
 	// Defines how the deposit is determined from the availability.
-	DepositType          PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
+	DepositType PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
 }
 
-func (m *Deposit) Reset()         { *m = Deposit{} }
-func (m *Deposit) String() string { return proto.CompactTextString(m) }
-func (*Deposit) ProtoMessage()    {}
-func (*Deposit) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{13}
-}
-
-func (m *Deposit) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Deposit.Unmarshal(m, b)
-}
-func (m *Deposit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Deposit.Marshal(b, m, deterministic)
-}
-func (m *Deposit) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Deposit.Merge(m, src)
-}
-func (m *Deposit) XXX_Size() int {
-	return xxx_messageInfo_Deposit.Size(m)
-}
-func (m *Deposit) XXX_DiscardUnknown() {
-	xxx_messageInfo_Deposit.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Deposit proto.InternalMessageInfo
+func (m *Deposit) Reset()                    { *m = Deposit{} }
+func (m *Deposit) String() string            { return proto.CompactTextString(m) }
+func (*Deposit) ProtoMessage()               {}
+func (*Deposit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
 
 func (m *Deposit) GetDeposit() *Price {
 	if m != nil {
@@ -1854,38 +1697,15 @@
 type NoShowFee struct {
 	// The amount the user may be charged if they do not show up for their
 	// reservation.
-	Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"`
+	Fee *Price `protobuf:"bytes,1,opt,name=fee" json:"fee,omitempty"`
 	// Defines how the fee is determined from the availability.
-	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
+	FeeType PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
 }
 
-func (m *NoShowFee) Reset()         { *m = NoShowFee{} }
-func (m *NoShowFee) String() string { return proto.CompactTextString(m) }
-func (*NoShowFee) ProtoMessage()    {}
-func (*NoShowFee) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{14}
-}
-
-func (m *NoShowFee) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NoShowFee.Unmarshal(m, b)
-}
-func (m *NoShowFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NoShowFee.Marshal(b, m, deterministic)
-}
-func (m *NoShowFee) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NoShowFee.Merge(m, src)
-}
-func (m *NoShowFee) XXX_Size() int {
-	return xxx_messageInfo_NoShowFee.Size(m)
-}
-func (m *NoShowFee) XXX_DiscardUnknown() {
-	xxx_messageInfo_NoShowFee.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_NoShowFee proto.InternalMessageInfo
+func (m *NoShowFee) Reset()                    { *m = NoShowFee{} }
+func (m *NoShowFee) String() string            { return proto.CompactTextString(m) }
+func (*NoShowFee) ProtoMessage()               {}
+func (*NoShowFee) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
 
 func (m *NoShowFee) GetFee() *Price {
 	if m != nil {
@@ -1906,44 +1726,21 @@
 // performed on.
 type ActionLink struct {
 	// The entry point URL for this action link.
-	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
 	// The BCP-47 language tag identifying the language in which the content
 	// from this URI is available.
-	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
+	Language string `protobuf:"bytes,2,opt,name=language" json:"language,omitempty"`
 	// ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
-	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry,proto3" json:"restricted_country,omitempty"`
+	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry" json:"restricted_country,omitempty"`
 	// The platform that this action should be performed on. If this field is
 	// unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.
-	Platform             ActionPlatform `protobuf:"varint,4,opt,name=platform,proto3,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
+	Platform ActionPlatform `protobuf:"varint,4,opt,name=platform,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
 }
 
-func (m *ActionLink) Reset()         { *m = ActionLink{} }
-func (m *ActionLink) String() string { return proto.CompactTextString(m) }
-func (*ActionLink) ProtoMessage()    {}
-func (*ActionLink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{15}
-}
-
-func (m *ActionLink) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ActionLink.Unmarshal(m, b)
-}
-func (m *ActionLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ActionLink.Marshal(b, m, deterministic)
-}
-func (m *ActionLink) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActionLink.Merge(m, src)
-}
-func (m *ActionLink) XXX_Size() int {
-	return xxx_messageInfo_ActionLink.Size(m)
-}
-func (m *ActionLink) XXX_DiscardUnknown() {
-	xxx_messageInfo_ActionLink.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ActionLink proto.InternalMessageInfo
+func (m *ActionLink) Reset()                    { *m = ActionLink{} }
+func (m *ActionLink) String() string            { return proto.CompactTextString(m) }
+func (*ActionLink) ProtoMessage()               {}
+func (*ActionLink) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
 
 func (m *ActionLink) GetUrl() string {
 	if m != nil {
@@ -1980,41 +1777,18 @@
 type TicketType struct {
 	// The ticket id is used to differentiate among different ticket types of the
 	// same service, and is only expected to be unique within a service.
-	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
+	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId" json:"ticket_type_id,omitempty"`
 	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
-	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
+	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription" json:"short_description,omitempty"`
 	// The price of a single ticket of this type, exclusive of any taxes. The tax
 	// rate of Service is applied to its tickets.
-	Price                *Price   `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Price *Price `protobuf:"bytes,3,opt,name=price" json:"price,omitempty"`
 }
 
-func (m *TicketType) Reset()         { *m = TicketType{} }
-func (m *TicketType) String() string { return proto.CompactTextString(m) }
-func (*TicketType) ProtoMessage()    {}
-func (*TicketType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{16}
-}
-
-func (m *TicketType) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TicketType.Unmarshal(m, b)
-}
-func (m *TicketType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TicketType.Marshal(b, m, deterministic)
-}
-func (m *TicketType) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TicketType.Merge(m, src)
-}
-func (m *TicketType) XXX_Size() int {
-	return xxx_messageInfo_TicketType.Size(m)
-}
-func (m *TicketType) XXX_DiscardUnknown() {
-	xxx_messageInfo_TicketType.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TicketType proto.InternalMessageInfo
+func (m *TicketType) Reset()                    { *m = TicketType{} }
+func (m *TicketType) String() string            { return proto.CompactTextString(m) }
+func (*TicketType) ProtoMessage()               {}
+func (*TicketType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
 
 func (m *TicketType) GetTicketTypeId() string {
 	if m != nil {
@@ -2041,41 +1815,23 @@
 // (only photos are supported for now). Google will crawl the media data to
 // ensure that they are displayed to end-users in the most efficient way.
 type RelatedMedia struct {
-	// URL of this media source.
-	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
+	// URL of this media source. Google will crawl the media hosted at this URL.
+	Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
 	// Type of this media source.
-	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
-	// Caption of the media, only plain text is supported. (optional)
-	Caption              string   `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
+	// Caption of the media, only plain text is supported. Any HTML components
+	// will be stripped. (optional)
+	Caption string `protobuf:"bytes,3,opt,name=caption" json:"caption,omitempty"`
+	// Attribution information about the source of the media. Note that if
+	// the attribution is required to display with the media to give credit to
+	// photographer or agency, this field must be set. (optional)
+	Attribution *RelatedMedia_Attribution `protobuf:"bytes,4,opt,name=attribution" json:"attribution,omitempty"`
 }
 
-func (m *RelatedMedia) Reset()         { *m = RelatedMedia{} }
-func (m *RelatedMedia) String() string { return proto.CompactTextString(m) }
-func (*RelatedMedia) ProtoMessage()    {}
-func (*RelatedMedia) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{17}
-}
-
-func (m *RelatedMedia) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RelatedMedia.Unmarshal(m, b)
-}
-func (m *RelatedMedia) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RelatedMedia.Marshal(b, m, deterministic)
-}
-func (m *RelatedMedia) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RelatedMedia.Merge(m, src)
-}
-func (m *RelatedMedia) XXX_Size() int {
-	return xxx_messageInfo_RelatedMedia.Size(m)
-}
-func (m *RelatedMedia) XXX_DiscardUnknown() {
-	xxx_messageInfo_RelatedMedia.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RelatedMedia proto.InternalMessageInfo
+func (m *RelatedMedia) Reset()                    { *m = RelatedMedia{} }
+func (m *RelatedMedia) String() string            { return proto.CompactTextString(m) }
+func (*RelatedMedia) ProtoMessage()               {}
+func (*RelatedMedia) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
 
 func (m *RelatedMedia) GetUrl() string {
 	if m != nil {
@@ -2098,44 +1854,49 @@
 	return ""
 }
 
+func (m *RelatedMedia) GetAttribution() *RelatedMedia_Attribution {
+	if m != nil {
+		return m.Attribution
+	}
+	return nil
+}
+
+// Attribution information for this media.
+type RelatedMedia_Attribution struct {
+	// The text to give credit to the photographer or agency. This text will be
+	// displayed together with the source media. Note that only plain text is
+	// supported for this field, any HTML components will be stripped (hyperlink
+	// based attribution is not supported).
+	Text string `protobuf:"bytes,1,opt,name=text" json:"text,omitempty"`
+}
+
+func (m *RelatedMedia_Attribution) Reset()                    { *m = RelatedMedia_Attribution{} }
+func (m *RelatedMedia_Attribution) String() string            { return proto.CompactTextString(m) }
+func (*RelatedMedia_Attribution) ProtoMessage()               {}
+func (*RelatedMedia_Attribution) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17, 0} }
+
+func (m *RelatedMedia_Attribution) GetText() string {
+	if m != nil {
+		return m.Text
+	}
+	return ""
+}
+
 // Identifies a particular value of a service attribute to be applied to a
 // Service.
 type ServiceAttributeValueId struct {
 	// ID of an attribute as defined in Merchant.service_attribute, e.g.
 	// "service-type".
-	AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId,proto3" json:"attribute_id,omitempty"`
+	AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId" json:"attribute_id,omitempty"`
 	// ID of the value for this attribute, e.g. "haircut". Must match a value_id
 	// in the service attribute definition.
-	ValueId              string   `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	ValueId string `protobuf:"bytes,2,opt,name=value_id,json=valueId" json:"value_id,omitempty"`
 }
 
-func (m *ServiceAttributeValueId) Reset()         { *m = ServiceAttributeValueId{} }
-func (m *ServiceAttributeValueId) String() string { return proto.CompactTextString(m) }
-func (*ServiceAttributeValueId) ProtoMessage()    {}
-func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{18}
-}
-
-func (m *ServiceAttributeValueId) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ServiceAttributeValueId.Unmarshal(m, b)
-}
-func (m *ServiceAttributeValueId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ServiceAttributeValueId.Marshal(b, m, deterministic)
-}
-func (m *ServiceAttributeValueId) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceAttributeValueId.Merge(m, src)
-}
-func (m *ServiceAttributeValueId) XXX_Size() int {
-	return xxx_messageInfo_ServiceAttributeValueId.Size(m)
-}
-func (m *ServiceAttributeValueId) XXX_DiscardUnknown() {
-	xxx_messageInfo_ServiceAttributeValueId.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ServiceAttributeValueId proto.InternalMessageInfo
+func (m *ServiceAttributeValueId) Reset()                    { *m = ServiceAttributeValueId{} }
+func (m *ServiceAttributeValueId) String() string            { return proto.CompactTextString(m) }
+func (*ServiceAttributeValueId) ProtoMessage()               {}
+func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
 
 func (m *ServiceAttributeValueId) GetAttributeId() string {
 	if m != nil {
@@ -2156,43 +1917,20 @@
 	// Required. Must be a positive integer for services providing waitlist
 	// functionality. If the service or merchant does not provide waitlist
 	// functionality, this must not be populated.
-	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize,proto3" json:"min_party_size,omitempty"`
+	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize" json:"min_party_size,omitempty"`
 	// Required. Must be a positive integer for services providing waitlist
 	// functionality. If the service or merchant does not provide waitlist
 	// functionality, this must not be populated.
-	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize,proto3" json:"max_party_size,omitempty"`
+	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize" json:"max_party_size,omitempty"`
 	// If true, the user will be able to send a free-form additional text request
 	// when joining the waitlist for this service.
-	SupportsAdditionalRequest bool     `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest,proto3" json:"supports_additional_request,omitempty"`
-	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
-	XXX_unrecognized          []byte   `json:"-"`
-	XXX_sizecache             int32    `json:"-"`
+	SupportsAdditionalRequest bool `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest" json:"supports_additional_request,omitempty"`
 }
 
-func (m *WaitlistRules) Reset()         { *m = WaitlistRules{} }
-func (m *WaitlistRules) String() string { return proto.CompactTextString(m) }
-func (*WaitlistRules) ProtoMessage()    {}
-func (*WaitlistRules) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7aa923a38d4cd9d3, []int{19}
-}
-
-func (m *WaitlistRules) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_WaitlistRules.Unmarshal(m, b)
-}
-func (m *WaitlistRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_WaitlistRules.Marshal(b, m, deterministic)
-}
-func (m *WaitlistRules) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_WaitlistRules.Merge(m, src)
-}
-func (m *WaitlistRules) XXX_Size() int {
-	return xxx_messageInfo_WaitlistRules.Size(m)
-}
-func (m *WaitlistRules) XXX_DiscardUnknown() {
-	xxx_messageInfo_WaitlistRules.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_WaitlistRules proto.InternalMessageInfo
+func (m *WaitlistRules) Reset()                    { *m = WaitlistRules{} }
+func (m *WaitlistRules) String() string            { return proto.CompactTextString(m) }
+func (*WaitlistRules) ProtoMessage()               {}
+func (*WaitlistRules) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
 
 func (m *WaitlistRules) GetMinPartySize() int32 {
 	if m != nil {
@@ -2222,6 +1960,7 @@
 	proto.RegisterType((*Availability)(nil), "maps.booking.feeds.Availability")
 	proto.RegisterType((*Availability_Recurrence)(nil), "maps.booking.feeds.Availability.Recurrence")
 	proto.RegisterType((*Availability_ScheduleException)(nil), "maps.booking.feeds.Availability.ScheduleException")
+	proto.RegisterType((*Availability_SchedulingRuleOverrides)(nil), "maps.booking.feeds.Availability.SchedulingRuleOverrides")
 	proto.RegisterType((*Resources)(nil), "maps.booking.feeds.Resources")
 	proto.RegisterType((*TimeRange)(nil), "maps.booking.feeds.TimeRange")
 	proto.RegisterType((*ServiceFeed)(nil), "maps.booking.feeds.ServiceFeed")
@@ -2236,6 +1975,7 @@
 	proto.RegisterType((*ActionLink)(nil), "maps.booking.feeds.ActionLink")
 	proto.RegisterType((*TicketType)(nil), "maps.booking.feeds.TicketType")
 	proto.RegisterType((*RelatedMedia)(nil), "maps.booking.feeds.RelatedMedia")
+	proto.RegisterType((*RelatedMedia_Attribution)(nil), "maps.booking.feeds.RelatedMedia.Attribution")
 	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
 	proto.RegisterType((*WaitlistRules)(nil), "maps.booking.feeds.WaitlistRules")
 	proto.RegisterEnum("maps.booking.feeds.PriceType", PriceType_name, PriceType_value)
@@ -2244,165 +1984,183 @@
 	proto.RegisterEnum("maps.booking.feeds.FeedMetadata_ProcessingInstruction", FeedMetadata_ProcessingInstruction_name, FeedMetadata_ProcessingInstruction_value)
 	proto.RegisterEnum("maps.booking.feeds.Service_PrepaymentType", Service_PrepaymentType_name, Service_PrepaymentType_value)
 	proto.RegisterEnum("maps.booking.feeds.Service_ServiceType", Service_ServiceType_name, Service_ServiceType_value)
+	proto.RegisterEnum("maps.booking.feeds.SchedulingRules_AdmissionPolicy", SchedulingRules_AdmissionPolicy_name, SchedulingRules_AdmissionPolicy_value)
 	proto.RegisterEnum("maps.booking.feeds.ServiceIntakeFormField_FieldType", ServiceIntakeFormField_FieldType_name, ServiceIntakeFormField_FieldType_value)
 	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
 }
 
-func init() { proto.RegisterFile("feeds.proto", fileDescriptor_7aa923a38d4cd9d3) }
+func init() { proto.RegisterFile("github.com/maps-booking-v3/feeds/feeds.proto", fileDescriptor0) }
 
-var fileDescriptor_7aa923a38d4cd9d3 = []byte{
-	// 2434 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcf, 0x73, 0xdb, 0xc6,
-	0xf5, 0x0f, 0x49, 0xd1, 0x24, 0x1f, 0x29, 0x09, 0x5a, 0xc9, 0x12, 0x6d, 0xc7, 0xb1, 0x82, 0x7c,
-	0x33, 0x5f, 0xd7, 0x4e, 0xd5, 0xd6, 0x4e, 0x32, 0xe9, 0xe4, 0x27, 0x4d, 0x82, 0x31, 0xc6, 0x14,
-	0x81, 0x2c, 0xa9, 0x28, 0xce, 0x65, 0x03, 0x01, 0x2b, 0x09, 0x63, 0x12, 0x60, 0x17, 0xa0, 0x6d,
-	0x65, 0x26, 0x97, 0x9e, 0x7a, 0xec, 0x4c, 0x6f, 0xed, 0x4c, 0xcf, 0xed, 0x34, 0x7f, 0x41, 0x4f,
-	0xed, 0xb5, 0xff, 0x4c, 0xff, 0x80, 0x5e, 0x3a, 0xfb, 0x16, 0x04, 0x40, 0x09, 0xb2, 0x9d, 0x26,
-	0x17, 0x19, 0xfb, 0xde, 0xe7, 0xbd, 0xdd, 0x7d, 0xbb, 0xef, 0xf3, 0xde, 0xd2, 0xd0, 0x3c, 0xe6,
-	0xdc, 0x8b, 0xf6, 0x66, 0x22, 0x8c, 0x43, 0x42, 0xa6, 0xce, 0x2c, 0xda, 0x3b, 0x0a, 0xc3, 0x27,
-	0x7e, 0x70, 0xb2, 0x87, 0x1a, 0xfd, 0xdf, 0x65, 0x68, 0xf5, 0x39, 0xf7, 0xf6, 0x79, 0xec, 0x78,
-	0x4e, 0xec, 0x90, 0x29, 0x6c, 0xcf, 0x44, 0xe8, 0xf2, 0x28, 0xf2, 0x83, 0x13, 0xe6, 0x07, 0x51,
-	0x2c, 0xe6, 0x6e, 0xec, 0x87, 0x41, 0xbb, 0xb4, 0x5b, 0xba, 0xbd, 0x76, 0xef, 0xfd, 0xbd, 0x8b,
-	0x5e, 0xf6, 0xf2, 0x1e, 0xf6, 0xec, 0xd4, 0xdc, 0xcc, 0xac, 0xe9, 0xd5, 0x59, 0x91, 0x98, 0xbc,
-	0x09, 0xad, 0xe8, 0xd4, 0x11, 0x1e, 0x0b, 0xe6, 0xd3, 0x23, 0x2e, 0xda, 0xe5, 0xdd, 0xd2, 0xed,
-	0x2a, 0x6d, 0xa2, 0x6c, 0x88, 0x22, 0x09, 0x89, 0xc3, 0xd8, 0x99, 0x30, 0x14, 0x46, 0xed, 0x8a,
-	0x82, 0xa0, 0x6c, 0x84, 0x22, 0xb2, 0x05, 0xd5, 0x20, 0x0c, 0x5c, 0xde, 0xae, 0xee, 0x96, 0x6e,
-	0xaf, 0x50, 0x35, 0x20, 0xbf, 0x82, 0xad, 0x13, 0x1e, 0x70, 0xe1, 0xc8, 0x99, 0x58, 0xec, 0x4f,
-	0x79, 0x14, 0x3b, 0xd3, 0x59, 0x7b, 0x65, 0xb7, 0x74, 0xbb, 0x42, 0x37, 0x33, 0xdd, 0x78, 0xa1,
-	0xd2, 0x1d, 0xb8, 0x5a, 0xb8, 0x7c, 0xb2, 0x09, 0xeb, 0x36, 0xb5, 0xba, 0xc6, 0x68, 0xc4, 0x0e,
-	0x86, 0x8f, 0x86, 0xd6, 0xe1, 0x50, 0x7b, 0x8d, 0xec, 0xc0, 0xe6, 0x42, 0xd8, 0x19, 0xb1, 0xae,
-	0xb5, 0x6f, 0x0f, 0x8c, 0xb1, 0xa1, 0x95, 0xc8, 0x75, 0xd8, 0xce, 0x29, 0xcc, 0x61, 0x97, 0x1a,
-	0xfb, 0xc6, 0x70, 0xdc, 0x19, 0x68, 0x65, 0xfd, 0xfb, 0x12, 0x68, 0x9d, 0xa7, 0x8e, 0x3f, 0x71,
-	0x8e, 0xfc, 0x89, 0x1f, 0x9f, 0xc9, 0xd8, 0x91, 0x8f, 0xa0, 0x3e, 0x4d, 0xe2, 0x87, 0x71, 0x6e,
-	0xde, 0xdb, 0x7d, 0x59, 0x9c, 0x69, 0x6a, 0x41, 0xbe, 0x86, 0xad, 0x88, 0x8b, 0xa7, 0xbe, 0xcb,
-	0x99, 0x93, 0xf3, 0xdc, 0x2e, 0xef, 0x56, 0x6e, 0x37, 0xef, 0xfd, 0x7f, 0x91, 0xa7, 0x91, 0xc2,
-	0xe7, 0x17, 0x42, 0x37, 0xa3, 0x8b, 0x42, 0xfd, 0x3f, 0x65, 0xd8, 0x2c, 0x00, 0x93, 0x0f, 0xa0,
-	0x1d, 0xc5, 0x8e, 0x88, 0xb3, 0xb8, 0x32, 0xc1, 0xa3, 0x58, 0xf8, 0x6e, 0x8c, 0x3b, 0xa8, 0xd0,
-	0x6d, 0xd4, 0xa7, 0xb1, 0xa5, 0x89, 0x96, 0xbc, 0x0b, 0xdb, 0x3c, 0xf0, 0x8a, 0xec, 0xca, 0x68,
-	0xb7, 0xc5, 0x03, 0xef, 0xa2, 0xd5, 0x2f, 0x61, 0x6b, 0xca, 0x85, 0x7b, 0xea, 0x04, 0x31, 0xf3,
-	0xbd, 0xcc, 0x46, 0xde, 0x86, 0x06, 0x25, 0x0b, 0x9d, 0xe9, 0xa5, 0x16, 0x7b, 0xb0, 0xd8, 0xd0,
-	0x92, 0xc1, 0x0a, 0x1a, 0x6c, 0x24, 0xaa, 0x1c, 0x7e, 0x00, 0x44, 0xf0, 0x28, 0x9c, 0x0b, 0x97,
-	0x47, 0x19, 0xfc, 0x0a, 0x9e, 0xc6, 0xcd, 0xa2, 0x18, 0xd2, 0x05, 0x9a, 0x6e, 0xa4, 0x86, 0xa9,
-	0xb7, 0x1e, 0xb4, 0x96, 0xce, 0xa2, 0x8a, 0x67, 0x51, 0x78, 0xaa, 0x4b, 0x87, 0xb0, 0x64, 0xa5,
-	0xff, 0xbd, 0x06, 0xad, 0xa5, 0xb0, 0xdf, 0x82, 0x66, 0x2e, 0x0c, 0x18, 0xe9, 0x06, 0x85, 0x6c,
-	0xf7, 0xe4, 0x26, 0x40, 0xb6, 0x6b, 0x8c, 0x68, 0x83, 0x36, 0xd2, 0xcd, 0x92, 0x1b, 0xd0, 0x50,
-	0xc7, 0x16, 0x71, 0x17, 0x63, 0x57, 0xa1, 0x75, 0x14, 0x8c, 0xb8, 0x2b, 0x33, 0xcd, 0x9b, 0x27,
-	0xe9, 0x22, 0xf5, 0x2a, 0x51, 0x9a, 0x0b, 0x99, 0x84, 0xdc, 0x82, 0x66, 0x34, 0x0b, 0xe3, 0x88,
-	0x61, 0xfa, 0x61, 0xbe, 0x55, 0x28, 0xa0, 0x68, 0x2c, 0x25, 0x38, 0x3f, 0x02, 0xc2, 0x19, 0x0f,
-	0x30, 0x7a, 0x15, 0xda, 0x40, 0x89, 0x35, 0xe3, 0x01, 0xf9, 0x19, 0x68, 0xf9, 0x0d, 0xb2, 0xd8,
-	0x39, 0x69, 0xd7, 0x70, 0x91, 0xeb, 0x79, 0xf9, 0xd8, 0x39, 0x21, 0x1f, 0x42, 0x23, 0x0d, 0x6b,
-	0xbb, 0xfe, 0x2a, 0xc7, 0x90, 0xe1, 0xc9, 0x1d, 0xd8, 0x98, 0x39, 0x67, 0x53, 0x1e, 0xc4, 0x2c,
-	0x9c, 0xe1, 0x86, 0x7c, 0xaf, 0xdd, 0xd8, 0xad, 0xc8, 0x89, 0x12, 0x85, 0x85, 0x72, 0xd3, 0x23,
-	0x8f, 0x00, 0x04, 0x77, 0xe7, 0x42, 0x70, 0x49, 0x21, 0x80, 0x33, 0xdd, 0x7d, 0xd9, 0x41, 0xed,
-	0xd1, 0xd4, 0x84, 0xe6, 0xcc, 0x89, 0x03, 0x24, 0x72, 0x4f, 0xb9, 0x37, 0x9f, 0x70, 0xc6, 0x9f,
-	0xbb, 0x1c, 0x27, 0x69, 0x37, 0xf1, 0xf4, 0xef, 0xbd, 0xd4, 0xe9, 0x28, 0x31, 0x35, 0x16, 0x96,
-	0x74, 0x23, 0x3a, 0x2f, 0x22, 0xef, 0x41, 0xcd, 0xe3, 0xb3, 0x30, 0xf2, 0xe3, 0x76, 0x0b, 0x17,
-	0x7b, 0xa3, 0xc8, 0x6f, 0x4f, 0x41, 0xe8, 0x02, 0x4b, 0x3e, 0x86, 0x66, 0x10, 0xb2, 0xe8, 0x34,
-	0x7c, 0xc6, 0x8e, 0x39, 0x6f, 0xaf, 0x5e, 0x1e, 0xd1, 0x61, 0x38, 0x3a, 0x0d, 0x9f, 0xf5, 0x39,
-	0xa7, 0x8d, 0x60, 0xf1, 0x49, 0x0e, 0x60, 0x53, 0xf0, 0xdf, 0xcc, 0x7d, 0xc1, 0x99, 0x2b, 0xb8,
-	0xe7, 0xc7, 0xcc, 0x75, 0x84, 0xd7, 0x5e, 0xc3, 0xaa, 0xf0, 0x76, 0xf1, 0xc1, 0x20, 0xbc, 0x8b,
-	0xe8, 0xae, 0x23, 0x3c, 0x99, 0x27, 0xe7, 0x44, 0xe4, 0xff, 0x60, 0x2d, 0xf6, 0xdd, 0x27, 0x3c,
-	0x66, 0xf1, 0xd9, 0x0c, 0xef, 0xec, 0x3a, 0x9e, 0x52, 0x4b, 0x49, 0xc7, 0x67, 0x33, 0x6e, 0x7a,
-	0xd7, 0xbf, 0x01, 0xc8, 0xe2, 0x4d, 0x6e, 0x83, 0x26, 0xf8, 0x8c, 0x3b, 0x31, 0x9b, 0x07, 0xb1,
-	0x3f, 0xc1, 0xbb, 0xaa, 0x38, 0x67, 0x4d, 0xc9, 0x0f, 0xa4, 0x58, 0x5e, 0xd7, 0x0c, 0xc9, 0x9f,
-	0x72, 0x71, 0x86, 0x48, 0x55, 0x62, 0x12, 0xa4, 0x21, 0xc5, 0x23, 0xee, 0x5e, 0xff, 0x02, 0x36,
-	0x2e, 0x04, 0x9f, 0x7c, 0x04, 0x20, 0x69, 0x8a, 0x09, 0x27, 0x38, 0xe1, 0x09, 0x31, 0x17, 0x46,
-	0x4c, 0xf2, 0x15, 0x95, 0x20, 0xda, 0x88, 0x17, 0x9f, 0xfa, 0x1f, 0x4b, 0xd0, 0x48, 0x2f, 0x27,
-	0xb9, 0x06, 0x32, 0xd1, 0x8e, 0x8f, 0xb3, 0xb4, 0xad, 0xe1, 0x38, 0xc9, 0x59, 0x54, 0x05, 0xce,
-	0x94, 0xa7, 0x39, 0x2b, 0x25, 0x43, 0x67, 0xca, 0xc9, 0x0e, 0xd4, 0x44, 0x18, 0x4e, 0xa5, 0xa1,
-	0x62, 0xbb, 0x2b, 0x72, 0xa8, 0x92, 0x19, 0x15, 0x68, 0xa6, 0x78, 0xad, 0x2e, 0x05, 0x68, 0x75,
-	0x13, 0x60, 0xe6, 0x88, 0xf8, 0x8c, 0x45, 0xfe, 0xb7, 0xaa, 0x30, 0x56, 0x69, 0x03, 0x25, 0x23,
-	0xff, 0x5b, 0xae, 0x77, 0xa0, 0x91, 0x2e, 0x5a, 0x3a, 0x3a, 0xe2, 0x27, 0x7e, 0x90, 0x8b, 0x64,
-	0x1d, 0x05, 0x32, 0x86, 0x3b, 0x50, 0x93, 0x7c, 0xbd, 0x08, 0x5d, 0x85, 0x5e, 0xe1, 0x81, 0x37,
-	0xe2, 0xae, 0xfe, 0xdb, 0x12, 0x34, 0x93, 0xd2, 0xf0, 0x13, 0x14, 0xb1, 0xf7, 0xa0, 0x96, 0xd0,
-	0x54, 0x52, 0xb7, 0x6e, 0xbc, 0xa0, 0x6e, 0xd1, 0x05, 0x56, 0xff, 0x73, 0x0b, 0x6a, 0x89, 0xf0,
-	0x47, 0x93, 0x23, 0x81, 0x15, 0x0c, 0xa5, 0x8a, 0x32, 0x7e, 0x93, 0x5d, 0x68, 0x7a, 0x3c, 0x72,
-	0x85, 0xaf, 0x12, 0x59, 0x45, 0x39, 0x2f, 0x22, 0xbf, 0x80, 0xea, 0x4c, 0xf8, 0x49, 0xf3, 0xd1,
-	0xbc, 0x77, 0xad, 0x68, 0xd9, 0xb6, 0x04, 0x50, 0x85, 0x23, 0xbf, 0x86, 0xaa, 0x98, 0x4f, 0x78,
-	0x94, 0xd4, 0x96, 0xb7, 0x0a, 0xf7, 0xa9, 0xee, 0xa2, 0x1f, 0x9c, 0x50, 0x09, 0xa5, 0xca, 0x82,
-	0x7c, 0x0c, 0x2b, 0xc7, 0xa1, 0x98, 0xb6, 0x6b, 0x18, 0xa1, 0xb7, 0x5f, 0x10, 0x21, 0x33, 0x88,
-	0x9d, 0x27, 0xbc, 0x1f, 0x8a, 0xe9, 0x83, 0x72, 0xbb, 0x44, 0xd1, 0x8c, 0xf4, 0xa1, 0xe9, 0xa3,
-	0x9c, 0xa1, 0x97, 0x2d, 0x9c, 0xff, 0xd5, 0xbc, 0x50, 0xf0, 0xd3, 0x6f, 0xf2, 0x35, 0x6c, 0xcf,
-	0xb8, 0x60, 0x49, 0xe2, 0xe6, 0x5d, 0x5e, 0xfd, 0x21, 0x2e, 0x37, 0x67, 0x5c, 0x8c, 0xd1, 0x47,
-	0x26, 0x24, 0x23, 0x58, 0x9f, 0x09, 0xbe, 0x20, 0x6f, 0x49, 0x0a, 0x48, 0xfe, 0x6b, 0xf7, 0xee,
-	0xbc, 0xc0, 0xe9, 0x9e, 0x9d, 0x9a, 0x48, 0xc6, 0xa0, 0x6b, 0xb3, 0xa5, 0x31, 0x79, 0x1f, 0xea,
-	0xb1, 0xf3, 0x9c, 0x09, 0x27, 0xe6, 0xed, 0xc6, 0xe5, 0x9c, 0x39, 0x76, 0x9e, 0x53, 0x27, 0xe6,
-	0xb4, 0x16, 0xab, 0x8f, 0xe2, 0x32, 0x02, 0xc5, 0x65, 0x24, 0x47, 0xcb, 0xcd, 0xff, 0x9d, 0x96,
-	0x5b, 0x3f, 0x0d, 0x2d, 0xaf, 0xfe, 0x48, 0x5a, 0xfe, 0x14, 0x9a, 0x0e, 0x76, 0xbe, 0x6c, 0xe2,
-	0x07, 0x4f, 0xda, 0x6b, 0x78, 0xdf, 0xde, 0x28, 0xac, 0x5f, 0x08, 0x1b, 0xf8, 0xc1, 0x13, 0x0a,
-	0x4e, 0xfa, 0x4d, 0x3e, 0x84, 0x15, 0x3c, 0xbb, 0x75, 0x5c, 0xc8, 0x8b, 0x7a, 0xd0, 0xc5, 0xbf,
-	0x78, 0x70, 0x68, 0x24, 0x67, 0xcf, 0x15, 0x85, 0xb6, 0x76, 0xf9, 0xec, 0xe3, 0xb4, 0x4a, 0x50,
-	0xc8, 0x2a, 0x06, 0x31, 0x60, 0x55, 0xf0, 0x89, 0x13, 0x73, 0x8f, 0x4d, 0xb9, 0xe7, 0x3b, 0xed,
-	0x8d, 0xcb, 0xdb, 0x2f, 0xaa, 0x80, 0xfb, 0x12, 0x47, 0x5b, 0x22, 0x37, 0x22, 0xa7, 0x70, 0x3d,
-	0x6d, 0xac, 0xe3, 0x58, 0xf8, 0x47, 0xf3, 0x98, 0xb3, 0xa7, 0xce, 0x64, 0x8e, 0xfc, 0x41, 0xd0,
-	0xe7, 0xdd, 0x17, 0xb5, 0xd7, 0x0b, 0xa3, 0x2f, 0xa5, 0x8d, 0xe9, 0xd1, 0x9d, 0xa8, 0x58, 0x41,
-	0x1e, 0xc2, 0xda, 0x33, 0xc7, 0x8f, 0x27, 0x7e, 0x14, 0x33, 0x45, 0x0e, 0x9b, 0x78, 0x11, 0xde,
-	0x2c, 0xf2, 0x7e, 0x98, 0x20, 0x15, 0x35, 0xac, 0x3e, 0xcb, 0x0f, 0xf5, 0x6f, 0x60, 0x6d, 0x39,
-	0x19, 0xc8, 0x2d, 0xb8, 0x61, 0x53, 0xc3, 0xee, 0x3c, 0x96, 0x6f, 0x10, 0x36, 0x7e, 0x6c, 0x1b,
-	0xec, 0x60, 0x38, 0xb2, 0x8d, 0xae, 0xd9, 0x37, 0x8d, 0x9e, 0xf6, 0x1a, 0x69, 0x41, 0x9d, 0x1a,
-	0x5f, 0x1c, 0x98, 0xd4, 0xe8, 0x69, 0x25, 0x39, 0xb2, 0xec, 0xb1, 0x69, 0x0d, 0xe5, 0x73, 0x85,
-	0x6c, 0xc0, 0xea, 0xd0, 0x1a, 0xb3, 0xd1, 0x81, 0x6d, 0x5b, 0x74, 0x6c, 0xf4, 0xb4, 0x8a, 0xfe,
-	0xb7, 0x8c, 0xf7, 0xd1, 0xff, 0xeb, 0xd0, 0x1e, 0x19, 0xf4, 0x4b, 0xb3, 0x6b, 0x14, 0x39, 0x7f,
-	0x0b, 0x6e, 0x2d, 0x69, 0x7b, 0xe6, 0xd0, 0x1c, 0x7e, 0xce, 0xa8, 0x21, 0xa5, 0x1d, 0x39, 0x8f,
-	0x56, 0x22, 0x6f, 0xc0, 0xf5, 0x25, 0x50, 0xdf, 0xb2, 0x7a, 0xcc, 0xa2, 0x3d, 0x83, 0x9a, 0xc3,
-	0xcf, 0xb5, 0x32, 0xb9, 0x09, 0xd7, 0x96, 0xf4, 0xc6, 0x97, 0xb8, 0x15, 0xb3, 0xfb, 0xc8, 0x18,
-	0x6b, 0x15, 0xf9, 0xde, 0x5a, 0x52, 0x8f, 0xa9, 0x69, 0xb3, 0xb1, 0x75, 0x40, 0xb5, 0x15, 0xfd,
-	0x3b, 0xa8, 0x22, 0xfb, 0xca, 0xee, 0x16, 0xf9, 0x97, 0x4d, 0x7d, 0x57, 0x84, 0x51, 0x52, 0xe7,
-	0x9a, 0x28, 0xdb, 0x47, 0x11, 0x79, 0x0b, 0x56, 0x93, 0x26, 0xe3, 0x8c, 0xb9, 0xa1, 0xb7, 0xa8,
-	0xc5, 0xad, 0x85, 0xb0, 0x1b, 0x7a, 0x9c, 0xbc, 0x03, 0x44, 0xda, 0xc8, 0xe7, 0x71, 0xc2, 0x09,
-	0xb2, 0x89, 0x55, 0x35, 0x43, 0x4b, 0x34, 0x8a, 0x14, 0xc6, 0xce, 0x89, 0xfe, 0x87, 0x32, 0xac,
-	0x9f, 0x23, 0x73, 0xf9, 0x32, 0x99, 0xfa, 0x01, 0x73, 0xbc, 0xa7, 0x4e, 0xe0, 0x72, 0x96, 0x1c,
-	0x6e, 0xb2, 0xa0, 0x8d, 0xa9, 0x1f, 0x74, 0x94, 0xe6, 0x81, 0x52, 0x90, 0x4f, 0xe1, 0xf5, 0x3c,
-	0x3e, 0x0c, 0x26, 0x7e, 0xc0, 0x99, 0x2b, 0x07, 0xd2, 0x69, 0x52, 0x96, 0xaf, 0x65, 0x86, 0x16,
-	0x22, 0xba, 0x0b, 0x00, 0xf9, 0x02, 0xae, 0xca, 0x5b, 0x9d, 0x98, 0x4c, 0x54, 0x87, 0x2f, 0xd9,
-	0xa6, 0xf2, 0x92, 0x92, 0x85, 0xb5, 0x63, 0x53, 0xda, 0x76, 0x73, 0xa6, 0x92, 0x77, 0x3e, 0x02,
-	0x08, 0xc2, 0x94, 0xb5, 0x56, 0x5e, 0xc5, 0x4f, 0x43, 0x19, 0xf4, 0x39, 0xd7, 0xf7, 0xa0, 0x96,
-	0x70, 0xad, 0x8c, 0x39, 0x1e, 0x08, 0x9b, 0x71, 0xe1, 0xf2, 0x40, 0xbd, 0x1e, 0xab, 0xb4, 0x85,
-	0x42, 0x5b, 0xc9, 0xf4, 0x7f, 0x95, 0x61, 0xfb, 0x42, 0xfd, 0xe8, 0xfb, 0x7c, 0xe2, 0x91, 0x35,
-	0x28, 0xfb, 0x1e, 0xd6, 0xde, 0x06, 0x2d, 0xfb, 0x32, 0x93, 0x14, 0xf1, 0xa8, 0x9f, 0x2b, 0xde,
-	0x7d, 0xa5, 0x4a, 0x84, 0x9e, 0xf6, 0xf0, 0x6f, 0x8e, 0x85, 0xb6, 0xa0, 0x3a, 0x71, 0x8e, 0xf8,
-	0x24, 0xb9, 0x05, 0x6a, 0x20, 0xa5, 0xc8, 0x00, 0xed, 0x0a, 0x96, 0x01, 0x35, 0x90, 0xad, 0x87,
-	0x2f, 0x5f, 0x8d, 0xc8, 0xa3, 0x1e, 0xc6, 0xa3, 0x4e, 0xc1, 0x8f, 0x12, 0xb2, 0xf5, 0xf4, 0xdf,
-	0x95, 0xa0, 0x91, 0x4e, 0x20, 0x2f, 0x6c, 0xdf, 0x34, 0x06, 0xbd, 0xa2, 0x84, 0xd1, 0xa0, 0x35,
-	0x7a, 0x68, 0xd1, 0x31, 0xeb, 0x0c, 0x47, 0x87, 0x06, 0xd5, 0x4a, 0x64, 0x15, 0x1a, 0x76, 0x87,
-	0x76, 0x3e, 0xa7, 0x1d, 0xfb, 0xa1, 0x56, 0x26, 0x9b, 0xb0, 0xbe, 0x7f, 0x30, 0x18, 0x9b, 0xf6,
-	0xc0, 0x60, 0xdd, 0x87, 0x96, 0xd9, 0x35, 0xb4, 0x0a, 0x59, 0x03, 0xe8, 0x3e, 0x34, 0xba, 0x8f,
-	0x1e, 0x58, 0x5f, 0x19, 0x23, 0x6d, 0x45, 0x66, 0x71, 0x8f, 0x5a, 0x76, 0xcf, 0x3a, 0x1c, 0x6a,
-	0x55, 0xd2, 0x84, 0xda, 0x03, 0xcb, 0x1a, 0x18, 0x9d, 0xa1, 0x76, 0x45, 0xff, 0x47, 0x09, 0x36,
-	0x2e, 0x84, 0x80, 0x7c, 0x06, 0xd5, 0x63, 0xb9, 0xbe, 0x76, 0x09, 0x69, 0xed, 0xce, 0xab, 0x07,
-	0x8e, 0x2a, 0x43, 0xf2, 0x2e, 0x6c, 0x1d, 0xfb, 0x22, 0x52, 0x3f, 0x09, 0x30, 0x77, 0x1e, 0xc5,
-	0xe1, 0x94, 0x8b, 0x08, 0xc3, 0x57, 0xc7, 0x1b, 0x40, 0x50, 0x2f, 0xfb, 0xce, 0xee, 0x42, 0x4b,
-	0xee, 0xcb, 0x02, 0x16, 0xcf, 0x45, 0x20, 0x13, 0x2a, 0x33, 0xaa, 0x64, 0x46, 0xa9, 0x3a, 0x35,
-	0xd2, 0xff, 0x59, 0x82, 0x5a, 0x52, 0x49, 0xc9, 0xfd, 0xac, 0xee, 0x96, 0x5e, 0xd6, 0x81, 0xa5,
-	0x55, 0xf7, 0x5c, 0x4a, 0x2d, 0x25, 0x46, 0xd6, 0xe9, 0xe6, 0x52, 0x2a, 0x7f, 0xff, 0x65, 0x57,
-	0xfc, 0x19, 0xb4, 0x12, 0x5f, 0xaa, 0x46, 0x55, 0xf0, 0xba, 0xdd, 0xbc, 0x74, 0x6a, 0xbc, 0x57,
-	0xcd, 0xc4, 0x44, 0x0e, 0x74, 0x01, 0x8d, 0xb4, 0xa2, 0x93, 0xbb, 0x50, 0x91, 0x79, 0xf4, 0xd2,
-	0x0d, 0x48, 0x14, 0xf9, 0x00, 0xea, 0xc7, 0x9c, 0xff, 0x80, 0x79, 0x6b, 0xc7, 0x1c, 0x3f, 0xf4,
-	0xbf, 0x96, 0x00, 0xb2, 0x82, 0x4d, 0x34, 0xa8, 0xcc, 0xc5, 0x24, 0x69, 0x94, 0xe5, 0x27, 0xb9,
-	0x0e, 0xf5, 0x89, 0x13, 0x9c, 0xcc, 0x9d, 0x93, 0x05, 0xf9, 0xa5, 0x63, 0xf2, 0x73, 0xfc, 0x81,
-	0x04, 0x7f, 0xde, 0xe0, 0x1e, 0x73, 0xc3, 0x79, 0x10, 0x8b, 0xb3, 0x24, 0x0d, 0x36, 0x32, 0x4d,
-	0x57, 0x29, 0xc8, 0x27, 0x50, 0x9f, 0x4d, 0x9c, 0x18, 0xdb, 0xc2, 0x15, 0x5c, 0xa5, 0x7e, 0x79,
-	0xff, 0x60, 0x27, 0x48, 0x9a, 0xda, 0xe8, 0xbf, 0x2f, 0x01, 0x64, 0xe5, 0xbd, 0xe0, 0xa1, 0xa8,
-	0x96, 0xbd, 0xf4, 0x50, 0x24, 0x77, 0x61, 0x23, 0x3a, 0x0d, 0x45, 0xcc, 0xf2, 0x4d, 0xbb, 0xda,
-	0x88, 0x86, 0x8a, 0x5e, 0x51, 0xe7, 0x5e, 0x79, 0xb5, 0xce, 0x5d, 0xff, 0x4b, 0x09, 0x5a, 0xf9,
-	0x76, 0xa1, 0x20, 0x80, 0x9f, 0x24, 0xf4, 0x53, 0xbe, 0xbc, 0x67, 0xcd, 0x7b, 0xd8, 0xc3, 0xbf,
-	0x39, 0xd2, 0x69, 0x43, 0xcd, 0x75, 0xd4, 0xb2, 0x55, 0x49, 0x59, 0x0c, 0xf5, 0x77, 0xa0, 0x91,
-	0x82, 0xc9, 0x16, 0x68, 0x05, 0xd4, 0xd1, 0x80, 0xaa, 0xfd, 0xd0, 0x1a, 0x5b, 0x5a, 0x49, 0x3f,
-	0x84, 0x9d, 0x4b, 0x9a, 0x10, 0x59, 0x08, 0xb3, 0x6e, 0x26, 0x8d, 0x63, 0x33, 0x95, 0x99, 0x9e,
-	0x7c, 0xac, 0xa6, 0x6d, 0x8e, 0x8a, 0x5e, 0xed, 0xa9, 0xb2, 0xd6, 0xff, 0x54, 0x82, 0xd5, 0xa5,
-	0x06, 0x44, 0x9e, 0x8c, 0xcc, 0xa5, 0xdc, 0x6b, 0x33, 0xa5, 0xf0, 0xc0, 0x5e, 0x3c, 0x38, 0x11,
-	0xe5, 0x3c, 0xcf, 0xa3, 0xca, 0x09, 0xca, 0x79, 0x9e, 0xa1, 0x3e, 0x81, 0x1b, 0xd1, 0x7c, 0x36,
-	0x0b, 0x45, 0x1c, 0x31, 0xc7, 0xf3, 0x7c, 0xb9, 0x73, 0x67, 0x82, 0xc4, 0xca, 0x23, 0xf5, 0x6b,
-	0x5f, 0x9d, 0x5e, 0x5b, 0x40, 0x3a, 0x29, 0x82, 0x2a, 0xc0, 0x9d, 0xfb, 0xd0, 0x48, 0xaf, 0x3d,
-	0xd9, 0x06, 0xd2, 0x37, 0xbf, 0x32, 0x7a, 0x8c, 0x76, 0xc6, 0x06, 0xeb, 0x19, 0xfd, 0xce, 0xc1,
-	0x60, 0xac, 0xbd, 0x26, 0xb9, 0xd2, 0x36, 0x28, 0xb3, 0x0d, 0x3a, 0x92, 0xdd, 0xc7, 0x9d, 0xef,
-	0x60, 0xe3, 0x42, 0x53, 0x2c, 0xfb, 0x96, 0xa4, 0x29, 0x62, 0x5d, 0x6a, 0xf4, 0xcc, 0x31, 0xeb,
-	0x76, 0x68, 0xef, 0x62, 0x73, 0x53, 0x04, 0xea, 0x5a, 0xc3, 0x9e, 0x99, 0xb4, 0x50, 0xd8, 0xdc,
-	0x14, 0x81, 0x3a, 0x83, 0xc3, 0xce, 0xe3, 0x91, 0x56, 0xbe, 0xf3, 0x7d, 0x09, 0xd6, 0x96, 0xb3,
-	0x40, 0xb6, 0x6c, 0x9d, 0xae, 0x74, 0xc0, 0xec, 0x41, 0x67, 0xdc, 0xb7, 0xe8, 0xfe, 0xc5, 0x89,
-	0xcf, 0x03, 0x0e, 0x8d, 0x07, 0xac, 0x63, 0xdb, 0x03, 0xb3, 0x9b, 0xeb, 0xaa, 0xce, 0x83, 0xf6,
-	0xad, 0x07, 0xe6, 0xc0, 0x90, 0x58, 0xad, 0x4c, 0x6e, 0xc0, 0xce, 0x79, 0x7d, 0x67, 0xd8, 0xa3,
-	0x96, 0xd9, 0xd3, 0x2a, 0x64, 0x07, 0x36, 0xcf, 0x2b, 0x4d, 0x6b, 0xa4, 0xad, 0x1c, 0x5d, 0xc1,
-	0xff, 0x4d, 0xb8, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x3f, 0x56, 0x84, 0x5c, 0x18,
+var fileDescriptor0 = []byte{
+	// 2706 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4f, 0x73, 0xe3, 0xc6,
+	0xb1, 0x5f, 0x92, 0xd2, 0x92, 0x6c, 0x52, 0x12, 0x34, 0xd2, 0x4a, 0x94, 0xd6, 0xeb, 0x95, 0xe1,
+	0xe7, 0xf7, 0xf6, 0xed, 0xae, 0x69, 0x3f, 0xad, 0xed, 0xf2, 0x2b, 0xff, 0xa5, 0x48, 0xc8, 0x42,
+	0x2d, 0x45, 0xc0, 0x43, 0xc8, 0xf2, 0xfa, 0x90, 0x31, 0x04, 0x8c, 0x24, 0xd4, 0x92, 0x00, 0x03,
+	0x80, 0xda, 0x95, 0xab, 0x5c, 0xa9, 0xca, 0x29, 0xc7, 0x9c, 0xe3, 0xaa, 0xdc, 0x53, 0xf1, 0x87,
+	0x48, 0xae, 0xf9, 0x06, 0xf9, 0x14, 0x39, 0xe6, 0x90, 0x4b, 0x6a, 0x7a, 0x00, 0x10, 0x94, 0xa8,
+	0x95, 0x1c, 0xfb, 0x42, 0x01, 0xdd, 0xbf, 0xee, 0x99, 0xe9, 0x99, 0xfe, 0x75, 0x0f, 0x04, 0x8f,
+	0x4f, 0xbc, 0xf8, 0x74, 0x7c, 0xd4, 0x74, 0x82, 0xe1, 0x3b, 0x43, 0x7b, 0x14, 0xbd, 0x7d, 0x14,
+	0x04, 0xcf, 0x3d, 0xff, 0xe4, 0xed, 0xb3, 0x27, 0xef, 0x1c, 0x73, 0xee, 0x46, 0xf2, 0xb7, 0x39,
+	0x0a, 0x83, 0x38, 0x20, 0x44, 0x40, 0x9a, 0x09, 0xa4, 0x89, 0x1a, 0xf5, 0x1f, 0x45, 0xa8, 0xef,
+	0x72, 0xee, 0xee, 0xf3, 0xd8, 0x76, 0xed, 0xd8, 0x26, 0x43, 0x58, 0x1b, 0x85, 0x81, 0xc3, 0xa3,
+	0xc8, 0xf3, 0x4f, 0x98, 0xe7, 0x47, 0x71, 0x38, 0x76, 0x62, 0x2f, 0xf0, 0x1b, 0x85, 0xad, 0xc2,
+	0x83, 0xc5, 0xed, 0x0f, 0x9a, 0x97, 0xbd, 0x34, 0xf3, 0x1e, 0x9a, 0x66, 0x66, 0xae, 0x4f, 0xac,
+	0xe9, 0x9d, 0xd1, 0x2c, 0x31, 0x79, 0x03, 0xea, 0xd1, 0xa9, 0x1d, 0xba, 0xcc, 0x1f, 0x0f, 0x8f,
+	0x78, 0xd8, 0x28, 0x6e, 0x15, 0x1e, 0xcc, 0xd3, 0x1a, 0xca, 0x7a, 0x28, 0x12, 0x90, 0x38, 0x88,
+	0xed, 0x01, 0x43, 0x61, 0xd4, 0x28, 0x49, 0x08, 0xca, 0xfa, 0x28, 0x22, 0xab, 0x30, 0xef, 0x07,
+	0xbe, 0xc3, 0x1b, 0xf3, 0x5b, 0x85, 0x07, 0x73, 0x54, 0xbe, 0x90, 0xff, 0x83, 0xd5, 0x13, 0xee,
+	0xf3, 0xd0, 0x16, 0x23, 0xb1, 0xd8, 0x1b, 0xf2, 0x28, 0xb6, 0x87, 0xa3, 0xc6, 0xdc, 0x56, 0xe1,
+	0x41, 0x89, 0xae, 0x4c, 0x74, 0x56, 0xaa, 0x52, 0x6d, 0xb8, 0x33, 0x73, 0xfa, 0x64, 0x05, 0x96,
+	0x4c, 0x6a, 0xb4, 0xb5, 0x7e, 0x9f, 0x1d, 0xf4, 0x9e, 0xf6, 0x8c, 0xc3, 0x9e, 0x72, 0x8b, 0xac,
+	0xc3, 0x4a, 0x2a, 0x6c, 0xf5, 0x59, 0xdb, 0xd8, 0x37, 0xbb, 0x9a, 0xa5, 0x29, 0x05, 0xb2, 0x09,
+	0x6b, 0x39, 0x85, 0xde, 0x6b, 0x53, 0x6d, 0x5f, 0xeb, 0x59, 0xad, 0xae, 0x52, 0x54, 0x7f, 0x2c,
+	0x80, 0xd2, 0x3a, 0xb3, 0xbd, 0x81, 0x7d, 0xe4, 0x0d, 0xbc, 0xf8, 0x5c, 0xc4, 0x8e, 0x7c, 0x0c,
+	0x95, 0x61, 0x12, 0x3f, 0x8c, 0x73, 0x6d, 0x7b, 0xeb, 0xba, 0x38, 0xd3, 0xcc, 0x82, 0x7c, 0x03,
+	0xab, 0x11, 0x0f, 0xcf, 0x3c, 0x87, 0x33, 0x3b, 0xe7, 0xb9, 0x51, 0xdc, 0x2a, 0x3d, 0xa8, 0x6d,
+	0xff, 0xcf, 0x2c, 0x4f, 0x7d, 0x89, 0xcf, 0x4f, 0x84, 0xae, 0x44, 0x97, 0x85, 0xea, 0xbf, 0x8a,
+	0xb0, 0x32, 0x03, 0x4c, 0x3e, 0x84, 0x46, 0x14, 0xdb, 0x61, 0x3c, 0x89, 0x2b, 0x0b, 0x79, 0x14,
+	0x87, 0x9e, 0x13, 0xe3, 0x0a, 0x4a, 0x74, 0x0d, 0xf5, 0x59, 0x6c, 0x69, 0xa2, 0x25, 0xef, 0xc1,
+	0x1a, 0xf7, 0xdd, 0x59, 0x76, 0x45, 0xb4, 0x5b, 0xe5, 0xbe, 0x7b, 0xd9, 0xea, 0x5d, 0x58, 0x1d,
+	0xf2, 0xd0, 0x39, 0xb5, 0xfd, 0x98, 0x79, 0xee, 0xc4, 0x46, 0x9c, 0x86, 0x2a, 0x25, 0xa9, 0x4e,
+	0x77, 0x33, 0x8b, 0x26, 0xa4, 0x0b, 0x9a, 0x32, 0x98, 0x43, 0x83, 0xe5, 0x44, 0x95, 0xc3, 0x77,
+	0x81, 0x84, 0x3c, 0x0a, 0xc6, 0xa1, 0xc3, 0xa3, 0x09, 0xfc, 0x36, 0xee, 0xc6, 0xbd, 0x59, 0x31,
+	0xa4, 0x29, 0x9a, 0x2e, 0x67, 0x86, 0x99, 0xb7, 0x0e, 0xd4, 0xa7, 0xf6, 0x62, 0x1e, 0xf7, 0x62,
+	0xe6, 0xae, 0x4e, 0x6d, 0xc2, 0x94, 0x95, 0xfa, 0xcf, 0x0a, 0xd4, 0xa7, 0xc2, 0x7e, 0x1f, 0x6a,
+	0xb9, 0x30, 0x60, 0xa4, 0xab, 0x14, 0x26, 0xab, 0x27, 0xf7, 0x00, 0x26, 0xab, 0xc6, 0x88, 0x56,
+	0x69, 0x35, 0x5b, 0x2c, 0xb9, 0x0b, 0x55, 0xb9, 0x6d, 0x11, 0x77, 0x30, 0x76, 0x25, 0x5a, 0x41,
+	0x41, 0x9f, 0x3b, 0x22, 0xd3, 0xdc, 0x71, 0x92, 0x2e, 0x42, 0x2f, 0x13, 0xa5, 0x96, 0xca, 0x04,
+	0xe4, 0x3e, 0xd4, 0xa2, 0x51, 0x10, 0x47, 0x0c, 0xd3, 0x0f, 0xf3, 0xad, 0x44, 0x01, 0x45, 0x96,
+	0x90, 0xe0, 0xf8, 0x08, 0x08, 0x46, 0xdc, 0xc7, 0xe8, 0x95, 0x68, 0x15, 0x25, 0xc6, 0x88, 0xfb,
+	0xe4, 0x7f, 0x41, 0xc9, 0x2f, 0x90, 0xc5, 0xf6, 0x49, 0xa3, 0x8c, 0x93, 0x5c, 0xca, 0xcb, 0x2d,
+	0xfb, 0x84, 0x7c, 0x04, 0xd5, 0x2c, 0xac, 0x8d, 0xca, 0x4d, 0xb6, 0x61, 0x82, 0x27, 0x0f, 0x61,
+	0x79, 0x64, 0x9f, 0x0f, 0xb9, 0x1f, 0xb3, 0x60, 0x84, 0x0b, 0xf2, 0xdc, 0x46, 0x75, 0xab, 0x24,
+	0x06, 0x4a, 0x14, 0x06, 0xca, 0x75, 0x97, 0x3c, 0x05, 0x08, 0xb9, 0x33, 0x0e, 0x43, 0x2e, 0x28,
+	0x04, 0x70, 0xa4, 0x47, 0xd7, 0x6d, 0x54, 0x93, 0x66, 0x26, 0x34, 0x67, 0x4e, 0x6c, 0x20, 0x91,
+	0x73, 0xca, 0xdd, 0xf1, 0x80, 0x33, 0xfe, 0xd2, 0xe1, 0x38, 0x48, 0xa3, 0x86, 0xbb, 0xbf, 0x7d,
+	0xad, 0xd3, 0x7e, 0x62, 0xaa, 0xa5, 0x96, 0x74, 0x39, 0xba, 0x28, 0x22, 0xef, 0x43, 0xd9, 0xe5,
+	0xa3, 0x20, 0xf2, 0xe2, 0x46, 0x1d, 0x27, 0x7b, 0x77, 0x96, 0xdf, 0x8e, 0x84, 0xd0, 0x14, 0x4b,
+	0x3e, 0x81, 0x9a, 0x1f, 0xb0, 0xe8, 0x34, 0x78, 0xc1, 0x8e, 0x39, 0x6f, 0x2c, 0x5c, 0x1d, 0xd1,
+	0x5e, 0xd0, 0x3f, 0x0d, 0x5e, 0xec, 0x72, 0x4e, 0xab, 0x7e, 0xfa, 0x48, 0x0e, 0x60, 0x25, 0xe4,
+	0xbf, 0x1e, 0x7b, 0x21, 0x67, 0x4e, 0xc8, 0x5d, 0x2f, 0x66, 0x8e, 0x1d, 0xba, 0x8d, 0x45, 0xac,
+	0x0a, 0x6f, 0xcd, 0xde, 0x18, 0x84, 0xb7, 0x11, 0xdd, 0xb6, 0x43, 0x57, 0xe4, 0xc9, 0x05, 0x11,
+	0xf9, 0x2f, 0x58, 0x8c, 0x3d, 0xe7, 0x39, 0x8f, 0x59, 0x7c, 0x3e, 0xc2, 0x33, 0xbb, 0x84, 0xbb,
+	0x54, 0x97, 0x52, 0xeb, 0x7c, 0x24, 0x8e, 0x6d, 0x0c, 0x1b, 0x49, 0x1c, 0x44, 0x55, 0x0a, 0x45,
+	0x70, 0x83, 0x33, 0x1e, 0x86, 0x9e, 0xcb, 0xa3, 0x86, 0x82, 0x2b, 0xf9, 0xf0, 0xa6, 0xc1, 0xf5,
+	0xfc, 0x13, 0x3a, 0x1e, 0x70, 0x23, 0xb5, 0xa7, 0xeb, 0xd1, 0x6c, 0xc5, 0xe6, 0xb7, 0x00, 0x93,
+	0x5d, 0x26, 0x0f, 0x40, 0x09, 0xf9, 0x88, 0xdb, 0x31, 0x1b, 0xfb, 0xb1, 0x37, 0xc0, 0x0c, 0x91,
+	0x4c, 0xb7, 0x28, 0xe5, 0x07, 0x42, 0x2c, 0x92, 0x64, 0x82, 0xe4, 0x67, 0x3c, 0x3c, 0x47, 0xa4,
+	0x2c, 0x6c, 0x09, 0x52, 0x13, 0xe2, 0x3e, 0x77, 0x36, 0xbf, 0x84, 0xe5, 0x4b, 0x5b, 0x4e, 0x3e,
+	0x06, 0x10, 0xe4, 0xc8, 0x42, 0xdb, 0x3f, 0xe1, 0x49, 0x39, 0x98, 0xb9, 0x4f, 0x82, 0x25, 0xa9,
+	0x00, 0xd1, 0x6a, 0x9c, 0x3e, 0x6e, 0x6a, 0xb0, 0x7e, 0xc5, 0x42, 0x45, 0x52, 0x0c, 0xec, 0x28,
+	0x66, 0xc2, 0x8b, 0x7d, 0x34, 0xe0, 0xb9, 0x25, 0x2c, 0x09, 0xc5, 0x4e, 0x22, 0xef, 0x73, 0x47,
+	0xfd, 0x43, 0x01, 0xaa, 0x59, 0x66, 0x91, 0x0d, 0x10, 0x2c, 0x71, 0x7c, 0x3c, 0xe1, 0x9c, 0x32,
+	0xbe, 0x27, 0x84, 0x83, 0x2a, 0xdf, 0x1e, 0xf2, 0x8c, 0x70, 0x84, 0xa4, 0x67, 0x0f, 0x39, 0x59,
+	0x87, 0x72, 0x18, 0x04, 0x43, 0x61, 0x28, 0xa9, 0xfa, 0xb6, 0x78, 0x95, 0x4c, 0x84, 0x0a, 0x34,
+	0x93, 0xa4, 0x5c, 0x11, 0x02, 0xb4, 0xba, 0x07, 0x30, 0xb2, 0xc3, 0xf8, 0x9c, 0x45, 0xde, 0x77,
+	0xb2, 0xaa, 0xcf, 0xd3, 0x2a, 0x4a, 0xfa, 0xde, 0x77, 0x5c, 0x6d, 0x41, 0x35, 0x5b, 0xbb, 0x70,
+	0x74, 0xc4, 0x4f, 0x3c, 0x3f, 0xb7, 0x9a, 0x0a, 0x0a, 0xc4, 0x56, 0xac, 0x43, 0x59, 0x14, 0x9b,
+	0x74, 0x07, 0x4a, 0xf4, 0x36, 0xf7, 0x5d, 0xb1, 0xbe, 0xdf, 0x16, 0xa0, 0x96, 0xd4, 0xb5, 0x5f,
+	0xa0, 0x02, 0xbf, 0x0f, 0xe5, 0x84, 0x63, 0x93, 0xa2, 0x7b, 0xf7, 0x15, 0x45, 0x97, 0xa6, 0x58,
+	0xf5, 0x8f, 0x75, 0x28, 0x27, 0xc2, 0x9f, 0xcd, 0xec, 0x04, 0xe6, 0x30, 0x94, 0x32, 0xca, 0xf8,
+	0x4c, 0xb6, 0xa0, 0xe6, 0xf2, 0xc8, 0x09, 0x3d, 0xc9, 0x42, 0x32, 0xca, 0x79, 0x11, 0x79, 0x07,
+	0xe6, 0x47, 0xa1, 0x97, 0x74, 0x4e, 0xb5, 0xed, 0x8d, 0x59, 0xd3, 0x36, 0x05, 0x80, 0x4a, 0x1c,
+	0xf9, 0x7f, 0x98, 0x17, 0xe9, 0x17, 0x25, 0x85, 0xf1, 0xcd, 0x99, 0xeb, 0x9c, 0x3a, 0x7f, 0x11,
+	0x95, 0x16, 0xe4, 0x13, 0x98, 0x3b, 0x0e, 0xc2, 0x61, 0xa3, 0x8c, 0x11, 0x7a, 0xeb, 0x15, 0x11,
+	0xd2, 0xfd, 0xd8, 0x7e, 0xce, 0x77, 0x83, 0x70, 0xb8, 0x53, 0x6c, 0x14, 0x28, 0x9a, 0x91, 0x5d,
+	0xa8, 0x79, 0x28, 0x67, 0xe8, 0x65, 0x15, 0xc7, 0xbf, 0x99, 0x17, 0x0a, 0x5e, 0xf6, 0x4c, 0xbe,
+	0x81, 0xb5, 0x11, 0x0f, 0x59, 0xc2, 0x3a, 0x79, 0x97, 0x77, 0x7e, 0x8a, 0xcb, 0x95, 0x11, 0x0f,
+	0x2d, 0xf4, 0x31, 0x11, 0x92, 0x3e, 0x2c, 0x8d, 0x42, 0x9e, 0x56, 0x1e, 0xc1, 0x68, 0x58, 0xb9,
+	0x16, 0xb7, 0x1f, 0xbe, 0xc2, 0x69, 0xd3, 0xcc, 0x4c, 0x04, 0xdd, 0xd1, 0xc5, 0xd1, 0xd4, 0x3b,
+	0xf9, 0x00, 0x2a, 0xb1, 0xfd, 0x92, 0x85, 0x76, 0xcc, 0x1b, 0xd5, 0xab, 0x09, 0xdf, 0xb2, 0x5f,
+	0x52, 0x3b, 0xe6, 0xb4, 0x1c, 0xcb, 0x87, 0xd9, 0x35, 0x10, 0x66, 0xd7, 0xc0, 0x5c, 0x4d, 0xa9,
+	0xfd, 0xe7, 0x35, 0xa5, 0xfe, 0xcb, 0xd4, 0x94, 0x85, 0x9f, 0x59, 0x53, 0x3e, 0x83, 0x9a, 0x8d,
+	0x6d, 0x3b, 0x1b, 0x78, 0xfe, 0xf3, 0xc6, 0x22, 0x9e, 0xb7, 0xd7, 0x67, 0xd6, 0x07, 0x84, 0x75,
+	0x3d, 0xff, 0x39, 0x05, 0x3b, 0x7b, 0x26, 0x1f, 0xc1, 0x1c, 0xee, 0xdd, 0x12, 0x4e, 0xe4, 0x55,
+	0x0d, 0x74, 0xfa, 0x17, 0x37, 0x0e, 0x8d, 0xc4, 0xe8, 0xb9, 0x8a, 0xd6, 0x50, 0xae, 0x1e, 0xdd,
+	0xca, 0x4a, 0x1c, 0x85, 0x49, 0xb9, 0x23, 0x1a, 0x2c, 0x84, 0x7c, 0x60, 0xc7, 0xdc, 0x65, 0x43,
+	0xee, 0x7a, 0x76, 0x63, 0xf9, 0xea, 0xde, 0x91, 0x4a, 0xe0, 0xbe, 0xc0, 0xd1, 0x7a, 0x98, 0x7b,
+	0x23, 0xa7, 0xb0, 0x99, 0xdd, 0x0a, 0xe2, 0x38, 0xf4, 0x8e, 0xc6, 0x31, 0x67, 0x67, 0xf6, 0x60,
+	0x8c, 0xfc, 0x41, 0xd0, 0xe7, 0xa3, 0x57, 0xdd, 0x0d, 0x52, 0xa3, 0xaf, 0x84, 0x8d, 0xee, 0xd2,
+	0xf5, 0x68, 0xb6, 0x82, 0xec, 0xc1, 0xe2, 0x0b, 0xdb, 0x8b, 0x07, 0x5e, 0x14, 0x33, 0x49, 0x0e,
+	0x2b, 0x78, 0x10, 0xde, 0x98, 0xe5, 0xfd, 0x30, 0x41, 0x4a, 0x6a, 0x58, 0x78, 0x91, 0x7f, 0x55,
+	0xbf, 0x85, 0xc5, 0xe9, 0x64, 0x20, 0xf7, 0xe1, 0xae, 0x49, 0x35, 0xb3, 0xf5, 0x4c, 0x5c, 0xa0,
+	0x98, 0xf5, 0xcc, 0xd4, 0xd8, 0x41, 0xaf, 0x6f, 0x6a, 0x6d, 0x7d, 0x57, 0xd7, 0x3a, 0xca, 0x2d,
+	0x52, 0x87, 0x0a, 0xd5, 0xbe, 0x3c, 0xd0, 0xa9, 0xd6, 0x51, 0x0a, 0xe2, 0xcd, 0x30, 0x2d, 0xdd,
+	0xe8, 0x89, 0xbb, 0x16, 0x59, 0x86, 0x85, 0x9e, 0x61, 0xb1, 0xfe, 0x81, 0x69, 0x1a, 0xd4, 0xd2,
+	0x3a, 0x4a, 0x49, 0xfd, 0xf3, 0x84, 0xf7, 0xd1, 0xff, 0x6b, 0xd0, 0xe8, 0x6b, 0xf4, 0x2b, 0xbd,
+	0xad, 0xcd, 0x72, 0xfe, 0x26, 0xdc, 0x9f, 0xd2, 0x76, 0xf4, 0x9e, 0xde, 0xfb, 0x82, 0x51, 0x4d,
+	0x48, 0x5b, 0x62, 0x1c, 0xa5, 0x40, 0x5e, 0x87, 0xcd, 0x29, 0xd0, 0xae, 0x61, 0x74, 0x98, 0x41,
+	0x3b, 0x1a, 0xd5, 0x7b, 0x5f, 0x28, 0x45, 0x72, 0x0f, 0x36, 0xa6, 0xf4, 0xda, 0x57, 0xb8, 0x14,
+	0xbd, 0xfd, 0x54, 0xb3, 0x94, 0x92, 0xb8, 0x2c, 0x4e, 0xa9, 0x2d, 0xaa, 0x9b, 0xcc, 0x32, 0x0e,
+	0xa8, 0x32, 0xa7, 0x7e, 0x0f, 0xf3, 0xc8, 0xbe, 0xa2, 0x35, 0x47, 0xfe, 0x65, 0x43, 0xcf, 0x09,
+	0x83, 0x28, 0xa9, 0x73, 0x35, 0x94, 0xed, 0xa3, 0x88, 0xbc, 0x09, 0x0b, 0x49, 0xaf, 0x72, 0xce,
+	0x9c, 0xc0, 0x4d, 0x6b, 0x71, 0x3d, 0x15, 0xb6, 0x03, 0x97, 0x93, 0xc7, 0x40, 0x84, 0x8d, 0xe8,
+	0xa2, 0x12, 0x4e, 0x10, 0x1d, 0xb8, 0xac, 0x19, 0x4a, 0xa2, 0x91, 0xa4, 0x60, 0xd9, 0x27, 0xea,
+	0xdf, 0xe7, 0x60, 0xe9, 0x02, 0x99, 0x93, 0x77, 0x61, 0x65, 0xe8, 0xf9, 0xcc, 0x76, 0xcf, 0x6c,
+	0xdf, 0xe1, 0x2c, 0xd9, 0x5c, 0x39, 0xa1, 0xbd, 0x5b, 0x74, 0x79, 0xe8, 0xf9, 0x2d, 0xa9, 0xdb,
+	0x91, 0x2a, 0xf2, 0x14, 0x54, 0x61, 0x91, 0x20, 0xd9, 0xd1, 0xf8, 0xf8, 0x98, 0x87, 0xec, 0x88,
+	0x1f, 0x07, 0x21, 0x67, 0xe9, 0x55, 0x50, 0x5e, 0x15, 0xf6, 0x6e, 0xd1, 0x7b, 0x43, 0xcf, 0x4f,
+	0x2c, 0x77, 0x10, 0xb9, 0x83, 0x40, 0x4d, 0x5e, 0x0a, 0xc9, 0x67, 0xf0, 0x5a, 0x7e, 0xf8, 0xc0,
+	0x1f, 0x78, 0x3e, 0x67, 0x8e, 0x78, 0x11, 0x73, 0x4c, 0xaa, 0xfc, 0xc6, 0x64, 0x16, 0x06, 0x22,
+	0xda, 0x29, 0x80, 0x7c, 0x09, 0x77, 0x44, 0x92, 0x24, 0x26, 0x03, 0x79, 0xdb, 0x11, 0xe4, 0x55,
+	0xba, 0xa6, 0x02, 0x62, 0x29, 0x5a, 0x11, 0xb6, 0xed, 0x9c, 0xa9, 0xa0, 0xb1, 0x8f, 0x01, 0xfc,
+	0x20, 0x23, 0xc1, 0xb9, 0x9b, 0xf8, 0xa9, 0x4a, 0x03, 0x61, 0xfd, 0x2b, 0x50, 0x6c, 0x77, 0xe8,
+	0x45, 0x91, 0x98, 0xc8, 0x28, 0x18, 0x78, 0xce, 0x39, 0x56, 0xe3, 0xc5, 0xed, 0x27, 0x37, 0x28,
+	0xae, 0xcd, 0x56, 0x6a, 0x6b, 0xa2, 0x29, 0x5d, 0xb2, 0xa7, 0x05, 0xea, 0x6f, 0x60, 0xe9, 0x02,
+	0x86, 0x6c, 0xc1, 0x6b, 0xad, 0xce, 0xbe, 0xde, 0xef, 0xeb, 0x46, 0x8f, 0x99, 0x46, 0x57, 0x6f,
+	0x3f, 0xbb, 0x70, 0xf0, 0x97, 0xa0, 0x66, 0xe9, 0xfb, 0x1a, 0xeb, 0x5b, 0x54, 0x6f, 0x5b, 0x4a,
+	0x41, 0xa4, 0x12, 0x0a, 0x76, 0xbb, 0xda, 0xd7, 0xfa, 0x4e, 0x57, 0x53, 0x8a, 0xe4, 0xbf, 0x41,
+	0x15, 0xa2, 0x0e, 0xd3, 0x7a, 0x16, 0x7d, 0xc6, 0x0e, 0x75, 0x6b, 0x2f, 0x53, 0xb3, 0xce, 0x01,
+	0x95, 0xf9, 0x51, 0xda, 0x59, 0x05, 0x72, 0x79, 0xff, 0xd5, 0x26, 0x94, 0x93, 0x8a, 0x25, 0x4e,
+	0x2e, 0x1e, 0x6b, 0x36, 0xe2, 0xa1, 0xc3, 0x7d, 0xf9, 0x01, 0x61, 0x9e, 0xd6, 0x51, 0x68, 0x4a,
+	0x99, 0xfa, 0xb7, 0x22, 0xac, 0x5d, 0xaa, 0xc2, 0xbb, 0x1e, 0x1f, 0xb8, 0x64, 0x11, 0x8a, 0x9e,
+	0x8b, 0x31, 0xab, 0xd2, 0xa2, 0x27, 0xf8, 0x48, 0xd2, 0xb7, 0xfc, 0x62, 0xf5, 0xde, 0x8d, 0xea,
+	0x39, 0x7a, 0x6a, 0xe2, 0x6f, 0x8e, 0xcb, 0x57, 0x61, 0x7e, 0x60, 0x1f, 0xf1, 0x41, 0x92, 0x4b,
+	0xf2, 0x45, 0x48, 0x91, 0x47, 0x1b, 0x25, 0x2c, 0xa6, 0xf2, 0x45, 0x34, 0x70, 0x5e, 0xc4, 0x92,
+	0x6a, 0xe4, 0xe2, 0x31, 0xa8, 0x50, 0xf0, 0xa2, 0xa4, 0x64, 0xb9, 0xea, 0xef, 0x0a, 0x50, 0xcd,
+	0x06, 0x10, 0x69, 0xbf, 0xab, 0x6b, 0xdd, 0xce, 0x2c, 0xda, 0x51, 0xa0, 0xde, 0xdf, 0x33, 0xa8,
+	0xc5, 0x5a, 0xbd, 0xfe, 0xa1, 0x46, 0x95, 0x02, 0x59, 0x80, 0xaa, 0xd9, 0xa2, 0xad, 0x2f, 0x68,
+	0xcb, 0xdc, 0x53, 0x8a, 0x64, 0x05, 0x96, 0xf6, 0x0f, 0xba, 0x96, 0x6e, 0x76, 0x35, 0xd6, 0xde,
+	0x33, 0xf4, 0xb6, 0xa6, 0x94, 0xc8, 0x22, 0x40, 0x7b, 0x4f, 0x6b, 0x3f, 0xdd, 0x31, 0xbe, 0xd6,
+	0xfa, 0xca, 0x9c, 0xe0, 0xc2, 0x0e, 0x35, 0xcc, 0x8e, 0x71, 0xd8, 0x53, 0xe6, 0x49, 0x0d, 0xca,
+	0x3b, 0x86, 0xd1, 0xd5, 0x5a, 0x3d, 0xe5, 0xb6, 0xfa, 0x97, 0x02, 0x2c, 0x5f, 0x0a, 0x01, 0xf9,
+	0x1c, 0xe6, 0x8f, 0xc5, 0xfc, 0x1a, 0x05, 0x2c, 0x0e, 0x0f, 0x6f, 0x1e, 0x38, 0x2a, 0x0d, 0xc9,
+	0x7b, 0xb0, 0x7a, 0xec, 0x85, 0x91, 0xfc, 0x2a, 0xc4, 0x9c, 0x71, 0x14, 0x07, 0x43, 0x1e, 0x46,
+	0x18, 0xbe, 0x0a, 0x1e, 0x7c, 0x82, 0x7a, 0x91, 0xca, 0xed, 0x54, 0x4b, 0x9e, 0x88, 0x36, 0x20,
+	0x1e, 0x87, 0xbe, 0x38, 0x1e, 0x13, 0xa3, 0xd2, 0xc4, 0x28, 0x53, 0x67, 0x46, 0xea, 0x5f, 0x0b,
+	0x50, 0x4e, 0xfa, 0x11, 0xf2, 0x64, 0xd2, 0xbd, 0x14, 0xae, 0xeb, 0x63, 0xb3, 0xde, 0xe5, 0x02,
+	0x93, 0x4c, 0xf1, 0xc1, 0xe4, 0xbe, 0x90, 0x63, 0x92, 0x7c, 0xda, 0x8b, 0xbb, 0xc5, 0xe7, 0x50,
+	0x4f, 0x7c, 0xc9, 0x4a, 0x5f, 0xc2, 0xe3, 0x76, 0xef, 0xca, 0xa1, 0xf1, 0x5c, 0xd5, 0x12, 0x13,
+	0xf1, 0xa2, 0x86, 0x50, 0xcd, 0xfa, 0x22, 0xf2, 0x08, 0x4a, 0x82, 0x3e, 0xae, 0x5d, 0x80, 0x40,
+	0x91, 0x0f, 0xa1, 0x72, 0xcc, 0xf9, 0x4f, 0x18, 0xb7, 0x7c, 0xcc, 0xf1, 0x41, 0xfd, 0x53, 0x01,
+	0x60, 0xd2, 0xf6, 0x10, 0x05, 0x4a, 0xe3, 0x70, 0x90, 0x5c, 0x37, 0xc4, 0x23, 0xd9, 0x84, 0xca,
+	0xc0, 0xf6, 0x4f, 0xc6, 0xf6, 0x49, 0x5a, 0x42, 0xb2, 0x77, 0xf2, 0x36, 0x7e, 0x23, 0xc3, 0x2f,
+	0x5c, 0xdc, 0x65, 0x4e, 0x30, 0xf6, 0xe3, 0xf0, 0x3c, 0x49, 0x83, 0xe5, 0x89, 0xa6, 0x2d, 0x15,
+	0xe4, 0x53, 0xa8, 0x8c, 0x06, 0x76, 0x8c, 0xcd, 0xf5, 0x1c, 0xce, 0x52, 0xbd, 0xba, 0x0b, 0x33,
+	0x13, 0x24, 0xcd, 0x6c, 0xd4, 0xdf, 0x17, 0x00, 0x26, 0x4d, 0xd2, 0x8c, 0x6f, 0x05, 0x72, 0xda,
+	0xd3, 0xdf, 0x0a, 0x1e, 0xc1, 0x72, 0x74, 0x1a, 0x84, 0x31, 0xcb, 0x5f, 0x7d, 0xe4, 0x42, 0x14,
+	0x54, 0x74, 0x66, 0xdd, 0x7f, 0x4a, 0x37, 0xbb, 0xff, 0xa8, 0x3f, 0x14, 0xa1, 0x9e, 0x6f, 0xba,
+	0x66, 0x04, 0xf0, 0xd3, 0x84, 0x7e, 0x8a, 0x57, 0x77, 0xfe, 0x79, 0x0f, 0x4d, 0xfc, 0xcd, 0x91,
+	0x4e, 0x03, 0xca, 0x8e, 0x2d, 0xa7, 0x2d, 0x0b, 0x73, 0xfa, 0x4a, 0x7a, 0x50, 0x4b, 0x5b, 0xb9,
+	0xf4, 0x3e, 0x57, 0xdb, 0x7e, 0x7c, 0xed, 0x00, 0xad, 0x89, 0x0d, 0xcd, 0x3b, 0xd8, 0x7c, 0x03,
+	0x6a, 0x39, 0x9d, 0xb8, 0x42, 0xc6, 0xfc, 0x65, 0x9c, 0xac, 0x05, 0x9f, 0xd5, 0xc7, 0x50, 0xcd,
+	0xe6, 0x47, 0x56, 0x41, 0x99, 0xc1, 0x56, 0x55, 0x98, 0x37, 0xf7, 0x0c, 0xcb, 0x50, 0x0a, 0xea,
+	0x21, 0xac, 0x5f, 0xd1, 0x3d, 0x8a, 0x0e, 0x66, 0xd2, 0x86, 0x66, 0x5b, 0x97, 0x4d, 0x47, 0x40,
+	0x36, 0xa0, 0x92, 0xf5, 0xa7, 0x72, 0xc3, 0xca, 0x67, 0xd2, 0x5a, 0xfd, 0xa1, 0x00, 0x0b, 0x53,
+	0x9d, 0xa3, 0x38, 0x0c, 0x22, 0x7d, 0x73, 0x9f, 0x09, 0xb2, 0xaa, 0xe1, 0x9b, 0xe9, 0x97, 0x02,
+	0x44, 0xd9, 0x2f, 0xf3, 0xa8, 0x62, 0x82, 0xb2, 0x5f, 0x4e, 0x50, 0x9f, 0xc2, 0xdd, 0x68, 0x3c,
+	0x1a, 0x05, 0x61, 0x1c, 0x31, 0xdb, 0x75, 0x3d, 0x11, 0x0d, 0x7b, 0x80, 0x5c, 0xce, 0x23, 0xf9,
+	0x8d, 0xb9, 0x42, 0x37, 0x52, 0x48, 0x2b, 0x43, 0x50, 0x09, 0x78, 0xf8, 0x04, 0xaa, 0x59, 0xa6,
+	0x91, 0x35, 0x20, 0xbb, 0xfa, 0xd7, 0x5a, 0x87, 0xd1, 0x96, 0xa5, 0xb1, 0x8e, 0xb6, 0xdb, 0x3a,
+	0xe8, 0x5a, 0xca, 0x2d, 0x41, 0xcf, 0xa6, 0x46, 0x99, 0xa9, 0xd1, 0xbe, 0x68, 0x1b, 0x1f, 0x7e,
+	0x0f, 0xcb, 0x97, 0x6e, 0x33, 0xa2, 0xe1, 0x4c, 0xba, 0x59, 0xd6, 0xa6, 0x5a, 0x47, 0xb7, 0x58,
+	0xbb, 0x45, 0x3b, 0x97, 0xbb, 0xd2, 0x59, 0xa0, 0xb6, 0xd1, 0xeb, 0xe8, 0x49, 0xef, 0x8b, 0x5d,
+	0xe9, 0x2c, 0x50, 0xab, 0x7b, 0xd8, 0x7a, 0xd6, 0x57, 0x8a, 0x0f, 0x7f, 0x2c, 0xc0, 0xe2, 0x74,
+	0xe2, 0x89, 0x5e, 0xbb, 0xd5, 0xb6, 0xb0, 0x27, 0xe8, 0xb6, 0xac, 0x5d, 0x83, 0xee, 0x5f, 0x1e,
+	0xf8, 0x22, 0xe0, 0x50, 0xdb, 0x61, 0x2d, 0xd3, 0xec, 0xea, 0xed, 0x5c, 0x3b, 0x7c, 0x11, 0xb4,
+	0x6f, 0xec, 0xe8, 0x5d, 0x4d, 0x60, 0x95, 0x22, 0xb9, 0x0b, 0xeb, 0x17, 0xf5, 0xad, 0x5e, 0x87,
+	0x1a, 0x7a, 0x47, 0x29, 0x91, 0x75, 0x58, 0xb9, 0xa8, 0xd4, 0x8d, 0xbe, 0x32, 0x77, 0x74, 0x1b,
+	0xff, 0x87, 0xf5, 0xe4, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x88, 0x76, 0xcd, 0xf3, 0x1a,
 	0x00, 0x00,
 }
diff --git a/feeds/feeds.proto b/feeds/feeds.proto
index f3c863d..bfcf4d5 100644
--- a/feeds/feeds.proto
+++ b/feeds/feeds.proto
@@ -273,6 +273,21 @@
   //
   //  (optional)
   repeated string ticket_type_id = 15;
+
+  // Availability level scheduling rules.
+  message SchedulingRuleOverrides {
+    // The last time (in seconds) that this slot is able to be booked. This
+    // timestamp must be before the start_sec of the slot to be respected
+    // (if users should be able to book after the start time, use service level
+    // SchedulingRules.min_booking_before_end_time). If present, will override
+    // anything specified in the min_booking_buffer of the corresponding
+    // Service's SchedulingRules.
+    int64 last_bookable_sec = 1;
+  }
+
+  // Availability scheduling rules. If fields are populated, they will override
+  // any corresponding scheduling rules on the service-level SchedulingRules.
+  SchedulingRuleOverrides scheduling_rule_overrides = 16;
 }
 
 // A resource is used to disambiguate availability slots from one another when
@@ -510,9 +525,38 @@
 }
 // The scheduling rules for a service.
 message SchedulingRules {
-  // The minimum advance notice in seconds required to book an appointment.
+  // The duration (in seconds) from when the last booking can be made to
+  // when the availability slot starts or ends.
+  //
+  // If "min_advance_booking" is set, the last bookable time is calculated as
+  // (<slot start time> - "min_advance_booking").
+  // If "min_booking_buffer_before_end_time" is set, the last bookable time is
+  // calculated as (<slot end time> - "min_booking_buffer_before_end_time").
+  // Note that the value of "min_booking_buffer_before_end_time" must be
+  // positive if set.
+  // If both are unset, the slot is bookable until the slot begin time.
+  //
+  // Examples:
+  //  * A haircut that needs to be booked at least 1 hour before the start time.
+  //      'scheduling_rules{ min_advance_booking: 3600 ...}`
+  //
+  //  * A museum where the last ticket can be purchased 30 mins before closing:
+  //     'scheduling_rules{ min_booking_buffer_before_end_time: 1800 ...}'
+  //
+  //  * A movie ticket that needs to be purchased before the start time.
+  //        'scheduling_rules{ ...}' (leave this field empty)
   // (optional)
-  int64 min_advance_booking = 1;
+  oneof min_booking_buffer {
+    // The duration (in seconds) from when the last booking can be made to
+    // when the availability slot starts.
+    int64 min_advance_booking = 1;
+
+    // The duration (in seconds) from when the last booking can be made to
+    // when the availability slot ends. If this field is set, the
+    // "admission_policy" field must be set to TIME_FLEXIBLE to indicate that
+    // users can use the purchased tickets after slots start.
+    int64 min_booking_buffer_before_end_time = 6;
+  }
 
   // The minimum advance notice in seconds required to cancel a booked
   // appointment online. (optional)
@@ -523,6 +567,47 @@
 
   // The fee for no-show without canceling.
   Price noshow_fee = 4 [deprecated = true];
+
+  // The admission policy of this service.
+  enum AdmissionPolicy {
+    // Unused.
+    ADMISSION_POLICY_UNSPECIFIED = 0;
+
+    // Customers are required to be present at the start time of the
+    // availability slot, and the service is expected to finish at the
+    // end time of the slot.
+    // Examples of TIME_STRICT use cases:
+    //   * A tour that starts at 9am that requires all attendees to arrive
+    //     at the start time, and returns at around 12pm.
+    //   * A haircut reservation at 3pm on Saturday that will take approximately
+    //   30 minutes.
+    //   * A fitness class from 6pm to 8pm.
+    TIME_STRICT = 1;
+
+    // Customers can arrive at any time between the start and end time of the
+    // availability slot to use this booking.
+    //
+    // Examples of TIME_FLEXIBLE use cases:
+    //   * A museum ticket that can be used during any time on the purchase
+    //     date.
+    //   * An afternoon admission to an amusement park that can be used from
+    //     12pm to 9pm.
+    TIME_FLEXIBLE = 2;
+
+    // Customers need to arrive at the merchant at the start time of the
+    // availability slot but can leave any time they want.
+    //
+    // For example, in the museum admission scenario, a timed entry ticket
+    // for 10am requires the user to be at the museum at 10am. The start time of
+    // availability slots for this service represents the designated entry
+    // time. The end time, however, is used solely as a key to identify the
+    // availability slot for booking.
+    TIMED_ENTRY_WITH_FLEXIBLE_DURATION = 3;
+  }
+
+  // The admission policy that applied to this service. If unset, defaults to
+  // TIME_STRICT. (optional)
+  AdmissionPolicy admission_policy = 5;
 }
 
 // A tax rate applied when charging the user for a service, and which can be set
@@ -716,15 +801,15 @@
 // (only photos are supported for now). Google will crawl the media data to
 // ensure that they are displayed to end-users in the most efficient way.
 message RelatedMedia {
-  // URL of this media source.
+  // URL of this media source. Google will crawl the media hosted at this URL.
   string url = 1;
 
   // Type of this media source.
   MediaType type = 2;
 
   // Enum to indicate the type of this media source. Only photos are supported.
-  // Please reach out to Google if supporting animations or videos is
-  // important to your feature and we will find the best solution for you.
+  // Please reach out to the Reserve with Google team if other media beyond
+  // photos need to be supported.
   enum MediaType {
     // Unused.
     TYPE_UNSPECIFIED = 0;
@@ -732,8 +817,23 @@
     PHOTO = 1;
   }
 
-  // Caption of the media, only plain text is supported. (optional)
+  // Caption of the media, only plain text is supported. Any HTML components
+  // will be stripped. (optional)
   string caption = 3;
+
+  // Attribution information about the source of the media. Note that if
+  // the attribution is required to display with the media to give credit to
+  // photographer or agency, this field must be set. (optional)
+  Attribution attribution = 4;
+
+  // Attribution information for this media.
+  message Attribution {
+    // The text to give credit to the photographer or agency. This text will be
+    // displayed together with the source media. Note that only plain text is
+    // supported for this field, any HTML components will be stripped (hyperlink
+    // based attribution is not supported).
+    string text = 1;
+  }
 }
 
 // Identifies a particular value of a service attribute to be applied to a