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

package ext_maps_booking_partner_v3

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// 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

// Status of a booking.
//
// Updating booking status does not change the status of the associated payment.
// Prepayment status updates should be done using the PrepaymentStatus enum.
//
// nextID: 6
type BookingStatus int32

const (
	// Not specified.
	BookingStatus_BOOKING_STATUS_UNSPECIFIED BookingStatus = 0
	// Booking has been confirmed
	BookingStatus_CONFIRMED BookingStatus = 1
	// Booking is awaiting confirmation by the merchant before it can transition
	// into CONFIRMED status
	BookingStatus_PENDING_MERCHANT_CONFIRMATION BookingStatus = 2
	// Booking has been canceled on behalf of the user.
	// The merchant can still trigger a manual refund.
	BookingStatus_CANCELED BookingStatus = 3
	// User did not show for the appointment
	BookingStatus_NO_SHOW BookingStatus = 4
	// User did not show for the appointment in violation of the cancellation
	// policy.
	BookingStatus_NO_SHOW_PENALIZED BookingStatus = 5
)

var BookingStatus_name = map[int32]string{
	0: "BOOKING_STATUS_UNSPECIFIED",
	1: "CONFIRMED",
	2: "PENDING_MERCHANT_CONFIRMATION",
	3: "CANCELED",
	4: "NO_SHOW",
	5: "NO_SHOW_PENALIZED",
}

var BookingStatus_value = map[string]int32{
	"BOOKING_STATUS_UNSPECIFIED":    0,
	"CONFIRMED":                     1,
	"PENDING_MERCHANT_CONFIRMATION": 2,
	"CANCELED":                      3,
	"NO_SHOW":                       4,
	"NO_SHOW_PENALIZED":             5,
}

func (x BookingStatus) String() string {
	return proto.EnumName(BookingStatus_name, int32(x))
}

func (BookingStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{0}
}

// Used when booking/order failure cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to
// indicate the type of credit card that was rejected.
type CreditCardType int32

const (
	// Default value. Used if credit card type does not match to one below.
	CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED CreditCardType = 0
	CreditCardType_VISA                         CreditCardType = 1
	CreditCardType_MASTERCARD                   CreditCardType = 2
	CreditCardType_AMERICAN_EXPRESS             CreditCardType = 3
	CreditCardType_DISCOVER                     CreditCardType = 4
	CreditCardType_JCB                          CreditCardType = 5
)

var CreditCardType_name = map[int32]string{
	0: "CREDIT_CARD_TYPE_UNSPECIFIED",
	1: "VISA",
	2: "MASTERCARD",
	3: "AMERICAN_EXPRESS",
	4: "DISCOVER",
	5: "JCB",
}

var CreditCardType_value = map[string]int32{
	"CREDIT_CARD_TYPE_UNSPECIFIED": 0,
	"VISA":                         1,
	"MASTERCARD":                   2,
	"AMERICAN_EXPRESS":             3,
	"DISCOVER":                     4,
	"JCB":                          5,
}

func (x CreditCardType) String() string {
	return proto.EnumName(CreditCardType_name, int32(x))
}

func (CreditCardType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{1}
}

type PaymentOptionType int32

const (
	PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED PaymentOptionType = 0
	PaymentOptionType_PAYMENT_OPTION_SINGLE_USE       PaymentOptionType = 1
	PaymentOptionType_PAYMENT_OPTION_MULTI_USE        PaymentOptionType = 2
	PaymentOptionType_PAYMENT_OPTION_UNLIMITED_USE    PaymentOptionType = 3
)

var PaymentOptionType_name = map[int32]string{
	0: "PAYMENT_OPTION_TYPE_UNSPECIFIED",
	1: "PAYMENT_OPTION_SINGLE_USE",
	2: "PAYMENT_OPTION_MULTI_USE",
	3: "PAYMENT_OPTION_UNLIMITED_USE",
}

var PaymentOptionType_value = map[string]int32{
	"PAYMENT_OPTION_TYPE_UNSPECIFIED": 0,
	"PAYMENT_OPTION_SINGLE_USE":       1,
	"PAYMENT_OPTION_MULTI_USE":        2,
	"PAYMENT_OPTION_UNLIMITED_USE":    3,
}

func (x PaymentOptionType) String() string {
	return proto.EnumName(PaymentOptionType_name, int32(x))
}

func (PaymentOptionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{2}
}

// Prepayment status of a booking.
// Updating payment status will trigger an update on the payment status of the
// associated booking (if applicable).
// Currently, the only supported transition is from PREPAYMENT_PROVIDED to
// PREPAYMENT_REFUNDED, which will initiate a non-reversible refund on the
// associated payment transaction.
type PrepaymentStatus int32

const (
	// Not specified, defaults to PREPAYMENT_NOT_PROVIDED.
	PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED PrepaymentStatus = 0
	// The fee for the booking has been paid in advance.
	PrepaymentStatus_PREPAYMENT_PROVIDED PrepaymentStatus = 1
	// The fee for the booking has not been paid in advance.
	PrepaymentStatus_PREPAYMENT_NOT_PROVIDED PrepaymentStatus = 2
	// The fee was previously PREPAYMENT_PROVIDED but has now been refunded.
	PrepaymentStatus_PREPAYMENT_REFUNDED PrepaymentStatus = 3
	// The fee was previously PREPAYMENT_PROVIDED but now has been credited
	// (user given a UserPaymentOption as a voucher for the booking).
	// If this is set, the response should also include the updated
	// UserPaymentOption.
	PrepaymentStatus_PREPAYMENT_CREDITED PrepaymentStatus = 4
)

var PrepaymentStatus_name = map[int32]string{
	0: "PREPAYMENT_STATUS_UNSPECIFIED",
	1: "PREPAYMENT_PROVIDED",
	2: "PREPAYMENT_NOT_PROVIDED",
	3: "PREPAYMENT_REFUNDED",
	4: "PREPAYMENT_CREDITED",
}

var PrepaymentStatus_value = map[string]int32{
	"PREPAYMENT_STATUS_UNSPECIFIED": 0,
	"PREPAYMENT_PROVIDED":           1,
	"PREPAYMENT_NOT_PROVIDED":       2,
	"PREPAYMENT_REFUNDED":           3,
	"PREPAYMENT_CREDITED":           4,
}

func (x PrepaymentStatus) String() string {
	return proto.EnumName(PrepaymentStatus_name, int32(x))
}

func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{3}
}

// Defines how a total price is determined from an availability.
type PriceType int32

const (
	// The price is for a fixed amount. This is the default value if the field is
	// not set.
	PriceType_FIXED_RATE_DEFAULT PriceType = 0
	// The price specified is per person, and the total price is calculated
	// according to the party size specified in Resources as
	// price_micros * party_size. A PER_PERSON price must be accompanied by a
	// party size in the availability resources. If it is not, a party size of one
	// is used.
	PriceType_PER_PERSON PriceType = 1
)

var PriceType_name = map[int32]string{
	0: "FIXED_RATE_DEFAULT",
	1: "PER_PERSON",
}

var PriceType_value = map[string]int32{
	"FIXED_RATE_DEFAULT": 0,
	"PER_PERSON":         1,
}

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}

func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{4}
}

// This enum indicates what requirements exist for the user to acknowledge or
// view the requested slots duration/end time.
type CheckAvailabilityResponse_DurationRequirement int32

const (
	// The handling of the end time is not specified. This is the default.
	CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED CheckAvailabilityResponse_DurationRequirement = 0
	// The end time is not shown to the user.
	CheckAvailabilityResponse_DO_NOT_SHOW_DURATION CheckAvailabilityResponse_DurationRequirement = 1
	// The end time has to be shown to the user before an appointment can be
	// made.
	CheckAvailabilityResponse_MUST_SHOW_DURATION CheckAvailabilityResponse_DurationRequirement = 2
)

var CheckAvailabilityResponse_DurationRequirement_name = map[int32]string{
	0: "DURATION_REQUIREMENT_UNSPECIFIED",
	1: "DO_NOT_SHOW_DURATION",
	2: "MUST_SHOW_DURATION",
}

var CheckAvailabilityResponse_DurationRequirement_value = map[string]int32{
	"DURATION_REQUIREMENT_UNSPECIFIED": 0,
	"DO_NOT_SHOW_DURATION":             1,
	"MUST_SHOW_DURATION":               2,
}

func (x CheckAvailabilityResponse_DurationRequirement) String() string {
	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
}

func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{1, 0}
}

type BookingFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	BookingFailure_CAUSE_UNSPECIFIED BookingFailure_Cause = 0
	// The referenced availability slot is not available any longer.
	BookingFailure_SLOT_UNAVAILABLE BookingFailure_Cause = 1
	// The user has already booked an appointment for the referenced
	// availability slot.
	BookingFailure_SLOT_ALREADY_BOOKED_BY_USER BookingFailure_Cause = 2
	// The lease (if provided) has expired and cannot be used any longer to
	// complete the requested booking.
	BookingFailure_LEASE_EXPIRED BookingFailure_Cause = 3
	// The requested cancellation cannot be performed at the current time due
	// to time restrictions in the merchant's cancellation policy.
	BookingFailure_OUTSIDE_CANCELLATION_WINDOW BookingFailure_Cause = 4
	// An error was encountered while processing the payment because the
	// provided credit card type was not accepted by the merchant. The credit
	// card type must be supplied in rejected_card_type.
	BookingFailure_PAYMENT_ERROR_CARD_TYPE_REJECTED BookingFailure_Cause = 5
	// An error was encountered while processing the payment because the
	// provided credit card was declined.
	BookingFailure_PAYMENT_ERROR_CARD_DECLINED BookingFailure_Cause = 6
	// An error was encountered with the pack/membership used to pay for the
	// booking. There could be no valid uses left, it could have expired, etc.
	BookingFailure_PAYMENT_OPTION_NOT_VALID BookingFailure_Cause = 7
	// An error was encountered while processing the payment for this booking.
	// Use this value to indicate a general payment related error, only if the
	// error does not match to a specific payment error above.
	BookingFailure_PAYMENT_ERROR BookingFailure_Cause = 8
	// User cannot use the given payment option (e.g. user trying to use a
	// first time price for the second time).
	BookingFailure_USER_CANNOT_USE_PAYMENT_OPTION BookingFailure_Cause = 9
	// A booking that the user tried to cancel has already been cancelled.
	BookingFailure_BOOKING_ALREADY_CANCELLED BookingFailure_Cause = 10
	// A booking that the user tried to cancel is not cancellable.
	BookingFailure_BOOKING_NOT_CANCELLABLE BookingFailure_Cause = 11
	// User has an existing reservation too close to this time.
	BookingFailure_OVERLAPPING_RESERVATION BookingFailure_Cause = 12
)

