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

/*
Package ext_maps_booking_partner_v3 is a generated protocol buffer package.

It is generated from these files:
	v3.proto

It has these top-level messages:
	CheckAvailabilityRequest
	CheckAvailabilityResponse
	AvailabilityUpdate
	SlotAvailability
	SlotTime
	SlotTimeAvailability
	BatchAvailabilityLookupRequest
	BatchAvailabilityLookupResponse
	CheckOrderFulfillabilityRequest
	CheckOrderFulfillabilityResponse
	GetBookingStatusRequest
	GetBookingStatusResponse
	CreateBookingRequest
	CreateBookingResponse
	CreateLeaseRequest
	CreateLeaseResponse
	Lease
	LeaseReference
	CreateOrderRequest
	CreateOrderResponse
	ListBookingsRequest
	ListBookingsResponse
	ListOrdersRequest
	ListOrdersResponse
	UpdateBookingRequest
	UpdateBookingResponse
	Booking
	BookingFailure
	Order
	LineItem
	OrderFailure
	OrderFulfillability
	LineItemFulfillability
	TicketType
	ResourceIds
	TokenizationConfig
	PaymentProcessingParameters
	UserPaymentOption
	PaymentInformation
	Price
	NoShowFee
	Deposit
	Slot
	UserInformation
	PostalAddress
*/
package ext_maps_booking_partner_v3

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

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []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 fileDescriptor0, []int{27, 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 fileDescriptor0, []int{30, 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 fileDescriptor0, []int{31, 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 fileDescriptor0, []int{32, 0}
}

// Control how much billing information to include in the
// payment token.
type TokenizationConfig_BillingInformationFormat int32

const (
	// Not specified.  Defaults to MIN.
	TokenizationConfig_BILLING_INFORMATION_FORMAT_UNSPECIFIED TokenizationConfig_BillingInformationFormat = 0
	// name, country code, and postal code (Google Pay default setting).
	TokenizationConfig_MIN TokenizationConfig_BillingInformationFormat = 1
	// name, street address, locality, region, country code, and postal code.
	TokenizationConfig_FULL TokenizationConfig_BillingInformationFormat = 2
)

var TokenizationConfig_BillingInformationFormat_name = map[int32]string{
	0: "BILLING_INFORMATION_FORMAT_UNSPECIFIED",
	1: "MIN",
	2: "FULL",
}
var TokenizationConfig_BillingInformationFormat_value = map[string]int32{
	"BILLING_INFORMATION_FORMAT_UNSPECIFIED": 0,
	"MIN":  1,
	"FULL": 2,
}

func (x TokenizationConfig_BillingInformationFormat) String() string {
	return proto.EnumName(TokenizationConfig_BillingInformationFormat_name, int32(x))
}
func (TokenizationConfig_BillingInformationFormat) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor0, []int{35, 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 fileDescriptor0, []int{36, 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 fileDescriptor0, []int{38, 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" json:"slot,omitempty"`
}

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

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" 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" 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,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" json:"availability_update,omitempty"`
}

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

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" json:"slot_availability,omitempty"`
}

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

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" 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" json:"count_available,omitempty"`
}

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

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
}

// Identifies a Slot start time and optionally, the Slot duration, for a =
// specific service and merchant. Note that this differs from the definition of
// Slot, as it does not include merchant_id and service_id identifiers.
type SlotTime struct {
	// Start time of the appointment slot in seconds of UTC time since Unix epoch
	// (required)
	StartSec int64 `protobuf:"varint,1,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds (optional)
	DurationSec int64 `protobuf:"varint,2,opt,name=duration_sec,json=durationSec" 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,3,opt,name=availability_tag,json=availabilityTag" json:"availability_tag,omitempty"`
	// The set of resources that specifies the appointment slot, e.g. by
	// indicating the staff member and room selected by the user, or party size
	// for dining slots (optional)
	ResourceIds *ResourceIds `protobuf:"bytes,4,opt,name=resource_ids,json=resourceIds" json:"resource_ids,omitempty"`
}

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

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

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

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

func (m *SlotTime) GetResourceIds() *ResourceIds {
	if m != nil {
		return m.ResourceIds
	}
	return nil
}

type SlotTimeAvailability struct {
	// The SlotTime for which availability was checked.
	SlotTime *SlotTime `protobuf:"bytes,1,opt,name=slot_time,json=slotTime" json:"slot_time,omitempty"`
	// Whether the requested SlotTime is available
	Available bool `protobuf:"varint,2,opt,name=available" json:"available,omitempty"`
}

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

func (m *SlotTimeAvailability) GetSlotTime() *SlotTime {
	if m != nil {
		return m.SlotTime
	}
	return nil
}

func (m *SlotTimeAvailability) GetAvailable() bool {
	if m != nil {
		return m.Available
	}
	return false
}

// Request to lookup availabilities of a list of specified slot times for a
// given merchant/service.
type BatchAvailabilityLookupRequest struct {
	// ID of the merchant.
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
	// ID of the service.
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
	// Multiple slot times to be checked for availability. All queried times apply
	// to the same merchant_id and service_id.
	SlotTime []*SlotTime `protobuf:"bytes,3,rep,name=slot_time,json=slotTime" json:"slot_time,omitempty"`
}

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

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

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

func (m *BatchAvailabilityLookupRequest) GetSlotTime() []*SlotTime {
	if m != nil {
		return m.SlotTime
	}
	return nil
}

// Response for the BatchAvailabilityLookupRequest RPC with the availabilities
// of the appointment slots.
type BatchAvailabilityLookupResponse struct {
	// The availabilities for the requested SlotTime entries. There must be
	// exactly one slot_time_availability for each SlotTime entry in the
	// [ext.maps.booking.partner.v3.BatchAvailabilityLookupRequest].
	SlotTimeAvailability []*SlotTimeAvailability `protobuf:"bytes,1,rep,name=slot_time_availability,json=slotTimeAvailability" json:"slot_time_availability,omitempty"`
}

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

func (m *BatchAvailabilityLookupResponse) GetSlotTimeAvailability() []*SlotTimeAvailability {
	if m != nil {
		return m.SlotTimeAvailability
	}
	return nil
}

// 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" 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" json:"item,omitempty"`
}

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

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" 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" json:"fees_and_taxes,omitempty"`
}

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

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" json:"booking_id,omitempty"`
}

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

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" json:"booking_id,omitempty"`
	// Status of the booking (required)
	BookingStatus BookingStatus `protobuf:"varint,2,opt,name=booking_status,json=bookingStatus,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,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
}

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

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" 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" json:"lease_ref,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation" 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" 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" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateBooking requests. (required)
	IdempotencyToken string `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken" 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" json:"additional_request,omitempty"`
}

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

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" 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" 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" json:"booking_failure,omitempty"`
}

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

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" json:"lease,omitempty"`
}

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

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" 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" json:"booking_failure,omitempty"`
}

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

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" json:"lease_id,omitempty"`
	// The appointment slot that the lease is created for. (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot" 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" 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" json:"lease_expiration_time_sec,omitempty"`
}

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

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" json:"lease_id,omitempty"`
}

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

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" 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" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateOrder requests. (required)
	IdempotencyToken string `protobuf:"bytes,3,opt,name=idempotency_token,json=idempotencyToken" json:"idempotency_token,omitempty"`
}

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

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"`
}

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

