// 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"`
	// The requirement to show the slots duration and/or endtime. This field will
	// be ignored if the slot is unavailable. (optional)
	DurationRequirement CheckAvailabilityResponse_DurationRequirement `protobuf:"varint,3,opt,name=duration_requirement,json=durationRequirement,proto3,enum=ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement" json:"duration_requirement,omitempty"`
	// Optionally, the partner can return additional updated information about the
	// availability for this merchant if this information is present when
	// responding to the CheckAvailabilityRequest and if there is no negative
	// impact on the CheckAvailability request latency.
	// For instance an entire day of merchant availability for a superset of
	// resources can be returned here.
	AvailabilityUpdate   *AvailabilityUpdate `protobuf:"bytes,4,opt,name=availability_update,json=availabilityUpdate,proto3" json:"availability_update,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityResponse proto.InternalMessageInfo

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

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

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

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

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

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

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

var xxx_messageInfo_AvailabilityUpdate proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_SlotAvailability proto.InternalMessageInfo

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

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

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