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

package ext_maps_booking_partner_v3

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

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

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // 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: 8
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
	// Booking could not be completed by the backend due to a failure.
	BookingStatus_FAILED BookingStatus = 6
	// Booking was asynchronously declined by the merchant.
	BookingStatus_DECLINED_BY_MERCHANT BookingStatus = 7
)

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",
	6: "FAILED",
	7: "DECLINED_BY_MERCHANT",
}

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,
	"FAILED":                        6,
	"DECLINED_BY_MERCHANT":          7,
}

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

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

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

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

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

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

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

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

// Mode by which bookings for an availability slot are confirmed.
type ConfirmationMode int32

const (
	// The confirmation mode was not specified.
	// Synchronous confirmation will be assumed.
	ConfirmationMode_CONFIRMATION_MODE_UNSPECIFIED ConfirmationMode = 0
	// Bookings for this availability will be confirmed synchronously.
	ConfirmationMode_CONFIRMATION_MODE_SYNCHRONOUS ConfirmationMode = 1
	// Bookings for this availability will be confirmed asynchronously.
	ConfirmationMode_CONFIRMATION_MODE_ASYNCHRONOUS ConfirmationMode = 2
)

var ConfirmationMode_name = map[int32]string{
	0: "CONFIRMATION_MODE_UNSPECIFIED",
	1: "CONFIRMATION_MODE_SYNCHRONOUS",
	2: "CONFIRMATION_MODE_ASYNCHRONOUS",
}

var ConfirmationMode_value = map[string]int32{
	"CONFIRMATION_MODE_UNSPECIFIED":  0,
	"CONFIRMATION_MODE_SYNCHRONOUS":  1,
	"CONFIRMATION_MODE_ASYNCHRONOUS": 2,
}

func (x ConfirmationMode) String() string {
	return proto.EnumName(ConfirmationMode_name, int32(x))
}

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

type PaymentOptionType int32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

type BookingFailure_Cause int32

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

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

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

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

func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{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 fileDescriptor_1820d8e1a9fad753, []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 fileDescriptor_1820d8e1a9fad753, []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 fileDescriptor_1820d8e1a9fad753, []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 fileDescriptor_1820d8e1a9fad753, []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 fileDescriptor_1820d8e1a9fad753, []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 fileDescriptor_1820d8e1a9fad753, []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,proto3" json:"slot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_CheckAvailabilityResponse proto.InternalMessageInfo

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

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

func (m *CheckAvailabilityResponse) GetLastOnlineCancellableSec() int64 {
	if m != nil {
		return m.LastOnlineCancellableSec
	}
	return 0
}

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

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

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

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

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

var xxx_messageInfo_AvailabilityUpdate proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_SlotAvailability proto.InternalMessageInfo

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

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

// Identifies a Slot service_id and start time and optionally, the Slot duration
// and resources, for a specific merchant. Note that this differs from the
// definition of Slot, as it does not include merchant_id identifier.
type SlotTime struct {
	// ID of the service. (required)
	ServiceId string `protobuf:"bytes,5,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch
	// (required)
	StartSec int64 `protobuf:"varint,1,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds (optional)
	DurationSec int64 `protobuf:"varint,2,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Opaque tag that identifies the availability slot and matches the value
	// provided in the availability feed (optional)
	AvailabilityTag string `protobuf:"bytes,3,opt,name=availability_tag,json=availabilityTag,proto3" 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,proto3" json:"resource_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_SlotTime proto.InternalMessageInfo

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

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,proto3" json:"slot_time,omitempty"`
	// Whether the requested SlotTime is available
	Available            bool     `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SlotTimeAvailability proto.InternalMessageInfo

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,proto3" json:"merchant_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,proto3" json:"slot_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_BatchAvailabilityLookupRequest proto.InternalMessageInfo

func (m *BatchAvailabilityLookupRequest) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	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,proto3" json:"slot_time_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_BatchAvailabilityLookupResponse proto.InternalMessageInfo

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,proto3" json:"merchant_id,omitempty"`
	// The line items in this order. All services requested must belong to the
	// specified merchant. (required)
	Item                 []*LineItem `protobuf:"bytes,2,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityRequest proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_CheckOrderFulfillabilityResponse proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_GetBookingStatusRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_GetBookingStatusResponse proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_CreateBookingRequest proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_CreateBookingResponse proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_CreateLeaseRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_CreateLeaseResponse proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_Lease proto.InternalMessageInfo

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

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

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

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

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

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

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

var xxx_messageInfo_LeaseReference proto.InternalMessageInfo

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

// Request to create an order.
type CreateOrderRequest struct {
	// The order to create. (required)
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3" json:"order,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. order.payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (required if payment is processed by the partner)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,2,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateOrder requests. (required)
	IdempotencyToken     string   `protobuf:"bytes,3,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateOrderRequest proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_CreateOrderResponse proto.InternalMessageInfo

type isCreateOrderResponse_Result interface {
	isCreateOrderResponse_Result()
}

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

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

func (*CreateOrderResponse_Order) isCreateOrderResponse_Result() {}

func (*CreateOrderResponse_OrderFailure) isCreateOrderResponse_Result() {}

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CreateOrderResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CreateOrderResponse_Order)(nil),
		(*CreateOrderResponse_OrderFailure)(nil),
	}
}

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

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

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

