// Code generated by protoc-gen-go. DO NOT EDIT.
// source: waitlist.proto

// Waitlist partner API protos
package ext_maps_booking_partner_v3_waitlist

/*
Waitlist partner API protos
*/

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

// A status for the waitlist that determines if new users can join and what
// the reason is if they can’t join.
type WaitlistStatus int32

const (
	WaitlistStatus_WAITLIST_STATUS_UNSPECIFIED WaitlistStatus = 0
	// The waitlist is open and is accepting new users.
	WaitlistStatus_OPEN WaitlistStatus = 1
	// There is currently no wait and users should arrive at the merchant
	// without joining the waitlist.
	WaitlistStatus_CLOSED_NO_WAIT WaitlistStatus = 2
	// The waitlist is not currently accepting new users because it is full
	// or closed for other reasons.
	WaitlistStatus_CLOSED_OTHER WaitlistStatus = 3
)

var WaitlistStatus_name = map[int32]string{
	0: "WAITLIST_STATUS_UNSPECIFIED",
	1: "OPEN",
	2: "CLOSED_NO_WAIT",
	3: "CLOSED_OTHER",
}

var WaitlistStatus_value = map[string]int32{
	"WAITLIST_STATUS_UNSPECIFIED": 0,
	"OPEN":                        1,
	"CLOSED_NO_WAIT":              2,
	"CLOSED_OTHER":                3,
}

func (x WaitlistStatus) String() string {
	return proto.EnumName(WaitlistStatus_name, int32(x))
}

func (WaitlistStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{0}
}

type WaitlistEntryState int32

const (
	WaitlistEntryState_WAITLIST_ENTRY_STATE_UNSPECIFIED WaitlistEntryState = 0
	// The waitlist entry was created and the user is currently waiting in the
	// waitlist.
	WaitlistEntryState_WAITING WaitlistEntryState = 1
	// The waitlist entry has been canceled. Cancellation for no-shows should use
	// the NO_SHOW state.
	WaitlistEntryState_CANCELED WaitlistEntryState = 2
	// The merchant is ready to serve the user.
	WaitlistEntryState_SERVICE_READY WaitlistEntryState = 3
	// The user has checked in with the host and is waiting to be seated.
	WaitlistEntryState_CHECKED_IN WaitlistEntryState = 4
	// The user has arrived and been seated by the merchant.
	WaitlistEntryState_SEATED WaitlistEntryState = 5
	// The user did not arrive at the merchant in time and lost their space.
	WaitlistEntryState_NO_SHOW WaitlistEntryState = 6
)

var WaitlistEntryState_name = map[int32]string{
	0: "WAITLIST_ENTRY_STATE_UNSPECIFIED",
	1: "WAITING",
	2: "CANCELED",
	3: "SERVICE_READY",
	4: "CHECKED_IN",
	5: "SEATED",
	6: "NO_SHOW",
}

var WaitlistEntryState_value = map[string]int32{
	"WAITLIST_ENTRY_STATE_UNSPECIFIED": 0,
	"WAITING":                          1,
	"CANCELED":                         2,
	"SERVICE_READY":                    3,
	"CHECKED_IN":                       4,
	"SEATED":                           5,
	"NO_SHOW":                          6,
}

func (x WaitlistEntryState) String() string {
	return proto.EnumName(WaitlistEntryState_name, int32(x))
}

func (WaitlistEntryState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{1}
}

type WaitlistBusinessLogicFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	// Unexpected errors must be returned using standard HTTP error codes.
	WaitlistBusinessLogicFailure_CAUSE_UNSPECIFIED WaitlistBusinessLogicFailure_Cause = 0
	// The user has already booked a waitlist entry with the partner.
	WaitlistBusinessLogicFailure_EXISTING_WAITLIST_ENTRY WaitlistBusinessLogicFailure_Cause = 1
	// The requested party size is below the merchant’s minimum.
	WaitlistBusinessLogicFailure_BELOW_MIN_PARTY_SIZE WaitlistBusinessLogicFailure_Cause = 2
	// The requested party size is above the merchant’s maximum.
	WaitlistBusinessLogicFailure_ABOVE_MAX_PARTY_SIZE WaitlistBusinessLogicFailure_Cause = 3
	// The requested merchant is currently closed.
	WaitlistBusinessLogicFailure_MERCHANT_CLOSED WaitlistBusinessLogicFailure_Cause = 4
	// There is currently no wait and the user should walk in without joining
	// the waitlist.
	WaitlistBusinessLogicFailure_NO_WAIT WaitlistBusinessLogicFailure_Cause = 5
	// The waitlist is at capacity and new users are not being accepted at this
	// time.
	WaitlistBusinessLogicFailure_WAITLIST_FULL WaitlistBusinessLogicFailure_Cause = 6
)

var WaitlistBusinessLogicFailure_Cause_name = map[int32]string{
	0: "CAUSE_UNSPECIFIED",
	1: "EXISTING_WAITLIST_ENTRY",
	2: "BELOW_MIN_PARTY_SIZE",
	3: "ABOVE_MAX_PARTY_SIZE",
	4: "MERCHANT_CLOSED",
	5: "NO_WAIT",
	6: "WAITLIST_FULL",
}

var WaitlistBusinessLogicFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":       0,
	"EXISTING_WAITLIST_ENTRY": 1,
	"BELOW_MIN_PARTY_SIZE":    2,
	"ABOVE_MAX_PARTY_SIZE":    3,
	"MERCHANT_CLOSED":         4,
	"NO_WAIT":                 5,
	"WAITLIST_FULL":           6,
}

func (x WaitlistBusinessLogicFailure_Cause) String() string {
	return proto.EnumName(WaitlistBusinessLogicFailure_Cause_name, int32(x))
}

func (WaitlistBusinessLogicFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{12, 0}
}