type isCreateOrderResponse_Result interface {
	isCreateOrderResponse_Result()
}

type CreateOrderResponse_Order struct {
	Order *Order `protobuf:"bytes,1,opt,name=order,oneof"`
}
type CreateOrderResponse_OrderFailure struct {
	OrderFailure *OrderFailure `protobuf:"bytes,2,opt,name=order_failure,json=orderFailure,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 += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *CreateOrderResponse_OrderFailure:
		s := proto.Size(x.OrderFailure)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		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" json:"user_id,omitempty"`
}

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

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" json:"bookings,omitempty"`
}

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

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"`
}

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

type isListOrdersRequest_Ids interface {
	isListOrdersRequest_Ids()
}

type ListOrdersRequest_UserId struct {
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,oneof"`
}
type ListOrdersRequest_OrderIds_ struct {
	OrderIds *ListOrdersRequest_OrderIds `protobuf:"bytes,2,opt,name=order_ids,json=orderIds,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 += proto.SizeVarint(1<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(len(x.UserId)))
		n += len(x.UserId)
	case *ListOrdersRequest_OrderIds_:
		s := proto.Size(x.OrderIds)
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		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" json:"order_id,omitempty"`
}

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 fileDescriptor0, []int{22, 0} }

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" json:"order,omitempty"`
}

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

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" json:"booking,omitempty"`
}

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

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" 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" 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" json:"booking_failure,omitempty"`
}

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

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" json:"booking_id,omitempty"`
	// The appointment slot of this booking (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot" json:"slot,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation" json:"user_information,omitempty"`
	// Status of the booking (required)
	Status BookingStatus `protobuf:"varint,4,opt,name=status,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" json:"payment_information,omitempty"`
}

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

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,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,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" json:"description,omitempty"`
}

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

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" json:"order_id,omitempty"`
	// Personal information of the user making the order (required)
	UserInformation *UserInformation `protobuf:"bytes,2,opt,name=user_information,json=userInformation" 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" 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" json:"merchant_id,omitempty"`
	// Line items in this order.
	Item []*LineItem `protobuf:"bytes,5,rep,name=item" json:"item,omitempty"`
}

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

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" 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" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds. (required)
	DurationSec int64 `protobuf:"varint,3,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"`
	// Number of tickets ordered by Ticket Type.
	Tickets []*LineItem_OrderedTickets `protobuf:"bytes,4,rep,name=tickets" 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" 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,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
}

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

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" json:"ticket_id,omitempty"`
	Count    int32  `protobuf:"varint,2,opt,name=count" json:"count,omitempty"`
}

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

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,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" 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,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" json:"description,omitempty"`
}

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

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,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" 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" json:"unfulfillable_reason,omitempty"`
}

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

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" json:"item,omitempty"`
	// (required)
	Result LineItemFulfillability_ItemFulfillabilityResult `protobuf:"varint,2,opt,name=result,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" json:"unfulfillable_reason,omitempty"`
	// (optional)
	Availability *LineItemFulfillability_UpdatedAvailability `protobuf:"bytes,4,opt,name=availability" 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" json:"ticket_type,omitempty"`
}

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

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" json:"spots_open,omitempty"`
}

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 fileDescriptor0, []int{32, 0}
}

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

