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

package ext_maps_booking_partner_v3

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

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

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

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

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

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

func (x BookingStatus) String() string {
	return proto.EnumName(BookingStatus_name, int32(x))
}
func (BookingStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []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
)

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

func (x CreditCardType) String() string {
	return proto.EnumName(CreditCardType_name, int32(x))
}
func (CreditCardType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{1}
}

type PaymentOptionType int32

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

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

func (x PaymentOptionType) String() string {
	return proto.EnumName(PaymentOptionType_name, int32(x))
}
func (PaymentOptionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{2}
}

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

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

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

func (x PrepaymentStatus) String() string {
	return proto.EnumName(PrepaymentStatus_name, int32(x))
}
func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{3}
}

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

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

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

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}
func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{4}
}

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

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

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

func (x CheckAvailabilityResponse_DurationRequirement) String() string {
	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
}
func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []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_v3_e164fdd8b81531d4, []int{23, 0}
}

type OrderFailure_Cause int32

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

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

func (x OrderFailure_Cause) String() string {
	return proto.EnumName(OrderFailure_Cause_name, int32(x))
}
func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{26, 0}
}

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

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

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

func (x OrderFulfillability_OrderFulfillabilityResult) String() string {
	return proto.EnumName(OrderFulfillability_OrderFulfillabilityResult_name, int32(x))
}
func (OrderFulfillability_OrderFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{27, 0}
}

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

const (
	// Default value: Don't use.
	LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED LineItemFulfillability_ItemFulfillabilityResult = 0
	// This line item can be fulfilled.
	LineItemFulfillability_CAN_FULFILL LineItemFulfillability_ItemFulfillabilityResult = 1
	// No adequate availability for the slot requested.
	LineItemFulfillability_SLOT_UNAVAILABLE LineItemFulfillability_ItemFulfillabilityResult = 2
	// 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",
	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,
	"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_v3_e164fdd8b81531d4, []int{28, 0}
}

type PaymentProcessingParameters_PaymentProcessor int32

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

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

func (x PaymentProcessingParameters_PaymentProcessor) String() string {
	return proto.EnumName(PaymentProcessingParameters_PaymentProcessor_name, int32(x))
}
func (PaymentProcessingParameters_PaymentProcessor) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{31, 0}
}

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

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

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

func (x PaymentInformation_PaymentProcessedBy) String() string {
	return proto.EnumName(PaymentInformation_PaymentProcessedBy_name, int32(x))
}
func (PaymentInformation_PaymentProcessedBy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{33, 0}
}

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