var BookingFailure_Cause_name = map[int32]string{
	0:  "CAUSE_UNSPECIFIED",
	1:  "SLOT_UNAVAILABLE",
	2:  "SLOT_ALREADY_BOOKED_BY_USER",
	3:  "LEASE_EXPIRED",
	4:  "OUTSIDE_CANCELLATION_WINDOW",
	5:  "PAYMENT_ERROR_CARD_TYPE_REJECTED",
	6:  "PAYMENT_ERROR_CARD_DECLINED",
	7:  "PAYMENT_OPTION_NOT_VALID",
	8:  "PAYMENT_ERROR",
	9:  "USER_CANNOT_USE_PAYMENT_OPTION",
	10: "BOOKING_ALREADY_CANCELLED",
	11: "BOOKING_NOT_CANCELLABLE",
	12: "OVERLAPPING_RESERVATION",
}

var BookingFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":                0,
	"SLOT_UNAVAILABLE":                 1,
	"SLOT_ALREADY_BOOKED_BY_USER":      2,
	"LEASE_EXPIRED":                    3,
	"OUTSIDE_CANCELLATION_WINDOW":      4,
	"PAYMENT_ERROR_CARD_TYPE_REJECTED": 5,
	"PAYMENT_ERROR_CARD_DECLINED":      6,
	"PAYMENT_OPTION_NOT_VALID":         7,
	"PAYMENT_ERROR":                    8,
	"USER_CANNOT_USE_PAYMENT_OPTION":   9,
	"BOOKING_ALREADY_CANCELLED":        10,
	"BOOKING_NOT_CANCELLABLE":          11,
	"OVERLAPPING_RESERVATION":          12,
}

func (x BookingFailure_Cause) String() string {
	return proto.EnumName(BookingFailure_Cause_name, int32(x))
}

func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{23, 0}
}

type OrderFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	OrderFailure_CAUSE_UNSPECIFIED OrderFailure_Cause = 0
	// The order is no longer fulfillable.
	OrderFailure_ORDER_UNFULFILLABLE OrderFailure_Cause = 1
	// An error was encountered while processing the payment because the
	// provided credit card type was not accepted by the merchant. The credit
	// card type must be supplied in rejected_card_type.
	OrderFailure_PAYMENT_ERROR_CARD_TYPE_REJECTED OrderFailure_Cause = 2
	// An error was encountered while processing the payment because the
	// provided credit card was declined.
	OrderFailure_PAYMENT_ERROR_CARD_DECLINED OrderFailure_Cause = 3
	// An error was encountered while processing the payment for this order.
	// Use this value to indicate a general payment related error, only if the
	// error does not match to a specific payment error above.
	OrderFailure_PAYMENT_ERROR OrderFailure_Cause = 4
)

var OrderFailure_Cause_name = map[int32]string{
	0: "CAUSE_UNSPECIFIED",
	1: "ORDER_UNFULFILLABLE",
	2: "PAYMENT_ERROR_CARD_TYPE_REJECTED",
	3: "PAYMENT_ERROR_CARD_DECLINED",
	4: "PAYMENT_ERROR",
}

var OrderFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":                0,
	"ORDER_UNFULFILLABLE":              1,
	"PAYMENT_ERROR_CARD_TYPE_REJECTED": 2,
	"PAYMENT_ERROR_CARD_DECLINED":      3,
	"PAYMENT_ERROR":                    4,
}

func (x OrderFailure_Cause) String() string {
	return proto.EnumName(OrderFailure_Cause_name, int32(x))
}

func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{26, 0}
}

// The result of an order fulfillability check.
type OrderFulfillability_OrderFulfillabilityResult int32

const (
	// Default value: Don't use.
	OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED OrderFulfillability_OrderFulfillabilityResult = 0
	// The order can be fulfilled.
	OrderFulfillability_CAN_FULFILL OrderFulfillability_OrderFulfillabilityResult = 1
	// The order cannot be fulfilled due to one or more unfulfillable line
	// item(s).
	OrderFulfillability_UNFULFILLABLE_LINE_ITEM OrderFulfillability_OrderFulfillabilityResult = 2
	// The combination of the line items requested cannot be fulfilled.
	OrderFulfillability_UNFULFILLABLE_SERVICE_COMBINATION OrderFulfillability_OrderFulfillabilityResult = 3
	// The order cannot be fulfilled due to reasons that do not fall into the
	// categories above.
	OrderFulfillability_ORDER_UNFULFILLABLE_OTHER_REASON OrderFulfillability_OrderFulfillabilityResult = 4
)

var OrderFulfillability_OrderFulfillabilityResult_name = map[int32]string{
	0: "ORDER_FULFILLABILITY_RESULT_UNSPECIFIED",
	1: "CAN_FULFILL",
	2: "UNFULFILLABLE_LINE_ITEM",
	3: "UNFULFILLABLE_SERVICE_COMBINATION",
	4: "ORDER_UNFULFILLABLE_OTHER_REASON",
}

var OrderFulfillability_OrderFulfillabilityResult_value = map[string]int32{
	"ORDER_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
	"CAN_FULFILL":                       1,
	"UNFULFILLABLE_LINE_ITEM":           2,
	"UNFULFILLABLE_SERVICE_COMBINATION": 3,
	"ORDER_UNFULFILLABLE_OTHER_REASON":  4,
}

func (x OrderFulfillability_OrderFulfillabilityResult) String() string {
	return proto.EnumName(OrderFulfillability_OrderFulfillabilityResult_name, int32(x))
}

func (OrderFulfillability_OrderFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{27, 0}
}

// The result of a line item fulfillability check.
type LineItemFulfillability_ItemFulfillabilityResult int32

const (
	// Default value: Don't use.
	LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED LineItemFulfillability_ItemFulfillabilityResult = 0
	// This line item can be fulfilled.
	LineItemFulfillability_CAN_FULFILL LineItemFulfillability_ItemFulfillabilityResult = 1
	// No adequate availability for the slot requested.
	LineItemFulfillability_SLOT_UNAVAILABLE LineItemFulfillability_ItemFulfillabilityResult = 2
	// Child tickets cannot be booked without an adult ticket.
	LineItemFulfillability_CHILD_TICKETS_WITHOUT_ADULT LineItemFulfillability_ItemFulfillabilityResult = 6
	// The combination of ticket types requested cannot be fulfilled.
	LineItemFulfillability_UNFULFILLABLE_TICKET_COMBINATION LineItemFulfillability_ItemFulfillabilityResult = 3
	// The total price of this line item is not correct.
	LineItemFulfillability_INCORRECT_PRICE LineItemFulfillability_ItemFulfillabilityResult = 4
	// The line item cannot be fulfilled for reasons that do not fall into
	// the categories above.
	LineItemFulfillability_ITEM_UNFULFILLABLE_OTHER_REASON LineItemFulfillability_ItemFulfillabilityResult = 5
)

var LineItemFulfillability_ItemFulfillabilityResult_name = map[int32]string{
	0: "ITEM_FULFILLABILITY_RESULT_UNSPECIFIED",
	1: "CAN_FULFILL",
	2: "SLOT_UNAVAILABLE",
	6: "CHILD_TICKETS_WITHOUT_ADULT",
	3: "UNFULFILLABLE_TICKET_COMBINATION",
	4: "INCORRECT_PRICE",
	5: "ITEM_UNFULFILLABLE_OTHER_REASON",
}

var LineItemFulfillability_ItemFulfillabilityResult_value = map[string]int32{
	"ITEM_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
	"CAN_FULFILL":                            1,
	"SLOT_UNAVAILABLE":                       2,
	"CHILD_TICKETS_WITHOUT_ADULT":            6,
	"UNFULFILLABLE_TICKET_COMBINATION":       3,
	"INCORRECT_PRICE":                        4,
	"ITEM_UNFULFILLABLE_OTHER_REASON":        5,
}

func (x LineItemFulfillability_ItemFulfillabilityResult) String() string {
	return proto.EnumName(LineItemFulfillability_ItemFulfillabilityResult_name, int32(x))
}

func (LineItemFulfillability_ItemFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{28, 0}
}

type PaymentProcessingParameters_PaymentProcessor int32

const (
	PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED PaymentProcessingParameters_PaymentProcessor = 0
	PaymentProcessingParameters_PROCESSOR_STRIPE              PaymentProcessingParameters_PaymentProcessor = 1
	PaymentProcessingParameters_PROCESSOR_BRAINTREE           PaymentProcessingParameters_PaymentProcessor = 2
)

var PaymentProcessingParameters_PaymentProcessor_name = map[int32]string{
	0: "PAYMENT_PROCESSOR_UNSPECIFIED",
	1: "PROCESSOR_STRIPE",
	2: "PROCESSOR_BRAINTREE",
}