// TicketType is used to differentiate among tickets with different prices
// and/or availabilities due to different user types, different
// service attributes, or different options/add-ons.
//
// A ticket is the minimal bookable unit to a service, e.g. a spot on a rafting
// trip, an admission to a museum, a full day double kayak rental.
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" json:"ticket_type_id,omitempty"`
	// A short description to this TicketType.
	//
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	// Required, each ticket type should have a description to be user visible.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price *Price `protobuf:"bytes,3,opt,name=price" json:"price,omitempty"`
	// Description of any additional option which this ticket type represents, if
	// any.
	//
	// This is useful when the ticket type represents multiple dimensions.
	//
	// Example 1: an admission ticket with different types 'adult', 'child' and
	// language as an additional option, the expected TicketType list would be:
	//     - { ticket_type_id: "ticket_type_1" short_description: "adult"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "adult"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "child"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "child"
	//         option_description: "spanish" }
	//
	// Example 2: an multi-hour kayak rental with optional dry bag add-on, the
	// short_description could be "3 hours" and the option_description could be
	// either "with dry bag" or "without dry bag":
	//     - { ticket_type_id: "ticket_type_1" short_description: "2 hours"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "3 hours"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "2 hours"
	//          option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "3 hours"
	//          option_description: "spanish" }
	//
	// Optional, but if any ticket type within the service has this field set, we
	// expect all other ticket types to have this field set as well (a default
	// option_description could be used). E.g.
	// [{ticket_type_1, adult, english}, {ticket_type_1, adult, ''}] is not a
	// valid list.
	OptionDescription string `protobuf:"bytes,4,opt,name=option_description,json=optionDescription" json:"option_description,omitempty"`
}

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

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
}

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