func (m *CheckAvailabilityRequest) Reset()         { *m = CheckAvailabilityRequest{} }
func (m *CheckAvailabilityRequest) String() string { return proto.CompactTextString(m) }
func (*CheckAvailabilityRequest) ProtoMessage()    {}
func (*CheckAvailabilityRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []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 (dst *CheckAvailabilityRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CheckAvailabilityRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []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 (dst *CheckAvailabilityResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CheckAvailabilityResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []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 (dst *AvailabilityUpdate) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AvailabilityUpdate.Merge(dst, 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_v3_e164fdd8b81531d4, []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 (dst *SlotAvailability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SlotAvailability.Merge(dst, src)
}
func (m *SlotAvailability) XXX_Size() int {
	return xxx_messageInfo_SlotAvailability.Size(m)
}
func (m *SlotAvailability) XXX_DiscardUnknown() {
	xxx_messageInfo_SlotAvailability.DiscardUnknown(m)
}

var xxx_messageInfo_SlotAvailability proto.InternalMessageInfo

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

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

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

func (m *CheckOrderFulfillabilityRequest) Reset()         { *m = CheckOrderFulfillabilityRequest{} }
func (m *CheckOrderFulfillabilityRequest) String() string { return proto.CompactTextString(m) }
func (*CheckOrderFulfillabilityRequest) ProtoMessage()    {}
func (*CheckOrderFulfillabilityRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{4}
}
func (m *CheckOrderFulfillabilityRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CheckOrderFulfillabilityRequest.Unmarshal(m, b)
}
func (m *CheckOrderFulfillabilityRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CheckOrderFulfillabilityRequest.Marshal(b, m, deterministic)
}
func (dst *CheckOrderFulfillabilityRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CheckOrderFulfillabilityRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{5}
}
func (m *CheckOrderFulfillabilityResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CheckOrderFulfillabilityResponse.Unmarshal(m, b)
}
func (m *CheckOrderFulfillabilityResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CheckOrderFulfillabilityResponse.Marshal(b, m, deterministic)
}
func (dst *CheckOrderFulfillabilityResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CheckOrderFulfillabilityResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []int{6}
}
func (m *GetBookingStatusRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetBookingStatusRequest.Unmarshal(m, b)
}
func (m *GetBookingStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetBookingStatusRequest.Marshal(b, m, deterministic)
}
func (dst *GetBookingStatusRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetBookingStatusRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{7}
}
func (m *GetBookingStatusResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetBookingStatusResponse.Unmarshal(m, b)
}
func (m *GetBookingStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetBookingStatusResponse.Marshal(b, m, deterministic)
}
func (dst *GetBookingStatusResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetBookingStatusResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []int{8}
}
func (m *CreateBookingRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateBookingRequest.Unmarshal(m, b)
}
func (m *CreateBookingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateBookingRequest.Marshal(b, m, deterministic)
}
func (dst *CreateBookingRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateBookingRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{9}
}
func (m *CreateBookingResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateBookingResponse.Unmarshal(m, b)
}
func (m *CreateBookingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateBookingResponse.Marshal(b, m, deterministic)
}
func (dst *CreateBookingResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateBookingResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []int{10}
}
func (m *CreateLeaseRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateLeaseRequest.Unmarshal(m, b)
}
func (m *CreateLeaseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateLeaseRequest.Marshal(b, m, deterministic)
}
func (dst *CreateLeaseRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateLeaseRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{11}
}
func (m *CreateLeaseResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateLeaseResponse.Unmarshal(m, b)
}
func (m *CreateLeaseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateLeaseResponse.Marshal(b, m, deterministic)
}
func (dst *CreateLeaseResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateLeaseResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []int{12}
}
func (m *Lease) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Lease.Unmarshal(m, b)
}
func (m *Lease) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Lease.Marshal(b, m, deterministic)
}
func (dst *Lease) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Lease.Merge(dst, 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_v3_e164fdd8b81531d4, []int{13}
}
func (m *LeaseReference) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LeaseReference.Unmarshal(m, b)
}
func (m *LeaseReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LeaseReference.Marshal(b, m, deterministic)
}
func (dst *LeaseReference) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LeaseReference.Merge(dst, 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_v3_e164fdd8b81531d4, []int{14}
}
func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b)
}
func (m *CreateOrderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateOrderRequest.Marshal(b, m, deterministic)
}
func (dst *CreateOrderRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateOrderRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{15}
}
func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b)
}
func (m *CreateOrderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateOrderResponse.Marshal(b, m, deterministic)
}
func (dst *CreateOrderResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateOrderResponse.Merge(dst, src)
}
func (m *CreateOrderResponse) XXX_Size() int {
	return xxx_messageInfo_CreateOrderResponse.Size(m)
}
func (m *CreateOrderResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateOrderResponse.DiscardUnknown(m)
}

var xxx_messageInfo_CreateOrderResponse proto.InternalMessageInfo

type isCreateOrderResponse_Result interface {
	isCreateOrderResponse_Result()
}

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

func (*CreateOrderResponse_Order) isCreateOrderResponse_Result()        {}
func (*CreateOrderResponse_OrderFailure) isCreateOrderResponse_Result() {}

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

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

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