// Batch request for the wait estimates for the specified merchant, service and
// party sizes.
type BatchGetWaitEstimatesRequest struct {
	// Required. Partner-provided ID for the merchant.
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// Required. Partner-provided ID for the service.
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Required. The different party sizes WaitEstimates are requested for.
	// WaitEstimates may differ with the number of people in the party.
	PartySize            []int32  `protobuf:"varint,3,rep,packed,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BatchGetWaitEstimatesRequest) Reset()         { *m = BatchGetWaitEstimatesRequest{} }
func (m *BatchGetWaitEstimatesRequest) String() string { return proto.CompactTextString(m) }
func (*BatchGetWaitEstimatesRequest) ProtoMessage()    {}
func (*BatchGetWaitEstimatesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{0}
}

func (m *BatchGetWaitEstimatesRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BatchGetWaitEstimatesRequest.Unmarshal(m, b)
}
func (m *BatchGetWaitEstimatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BatchGetWaitEstimatesRequest.Marshal(b, m, deterministic)
}
func (m *BatchGetWaitEstimatesRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BatchGetWaitEstimatesRequest.Merge(m, src)
}
func (m *BatchGetWaitEstimatesRequest) XXX_Size() int {
	return xxx_messageInfo_BatchGetWaitEstimatesRequest.Size(m)
}
func (m *BatchGetWaitEstimatesRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_BatchGetWaitEstimatesRequest.DiscardUnknown(m)
}

var xxx_messageInfo_BatchGetWaitEstimatesRequest proto.InternalMessageInfo

func (m *BatchGetWaitEstimatesRequest) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *BatchGetWaitEstimatesRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *BatchGetWaitEstimatesRequest) GetPartySize() []int32 {
	if m != nil {
		return m.PartySize
	}
	return nil
}

// Response for the BatchGetWaitEstimates RPC with the wait estimates of the
// specified merchant, service and party sizes.
type BatchGetWaitEstimatesResponse struct {
	// Required. A status for the waitlist that indicates whether new users can
	// join and what the reason is if they can’t join. If the waitlist is not
	// open, all other fields in the BatchGetWaitEstimatesResponse are expected to
	// be unset.
	WaitlistStatus WaitlistStatus `protobuf:"varint,1,opt,name=waitlist_status,json=waitlistStatus,proto3,enum=ext.maps.booking.partner.v3.waitlist.WaitlistStatus" json:"waitlist_status,omitempty"`
	// The wait estimates for each party size requested. The response should
	// contain exactly one wait estimate for each party size sent in the request.
	// If a party size is not available for some reason, prefer ommitting it
	// instead of returning an error so that the user will have some options to
	// choose from.
	WaitEstimate         []*WaitEstimate `protobuf:"bytes,2,rep,name=wait_estimate,json=waitEstimate,proto3" json:"wait_estimate,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *BatchGetWaitEstimatesResponse) Reset()         { *m = BatchGetWaitEstimatesResponse{} }
func (m *BatchGetWaitEstimatesResponse) String() string { return proto.CompactTextString(m) }
func (*BatchGetWaitEstimatesResponse) ProtoMessage()    {}
func (*BatchGetWaitEstimatesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{1}
}

func (m *BatchGetWaitEstimatesResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BatchGetWaitEstimatesResponse.Unmarshal(m, b)
}
func (m *BatchGetWaitEstimatesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BatchGetWaitEstimatesResponse.Marshal(b, m, deterministic)
}
func (m *BatchGetWaitEstimatesResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BatchGetWaitEstimatesResponse.Merge(m, src)
}
func (m *BatchGetWaitEstimatesResponse) XXX_Size() int {
	return xxx_messageInfo_BatchGetWaitEstimatesResponse.Size(m)
}
func (m *BatchGetWaitEstimatesResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_BatchGetWaitEstimatesResponse.DiscardUnknown(m)
}

var xxx_messageInfo_BatchGetWaitEstimatesResponse proto.InternalMessageInfo

func (m *BatchGetWaitEstimatesResponse) GetWaitlistStatus() WaitlistStatus {
	if m != nil {
		return m.WaitlistStatus
	}
	return WaitlistStatus_WAITLIST_STATUS_UNSPECIFIED
}

func (m *BatchGetWaitEstimatesResponse) GetWaitEstimate() []*WaitEstimate {
	if m != nil {
		return m.WaitEstimate
	}
	return nil
}

// The range of time for the current estimated seat time for the user. Estimated
// seat time range must change over time when the merchant or partner updates
// their estimates.
type EstimatedSeatTimeRange struct {
	// Required. The lower bound for the range. Expressed as the number of seconds
	// since the Unix epoch.
	StartSeconds int64 `protobuf:"varint,1,opt,name=start_seconds,json=startSeconds,proto3" json:"start_seconds,omitempty"`
	// Required. The upper bound for the range. Expressed as the number of seconds
	// since the Unix epoch.
	EndSeconds           int64    `protobuf:"varint,2,opt,name=end_seconds,json=endSeconds,proto3" json:"end_seconds,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *EstimatedSeatTimeRange) Reset()         { *m = EstimatedSeatTimeRange{} }
func (m *EstimatedSeatTimeRange) String() string { return proto.CompactTextString(m) }
func (*EstimatedSeatTimeRange) ProtoMessage()    {}
func (*EstimatedSeatTimeRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{2}
}

func (m *EstimatedSeatTimeRange) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_EstimatedSeatTimeRange.Unmarshal(m, b)
}
func (m *EstimatedSeatTimeRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_EstimatedSeatTimeRange.Marshal(b, m, deterministic)
}
func (m *EstimatedSeatTimeRange) XXX_Merge(src proto.Message) {
	xxx_messageInfo_EstimatedSeatTimeRange.Merge(m, src)
}
func (m *EstimatedSeatTimeRange) XXX_Size() int {
	return xxx_messageInfo_EstimatedSeatTimeRange.Size(m)
}
func (m *EstimatedSeatTimeRange) XXX_DiscardUnknown() {
	xxx_messageInfo_EstimatedSeatTimeRange.DiscardUnknown(m)
}

var xxx_messageInfo_EstimatedSeatTimeRange proto.InternalMessageInfo

func (m *EstimatedSeatTimeRange) GetStartSeconds() int64 {
	if m != nil {
		return m.StartSeconds
	}
	return 0
}

func (m *EstimatedSeatTimeRange) GetEndSeconds() int64 {
	if m != nil {
		return m.EndSeconds
	}
	return 0
}

// Contains fields measuring how long (in time or # of people) until the
// user is ready to leave the waitlist and be seated.
type WaitLength struct {
	// The count of how many other parties are ahead of the user in the waitlist.
	// parties_ahead_count must change over time as parties ahead
	// in the waitlist are seated or leave the waitlist. Either
	// parties_ahead_count or estimated_seat_time_range must be populated. Both
	// should be populated.
	PartiesAheadCount int32 `protobuf:"varint,1,opt,name=parties_ahead_count,json=partiesAheadCount,proto3" json:"parties_ahead_count,omitempty"`
	// The range of time that the user is estimated to be seated in. Either
	// parties_ahead_count or estimated_seat_time_range must be populated. Both
	// should be populated.
	EstimatedSeatTimeRange *EstimatedSeatTimeRange `protobuf:"bytes,2,opt,name=estimated_seat_time_range,json=estimatedSeatTimeRange,proto3" json:"estimated_seat_time_range,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                `json:"-"`
	XXX_unrecognized       []byte                  `json:"-"`
	XXX_sizecache          int32                   `json:"-"`
}

func (m *WaitLength) Reset()         { *m = WaitLength{} }
func (m *WaitLength) String() string { return proto.CompactTextString(m) }
func (*WaitLength) ProtoMessage()    {}
func (*WaitLength) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{3}
}

func (m *WaitLength) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitLength.Unmarshal(m, b)
}
func (m *WaitLength) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitLength.Marshal(b, m, deterministic)
}
func (m *WaitLength) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitLength.Merge(m, src)
}
func (m *WaitLength) XXX_Size() int {
	return xxx_messageInfo_WaitLength.Size(m)
}
func (m *WaitLength) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitLength.DiscardUnknown(m)
}

var xxx_messageInfo_WaitLength proto.InternalMessageInfo

func (m *WaitLength) GetPartiesAheadCount() int32 {
	if m != nil {
		return m.PartiesAheadCount
	}
	return 0
}

func (m *WaitLength) GetEstimatedSeatTimeRange() *EstimatedSeatTimeRange {
	if m != nil {
		return m.EstimatedSeatTimeRange
	}
	return nil
}

// The wait estimate for a particular party size, merchant and service.
type WaitEstimate struct {
	// Required. The party size this wait estimate applies to.
	PartySize int32 `protobuf:"varint,1,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	// Required. Contains fields measuring how long (in time or # of people) until
	// the user is ready to leave the waitlist and be seated.
	WaitLength           *WaitLength `protobuf:"bytes,2,opt,name=wait_length,json=waitLength,proto3" json:"wait_length,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *WaitEstimate) Reset()         { *m = WaitEstimate{} }
func (m *WaitEstimate) String() string { return proto.CompactTextString(m) }
func (*WaitEstimate) ProtoMessage()    {}
func (*WaitEstimate) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{4}
}