// 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" 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" 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" json:"party_size,omitempty"`
}

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

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
}

// A configuration for payment-processor tokenization, set up on a per-Merchant
// basis.
type TokenizationConfig struct {
	// A tokenization configuration will typically have one
	// tokenization_parameter whose key is "gateway" and whose value is the
	// name of the processor.
	TokenizationParameter map[string]string `protobuf:"bytes,1,rep,name=tokenization_parameter,json=tokenizationParameter" json:"tokenization_parameter,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	// Include in the payment token the user's billing information as entered into
	// Google Pay with their FOP (see above).
	BillingInformationFormat TokenizationConfig_BillingInformationFormat `protobuf:"varint,2,opt,name=billing_information_format,json=billingInformationFormat,enum=ext.maps.booking.partner.v3.TokenizationConfig_BillingInformationFormat" json:"billing_information_format,omitempty"`
}

func (m *TokenizationConfig) Reset()                    { *m = TokenizationConfig{} }
func (m *TokenizationConfig) String() string            { return proto.CompactTextString(m) }
func (*TokenizationConfig) ProtoMessage()               {}
func (*TokenizationConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }

func (m *TokenizationConfig) GetTokenizationParameter() map[string]string {
	if m != nil {
		return m.TokenizationParameter
	}
	return nil
}

func (m *TokenizationConfig) GetBillingInformationFormat() TokenizationConfig_BillingInformationFormat {
	if m != nil {
		return m.BillingInformationFormat
	}
	return TokenizationConfig_BILLING_INFORMATION_FORMAT_UNSPECIFIED
}

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,enum=ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor" json:"processor,omitempty"`
	// 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" json:"payment_method_token,omitempty"`
	// 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" 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)
	// This is deprecated in favor of tokenization_parameters.
	Version string `protobuf:"bytes,3,opt,name=version" json:"version,omitempty"`
	// The payment processor whose configuration was used to generate this token.
	// (required)
	// This is deprecated in favor of tokenization_parameters.
	PaymentProcessor string `protobuf:"bytes,4,opt,name=payment_processor,json=paymentProcessor" json:"payment_processor,omitempty"`
	// The tokenization_config supplied in the Merchant feed that was used
	// to generate unparsed_payment_method_token.
	TokenizationConfig *TokenizationConfig `protobuf:"bytes,6,opt,name=tokenization_config,json=tokenizationConfig" json:"tokenization_config,omitempty"`
}

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

func (m *PaymentProcessingParameters) GetProcessor() PaymentProcessingParameters_PaymentProcessor {
	if m != nil {
		return m.Processor
	}
	return PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED
}

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 ""
}

func (m *PaymentProcessingParameters) GetTokenizationConfig() *TokenizationConfig {
	if m != nil {
		return m.TokenizationConfig
	}
	return nil
}

// 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" 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" json:"valid_start_time_sec,omitempty"`
	ValidEndTimeSec   int64 `protobuf:"varint,3,opt,name=valid_end_time_sec,json=validEndTimeSec" 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,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" 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" 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" json:"payment_option_id,omitempty"`
}

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

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,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" 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" 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" 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,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" 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" 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" json:"fees_and_taxes,omitempty"`
}

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

type isPaymentInformation_PaymentId interface {
	isPaymentInformation_PaymentId()
}

type PaymentInformation_PaymentOptionId struct {
	PaymentOptionId string `protobuf:"bytes,6,opt,name=payment_option_id,json=paymentOptionId,oneof"`
}
type PaymentInformation_UserPaymentOptionId struct {
	UserPaymentOptionId string `protobuf:"bytes,7,opt,name=user_payment_option_id,json=userPaymentOptionId,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) 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
}

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 += proto.SizeVarint(6<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(len(x.PaymentOptionId)))
		n += len(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		n += proto.SizeVarint(7<<3 | proto.WireBytes)
		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" 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" 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" json:"pricing_option_tag,omitempty"`
}