// XXX_OneofFuncs is for the internal use of the proto package.
func (*CreateOrderResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _CreateOrderResponse_OneofMarshaler, _CreateOrderResponse_OneofUnmarshaler, _CreateOrderResponse_OneofSizer, []interface{}{
		(*CreateOrderResponse_Order)(nil),
		(*CreateOrderResponse_OrderFailure)(nil),
	}
}

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

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

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

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

func (m *ListBookingsRequest) Reset()         { *m = ListBookingsRequest{} }
func (m *ListBookingsRequest) String() string { return proto.CompactTextString(m) }
func (*ListBookingsRequest) ProtoMessage()    {}
func (*ListBookingsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{16}
}
func (m *ListBookingsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListBookingsRequest.Unmarshal(m, b)
}
func (m *ListBookingsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListBookingsRequest.Marshal(b, m, deterministic)
}
func (dst *ListBookingsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListBookingsRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{17}
}
func (m *ListBookingsResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListBookingsResponse.Unmarshal(m, b)
}
func (m *ListBookingsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListBookingsResponse.Marshal(b, m, deterministic)
}
func (dst *ListBookingsResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListBookingsResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []int{18}
}
func (m *ListOrdersRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListOrdersRequest.Unmarshal(m, b)
}
func (m *ListOrdersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListOrdersRequest.Marshal(b, m, deterministic)
}
func (dst *ListOrdersRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListOrdersRequest.Merge(dst, src)
}
func (m *ListOrdersRequest) XXX_Size() int {
	return xxx_messageInfo_ListOrdersRequest.Size(m)
}
func (m *ListOrdersRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ListOrdersRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ListOrdersRequest proto.InternalMessageInfo

type isListOrdersRequest_Ids interface {
	isListOrdersRequest_Ids()
}

type ListOrdersRequest_UserId struct {
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3,oneof"`
}
type ListOrdersRequest_OrderIds_ struct {
	OrderIds *ListOrdersRequest_OrderIds `protobuf:"bytes,2,opt,name=order_ids,json=orderIds,proto3,oneof"`
}

func (*ListOrdersRequest_UserId) isListOrdersRequest_Ids()    {}
func (*ListOrdersRequest_OrderIds_) isListOrdersRequest_Ids() {}

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

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

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

// XXX_OneofFuncs is for the internal use of the proto package.
func (*ListOrdersRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _ListOrdersRequest_OneofMarshaler, _ListOrdersRequest_OneofUnmarshaler, _ListOrdersRequest_OneofSizer, []interface{}{
		(*ListOrdersRequest_UserId)(nil),
		(*ListOrdersRequest_OrderIds_)(nil),
	}
}

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

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

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

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

func (m *ListOrdersRequest_OrderIds) Reset()         { *m = ListOrdersRequest_OrderIds{} }
func (m *ListOrdersRequest_OrderIds) String() string { return proto.CompactTextString(m) }
func (*ListOrdersRequest_OrderIds) ProtoMessage()    {}
func (*ListOrdersRequest_OrderIds) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{18, 0}
}
func (m *ListOrdersRequest_OrderIds) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListOrdersRequest_OrderIds.Unmarshal(m, b)
}
func (m *ListOrdersRequest_OrderIds) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListOrdersRequest_OrderIds.Marshal(b, m, deterministic)
}
func (dst *ListOrdersRequest_OrderIds) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListOrdersRequest_OrderIds.Merge(dst, 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_v3_e164fdd8b81531d4, []int{19}
}
func (m *ListOrdersResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListOrdersResponse.Unmarshal(m, b)
}
func (m *ListOrdersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListOrdersResponse.Marshal(b, m, deterministic)
}
func (dst *ListOrdersResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListOrdersResponse.Merge(dst, src)
}
func (m *ListOrdersResponse) XXX_Size() int {
	return xxx_messageInfo_ListOrdersResponse.Size(m)
}
func (m *ListOrdersResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_ListOrdersResponse.DiscardUnknown(m)
}

var xxx_messageInfo_ListOrdersResponse proto.InternalMessageInfo

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

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