var PaymentProcessingParameters_PaymentProcessor_value = map[string]int32{
	"PAYMENT_PROCESSOR_UNSPECIFIED": 0,
	"PROCESSOR_STRIPE":              1,
	"PROCESSOR_BRAINTREE":           2,
}

func (x PaymentProcessingParameters_PaymentProcessor) String() string {
	return proto.EnumName(PaymentProcessingParameters_PaymentProcessor_name, int32(x))
}

func (PaymentProcessingParameters_PaymentProcessor) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{31, 0}
}

// Who handles payment processing?
// If payment is processed by the partner, CreateBooking request will
// include additional parameters (PaymentProcessingParameters) indicating
// the payment method to be used to process the payment.
type PaymentInformation_PaymentProcessedBy int32

const (
	PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED PaymentInformation_PaymentProcessedBy = 0
	PaymentInformation_PROCESSED_BY_GOOGLE              PaymentInformation_PaymentProcessedBy = 1
	PaymentInformation_PROCESSED_BY_PARTNER             PaymentInformation_PaymentProcessedBy = 2
)

var PaymentInformation_PaymentProcessedBy_name = map[int32]string{
	0: "PAYMENT_PROCESSED_BY_UNSPECIFIED",
	1: "PROCESSED_BY_GOOGLE",
	2: "PROCESSED_BY_PARTNER",
}

var PaymentInformation_PaymentProcessedBy_value = map[string]int32{
	"PAYMENT_PROCESSED_BY_UNSPECIFIED": 0,
	"PROCESSED_BY_GOOGLE":              1,
	"PROCESSED_BY_PARTNER":             2,
}

func (x PaymentInformation_PaymentProcessedBy) String() string {
	return proto.EnumName(PaymentInformation_PaymentProcessedBy_name, int32(x))
}

func (PaymentInformation_PaymentProcessedBy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{33, 0}
}

// Request to check availability for a Slot.
type CheckAvailabilityRequest struct {
	// The appointment slot that is being checked (required)
	Slot                 *Slot    `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityRequest proto.InternalMessageInfo

func (m *CheckAvailabilityRequest) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

// Response for the CheckAvailability RPC with the availability of the
// appointment slot.
type CheckAvailabilityResponse struct {
	// The requested slot. (required)
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available. (required)
	CountAvailable int32 `protobuf:"varint,2,opt,name=count_available,json=countAvailable,proto3" json:"count_available,omitempty"`
	// The requirement to show the slots duration and/or endtime. This field will
	// be ignored if the slot is unavailable. (optional)
	DurationRequirement CheckAvailabilityResponse_DurationRequirement `protobuf:"varint,3,opt,name=duration_requirement,json=durationRequirement,proto3,enum=ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement" json:"duration_requirement,omitempty"`
	// Optionally, the partner can return additional updated information about the
	// availability for this merchant if this information is present when
	// responding to the CheckAvailabilityRequest and if there is no negative
	// impact on the CheckAvailability request latency.
	// For instance an entire day of merchant availability for a superset of
	// resources can be returned here.
	AvailabilityUpdate   *AvailabilityUpdate `protobuf:"bytes,4,opt,name=availability_update,json=availabilityUpdate,proto3" json:"availability_update,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityResponse proto.InternalMessageInfo

func (m *CheckAvailabilityResponse) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *CheckAvailabilityResponse) GetCountAvailable() int32 {
	if m != nil {
		return m.CountAvailable
	}
	return 0
}

func (m *CheckAvailabilityResponse) GetDurationRequirement() CheckAvailabilityResponse_DurationRequirement {
	if m != nil {
		return m.DurationRequirement
	}
	return CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED
}

func (m *CheckAvailabilityResponse) GetAvailabilityUpdate() *AvailabilityUpdate {
	if m != nil {
		return m.AvailabilityUpdate
	}
	return nil
}

// An update to one ore more slots indicating that the availability for the
// associated time has potentially changed.
type AvailabilityUpdate struct {
	SlotAvailability     []*SlotAvailability `protobuf:"bytes,1,rep,name=slot_availability,json=slotAvailability,proto3" json:"slot_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_AvailabilityUpdate proto.InternalMessageInfo

func (m *AvailabilityUpdate) GetSlotAvailability() []*SlotAvailability {
	if m != nil {
		return m.SlotAvailability
	}
	return nil
}

// An inventory slot and associated count of open spots.
type SlotAvailability struct {
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available. (required)
	CountAvailable       int32    `protobuf:"varint,2,opt,name=count_available,json=countAvailable,proto3" json:"count_available,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SlotAvailability proto.InternalMessageInfo

func (m *SlotAvailability) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *SlotAvailability) GetCountAvailable() int32 {
	if m != nil {
		return m.CountAvailable
	}
	return 0
}