func (m *WaitEstimate) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitEstimate.Unmarshal(m, b)
}
func (m *WaitEstimate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitEstimate.Marshal(b, m, deterministic)
}
func (m *WaitEstimate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitEstimate.Merge(m, src)
}
func (m *WaitEstimate) XXX_Size() int {
	return xxx_messageInfo_WaitEstimate.Size(m)
}
func (m *WaitEstimate) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitEstimate.DiscardUnknown(m)
}

var xxx_messageInfo_WaitEstimate proto.InternalMessageInfo

func (m *WaitEstimate) GetPartySize() int32 {
	if m != nil {
		return m.PartySize
	}
	return 0
}

func (m *WaitEstimate) GetWaitLength() *WaitLength {
	if m != nil {
		return m.WaitLength
	}
	return nil
}

// Request for a user to join the waitlist.
//
// Reserve with Google may retry REST HTTP requests if no response is
// received. If the exact same CreateWaitlistEntry is received a second time,
// then the same CreateWaitlistResponse must be returned. A second waitlist
// entry must not be created.
type CreateWaitlistEntryRequest struct {
	// Required. Partner-provided ID for the merchant.
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// Required. Partner-provided ID for the service.
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Required. The party size requested for the waitlist entry.
	PartySize int32 `protobuf:"varint,3,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	// Required. Personal information of the user joining the waitlist.
	UserInformation *UserInformation `protobuf:"bytes,4,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// A string from the user which contains any special requests or additional
	// information that they would like to notify the merchant about.
	// This will be populated when the user submits an additional request to
	// Reserve with Google. The partner can disable this functionality at the
	// service level by setting supports_additional_request to false in the
	// service feed.
	AdditionalRequest string `protobuf:"bytes,5,opt,name=additional_request,json=additionalRequest,proto3" json:"additional_request,omitempty"`
	// Required. Used to differentiate retries from separate requests. If the
	// exact same CreateWaitlistEntry is received a second time, (including
	// idempotency_token) then the same CreateWaitlistResponse must be returned.
	IdempotencyToken     string   `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateWaitlistEntryRequest) Reset()         { *m = CreateWaitlistEntryRequest{} }
func (m *CreateWaitlistEntryRequest) String() string { return proto.CompactTextString(m) }
func (*CreateWaitlistEntryRequest) ProtoMessage()    {}
func (*CreateWaitlistEntryRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{5}
}

func (m *CreateWaitlistEntryRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateWaitlistEntryRequest.Unmarshal(m, b)
}
func (m *CreateWaitlistEntryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateWaitlistEntryRequest.Marshal(b, m, deterministic)
}
func (m *CreateWaitlistEntryRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateWaitlistEntryRequest.Merge(m, src)
}
func (m *CreateWaitlistEntryRequest) XXX_Size() int {
	return xxx_messageInfo_CreateWaitlistEntryRequest.Size(m)
}
func (m *CreateWaitlistEntryRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateWaitlistEntryRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateWaitlistEntryRequest proto.InternalMessageInfo

func (m *CreateWaitlistEntryRequest) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *CreateWaitlistEntryRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *CreateWaitlistEntryRequest) GetPartySize() int32 {
	if m != nil {
		return m.PartySize
	}
	return 0
}

func (m *CreateWaitlistEntryRequest) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *CreateWaitlistEntryRequest) GetAdditionalRequest() string {
	if m != nil {
		return m.AdditionalRequest
	}
	return ""
}

func (m *CreateWaitlistEntryRequest) GetIdempotencyToken() string {
	if m != nil {
		return m.IdempotencyToken
	}
	return ""
}

// Response for the CreateWaitlistEntry RPC with the waitlist entry ID or any
// failing business logic information.
type CreateWaitlistEntryResponse struct {
	// Unique partner-provided ID for the newly created entry in the waitlist.
	// Required if the waitlist entry was created successfully. Unique for all
	// time.
	WaitlistEntryId              string                        `protobuf:"bytes,1,opt,name=waitlist_entry_id,json=waitlistEntryId,proto3" json:"waitlist_entry_id,omitempty"`
	WaitlistBusinessLogicFailure *WaitlistBusinessLogicFailure `protobuf:"bytes,2,opt,name=waitlist_business_logic_failure,json=waitlistBusinessLogicFailure,proto3" json:"waitlist_business_logic_failure,omitempty"`
	XXX_NoUnkeyedLiteral         struct{}                      `json:"-"`
	XXX_unrecognized             []byte                        `json:"-"`
	XXX_sizecache                int32                         `json:"-"`
}

func (m *CreateWaitlistEntryResponse) Reset()         { *m = CreateWaitlistEntryResponse{} }
func (m *CreateWaitlistEntryResponse) String() string { return proto.CompactTextString(m) }
func (*CreateWaitlistEntryResponse) ProtoMessage()    {}
func (*CreateWaitlistEntryResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{6}
}

func (m *CreateWaitlistEntryResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateWaitlistEntryResponse.Unmarshal(m, b)
}
func (m *CreateWaitlistEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateWaitlistEntryResponse.Marshal(b, m, deterministic)
}
func (m *CreateWaitlistEntryResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateWaitlistEntryResponse.Merge(m, src)
}
func (m *CreateWaitlistEntryResponse) XXX_Size() int {
	return xxx_messageInfo_CreateWaitlistEntryResponse.Size(m)
}
func (m *CreateWaitlistEntryResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateWaitlistEntryResponse.DiscardUnknown(m)
}

var xxx_messageInfo_CreateWaitlistEntryResponse proto.InternalMessageInfo

func (m *CreateWaitlistEntryResponse) GetWaitlistEntryId() string {
	if m != nil {
		return m.WaitlistEntryId
	}
	return ""
}

func (m *CreateWaitlistEntryResponse) GetWaitlistBusinessLogicFailure() *WaitlistBusinessLogicFailure {
	if m != nil {
		return m.WaitlistBusinessLogicFailure
	}
	return nil
}

// Get the waitlist entry corresponding to the provided waitlist entry ID.
type GetWaitlistEntryRequest struct {
	// Required. The partner-provided waitlist entry ID to request info for.
	WaitlistEntryId      string   `protobuf:"bytes,1,opt,name=waitlist_entry_id,json=waitlistEntryId,proto3" json:"waitlist_entry_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetWaitlistEntryRequest) Reset()         { *m = GetWaitlistEntryRequest{} }
func (m *GetWaitlistEntryRequest) String() string { return proto.CompactTextString(m) }
func (*GetWaitlistEntryRequest) ProtoMessage()    {}
func (*GetWaitlistEntryRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{7}
}

func (m *GetWaitlistEntryRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetWaitlistEntryRequest.Unmarshal(m, b)
}
func (m *GetWaitlistEntryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetWaitlistEntryRequest.Marshal(b, m, deterministic)
}
func (m *GetWaitlistEntryRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetWaitlistEntryRequest.Merge(m, src)
}
func (m *GetWaitlistEntryRequest) XXX_Size() int {
	return xxx_messageInfo_GetWaitlistEntryRequest.Size(m)
}
func (m *GetWaitlistEntryRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetWaitlistEntryRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetWaitlistEntryRequest proto.InternalMessageInfo

func (m *GetWaitlistEntryRequest) GetWaitlistEntryId() string {
	if m != nil {
		return m.WaitlistEntryId
	}
	return ""
}

// Response with the waitlist entry corresponding to the provided
// waitlist entry ID.
type GetWaitlistEntryResponse struct {
	// Required. The partner-provided information about a user’s waitlist entry.
	WaitlistEntry        *WaitlistEntry `protobuf:"bytes,1,opt,name=waitlist_entry,json=waitlistEntry,proto3" json:"waitlist_entry,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *GetWaitlistEntryResponse) Reset()         { *m = GetWaitlistEntryResponse{} }
func (m *GetWaitlistEntryResponse) String() string { return proto.CompactTextString(m) }
func (*GetWaitlistEntryResponse) ProtoMessage()    {}
func (*GetWaitlistEntryResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{8}
}

func (m *GetWaitlistEntryResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetWaitlistEntryResponse.Unmarshal(m, b)
}
func (m *GetWaitlistEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetWaitlistEntryResponse.Marshal(b, m, deterministic)
}
func (m *GetWaitlistEntryResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetWaitlistEntryResponse.Merge(m, src)
}
func (m *GetWaitlistEntryResponse) XXX_Size() int {
	return xxx_messageInfo_GetWaitlistEntryResponse.Size(m)
}
func (m *GetWaitlistEntryResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_GetWaitlistEntryResponse.DiscardUnknown(m)
}

var xxx_messageInfo_GetWaitlistEntryResponse proto.InternalMessageInfo

func (m *GetWaitlistEntryResponse) GetWaitlistEntry() *WaitlistEntry {
	if m != nil {
		return m.WaitlistEntry
	}
	return nil
}

// Cancel the user's entry in the waitlist.
type DeleteWaitlistEntryRequest struct {
	// Required. The partner-provided ID for the waitlist entry to be deleted.
	WaitlistEntryId      string   `protobuf:"bytes,1,opt,name=waitlist_entry_id,json=waitlistEntryId,proto3" json:"waitlist_entry_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteWaitlistEntryRequest) Reset()         { *m = DeleteWaitlistEntryRequest{} }
func (m *DeleteWaitlistEntryRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteWaitlistEntryRequest) ProtoMessage()    {}
func (*DeleteWaitlistEntryRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{9}
}

func (m *DeleteWaitlistEntryRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeleteWaitlistEntryRequest.Unmarshal(m, b)
}
func (m *DeleteWaitlistEntryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeleteWaitlistEntryRequest.Marshal(b, m, deterministic)
}
func (m *DeleteWaitlistEntryRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeleteWaitlistEntryRequest.Merge(m, src)
}
func (m *DeleteWaitlistEntryRequest) XXX_Size() int {
	return xxx_messageInfo_DeleteWaitlistEntryRequest.Size(m)
}
func (m *DeleteWaitlistEntryRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_DeleteWaitlistEntryRequest.DiscardUnknown(m)
}

var xxx_messageInfo_DeleteWaitlistEntryRequest proto.InternalMessageInfo

func (m *DeleteWaitlistEntryRequest) GetWaitlistEntryId() string {
	if m != nil {
		return m.WaitlistEntryId
	}
	return ""
}

// The times at which the waitlist entry changed state.
type WaitlistEntryStateTimes struct {
	// Required. The time at which the waitlist entry was created.
	// In seconds since Unix epoch.
	CreatedTimeSeconds int64 `protobuf:"varint,1,opt,name=created_time_seconds,json=createdTimeSeconds,proto3" json:"created_time_seconds,omitempty"`
	// The time that the waitlist entry was cancelled. Must be populated
	// when the waitlist entry has been canceled but not before.
	// In seconds since Unix epoch.
	CanceledTimeSeconds int64 `protobuf:"varint,2,opt,name=canceled_time_seconds,json=canceledTimeSeconds,proto3" json:"canceled_time_seconds,omitempty"`
	// The time the merchant was ready to serve the user.
	// service_readied_time_seconds must be populated after the merchant is
	// ready to serve the user but not before.
	// In seconds since Unix epoch.
	ServiceReadiedTimeSeconds int64 `protobuf:"varint,3,opt,name=service_readied_time_seconds,json=serviceReadiedTimeSeconds,proto3" json:"service_readied_time_seconds,omitempty"`
	// The actual time the user checked in with the host. checked_in_time must be
	// populated after the user has checked in with the merchant but not before.
	// In seconds since Unix epoch.
	CheckedInTimeSeconds int64 `protobuf:"varint,4,opt,name=checked_in_time_seconds,json=checkedInTimeSeconds,proto3" json:"checked_in_time_seconds,omitempty"`
	// The seated time for the user. seated_time_seconds must be populated
	// when the user has been seated but not before.
	// In seconds since Unix epoch.
	SeatedTimeSeconds int64 `protobuf:"varint,5,opt,name=seated_time_seconds,json=seatedTimeSeconds,proto3" json:"seated_time_seconds,omitempty"`
	// The time that the user was marked as a no-show. marked_no_show_time_seconds
	// must be populated when the user has been marked a no-show but not before.
	// In seconds since Unix epoch.
	MarkedNoShowTimeSeconds int64    `protobuf:"varint,6,opt,name=marked_no_show_time_seconds,json=markedNoShowTimeSeconds,proto3" json:"marked_no_show_time_seconds,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

func (m *WaitlistEntryStateTimes) Reset()         { *m = WaitlistEntryStateTimes{} }
func (m *WaitlistEntryStateTimes) String() string { return proto.CompactTextString(m) }
func (*WaitlistEntryStateTimes) ProtoMessage()    {}
func (*WaitlistEntryStateTimes) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{10}
}

func (m *WaitlistEntryStateTimes) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitlistEntryStateTimes.Unmarshal(m, b)
}
func (m *WaitlistEntryStateTimes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitlistEntryStateTimes.Marshal(b, m, deterministic)
}
func (m *WaitlistEntryStateTimes) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitlistEntryStateTimes.Merge(m, src)
}
func (m *WaitlistEntryStateTimes) XXX_Size() int {
	return xxx_messageInfo_WaitlistEntryStateTimes.Size(m)
}
func (m *WaitlistEntryStateTimes) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitlistEntryStateTimes.DiscardUnknown(m)
}

var xxx_messageInfo_WaitlistEntryStateTimes proto.InternalMessageInfo

func (m *WaitlistEntryStateTimes) GetCreatedTimeSeconds() int64 {
	if m != nil {
		return m.CreatedTimeSeconds
	}
	return 0
}

func (m *WaitlistEntryStateTimes) GetCanceledTimeSeconds() int64 {
	if m != nil {
		return m.CanceledTimeSeconds
	}
	return 0
}

func (m *WaitlistEntryStateTimes) GetServiceReadiedTimeSeconds() int64 {
	if m != nil {
		return m.ServiceReadiedTimeSeconds
	}
	return 0
}

func (m *WaitlistEntryStateTimes) GetCheckedInTimeSeconds() int64 {
	if m != nil {
		return m.CheckedInTimeSeconds
	}
	return 0
}

func (m *WaitlistEntryStateTimes) GetSeatedTimeSeconds() int64 {
	if m != nil {
		return m.SeatedTimeSeconds
	}
	return 0
}

func (m *WaitlistEntryStateTimes) GetMarkedNoShowTimeSeconds() int64 {
	if m != nil {
		return m.MarkedNoShowTimeSeconds
	}
	return 0
}

// An entry in the waitlist.
type WaitlistEntry struct {
	// Required.
	WaitlistEntryState WaitlistEntryState `protobuf:"varint,1,opt,name=waitlist_entry_state,json=waitlistEntryState,proto3,enum=ext.maps.booking.partner.v3.waitlist.WaitlistEntryState" json:"waitlist_entry_state,omitempty"`
	// Required. The times at which the waitlist entry changed state.
	WaitlistEntryStateTimes *WaitlistEntryStateTimes `protobuf:"bytes,2,opt,name=waitlist_entry_state_times,json=waitlistEntryStateTimes,proto3" json:"waitlist_entry_state_times,omitempty"`
	// Required. Contains fields measuring how long (in time or # of people) until
	// the user is ready to leave the waitlist and be seated.
	WaitEstimate         *WaitEstimate `protobuf:"bytes,3,opt,name=wait_estimate,json=waitEstimate,proto3" json:"wait_estimate,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *WaitlistEntry) Reset()         { *m = WaitlistEntry{} }
func (m *WaitlistEntry) String() string { return proto.CompactTextString(m) }
func (*WaitlistEntry) ProtoMessage()    {}
func (*WaitlistEntry) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{11}
}

func (m *WaitlistEntry) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitlistEntry.Unmarshal(m, b)
}
func (m *WaitlistEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitlistEntry.Marshal(b, m, deterministic)
}
func (m *WaitlistEntry) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitlistEntry.Merge(m, src)
}
func (m *WaitlistEntry) XXX_Size() int {
	return xxx_messageInfo_WaitlistEntry.Size(m)
}
func (m *WaitlistEntry) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitlistEntry.DiscardUnknown(m)
}