var xxx_messageInfo_ListBookingsRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_ListBookingsResponse proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_ListOrdersRequest proto.InternalMessageInfo

type isListOrdersRequest_Ids interface {
	isListOrdersRequest_Ids()
}

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

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

func (*ListOrdersRequest_UserId) isListOrdersRequest_Ids() {}

func (*ListOrdersRequest_OrderIds_) isListOrdersRequest_Ids() {}

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ListOrdersRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ListOrdersRequest_UserId)(nil),
		(*ListOrdersRequest_OrderIds_)(nil),
	}
}

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

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

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

var xxx_messageInfo_ListOrdersRequest_OrderIds proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_ListOrdersResponse proto.InternalMessageInfo

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

// Request to update a Booking.
type UpdateBookingRequest struct {
	Booking              *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UpdateBookingRequest proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_UpdateBookingResponse proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_Booking proto.InternalMessageInfo

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

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

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

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

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

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

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

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

var xxx_messageInfo_BookingFailure proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_Order proto.InternalMessageInfo

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

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

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

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

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

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

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

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

var xxx_messageInfo_LineItem proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_LineItem_OrderedTickets proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_OrderFailure proto.InternalMessageInfo

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

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

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

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

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

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

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

var xxx_messageInfo_OrderFulfillability proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_LineItemFulfillability proto.InternalMessageInfo

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

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

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

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

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

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

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

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

var xxx_messageInfo_LineItemFulfillability_UpdatedAvailability proto.InternalMessageInfo

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

// TicketType is used to differentiate among tickets 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,proto3" 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,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// 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,proto3" json:"option_description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TicketType proto.InternalMessageInfo

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

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

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

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,proto3" json:"staff_id,omitempty"`
	// The room ID as provided in the feed or empty if not applicable or no room
	// was selected. (optional)
	RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// For Dining Reservations only: the number of seats requested in the booking.
	// (optional)
	PartySize            int32    `protobuf:"varint,3,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ResourceIds proto.InternalMessageInfo

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

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

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

// 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,proto3" json:"tokenization_parameter,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// 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,proto3,enum=ext.maps.booking.partner.v3.TokenizationConfig_BillingInformationFormat" json:"billing_information_format,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}                                    `json:"-"`
	XXX_unrecognized         []byte                                      `json:"-"`
	XXX_sizecache            int32                                       `json:"-"`
}

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

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

var xxx_messageInfo_TokenizationConfig proto.InternalMessageInfo

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

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

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

var xxx_messageInfo_PaymentProcessingParameters proto.InternalMessageInfo

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

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

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

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

// Deprecated: Do not use.
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,proto3" json:"user_payment_option_id,omitempty"`
	// The user payment option will be valid (usable) between start_time and
	// end_time set in UTC. Attempts to use a user payment option to make a
	// booking outside of this interval will fail. (both optional)
	ValidStartTimeSec int64 `protobuf:"varint,2,opt,name=valid_start_time_sec,json=validStartTimeSec,proto3" json:"valid_start_time_sec,omitempty"`
	ValidEndTimeSec   int64 `protobuf:"varint,3,opt,name=valid_end_time_sec,json=validEndTimeSec,proto3" json:"valid_end_time_sec,omitempty"`
	// The type of the payment option associated with this user payment option.
	// This can be unlimited for a membership or subscription, multi-use for a
	// pack, or single-use. (required)
	Type PaymentOptionType `protobuf:"varint,4,opt,name=type,proto3,enum=ext.maps.booking.partner.v3.PaymentOptionType" json:"type,omitempty"`
	// The original number of uses for this user payment option when it was
	// purchased. This value is ignored for unlimited payment options. (required)
	OriginalCount int32 `protobuf:"varint,5,opt,name=original_count,json=originalCount,proto3" json:"original_count,omitempty"`
	// The number of uses remaining for this user payment option. If this number
	// is 0 for a pack, attempts to use this payment option to make a booking will
	// fail. (required)
	CurrentCount int32 `protobuf:"varint,6,opt,name=current_count,json=currentCount,proto3" json:"current_count,omitempty"`
	// The id of the payment option that has been used to purchase this user
	// payment option. (required)
	PaymentOptionId      string   `protobuf:"bytes,7,opt,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UserPaymentOption proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_PaymentInformation proto.InternalMessageInfo

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

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

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

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

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

type isPaymentInformation_PaymentId interface {
	isPaymentInformation_PaymentId()
}

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

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

func (*PaymentInformation_PaymentOptionId) isPaymentInformation_PaymentId() {}

func (*PaymentInformation_UserPaymentOptionId) isPaymentInformation_PaymentId() {}

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

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

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

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PaymentInformation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PaymentInformation_PaymentOptionId)(nil),
		(*PaymentInformation_UserPaymentOptionId)(nil),
	}
}

// The price of a service or a fee.
type Price struct {
	// The price in micro-units of the currency.
	// Fractions of smallest currency unit will be rounded using nearest even
	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
	// (required)
	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217. (required)
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// An optional and opaque string that identifies the pricing option that is
	// associated with the extended price. (optional)
	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Price proto.InternalMessageInfo

func (m *Price) GetPriceMicros() int64 {
	if m != nil {
		return m.PriceMicros
	}
	return 0
}

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

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

// A fee that a user may be charged if they have made a booking but do not
// show up.
type NoShowFee struct {
	// The amount the user may be charged if they do not show up for their
	// reservation.
	Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=ext.maps.booking.partner.v3.PriceType" json:"fee_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_NoShowFee proto.InternalMessageInfo

func (m *NoShowFee) GetFee() *Price {
	if m != nil {
		return m.Fee
	}
	return nil
}

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

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

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

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

var xxx_messageInfo_Deposit proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_Slot proto.InternalMessageInfo

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

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

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

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

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

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

func (m *Slot) GetConfirmationMode() ConfirmationMode {
	if m != nil {
		return m.ConfirmationMode
	}
	return ConfirmationMode_CONFIRMATION_MODE_UNSPECIFIED
}

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

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

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

var xxx_messageInfo_UserInformation proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_PostalAddress proto.InternalMessageInfo

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

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

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

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

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

func init() {
	proto.RegisterEnum("ext.maps.booking.partner.v3.BookingStatus", BookingStatus_name, BookingStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CreditCardType", CreditCardType_name, CreditCardType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.ConfirmationMode", ConfirmationMode_name, ConfirmationMode_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)
	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.RegisterMapType((map[string]string)(nil), "ext.maps.booking.partner.v3.TokenizationConfig.TokenizationParameterEntry")
	proto.RegisterType((*PaymentProcessingParameters)(nil), "ext.maps.booking.partner.v3.PaymentProcessingParameters")
	proto.RegisterType((*UserPaymentOption)(nil), "ext.maps.booking.partner.v3.UserPaymentOption")
	proto.RegisterType((*PaymentInformation)(nil), "ext.maps.booking.partner.v3.PaymentInformation")
	proto.RegisterType((*Price)(nil), "ext.maps.booking.partner.v3.Price")
	proto.RegisterType((*NoShowFee)(nil), "ext.maps.booking.partner.v3.NoShowFee")
	proto.RegisterType((*Deposit)(nil), "ext.maps.booking.partner.v3.Deposit")
	proto.RegisterType((*Slot)(nil), "ext.maps.booking.partner.v3.Slot")
	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.UserInformation")
	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.PostalAddress")
}

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

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