// Request to check the fulfillability of an order.
type CheckOrderFulfillabilityRequest struct {
	// The merchant that this order is intended for. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// The line items in this order. All services requested must belong to the
	// specified merchant. (required)
	Item                 []*LineItem `protobuf:"bytes,2,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityRequest proto.InternalMessageInfo

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

func (m *CheckOrderFulfillabilityRequest) GetItem() []*LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

// Response for the CheckOrderfulfillabilityRequest.
type CheckOrderFulfillabilityResponse struct {
	// Fulfillability status of the order, potentially contains updated
	// availabilities and prices of the requested line item. (required)
	Fulfillability *OrderFulfillability `protobuf:"bytes,1,opt,name=fulfillability,proto3" json:"fulfillability,omitempty"`
	// Total processing fees & taxes that need to be paid for this order.
	// (required)
	FeesAndTaxes         *Price   `protobuf:"bytes,2,opt,name=fees_and_taxes,json=feesAndTaxes,proto3" json:"fees_and_taxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityResponse proto.InternalMessageInfo

func (m *CheckOrderFulfillabilityResponse) GetFulfillability() *OrderFulfillability {
	if m != nil {
		return m.Fulfillability
	}
	return nil
}

func (m *CheckOrderFulfillabilityResponse) GetFeesAndTaxes() *Price {
	if m != nil {
		return m.FeesAndTaxes
	}
	return nil
}

// Request to get booking status and prepayment status for a Booking.
type GetBookingStatusRequest struct {
	// ID of the existing booking (required)
	BookingId            string   `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBookingStatusRequest proto.InternalMessageInfo

func (m *GetBookingStatusRequest) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

// Response for the GetBookingStatus RPC with booking status and prepayment
// status.
type GetBookingStatusResponse struct {
	// ID of the booking (required)
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	// Status of the booking (required)
	BookingStatus BookingStatus `protobuf:"varint,2,opt,name=booking_status,json=bookingStatus,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"booking_status,omitempty"`
	// Prepayment status of the booking (required)
	PrepaymentStatus     PrepaymentStatus `protobuf:"varint,3,opt,name=prepayment_status,json=prepaymentStatus,proto3,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_GetBookingStatusResponse proto.InternalMessageInfo

func (m *GetBookingStatusResponse) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

func (m *GetBookingStatusResponse) GetBookingStatus() BookingStatus {
	if m != nil {
		return m.BookingStatus
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

func (m *GetBookingStatusResponse) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

// Request to create a Booking for an inventory slot. Consumes the lease if
// provided.
type CreateBookingRequest struct {
	// The inventory slot that is being requested to make this booking.
	// If lease_ref is provided, slot must match the lease; slot is provided for
	// the partner to verify the lease information.
	// If lease_ref is absent, then create the booking for the slot. (required)
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// The lease that is being confirmed to make this booking.
	// If lease_ref is provided, then create the booking using the lease.
	// (optional)
	LeaseRef *LeaseReference `protobuf:"bytes,2,opt,name=lease_ref,json=leaseRef,proto3" json:"lease_ref,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Information about payments. When payment authorizations are handled by
	// Google, if the booking request does not succeed, payment authorizations are
	// automatically canceled. (optional)
	PaymentInformation *PaymentInformation `protobuf:"bytes,4,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (optional)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,5,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateBooking requests. (required)
	IdempotencyToken string `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	// A string from the user which contains any special requests or additional
	// information that they would like to notify the merchant about. (optional)
	AdditionalRequest    string   `protobuf:"bytes,7,opt,name=additional_request,json=additionalRequest,proto3" json:"additional_request,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateBookingRequest proto.InternalMessageInfo

func (m *CreateBookingRequest) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *CreateBookingRequest) GetLeaseRef() *LeaseReference {
	if m != nil {
		return m.LeaseRef
	}
	return nil
}

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

func (m *CreateBookingRequest) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

func (m *CreateBookingRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
	if m != nil {
		return m.PaymentProcessingParameters
	}
	return nil
}

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

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

// Response with the created Booking for an inventory slot.
type CreateBookingResponse struct {
	// The created booking (required)
	Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	// The updated user payment option used in this booking.
	// If a new payment option was purchased to pay for the booking, this should
	// be a newly created user payment option.
	// If an already purchased user payment option was used for this booking,
	// this should reflect an updated version of that user payment option.
	// (optional)
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption,proto3" json:"user_payment_option,omitempty"`
	// If creating a booking fails, this field should reflect the business logic
	// error (e.g., slot has become unavailable) and all other fields in the
	// CreateBookingResponse message are expected to be unset. (required if
	// failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_CreateBookingResponse proto.InternalMessageInfo

func (m *CreateBookingResponse) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

func (m *CreateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
	if m != nil {
		return m.UserPaymentOption
	}
	return nil
}

func (m *CreateBookingResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// Request to create a Lease for a slot in the inventory.  The expiration time
// in the returned Lease may be modified by the backend, e.g. if the requested
// lease period is too long.
type CreateLeaseRequest struct {
	// The lease to be created with information about the appointment slot
	// (required)
	Lease                *Lease   `protobuf:"bytes,1,opt,name=lease,proto3" json:"lease,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateLeaseRequest proto.InternalMessageInfo

func (m *CreateLeaseRequest) GetLease() *Lease {
	if m != nil {
		return m.Lease
	}
	return nil
}

// Response for the CreateLease RPC with the created Lease.
type CreateLeaseResponse struct {
	// The created Lease (required)
	Lease *Lease `protobuf:"bytes,1,opt,name=lease,proto3" json:"lease,omitempty"`
	// If creating a lease fails, this field should reflect the business logic
	// error (e.g., slot has become unavailable) and lease field is expected to be
	// unset. (required if failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,2,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_CreateLeaseResponse proto.InternalMessageInfo

func (m *CreateLeaseResponse) GetLease() *Lease {
	if m != nil {
		return m.Lease
	}
	return nil
}

func (m *CreateLeaseResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// Temporary lease for an inventory slot
type Lease struct {
	// ID of the lease.
	// Not populated in CreateLeaseRequest. The value is chosen by the partner and
	// has to be returned in the response of CreateLease. (required)
	LeaseId string `protobuf:"bytes,1,opt,name=lease_id,json=leaseId,proto3" json:"lease_id,omitempty"`
	// The appointment slot that the lease is created for. (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot,proto3" json:"slot,omitempty"`
	// Unique identifier for this lease, chosen by Reserve with Google. Serves as
	// an idempotency token for CreateLease requests. (required)
	UserReference string `protobuf:"bytes,3,opt,name=user_reference,json=userReference,proto3" json:"user_reference,omitempty"`
	// Expiration time of the lease in UTC Timestamp (required)
	LeaseExpirationTimeSec int64    `protobuf:"varint,4,opt,name=lease_expiration_time_sec,json=leaseExpirationTimeSec,proto3" json:"lease_expiration_time_sec,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_Lease proto.InternalMessageInfo

func (m *Lease) GetLeaseId() string {
	if m != nil {
		return m.LeaseId
	}
	return ""
}

func (m *Lease) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *Lease) GetUserReference() string {
	if m != nil {
		return m.UserReference
	}
	return ""
}

func (m *Lease) GetLeaseExpirationTimeSec() int64 {
	if m != nil {
		return m.LeaseExpirationTimeSec
	}
	return 0
}

// Reference to a Lease that has been created via CreateLease.
type LeaseReference struct {
	// Lease ID (required)
	LeaseId              string   `protobuf:"bytes,1,opt,name=lease_id,json=leaseId,proto3" json:"lease_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LeaseReference proto.InternalMessageInfo

func (m *LeaseReference) GetLeaseId() string {
	if m != nil {
		return m.LeaseId
	}
	return ""
}

// Request to create an order.
type CreateOrderRequest struct {
	// The order to create. (required)
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3" json:"order,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. order.payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (required if payment is processed by the partner)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,2,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateOrder requests. (required)
	IdempotencyToken     string   `protobuf:"bytes,3,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 *CreateOrderRequest) Reset()         { *m = CreateOrderRequest{} }
func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
func (*CreateOrderRequest) ProtoMessage()    {}
func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{14}
}

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

var xxx_messageInfo_CreateOrderRequest proto.InternalMessageInfo

func (m *CreateOrderRequest) GetOrder() *Order {
	if m != nil {
		return m.Order
	}
	return nil
}

func (m *CreateOrderRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
	if m != nil {
		return m.PaymentProcessingParameters
	}
	return nil
}

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

// Response for the CreateOrderRequest.
type CreateOrderResponse struct {
	// All line items in an order either fail or succeed together.
	// This means that if some of the items cannot be fulfilled, the entire
	// order must fail, the booking must not be made for any item, and the user
	// must not be charged.
	//
	// Types that are valid to be assigned to Result:
	//	*CreateOrderResponse_Order
	//	*CreateOrderResponse_OrderFailure
	Result               isCreateOrderResponse_Result `protobuf_oneof:"result"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *CreateOrderResponse) Reset()         { *m = CreateOrderResponse{} }
func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
func (*CreateOrderResponse) ProtoMessage()    {}
func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{15}
}

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

var xxx_messageInfo_CreateOrderResponse proto.InternalMessageInfo

type isCreateOrderResponse_Result interface {
	isCreateOrderResponse_Result()
}

type CreateOrderResponse_Order struct {
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3,oneof"`
}

type CreateOrderResponse_OrderFailure struct {
	OrderFailure *OrderFailure `protobuf:"bytes,2,opt,name=order_failure,json=orderFailure,proto3,oneof"`
}

func (*CreateOrderResponse_Order) isCreateOrderResponse_Result() {}

func (*CreateOrderResponse_OrderFailure) isCreateOrderResponse_Result() {}

func (m *CreateOrderResponse) GetResult() isCreateOrderResponse_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *CreateOrderResponse) GetOrder() *Order {
	if x, ok := m.GetResult().(*CreateOrderResponse_Order); ok {
		return x.Order
	}
	return nil
}

func (m *CreateOrderResponse) GetOrderFailure() *OrderFailure {
	if x, ok := m.GetResult().(*CreateOrderResponse_OrderFailure); ok {
		return x.OrderFailure
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*CreateOrderResponse) 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 _CreateOrderResponse_OneofMarshaler, _CreateOrderResponse_OneofUnmarshaler, _CreateOrderResponse_OneofSizer, []interface{}{
		(*CreateOrderResponse_Order)(nil),
		(*CreateOrderResponse_OrderFailure)(nil),
	}
}

func _CreateOrderResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*CreateOrderResponse)
	// result
	switch x := m.Result.(type) {
	case *CreateOrderResponse_Order:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Order); err != nil {
			return err
		}
	case *CreateOrderResponse_OrderFailure:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OrderFailure); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("CreateOrderResponse.Result has unexpected type %T", x)
	}
	return nil
}

func _CreateOrderResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*CreateOrderResponse)
	switch tag {
	case 1: // result.order
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Order)
		err := b.DecodeMessage(msg)
		m.Result = &CreateOrderResponse_Order{msg}
		return true, err
	case 2: // result.order_failure
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OrderFailure)
		err := b.DecodeMessage(msg)
		m.Result = &CreateOrderResponse_OrderFailure{msg}
		return true, err
	default:
		return false, nil
	}
}

func _CreateOrderResponse_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*CreateOrderResponse)
	// result
	switch x := m.Result.(type) {
	case *CreateOrderResponse_Order:
		s := proto.Size(x.Order)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *CreateOrderResponse_OrderFailure:
		s := proto.Size(x.OrderFailure)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Request to list all bookings for a user
type ListBookingsRequest struct {
	// ID of the user (required)
	UserId               string   `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListBookingsRequest) Reset()         { *m = ListBookingsRequest{} }
func (m *ListBookingsRequest) String() string { return proto.CompactTextString(m) }
func (*ListBookingsRequest) ProtoMessage()    {}
func (*ListBookingsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{16}
}

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

var xxx_messageInfo_ListBookingsRequest proto.InternalMessageInfo

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

// Response for the ListBookings RPC with all bookings for the requested user.
type ListBookingsResponse struct {
	// All bookings of the user (required)
	Bookings             []*Booking `protobuf:"bytes,1,rep,name=bookings,proto3" json:"bookings,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *ListBookingsResponse) Reset()         { *m = ListBookingsResponse{} }
func (m *ListBookingsResponse) String() string { return proto.CompactTextString(m) }
func (*ListBookingsResponse) ProtoMessage()    {}
func (*ListBookingsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{17}
}

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

var xxx_messageInfo_ListBookingsResponse proto.InternalMessageInfo

func (m *ListBookingsResponse) GetBookings() []*Booking {
	if m != nil {
		return m.Bookings
	}
	return nil
}

// Request to list orders.
type ListOrdersRequest struct {
	// Request of orders either by user ID, or by order ID.
	//
	// Types that are valid to be assigned to Ids:
	//	*ListOrdersRequest_UserId
	//	*ListOrdersRequest_OrderIds_
	Ids                  isListOrdersRequest_Ids `protobuf_oneof:"ids"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *ListOrdersRequest) Reset()         { *m = ListOrdersRequest{} }
func (m *ListOrdersRequest) String() string { return proto.CompactTextString(m) }
func (*ListOrdersRequest) ProtoMessage()    {}
func (*ListOrdersRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{18}
}

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

var xxx_messageInfo_ListOrdersRequest proto.InternalMessageInfo

type isListOrdersRequest_Ids interface {
	isListOrdersRequest_Ids()
}

type ListOrdersRequest_UserId struct {
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3,oneof"`
}

type ListOrdersRequest_OrderIds_ struct {
	OrderIds *ListOrdersRequest_OrderIds `protobuf:"bytes,2,opt,name=order_ids,json=orderIds,proto3,oneof"`
}

func (*ListOrdersRequest_UserId) isListOrdersRequest_Ids() {}

func (*ListOrdersRequest_OrderIds_) isListOrdersRequest_Ids() {}

func (m *ListOrdersRequest) GetIds() isListOrdersRequest_Ids {
	if m != nil {
		return m.Ids
	}
	return nil
}

func (m *ListOrdersRequest) GetUserId() string {
	if x, ok := m.GetIds().(*ListOrdersRequest_UserId); ok {
		return x.UserId
	}
	return ""
}

func (m *ListOrdersRequest) GetOrderIds() *ListOrdersRequest_OrderIds {
	if x, ok := m.GetIds().(*ListOrdersRequest_OrderIds_); ok {
		return x.OrderIds
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ListOrdersRequest) 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 _ListOrdersRequest_OneofMarshaler, _ListOrdersRequest_OneofUnmarshaler, _ListOrdersRequest_OneofSizer, []interface{}{
		(*ListOrdersRequest_UserId)(nil),
		(*ListOrdersRequest_OrderIds_)(nil),
	}
}

func _ListOrdersRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*ListOrdersRequest)
	// ids
	switch x := m.Ids.(type) {
	case *ListOrdersRequest_UserId:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.UserId)
	case *ListOrdersRequest_OrderIds_:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OrderIds); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("ListOrdersRequest.Ids has unexpected type %T", x)
	}
	return nil
}