func (m *UpdateBookingRequest) Reset()         { *m = UpdateBookingRequest{} }
func (m *UpdateBookingRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateBookingRequest) ProtoMessage()    {}
func (*UpdateBookingRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{20}
}
func (m *UpdateBookingRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdateBookingRequest.Unmarshal(m, b)
}
func (m *UpdateBookingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdateBookingRequest.Marshal(b, m, deterministic)
}
func (dst *UpdateBookingRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdateBookingRequest.Merge(dst, 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_v3_e164fdd8b81531d4, []int{21}
}
func (m *UpdateBookingResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdateBookingResponse.Unmarshal(m, b)
}
func (m *UpdateBookingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdateBookingResponse.Marshal(b, m, deterministic)
}
func (dst *UpdateBookingResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdateBookingResponse.Merge(dst, 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_v3_e164fdd8b81531d4, []int{22}
}
func (m *Booking) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Booking.Unmarshal(m, b)
}
func (m *Booking) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Booking.Marshal(b, m, deterministic)
}
func (dst *Booking) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Booking.Merge(dst, 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_v3_e164fdd8b81531d4, []int{23}
}
func (m *BookingFailure) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BookingFailure.Unmarshal(m, b)
}
func (m *BookingFailure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BookingFailure.Marshal(b, m, deterministic)
}
func (dst *BookingFailure) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BookingFailure.Merge(dst, 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_v3_e164fdd8b81531d4, []int{24}
}
func (m *Order) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Order.Unmarshal(m, b)
}
func (m *Order) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Order.Marshal(b, m, deterministic)
}
func (dst *Order) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Order.Merge(dst, 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_v3_e164fdd8b81531d4, []int{25}
}
func (m *LineItem) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LineItem.Unmarshal(m, b)
}
func (m *LineItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LineItem.Marshal(b, m, deterministic)
}
func (dst *LineItem) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LineItem.Merge(dst, 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_v3_e164fdd8b81531d4, []int{25, 0}
}
func (m *LineItem_OrderedTickets) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LineItem_OrderedTickets.Unmarshal(m, b)
}
func (m *LineItem_OrderedTickets) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LineItem_OrderedTickets.Marshal(b, m, deterministic)
}
func (dst *LineItem_OrderedTickets) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LineItem_OrderedTickets.Merge(dst, 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_v3_e164fdd8b81531d4, []int{26}
}
func (m *OrderFailure) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OrderFailure.Unmarshal(m, b)
}
func (m *OrderFailure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OrderFailure.Marshal(b, m, deterministic)
}
func (dst *OrderFailure) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OrderFailure.Merge(dst, 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_v3_e164fdd8b81531d4, []int{27}
}
func (m *OrderFulfillability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OrderFulfillability.Unmarshal(m, b)
}
func (m *OrderFulfillability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OrderFulfillability.Marshal(b, m, deterministic)
}
func (dst *OrderFulfillability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OrderFulfillability.Merge(dst, 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_v3_e164fdd8b81531d4, []int{28}
}
func (m *LineItemFulfillability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LineItemFulfillability.Unmarshal(m, b)
}
func (m *LineItemFulfillability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LineItemFulfillability.Marshal(b, m, deterministic)
}
func (dst *LineItemFulfillability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LineItemFulfillability.Merge(dst, 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_v3_e164fdd8b81531d4, []int{28, 0}
}
func (m *LineItemFulfillability_UpdatedAvailability) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LineItemFulfillability_UpdatedAvailability.Unmarshal(m, b)
}
func (m *LineItemFulfillability_UpdatedAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LineItemFulfillability_UpdatedAvailability.Marshal(b, m, deterministic)
}
func (dst *LineItemFulfillability_UpdatedAvailability) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LineItemFulfillability_UpdatedAvailability.Merge(dst, src)
}
func (m *LineItemFulfillability_UpdatedAvailability) XXX_Size() int {
	return xxx_messageInfo_LineItemFulfillability_UpdatedAvailability.Size(m)
}
func (m *LineItemFulfillability_UpdatedAvailability) XXX_DiscardUnknown() {
	xxx_messageInfo_LineItemFulfillability_UpdatedAvailability.DiscardUnknown(m)
}