func (m *Price) Reset()                    { *m = Price{} }
func (m *Price) String() string            { return proto.CompactTextString(m) }
func (*Price) ProtoMessage()               {}
func (*Price) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }

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" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,enum=ext.maps.booking.partner.v3.PriceType" json:"fee_type,omitempty"`
}

func (m *NoShowFee) Reset()                    { *m = NoShowFee{} }
func (m *NoShowFee) String() string            { return proto.CompactTextString(m) }
func (*NoShowFee) ProtoMessage()               {}
func (*NoShowFee) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }

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" json:"deposit,omitempty"`
	// Minimum advance cancellation for the deposit.
	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec" json:"min_advance_cancellation_sec,omitempty"`
	// Defines how the deposit is determined from the availability.
	DepositType PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,enum=ext.maps.booking.partner.v3.PriceType" json:"deposit_type,omitempty"`
}

func (m *Deposit) Reset()                    { *m = Deposit{} }
func (m *Deposit) String() string            { return proto.CompactTextString(m) }
func (*Deposit) ProtoMessage()               {}
func (*Deposit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }

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" json:"merchant_id,omitempty"`
	// ID of the merchant Service (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" 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" json:"start_sec,omitempty"`
	// Duration of the appointment slot (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec" 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" 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" json:"resources,omitempty"`
}

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

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" json:"user_id,omitempty"`
	// Given name of the user (maximum 40 characters) (required)
	GivenName string `protobuf:"bytes,2,opt,name=given_name,json=givenName" json:"given_name,omitempty"`
	// Family name of the user (maximum 40 characters) (required)
	FamilyName string `protobuf:"bytes,3,opt,name=family_name,json=familyName" json:"family_name,omitempty"`
	// Address of the user (optional)
	Address *PostalAddress `protobuf:"bytes,4,opt,name=address" json:"address,omitempty"`
	// Phone number of the user (required)
	Telephone string `protobuf:"bytes,5,opt,name=telephone" json:"telephone,omitempty"`
	// Email address of the user (required)
	Email string `protobuf:"bytes,6,opt,name=email" json:"email,omitempty"`
}

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

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" json:"country,omitempty"`
	// The locality/city, e.g. "Mountain View". (required)
	Locality string `protobuf:"bytes,2,opt,name=locality" json:"locality,omitempty"`
	// The region/state/province, e.g. "CA". (required)
	Region string `protobuf:"bytes,3,opt,name=region" json:"region,omitempty"`
	// The postal code, e.g. "94043". (required)
	PostalCode string `protobuf:"bytes,4,opt,name=postal_code,json=postalCode" json:"postal_code,omitempty"`
	// The street address, e.g. "1600 Amphitheatre Pkwy". (required)
	StreetAddress string `protobuf:"bytes,5,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
}

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

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

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

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

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

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

func init() {
	proto.RegisterType((*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((*SlotTime)(nil), "ext.maps.booking.partner.v3.SlotTime")
	proto.RegisterType((*SlotTimeAvailability)(nil), "ext.maps.booking.partner.v3.SlotTimeAvailability")
	proto.RegisterType((*BatchAvailabilityLookupRequest)(nil), "ext.maps.booking.partner.v3.BatchAvailabilityLookupRequest")
	proto.RegisterType((*BatchAvailabilityLookupResponse)(nil), "ext.maps.booking.partner.v3.BatchAvailabilityLookupResponse")
	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((*TokenizationConfig)(nil), "ext.maps.booking.partner.v3.TokenizationConfig")
	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")
	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.TokenizationConfig_BillingInformationFormat", TokenizationConfig_BillingInformationFormat_name, TokenizationConfig_BillingInformationFormat_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)
}

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

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