func _ListOrdersRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*ListOrdersRequest)
	switch tag {
	case 1: // ids.user_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.Ids = &ListOrdersRequest_UserId{x}
		return true, err
	case 2: // ids.order_ids
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(ListOrdersRequest_OrderIds)
		err := b.DecodeMessage(msg)
		m.Ids = &ListOrdersRequest_OrderIds_{msg}
		return true, err
	default:
		return false, nil
	}
}

func _ListOrdersRequest_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*ListOrdersRequest)
	// ids
	switch x := m.Ids.(type) {
	case *ListOrdersRequest_UserId:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.UserId)))
		n += len(x.UserId)
	case *ListOrdersRequest_OrderIds_:
		s := proto.Size(x.OrderIds)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type ListOrdersRequest_OrderIds struct {
	OrderId              []string `protobuf:"bytes,1,rep,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersRequest_OrderIds proto.InternalMessageInfo

func (m *ListOrdersRequest_OrderIds) GetOrderId() []string {
	if m != nil {
		return m.OrderId
	}
	return nil
}

// Response for the ListOrders RPC.
type ListOrdersResponse struct {
	// All requested orders (required)
	Order                []*Order `protobuf:"bytes,1,rep,name=order,proto3" json:"order,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListOrdersResponse) Reset()         { *m = ListOrdersResponse{} }
func (m *ListOrdersResponse) String() string { return proto.CompactTextString(m) }
func (*ListOrdersResponse) ProtoMessage()    {}
func (*ListOrdersResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{19}
}

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

var xxx_messageInfo_ListOrdersResponse proto.InternalMessageInfo

func (m *ListOrdersResponse) GetOrder() []*Order {
	if m != nil {
		return m.Order
	}
	return nil
}

// Request to update a Booking.
type UpdateBookingRequest struct {
	// The booking to be updated
	// The following fields can be set in a booking:
	// - status, to cancel a booking.
	// - start_time and duration in the slot, to reschedule a booking. (required)
	Booking              *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UpdateBookingRequest) Reset()         { *m = UpdateBookingRequest{} }
func (m *UpdateBookingRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateBookingRequest) ProtoMessage()    {}
func (*UpdateBookingRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{20}
}

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

var xxx_messageInfo_UpdateBookingRequest proto.InternalMessageInfo

func (m *UpdateBookingRequest) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

// Response with the updated Booking.
type UpdateBookingResponse struct {
	// The updated booking (required)
	Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	// The updated user payment option originally used to pay for this booking.
	// This should be set if the UpdateBookingRequest results in a change to
	// the UserPaymentOption.
	// For instance, if the booking is canceled, the UserPaymentOption should
	// reflect an additional credit to the user. In the case of a multi-use
	// payment option, the current_count should be increased by one to
	// allow the user to create another booking with this payment option. In the
	// case of a single-use payment option, a new single-use user payment option
	// should be returned. (required if altered in update)
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption,proto3" json:"user_payment_option,omitempty"`
	// If updating a booking fails, this field should reflect the business logic
	// error (e.g., booking is not cancellable) (required if failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *UpdateBookingResponse) Reset()         { *m = UpdateBookingResponse{} }
func (m *UpdateBookingResponse) String() string { return proto.CompactTextString(m) }
func (*UpdateBookingResponse) ProtoMessage()    {}
func (*UpdateBookingResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{21}
}

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

var xxx_messageInfo_UpdateBookingResponse proto.InternalMessageInfo

func (m *UpdateBookingResponse) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

func (m *UpdateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
	if m != nil {
		return m.UserPaymentOption
	}
	return nil
}

func (m *UpdateBookingResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// A booking for an inventory slot
type Booking struct {
	// ID of this booking (required)
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	// The appointment slot of this booking (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot,proto3" json:"slot,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Status of the booking (required)
	Status BookingStatus `protobuf:"varint,4,opt,name=status,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
	// Information about payment transactions that relate to the booking.
	// (optional)
	PaymentInformation   *PaymentInformation `protobuf:"bytes,5,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *Booking) Reset()         { *m = Booking{} }
func (m *Booking) String() string { return proto.CompactTextString(m) }
func (*Booking) ProtoMessage()    {}
func (*Booking) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{22}
}

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

var xxx_messageInfo_Booking proto.InternalMessageInfo

func (m *Booking) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

func (m *Booking) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

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

func (m *Booking) GetStatus() BookingStatus {
	if m != nil {
		return m.Status
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

func (m *Booking) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

// Status data that conveys why (1) creating a lease or (2) creating or updating
// a booking fails.
// BookingFailure is intended to primarily capture business logic errors.
type BookingFailure struct {
	// The reason why the booking failed. (required)
	Cause BookingFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.BookingFailure_Cause" json:"cause,omitempty"`
	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
	RejectedCardType CreditCardType `protobuf:"varint,2,opt,name=rejected_card_type,json=rejectedCardType,proto3,enum=ext.maps.booking.partner.v3.CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only. (optional)
	Description          string   `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BookingFailure) Reset()         { *m = BookingFailure{} }
func (m *BookingFailure) String() string { return proto.CompactTextString(m) }
func (*BookingFailure) ProtoMessage()    {}
func (*BookingFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{23}
}

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

var xxx_messageInfo_BookingFailure proto.InternalMessageInfo

func (m *BookingFailure) GetCause() BookingFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return BookingFailure_CAUSE_UNSPECIFIED
}

func (m *BookingFailure) GetRejectedCardType() CreditCardType {
	if m != nil {
		return m.RejectedCardType
	}
	return CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED
}

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

// An order for service appointments with a merchant.
type Order struct {
	// ID of this Order, chosen by the booking partner who handles the order
	// (required in CreateOrderResponse and ListOrdersResponse, must not be set in
	// CreateOrderRequest)
	OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
	// Personal information of the user making the order (required)
	UserInformation *UserInformation `protobuf:"bytes,2,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Information about payment transactions that relate to the Order.
	// (optional)
	PaymentInformation *PaymentInformation `protobuf:"bytes,3,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	// The merchant that all services in this Order belong to.
	MerchantId string `protobuf:"bytes,4,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// Line items in this order.
	Item                 []*LineItem `protobuf:"bytes,5,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Order) Reset()         { *m = Order{} }
func (m *Order) String() string { return proto.CompactTextString(m) }
func (*Order) ProtoMessage()    {}
func (*Order) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{24}
}

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

var xxx_messageInfo_Order proto.InternalMessageInfo

func (m *Order) GetOrderId() string {
	if m != nil {
		return m.OrderId
	}
	return ""
}

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

func (m *Order) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

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

func (m *Order) GetItem() []*LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

// A single item in an Order--the booking of a single service in a single time
// slot.
type LineItem struct {
	// ID of the merchant Service. (required)
	ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
	// (required)
	StartSec int64 `protobuf:"varint,2,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds. (required)
	DurationSec int64 `protobuf:"varint,3,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of tickets ordered by Ticket Type.
	Tickets []*LineItem_OrderedTickets `protobuf:"bytes,4,rep,name=tickets,proto3" json:"tickets,omitempty"`
	// In handling CreateOrderRequest and CheckOrderFulfillabilityRequest,
	// the total price (excluding taxes) of the item must be verified to guard
	// against price changes. In CreateOrderResponse and
	// CheckOrderFulfillabilityResponse, the price should be updated to the
	// correct value if the value from the request was incorrect or outdated.
	// (reqired)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Status of the Line Item. (required in CreateOrderResponse and
	// ListOrdersResponse; should not be set in requests)
	Status               BookingStatus `protobuf:"varint,6,opt,name=status,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LineItem) Reset()         { *m = LineItem{} }
func (m *LineItem) String() string { return proto.CompactTextString(m) }
func (*LineItem) ProtoMessage()    {}
func (*LineItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{25}
}

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

var xxx_messageInfo_LineItem proto.InternalMessageInfo

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

func (m *LineItem) GetStartSec() int64 {
	if m != nil {
		return m.StartSec
	}
	return 0
}

func (m *LineItem) GetDurationSec() int64 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *LineItem) GetTickets() []*LineItem_OrderedTickets {
	if m != nil {
		return m.Tickets
	}
	return nil
}

func (m *LineItem) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *LineItem) GetStatus() BookingStatus {
	if m != nil {
		return m.Status
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

type LineItem_OrderedTickets struct {
	TicketId             string   `protobuf:"bytes,1,opt,name=ticket_id,json=ticketId,proto3" json:"ticket_id,omitempty"`
	Count                int32    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LineItem_OrderedTickets proto.InternalMessageInfo

func (m *LineItem_OrderedTickets) GetTicketId() string {
	if m != nil {
		return m.TicketId
	}
	return ""
}

func (m *LineItem_OrderedTickets) GetCount() int32 {
	if m != nil {
		return m.Count
	}
	return 0
}

// Status data that conveys why creating an order fails.
// OrderFailure is intended to primarily capture business logic errors.
type OrderFailure struct {
	// The reason why the order failed. (required)
	Cause OrderFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.OrderFailure_Cause" json:"cause,omitempty"`
	// (required only if cause is ORDER_UNFULFILLABLE)
	Fulfillability *OrderFulfillability `protobuf:"bytes,2,opt,name=fulfillability,proto3" json:"fulfillability,omitempty"`
	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
	RejectedCardType CreditCardType `protobuf:"varint,3,opt,name=rejected_card_type,json=rejectedCardType,proto3,enum=ext.maps.booking.partner.v3.CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only. (optional)
	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OrderFailure) Reset()         { *m = OrderFailure{} }
func (m *OrderFailure) String() string { return proto.CompactTextString(m) }
func (*OrderFailure) ProtoMessage()    {}
func (*OrderFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{26}
}

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

var xxx_messageInfo_OrderFailure proto.InternalMessageInfo

func (m *OrderFailure) GetCause() OrderFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return OrderFailure_CAUSE_UNSPECIFIED
}

func (m *OrderFailure) GetFulfillability() *OrderFulfillability {
	if m != nil {
		return m.Fulfillability
	}
	return nil
}

func (m *OrderFailure) GetRejectedCardType() CreditCardType {
	if m != nil {
		return m.RejectedCardType
	}
	return CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED
}

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

type OrderFulfillability struct {
	Result OrderFulfillability_OrderFulfillabilityResult `protobuf:"varint,1,opt,name=result,proto3,enum=ext.maps.booking.partner.v3.OrderFulfillability_OrderFulfillabilityResult" json:"result,omitempty"`
	// Fulfillability results of all line items in this order (required).
	ItemFulfillability []*LineItemFulfillability `protobuf:"bytes,2,rep,name=item_fulfillability,json=itemFulfillability,proto3" json:"item_fulfillability,omitempty"`
	// Additional description of the reason if the item is unfulfillable.
	// (optional)
	UnfulfillableReason  string   `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason,proto3" json:"unfulfillable_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OrderFulfillability) Reset()         { *m = OrderFulfillability{} }
func (m *OrderFulfillability) String() string { return proto.CompactTextString(m) }
func (*OrderFulfillability) ProtoMessage()    {}
func (*OrderFulfillability) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{27}
}

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

var xxx_messageInfo_OrderFulfillability proto.InternalMessageInfo

func (m *OrderFulfillability) GetResult() OrderFulfillability_OrderFulfillabilityResult {
	if m != nil {
		return m.Result
	}
	return OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED
}

func (m *OrderFulfillability) GetItemFulfillability() []*LineItemFulfillability {
	if m != nil {
		return m.ItemFulfillability
	}
	return nil
}

func (m *OrderFulfillability) GetUnfulfillableReason() string {
	if m != nil {
		return m.UnfulfillableReason
	}
	return ""
}

// Fulfillability of a line item.
type LineItemFulfillability struct {
	// The line item of question. (required)
	Item *LineItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// (required)
	Result LineItemFulfillability_ItemFulfillabilityResult `protobuf:"varint,2,opt,name=result,proto3,enum=ext.maps.booking.partner.v3.LineItemFulfillability_ItemFulfillabilityResult" json:"result,omitempty"`
	// Additional description of the reason if the item is unfulfillable.
	// (optional)
	UnfulfillableReason string `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason,proto3" json:"unfulfillable_reason,omitempty"`
	// (optional)
	Availability *LineItemFulfillability_UpdatedAvailability `protobuf:"bytes,4,opt,name=availability,proto3" json:"availability,omitempty"`
	// Updated ticket types can be piggybacked in
	// CheckOrderFulfillabilityResponse. If non-empty, all available ticket types
	// for this slot with up-to-date prices should be listed without omitting any.
	// (optional)
	TicketType           []*TicketType `protobuf:"bytes,5,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LineItemFulfillability) Reset()         { *m = LineItemFulfillability{} }
func (m *LineItemFulfillability) String() string { return proto.CompactTextString(m) }
func (*LineItemFulfillability) ProtoMessage()    {}
func (*LineItemFulfillability) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{28}
}

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

var xxx_messageInfo_LineItemFulfillability proto.InternalMessageInfo

func (m *LineItemFulfillability) GetItem() *LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *LineItemFulfillability) GetResult() LineItemFulfillability_ItemFulfillabilityResult {
	if m != nil {
		return m.Result
	}
	return LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED
}

func (m *LineItemFulfillability) GetUnfulfillableReason() string {
	if m != nil {
		return m.UnfulfillableReason
	}
	return ""
}

func (m *LineItemFulfillability) GetAvailability() *LineItemFulfillability_UpdatedAvailability {
	if m != nil {
		return m.Availability
	}
	return nil
}

func (m *LineItemFulfillability) GetTicketType() []*TicketType {
	if m != nil {
		return m.TicketType
	}
	return nil
}

// Updated availability for this slot can be piggybacked in
// CheckOrderFulfillabilityResponse.
type LineItemFulfillability_UpdatedAvailability struct {
	// Number of available spots for the given slot. 0 indicates no
	// availability. (required)
	SpotsOpen            int32    `protobuf:"varint,1,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LineItemFulfillability_UpdatedAvailability proto.InternalMessageInfo

func (m *LineItemFulfillability_UpdatedAvailability) GetSpotsOpen() int32 {
	if m != nil {
		return m.SpotsOpen
	}
	return 0
}

// TicketType is used to differentiate among tickets (where a ticket can be a
// spot on a raft trip, an admission to a museum, etc.) with different prices
// and/or availabilities due to different user types or different service
// attributes.
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"`
	// 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"`
	// 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:"-"`
}

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_1820d8e1a9fad753, []int{29}
}

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) GetTicketTypeId() string {
	if m != nil {
		return m.TicketTypeId
	}
	return ""
}

func (m *TicketType) GetShortDescription() string {
	if m != nil {
		return m.ShortDescription
	}
	return ""
}

func (m *TicketType) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

// Resource specification that disambiguates an appointment slot
type ResourceIds struct {
	// The staff ID as provided in the feed or empty if not applicable or no staff
	// was selected. (optional)
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// The room ID as provided in the feed or empty if not applicable or no room
	// was selected. (optional)
	RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// For Dining Reservations only: the number of seats requested in the booking.
	// (optional)
	PartySize            int32    `protobuf:"varint,3,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResourceIds) Reset()         { *m = ResourceIds{} }
func (m *ResourceIds) String() string { return proto.CompactTextString(m) }
func (*ResourceIds) ProtoMessage()    {}
func (*ResourceIds) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{30}
}

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

var xxx_messageInfo_ResourceIds proto.InternalMessageInfo

func (m *ResourceIds) GetStaffId() string {
	if m != nil {
		return m.StaffId
	}
	return ""
}

func (m *ResourceIds) GetRoomId() string {
	if m != nil {
		return m.RoomId
	}
	return ""
}

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

type PaymentProcessingParameters struct {
	// The payment processor used to process payment for a given booking.
	// (required)
	//
	// Replaced by the payment_processor field.
	Processor PaymentProcessingParameters_PaymentProcessor `protobuf:"varint,1,opt,name=processor,proto3,enum=ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor" json:"processor,omitempty"` // Deprecated: Do not use.
	// The token representing the payment method that will be used to pay
	// for this booking. This token can be only used once. This token can be
	// only used for the merchant associated with this booking.
	//
	// Each processor may choose its own format for this field.
	// An example of Stripe's token is "tok_1C3orL2eZvKYlo2CxReMgS4K".
	//
	// Replaced by unparsed_payment_method_token, which contains
	// payment_method_token as one of its fields.
	// For example, for Stripe, unparsed_payment_method_token is a serialized
	// JSON object documented at https://stripe.com/docs/api#token_object.
	// payment_method_token is the 'id' field parsed out of that.
	PaymentMethodToken string `protobuf:"bytes,2,opt,name=payment_method_token,json=paymentMethodToken,proto3" json:"payment_method_token,omitempty"` // Deprecated: Do not use.
	// The full token received from Google Payments.  This is typically a
	// serialized JSON object.  See documentation from Google Payments and your
	// payment processor for the JSON format of the token for your processor.
	// https://developers.google.com/pay/api/#participating-google-pay-processors
	//
	// This token can only be used once, and only for the merchant associated with
	// this booking.
	UnparsedPaymentMethodToken string `protobuf:"bytes,5,opt,name=unparsed_payment_method_token,json=unparsedPaymentMethodToken,proto3" json:"unparsed_payment_method_token,omitempty"`
	// The payment processor API version that the given payment token is valid
	// for.
	//
	// Each processor may choose its own format for this field.
	// Stripe uses a date (e.g. "2017-06-15"). (required)
	Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	// The payment processor whose configuration was used to generate this token.
	// (required)
	PaymentProcessor     string   `protobuf:"bytes,4,opt,name=payment_processor,json=paymentProcessor,proto3" json:"payment_processor,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PaymentProcessingParameters) Reset()         { *m = PaymentProcessingParameters{} }
func (m *PaymentProcessingParameters) String() string { return proto.CompactTextString(m) }
func (*PaymentProcessingParameters) ProtoMessage()    {}
func (*PaymentProcessingParameters) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{31}
}

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

var xxx_messageInfo_PaymentProcessingParameters proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetProcessor() PaymentProcessingParameters_PaymentProcessor {
	if m != nil {
		return m.Processor
	}
	return PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED
}

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetPaymentMethodToken() string {
	if m != nil {
		return m.PaymentMethodToken
	}
	return ""
}

func (m *PaymentProcessingParameters) GetUnparsedPaymentMethodToken() string {
	if m != nil {
		return m.UnparsedPaymentMethodToken
	}
	return ""
}

func (m *PaymentProcessingParameters) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *PaymentProcessingParameters) GetPaymentProcessor() string {
	if m != nil {
		return m.PaymentProcessor
	}
	return ""
}