var xxx_messageInfo_LineItemFulfillability_UpdatedAvailability proto.InternalMessageInfo

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

// TicketType is used to differentiate among tickets (where a ticket can be a
// spot on a raft trip, an admission to a museum, etc.) with different prices
// and/or availabilities due to different user types or different service
// attributes.
type TicketType struct {
	// The ticket id is used to differentiate among different ticket types of the
	// same service, and is only expected to be unique within a service.
	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price                *Price   `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TicketType) Reset()         { *m = TicketType{} }
func (m *TicketType) String() string { return proto.CompactTextString(m) }
func (*TicketType) ProtoMessage()    {}
func (*TicketType) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{29}
}
func (m *TicketType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TicketType.Unmarshal(m, b)
}
func (m *TicketType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TicketType.Marshal(b, m, deterministic)
}
func (dst *TicketType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TicketType.Merge(dst, src)
}
func (m *TicketType) XXX_Size() int {
	return xxx_messageInfo_TicketType.Size(m)
}
func (m *TicketType) XXX_DiscardUnknown() {
	xxx_messageInfo_TicketType.DiscardUnknown(m)
}

var xxx_messageInfo_TicketType proto.InternalMessageInfo

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

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

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

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

func (m *ResourceIds) Reset()         { *m = ResourceIds{} }
func (m *ResourceIds) String() string { return proto.CompactTextString(m) }
func (*ResourceIds) ProtoMessage()    {}
func (*ResourceIds) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{30}
}
func (m *ResourceIds) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ResourceIds.Unmarshal(m, b)
}
func (m *ResourceIds) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ResourceIds.Marshal(b, m, deterministic)
}
func (dst *ResourceIds) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ResourceIds.Merge(dst, src)
}
func (m *ResourceIds) XXX_Size() int {
	return xxx_messageInfo_ResourceIds.Size(m)
}
func (m *ResourceIds) XXX_DiscardUnknown() {
	xxx_messageInfo_ResourceIds.DiscardUnknown(m)
}

var xxx_messageInfo_ResourceIds proto.InternalMessageInfo

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

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

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

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

func (m *PaymentProcessingParameters) Reset()         { *m = PaymentProcessingParameters{} }
func (m *PaymentProcessingParameters) String() string { return proto.CompactTextString(m) }
func (*PaymentProcessingParameters) ProtoMessage()    {}
func (*PaymentProcessingParameters) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{31}
}
func (m *PaymentProcessingParameters) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PaymentProcessingParameters.Unmarshal(m, b)
}
func (m *PaymentProcessingParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PaymentProcessingParameters.Marshal(b, m, deterministic)
}
func (dst *PaymentProcessingParameters) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PaymentProcessingParameters.Merge(dst, src)
}
func (m *PaymentProcessingParameters) XXX_Size() int {
	return xxx_messageInfo_PaymentProcessingParameters.Size(m)
}
func (m *PaymentProcessingParameters) XXX_DiscardUnknown() {
	xxx_messageInfo_PaymentProcessingParameters.DiscardUnknown(m)
}

var xxx_messageInfo_PaymentProcessingParameters proto.InternalMessageInfo

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

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

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

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

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

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

func (m *UserPaymentOption) Reset()         { *m = UserPaymentOption{} }
func (m *UserPaymentOption) String() string { return proto.CompactTextString(m) }
func (*UserPaymentOption) ProtoMessage()    {}
func (*UserPaymentOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{32}
}
func (m *UserPaymentOption) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UserPaymentOption.Unmarshal(m, b)
}
func (m *UserPaymentOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UserPaymentOption.Marshal(b, m, deterministic)
}
func (dst *UserPaymentOption) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UserPaymentOption.Merge(dst, 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_v3_e164fdd8b81531d4, []int{33}
}
func (m *PaymentInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PaymentInformation.Unmarshal(m, b)
}
func (m *PaymentInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PaymentInformation.Marshal(b, m, deterministic)
}
func (dst *PaymentInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PaymentInformation.Merge(dst, 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

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) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

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

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

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

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

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

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

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

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

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

// XXX_OneofFuncs is for the internal use of the proto package.
func (*PaymentInformation) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _PaymentInformation_OneofMarshaler, _PaymentInformation_OneofUnmarshaler, _PaymentInformation_OneofSizer, []interface{}{
		(*PaymentInformation_PaymentOptionId)(nil),
		(*PaymentInformation_UserPaymentOptionId)(nil),
	}
}

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

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

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

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

func (m *Price) Reset()         { *m = Price{} }
func (m *Price) String() string { return proto.CompactTextString(m) }
func (*Price) ProtoMessage()    {}
func (*Price) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{34}
}
func (m *Price) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Price.Unmarshal(m, b)
}
func (m *Price) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Price.Marshal(b, m, deterministic)
}
func (dst *Price) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Price.Merge(dst, 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_v3_e164fdd8b81531d4, []int{35}
}
func (m *NoShowFee) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NoShowFee.Unmarshal(m, b)
}
func (m *NoShowFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NoShowFee.Marshal(b, m, deterministic)
}
func (dst *NoShowFee) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NoShowFee.Merge(dst, 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_v3_e164fdd8b81531d4, []int{36}
}
func (m *Deposit) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Deposit.Unmarshal(m, b)
}
func (m *Deposit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Deposit.Marshal(b, m, deterministic)
}
func (dst *Deposit) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Deposit.Merge(dst, src)
}
func (m *Deposit) XXX_Size() int {
	return xxx_messageInfo_Deposit.Size(m)
}
func (m *Deposit) XXX_DiscardUnknown() {
	xxx_messageInfo_Deposit.DiscardUnknown(m)
}

var xxx_messageInfo_Deposit proto.InternalMessageInfo

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

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

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

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

func (m *Slot) Reset()         { *m = Slot{} }
func (m *Slot) String() string { return proto.CompactTextString(m) }
func (*Slot) ProtoMessage()    {}
func (*Slot) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{37}
}
func (m *Slot) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Slot.Unmarshal(m, b)
}
func (m *Slot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Slot.Marshal(b, m, deterministic)
}
func (dst *Slot) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Slot.Merge(dst, src)
}
func (m *Slot) XXX_Size() int {
	return xxx_messageInfo_Slot.Size(m)
}
func (m *Slot) XXX_DiscardUnknown() {
	xxx_messageInfo_Slot.DiscardUnknown(m)
}

var xxx_messageInfo_Slot proto.InternalMessageInfo

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

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

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

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

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

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

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

func (m *UserInformation) Reset()         { *m = UserInformation{} }
func (m *UserInformation) String() string { return proto.CompactTextString(m) }
func (*UserInformation) ProtoMessage()    {}
func (*UserInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_v3_e164fdd8b81531d4, []int{38}
}
func (m *UserInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UserInformation.Unmarshal(m, b)
}
func (m *UserInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UserInformation.Marshal(b, m, deterministic)
}
func (dst *UserInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UserInformation.Merge(dst, 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_v3_e164fdd8b81531d4, []int{39}
}
func (m *PostalAddress) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PostalAddress.Unmarshal(m, b)
}
func (m *PostalAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PostalAddress.Marshal(b, m, deterministic)
}
func (dst *PostalAddress) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PostalAddress.Merge(dst, src)
}
func (m *PostalAddress) XXX_Size() int {
	return xxx_messageInfo_PostalAddress.Size(m)
}
func (m *PostalAddress) XXX_DiscardUnknown() {
	xxx_messageInfo_PostalAddress.DiscardUnknown(m)
}

var xxx_messageInfo_PostalAddress proto.InternalMessageInfo

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

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

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

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

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

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

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

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