var xxx_messageInfo_WaitlistEntry proto.InternalMessageInfo

func (m *WaitlistEntry) GetWaitlistEntryState() WaitlistEntryState {
	if m != nil {
		return m.WaitlistEntryState
	}
	return WaitlistEntryState_WAITLIST_ENTRY_STATE_UNSPECIFIED
}

func (m *WaitlistEntry) GetWaitlistEntryStateTimes() *WaitlistEntryStateTimes {
	if m != nil {
		return m.WaitlistEntryStateTimes
	}
	return nil
}

func (m *WaitlistEntry) GetWaitEstimate() *WaitEstimate {
	if m != nil {
		return m.WaitEstimate
	}
	return nil
}

// Status data that conveys why creating a waitlist entry fails.
// If there is a business logic error that is not captured here, please
// reach out to the Reserve with Google team to add it to this list. Other
// errors should be returned using standard HTTP error codes.
type WaitlistBusinessLogicFailure struct {
	// Required. The reason why the booking failed.
	Cause WaitlistBusinessLogicFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.waitlist.WaitlistBusinessLogicFailure_Cause" json:"cause,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purposes only.
	Description          string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WaitlistBusinessLogicFailure) Reset()         { *m = WaitlistBusinessLogicFailure{} }
func (m *WaitlistBusinessLogicFailure) String() string { return proto.CompactTextString(m) }
func (*WaitlistBusinessLogicFailure) ProtoMessage()    {}
func (*WaitlistBusinessLogicFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{12}
}