// This describes a payment option, such as a pack, membership, or
// single-session pass after it has been purchased by a user. It includes an
// identifier for the user payment option, as well as some information about
// the payment option with which it is associated.
type UserPaymentOption struct {
	// A unique identifier for the user payment option. This Id MUST be unique
	// for all UserPaymentOptions across all merchants and users. (required)
	UserPaymentOptionId string `protobuf:"bytes,1,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3" json:"user_payment_option_id,omitempty"`
	// The user payment option will be valid (usable) between start_time and
	// end_time set in UTC. Attempts to use a user payment option to make a
	// booking outside of this interval will fail. (both optional)
	ValidStartTimeSec int64 `protobuf:"varint,2,opt,name=valid_start_time_sec,json=validStartTimeSec,proto3" json:"valid_start_time_sec,omitempty"`
	ValidEndTimeSec   int64 `protobuf:"varint,3,opt,name=valid_end_time_sec,json=validEndTimeSec,proto3" json:"valid_end_time_sec,omitempty"`
	// The type of the payment option associated with this user payment option.
	// This can be unlimited for a membership or subscription, multi-use for a
	// pack, or single-use. (required)
	Type PaymentOptionType `protobuf:"varint,4,opt,name=type,proto3,enum=ext.maps.booking.partner.v3.PaymentOptionType" json:"type,omitempty"`
	// The original number of uses for this user payment option when it was
	// purchased. This value is ignored for unlimited payment options. (required)
	OriginalCount int32 `protobuf:"varint,5,opt,name=original_count,json=originalCount,proto3" json:"original_count,omitempty"`
	// The number of uses remaining for this user payment option. If this number
	// is 0 for a pack, attempts to use this payment option to make a booking will
	// fail. (required)
	CurrentCount int32 `protobuf:"varint,6,opt,name=current_count,json=currentCount,proto3" json:"current_count,omitempty"`
	// The id of the payment option that has been used to purchase this user
	// payment option. (required)
	PaymentOptionId      string   `protobuf:"bytes,7,opt,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserPaymentOption) Reset()         { *m = UserPaymentOption{} }
func (m *UserPaymentOption) String() string { return proto.CompactTextString(m) }
func (*UserPaymentOption) ProtoMessage()    {}
func (*UserPaymentOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{32}
}

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

var xxx_messageInfo_UserPaymentOption proto.InternalMessageInfo

func (m *UserPaymentOption) GetUserPaymentOptionId() string {
	if m != nil {
		return m.UserPaymentOptionId
	}
	return ""
}

func (m *UserPaymentOption) GetValidStartTimeSec() int64 {
	if m != nil {
		return m.ValidStartTimeSec
	}
	return 0
}

func (m *UserPaymentOption) GetValidEndTimeSec() int64 {
	if m != nil {
		return m.ValidEndTimeSec
	}
	return 0
}

func (m *UserPaymentOption) GetType() PaymentOptionType {
	if m != nil {
		return m.Type
	}
	return PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED
}

func (m *UserPaymentOption) GetOriginalCount() int32 {
	if m != nil {
		return m.OriginalCount
	}
	return 0
}

func (m *UserPaymentOption) GetCurrentCount() int32 {
	if m != nil {
		return m.CurrentCount
	}
	return 0
}

func (m *UserPaymentOption) GetPaymentOptionId() string {
	if m != nil {
		return m.PaymentOptionId
	}
	return ""
}

// Payment details that are sent when creating a new booking.
type PaymentInformation struct {
	// Prepayment status of the booking.
	// If the prepayment_status is PREPAYMENT_PROVIDED, then
	// payment_transaction_id contains the associated unique transaction id for
	// the purchase.
	// If the prepayment status is PREPAYMENT_REFUNDED, then
	// payment_transaction_id contains the associated unique transaction id for
	// the refund. (required)
	PrepaymentStatus PrepaymentStatus `protobuf:"varint,1,opt,name=prepayment_status,json=prepaymentStatus,proto3,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
	// Unique identifier for a payment transaction associated with the booking.
	// If the payment is PROCESSED_BY_GOOGLE, this field will be set by Google.
	// If the payment is PROCESSED_BY_PARTNER, this field will be left empty in
	// Google's CreateBooking or CreateOrder requests to the partner, and it must
	// be set by the partner in their responses.
	PaymentTransactionId string `protobuf:"bytes,2,opt,name=payment_transaction_id,json=paymentTransactionId,proto3" json:"payment_transaction_id,omitempty"`
	// These fields must match the service price (specified in the Services feed)
	// or the PaymentOption corresponding with this service.
	// They are included in the booking request and response to verify that
	// the price indicated in the feed has not changed since the last feed
	// update.
	//
	// The price of the booking or order, exclusive of any taxes.
	// Existence of price or taxes does not imply that they have been paid,
	// prepayment_state should be used for that purpose. (required)
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// Taxes that are calculated to be paid for this booking.
	// This field can only be absent in one of the following cases:
	// (1) the price is exempt from or already inclusive of applicable taxes; or
	// (2) the break down between taxes and fees is not available.
	// (required when neither of the above holds)
	TaxAmount *Price `protobuf:"bytes,4,opt,name=tax_amount,json=taxAmount,proto3" json:"tax_amount,omitempty"`
	// Whether the partner or Google processed the payment. (required)
	PaymentProcessedBy PaymentInformation_PaymentProcessedBy `protobuf:"varint,5,opt,name=payment_processed_by,json=paymentProcessedBy,proto3,enum=ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy" json:"payment_processed_by,omitempty"`
	// The id of the payment option or user payment option associated with the
	// booking.
	// If a payment option is purchased as part of a booking, payment_option_id
	// will be set with the id of that payment option.
	// If an already purchased user payment option is being used to pay for a
	// booking, user_payment_option_id will be set with the id of that user
	// payment option.
	// When included as part of a response proto, the user_payment_option_id
	// should be set and must match the UserPaymentOption that is returned in the
	// RPC response (e.g. the user_payment_option returned in
	// CreateBookingResponse). (one of these required)
	//
	// Types that are valid to be assigned to PaymentId:
	//	*PaymentInformation_PaymentOptionId
	//	*PaymentInformation_UserPaymentOptionId
	PaymentId isPaymentInformation_PaymentId `protobuf_oneof:"payment_id"`
	// Defines how a deposit may be charged to the user. If there is a deposit,
	// this field should be set. (optional)
	Deposit *Deposit `protobuf:"bytes,8,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. If the user can be
	// charged a no show fee, this field should be set. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,9,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Total processing fees & taxes that the user needs to pay for the order;
	// only applicable to partners that handle order based booking (e.g., with
	// CreateOrder method). (optional)
	FeesAndTaxes         *Price   `protobuf:"bytes,10,opt,name=fees_and_taxes,json=feesAndTaxes,proto3" json:"fees_and_taxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PaymentInformation) Reset()         { *m = PaymentInformation{} }
func (m *PaymentInformation) String() string { return proto.CompactTextString(m) }
func (*PaymentInformation) ProtoMessage()    {}
func (*PaymentInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{33}
}

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

var xxx_messageInfo_PaymentInformation proto.InternalMessageInfo

func (m *PaymentInformation) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

func (m *PaymentInformation) GetPaymentTransactionId() string {
	if m != nil {
		return m.PaymentTransactionId
	}
	return ""
}

func (m *PaymentInformation) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *PaymentInformation) GetTaxAmount() *Price {
	if m != nil {
		return m.TaxAmount
	}
	return nil
}

func (m *PaymentInformation) GetPaymentProcessedBy() PaymentInformation_PaymentProcessedBy {
	if m != nil {
		return m.PaymentProcessedBy
	}
	return PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED
}

type isPaymentInformation_PaymentId interface {
	isPaymentInformation_PaymentId()
}

type PaymentInformation_PaymentOptionId struct {
	PaymentOptionId string `protobuf:"bytes,6,opt,name=payment_option_id,json=paymentOptionId,proto3,oneof"`
}

type PaymentInformation_UserPaymentOptionId struct {
	UserPaymentOptionId string `protobuf:"bytes,7,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3,oneof"`
}

func (*PaymentInformation_PaymentOptionId) isPaymentInformation_PaymentId() {}

func (*PaymentInformation_UserPaymentOptionId) isPaymentInformation_PaymentId() {}

func (m *PaymentInformation) GetPaymentId() isPaymentInformation_PaymentId {
	if m != nil {
		return m.PaymentId
	}
	return nil
}

func (m *PaymentInformation) GetPaymentOptionId() string {
	if x, ok := m.GetPaymentId().(*PaymentInformation_PaymentOptionId); ok {
		return x.PaymentOptionId
	}
	return ""
}

func (m *PaymentInformation) GetUserPaymentOptionId() string {
	if x, ok := m.GetPaymentId().(*PaymentInformation_UserPaymentOptionId); ok {
		return x.UserPaymentOptionId
	}
	return ""
}

func (m *PaymentInformation) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *PaymentInformation) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *PaymentInformation) GetFeesAndTaxes() *Price {
	if m != nil {
		return m.FeesAndTaxes
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*PaymentInformation) 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 _PaymentInformation_OneofMarshaler, _PaymentInformation_OneofUnmarshaler, _PaymentInformation_OneofSizer, []interface{}{
		(*PaymentInformation_PaymentOptionId)(nil),
		(*PaymentInformation_UserPaymentOptionId)(nil),
	}
}