func (m *WaitlistBusinessLogicFailure) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WaitlistBusinessLogicFailure.Unmarshal(m, b)
}
func (m *WaitlistBusinessLogicFailure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WaitlistBusinessLogicFailure.Marshal(b, m, deterministic)
}
func (m *WaitlistBusinessLogicFailure) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WaitlistBusinessLogicFailure.Merge(m, src)
}
func (m *WaitlistBusinessLogicFailure) XXX_Size() int {
	return xxx_messageInfo_WaitlistBusinessLogicFailure.Size(m)
}
func (m *WaitlistBusinessLogicFailure) XXX_DiscardUnknown() {
	xxx_messageInfo_WaitlistBusinessLogicFailure.DiscardUnknown(m)
}

var xxx_messageInfo_WaitlistBusinessLogicFailure proto.InternalMessageInfo

func (m *WaitlistBusinessLogicFailure) GetCause() WaitlistBusinessLogicFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return WaitlistBusinessLogicFailure_CAUSE_UNSPECIFIED
}

func (m *WaitlistBusinessLogicFailure) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

// Personal information about the person making a booking
type UserInformation struct {
	// Unique ID of the user to the partner, chosen by Reserve with Google.
	// (required)
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	// Given name of the user (maximum 40 characters) (required)
	GivenName string `protobuf:"bytes,2,opt,name=given_name,json=givenName,proto3" json:"given_name,omitempty"`
	// Family name of the user (maximum 40 characters) (required)
	FamilyName string `protobuf:"bytes,3,opt,name=family_name,json=familyName,proto3" json:"family_name,omitempty"`
	// Address of the user (optional)
	Address *PostalAddress `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"`
	// Phone number of the user (required)
	Telephone string `protobuf:"bytes,5,opt,name=telephone,proto3" json:"telephone,omitempty"`
	// Email address of the user (required)
	Email                string   `protobuf:"bytes,6,opt,name=email,proto3" json:"email,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserInformation) Reset()         { *m = UserInformation{} }
func (m *UserInformation) String() string { return proto.CompactTextString(m) }
func (*UserInformation) ProtoMessage()    {}
func (*UserInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{13}
}

func (m *UserInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UserInformation.Unmarshal(m, b)
}
func (m *UserInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UserInformation.Marshal(b, m, deterministic)
}
func (m *UserInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UserInformation.Merge(m, src)
}
func (m *UserInformation) XXX_Size() int {
	return xxx_messageInfo_UserInformation.Size(m)
}
func (m *UserInformation) XXX_DiscardUnknown() {
	xxx_messageInfo_UserInformation.DiscardUnknown(m)
}

var xxx_messageInfo_UserInformation proto.InternalMessageInfo

func (m *UserInformation) GetUserId() string {
	if m != nil {
		return m.UserId
	}
	return ""
}

func (m *UserInformation) GetGivenName() string {
	if m != nil {
		return m.GivenName
	}
	return ""
}

func (m *UserInformation) GetFamilyName() string {
	if m != nil {
		return m.FamilyName
	}
	return ""
}

func (m *UserInformation) GetAddress() *PostalAddress {
	if m != nil {
		return m.Address
	}
	return nil
}

func (m *UserInformation) GetTelephone() string {
	if m != nil {
		return m.Telephone
	}
	return ""
}

func (m *UserInformation) GetEmail() string {
	if m != nil {
		return m.Email
	}
	return ""
}

// The postal address for a merchant.
type PostalAddress struct {
	// The country, e.g. "USA". (required)
	Country string `protobuf:"bytes,1,opt,name=country,proto3" json:"country,omitempty"`
	// The locality/city, e.g. "Mountain View". (required)
	Locality string `protobuf:"bytes,2,opt,name=locality,proto3" json:"locality,omitempty"`
	// The region/state/province, e.g. "CA". (required)
	Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"`
	// The postal code, e.g. "94043". (required)
	PostalCode string `protobuf:"bytes,4,opt,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"`
	// The street address, e.g. "1600 Amphitheatre Pkwy". (required)
	StreetAddress        string   `protobuf:"bytes,5,opt,name=street_address,json=streetAddress,proto3" json:"street_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PostalAddress) Reset()         { *m = PostalAddress{} }
func (m *PostalAddress) String() string { return proto.CompactTextString(m) }
func (*PostalAddress) ProtoMessage()    {}
func (*PostalAddress) Descriptor() ([]byte, []int) {
	return fileDescriptor_c4272259c545fcea, []int{14}
}

func (m *PostalAddress) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PostalAddress.Unmarshal(m, b)
}
func (m *PostalAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PostalAddress.Marshal(b, m, deterministic)
}
func (m *PostalAddress) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PostalAddress.Merge(m, src)
}
func (m *PostalAddress) XXX_Size() int {
	return xxx_messageInfo_PostalAddress.Size(m)
}
func (m *PostalAddress) XXX_DiscardUnknown() {
	xxx_messageInfo_PostalAddress.DiscardUnknown(m)
}

var xxx_messageInfo_PostalAddress proto.InternalMessageInfo

func (m *PostalAddress) GetCountry() string {
	if m != nil {
		return m.Country
	}
	return ""
}

func (m *PostalAddress) GetLocality() string {
	if m != nil {
		return m.Locality
	}
	return ""
}

func (m *PostalAddress) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *PostalAddress) GetPostalCode() string {
	if m != nil {
		return m.PostalCode
	}
	return ""
}

func (m *PostalAddress) GetStreetAddress() string {
	if m != nil {
		return m.StreetAddress
	}
	return ""
}

func init() {
	proto.RegisterType((*BatchGetWaitEstimatesRequest)(nil), "ext.maps.booking.partner.v3.waitlist.BatchGetWaitEstimatesRequest")
	proto.RegisterType((*BatchGetWaitEstimatesResponse)(nil), "ext.maps.booking.partner.v3.waitlist.BatchGetWaitEstimatesResponse")
	proto.RegisterType((*EstimatedSeatTimeRange)(nil), "ext.maps.booking.partner.v3.waitlist.EstimatedSeatTimeRange")
	proto.RegisterType((*WaitLength)(nil), "ext.maps.booking.partner.v3.waitlist.WaitLength")
	proto.RegisterType((*WaitEstimate)(nil), "ext.maps.booking.partner.v3.waitlist.WaitEstimate")
	proto.RegisterType((*CreateWaitlistEntryRequest)(nil), "ext.maps.booking.partner.v3.waitlist.CreateWaitlistEntryRequest")
	proto.RegisterType((*CreateWaitlistEntryResponse)(nil), "ext.maps.booking.partner.v3.waitlist.CreateWaitlistEntryResponse")
	proto.RegisterType((*GetWaitlistEntryRequest)(nil), "ext.maps.booking.partner.v3.waitlist.GetWaitlistEntryRequest")
	proto.RegisterType((*GetWaitlistEntryResponse)(nil), "ext.maps.booking.partner.v3.waitlist.GetWaitlistEntryResponse")
	proto.RegisterType((*DeleteWaitlistEntryRequest)(nil), "ext.maps.booking.partner.v3.waitlist.DeleteWaitlistEntryRequest")
	proto.RegisterType((*WaitlistEntryStateTimes)(nil), "ext.maps.booking.partner.v3.waitlist.WaitlistEntryStateTimes")
	proto.RegisterType((*WaitlistEntry)(nil), "ext.maps.booking.partner.v3.waitlist.WaitlistEntry")
	proto.RegisterType((*WaitlistBusinessLogicFailure)(nil), "ext.maps.booking.partner.v3.waitlist.WaitlistBusinessLogicFailure")
	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.waitlist.UserInformation")
	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.waitlist.PostalAddress")
	proto.RegisterEnum("ext.maps.booking.partner.v3.waitlist.WaitlistStatus", WaitlistStatus_name, WaitlistStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.waitlist.WaitlistEntryState", WaitlistEntryState_name, WaitlistEntryState_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.waitlist.WaitlistBusinessLogicFailure_Cause", WaitlistBusinessLogicFailure_Cause_name, WaitlistBusinessLogicFailure_Cause_value)
}

func init() { proto.RegisterFile("waitlist.proto", fileDescriptor_c4272259c545fcea) }

var fileDescriptor_c4272259c545fcea = []byte{
	// 1295 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcd, 0x6e, 0xdb, 0x46,
	0x10, 0x2e, 0x25, 0x4b, 0x8e, 0x47, 0xfe, 0xa1, 0xd6, 0x4e, 0xa4, 0xd8, 0x0e, 0x62, 0xb0, 0x29,
	0x10, 0xa4, 0xa8, 0x10, 0x38, 0x0d, 0xd0, 0x43, 0x8a, 0x42, 0x96, 0x98, 0x98, 0xa8, 0x2c, 0xb9,
	0xa4, 0x1c, 0x27, 0x01, 0x9a, 0xed, 0x86, 0x9c, 0x58, 0x6c, 0x28, 0x52, 0xe5, 0xae, 0xac, 0x3a,
	0x40, 0x81, 0x5e, 0x7b, 0xec, 0x3b, 0xb4, 0x8f, 0xd0, 0x43, 0x9f, 0xa0, 0xd7, 0x5e, 0x8a, 0x3e,
	0x41, 0x8f, 0x7d, 0x87, 0x82, 0xbb, 0xa4, 0x2c, 0xc9, 0x4e, 0x60, 0x27, 0xe8, 0x8d, 0x3b, 0x3f,
	0xdf, 0xcc, 0x37, 0x3b, 0x3b, 0x23, 0xc1, 0xf2, 0x88, 0xf9, 0x22, 0xf0, 0xb9, 0xa8, 0x0d, 0xe2,
	0x48, 0x44, 0xe4, 0x16, 0x7e, 0x2f, 0x6a, 0x7d, 0x36, 0xe0, 0xb5, 0x17, 0x51, 0xf4, 0xca, 0x0f,
	0x8f, 0x6a, 0x03, 0x16, 0x8b, 0x10, 0xe3, 0xda, 0xf1, 0xbd, 0x5a, 0x66, 0x6b, 0xfc, 0x00, 0x9b,
	0x3b, 0x4c, 0xb8, 0xbd, 0x47, 0x28, 0x0e, 0x99, 0x2f, 0x4c, 0x2e, 0xfc, 0x3e, 0x13, 0xc8, 0x6d,
	0xfc, 0x6e, 0x88, 0x5c, 0x90, 0x9b, 0x50, 0xea, 0x63, 0xec, 0xf6, 0x58, 0x28, 0xa8, 0xef, 0x55,
	0xb5, 0x2d, 0xed, 0xf6, 0x82, 0x0d, 0x99, 0xc8, 0xf2, 0xc8, 0x0d, 0x00, 0x8e, 0xf1, 0xb1, 0xef,
	0x62, 0xa2, 0xcf, 0x49, 0xfd, 0x42, 0x2a, 0x51, 0xea, 0x24, 0xec, 0x09, 0xe5, 0xfe, 0x6b, 0xac,
	0xe6, 0xb7, 0xf2, 0xb7, 0x0b, 0xf6, 0x82, 0x94, 0x38, 0xfe, 0x6b, 0x34, 0xfe, 0xd6, 0xe0, 0xc6,
	0x1b, 0xe2, 0xf3, 0x41, 0x14, 0x72, 0x24, 0x5f, 0xc3, 0x4a, 0x96, 0x2c, 0xe5, 0x82, 0x89, 0x21,
	0x97, 0x49, 0x2c, 0x6f, 0x7f, 0x5a, 0xbb, 0x08, 0xc1, 0xda, 0x61, 0xfa, 0xe1, 0x48, 0x5f, 0x7b,
	0x5c, 0x25, 0x75, 0x26, 0x87, 0xb0, 0x94, 0x48, 0x28, 0xa6, 0x81, 0xab, 0xb9, 0xad, 0xfc, 0xed,
	0xd2, 0xf6, 0xf6, 0xc5, 0xc1, 0xb3, 0x94, 0xed, 0xc5, 0xd1, 0xc4, 0xc9, 0x78, 0x0e, 0xd7, 0xb2,
	0x6f, 0xcf, 0x41, 0x26, 0xba, 0x7e, 0x1f, 0x6d, 0x16, 0x1e, 0x21, 0xf9, 0x10, 0x96, 0xb8, 0x60,
	0xb1, 0xa0, 0x1c, 0xdd, 0x28, 0xf4, 0x14, 0x9f, 0xbc, 0xbd, 0x28, 0x85, 0x8e, 0x92, 0x25, 0x75,
	0xc7, 0xd0, 0x1b, 0x9b, 0xe4, 0xa4, 0x09, 0x60, 0xe8, 0xa5, 0x06, 0xc6, 0x6f, 0x1a, 0x40, 0x12,
	0xbe, 0x85, 0xe1, 0x91, 0xe8, 0x91, 0x1a, 0xac, 0x26, 0x09, 0xfa, 0xc8, 0x29, 0xeb, 0x21, 0xf3,
	0xa8, 0x1b, 0x0d, 0x43, 0x21, 0xa1, 0x0b, 0x76, 0x39, 0x55, 0xd5, 0x13, 0x4d, 0x23, 0x51, 0x90,
	0x11, 0x5c, 0xcf, 0x28, 0x27, 0x51, 0x98, 0xa0, 0xc2, 0xef, 0x23, 0x8d, 0x93, 0x0c, 0x65, 0xb4,
	0xd2, 0xf6, 0x83, 0x8b, 0xd5, 0xe0, 0x7c, 0x96, 0xf6, 0x35, 0x3c, 0x57, 0x6e, 0xfc, 0xa8, 0xc1,
	0xe2, 0x64, 0xd9, 0x66, 0x3a, 0x44, 0x25, 0x7c, 0xda, 0x21, 0xe4, 0x2b, 0x28, 0xc9, 0x0b, 0x0a,
	0x24, 0xcf, 0x34, 0xb5, 0xbb, 0x17, 0xbf, 0x1e, 0x55, 0x1f, 0x1b, 0x46, 0xe3, 0x6f, 0xe3, 0xf7,
	0x1c, 0xac, 0x37, 0x62, 0x64, 0x02, 0xb3, 0xe6, 0x30, 0x43, 0x11, 0x9f, 0xfc, 0x5f, 0x2d, 0x3f,
	0x43, 0xe8, 0x1b, 0xd0, 0x87, 0x1c, 0x63, 0xea, 0x87, 0x2f, 0xa3, 0xb8, 0xcf, 0x84, 0x1f, 0x85,
	0xd5, 0x39, 0xc9, 0xea, 0xfe, 0xc5, 0x58, 0x1d, 0x70, 0x8c, 0xad, 0x53, 0x67, 0x7b, 0x65, 0x38,
	0x2d, 0x20, 0x9f, 0x00, 0x61, 0x9e, 0xe7, 0x27, 0xdf, 0x2c, 0xa0, 0xb1, 0xa2, 0x55, 0x2d, 0xc8,
	0x3c, 0xcb, 0xa7, 0x9a, 0x8c, 0xef, 0xc7, 0x50, 0xf6, 0x3d, 0xec, 0x0f, 0x22, 0x81, 0xa1, 0x7b,
	0x42, 0x45, 0xf4, 0x0a, 0xc3, 0x6a, 0x51, 0x5a, 0xeb, 0x13, 0x8a, 0x6e, 0x22, 0x37, 0xfe, 0xd2,
	0x60, 0xe3, 0xdc, 0xda, 0xa5, 0xcf, 0xf5, 0x0e, 0x94, 0xc7, 0xcf, 0x15, 0x13, 0xcd, 0x69, 0x09,
	0xc7, 0xef, 0x58, 0x7a, 0x58, 0x1e, 0xf9, 0x49, 0x83, 0x9b, 0x63, 0xe3, 0x17, 0x43, 0xee, 0x87,
	0xc8, 0x39, 0x0d, 0xa2, 0x23, 0xdf, 0xa5, 0x2f, 0x99, 0x1f, 0x0c, 0xe3, 0xac, 0x15, 0x77, 0x2e,
	0xf7, 0xd6, 0x77, 0x52, 0xac, 0x56, 0x02, 0xf5, 0x50, 0x21, 0xd9, 0x9b, 0xa3, 0xb7, 0x68, 0x0d,
	0x13, 0x2a, 0xe9, 0x08, 0x3a, 0xd3, 0x0f, 0x97, 0xa0, 0x64, 0x1c, 0x43, 0xf5, 0x2c, 0x4c, 0x5a,
	0x9a, 0x67, 0xa7, 0x23, 0x5a, 0xe1, 0x48, 0x90, 0xd2, 0xf6, 0xbd, 0xcb, 0x91, 0x53, 0xa0, 0x4b,
	0x53, 0x91, 0x8d, 0x5d, 0x58, 0x6f, 0x62, 0x80, 0x6f, 0xe8, 0xe8, 0xcb, 0x30, 0xf8, 0x27, 0x07,
	0x95, 0x29, 0x90, 0x64, 0x50, 0x62, 0xf2, 0x7e, 0x39, 0xb9, 0x0b, 0x6b, 0xae, 0xbc, 0x7b, 0x4f,
	0x4d, 0x8b, 0xe9, 0x01, 0x46, 0x52, 0x5d, 0x62, 0x9b, 0x8d, 0xb1, 0x6d, 0xb8, 0xea, 0xb2, 0xd0,
	0xc5, 0x60, 0xd6, 0x45, 0x0d, 0xb4, 0xd5, 0x4c, 0x39, 0xe9, 0xf3, 0x05, 0x6c, 0x66, 0xcf, 0x2b,
	0x46, 0xe6, 0xf9, 0xb3, 0xae, 0x79, 0xe9, 0x7a, 0x3d, 0xb5, 0xb1, 0x95, 0xc9, 0x24, 0xc0, 0x7d,
	0xa8, 0xb8, 0x3d, 0x74, 0x5f, 0xa1, 0x47, 0xfd, 0x70, 0xda, 0x77, 0x4e, 0xfa, 0xae, 0xa5, 0x6a,
	0x2b, 0x9c, 0x74, 0xab, 0xc1, 0x2a, 0x3f, 0x87, 0x5c, 0x41, 0xba, 0x94, 0xf9, 0x19, 0x6e, 0x0f,
	0x60, 0xa3, 0xcf, 0xe2, 0x24, 0x4a, 0x18, 0x51, 0xde, 0x8b, 0x46, 0xd3, 0x7e, 0x45, 0xe9, 0x57,
	0x51, 0x26, 0xed, 0xc8, 0xe9, 0x45, 0xa3, 0x09, 0x6f, 0xe3, 0xcf, 0x1c, 0x2c, 0x4d, 0xd5, 0x99,
	0x7c, 0x0b, 0x6b, 0x33, 0xb7, 0x94, 0xec, 0x3b, 0x4c, 0xd7, 0xdd, 0x67, 0xef, 0xd0, 0x25, 0xf2,
	0xea, 0x6c, 0x32, 0x3a, 0x23, 0x23, 0xaf, 0x61, 0xfd, 0xbc, 0x58, 0x92, 0x01, 0x4f, 0x1f, 0xdd,
	0xe7, 0xef, 0x1a, 0x51, 0x36, 0x8b, 0x5d, 0x19, 0xbd, 0xa1, 0x8b, 0xce, 0xac, 0xdc, 0xbc, 0x0c,
	0xf7, 0xfe, 0x2b, 0xf7, 0x8f, 0x1c, 0x6c, 0xbe, 0x6d, 0x04, 0x90, 0xe7, 0x50, 0x70, 0xd9, 0x90,
	0x67, 0x25, 0xdd, 0x7d, 0xff, 0xa9, 0x52, 0x6b, 0x24, 0x78, 0xb6, 0x82, 0x25, 0x5b, 0x50, 0xf2,
	0x90, 0xbb, 0xb1, 0x3f, 0x90, 0x53, 0x5d, 0x6d, 0x86, 0x49, 0x91, 0xf1, 0x8b, 0x06, 0x05, 0xe9,
	0x42, 0xae, 0x42, 0xb9, 0x51, 0x3f, 0x70, 0x4c, 0x7a, 0xd0, 0x76, 0xf6, 0xcd, 0x86, 0xf5, 0xd0,
	0x32, 0x9b, 0xfa, 0x07, 0x64, 0x03, 0x2a, 0xe6, 0x13, 0xcb, 0xe9, 0x5a, 0xed, 0x47, 0xf4, 0xb0,
	0x6e, 0x75, 0x5b, 0x96, 0xd3, 0xa5, 0x66, 0xbb, 0x6b, 0x3f, 0xd5, 0x35, 0x52, 0x85, 0xb5, 0x1d,
	0xb3, 0xd5, 0x39, 0xa4, 0x7b, 0x56, 0x9b, 0xee, 0xd7, 0xed, 0xee, 0x53, 0xea, 0x58, 0xcf, 0x4c,
	0x3d, 0x97, 0x68, 0xea, 0x3b, 0x9d, 0xc7, 0x26, 0xdd, 0xab, 0x3f, 0x99, 0xd4, 0xe4, 0xc9, 0x2a,
	0xac, 0xec, 0x99, 0x76, 0x63, 0xb7, 0xde, 0xee, 0xd2, 0x46, 0xab, 0xe3, 0x98, 0x4d, 0x7d, 0x8e,
	0x94, 0x60, 0xbe, 0xdd, 0x91, 0xf8, 0x7a, 0x81, 0x94, 0x61, 0x69, 0x1c, 0xe9, 0xe1, 0x41, 0xab,
	0xa5, 0x17, 0x8d, 0x7f, 0x35, 0x58, 0x99, 0x59, 0x33, 0xa4, 0x02, 0xf3, 0x6a, 0x6f, 0x65, 0xa3,
	0xa3, 0x28, 0xf7, 0x8e, 0xdc, 0x77, 0x47, 0xfe, 0x31, 0x86, 0x34, 0x64, 0x7d, 0xcc, 0xd6, 0xa1,
	0x94, 0xb4, 0x59, 0x1f, 0x93, 0x75, 0xfa, 0x92, 0xf5, 0xfd, 0xe0, 0x44, 0xe9, 0xf3, 0x6a, 0x9d,
	0x2a, 0x91, 0x34, 0xd8, 0x83, 0x79, 0xe6, 0x79, 0x31, 0x72, 0x9e, 0xee, 0xc1, 0x0b, 0x0e, 0xc4,
	0xfd, 0x88, 0x0b, 0x16, 0xd4, 0x95, 0xab, 0x9d, 0x61, 0x90, 0x4d, 0x58, 0x10, 0x18, 0xe0, 0xa0,
	0x17, 0x85, 0x98, 0x2e, 0xbd, 0x53, 0x01, 0x59, 0x83, 0x02, 0xf6, 0x99, 0x1f, 0xa4, 0x0b, 0x4e,
	0x1d, 0x8c, 0x5f, 0x35, 0x58, 0x9a, 0x82, 0x23, 0x55, 0x98, 0x97, 0xbf, 0xa0, 0xd2, 0x29, 0xbd,
	0x60, 0x67, 0x47, 0xb2, 0x0e, 0x57, 0x82, 0xc8, 0x65, 0x81, 0x2f, 0x4e, 0x52, 0xb2, 0xe3, 0x33,
	0xb9, 0x06, 0xc5, 0x18, 0x8f, 0x92, 0xbb, 0x57, 0x34, 0xd3, 0x53, 0x52, 0x83, 0x81, 0x84, 0xa7,
	0x6e, 0xe4, 0xa1, 0xa4, 0xb9, 0x60, 0x83, 0x12, 0x35, 0x22, 0x0f, 0xc9, 0x47, 0xb0, 0xcc, 0x45,
	0x8c, 0x28, 0x68, 0x56, 0x0a, 0x95, 0xf9, 0x92, 0x92, 0xa6, 0x59, 0xdd, 0x61, 0xb0, 0x3c, 0xfd,
	0x7b, 0x96, 0xdc, 0x84, 0x8d, 0xf1, 0xe5, 0x39, 0xdd, 0x7a, 0xf7, 0xc0, 0x99, 0x69, 0xa8, 0x2b,
	0x30, 0xd7, 0xd9, 0x37, 0xdb, 0xba, 0x46, 0x08, 0x2c, 0xab, 0x06, 0xa0, 0xd9, 0xdd, 0xe7, 0x88,
	0x0e, 0x8b, 0xa9, 0xac, 0xd3, 0xdd, 0x35, 0x6d, 0x3d, 0x7f, 0xe7, 0x67, 0x0d, 0xc8, 0xd9, 0x27,
	0x4d, 0x6e, 0xc1, 0xd6, 0x74, 0x3b, 0xca, 0x68, 0xb3, 0xdd, 0x5b, 0x82, 0xf9, 0xc4, 0xca, 0x6a,
	0x3f, 0xd2, 0x35, 0xb2, 0x08, 0x57, 0x1a, 0xf5, 0x76, 0xc3, 0x6c, 0x99, 0x4d, 0x3d, 0x97, 0x74,
	0x99, 0x63, 0xda, 0x8f, 0xad, 0x86, 0x49, 0x6d, 0xb3, 0xde, 0x7c, 0xaa, 0xe7, 0xc9, 0x32, 0x40,
	0x63, 0xd7, 0x6c, 0x7c, 0x69, 0x36, 0xa9, 0xd5, 0xd6, 0xe7, 0x08, 0x40, 0xd1, 0x31, 0xeb, 0x5d,
	0xb3, 0xa9, 0x17, 0xd2, 0x0e, 0x75, 0x76, 0x3b, 0x87, 0x7a, 0xf1, 0x45, 0x51, 0xfe, 0xa3, 0xb9,
	0xf7, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x7a, 0x92, 0x6d, 0xe3, 0x0c, 0x00, 0x00,
}