func _PaymentInformation_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*PaymentInformation)
	// payment_id
	switch x := m.PaymentId.(type) {
	case *PaymentInformation_PaymentOptionId:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.UserPaymentOptionId)
	case nil:
	default:
		return fmt.Errorf("PaymentInformation.PaymentId has unexpected type %T", x)
	}
	return nil
}

func _PaymentInformation_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*PaymentInformation)
	switch tag {
	case 6: // payment_id.payment_option_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PaymentId = &PaymentInformation_PaymentOptionId{x}
		return true, err
	case 7: // payment_id.user_payment_option_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PaymentId = &PaymentInformation_UserPaymentOptionId{x}
		return true, err
	default:
		return false, nil
	}
}

func _PaymentInformation_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*PaymentInformation)
	// payment_id
	switch x := m.PaymentId.(type) {
	case *PaymentInformation_PaymentOptionId:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.PaymentOptionId)))
		n += len(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.UserPaymentOptionId)))
		n += len(x.UserPaymentOptionId)
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// The price of a service or a fee.
type Price struct {
	// The price in micro-units of the currency.
	// Fractions of smallest currency unit will be rounded using nearest even
	// 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"`
	// 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"`
	// 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:"-"`
}

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_1820d8e1a9fad753, []int{34}
}

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) GetPriceMicros() int64 {
	if m != nil {
		return m.PriceMicros
	}
	return 0
}

func (m *Price) GetCurrencyCode() string {
	if m != nil {
		return m.CurrencyCode
	}
	return ""
}

func (m *Price) GetPricingOptionTag() string {
	if m != nil {
		return m.PricingOptionTag
	}
	return ""
}

// A fee that a user may be charged if they have made a booking but do not
// show up.
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"`
	// Defines how the fee is determined from the availability.
	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=ext.maps.booking.partner.v3.PriceType" json:"fee_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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_1820d8e1a9fad753, []int{35}
}

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) GetFee() *Price {
	if m != nil {
		return m.Fee
	}
	return nil
}

func (m *NoShowFee) GetFeeType() PriceType {
	if m != nil {
		return m.FeeType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// A deposit that the user may be charged or have a hold on their credit card
// for.
type Deposit struct {
	// Deposit amount.
	Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" 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"`
	// Defines how the deposit is determined from the availability.
	DepositType          PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=ext.maps.booking.partner.v3.PriceType" json:"deposit_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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_1820d8e1a9fad753, []int{36}
}

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) GetDeposit() *Price {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
	if m != nil {
		return m.MinAdvanceCancellationSec
	}
	return 0
}

func (m *Deposit) GetDepositType() PriceType {
	if m != nil {
		return m.DepositType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// An inventory slot
type Slot struct {
	// ID of the merchant for the slot (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// ID of the merchant Service (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
	// (required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Opaque tag that identifies the availability slot and matches the value
	// provided in the availability feed (optional)
	AvailabilityTag string `protobuf:"bytes,5,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// The set of resources that disambiguates the appointment slot, e.g. by
	// indicating the staff member and room selected by the user (optional)
	Resources            *ResourceIds `protobuf:"bytes,6,opt,name=resources,proto3" json:"resources,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Slot) Reset()         { *m = Slot{} }
func (m *Slot) String() string { return proto.CompactTextString(m) }
func (*Slot) ProtoMessage()    {}
func (*Slot) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{37}
}

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

var xxx_messageInfo_Slot proto.InternalMessageInfo

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

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

func (m *Slot) GetStartSec() int64 {
	if m != nil {
		return m.StartSec
	}
	return 0
}

func (m *Slot) GetDurationSec() int64 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *Slot) GetAvailabilityTag() string {
	if m != nil {
		return m.AvailabilityTag
	}
	return ""
}

func (m *Slot) GetResources() *ResourceIds {
	if m != nil {
		return m.Resources
	}
	return nil
}

// 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_1820d8e1a9fad753, []int{38}
}

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_1820d8e1a9fad753, []int{39}
}

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.RegisterEnum("ext.maps.booking.partner.v3.BookingStatus", BookingStatus_name, BookingStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CreditCardType", CreditCardType_name, CreditCardType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentOptionType", PaymentOptionType_name, PaymentOptionType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PrepaymentStatus", PrepaymentStatus_name, PrepaymentStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement", CheckAvailabilityResponse_DurationRequirement_name, CheckAvailabilityResponse_DurationRequirement_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.BookingFailure_Cause", BookingFailure_Cause_name, BookingFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.OrderFailure_Cause", OrderFailure_Cause_name, OrderFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.OrderFulfillability_OrderFulfillabilityResult", OrderFulfillability_OrderFulfillabilityResult_name, OrderFulfillability_OrderFulfillabilityResult_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.LineItemFulfillability_ItemFulfillabilityResult", LineItemFulfillability_ItemFulfillabilityResult_name, LineItemFulfillability_ItemFulfillabilityResult_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor", PaymentProcessingParameters_PaymentProcessor_name, PaymentProcessingParameters_PaymentProcessor_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy", PaymentInformation_PaymentProcessedBy_name, PaymentInformation_PaymentProcessedBy_value)
	proto.RegisterType((*CheckAvailabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityRequest")
	proto.RegisterType((*CheckAvailabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityResponse")
	proto.RegisterType((*AvailabilityUpdate)(nil), "ext.maps.booking.partner.v3.AvailabilityUpdate")
	proto.RegisterType((*SlotAvailability)(nil), "ext.maps.booking.partner.v3.SlotAvailability")
	proto.RegisterType((*CheckOrderFulfillabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityRequest")
	proto.RegisterType((*CheckOrderFulfillabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityResponse")
	proto.RegisterType((*GetBookingStatusRequest)(nil), "ext.maps.booking.partner.v3.GetBookingStatusRequest")
	proto.RegisterType((*GetBookingStatusResponse)(nil), "ext.maps.booking.partner.v3.GetBookingStatusResponse")
	proto.RegisterType((*CreateBookingRequest)(nil), "ext.maps.booking.partner.v3.CreateBookingRequest")
	proto.RegisterType((*CreateBookingResponse)(nil), "ext.maps.booking.partner.v3.CreateBookingResponse")
	proto.RegisterType((*CreateLeaseRequest)(nil), "ext.maps.booking.partner.v3.CreateLeaseRequest")
	proto.RegisterType((*CreateLeaseResponse)(nil), "ext.maps.booking.partner.v3.CreateLeaseResponse")
	proto.RegisterType((*Lease)(nil), "ext.maps.booking.partner.v3.Lease")
	proto.RegisterType((*LeaseReference)(nil), "ext.maps.booking.partner.v3.LeaseReference")
	proto.RegisterType((*CreateOrderRequest)(nil), "ext.maps.booking.partner.v3.CreateOrderRequest")
	proto.RegisterType((*CreateOrderResponse)(nil), "ext.maps.booking.partner.v3.CreateOrderResponse")
	proto.RegisterType((*ListBookingsRequest)(nil), "ext.maps.booking.partner.v3.ListBookingsRequest")
	proto.RegisterType((*ListBookingsResponse)(nil), "ext.maps.booking.partner.v3.ListBookingsResponse")
	proto.RegisterType((*ListOrdersRequest)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest")
	proto.RegisterType((*ListOrdersRequest_OrderIds)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest.OrderIds")
	proto.RegisterType((*ListOrdersResponse)(nil), "ext.maps.booking.partner.v3.ListOrdersResponse")
	proto.RegisterType((*UpdateBookingRequest)(nil), "ext.maps.booking.partner.v3.UpdateBookingRequest")
	proto.RegisterType((*UpdateBookingResponse)(nil), "ext.maps.booking.partner.v3.UpdateBookingResponse")
	proto.RegisterType((*Booking)(nil), "ext.maps.booking.partner.v3.Booking")
	proto.RegisterType((*BookingFailure)(nil), "ext.maps.booking.partner.v3.BookingFailure")
	proto.RegisterType((*Order)(nil), "ext.maps.booking.partner.v3.Order")
	proto.RegisterType((*LineItem)(nil), "ext.maps.booking.partner.v3.LineItem")
	proto.RegisterType((*LineItem_OrderedTickets)(nil), "ext.maps.booking.partner.v3.LineItem.OrderedTickets")
	proto.RegisterType((*OrderFailure)(nil), "ext.maps.booking.partner.v3.OrderFailure")
	proto.RegisterType((*OrderFulfillability)(nil), "ext.maps.booking.partner.v3.OrderFulfillability")
	proto.RegisterType((*LineItemFulfillability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability")
	proto.RegisterType((*LineItemFulfillability_UpdatedAvailability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability.UpdatedAvailability")
	proto.RegisterType((*TicketType)(nil), "ext.maps.booking.partner.v3.TicketType")
	proto.RegisterType((*ResourceIds)(nil), "ext.maps.booking.partner.v3.ResourceIds")
	proto.RegisterType((*PaymentProcessingParameters)(nil), "ext.maps.booking.partner.v3.PaymentProcessingParameters")
	proto.RegisterType((*UserPaymentOption)(nil), "ext.maps.booking.partner.v3.UserPaymentOption")
	proto.RegisterType((*PaymentInformation)(nil), "ext.maps.booking.partner.v3.PaymentInformation")
	proto.RegisterType((*Price)(nil), "ext.maps.booking.partner.v3.Price")
	proto.RegisterType((*NoShowFee)(nil), "ext.maps.booking.partner.v3.NoShowFee")
	proto.RegisterType((*Deposit)(nil), "ext.maps.booking.partner.v3.Deposit")
	proto.RegisterType((*Slot)(nil), "ext.maps.booking.partner.v3.Slot")
	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.UserInformation")
	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.PostalAddress")
}

func init() { proto.RegisterFile("v3.proto", fileDescriptor_1820d8e1a9fad753) }

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