diff --git a/api/api.go b/api/api.go
index 13b8573..be96742 100644
--- a/api/api.go
+++ b/api/api.go
@@ -546,7 +546,7 @@
 
 	// UserId check first.
 	reqPB := &mpb.ListOrdersRequest{
-		UserId: userID,
+		Ids: &mpb.ListOrdersRequest_UserId{userID},
 	}
 	respUser, err := sendListOrdersRequest(reqPB, conn)
 	if err != nil {
@@ -558,9 +558,12 @@
 
 	// Still here? OrderId check.
 	reqPB.Reset()
+	var orderIDs mpb.ListOrdersRequest_OrderIds
 	for _, order := range orders {
-		reqPB.OrderId = append(reqPB.OrderId, order.GetOrderId())
+		orderIDs.OrderId = append(orderIDs.OrderId, order.GetOrderId())
 	}
+	reqPB.Ids = &mpb.ListOrdersRequest_OrderIds_{&orderIDs}
+
 	respOrder, err := sendListOrdersRequest(reqPB, conn)
 	if err != nil {
 		return err
diff --git a/proto/v3.proto b/proto/v3.proto
index 1c217bb..c443878 100644
--- a/proto/v3.proto
+++ b/proto/v3.proto
@@ -1,274 +1,219 @@
+// API v3 public interface declaration
 syntax = "proto3";
 
-package v3;
+package ext.maps.booking.partner.v3;
 
-// [START postaladdr_definition]
-// The postal address for a merchant.
-message PostalAddress {
-  // The country, e.g. "USA". (required)
-  string country = 1;
-  // The locality/city, e.g. "Mountain View". (required)
-  string locality = 2;
-  // The region/state/province, e.g. "CA". (required)
-  string region = 3;
-  // The postal code, e.g. "94043". (required)
-  string postal_code = 4;
-  // The street address, e.g. "1600 Amphitheatre Pkwy". (required)
-  string street_address = 5;
-}
-// [END postaladdr_definition]
+// +------+------------------------------+----------------------------------+
+// | Verb |          HTTP Path           |      Request/Response Body       |
+// +------+------------------------------+----------------------------------+
+// | GET  | /v3/HealthCheck              | -                                |
+// |      |                              | -                                |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/CheckAvailability        | CheckAvailabilityRequest         |
+// |      |                              | CheckAvailabilityResponse        |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/CreateBooking            | CreateBookingRequest             |
+// |      |                              | CreateBookingResponse            |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/UpdateBooking            | UpdateBookingRequest             |
+// |      |                              | UpdateBookingResponse            |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/GetBookingStatus         | GetBookingStatusRequest          |
+// |      |                              | GetBookingStatusResponse         |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/ListBookings             | ListBookingsRequest              |
+// |      |                              | ListBookingsResponse             |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/CheckOrderFulfillability | CheckOrderFulfillabilityRequest  |
+// |      |                              | CheckOrderFulfillabilityResponse |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/CreateOrder              | CreateOrderRequest               |
+// |      |                              | CreateOrderResponse              |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/ListOrders               | ListOrdersRequest                |
+// |      |                              | ListOrdersResponse               |
+// +------+------------------------------+----------------------------------+
 
-// [START geocoord_definition]
-// The Geo data of a location, including latitude, longitude, and address.
-message GeoCoordinates {
-  double latitude = 1;        // In degrees. (optional)
-  double longitude = 2;       // In degrees. (optional)
-  PostalAddress address = 3;  // (required)
-}
-// [END geocoord_definition]
+// CheckAvailability method
 
-// [START price_definition]
-// The price of a service or a fee.
-message Price {
-  // 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)
-  int64 price_micros = 1;
-  // The currency of the price that is defined in ISO 4217. (required)
-  string currency_code = 2;
-  // An optional and opaque string that identifies the pricing option that is
-  // associated with the extended price. (optional)
-  string pricing_option_tag = 3;
-}
-// [END price_definition]
-
-// [START taxrate_definition]
-// A tax rate applied when charging the user for a service, and which can be set
-// on either a per merchant, or per service basis.
-message TaxRate {
-  // A tax rate in millionths of one percent, effectively giving 6 decimals of
-  // precision. For example, if the tax rate is 7.253%, this field should be set
-  // to 7253000.
-  //
-  // If this field is left unset or set to 0, the total price charged to a user
-  // for any service provided by this merchant is the exact price specified by
-  // Service.price. The service price is assumed to be exempt from or already
-  // inclusive of applicable taxes. Taxes will not be shown to the user as a
-  // separate line item.
-  //
-  // If this field is set to any nonzero value, the total price charged to a
-  // user for any service provided by this merchant will include the service
-  // price plus the tax assessed using the tax rate provided here. Fractions of
-  // the smallest currency unit (for example, fractions of one cent) will be
-  // rounded using nearest even rounding. Taxes will be shown to the user as a
-  // separate line item. (required)
-  int32 micro_percent = 1;
-}
-// [END taxrate_definition]
-
-// [START schedulingrules_definition]
-// The scheduling rules for a service.
-message SchedulingRules {
-  // The minimum advance notice in seconds required to book an appointment.
-  // (optional)
-  int64 min_advance_booking = 1;
-
-  // The minimum advance notice in seconds required to cancel a booked
-  // appointment online. (optional)
-  int64 min_advance_online_canceling = 2;
-
-  // The fee for canceling within the minimum advance notice period.
-  Price late_cancellation_fee = 3 [deprecated = true];
-
-  // The fee for no-show without canceling.
-  Price noshow_fee = 4 [deprecated = true];
-}
-// [END schedulingrules_definition]
-
-// This defines the ingestion source type.
-enum IngestionSource {
-  SOURCE_UNKNOWN = 0;
-
-  // This ingestion is from an uploaded feed file.
-  SOURCE_FEED = 1;
-
-  // This ingestion is from an API call.
-  SOURCE_API = 2;
+// Request to check availability for a Slot.
+message CheckAvailabilityRequest {
+  // The appointment slot that is being checked (required)
+  Slot slot = 1;
 }
 
-// An empty boilplate proto for the Ingestion Queue in Spanner.
-message IngestionQueuePayload {
-}
+// Response for the CheckAvailability RPC with the availability of the
+// appointment slot.
+message CheckAvailabilityResponse {
+  // The requested slot. (required)
+  Slot slot = 1;
+  // Number of available spots.
+  // 0 indicates that the appointment slot is not available. (required)
+  int32 count_available = 2;
+  // This enum indicates what requirements exist for the user to acknowledge or
+  // view the requested slots duration/end time.
+  enum DurationRequirement {
+    // The handling of the end time is not specified. This is the default.
+    DURATION_REQUIREMENT_UNSPECIFIED = 0;
 
-// The types of content that we can ingest through feeds or APIs.
-enum ContentType {
-  CONTENT_UNKNOWN = 0;
-  CONTENT_MERCHANT = 1;
-  CONTENT_SERVICE = 2;
-  CONTENT_AVAILABILITY = 3;
-  CONTENT_PAYMENT_OPTION = 4;
-  CONTENT_PAYMENT_OPTION_SERVICE = 5;
-}
+    // The end time is not shown to the user.
+    DO_NOT_SHOW_DURATION = 1;
 
-message IngestionStatus {
-  // The status code of an Ingestion event: a feed upload or an API call.
-  // Only used for logging the ingestion status in the IngestionMetadata
-  // table, do NOT use it in the code's control flow.
-  enum Code {
-    // An unknown status for Ingestion, shouldn't use it.
-    STATUS_UNKNOWN = 0;
-
-    // 1-99 for Feed upload.
-    // A feed has been uploaded.
-    STATUS_FEED_UPLOADED = 1;
-    // A feed has been added to the Ingestion Queue.
-    STATUS_FEED_ENQUEUED = 2;
-    // A feed has been picked up from the queue and started processing.
-    STATUS_FEED_PROCESSING_STARTED = 3;
-    // A feed has been processed successfully.
-    STATUS_FEED_PROCESSING_SUCCEEDED = 4;
-    // A feed has failed the processing.
-    STATUS_FEED_PROCESSING_FAILED = 5;
-    // A feed duplicate was uploaded.
-    STATUS_FEED_DUPLICATED = 6;
-
-    // 101-199 for API.
-    // An API has been called.
-    STATUS_API_CALLED = 101;
-    // An API has been processed successfully.
-    STATUS_API_PROCESSING_SUCCEEDED = 102;
-    // An API has failed the processing.
-    STATUS_API_PROCESSING_FAILED = 103;
+    // The end time has to be shown to the user before an appointment can be
+    // made.
+    MUST_SHOW_DURATION = 2;
   }
+  // The requirement to show the slots duration and/or endtime. This field will
+  // be ignored if the slot is unavailable. (optional)
+  DurationRequirement duration_requirement = 3;
 
-  // The code of the status.
-  Code code = 1;
-
-  // Microseconds since epoch when the ingestion updates its status code.
-  int64 timestamp_micros = 2;
-
-  // A human description of the error if any.
-  string internal_error_details = 3;
-  string partner_visible_error_details = 4;
+  // 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 availability_update = 4;
 }
 
-// [START timerange_definition]
-// A closed-open time range, i.e. [begin_sec, end_sec)
-message TimeRange {
-  // Seconds of UTC time since Unix epoch (required)
-  int64 begin_sec = 1;
-  // Seconds of UTC time since Unix epoch (required)
-  int64 end_sec = 2;
+// An update to one ore more slots indicating that the availability for the
+// associated time has potentially changed.
+message AvailabilityUpdate {
+  repeated SlotAvailability slot_availability = 1;
 }
-// [END timerange_definition]
 
-// [START pricetype_definition]
-// Defines how a total price is determined from an availability.
-enum PriceType {
-  // The price is for a fixed amount. This is the default value if the field is
-  // not set.
-  FIXED_RATE_DEFAULT = 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.
-  PER_PERSON = 1;
+// An inventory slot and associated count of open spots.
+message SlotAvailability {
+  Slot slot = 1;
+  // Number of available spots.
+  // 0 indicates that the appointment slot is not available. (required)
+  int32 count_available = 2;
 }
-// [END pricetype_definition]
 
-// [START noshowfee_definition]
-// A fee that a user may be charged if they have made a booking but do not
-// show up.
-message NoShowFee {
-  // The amount the user may be charged if they do not show up for their
-  // reservation.
-  Price fee = 1;
+// CheckOrderFulfillability method
 
-  // Defines how the fee is determined from the availability.
-  PriceType fee_type = 3;
-}
-// [END noshowfee_definition]
-
-// [START deposit_definition]
-// A deposit that the user may be charged or have a hold on their credit card
-// for.
-message Deposit {
-  // Deposit amount.
-  Price deposit = 1;
-
-  // Minimum advance cancellation for the deposit.
-  int64 min_advance_cancellation_sec = 2;
-
-  // Defines how the deposit is determined from the availability.
-  PriceType deposit_type = 3;
-}
-// [END deposit_definition]
-
-// [START RequireCreditCard_definition]
-// Defines whether a credit card is required in order to book an appointment.
-enum RequireCreditCard {
-  // The credit card requirement is not explicitly specified and the
-  // behaviour is identical to the one specified for CONDITIONAL.
-  REQUIRE_CREDIT_CARD_UNSPECIFIED = 0;
-
-  // Google will require a credit card for the booking if any of the following
-  // conditions are met:
-  // * the availability has a price and the prepayment_type is REQUIRED
-  // * the no_show_fee is set
-  // * the deposit field is set.
-  REQUIRE_CREDIT_CARD_CONDITIONAL = 1;
-
-  // A credit card is always required in order to book this availability
-  // regardless of other field values.
-  REQUIRE_CREDIT_CARD_ALWAYS = 2;
-}
-// [END RequireCreditCard_definition]
-
-// [START ActionLink_definition]
-// An action URL with associated language and list of countries restricted to.
-message ActionLink {
-  // The entry point URL for this action link.
-  string url = 1;
-
-  // The BCP-47 language tag identifying the language in which the content
-  // from this URI is available.
-  string language = 2;
-
-  // ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
-  repeated string restricted_country = 3;
-}
-// [END ActionLink_definition]
-
-// [START message_slot]
-// An inventory slot
-message Slot {
-  // ID of the merchant for the slot (required)
+// Request to check the fulfillability of an order.
+message CheckOrderFulfillabilityRequest {
+  // The merchant that this order is intended for. (required)
   string merchant_id = 1;
 
-  // ID of the merchant service (required)
-  string service_id = 2;
-
-  // Start time of the appointment slot in seconds of UTC time since Unix epoch.
-  // (required)
-  int64 start_sec = 3;
-
-  // Duration of the appointment slot (required)
-  int64 duration_sec = 4;
-
-  // Opaque tag that identifies the availability slot and matches the value
-  // provided in the availability feed (optional)
-  string availability_tag = 5;
-
-  // The set of resources that disambiguates the appointment slot, e.g. by
-  // indicating the staff member and room selected by the user (optional)
-  ResourceIds resources = 6;
+  // The line items in this order. All services requested must belong to the
+  // specified merchant. (required)
+  repeated LineItem item = 2;
 }
-// [END message_slot]
 
-// [START message_lease]
+// Response for the CheckOrderfulfillabilityRequest.
+message CheckOrderFulfillabilityResponse {
+  // Fulfillability status of the order, potentially contains updated
+  // availabilities and prices of the requested line item. (required)
+  OrderFulfillability fulfillability = 1;
+
+  // Total processing fees & taxes that need to be paid for this order.
+  // (required)
+  Price fees_and_taxes = 2;
+}
+
+// GetBookingStatus method
+
+// Request to get booking status and prepayment status for a Booking.
+message GetBookingStatusRequest {
+  // ID of the existing booking (required)
+  string booking_id = 1;
+}
+
+// Response for the GetBookingStatus RPC with booking status and prepayment
+// status.
+message GetBookingStatusResponse {
+  // ID of the booking (required)
+  string booking_id = 1;
+
+  // Status of the booking (required)
+  BookingStatus booking_status = 2;
+
+  // Prepayment status of the booking (required)
+  PrepaymentStatus prepayment_status = 3;
+}
+
+// CreateBooking method
+
+// Request to create a Booking for an inventory slot. Consumes the lease if
+// provided.
+message CreateBookingRequest {
+  // 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 = 1;
+
+  // The lease that is being confirmed to make this booking.
+  // If lease_ref is provided, then create the booking using the lease.
+  // (optional)
+  LeaseReference lease_ref = 2;
+
+  // Personal information of the user making the appointment (required)
+  UserInformation user_information = 3;
+
+  // Information about payments. When payment authorizations are handled by
+  // Google, if the booking request does not succeed, payment authorizations are
+  // automatically canceled. (optional)
+  PaymentInformation payment_information = 4;
+
+  // 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 payment_processing_parameters =
+      5;
+
+  // Idempotency token for CreateBooking requests. (required)
+  string idempotency_token = 6;
+
+  // A string from the user which contains any special requests or additional
+  // information that they would like to notify the merchant about. (optional)
+  string additional_request = 7;
+}
+
+// Response with the created Booking for an inventory slot.
+message CreateBookingResponse {
+  // The created booking (required)
+  Booking booking = 1;
+
+  // 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 user_payment_option = 2;
+
+  // 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 booking_failure = 3;
+}
+
+// CreateLease method
+
+// 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.
+message CreateLeaseRequest {
+  // The lease to be created with information about the appointment slot
+  // (required)
+  Lease lease = 1;
+}
+
+// Response for the CreateLease RPC with the created Lease.
+message CreateLeaseResponse {
+  // The created Lease (required)
+  Lease lease = 1;
+
+  // 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 booking_failure = 2;
+}
+
 // Temporary lease for an inventory slot
 message Lease {
   // ID of the lease.
@@ -292,9 +237,111 @@
   // Lease ID (required)
   string lease_id = 1;
 }
-// [END message_lease]
 
-// [START message_booking]
+// CreateOrder method
+
+// Request to create an order.
+message CreateOrderRequest {
+  // The order to create. (required)
+  Order order = 1;
+
+  // 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 payment_processing_parameters = 2;
+
+  // Idempotency token for CreateOrder requests. (required)
+  string idempotency_token = 3;
+}
+
+// Response for the CreateOrderRequest.
+message CreateOrderResponse {
+  // 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.
+  oneof result {
+    // The order created.
+    Order order = 1;
+
+    // If creating an order fails, this field should reflect the business logic
+    // error (e.g., slot has become unavailable or price has changed).
+    OrderFailure order_failure = 2;
+  }
+}
+
+// ListBookings method
+
+// Request to list all bookings for a user
+message ListBookingsRequest {
+  // ID of the user (required)
+  string user_id = 1;
+}
+
+// Response for the ListBookings RPC with all bookings for the requested user.
+message ListBookingsResponse {
+  // All bookings of the user (required)
+  repeated Booking bookings = 1;
+}
+
+// ListOrders method
+
+// Request to list orders.
+message ListOrdersRequest {
+  message OrderIds {
+    repeated string order_id = 1;
+  }
+
+  // Request of orders either by user ID, or by order ID.
+  oneof ids {
+    // If set, return all orders belong to the user.
+    string user_id = 1;
+
+    // If set, return the specified orders.
+    OrderIds order_ids = 2;
+  }
+}
+
+// Response for the ListOrders RPC.
+message ListOrdersResponse {
+  // All requested orders (required)
+  repeated Order order = 1;
+}
+
+// UpdateBooking method
+
+// Request to update a Booking.
+message UpdateBookingRequest {
+  // 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 = 1;
+}
+
+// Response with the updated Booking.
+message UpdateBookingResponse {
+  // The updated booking (required)
+  Booking booking = 1;
+
+  // 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 user_payment_option = 2;
+
+  // If updating a booking fails, this field should reflect the business logic
+  // error (e.g., booking is not cancellable) (required if failure occurs)
+  BookingFailure booking_failure = 3;
+}
+
+// Booking specification
+
 // A booking for an inventory slot
 message Booking {
   // ID of this booking (required)
@@ -313,33 +360,286 @@
   // (optional)
   PaymentInformation payment_information = 5;
 }
-// [END message_booking]
 
-// [START user_definition]
-// Personal information about the person making a booking
-message UserInformation {
-  // Unique ID of the user to the partner, chosen by Reserve with Google.
-  // (required)
-  string user_id = 1;
+// BookingStatus specification
 
-  // Given name of the user (required)
-  string given_name = 2;
-
-  // Family name of the user (required)
-  string family_name = 3;
-
-  // Address of the user (optional)
-  PostalAddress address = 4;
-
-  // Phone number of the user (required)
-  string telephone = 5;
-
-  // Email address of the user (required)
-  string email = 6;
+// 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
+enum BookingStatus {
+  // Not specified.
+  BOOKING_STATUS_UNSPECIFIED = 0;
+  // Booking has been confirmed
+  CONFIRMED = 1;
+  // Booking is awaiting confirmation by the merchant before it can transition
+  // into CONFIRMED status
+  PENDING_MERCHANT_CONFIRMATION = 2;
+  // Booking has been canceled on behalf of the user.
+  // The merchant can still trigger a manual refund.
+  CANCELED = 3;
+  // User did not show for the appointment
+  NO_SHOW = 4;
+  // User did not show for the appointment in violation of the cancellation
+  // policy.
+  NO_SHOW_PENALIZED = 5;
 }
-// [END user_definition]
 
-// [START paymentprocessing_definition]
+// BookingFailure specification
+
+// 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.
+message BookingFailure {
+  enum Cause {
+    // Default value: Don't use; amounts to an "unknown error"
+    CAUSE_UNSPECIFIED = 0;
+    // The referenced availability slot is not available any longer.
+    SLOT_UNAVAILABLE = 1;
+    // The user has already booked an appointment for the referenced
+    // availability slot.
+    SLOT_ALREADY_BOOKED_BY_USER = 2;
+    // The lease (if provided) has expired and cannot be used any longer to
+    // complete the requested booking.
+    LEASE_EXPIRED = 3;
+    // The requested cancellation cannot be performed at the current time due
+    // to time restrictions in the merchant's cancellation policy.
+    OUTSIDE_CANCELLATION_WINDOW = 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.
+    PAYMENT_ERROR_CARD_TYPE_REJECTED = 5;
+    // An error was encountered while processing the payment because the
+    // provided credit card was declined.
+    PAYMENT_ERROR_CARD_DECLINED = 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.
+    PAYMENT_OPTION_NOT_VALID = 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.
+    PAYMENT_ERROR = 8;
+    // User cannot use the given payment option (e.g. user trying to use a
+    // first time price for the second time).
+    USER_CANNOT_USE_PAYMENT_OPTION = 9;
+    // A booking that the user tried to cancel has already been cancelled.
+    BOOKING_ALREADY_CANCELLED = 10;
+    // A booking that the user tried to cancel is not cancellable.
+    BOOKING_NOT_CANCELLABLE = 11;
+    // User has an existing reservation too close to this time.
+    OVERLAPPING_RESERVATION = 12;
+  }
+  // The reason why the booking failed. (required)
+  Cause cause = 1;
+
+  // (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
+  CreditCardType rejected_card_type = 2;
+
+  // This optional field is used for the partner to include additional
+  // information for debugging purpose only. (optional)
+  string description = 3;
+}
+
+// Used when booking/order failure cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to
+// indicate the type of credit card that was rejected.
+enum CreditCardType {
+  // Default value. Used if credit card type does not match to one below.
+  CREDIT_CARD_TYPE_UNSPECIFIED = 0;
+  VISA = 1;
+  MASTERCARD = 2;
+  AMERICAN_EXPRESS = 3;
+  DISCOVER = 4;
+}
+
+// Order specification
+
+// An order for service appointments with a merchant.
+message Order {
+  // ID of this Order, chosen by the booking partner who handles the order
+  // (required in CreateOrderResponse and ListOrdersResponse, must not be set in
+  // CreateOrderRequest)
+  string order_id = 1;
+  // Personal information of the user making the order (required)
+  UserInformation user_information = 2;
+  // Information about payment transactions that relate to the Order.
+  // (optional)
+  PaymentInformation payment_information = 3;
+  // The merchant that all services in this Order belong to.
+  string merchant_id = 4;
+  // Line items in this order.
+  repeated LineItem item = 5;
+}
+
+// A single item in an Order--the booking of a single service in a single time
+// slot.
+message LineItem {
+  // ID of the merchant Service. (required)
+  string service_id = 1;
+  // Start time of the appointment slot in seconds of UTC time since Unix epoch.
+  // (required)
+  int64 start_sec = 2;
+  // Duration of the appointment slot in seconds. (required)
+  int64 duration_sec = 3;
+
+  message OrderedTickets {
+    string ticket_id = 1;
+    int32 count = 2;
+  }
+  // Number of tickets ordered by Ticket Type.
+  repeated OrderedTickets tickets = 4;
+
+  // 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 = 5;
+
+  // Status of the Line Item. (required in CreateOrderResponse and
+  // ListOrdersResponse; should not be set in requests)
+  BookingStatus status = 6;
+}
+
+// Status data that conveys why creating an order fails.
+// OrderFailure is intended to primarily capture business logic errors.
+message OrderFailure {
+  enum Cause {
+    // Default value: Don't use; amounts to an "unknown error"
+    CAUSE_UNSPECIFIED = 0;
+    // The order is no longer fulfillable.
+    ORDER_UNFULFILLABLE = 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.
+    PAYMENT_ERROR_CARD_TYPE_REJECTED = 2;
+    // An error was encountered while processing the payment because the
+    // provided credit card was declined.
+    PAYMENT_ERROR_CARD_DECLINED = 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.
+    PAYMENT_ERROR = 4;
+  }
+  // The reason why the order failed. (required)
+  Cause cause = 1;
+
+  // (required only if cause is ORDER_UNFULFILLABLE)
+  OrderFulfillability fulfillability = 2;
+
+  // (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
+  CreditCardType rejected_card_type = 3;
+
+  // This optional field is used for the partner to include additional
+  // information for debugging purpose only. (optional)
+  string description = 4;
+}
+
+// OrderFulfillability specification
+
+message OrderFulfillability {
+  // The result of an order fulfillability check.
+  enum OrderFulfillabilityResult {
+    // Default value: Don't use.
+    ORDER_FULFILLABILITY_RESULT_UNSPECIFIED = 0;
+    // The order can be fulfilled.
+    CAN_FULFILL = 1;
+    // The order cannot be fulfilled due to one or more unfulfillable line
+    // item(s).
+    UNFULFILLABLE_LINE_ITEM = 2;
+    // The combination of the line items requested cannot be fulfilled.
+    UNFULFILLABLE_SERVICE_COMBINATION = 3;
+    // The order cannot be fulfilled due to reasons that do not fall into the
+    // categories above.
+    ORDER_UNFULFILLABLE_OTHER_REASON = 4;
+  }
+
+  OrderFulfillabilityResult result = 1;
+  // Fulfillability results of all line items in this order (required).
+  repeated LineItemFulfillability item_fulfillability = 2;
+  // Additional description of the reason if the item is unfulfillable.
+  // (optional)
+  string unfulfillable_reason = 3;
+}
+
+// Fulfillability of a line item.
+message LineItemFulfillability {
+  // The line item of question. (required)
+  LineItem item = 1;
+
+  // The result of a line item fulfillability check.
+  enum ItemFulfillabilityResult {
+    // Default value: Don't use.
+    ITEM_FULFILLABILITY_RESULT_UNSPECIFIED = 0;
+    // This line item can be fulfilled.
+    CAN_FULFILL = 1;
+    // No adequate availability for the slot requested.
+    SLOT_UNAVAILABLE = 2;
+    // The combination of ticket types requested cannot be fulfilled.
+    UNFULFILLABLE_TICKET_COMBINATION = 3;
+    // The total price of this line item is not correct.
+    INCORRECT_PRICE = 4;
+    // The line item cannot be fulfilled for reasons that do not fall into
+    // the categories above.
+    ITEM_UNFULFILLABLE_OTHER_REASON = 5;
+  }
+  // (required)
+  ItemFulfillabilityResult result = 2;
+  // Additional description of the reason if the item is unfulfillable.
+  // (optional)
+  string unfulfillable_reason = 3;
+  // Updated availability for this slot can be piggybacked in
+  // CheckOrderFulfillabilityResponse.
+  message UpdatedAvailability {
+    // Number of available spots for the given slot. 0 indicates no
+    // availability. (required)
+    int32 spots_open = 1;
+  }
+  // (optional)
+  UpdatedAvailability availability = 4;
+  // 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)
+  repeated TicketType ticket_type = 5;
+}
+
+// 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.
+message TicketType {
+  // 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.
+  string ticket_type_id = 1;
+
+  // This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
+  string short_description = 2;
+
+  // 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 = 3;
+}
+
+// Other specifications
+
+// Resource specification that disambiguates an appointment slot
+message ResourceIds {
+  // The staff ID as provided in the feed or empty if not applicable or no staff
+  // was selected. (optional)
+  string staff_id = 1;
+  // The room ID as provided in the feed or empty if not applicable or no room
+  // was selected. (optional)
+  string room_id = 2;
+  // For Dining Reservations only: the number of seats requested in the booking.
+  // (optional)
+  int32 party_size = 3;
+}
+
+// Payment specification
+
 message PaymentProcessingParameters {
   enum PaymentProcessor {
     PAYMENT_PROCESSOR_UNSPECIFIED = 0;
@@ -386,18 +686,14 @@
   // (required)
   string payment_processor = 4;
 }
-// [END paymentprocessing_definition]
 
-// [START paymentoption_definition]
 enum PaymentOptionType {
   PAYMENT_OPTION_TYPE_UNSPECIFIED = 0;
   PAYMENT_OPTION_SINGLE_USE = 1;
   PAYMENT_OPTION_MULTI_USE = 2;
   PAYMENT_OPTION_UNLIMITED_USE = 3;
 }
-// [END paymentoption_definition]
 
-// [START userpaymentoption_definition]
 // 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
@@ -426,9 +722,7 @@
   // payment option. (required)
   string payment_option_id = 7;
 }
-// [END userpaymentoption_definition]
 
-// [START paymentinfo_definition]
 // Payment details that are sent when creating a new booking.
 message PaymentInformation {
   // Prepayment status of the booking.
@@ -441,7 +735,10 @@
   PrepaymentStatus prepayment_status = 1;
 
   // Unique identifier for a payment transaction associated with the booking.
-  // Empty if not applicable. (required)
+  // 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.
   string payment_transaction_id = 2;
 
   // These fields must match the service price (specified in the Services feed)
@@ -505,101 +802,7 @@
   // CreateOrder method). (optional)
   Price fees_and_taxes = 10;
 }
-// [END paymentinfo_definition]
 
-// [START bookingstatus_definition]
-// 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
-enum BookingStatus {
-  // Not specified.
-  BOOKING_STATUS_UNSPECIFIED = 0;
-  // Booking has been confirmed
-  CONFIRMED = 1;
-  // Booking is awaiting confirmation by the merchant before it can transition
-  // into CONFIRMED status
-  PENDING_MERCHANT_CONFIRMATION = 2;
-  // Booking has been canceled on behalf of the user.
-  // The merchant can still trigger a manual refund.
-  CANCELED = 3;
-  // User did not show for the appointment
-  NO_SHOW = 4;
-  // User did not show for the appointment in violation of the cancellation
-  // policy.
-  NO_SHOW_PENALIZED = 5;
-}
-// [END bookingstatus_definition]
-
-// [START creditcardtype_definition]
-// Used when booking/order failure cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to
-// indicate the type of credit card that was rejected.
-enum CreditCardType {
-  // Default value. Used if credit card type does not match to one below.
-  CREDIT_CARD_TYPE_UNSPECIFIED = 0;
-  VISA = 1;
-  MASTERCARD = 2;
-  AMERICAN_EXPRESS = 3;
-  DISCOVER = 4;
-}
-// [END creditcardtype_definition]
-
-// [START bookingfailure_definition]
-// 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.
-message BookingFailure {
-  enum Cause {
-    // Default value: Don't use; amounts to an "unknown error"
-    CAUSE_UNSPECIFIED = 0;
-    // The referenced availability slot is not available any longer.
-    SLOT_UNAVAILABLE = 1;
-    // The user has already booked an appointment for the referenced
-    // availability slot.
-    SLOT_ALREADY_BOOKED_BY_USER = 2;
-    // The lease (if provided) has expired and cannot be used any longer to
-    // complete the requested booking.
-    LEASE_EXPIRED = 3;
-    // The requested cancellation cannot be performed at the current time due
-    // to time restrictions in the merchant's cancellation policy.
-    OUTSIDE_CANCELLATION_WINDOW = 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.
-    PAYMENT_ERROR_CARD_TYPE_REJECTED = 5;
-    // An error was encountered while processing the payment because the
-    // provided credit card was declined.
-    PAYMENT_ERROR_CARD_DECLINED = 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.
-    PAYMENT_OPTION_NOT_VALID = 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.
-    PAYMENT_ERROR = 8;
-    // User cannot use the given payment option (e.g. user trying to use a
-    // first time price for the second time).
-    USER_CANNOT_USE_PAYMENT_OPTION = 9;
-    // A booking that the user tried to cancel has already been cancelled.
-    BOOKING_ALREADY_CANCELLED = 10;
-    // A booking that the user tried to cancel is not cancellable.
-    BOOKING_NOT_CANCELLABLE = 11;
-  }
-  // The reason why the booking failed. (required)
-  Cause cause = 1;
-
-  // (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
-  CreditCardType rejected_card_type = 2;
-
-  // This optional field is used for the partner to include additional
-  // information for debugging purpose only. (optional)
-  string description = 3;
-}
-// [END bookingfailure_definition]
-
-// [START prepaymentstatus_definition]
 // Prepayment status of a booking.
 // Updating payment status will trigger an update on the payment status of the
 // associated booking (if applicable).
@@ -621,465 +824,119 @@
   // UserPaymentOption.
   PREPAYMENT_CREDITED = 4;
 }
-// [END prepaymentstatus_definition]
 
-// [START message_slot_availability]
-// An inventory slot and associated count of open spots.
-message SlotAvailability {
-  Slot slot = 1;
-  // Number of available spots.
-  // 0 indicates that the appointment slot is not available. (required)
-  int32 count_available = 2;
-}
-// [END message_slot_availability]
-
-// [START message_availability_update]
-// An update to one ore more slots indicating that the availability for the
-// associated time has potentially changed.
-message AvailabilityUpdate {
-  repeated SlotAvailability slot_availability = 1;
-}
-// [END message_availability_update]
-
-// [START resources_definition]
-// Resource specification that disambiguates an appointment slot
-message ResourceIds {
-  // The staff ID as provided in the feed or empty if not applicable or no staff
-  // was selected. (optional)
-  string staff_id = 1;
-  // The room ID as provided in the feed or empty if not applicable or no room
-  // was selected. (optional)
-  string room_id = 2;
-  // For Dining Reservations only: the number of seats requested in the booking.
-  // (optional)
-  int32 party_size = 3;
-}
-// [END resources_definition]
-
-// [START tickettype_definition]
-// 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.
-message TicketType {
-  // 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.
-  string ticket_type_id = 1;
-
-  // This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
-  string short_description = 2;
-
-  // 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 = 3;
-}
-// [END tickettype_definition]
-
-// [START lineitem_definition]
-// A single item in an order--the booking of a single service in a single time
-// slot.
-message LineItem {
-  // ID of the merchant service. (required)
-  string service_id = 1;
-  // Start time of the appointment slot in seconds of UTC time since Unix epoch.
+// The price of a service or a fee.
+message Price {
+  // 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)
-  int64 start_sec = 2;
-  // Duration of the appointment slot in seconds. (required)
-  int64 duration_sec = 3;
-
-  message OrderedTickets {
-    string ticket_id = 1;
-    int32 count = 2;
-  }
-  // Number of tickets ordered by type.
-  repeated OrderedTickets tickets = 4;
-
-  // 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 = 5;
-
-  // Status of the line item. (required in CreateOrderResponse and
-  // ListOrdersResponse; should not be set in requests)
-  BookingStatus status = 6;
-}
-// [END lineitem_definition]
-
-// [START lineitemfulfillability_definition]
-// Fulfillability of a line item.
-message LineItemFulfillability {
-  // The line item of question. (required)
-  LineItem item = 1;
-
-  // The result of a line item fulfillability check.
-  enum ItemFulfillabilityResult {
-    // Default value: Don't use.
-    ITEM_FULFILLABILITY_RESULT_UNSPECIFIED = 0;
-    // This line item can be fulfilled.
-    CAN_FULFILL = 1;
-    // No adequate availability for the slot requested.
-    SLOT_UNAVAILABLE = 2;
-    // The combination of ticket types requested cannot be fulfilled.
-    UNFULFILLABLE_TICKET_COMBINATION = 3;
-    // The total price of this line item is not incorrect.
-    INCORRECT_PRICE = 4;
-    // The line item cannot be fulfilled for reasons that do not fall into
-    // the categories above.
-    ITEM_UNFULFILLABLE_OTHER_REASON = 5;
-  }
-  // (required)
-  ItemFulfillabilityResult result = 2;
-  // Additional description of the reason if the item is unfulfillable.
-  // (optional)
-  string unfulfillable_reason = 3;
-  // Updated availability for this slot can be piggybacked in
-  // CheckOrderFulfillabilityResponse. (optional)
-  int32 spots_open = 4;
-  // 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)
-  repeated TicketType ticket_type = 5;
-}
-// [END lineitemfulfillability_definition]
-
-// [START orderfulfillability_definition]
-message OrderFulfillability {
-  // The result of an order fulfillability check.
-  enum OrderFulfillabilityResult {
-    // Default value: Don't use.
-    ORDER_FULFILLABILITY_RESULT_UNSPECIFIED = 0;
-    // The order can be fulfilled.
-    CAN_FULFILL = 1;
-    // The order cannot be fulfilled due to one or more unfulfillable line
-    // item(s).
-    UNFULFILLABLE_LINE_ITEM = 2;
-    // The combination of the line items requested cannot be fulfilled.
-    UNFULFILLABLE_SERVICE_COMBINATION = 3;
-    // The order cannot be fulfilled due to reasons that do not fall into the
-    // categories above.
-    ORDER_UNFULFILLABLE_OTHER_REASON = 4;
-  }
-
-  OrderFulfillabilityResult result = 1;
-  // Fulfillability results of all line items in this order (required).
-  repeated LineItemFulfillability item_fulfillability = 2;
-  // Additional description of the reason if the item is unfulfillable.
-  // (optional)
-  string unfulfillable_reason = 3;
-}
-// [END orderfulfillability_definition]
-
-// [START order_definition]
-// An order for service appointments with a merchant.
-message Order {
-  // ID of this order, chosen by the booking partner who handles the order
-  // (required in CreateOrderResponse and ListOrdersResponse, must not be set in
-  // CreateOrderRequest)
-  string order_id = 1;
-  // Personal information of the user making the order (required)
-  UserInformation user_information = 2;
-  // Information about payment transactions that relate to the order.
-  // (optional)
-  PaymentInformation payment_information = 3;
-  // The merchant that all services in this order belong to.
-  string merchant_id = 4;
-  // Line items in this order.
-  repeated LineItem item = 5;
-}
-// [END order_definition]
-
-// [START orderfailure_definition]
-// Status data that conveys why creating an order fails.
-// OrderFailure is intended to primarily capture business logic errors.
-message OrderFailure {
-  enum Cause {
-    // Default value: Don't use; amounts to an "unknown error"
-    CAUSE_UNSPECIFIED = 0;
-    // The order is no longer fulfillable.
-    ORDER_UNFULFILLABLE = 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.
-    PAYMENT_ERROR_CARD_TYPE_REJECTED = 2;
-    // An error was encountered while processing the payment because the
-    // provided credit card was declined.
-    PAYMENT_ERROR_CARD_DECLINED = 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.
-    PAYMENT_ERROR = 4;
-  }
-  // The reason why the order failed. (required)
-  Cause cause = 1;
-
-  // (required only if cause is ORDER_UNFULFILLABLE)
-  OrderFulfillability fulfillability = 2;
-
-  // (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
-  CreditCardType rejected_card_type = 3;
-
-  // This optional field is used for the partner to include additional
-  // information for debugging purpose only. (optional)
-  string description = 4;
-}
-// [END orderfailure_definition]
-
-// [START method_check_availability]
-// Request to check availability for a Slot.
-message CheckAvailabilityRequest {
-  // The appointment slot that is being checked (required)
-  Slot slot = 1;
+  int64 price_micros = 1;
+  // The currency of the price that is defined in ISO 4217. (required)
+  string currency_code = 2;
+  // An optional and opaque string that identifies the pricing option that is
+  // associated with the extended price. (optional)
+  string pricing_option_tag = 3;
 }
 
-// Response for the CheckAvailability RPC with the availability of the
-// appointment slot.
-message CheckAvailabilityResponse {
-  // The requested slot. (required)
-  Slot slot = 1;
-  // Number of available spots.
-  // 0 indicates that the appointment slot is not available. (required)
-  int32 count_available = 2;
-  // This enum indicates what requirements exist for the user to acknowledge or
-  // view the requested slots duration/end time.
-  enum DurationRequirement {
-    // The handling of the end time is not specified. This is the default.
-    DURATION_REQUIREMENT_UNSPECIFIED = 0;
-
-    // The end time is not shown to the user.
-    DO_NOT_SHOW_DURATION = 1;
-
-    // The end time has to be shown to the user before an appointment can be
-    // made.
-    MUST_SHOW_DURATION = 2;
-  }
-  // The requirement to show the slots duration and/or endtime. This field will
-  // be ignored if the slot is unavailable. (optional)
-  DurationRequirement duration_requirement = 3;
-
-  // 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 availability_update = 4;
-}
-// [END method_check_availability]
-
-// [START method_get_booking_status]
-// Request to get booking status and prepayment status for a Booking.
-message GetBookingStatusRequest {
-  // ID of the existing booking (required)
-  string booking_id = 1;
+// Defines how a total price is determined from an availability.
+enum PriceType {
+  // The price is for a fixed amount. This is the default value if the field is
+  // not set.
+  FIXED_RATE_DEFAULT = 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.
+  PER_PERSON = 1;
 }
 
-// Response for the GetBookingStatus RPC with booking status and prepayment
-// status.
-message GetBookingStatusResponse {
-  // ID of the booking (required)
-  string booking_id = 1;
+// A fee that a user may be charged if they have made a booking but do not
+// show up.
+message NoShowFee {
+  // The amount the user may be charged if they do not show up for their
+  // reservation.
+  Price fee = 1;
 
-  // Status of the booking (required)
-  BookingStatus booking_status = 2;
-
-  // Prepayment status of the booking (required)
-  PrepaymentStatus prepayment_status = 3;
+  // Defines how the fee is determined from the availability.
+  PriceType fee_type = 3;
 }
-// [END method_get_booking_status]
 
-// [START method_check_order_fulfillability]
-// Request to check the fulfillability of an order.
-message CheckOrderFulfillabilityRequest {
-  // The merchant that this order is intended for. (required)
+// A deposit that the user may be charged or have a hold on their credit card
+// for.
+message Deposit {
+  // Deposit amount.
+  Price deposit = 1;
+
+  // Minimum advance cancellation for the deposit.
+  int64 min_advance_cancellation_sec = 2;
+
+  // Defines how the deposit is determined from the availability.
+  PriceType deposit_type = 3;
+}
+
+// Slot specification
+
+// An inventory slot
+message Slot {
+  // ID of the merchant for the slot (required)
   string merchant_id = 1;
 
-  // The line items in this order. All services requested must belong to the
-  // specified merchant. (required)
-  repeated LineItem item = 2;
-}
+  // ID of the merchant Service (required)
+  string service_id = 2;
 
-// Response for the CheckOrderfulfillabilityRequest.
-message CheckOrderFulfillabilityResponse {
-  // Fulfillability status of the order, potentially contains updated
-  // availabilities and prices of the requested line item. (required)
-  OrderFulfillability fulfillability = 1;
-
-  // Total processing fees & taxes that need to be paid for this order.
+  // Start time of the appointment slot in seconds of UTC time since Unix epoch.
   // (required)
-  Price fees_and_taxes = 2;
-}
-// [END method_check_order_fulfillability]
+  int64 start_sec = 3;
 
-// [START method_create_booking]
-// Request to create a Booking for an inventory slot. Consumes the lease if
-// provided.
-message CreateBookingRequest {
-  // 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 = 1;
+  // Duration of the appointment slot (required)
+  int64 duration_sec = 4;
 
-  // The lease that is being confirmed to make this booking.
-  // If lease_ref is provided, then create the booking using the lease.
-  // (optional)
-  LeaseReference lease_ref = 2;
+  // Opaque tag that identifies the availability slot and matches the value
+  // provided in the availability feed (optional)
+  string availability_tag = 5;
 
-  // Personal information of the user making the appointment (required)
-  UserInformation user_information = 3;
-
-  // Information about payments. When payment authorizations are handled by
-  // Google, if the booking request does not succeed, payment authorizations are
-  // automatically canceled. (optional)
-  PaymentInformation payment_information = 4;
-
-  // 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 payment_processing_parameters = 5;
-
-  // Idempotency token for CreateBooking requests. (required)
-  string idempotency_token = 6;
-
-  // A string from the user which contains any special requests or additional
-  // information that they would like to notify the merchant about. (optional)
-  string additional_request = 7;
+  // The set of resources that disambiguates the appointment slot, e.g. by
+  // indicating the staff member and room selected by the user (optional)
+  ResourceIds resources = 6;
 }
 
-// Response with the created Booking for an inventory slot.
-message CreateBookingResponse {
-  // The created booking (required)
-  Booking booking = 1;
+// User specification
 
-  // 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 user_payment_option = 2;
-
-  // 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 booking_failure = 3;
-}
-// [END method_create_booking]
-
-// [START method_create_order]
-// Request to create an order.
-message CreateOrderRequest {
-  // The order to create. (required)
-  Order order = 1;
-
-  // 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 payment_processing_parameters = 2;
-
-  // Idempotency token for CreateOrder requests. (required)
-  string idempotency_token = 3;
-}
-
-// Response for the CreateOrderRequest.
-message CreateOrderResponse {
-  // The order created. (required)
-  Order order = 1;
-
-  // If creating an order fails, this field should reflect the business logic
-  // error (e.g., slot has become unavailable or price has changed) and all
-  // other fields in the CreateOrderResponse are expected to be unset. (required
-  // if failure occurs)
-  OrderFailure order_failure = 2;
-}
-// [END method_create_order]
-
-// [START method_create_lease]
-// Request to create a Leaese 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.
-message CreateLeaseRequest {
-  // The lease to be created with information about the appointment slot
+// Personal information about the person making a booking
+message UserInformation {
+  // Unique ID of the user to the partner, chosen by Reserve with Google.
   // (required)
-  Lease lease = 1;
-}
-
-// Response for the CreateLease RPC with the created Lease.
-message CreateLeaseResponse {
-  // The created Lease (required)
-  Lease lease = 1;
-
-  // 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 booking_failure = 2;
-}
-// [END method_create_lease]
-
-// [START method_list_bookings]
-// Request to list all bookings for a user
-message ListBookingsRequest {
-  // ID of the user (required)
   string user_id = 1;
+
+  // Given name of the user (maximum 40 characters) (required)
+  string given_name = 2;
+
+  // Family name of the user (maximum 40 characters) (required)
+  string family_name = 3;
+
+  // Address of the user (optional)
+  PostalAddress address = 4;
+
+  // Phone number of the user (required)
+  string telephone = 5;
+
+  // Email address of the user (required)
+  string email = 6;
 }
 
-// Response for the ListBookings RPC with all bookings for the requested user.
-message ListBookingsResponse {
-  // All bookings of the user (required)
-  repeated Booking bookings = 1;
-}
-// [END method_list_bookings]
-
-// [START method_list_orders]
-// Request to list orders.
-message ListOrdersRequest {
-  // ID of the user (required only if order_id is not set).
-  string user_id = 1;
-  // If set, return only the specified orders; otherwise, return all orders of
-  // the user. (required only if user_id is not set).
-  repeated string order_id = 2;
-}
-
-// Response for the ListOrders RPC.
-message ListOrdersResponse {
-  // All requested orders (required)
-  repeated Order order = 1;
-}
-// [END method_list_orders]
-
-// [START method_update_booking]
-// Request to update a Booking.
-message UpdateBookingRequest {
-  // 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 = 1;
-}
-
-// Response with the updated Booking.
-message UpdateBookingResponse {
-  // The updated booking (required)
-  Booking booking = 1;
-
-  // 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 user_payment_option = 2;
-
-  // If updating a booking fails, this field should reflect the business logic
-  // error (e.g., booking is not cancellable) (required if failure occurs)
-  BookingFailure booking_failure = 3;
-}
-// [END method_update_booking]
+// The postal address for a merchant.
+message PostalAddress {
+  // The country, e.g. "USA". (required)
+  string country = 1;
+  // The locality/city, e.g. "Mountain View". (required)
+  string locality = 2;
+  // The region/state/province, e.g. "CA". (required)
+  string region = 3;
+  // The postal code, e.g. "94043". (required)
+  string postal_code = 4;
+  // The street address, e.g. "1600 Amphitheatre Pkwy". (required)
+  string street_address = 5;
+}
\ No newline at end of file
diff --git a/testclient/bookingBasedTestClient.go b/testclient/bookingClient.go
similarity index 100%
rename from testclient/bookingBasedTestClient.go
rename to testclient/bookingClient.go
diff --git a/testclient/orderBasedTestClient.go b/testclient/orderClient.go
similarity index 100%
rename from testclient/orderBasedTestClient.go
rename to testclient/orderClient.go
diff --git a/v3/v3.pb.go b/v3/v3.pb.go
index 2df1389..3db0270 100644
--- a/v3/v3.pb.go
+++ b/v3/v3.pb.go
@@ -1,62 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: v3.proto
 
-/*
-Package v3 is a generated protocol buffer package.
-
-It is generated from these files:
-	v3.proto
-
-It has these top-level messages:
-	PostalAddress
-	GeoCoordinates
-	Price
-	TaxRate
-	SchedulingRules
-	IngestionQueuePayload
-	IngestionStatus
-	TimeRange
-	NoShowFee
-	Deposit
-	ActionLink
-	Slot
-	Lease
-	LeaseReference
-	Booking
-	UserInformation
-	PaymentProcessingParameters
-	UserPaymentOption
-	PaymentInformation
-	BookingFailure
-	SlotAvailability
-	AvailabilityUpdate
-	ResourceIds
-	TicketType
-	LineItem
-	LineItemFulfillability
-	OrderFulfillability
-	Order
-	OrderFailure
-	CheckAvailabilityRequest
-	CheckAvailabilityResponse
-	GetBookingStatusRequest
-	GetBookingStatusResponse
-	CheckOrderFulfillabilityRequest
-	CheckOrderFulfillabilityResponse
-	CreateBookingRequest
-	CreateBookingResponse
-	CreateOrderRequest
-	CreateOrderResponse
-	CreateLeaseRequest
-	CreateLeaseResponse
-	ListBookingsRequest
-	ListBookingsResponse
-	ListOrdersRequest
-	ListOrdersResponse
-	UpdateBookingRequest
-	UpdateBookingResponse
-*/
-package v3
+package ext_maps_booking_partner_v3
 
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
@@ -73,161 +18,6 @@
 // proto package needs to be updated.
 const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
 
-// This defines the ingestion source type.
-type IngestionSource int32
-
-const (
-	IngestionSource_SOURCE_UNKNOWN IngestionSource = 0
-	// This ingestion is from an uploaded feed file.
-	IngestionSource_SOURCE_FEED IngestionSource = 1
-	// This ingestion is from an API call.
-	IngestionSource_SOURCE_API IngestionSource = 2
-)
-
-var IngestionSource_name = map[int32]string{
-	0: "SOURCE_UNKNOWN",
-	1: "SOURCE_FEED",
-	2: "SOURCE_API",
-}
-var IngestionSource_value = map[string]int32{
-	"SOURCE_UNKNOWN": 0,
-	"SOURCE_FEED":    1,
-	"SOURCE_API":     2,
-}
-
-func (x IngestionSource) String() string {
-	return proto.EnumName(IngestionSource_name, int32(x))
-}
-func (IngestionSource) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
-
-// The types of content that we can ingest through feeds or APIs.
-type ContentType int32
-
-const (
-	ContentType_CONTENT_UNKNOWN                ContentType = 0
-	ContentType_CONTENT_MERCHANT               ContentType = 1
-	ContentType_CONTENT_SERVICE                ContentType = 2
-	ContentType_CONTENT_AVAILABILITY           ContentType = 3
-	ContentType_CONTENT_PAYMENT_OPTION         ContentType = 4
-	ContentType_CONTENT_PAYMENT_OPTION_SERVICE ContentType = 5
-)
-
-var ContentType_name = map[int32]string{
-	0: "CONTENT_UNKNOWN",
-	1: "CONTENT_MERCHANT",
-	2: "CONTENT_SERVICE",
-	3: "CONTENT_AVAILABILITY",
-	4: "CONTENT_PAYMENT_OPTION",
-	5: "CONTENT_PAYMENT_OPTION_SERVICE",
-}
-var ContentType_value = map[string]int32{
-	"CONTENT_UNKNOWN":                0,
-	"CONTENT_MERCHANT":               1,
-	"CONTENT_SERVICE":                2,
-	"CONTENT_AVAILABILITY":           3,
-	"CONTENT_PAYMENT_OPTION":         4,
-	"CONTENT_PAYMENT_OPTION_SERVICE": 5,
-}
-
-func (x ContentType) String() string {
-	return proto.EnumName(ContentType_name, int32(x))
-}
-func (ContentType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
-
-// [START pricetype_definition]
-// Defines how a total price is determined from an availability.
-type PriceType int32
-
-const (
-	// The price is for a fixed amount. This is the default value if the field is
-	// not set.
-	PriceType_FIXED_RATE_DEFAULT PriceType = 0
-	// The price specified is per person, and the total price is calculated
-	// according to the party size specified in Resources as
-	// price_micros * party_size. A PER_PERSON price must be accompanied by a
-	// party size in the availability resources. If it is not, a party size of one
-	// is used.
-	PriceType_PER_PERSON PriceType = 1
-)
-
-var PriceType_name = map[int32]string{
-	0: "FIXED_RATE_DEFAULT",
-	1: "PER_PERSON",
-}
-var PriceType_value = map[string]int32{
-	"FIXED_RATE_DEFAULT": 0,
-	"PER_PERSON":         1,
-}
-
-func (x PriceType) String() string {
-	return proto.EnumName(PriceType_name, int32(x))
-}
-func (PriceType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
-
-// [START RequireCreditCard_definition]
-// Defines whether a credit card is required in order to book an appointment.
-type RequireCreditCard int32
-
-const (
-	// The credit card requirement is not explicitly specified and the
-	// behaviour is identical to the one specified for CONDITIONAL.
-	RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED RequireCreditCard = 0
-	// Google will require a credit card for the booking if any of the following
-	// conditions are met:
-	// * the availability has a price and the prepayment_type is REQUIRED
-	// * the no_show_fee is set
-	// * the deposit field is set.
-	RequireCreditCard_REQUIRE_CREDIT_CARD_CONDITIONAL RequireCreditCard = 1
-	// A credit card is always required in order to book this availability
-	// regardless of other field values.
-	RequireCreditCard_REQUIRE_CREDIT_CARD_ALWAYS RequireCreditCard = 2
-)
-
-var RequireCreditCard_name = map[int32]string{
-	0: "REQUIRE_CREDIT_CARD_UNSPECIFIED",
-	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
-	2: "REQUIRE_CREDIT_CARD_ALWAYS",
-}
-var RequireCreditCard_value = map[string]int32{
-	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
-	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
-	"REQUIRE_CREDIT_CARD_ALWAYS":      2,
-}
-
-func (x RequireCreditCard) String() string {
-	return proto.EnumName(RequireCreditCard_name, int32(x))
-}
-func (RequireCreditCard) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
-
-// [START paymentoption_definition]
-type PaymentOptionType int32
-
-const (
-	PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED PaymentOptionType = 0
-	PaymentOptionType_PAYMENT_OPTION_SINGLE_USE       PaymentOptionType = 1
-	PaymentOptionType_PAYMENT_OPTION_MULTI_USE        PaymentOptionType = 2
-	PaymentOptionType_PAYMENT_OPTION_UNLIMITED_USE    PaymentOptionType = 3
-)
-
-var PaymentOptionType_name = map[int32]string{
-	0: "PAYMENT_OPTION_TYPE_UNSPECIFIED",
-	1: "PAYMENT_OPTION_SINGLE_USE",
-	2: "PAYMENT_OPTION_MULTI_USE",
-	3: "PAYMENT_OPTION_UNLIMITED_USE",
-}
-var PaymentOptionType_value = map[string]int32{
-	"PAYMENT_OPTION_TYPE_UNSPECIFIED": 0,
-	"PAYMENT_OPTION_SINGLE_USE":       1,
-	"PAYMENT_OPTION_MULTI_USE":        2,
-	"PAYMENT_OPTION_UNLIMITED_USE":    3,
-}
-
-func (x PaymentOptionType) String() string {
-	return proto.EnumName(PaymentOptionType_name, int32(x))
-}
-func (PaymentOptionType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
-
-// [START bookingstatus_definition]
 // Status of a booking.
 //
 // Updating booking status does not change the status of the associated payment.
@@ -274,9 +64,10 @@
 func (x BookingStatus) String() string {
 	return proto.EnumName(BookingStatus_name, int32(x))
 }
-func (BookingStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
+func (BookingStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{0}
+}
 
-// [START creditcardtype_definition]
 // 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
@@ -308,9 +99,39 @@
 func (x CreditCardType) String() string {
 	return proto.EnumName(CreditCardType_name, int32(x))
 }
-func (CreditCardType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
+func (CreditCardType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{1}
+}
 
-// [START prepaymentstatus_definition]
+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).
@@ -353,122 +174,71 @@
 func (x PrepaymentStatus) String() string {
 	return proto.EnumName(PrepaymentStatus_name, int32(x))
 }
-func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
+func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{3}
+}
 
-// The status code of an Ingestion event: a feed upload or an API call.
-// Only used for logging the ingestion status in the IngestionMetadata
-// table, do NOT use it in the code's control flow.
-type IngestionStatus_Code int32
+// Defines how a total price is determined from an availability.
+type PriceType int32
 
 const (
-	// An unknown status for Ingestion, shouldn't use it.
-	IngestionStatus_STATUS_UNKNOWN IngestionStatus_Code = 0
-	// 1-99 for Feed upload.
-	// A feed has been uploaded.
-	IngestionStatus_STATUS_FEED_UPLOADED IngestionStatus_Code = 1
-	// A feed has been added to the Ingestion Queue.
-	IngestionStatus_STATUS_FEED_ENQUEUED IngestionStatus_Code = 2
-	// A feed has been picked up from the queue and started processing.
-	IngestionStatus_STATUS_FEED_PROCESSING_STARTED IngestionStatus_Code = 3
-	// A feed has been processed successfully.
-	IngestionStatus_STATUS_FEED_PROCESSING_SUCCEEDED IngestionStatus_Code = 4
-	// A feed has failed the processing.
-	IngestionStatus_STATUS_FEED_PROCESSING_FAILED IngestionStatus_Code = 5
-	// A feed duplicate was uploaded.
-	IngestionStatus_STATUS_FEED_DUPLICATED IngestionStatus_Code = 6
-	// 101-199 for API.
-	// An API has been called.
-	IngestionStatus_STATUS_API_CALLED IngestionStatus_Code = 101
-	// An API has been processed successfully.
-	IngestionStatus_STATUS_API_PROCESSING_SUCCEEDED IngestionStatus_Code = 102
-	// An API has failed the processing.
-	IngestionStatus_STATUS_API_PROCESSING_FAILED IngestionStatus_Code = 103
+	// 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 IngestionStatus_Code_name = map[int32]string{
-	0:   "STATUS_UNKNOWN",
-	1:   "STATUS_FEED_UPLOADED",
-	2:   "STATUS_FEED_ENQUEUED",
-	3:   "STATUS_FEED_PROCESSING_STARTED",
-	4:   "STATUS_FEED_PROCESSING_SUCCEEDED",
-	5:   "STATUS_FEED_PROCESSING_FAILED",
-	6:   "STATUS_FEED_DUPLICATED",
-	101: "STATUS_API_CALLED",
-	102: "STATUS_API_PROCESSING_SUCCEEDED",
-	103: "STATUS_API_PROCESSING_FAILED",
+var PriceType_name = map[int32]string{
+	0: "FIXED_RATE_DEFAULT",
+	1: "PER_PERSON",
 }
-var IngestionStatus_Code_value = map[string]int32{
-	"STATUS_UNKNOWN":                   0,
-	"STATUS_FEED_UPLOADED":             1,
-	"STATUS_FEED_ENQUEUED":             2,
-	"STATUS_FEED_PROCESSING_STARTED":   3,
-	"STATUS_FEED_PROCESSING_SUCCEEDED": 4,
-	"STATUS_FEED_PROCESSING_FAILED":    5,
-	"STATUS_FEED_DUPLICATED":           6,
-	"STATUS_API_CALLED":                101,
-	"STATUS_API_PROCESSING_SUCCEEDED":  102,
-	"STATUS_API_PROCESSING_FAILED":     103,
+var PriceType_value = map[string]int32{
+	"FIXED_RATE_DEFAULT": 0,
+	"PER_PERSON":         1,
 }
 
-func (x IngestionStatus_Code) String() string {
-	return proto.EnumName(IngestionStatus_Code_name, int32(x))
+func (x PriceType) String() string {
+	return proto.EnumName(PriceType_name, int32(x))
 }
-func (IngestionStatus_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6, 0} }
+func (PriceType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{4}
+}
 
-type PaymentProcessingParameters_PaymentProcessor int32
+// This enum indicates what requirements exist for the user to acknowledge or
+// view the requested slots duration/end time.
+type CheckAvailabilityResponse_DurationRequirement int32
 
 const (
-	PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED PaymentProcessingParameters_PaymentProcessor = 0
-	PaymentProcessingParameters_PROCESSOR_STRIPE              PaymentProcessingParameters_PaymentProcessor = 1
-	PaymentProcessingParameters_PROCESSOR_BRAINTREE           PaymentProcessingParameters_PaymentProcessor = 2
+	// 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 PaymentProcessingParameters_PaymentProcessor_name = map[int32]string{
-	0: "PAYMENT_PROCESSOR_UNSPECIFIED",
-	1: "PROCESSOR_STRIPE",
-	2: "PROCESSOR_BRAINTREE",
+var CheckAvailabilityResponse_DurationRequirement_name = map[int32]string{
+	0: "DURATION_REQUIREMENT_UNSPECIFIED",
+	1: "DO_NOT_SHOW_DURATION",
+	2: "MUST_SHOW_DURATION",
 }
-var PaymentProcessingParameters_PaymentProcessor_value = map[string]int32{
-	"PAYMENT_PROCESSOR_UNSPECIFIED": 0,
-	"PROCESSOR_STRIPE":              1,
-	"PROCESSOR_BRAINTREE":           2,
+var CheckAvailabilityResponse_DurationRequirement_value = map[string]int32{
+	"DURATION_REQUIREMENT_UNSPECIFIED": 0,
+	"DO_NOT_SHOW_DURATION":             1,
+	"MUST_SHOW_DURATION":               2,
 }
 
-func (x PaymentProcessingParameters_PaymentProcessor) String() string {
-	return proto.EnumName(PaymentProcessingParameters_PaymentProcessor_name, int32(x))
+func (x CheckAvailabilityResponse_DurationRequirement) String() string {
+	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
 }
-func (PaymentProcessingParameters_PaymentProcessor) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{16, 0}
-}
-
-// Who handles payment processing?
-// If payment is processed by the partner, CreateBooking request will
-// include additional parameters (PaymentProcessingParameters) indicating
-// the payment method to be used to process the payment.
-type PaymentInformation_PaymentProcessedBy int32
-
-const (
-	PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED PaymentInformation_PaymentProcessedBy = 0
-	PaymentInformation_PROCESSED_BY_GOOGLE              PaymentInformation_PaymentProcessedBy = 1
-	PaymentInformation_PROCESSED_BY_PARTNER             PaymentInformation_PaymentProcessedBy = 2
-)
-
-var PaymentInformation_PaymentProcessedBy_name = map[int32]string{
-	0: "PAYMENT_PROCESSED_BY_UNSPECIFIED",
-	1: "PROCESSED_BY_GOOGLE",
-	2: "PROCESSED_BY_PARTNER",
-}
-var PaymentInformation_PaymentProcessedBy_value = map[string]int32{
-	"PAYMENT_PROCESSED_BY_UNSPECIFIED": 0,
-	"PROCESSED_BY_GOOGLE":              1,
-	"PROCESSED_BY_PARTNER":             2,
-}
-
-func (x PaymentInformation_PaymentProcessedBy) String() string {
-	return proto.EnumName(PaymentInformation_PaymentProcessedBy_name, int32(x))
-}
-func (PaymentInformation_PaymentProcessedBy) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{18, 0}
+func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{1, 0}
 }
 
 type BookingFailure_Cause int32
@@ -508,6 +278,8 @@
 	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{
@@ -523,6 +295,7 @@
 	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,
@@ -537,94 +310,14 @@
 	"USER_CANNOT_USE_PAYMENT_OPTION":   9,
 	"BOOKING_ALREADY_CANCELLED":        10,
 	"BOOKING_NOT_CANCELLABLE":          11,
+	"OVERLAPPING_RESERVATION":          12,
 }
 
 func (x BookingFailure_Cause) String() string {
 	return proto.EnumName(BookingFailure_Cause_name, int32(x))
 }
-func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 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 incorrect.
-	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 fileDescriptor0, []int{25, 0}
-}
-
-// The result of an order fulfillability check.
-type OrderFulfillability_OrderFulfillabilityResult int32
-
-const (
-	// Default value: Don't use.
-	OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED OrderFulfillability_OrderFulfillabilityResult = 0
-	// The order can be fulfilled.
-	OrderFulfillability_CAN_FULFILL OrderFulfillability_OrderFulfillabilityResult = 1
-	// The order cannot be fulfilled due to one or more unfulfillable line
-	// item(s).
-	OrderFulfillability_UNFULFILLABLE_LINE_ITEM OrderFulfillability_OrderFulfillabilityResult = 2
-	// The combination of the line items requested cannot be fulfilled.
-	OrderFulfillability_UNFULFILLABLE_SERVICE_COMBINATION OrderFulfillability_OrderFulfillabilityResult = 3
-	// The order cannot be fulfilled due to reasons that do not fall into the
-	// categories above.
-	OrderFulfillability_ORDER_UNFULFILLABLE_OTHER_REASON OrderFulfillability_OrderFulfillabilityResult = 4
-)
-
-var OrderFulfillability_OrderFulfillabilityResult_name = map[int32]string{
-	0: "ORDER_FULFILLABILITY_RESULT_UNSPECIFIED",
-	1: "CAN_FULFILL",
-	2: "UNFULFILLABLE_LINE_ITEM",
-	3: "UNFULFILLABLE_SERVICE_COMBINATION",
-	4: "ORDER_UNFULFILLABLE_OTHER_REASON",
-}
-var OrderFulfillability_OrderFulfillabilityResult_value = map[string]int32{
-	"ORDER_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
-	"CAN_FULFILL":                             1,
-	"UNFULFILLABLE_LINE_ITEM":                 2,
-	"UNFULFILLABLE_SERVICE_COMBINATION":       3,
-	"ORDER_UNFULFILLABLE_OTHER_REASON":        4,
-}
-
-func (x OrderFulfillability_OrderFulfillabilityResult) String() string {
-	return proto.EnumName(OrderFulfillability_OrderFulfillabilityResult_name, int32(x))
-}
-func (OrderFulfillability_OrderFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{26, 0}
+func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{23, 0}
 }
 
 type OrderFailure_Cause int32
@@ -665,527 +358,859 @@
 func (x OrderFailure_Cause) String() string {
 	return proto.EnumName(OrderFailure_Cause_name, int32(x))
 }
-func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{28, 0} }
+func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{26, 0}
+}
 
-// This enum indicates what requirements exist for the user to acknowledge or
-// view the requested slots duration/end time.
-type CheckAvailabilityResponse_DurationRequirement int32
+// The result of an order fulfillability check.
+type OrderFulfillability_OrderFulfillabilityResult 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
+	// 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 CheckAvailabilityResponse_DurationRequirement_name = map[int32]string{
-	0: "DURATION_REQUIREMENT_UNSPECIFIED",
-	1: "DO_NOT_SHOW_DURATION",
-	2: "MUST_SHOW_DURATION",
+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 CheckAvailabilityResponse_DurationRequirement_value = map[string]int32{
-	"DURATION_REQUIREMENT_UNSPECIFIED": 0,
-	"DO_NOT_SHOW_DURATION":             1,
-	"MUST_SHOW_DURATION":               2,
+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 CheckAvailabilityResponse_DurationRequirement) String() string {
-	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
+func (x OrderFulfillability_OrderFulfillabilityResult) String() string {
+	return proto.EnumName(OrderFulfillability_OrderFulfillabilityResult_name, int32(x))
 }
-func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{30, 0}
+func (OrderFulfillability_OrderFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_v3_e164fdd8b81531d4, []int{27, 0}
 }
 
-// [START postaladdr_definition]
-// The postal address for a merchant.
-type PostalAddress struct {
-	// The country, e.g. "USA". (required)
-	Country string `protobuf:"bytes,1,opt,name=country" json:"country,omitempty"`
-	// The locality/city, e.g. "Mountain View". (required)
-	Locality string `protobuf:"bytes,2,opt,name=locality" json:"locality,omitempty"`
-	// The region/state/province, e.g. "CA". (required)
-	Region string `protobuf:"bytes,3,opt,name=region" json:"region,omitempty"`
-	// The postal code, e.g. "94043". (required)
-	PostalCode string `protobuf:"bytes,4,opt,name=postal_code,json=postalCode" json:"postal_code,omitempty"`
-	// The street address, e.g. "1600 Amphitheatre Pkwy". (required)
-	StreetAddress string `protobuf:"bytes,5,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
+// 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 (m *PostalAddress) Reset()                    { *m = PostalAddress{} }
-func (m *PostalAddress) String() string            { return proto.CompactTextString(m) }
-func (*PostalAddress) ProtoMessage()               {}
-func (*PostalAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+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}
+}
 
-func (m *PostalAddress) GetCountry() string {
+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.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 ""
-}
-
-// [START geocoord_definition]
-// The Geo data of a location, including latitude, longitude, and address.
-type GeoCoordinates struct {
-	Latitude  float64        `protobuf:"fixed64,1,opt,name=latitude" json:"latitude,omitempty"`
-	Longitude float64        `protobuf:"fixed64,2,opt,name=longitude" json:"longitude,omitempty"`
-	Address   *PostalAddress `protobuf:"bytes,3,opt,name=address" json:"address,omitempty"`
-}
-
-func (m *GeoCoordinates) Reset()                    { *m = GeoCoordinates{} }
-func (m *GeoCoordinates) String() string            { return proto.CompactTextString(m) }
-func (*GeoCoordinates) ProtoMessage()               {}
-func (*GeoCoordinates) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
-
-func (m *GeoCoordinates) GetLatitude() float64 {
-	if m != nil {
-		return m.Latitude
-	}
-	return 0
-}
-
-func (m *GeoCoordinates) GetLongitude() float64 {
-	if m != nil {
-		return m.Longitude
-	}
-	return 0
-}
-
-func (m *GeoCoordinates) GetAddress() *PostalAddress {
-	if m != nil {
-		return m.Address
+		return m.Slot
 	}
 	return nil
 }
 
-// [START price_definition]
-// The price of a service or a fee.
-type Price struct {
-	// The price in micro-units of the currency.
-	// Fractions of smallest currency unit will be rounded using nearest even
-	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
-	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
-	// (required)
-	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros" json:"price_micros,omitempty"`
-	// The currency of the price that is defined in ISO 4217. (required)
-	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
-	// An optional and opaque string that identifies the pricing option that is
-	// associated with the extended price. (optional)
-	PricingOptionTag string `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag" json:"pricing_option_tag,omitempty"`
+// 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 *Price) Reset()                    { *m = Price{} }
-func (m *Price) String() string            { return proto.CompactTextString(m) }
-func (*Price) ProtoMessage()               {}
-func (*Price) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+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)
+}
 
-func (m *Price) GetPriceMicros() int64 {
+var xxx_messageInfo_CheckAvailabilityResponse proto.InternalMessageInfo
+
+func (m *CheckAvailabilityResponse) GetSlot() *Slot {
 	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 ""
-}
-
-// [START taxrate_definition]
-// A tax rate applied when charging the user for a service, and which can be set
-// on either a per merchant, or per service basis.
-type TaxRate struct {
-	// A tax rate in millionths of one percent, effectively giving 6 decimals of
-	// precision. For example, if the tax rate is 7.253%, this field should be set
-	// to 7253000.
-	//
-	// If this field is left unset or set to 0, the total price charged to a user
-	// for any service provided by this merchant is the exact price specified by
-	// Service.price. The service price is assumed to be exempt from or already
-	// inclusive of applicable taxes. Taxes will not be shown to the user as a
-	// separate line item.
-	//
-	// If this field is set to any nonzero value, the total price charged to a
-	// user for any service provided by this merchant will include the service
-	// price plus the tax assessed using the tax rate provided here. Fractions of
-	// the smallest currency unit (for example, fractions of one cent) will be
-	// rounded using nearest even rounding. Taxes will be shown to the user as a
-	// separate line item. (required)
-	MicroPercent int32 `protobuf:"varint,1,opt,name=micro_percent,json=microPercent" json:"micro_percent,omitempty"`
-}
-
-func (m *TaxRate) Reset()                    { *m = TaxRate{} }
-func (m *TaxRate) String() string            { return proto.CompactTextString(m) }
-func (*TaxRate) ProtoMessage()               {}
-func (*TaxRate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
-
-func (m *TaxRate) GetMicroPercent() int32 {
-	if m != nil {
-		return m.MicroPercent
-	}
-	return 0
-}
-
-// [START schedulingrules_definition]
-// The scheduling rules for a service.
-type SchedulingRules struct {
-	// The minimum advance notice in seconds required to book an appointment.
-	// (optional)
-	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking" json:"min_advance_booking,omitempty"`
-	// The minimum advance notice in seconds required to cancel a booked
-	// appointment online. (optional)
-	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling" json:"min_advance_online_canceling,omitempty"`
-	// The fee for canceling within the minimum advance notice period.
-	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee" json:"late_cancellation_fee,omitempty"`
-	// The fee for no-show without canceling.
-	NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee" json:"noshow_fee,omitempty"`
-}
-
-func (m *SchedulingRules) Reset()                    { *m = SchedulingRules{} }
-func (m *SchedulingRules) String() string            { return proto.CompactTextString(m) }
-func (*SchedulingRules) ProtoMessage()               {}
-func (*SchedulingRules) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
-
-func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
-	if m != nil {
-		return m.MinAdvanceBooking
-	}
-	return 0
-}
-
-func (m *SchedulingRules) GetMinAdvanceOnlineCanceling() int64 {
-	if m != nil {
-		return m.MinAdvanceOnlineCanceling
-	}
-	return 0
-}
-
-func (m *SchedulingRules) GetLateCancellationFee() *Price {
-	if m != nil {
-		return m.LateCancellationFee
+		return m.Slot
 	}
 	return nil
 }
 
-func (m *SchedulingRules) GetNoshowFee() *Price {
+func (m *CheckAvailabilityResponse) GetCountAvailable() int32 {
 	if m != nil {
-		return m.NoshowFee
-	}
-	return nil
-}
-
-// An empty boilplate proto for the Ingestion Queue in Spanner.
-type IngestionQueuePayload struct {
-}
-
-func (m *IngestionQueuePayload) Reset()                    { *m = IngestionQueuePayload{} }
-func (m *IngestionQueuePayload) String() string            { return proto.CompactTextString(m) }
-func (*IngestionQueuePayload) ProtoMessage()               {}
-func (*IngestionQueuePayload) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
-
-type IngestionStatus struct {
-	// The code of the status.
-	Code IngestionStatus_Code `protobuf:"varint,1,opt,name=code,enum=v3.IngestionStatus_Code" json:"code,omitempty"`
-	// Microseconds since epoch when the ingestion updates its status code.
-	TimestampMicros int64 `protobuf:"varint,2,opt,name=timestamp_micros,json=timestampMicros" json:"timestamp_micros,omitempty"`
-	// A human description of the error if any.
-	InternalErrorDetails       string `protobuf:"bytes,3,opt,name=internal_error_details,json=internalErrorDetails" json:"internal_error_details,omitempty"`
-	PartnerVisibleErrorDetails string `protobuf:"bytes,4,opt,name=partner_visible_error_details,json=partnerVisibleErrorDetails" json:"partner_visible_error_details,omitempty"`
-}
-
-func (m *IngestionStatus) Reset()                    { *m = IngestionStatus{} }
-func (m *IngestionStatus) String() string            { return proto.CompactTextString(m) }
-func (*IngestionStatus) ProtoMessage()               {}
-func (*IngestionStatus) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
-
-func (m *IngestionStatus) GetCode() IngestionStatus_Code {
-	if m != nil {
-		return m.Code
-	}
-	return IngestionStatus_STATUS_UNKNOWN
-}
-
-func (m *IngestionStatus) GetTimestampMicros() int64 {
-	if m != nil {
-		return m.TimestampMicros
+		return m.CountAvailable
 	}
 	return 0
 }
 
-func (m *IngestionStatus) GetInternalErrorDetails() string {
+func (m *CheckAvailabilityResponse) GetDurationRequirement() CheckAvailabilityResponse_DurationRequirement {
 	if m != nil {
-		return m.InternalErrorDetails
+		return m.DurationRequirement
 	}
-	return ""
+	return CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED
 }
 
-func (m *IngestionStatus) GetPartnerVisibleErrorDetails() string {
+func (m *CheckAvailabilityResponse) GetAvailabilityUpdate() *AvailabilityUpdate {
 	if m != nil {
-		return m.PartnerVisibleErrorDetails
-	}
-	return ""
-}
-
-// [START timerange_definition]
-// A closed-open time range, i.e. [begin_sec, end_sec)
-type TimeRange struct {
-	// Seconds of UTC time since Unix epoch (required)
-	BeginSec int64 `protobuf:"varint,1,opt,name=begin_sec,json=beginSec" json:"begin_sec,omitempty"`
-	// Seconds of UTC time since Unix epoch (required)
-	EndSec int64 `protobuf:"varint,2,opt,name=end_sec,json=endSec" json:"end_sec,omitempty"`
-}
-
-func (m *TimeRange) Reset()                    { *m = TimeRange{} }
-func (m *TimeRange) String() string            { return proto.CompactTextString(m) }
-func (*TimeRange) ProtoMessage()               {}
-func (*TimeRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
-
-func (m *TimeRange) GetBeginSec() int64 {
-	if m != nil {
-		return m.BeginSec
-	}
-	return 0
-}
-
-func (m *TimeRange) GetEndSec() int64 {
-	if m != nil {
-		return m.EndSec
-	}
-	return 0
-}
-
-// [START noshowfee_definition]
-// A fee that a user may be charged if they have made a booking but do not
-// show up.
-type NoShowFee struct {
-	// The amount the user may be charged if they do not show up for their
-	// reservation.
-	Fee *Price `protobuf:"bytes,1,opt,name=fee" json:"fee,omitempty"`
-	// Defines how the fee is determined from the availability.
-	FeeType PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,enum=v3.PriceType" json:"fee_type,omitempty"`
-}
-
-func (m *NoShowFee) Reset()                    { *m = NoShowFee{} }
-func (m *NoShowFee) String() string            { return proto.CompactTextString(m) }
-func (*NoShowFee) ProtoMessage()               {}
-func (*NoShowFee) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
-
-func (m *NoShowFee) GetFee() *Price {
-	if m != nil {
-		return m.Fee
+		return m.AvailabilityUpdate
 	}
 	return nil
 }
 
-func (m *NoShowFee) GetFeeType() PriceType {
-	if m != nil {
-		return m.FeeType
-	}
-	return PriceType_FIXED_RATE_DEFAULT
+// 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:"-"`
 }
 
-// [START deposit_definition]
-// A deposit that the user may be charged or have a hold on their credit card
-// for.
-type Deposit struct {
-	// Deposit amount.
-	Deposit *Price `protobuf:"bytes,1,opt,name=deposit" json:"deposit,omitempty"`
-	// Minimum advance cancellation for the deposit.
-	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec" json:"min_advance_cancellation_sec,omitempty"`
-	// Defines how the deposit is determined from the availability.
-	DepositType PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,enum=v3.PriceType" json:"deposit_type,omitempty"`
+func (m *AvailabilityUpdate) Reset()         { *m = AvailabilityUpdate{} }
+func (m *AvailabilityUpdate) String() string { return proto.CompactTextString(m) }
+func (*AvailabilityUpdate) ProtoMessage()    {}
+func (*AvailabilityUpdate) Descriptor() ([]byte, []int) {
+	return 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)
 }
 
-func (m *Deposit) Reset()                    { *m = Deposit{} }
-func (m *Deposit) String() string            { return proto.CompactTextString(m) }
-func (*Deposit) ProtoMessage()               {}
-func (*Deposit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
+var xxx_messageInfo_AvailabilityUpdate proto.InternalMessageInfo
 
-func (m *Deposit) GetDeposit() *Price {
+func (m *AvailabilityUpdate) GetSlotAvailability() []*SlotAvailability {
 	if m != nil {
-		return m.Deposit
+		return m.SlotAvailability
 	}
 	return nil
 }
 
-func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
+// 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.MinAdvanceCancellationSec
+		return m.Slot
+	}
+	return nil
+}
+
+func (m *SlotAvailability) GetCountAvailable() int32 {
+	if m != nil {
+		return m.CountAvailable
 	}
 	return 0
 }
 
-func (m *Deposit) GetDepositType() PriceType {
-	if m != nil {
-		return m.DepositType
-	}
-	return PriceType_FIXED_RATE_DEFAULT
+// 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:"-"`
 }
 
-// [START ActionLink_definition]
-// An action URL with associated language and list of countries restricted to.
-type ActionLink struct {
-	// The entry point URL for this action link.
-	Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"`
-	// The BCP-47 language tag identifying the language in which the content
-	// from this URI is available.
-	Language string `protobuf:"bytes,2,opt,name=language" json:"language,omitempty"`
-	// ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
-	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry" json:"restricted_country,omitempty"`
+func (m *CheckOrderFulfillabilityRequest) Reset()         { *m = CheckOrderFulfillabilityRequest{} }
+func (m *CheckOrderFulfillabilityRequest) String() string { return proto.CompactTextString(m) }
+func (*CheckOrderFulfillabilityRequest) ProtoMessage()    {}
+func (*CheckOrderFulfillabilityRequest) Descriptor() ([]byte, []int) {
+	return 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)
 }
 
-func (m *ActionLink) Reset()                    { *m = ActionLink{} }
-func (m *ActionLink) String() string            { return proto.CompactTextString(m) }
-func (*ActionLink) ProtoMessage()               {}
-func (*ActionLink) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
+var xxx_messageInfo_CheckOrderFulfillabilityRequest proto.InternalMessageInfo
 
-func (m *ActionLink) GetUrl() string {
-	if m != nil {
-		return m.Url
-	}
-	return ""
-}
-
-func (m *ActionLink) GetLanguage() string {
-	if m != nil {
-		return m.Language
-	}
-	return ""
-}
-
-func (m *ActionLink) GetRestrictedCountry() []string {
-	if m != nil {
-		return m.RestrictedCountry
-	}
-	return nil
-}
-
-// [START message_slot]
-// An inventory slot
-type Slot struct {
-	// ID of the merchant for the slot (required)
-	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
-	// ID of the merchant service (required)
-	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
-	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
-	// (required)
-	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"`
-	// Duration of the appointment slot (required)
-	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"`
-	// Opaque tag that identifies the availability slot and matches the value
-	// provided in the availability feed (optional)
-	AvailabilityTag string `protobuf:"bytes,5,opt,name=availability_tag,json=availabilityTag" json:"availability_tag,omitempty"`
-	// The set of resources that disambiguates the appointment slot, e.g. by
-	// indicating the staff member and room selected by the user (optional)
-	Resources *ResourceIds `protobuf:"bytes,6,opt,name=resources" json:"resources,omitempty"`
-}
-
-func (m *Slot) Reset()                    { *m = Slot{} }
-func (m *Slot) String() string            { return proto.CompactTextString(m) }
-func (*Slot) ProtoMessage()               {}
-func (*Slot) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
-
-func (m *Slot) GetMerchantId() string {
+func (m *CheckOrderFulfillabilityRequest) GetMerchantId() string {
 	if m != nil {
 		return m.MerchantId
 	}
 	return ""
 }
 
-func (m *Slot) GetServiceId() string {
+func (m *CheckOrderFulfillabilityRequest) GetItem() []*LineItem {
 	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 m.Item
 	}
 	return nil
 }
 
-// [START message_lease]
+// 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" json:"lease_id,omitempty"`
+	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" json:"slot,omitempty"`
+	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" json:"user_reference,omitempty"`
+	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" json:"lease_expiration_time_sec,omitempty"`
+	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 fileDescriptor0, []int{12} }
+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 {
@@ -1218,13 +1243,35 @@
 // Reference to a Lease that has been created via CreateLease.
 type LeaseReference struct {
 	// Lease ID (required)
-	LeaseId string `protobuf:"bytes,1,opt,name=lease_id,json=leaseId" json:"lease_id,omitempty"`
+	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 fileDescriptor0, []int{13} }
+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 {
@@ -1233,26 +1280,666 @@
 	return ""
 }
 
-// [START message_booking]
+// 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" json:"booking_id,omitempty"`
+	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" json:"slot,omitempty"`
+	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" json:"user_information,omitempty"`
+	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,enum=v3.BookingStatus" json:"status,omitempty"`
+	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" json:"payment_information,omitempty"`
+	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 fileDescriptor0, []int{14} }
+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 {
@@ -1289,78 +1976,667 @@
 	return nil
 }
 
-// [START user_definition]
-// Personal information about the person making a booking
-type UserInformation struct {
-	// Unique ID of the user to the partner, chosen by Reserve with Google.
-	// (required)
-	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId" json:"user_id,omitempty"`
-	// Given name of the user (required)
-	GivenName string `protobuf:"bytes,2,opt,name=given_name,json=givenName" json:"given_name,omitempty"`
-	// Family name of the user (required)
-	FamilyName string `protobuf:"bytes,3,opt,name=family_name,json=familyName" json:"family_name,omitempty"`
-	// Address of the user (optional)
-	Address *PostalAddress `protobuf:"bytes,4,opt,name=address" json:"address,omitempty"`
-	// Phone number of the user (required)
-	Telephone string `protobuf:"bytes,5,opt,name=telephone" json:"telephone,omitempty"`
-	// Email address of the user (required)
-	Email string `protobuf:"bytes,6,opt,name=email" json:"email,omitempty"`
+// 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 *UserInformation) Reset()                    { *m = UserInformation{} }
-func (m *UserInformation) String() string            { return proto.CompactTextString(m) }
-func (*UserInformation) ProtoMessage()               {}
-func (*UserInformation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
+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)
+}
 
-func (m *UserInformation) GetUserId() string {
+var xxx_messageInfo_BookingFailure proto.InternalMessageInfo
+
+func (m *BookingFailure) GetCause() BookingFailure_Cause {
 	if m != nil {
-		return m.UserId
+		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 ""
 }
 
-func (m *UserInformation) GetGivenName() string {
+// 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.GivenName
+		return m.OrderId
 	}
 	return ""
 }
 
-func (m *UserInformation) GetFamilyName() string {
+func (m *Order) GetUserInformation() *UserInformation {
 	if m != nil {
-		return m.FamilyName
-	}
-	return ""
-}
-
-func (m *UserInformation) GetAddress() *PostalAddress {
-	if m != nil {
-		return m.Address
+		return m.UserInformation
 	}
 	return nil
 }
 
-func (m *UserInformation) GetTelephone() string {
+func (m *Order) GetPaymentInformation() *PaymentInformation {
 	if m != nil {
-		return m.Telephone
+		return m.PaymentInformation
+	}
+	return nil
+}
+
+func (m *Order) GetMerchantId() string {
+	if m != nil {
+		return m.MerchantId
 	}
 	return ""
 }
 
-func (m *UserInformation) GetEmail() string {
+func (m *Order) GetItem() []*LineItem {
 	if m != nil {
-		return m.Email
+		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 ""
 }
 
-// [START paymentprocessing_definition]
+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,enum=v3.PaymentProcessingParameters_PaymentProcessor" json:"processor,omitempty"`
+	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.
@@ -1373,7 +2649,7 @@
 	// For example, for Stripe, unparsed_payment_method_token is a serialized
 	// JSON object documented at https://stripe.com/docs/api#token_object.
 	// payment_method_token is the 'id' field parsed out of that.
-	PaymentMethodToken string `protobuf:"bytes,2,opt,name=payment_method_token,json=paymentMethodToken" json:"payment_method_token,omitempty"`
+	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.
@@ -1381,23 +2657,46 @@
 	//
 	// This token can only be used once, and only for the merchant associated with
 	// this booking.
-	UnparsedPaymentMethodToken string `protobuf:"bytes,5,opt,name=unparsed_payment_method_token,json=unparsedPaymentMethodToken" json:"unparsed_payment_method_token,omitempty"`
+	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" json:"version,omitempty"`
+	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" json:"payment_processor,omitempty"`
+	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 fileDescriptor0, []int{16} }
+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
@@ -1405,6 +2704,7 @@
 	return PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED
 }
 
+// Deprecated: Do not use.
 func (m *PaymentProcessingParameters) GetPaymentMethodToken() string {
 	if m != nil {
 		return m.PaymentMethodToken
@@ -1433,7 +2733,6 @@
 	return ""
 }
 
-// [START userpaymentoption_definition]
 // 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
@@ -1441,32 +2740,54 @@
 type UserPaymentOption struct {
 	// A unique identifier for the user payment option. This Id MUST be unique
 	// for all UserPaymentOptions across all merchants and users. (required)
-	UserPaymentOptionId string `protobuf:"bytes,1,opt,name=user_payment_option_id,json=userPaymentOptionId" json:"user_payment_option_id,omitempty"`
+	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" json:"valid_start_time_sec,omitempty"`
-	ValidEndTimeSec   int64 `protobuf:"varint,3,opt,name=valid_end_time_sec,json=validEndTimeSec" json:"valid_end_time_sec,omitempty"`
+	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,enum=v3.PaymentOptionType" json:"type,omitempty"`
+	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" json:"original_count,omitempty"`
+	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" json:"current_count,omitempty"`
+	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" json:"payment_option_id,omitempty"`
+	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 fileDescriptor0, []int{17} }
+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 {
@@ -1517,7 +2838,6 @@
 	return ""
 }
 
-// [START paymentinfo_definition]
 // Payment details that are sent when creating a new booking.
 type PaymentInformation struct {
 	// Prepayment status of the booking.
@@ -1527,10 +2847,13 @@
 	// If the prepayment status is PREPAYMENT_REFUNDED, then
 	// payment_transaction_id contains the associated unique transaction id for
 	// the refund. (required)
-	PrepaymentStatus PrepaymentStatus `protobuf:"varint,1,opt,name=prepayment_status,json=prepaymentStatus,enum=v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
+	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.
-	// Empty if not applicable. (required)
-	PaymentTransactionId string `protobuf:"bytes,2,opt,name=payment_transaction_id,json=paymentTransactionId" json:"payment_transaction_id,omitempty"`
+	// 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
@@ -1540,15 +2863,15 @@
 	// The price of the booking or order, exclusive of any taxes.
 	// Existence of price or taxes does not imply that they have been paid,
 	// prepayment_state should be used for that purpose. (required)
-	Price *Price `protobuf:"bytes,3,opt,name=price" json:"price,omitempty"`
+	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" json:"tax_amount,omitempty"`
+	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,enum=v3.PaymentInformation_PaymentProcessedBy" json:"payment_processed_by,omitempty"`
+	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
@@ -1567,30 +2890,52 @@
 	PaymentId isPaymentInformation_PaymentId `protobuf_oneof:"payment_id"`
 	// Defines how a deposit may be charged to the user. If there is a deposit,
 	// this field should be set. (optional)
-	Deposit *Deposit `protobuf:"bytes,8,opt,name=deposit" json:"deposit,omitempty"`
+	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" json:"no_show_fee,omitempty"`
+	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" json:"fees_and_taxes,omitempty"`
+	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 fileDescriptor0, []int{18} }
+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,oneof"`
+	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,oneof"`
+	UserPaymentOptionId string `protobuf:"bytes,7,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3,oneof"`
 }
 
 func (*PaymentInformation_PaymentOptionId) isPaymentInformation_PaymentId()     {}
@@ -1725,11 +3070,11 @@
 	// payment_id
 	switch x := m.PaymentId.(type) {
 	case *PaymentInformation_PaymentOptionId:
-		n += proto.SizeVarint(6<<3 | proto.WireBytes)
+		n += 1 // tag and wire
 		n += proto.SizeVarint(uint64(len(x.PaymentOptionId)))
 		n += len(x.PaymentOptionId)
 	case *PaymentInformation_UserPaymentOptionId:
-		n += proto.SizeVarint(7<<3 | proto.WireBytes)
+		n += 1 // tag and wire
 		n += proto.SizeVarint(uint64(len(x.UserPaymentOptionId)))
 		n += len(x.UserPaymentOptionId)
 	case nil:
@@ -1739,1365 +3084,694 @@
 	return n
 }
 
-// [START bookingfailure_definition]
-// Status data that conveys why (1) creating a lease or (2) creating or updating
-// a booking fails.
-// BookingFailure is intended to primarily capture business logic errors.
-type BookingFailure struct {
-	// The reason why the booking failed. (required)
-	Cause BookingFailure_Cause `protobuf:"varint,1,opt,name=cause,enum=v3.BookingFailure_Cause" json:"cause,omitempty"`
-	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
-	RejectedCardType CreditCardType `protobuf:"varint,2,opt,name=rejected_card_type,json=rejectedCardType,enum=v3.CreditCardType" json:"rejected_card_type,omitempty"`
-	// This optional field is used for the partner to include additional
-	// information for debugging purpose only. (optional)
-	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
+// 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 *BookingFailure) Reset()                    { *m = BookingFailure{} }
-func (m *BookingFailure) String() string            { return proto.CompactTextString(m) }
-func (*BookingFailure) ProtoMessage()               {}
-func (*BookingFailure) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
+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)
+}
 
-func (m *BookingFailure) GetCause() BookingFailure_Cause {
+var xxx_messageInfo_Price proto.InternalMessageInfo
+
+func (m *Price) GetPriceMicros() int64 {
 	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 ""
-}
-
-// [START message_slot_availability]
-// An inventory slot and associated count of open spots.
-type SlotAvailability struct {
-	Slot *Slot `protobuf:"bytes,1,opt,name=slot" json:"slot,omitempty"`
-	// Number of available spots.
-	// 0 indicates that the appointment slot is not available. (required)
-	CountAvailable int32 `protobuf:"varint,2,opt,name=count_available,json=countAvailable" json:"count_available,omitempty"`
-}
-
-func (m *SlotAvailability) Reset()                    { *m = SlotAvailability{} }
-func (m *SlotAvailability) String() string            { return proto.CompactTextString(m) }
-func (*SlotAvailability) ProtoMessage()               {}
-func (*SlotAvailability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
-
-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 m.PriceMicros
 	}
 	return 0
 }
 
-// [START message_availability_update]
-// An update to one ore more slots indicating that the availability for the
-// associated time has potentially changed.
-type AvailabilityUpdate struct {
-	SlotAvailability []*SlotAvailability `protobuf:"bytes,1,rep,name=slot_availability,json=slotAvailability" json:"slot_availability,omitempty"`
+func (m *Price) GetCurrencyCode() string {
+	if m != nil {
+		return m.CurrencyCode
+	}
+	return ""
 }
 
-func (m *AvailabilityUpdate) Reset()                    { *m = AvailabilityUpdate{} }
-func (m *AvailabilityUpdate) String() string            { return proto.CompactTextString(m) }
-func (*AvailabilityUpdate) ProtoMessage()               {}
-func (*AvailabilityUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
-
-func (m *AvailabilityUpdate) GetSlotAvailability() []*SlotAvailability {
+func (m *Price) GetPricingOptionTag() string {
 	if m != nil {
-		return m.SlotAvailability
+		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
 }
 
-// [START resources_definition]
-// Resource specification that disambiguates an appointment slot
-type ResourceIds struct {
-	// The staff ID as provided in the feed or empty if not applicable or no staff
-	// was selected. (optional)
-	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId" json:"staff_id,omitempty"`
-	// The room ID as provided in the feed or empty if not applicable or no room
-	// was selected. (optional)
-	RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId" json:"room_id,omitempty"`
-	// For Dining Reservations only: the number of seats requested in the booking.
-	// (optional)
-	PartySize int32 `protobuf:"varint,3,opt,name=party_size,json=partySize" json:"party_size,omitempty"`
-}
-
-func (m *ResourceIds) Reset()                    { *m = ResourceIds{} }
-func (m *ResourceIds) String() string            { return proto.CompactTextString(m) }
-func (*ResourceIds) ProtoMessage()               {}
-func (*ResourceIds) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
-
-func (m *ResourceIds) GetStaffId() string {
+func (m *NoShowFee) GetFeeType() PriceType {
 	if m != nil {
-		return m.StaffId
+		return m.FeeType
 	}
-	return ""
+	return PriceType_FIXED_RATE_DEFAULT
 }
 
-func (m *ResourceIds) GetRoomId() string {
+// 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.RoomId
+		return m.Deposit
 	}
-	return ""
+	return nil
 }
 
-func (m *ResourceIds) GetPartySize() int32 {
+func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
 	if m != nil {
-		return m.PartySize
+		return m.MinAdvanceCancellationSec
 	}
 	return 0
 }
 
-// [START tickettype_definition]
-// 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" 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" json:"short_description,omitempty"`
-	// The price of a single ticket of this type, exclusive of any taxes. The tax
-	// rate of Service is applied to its tickets.
-	Price *Price `protobuf:"bytes,3,opt,name=price" json:"price,omitempty"`
-}
-
-func (m *TicketType) Reset()                    { *m = TicketType{} }
-func (m *TicketType) String() string            { return proto.CompactTextString(m) }
-func (*TicketType) ProtoMessage()               {}
-func (*TicketType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
-
-func (m *TicketType) GetTicketTypeId() string {
+func (m *Deposit) GetDepositType() PriceType {
 	if m != nil {
-		return m.TicketTypeId
+		return m.DepositType
 	}
-	return ""
+	return PriceType_FIXED_RATE_DEFAULT
 }
 
-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
-}
-
-// [START lineitem_definition]
-// A single item in an order--the booking of a single service in a single time
-// slot.
-type LineItem struct {
-	// ID of the merchant service. (required)
-	ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
+// 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,2,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"`
-	// Duration of the appointment slot in seconds. (required)
-	DurationSec int64 `protobuf:"varint,3,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"`
-	// Number of tickets ordered by type.
-	Tickets []*LineItem_OrderedTickets `protobuf:"bytes,4,rep,name=tickets" json:"tickets,omitempty"`
-	// In handling CreateOrderRequest and CheckOrderFulfillabilityRequest,
-	// the total price (excluding taxes) of the item must be verified to guard
-	// against price changes. In CreateOrderResponse and
-	// CheckOrderFulfillabilityResponse, the price should be updated to the
-	// correct value if the value from the request was incorrect or outdated.
-	// (reqired)
-	Price *Price `protobuf:"bytes,5,opt,name=price" json:"price,omitempty"`
-	// Status of the line item. (required in CreateOrderResponse and
-	// ListOrdersResponse; should not be set in requests)
-	Status BookingStatus `protobuf:"varint,6,opt,name=status,enum=v3.BookingStatus" json:"status,omitempty"`
+	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 *LineItem) Reset()                    { *m = LineItem{} }
-func (m *LineItem) String() string            { return proto.CompactTextString(m) }
-func (*LineItem) ProtoMessage()               {}
-func (*LineItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
+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)
+}
 
-func (m *LineItem) GetServiceId() string {
+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 *LineItem) GetStartSec() int64 {
+func (m *Slot) GetStartSec() int64 {
 	if m != nil {
 		return m.StartSec
 	}
 	return 0
 }
 
-func (m *LineItem) GetDurationSec() int64 {
+func (m *Slot) GetDurationSec() int64 {
 	if m != nil {
 		return m.DurationSec
 	}
 	return 0
 }
 
-func (m *LineItem) GetTickets() []*LineItem_OrderedTickets {
+func (m *Slot) GetAvailabilityTag() string {
 	if m != nil {
-		return m.Tickets
-	}
-	return nil
-}
-
-func (m *LineItem) GetPrice() *Price {
-	if m != nil {
-		return m.Price
-	}
-	return nil
-}
-
-func (m *LineItem) GetStatus() BookingStatus {
-	if m != nil {
-		return m.Status
-	}
-	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
-}
-
-type LineItem_OrderedTickets struct {
-	TicketId string `protobuf:"bytes,1,opt,name=ticket_id,json=ticketId" json:"ticket_id,omitempty"`
-	Count    int32  `protobuf:"varint,2,opt,name=count" json:"count,omitempty"`
-}
-
-func (m *LineItem_OrderedTickets) Reset()                    { *m = LineItem_OrderedTickets{} }
-func (m *LineItem_OrderedTickets) String() string            { return proto.CompactTextString(m) }
-func (*LineItem_OrderedTickets) ProtoMessage()               {}
-func (*LineItem_OrderedTickets) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24, 0} }
-
-func (m *LineItem_OrderedTickets) GetTicketId() string {
-	if m != nil {
-		return m.TicketId
+		return m.AvailabilityTag
 	}
 	return ""
 }
 
-func (m *LineItem_OrderedTickets) GetCount() int32 {
+func (m *Slot) GetResources() *ResourceIds {
 	if m != nil {
-		return m.Count
+		return m.Resources
 	}
-	return 0
+	return nil
 }
 
-// [START lineitemfulfillability_definition]
-// Fulfillability of a line item.
-type LineItemFulfillability struct {
-	// The line item of question. (required)
-	Item *LineItem `protobuf:"bytes,1,opt,name=item" json:"item,omitempty"`
+// 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)
-	Result LineItemFulfillability_ItemFulfillabilityResult `protobuf:"varint,2,opt,name=result,enum=v3.LineItemFulfillability_ItemFulfillabilityResult" json:"result,omitempty"`
-	// Additional description of the reason if the item is unfulfillable.
-	// (optional)
-	UnfulfillableReason string `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason" json:"unfulfillable_reason,omitempty"`
-	// Updated availability for this slot can be piggybacked in
-	// CheckOrderFulfillabilityResponse. (optional)
-	SpotsOpen int32 `protobuf:"varint,4,opt,name=spots_open,json=spotsOpen" json:"spots_open,omitempty"`
-	// Updated ticket types can be piggybacked in
-	// CheckOrderFulfillabilityResponse. If non-empty, all available ticket types
-	// for this slot with up-to-date prices should be listed without omitting any.
-	// (optional)
-	TicketType []*TicketType `protobuf:"bytes,5,rep,name=ticket_type,json=ticketType" json:"ticket_type,omitempty"`
+	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 *LineItemFulfillability) Reset()                    { *m = LineItemFulfillability{} }
-func (m *LineItemFulfillability) String() string            { return proto.CompactTextString(m) }
-func (*LineItemFulfillability) ProtoMessage()               {}
-func (*LineItemFulfillability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
-
-func (m *LineItemFulfillability) GetItem() *LineItem {
-	if m != nil {
-		return m.Item
-	}
-	return nil
+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 *LineItemFulfillability) GetResult() LineItemFulfillability_ItemFulfillabilityResult {
-	if m != nil {
-		return m.Result
-	}
-	return LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED
+func (m *UserInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UserInformation.Unmarshal(m, b)
 }
-
-func (m *LineItemFulfillability) GetUnfulfillableReason() string {
-	if m != nil {
-		return m.UnfulfillableReason
-	}
-	return ""
+func (m *UserInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UserInformation.Marshal(b, m, deterministic)
 }
-
-func (m *LineItemFulfillability) GetSpotsOpen() int32 {
-	if m != nil {
-		return m.SpotsOpen
-	}
-	return 0
+func (dst *UserInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UserInformation.Merge(dst, src)
 }
-
-func (m *LineItemFulfillability) GetTicketType() []*TicketType {
-	if m != nil {
-		return m.TicketType
-	}
-	return nil
+func (m *UserInformation) XXX_Size() int {
+	return xxx_messageInfo_UserInformation.Size(m)
 }
-
-// [START orderfulfillability_definition]
-type OrderFulfillability struct {
-	Result OrderFulfillability_OrderFulfillabilityResult `protobuf:"varint,1,opt,name=result,enum=v3.OrderFulfillability_OrderFulfillabilityResult" json:"result,omitempty"`
-	// Fulfillability results of all line items in this order (required).
-	ItemFulfillability []*LineItemFulfillability `protobuf:"bytes,2,rep,name=item_fulfillability,json=itemFulfillability" json:"item_fulfillability,omitempty"`
-	// Additional description of the reason if the item is unfulfillable.
-	// (optional)
-	UnfulfillableReason string `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason" json:"unfulfillable_reason,omitempty"`
+func (m *UserInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_UserInformation.DiscardUnknown(m)
 }
 
-func (m *OrderFulfillability) Reset()                    { *m = OrderFulfillability{} }
-func (m *OrderFulfillability) String() string            { return proto.CompactTextString(m) }
-func (*OrderFulfillability) ProtoMessage()               {}
-func (*OrderFulfillability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
+var xxx_messageInfo_UserInformation 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 ""
-}
-
-// [START order_definition]
-// An order for service appointments with a merchant.
-type Order struct {
-	// ID of this order, chosen by the booking partner who handles the order
-	// (required in CreateOrderResponse and ListOrdersResponse, must not be set in
-	// CreateOrderRequest)
-	OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId" json:"order_id,omitempty"`
-	// Personal information of the user making the order (required)
-	UserInformation *UserInformation `protobuf:"bytes,2,opt,name=user_information,json=userInformation" json:"user_information,omitempty"`
-	// Information about payment transactions that relate to the order.
-	// (optional)
-	PaymentInformation *PaymentInformation `protobuf:"bytes,3,opt,name=payment_information,json=paymentInformation" json:"payment_information,omitempty"`
-	// The merchant that all services in this order belong to.
-	MerchantId string `protobuf:"bytes,4,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
-	// Line items in this order.
-	Item []*LineItem `protobuf:"bytes,5,rep,name=item" json:"item,omitempty"`
-}
-
-func (m *Order) Reset()                    { *m = Order{} }
-func (m *Order) String() string            { return proto.CompactTextString(m) }
-func (*Order) ProtoMessage()               {}
-func (*Order) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
-
-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
-}
-
-// [START orderfailure_definition]
-// Status data that conveys why creating an order fails.
-// OrderFailure is intended to primarily capture business logic errors.
-type OrderFailure struct {
-	// The reason why the order failed. (required)
-	Cause OrderFailure_Cause `protobuf:"varint,1,opt,name=cause,enum=v3.OrderFailure_Cause" json:"cause,omitempty"`
-	// (required only if cause is ORDER_UNFULFILLABLE)
-	Fulfillability *OrderFulfillability `protobuf:"bytes,2,opt,name=fulfillability" json:"fulfillability,omitempty"`
-	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
-	RejectedCardType CreditCardType `protobuf:"varint,3,opt,name=rejected_card_type,json=rejectedCardType,enum=v3.CreditCardType" json:"rejected_card_type,omitempty"`
-	// This optional field is used for the partner to include additional
-	// information for debugging purpose only. (optional)
-	Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
-}
-
-func (m *OrderFailure) Reset()                    { *m = OrderFailure{} }
-func (m *OrderFailure) String() string            { return proto.CompactTextString(m) }
-func (*OrderFailure) ProtoMessage()               {}
-func (*OrderFailure) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
-
-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 ""
-}
-
-// [START method_check_availability]
-// Request to check availability for a Slot.
-type CheckAvailabilityRequest struct {
-	// The appointment slot that is being checked (required)
-	Slot *Slot `protobuf:"bytes,1,opt,name=slot" json:"slot,omitempty"`
-}
-
-func (m *CheckAvailabilityRequest) Reset()                    { *m = CheckAvailabilityRequest{} }
-func (m *CheckAvailabilityRequest) String() string            { return proto.CompactTextString(m) }
-func (*CheckAvailabilityRequest) ProtoMessage()               {}
-func (*CheckAvailabilityRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
-
-func (m *CheckAvailabilityRequest) GetSlot() *Slot {
-	if m != nil {
-		return m.Slot
-	}
-	return nil
-}
-
-// Response for the CheckAvailability RPC with the availability of the
-// appointment slot.
-type CheckAvailabilityResponse struct {
-	// The requested slot. (required)
-	Slot *Slot `protobuf:"bytes,1,opt,name=slot" json:"slot,omitempty"`
-	// Number of available spots.
-	// 0 indicates that the appointment slot is not available. (required)
-	CountAvailable int32 `protobuf:"varint,2,opt,name=count_available,json=countAvailable" json:"count_available,omitempty"`
-	// The requirement to show the slots duration and/or endtime. This field will
-	// be ignored if the slot is unavailable. (optional)
-	DurationRequirement CheckAvailabilityResponse_DurationRequirement `protobuf:"varint,3,opt,name=duration_requirement,json=durationRequirement,enum=v3.CheckAvailabilityResponse_DurationRequirement" json:"duration_requirement,omitempty"`
-	// Optionally, the partner can return additional updated information about the
-	// availability for this merchant if this information is present when
-	// responding to the CheckAvailabilityRequest and if there is no negative
-	// impact on the CheckAvailability request latency.
-	// For instance an entire day of merchant availability for a superset of
-	// resources can be returned here.
-	AvailabilityUpdate *AvailabilityUpdate `protobuf:"bytes,4,opt,name=availability_update,json=availabilityUpdate" json:"availability_update,omitempty"`
-}
-
-func (m *CheckAvailabilityResponse) Reset()                    { *m = CheckAvailabilityResponse{} }
-func (m *CheckAvailabilityResponse) String() string            { return proto.CompactTextString(m) }
-func (*CheckAvailabilityResponse) ProtoMessage()               {}
-func (*CheckAvailabilityResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
-
-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
-}
-
-// [START method_get_booking_status]
-// Request to get booking status and prepayment status for a Booking.
-type GetBookingStatusRequest struct {
-	// ID of the existing booking (required)
-	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId" json:"booking_id,omitempty"`
-}
-
-func (m *GetBookingStatusRequest) Reset()                    { *m = GetBookingStatusRequest{} }
-func (m *GetBookingStatusRequest) String() string            { return proto.CompactTextString(m) }
-func (*GetBookingStatusRequest) ProtoMessage()               {}
-func (*GetBookingStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
-
-func (m *GetBookingStatusRequest) GetBookingId() string {
-	if m != nil {
-		return m.BookingId
-	}
-	return ""
-}
-
-// Response for the GetBookingStatus RPC with booking status and prepayment
-// status.
-type GetBookingStatusResponse struct {
-	// ID of the booking (required)
-	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId" json:"booking_id,omitempty"`
-	// Status of the booking (required)
-	BookingStatus BookingStatus `protobuf:"varint,2,opt,name=booking_status,json=bookingStatus,enum=v3.BookingStatus" json:"booking_status,omitempty"`
-	// Prepayment status of the booking (required)
-	PrepaymentStatus PrepaymentStatus `protobuf:"varint,3,opt,name=prepayment_status,json=prepaymentStatus,enum=v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
-}
-
-func (m *GetBookingStatusResponse) Reset()                    { *m = GetBookingStatusResponse{} }
-func (m *GetBookingStatusResponse) String() string            { return proto.CompactTextString(m) }
-func (*GetBookingStatusResponse) ProtoMessage()               {}
-func (*GetBookingStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
-
-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
-}
-
-// [START method_check_order_fulfillability]
-// Request to check the fulfillability of an order.
-type CheckOrderFulfillabilityRequest struct {
-	// The merchant that this order is intended for. (required)
-	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
-	// The line items in this order. All services requested must belong to the
-	// specified merchant. (required)
-	Item []*LineItem `protobuf:"bytes,2,rep,name=item" json:"item,omitempty"`
-}
-
-func (m *CheckOrderFulfillabilityRequest) Reset()         { *m = CheckOrderFulfillabilityRequest{} }
-func (m *CheckOrderFulfillabilityRequest) String() string { return proto.CompactTextString(m) }
-func (*CheckOrderFulfillabilityRequest) ProtoMessage()    {}
-func (*CheckOrderFulfillabilityRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{33}
-}
-
-func (m *CheckOrderFulfillabilityRequest) GetMerchantId() string {
-	if m != nil {
-		return m.MerchantId
-	}
-	return ""
-}
-
-func (m *CheckOrderFulfillabilityRequest) GetItem() []*LineItem {
-	if m != nil {
-		return m.Item
-	}
-	return nil
-}
-
-// Response for the CheckOrderfulfillabilityRequest.
-type CheckOrderFulfillabilityResponse struct {
-	// Fulfillability status of the order, potentially contains updated
-	// availabilities and prices of the requested line item. (required)
-	Fulfillability *OrderFulfillability `protobuf:"bytes,1,opt,name=fulfillability" json:"fulfillability,omitempty"`
-	// Total processing fees & taxes that need to be paid for this order.
-	// (required)
-	FeesAndTaxes *Price `protobuf:"bytes,2,opt,name=fees_and_taxes,json=feesAndTaxes" json:"fees_and_taxes,omitempty"`
-}
-
-func (m *CheckOrderFulfillabilityResponse) Reset()         { *m = CheckOrderFulfillabilityResponse{} }
-func (m *CheckOrderFulfillabilityResponse) String() string { return proto.CompactTextString(m) }
-func (*CheckOrderFulfillabilityResponse) ProtoMessage()    {}
-func (*CheckOrderFulfillabilityResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor0, []int{34}
-}
-
-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
-}
-
-// [START method_create_booking]
-// Request to create a Booking for an inventory slot. Consumes the lease if
-// provided.
-type CreateBookingRequest struct {
-	// The inventory slot that is being requested to make this booking.
-	// If lease_ref is provided, slot must match the lease; slot is provided for
-	// the partner to verify the lease information.
-	// If lease_ref is absent, then create the booking for the slot. (required)
-	Slot *Slot `protobuf:"bytes,1,opt,name=slot" json:"slot,omitempty"`
-	// The lease that is being confirmed to make this booking.
-	// If lease_ref is provided, then create the booking using the lease.
-	// (optional)
-	LeaseRef *LeaseReference `protobuf:"bytes,2,opt,name=lease_ref,json=leaseRef" json:"lease_ref,omitempty"`
-	// Personal information of the user making the appointment (required)
-	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation" json:"user_information,omitempty"`
-	// Information about payments. When payment authorizations are handled by
-	// Google, if the booking request does not succeed, payment authorizations are
-	// automatically canceled. (optional)
-	PaymentInformation *PaymentInformation `protobuf:"bytes,4,opt,name=payment_information,json=paymentInformation" json:"payment_information,omitempty"`
-	// The parameters to be used if the payment is processed by the partner
-	// (i.e. payment_information.payment_processed_by is equal to
-	// PROCESSED_BY_PARTNER). (optional)
-	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,5,opt,name=payment_processing_parameters,json=paymentProcessingParameters" json:"payment_processing_parameters,omitempty"`
-	// Idempotency token for CreateBooking requests. (required)
-	IdempotencyToken string `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken" json:"idempotency_token,omitempty"`
-	// A string from the user which contains any special requests or additional
-	// information that they would like to notify the merchant about. (optional)
-	AdditionalRequest string `protobuf:"bytes,7,opt,name=additional_request,json=additionalRequest" json:"additional_request,omitempty"`
-}
-
-func (m *CreateBookingRequest) Reset()                    { *m = CreateBookingRequest{} }
-func (m *CreateBookingRequest) String() string            { return proto.CompactTextString(m) }
-func (*CreateBookingRequest) ProtoMessage()               {}
-func (*CreateBookingRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
-
-func (m *CreateBookingRequest) GetSlot() *Slot {
-	if m != nil {
-		return m.Slot
-	}
-	return nil
-}
-
-func (m *CreateBookingRequest) GetLeaseRef() *LeaseReference {
-	if m != nil {
-		return m.LeaseRef
-	}
-	return nil
-}
-
-func (m *CreateBookingRequest) GetUserInformation() *UserInformation {
-	if m != nil {
-		return m.UserInformation
-	}
-	return nil
-}
-
-func (m *CreateBookingRequest) GetPaymentInformation() *PaymentInformation {
-	if m != nil {
-		return m.PaymentInformation
-	}
-	return nil
-}
-
-func (m *CreateBookingRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
-	if m != nil {
-		return m.PaymentProcessingParameters
-	}
-	return nil
-}
-
-func (m *CreateBookingRequest) GetIdempotencyToken() string {
-	if m != nil {
-		return m.IdempotencyToken
-	}
-	return ""
-}
-
-func (m *CreateBookingRequest) GetAdditionalRequest() string {
-	if m != nil {
-		return m.AdditionalRequest
-	}
-	return ""
-}
-
-// Response with the created Booking for an inventory slot.
-type CreateBookingResponse struct {
-	// The created booking (required)
-	Booking *Booking `protobuf:"bytes,1,opt,name=booking" json:"booking,omitempty"`
-	// The updated user payment option used in this booking.
-	// If a new payment option was purchased to pay for the booking, this should
-	// be a newly created user payment option.
-	// If an already purchased user payment option was used for this booking,
-	// this should reflect an updated version of that user payment option.
-	// (optional)
-	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption" json:"user_payment_option,omitempty"`
-	// If creating a booking fails, this field should reflect the business logic
-	// error (e.g., slot has become unavailable) and all other fields in the
-	// CreateBookingResponse message are expected to be unset. (required if
-	// failure occurs)
-	BookingFailure *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure" json:"booking_failure,omitempty"`
-}
-
-func (m *CreateBookingResponse) Reset()                    { *m = CreateBookingResponse{} }
-func (m *CreateBookingResponse) String() string            { return proto.CompactTextString(m) }
-func (*CreateBookingResponse) ProtoMessage()               {}
-func (*CreateBookingResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
-
-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
-}
-
-// [START method_create_order]
-// Request to create an order.
-type CreateOrderRequest struct {
-	// The order to create. (required)
-	Order *Order `protobuf:"bytes,1,opt,name=order" json:"order,omitempty"`
-	// The parameters to be used if the payment is processed by the partner
-	// (i.e. order.payment_information.payment_processed_by is equal to
-	// PROCESSED_BY_PARTNER). (required if payment is processed by the partner)
-	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,2,opt,name=payment_processing_parameters,json=paymentProcessingParameters" json:"payment_processing_parameters,omitempty"`
-	// Idempotency token for CreateOrder requests. (required)
-	IdempotencyToken string `protobuf:"bytes,3,opt,name=idempotency_token,json=idempotencyToken" json:"idempotency_token,omitempty"`
-}
-
-func (m *CreateOrderRequest) Reset()                    { *m = CreateOrderRequest{} }
-func (m *CreateOrderRequest) String() string            { return proto.CompactTextString(m) }
-func (*CreateOrderRequest) ProtoMessage()               {}
-func (*CreateOrderRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
-
-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 {
-	// The order created. (required)
-	Order *Order `protobuf:"bytes,1,opt,name=order" json:"order,omitempty"`
-	// If creating an order fails, this field should reflect the business logic
-	// error (e.g., slot has become unavailable or price has changed) and all
-	// other fields in the CreateOrderResponse are expected to be unset. (required
-	// if failure occurs)
-	OrderFailure *OrderFailure `protobuf:"bytes,2,opt,name=order_failure,json=orderFailure" json:"order_failure,omitempty"`
-}
-
-func (m *CreateOrderResponse) Reset()                    { *m = CreateOrderResponse{} }
-func (m *CreateOrderResponse) String() string            { return proto.CompactTextString(m) }
-func (*CreateOrderResponse) ProtoMessage()               {}
-func (*CreateOrderResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
-
-func (m *CreateOrderResponse) GetOrder() *Order {
-	if m != nil {
-		return m.Order
-	}
-	return nil
-}
-
-func (m *CreateOrderResponse) GetOrderFailure() *OrderFailure {
-	if m != nil {
-		return m.OrderFailure
-	}
-	return nil
-}
-
-// [START method_create_lease]
-// Request to create a Leaese for a slot in the inventory.  The expiration time
-// in the returned Lease may be modified by the backend, e.g. if the requested
-// lease period is too long.
-type CreateLeaseRequest struct {
-	// The lease to be created with information about the appointment slot
-	// (required)
-	Lease *Lease `protobuf:"bytes,1,opt,name=lease" json:"lease,omitempty"`
-}
-
-func (m *CreateLeaseRequest) Reset()                    { *m = CreateLeaseRequest{} }
-func (m *CreateLeaseRequest) String() string            { return proto.CompactTextString(m) }
-func (*CreateLeaseRequest) ProtoMessage()               {}
-func (*CreateLeaseRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
-
-func (m *CreateLeaseRequest) GetLease() *Lease {
-	if m != nil {
-		return m.Lease
-	}
-	return nil
-}
-
-// Response for the CreateLease RPC with the created Lease.
-type CreateLeaseResponse struct {
-	// The created Lease (required)
-	Lease *Lease `protobuf:"bytes,1,opt,name=lease" json:"lease,omitempty"`
-	// If creating a lease fails, this field should reflect the business logic
-	// error (e.g., slot has become unavailable) and lease field is expected to be
-	// unset. (required if failure occurs)
-	BookingFailure *BookingFailure `protobuf:"bytes,2,opt,name=booking_failure,json=bookingFailure" json:"booking_failure,omitempty"`
-}
-
-func (m *CreateLeaseResponse) Reset()                    { *m = CreateLeaseResponse{} }
-func (m *CreateLeaseResponse) String() string            { return proto.CompactTextString(m) }
-func (*CreateLeaseResponse) ProtoMessage()               {}
-func (*CreateLeaseResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
-
-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
-}
-
-// [START method_list_bookings]
-// Request to list all bookings for a user
-type ListBookingsRequest struct {
-	// ID of the user (required)
-	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId" json:"user_id,omitempty"`
-}
-
-func (m *ListBookingsRequest) Reset()                    { *m = ListBookingsRequest{} }
-func (m *ListBookingsRequest) String() string            { return proto.CompactTextString(m) }
-func (*ListBookingsRequest) ProtoMessage()               {}
-func (*ListBookingsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
-
-func (m *ListBookingsRequest) GetUserId() string {
+func (m *UserInformation) GetUserId() string {
 	if m != nil {
 		return m.UserId
 	}
 	return ""
 }
 
-// Response for the ListBookings RPC with all bookings for the requested user.
-type ListBookingsResponse struct {
-	// All bookings of the user (required)
-	Bookings []*Booking `protobuf:"bytes,1,rep,name=bookings" json:"bookings,omitempty"`
-}
-
-func (m *ListBookingsResponse) Reset()                    { *m = ListBookingsResponse{} }
-func (m *ListBookingsResponse) String() string            { return proto.CompactTextString(m) }
-func (*ListBookingsResponse) ProtoMessage()               {}
-func (*ListBookingsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
-
-func (m *ListBookingsResponse) GetBookings() []*Booking {
+func (m *UserInformation) GetGivenName() string {
 	if m != nil {
-		return m.Bookings
-	}
-	return nil
-}
-
-// [START method_list_orders]
-// Request to list orders.
-type ListOrdersRequest struct {
-	// ID of the user (required only if order_id is not set).
-	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId" json:"user_id,omitempty"`
-	// If set, return only the specified orders; otherwise, return all orders of
-	// the user. (required only if user_id is not set).
-	OrderId []string `protobuf:"bytes,2,rep,name=order_id,json=orderId" json:"order_id,omitempty"`
-}
-
-func (m *ListOrdersRequest) Reset()                    { *m = ListOrdersRequest{} }
-func (m *ListOrdersRequest) String() string            { return proto.CompactTextString(m) }
-func (*ListOrdersRequest) ProtoMessage()               {}
-func (*ListOrdersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
-
-func (m *ListOrdersRequest) GetUserId() string {
-	if m != nil {
-		return m.UserId
+		return m.GivenName
 	}
 	return ""
 }
 
-func (m *ListOrdersRequest) GetOrderId() []string {
+func (m *UserInformation) GetFamilyName() string {
 	if m != nil {
-		return m.OrderId
+		return m.FamilyName
+	}
+	return ""
+}
+
+func (m *UserInformation) GetAddress() *PostalAddress {
+	if m != nil {
+		return m.Address
 	}
 	return nil
 }
 
-// Response for the ListOrders RPC.
-type ListOrdersResponse struct {
-	// All requested orders (required)
-	Order []*Order `protobuf:"bytes,1,rep,name=order" json:"order,omitempty"`
-}
-
-func (m *ListOrdersResponse) Reset()                    { *m = ListOrdersResponse{} }
-func (m *ListOrdersResponse) String() string            { return proto.CompactTextString(m) }
-func (*ListOrdersResponse) ProtoMessage()               {}
-func (*ListOrdersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
-
-func (m *ListOrdersResponse) GetOrder() []*Order {
+func (m *UserInformation) GetTelephone() string {
 	if m != nil {
-		return m.Order
+		return m.Telephone
 	}
-	return nil
+	return ""
 }
 
-// [START method_update_booking]
-// Request to update a Booking.
-type UpdateBookingRequest struct {
-	// The booking to be updated
-	// The following fields can be set in a booking:
-	// - status, to cancel a booking.
-	// - start_time and duration in the slot, to reschedule a booking. (required)
-	Booking *Booking `protobuf:"bytes,1,opt,name=booking" json:"booking,omitempty"`
-}
-
-func (m *UpdateBookingRequest) Reset()                    { *m = UpdateBookingRequest{} }
-func (m *UpdateBookingRequest) String() string            { return proto.CompactTextString(m) }
-func (*UpdateBookingRequest) ProtoMessage()               {}
-func (*UpdateBookingRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
-
-func (m *UpdateBookingRequest) GetBooking() *Booking {
+func (m *UserInformation) GetEmail() string {
 	if m != nil {
-		return m.Booking
+		return m.Email
 	}
-	return nil
+	return ""
 }
 
-// Response with the updated Booking.
-type UpdateBookingResponse struct {
-	// The updated booking (required)
-	Booking *Booking `protobuf:"bytes,1,opt,name=booking" json:"booking,omitempty"`
-	// The updated user payment option originally used to pay for this booking.
-	// This should be set if the UpdateBookingRequest results in a change to
-	// the UserPaymentOption.
-	// For instance, if the booking is canceled, the UserPaymentOption should
-	// reflect an additional credit to the user. In the case of a multi-use
-	// payment option, the current_count should be increased by one to
-	// allow the user to create another booking with this payment option. In the
-	// case of a single-use payment option, a new single-use user payment option
-	// should be returned. (required if altered in update)
-	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption" json:"user_payment_option,omitempty"`
-	// If updating a booking fails, this field should reflect the business logic
-	// error (e.g., booking is not cancellable) (required if failure occurs)
-	BookingFailure *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure" json:"booking_failure,omitempty"`
+// 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 *UpdateBookingResponse) Reset()                    { *m = UpdateBookingResponse{} }
-func (m *UpdateBookingResponse) String() string            { return proto.CompactTextString(m) }
-func (*UpdateBookingResponse) ProtoMessage()               {}
-func (*UpdateBookingResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
+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)
+}
 
-func (m *UpdateBookingResponse) GetBooking() *Booking {
+var xxx_messageInfo_PostalAddress proto.InternalMessageInfo
+
+func (m *PostalAddress) GetCountry() string {
 	if m != nil {
-		return m.Booking
+		return m.Country
 	}
-	return nil
+	return ""
 }
 
-func (m *UpdateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
+func (m *PostalAddress) GetLocality() string {
 	if m != nil {
-		return m.UserPaymentOption
+		return m.Locality
 	}
-	return nil
+	return ""
 }
 
-func (m *UpdateBookingResponse) GetBookingFailure() *BookingFailure {
+func (m *PostalAddress) GetRegion() string {
 	if m != nil {
-		return m.BookingFailure
+		return m.Region
 	}
-	return nil
+	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((*PostalAddress)(nil), "v3.PostalAddress")
-	proto.RegisterType((*GeoCoordinates)(nil), "v3.GeoCoordinates")
-	proto.RegisterType((*Price)(nil), "v3.Price")
-	proto.RegisterType((*TaxRate)(nil), "v3.TaxRate")
-	proto.RegisterType((*SchedulingRules)(nil), "v3.SchedulingRules")
-	proto.RegisterType((*IngestionQueuePayload)(nil), "v3.IngestionQueuePayload")
-	proto.RegisterType((*IngestionStatus)(nil), "v3.IngestionStatus")
-	proto.RegisterType((*TimeRange)(nil), "v3.TimeRange")
-	proto.RegisterType((*NoShowFee)(nil), "v3.NoShowFee")
-	proto.RegisterType((*Deposit)(nil), "v3.Deposit")
-	proto.RegisterType((*ActionLink)(nil), "v3.ActionLink")
-	proto.RegisterType((*Slot)(nil), "v3.Slot")
-	proto.RegisterType((*Lease)(nil), "v3.Lease")
-	proto.RegisterType((*LeaseReference)(nil), "v3.LeaseReference")
-	proto.RegisterType((*Booking)(nil), "v3.Booking")
-	proto.RegisterType((*UserInformation)(nil), "v3.UserInformation")
-	proto.RegisterType((*PaymentProcessingParameters)(nil), "v3.PaymentProcessingParameters")
-	proto.RegisterType((*UserPaymentOption)(nil), "v3.UserPaymentOption")
-	proto.RegisterType((*PaymentInformation)(nil), "v3.PaymentInformation")
-	proto.RegisterType((*BookingFailure)(nil), "v3.BookingFailure")
-	proto.RegisterType((*SlotAvailability)(nil), "v3.SlotAvailability")
-	proto.RegisterType((*AvailabilityUpdate)(nil), "v3.AvailabilityUpdate")
-	proto.RegisterType((*ResourceIds)(nil), "v3.ResourceIds")
-	proto.RegisterType((*TicketType)(nil), "v3.TicketType")
-	proto.RegisterType((*LineItem)(nil), "v3.LineItem")
-	proto.RegisterType((*LineItem_OrderedTickets)(nil), "v3.LineItem.OrderedTickets")
-	proto.RegisterType((*LineItemFulfillability)(nil), "v3.LineItemFulfillability")
-	proto.RegisterType((*OrderFulfillability)(nil), "v3.OrderFulfillability")
-	proto.RegisterType((*Order)(nil), "v3.Order")
-	proto.RegisterType((*OrderFailure)(nil), "v3.OrderFailure")
-	proto.RegisterType((*CheckAvailabilityRequest)(nil), "v3.CheckAvailabilityRequest")
-	proto.RegisterType((*CheckAvailabilityResponse)(nil), "v3.CheckAvailabilityResponse")
-	proto.RegisterType((*GetBookingStatusRequest)(nil), "v3.GetBookingStatusRequest")
-	proto.RegisterType((*GetBookingStatusResponse)(nil), "v3.GetBookingStatusResponse")
-	proto.RegisterType((*CheckOrderFulfillabilityRequest)(nil), "v3.CheckOrderFulfillabilityRequest")
-	proto.RegisterType((*CheckOrderFulfillabilityResponse)(nil), "v3.CheckOrderFulfillabilityResponse")
-	proto.RegisterType((*CreateBookingRequest)(nil), "v3.CreateBookingRequest")
-	proto.RegisterType((*CreateBookingResponse)(nil), "v3.CreateBookingResponse")
-	proto.RegisterType((*CreateOrderRequest)(nil), "v3.CreateOrderRequest")
-	proto.RegisterType((*CreateOrderResponse)(nil), "v3.CreateOrderResponse")
-	proto.RegisterType((*CreateLeaseRequest)(nil), "v3.CreateLeaseRequest")
-	proto.RegisterType((*CreateLeaseResponse)(nil), "v3.CreateLeaseResponse")
-	proto.RegisterType((*ListBookingsRequest)(nil), "v3.ListBookingsRequest")
-	proto.RegisterType((*ListBookingsResponse)(nil), "v3.ListBookingsResponse")
-	proto.RegisterType((*ListOrdersRequest)(nil), "v3.ListOrdersRequest")
-	proto.RegisterType((*ListOrdersResponse)(nil), "v3.ListOrdersResponse")
-	proto.RegisterType((*UpdateBookingRequest)(nil), "v3.UpdateBookingRequest")
-	proto.RegisterType((*UpdateBookingResponse)(nil), "v3.UpdateBookingResponse")
-	proto.RegisterEnum("v3.IngestionSource", IngestionSource_name, IngestionSource_value)
-	proto.RegisterEnum("v3.ContentType", ContentType_name, ContentType_value)
-	proto.RegisterEnum("v3.PriceType", PriceType_name, PriceType_value)
-	proto.RegisterEnum("v3.RequireCreditCard", RequireCreditCard_name, RequireCreditCard_value)
-	proto.RegisterEnum("v3.PaymentOptionType", PaymentOptionType_name, PaymentOptionType_value)
-	proto.RegisterEnum("v3.BookingStatus", BookingStatus_name, BookingStatus_value)
-	proto.RegisterEnum("v3.CreditCardType", CreditCardType_name, CreditCardType_value)
-	proto.RegisterEnum("v3.PrepaymentStatus", PrepaymentStatus_name, PrepaymentStatus_value)
-	proto.RegisterEnum("v3.IngestionStatus_Code", IngestionStatus_Code_name, IngestionStatus_Code_value)
-	proto.RegisterEnum("v3.PaymentProcessingParameters_PaymentProcessor", PaymentProcessingParameters_PaymentProcessor_name, PaymentProcessingParameters_PaymentProcessor_value)
-	proto.RegisterEnum("v3.PaymentInformation_PaymentProcessedBy", PaymentInformation_PaymentProcessedBy_name, PaymentInformation_PaymentProcessedBy_value)
-	proto.RegisterEnum("v3.BookingFailure_Cause", BookingFailure_Cause_name, BookingFailure_Cause_value)
-	proto.RegisterEnum("v3.LineItemFulfillability_ItemFulfillabilityResult", LineItemFulfillability_ItemFulfillabilityResult_name, LineItemFulfillability_ItemFulfillabilityResult_value)
-	proto.RegisterEnum("v3.OrderFulfillability_OrderFulfillabilityResult", OrderFulfillability_OrderFulfillabilityResult_name, OrderFulfillability_OrderFulfillabilityResult_value)
-	proto.RegisterEnum("v3.OrderFailure_Cause", OrderFailure_Cause_name, OrderFailure_Cause_value)
-	proto.RegisterEnum("v3.CheckAvailabilityResponse_DurationRequirement", CheckAvailabilityResponse_DurationRequirement_name, CheckAvailabilityResponse_DurationRequirement_value)
+	proto.RegisterType((*CheckAvailabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityRequest")
+	proto.RegisterType((*CheckAvailabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityResponse")
+	proto.RegisterType((*AvailabilityUpdate)(nil), "ext.maps.booking.partner.v3.AvailabilityUpdate")
+	proto.RegisterType((*SlotAvailability)(nil), "ext.maps.booking.partner.v3.SlotAvailability")
+	proto.RegisterType((*CheckOrderFulfillabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityRequest")
+	proto.RegisterType((*CheckOrderFulfillabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityResponse")
+	proto.RegisterType((*GetBookingStatusRequest)(nil), "ext.maps.booking.partner.v3.GetBookingStatusRequest")
+	proto.RegisterType((*GetBookingStatusResponse)(nil), "ext.maps.booking.partner.v3.GetBookingStatusResponse")
+	proto.RegisterType((*CreateBookingRequest)(nil), "ext.maps.booking.partner.v3.CreateBookingRequest")
+	proto.RegisterType((*CreateBookingResponse)(nil), "ext.maps.booking.partner.v3.CreateBookingResponse")
+	proto.RegisterType((*CreateLeaseRequest)(nil), "ext.maps.booking.partner.v3.CreateLeaseRequest")
+	proto.RegisterType((*CreateLeaseResponse)(nil), "ext.maps.booking.partner.v3.CreateLeaseResponse")
+	proto.RegisterType((*Lease)(nil), "ext.maps.booking.partner.v3.Lease")
+	proto.RegisterType((*LeaseReference)(nil), "ext.maps.booking.partner.v3.LeaseReference")
+	proto.RegisterType((*CreateOrderRequest)(nil), "ext.maps.booking.partner.v3.CreateOrderRequest")
+	proto.RegisterType((*CreateOrderResponse)(nil), "ext.maps.booking.partner.v3.CreateOrderResponse")
+	proto.RegisterType((*ListBookingsRequest)(nil), "ext.maps.booking.partner.v3.ListBookingsRequest")
+	proto.RegisterType((*ListBookingsResponse)(nil), "ext.maps.booking.partner.v3.ListBookingsResponse")
+	proto.RegisterType((*ListOrdersRequest)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest")
+	proto.RegisterType((*ListOrdersRequest_OrderIds)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest.OrderIds")
+	proto.RegisterType((*ListOrdersResponse)(nil), "ext.maps.booking.partner.v3.ListOrdersResponse")
+	proto.RegisterType((*UpdateBookingRequest)(nil), "ext.maps.booking.partner.v3.UpdateBookingRequest")
+	proto.RegisterType((*UpdateBookingResponse)(nil), "ext.maps.booking.partner.v3.UpdateBookingResponse")
+	proto.RegisterType((*Booking)(nil), "ext.maps.booking.partner.v3.Booking")
+	proto.RegisterType((*BookingFailure)(nil), "ext.maps.booking.partner.v3.BookingFailure")
+	proto.RegisterType((*Order)(nil), "ext.maps.booking.partner.v3.Order")
+	proto.RegisterType((*LineItem)(nil), "ext.maps.booking.partner.v3.LineItem")
+	proto.RegisterType((*LineItem_OrderedTickets)(nil), "ext.maps.booking.partner.v3.LineItem.OrderedTickets")
+	proto.RegisterType((*OrderFailure)(nil), "ext.maps.booking.partner.v3.OrderFailure")
+	proto.RegisterType((*OrderFulfillability)(nil), "ext.maps.booking.partner.v3.OrderFulfillability")
+	proto.RegisterType((*LineItemFulfillability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability")
+	proto.RegisterType((*LineItemFulfillability_UpdatedAvailability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability.UpdatedAvailability")
+	proto.RegisterType((*TicketType)(nil), "ext.maps.booking.partner.v3.TicketType")
+	proto.RegisterType((*ResourceIds)(nil), "ext.maps.booking.partner.v3.ResourceIds")
+	proto.RegisterType((*PaymentProcessingParameters)(nil), "ext.maps.booking.partner.v3.PaymentProcessingParameters")
+	proto.RegisterType((*UserPaymentOption)(nil), "ext.maps.booking.partner.v3.UserPaymentOption")
+	proto.RegisterType((*PaymentInformation)(nil), "ext.maps.booking.partner.v3.PaymentInformation")
+	proto.RegisterType((*Price)(nil), "ext.maps.booking.partner.v3.Price")
+	proto.RegisterType((*NoShowFee)(nil), "ext.maps.booking.partner.v3.NoShowFee")
+	proto.RegisterType((*Deposit)(nil), "ext.maps.booking.partner.v3.Deposit")
+	proto.RegisterType((*Slot)(nil), "ext.maps.booking.partner.v3.Slot")
+	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.UserInformation")
+	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.PostalAddress")
+	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", fileDescriptor0) }
+func init() { proto.RegisterFile("v3.proto", fileDescriptor_v3_e164fdd8b81531d4) }
 
-var fileDescriptor0 = []byte{
-	// 3731 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcd, 0x73, 0x1b, 0xd9,
-	0x56, 0x9f, 0xd6, 0x87, 0x6d, 0x1d, 0xdb, 0x72, 0xfb, 0xda, 0xb1, 0x95, 0x38, 0x19, 0x3b, 0x3d,
-	0x33, 0x4c, 0xe2, 0xcc, 0x78, 0xde, 0x4b, 0xde, 0x54, 0x0d, 0x45, 0xc1, 0xd0, 0x6e, 0x5d, 0x67,
-	0x9a, 0xc8, 0x2d, 0xcd, 0x55, 0x2b, 0x99, 0xc0, 0xa2, 0xe9, 0xa8, 0xaf, 0x95, 0x26, 0x52, 0xb7,
-	0x5e, 0x77, 0xcb, 0x2f, 0x7e, 0x55, 0xaf, 0xea, 0x2d, 0xd9, 0x52, 0x50, 0xf5, 0x16, 0x14, 0x54,
-	0x41, 0x15, 0xb0, 0xa4, 0x58, 0xc0, 0x1f, 0x00, 0x0b, 0x8a, 0xa2, 0xf8, 0x07, 0x58, 0xc1, 0x3f,
-	0xc0, 0x86, 0x62, 0xc3, 0x8a, 0xba, 0x1f, 0xad, 0x6e, 0xb5, 0x24, 0x3b, 0x19, 0x60, 0xf1, 0x76,
-	0xba, 0xe7, 0x9c, 0xfb, 0x71, 0x3e, 0xee, 0x39, 0xbf, 0x73, 0x5b, 0xb0, 0x76, 0xf9, 0xe4, 0x64,
-	0x1c, 0x85, 0x49, 0x88, 0x4a, 0x97, 0x4f, 0xb4, 0xbf, 0x50, 0x60, 0xb3, 0x13, 0xc6, 0x89, 0x3b,
-	0xd4, 0x3d, 0x2f, 0xa2, 0x71, 0x8c, 0x1a, 0xb0, 0xda, 0x0f, 0x27, 0x41, 0x12, 0x5d, 0x35, 0x94,
-	0x23, 0xe5, 0x41, 0x8d, 0xa4, 0x43, 0x74, 0x07, 0xd6, 0x86, 0x61, 0xdf, 0x1d, 0xfa, 0xc9, 0x55,
-	0xa3, 0xc4, 0x59, 0xd3, 0x31, 0xda, 0x83, 0x95, 0x88, 0x0e, 0xfc, 0x30, 0x68, 0x94, 0x39, 0x47,
-	0x8e, 0xd0, 0x21, 0xac, 0x8f, 0xf9, 0xf2, 0x4e, 0x3f, 0xf4, 0x68, 0xa3, 0xc2, 0x99, 0x20, 0x48,
-	0x46, 0xe8, 0x51, 0xf4, 0x09, 0xd4, 0xe3, 0x24, 0xa2, 0x34, 0x71, 0x5c, 0x71, 0x80, 0x46, 0x95,
-	0xcb, 0x6c, 0x0a, 0xaa, 0x3c, 0x95, 0xf6, 0x13, 0xa8, 0x3f, 0xa5, 0xa1, 0x11, 0x86, 0x91, 0xe7,
-	0x07, 0x6e, 0x42, 0x63, 0x7e, 0x1a, 0x37, 0xf1, 0x93, 0x89, 0x47, 0xf9, 0x41, 0x15, 0x32, 0x1d,
-	0xa3, 0xbb, 0x50, 0x1b, 0x86, 0xc1, 0x40, 0x30, 0x4b, 0x9c, 0x99, 0x11, 0xd0, 0x23, 0x58, 0x4d,
-	0xf7, 0x62, 0x87, 0x5d, 0x7f, 0xbc, 0x7d, 0x72, 0xf9, 0xe4, 0x64, 0xc6, 0x0a, 0x24, 0x95, 0xd0,
-	0x7e, 0x06, 0xd5, 0x4e, 0xe4, 0xf7, 0x29, 0xba, 0x0f, 0x1b, 0x63, 0xf6, 0xc3, 0x19, 0xf9, 0xfd,
-	0x28, 0x8c, 0xf9, 0x9e, 0x65, 0xb2, 0xce, 0x69, 0xe7, 0x9c, 0x84, 0x3e, 0x82, 0xcd, 0xfe, 0x24,
-	0x8a, 0x68, 0xd0, 0xbf, 0x12, 0xea, 0x0a, 0x2b, 0x6d, 0xa4, 0x44, 0xae, 0xf0, 0x67, 0x80, 0xd8,
-	0x1c, 0x3f, 0x18, 0x38, 0xe1, 0x38, 0xf1, 0xc3, 0xc0, 0x49, 0xdc, 0x81, 0xb4, 0x9a, 0x2a, 0x39,
-	0x6d, 0xce, 0xb0, 0xdd, 0x81, 0x76, 0x02, 0xab, 0xb6, 0xfb, 0x96, 0xb8, 0x09, 0x65, 0xab, 0xf3,
-	0xad, 0x9d, 0x31, 0x8d, 0xfa, 0x34, 0x48, 0xf8, 0x09, 0xaa, 0x64, 0x83, 0x13, 0x3b, 0x82, 0xa6,
-	0xfd, 0xa7, 0x02, 0x5b, 0xdd, 0xfe, 0x6b, 0xea, 0x4d, 0x86, 0x7e, 0x30, 0x20, 0x93, 0x21, 0x8d,
-	0xd1, 0x09, 0xec, 0x8c, 0xfc, 0xc0, 0x71, 0xbd, 0x4b, 0x37, 0xe8, 0x53, 0xe7, 0x55, 0x18, 0xbe,
-	0xf1, 0x83, 0x81, 0x54, 0x60, 0x7b, 0xe4, 0x07, 0xba, 0xe0, 0x9c, 0x0a, 0x06, 0xfa, 0x1a, 0xee,
-	0xe6, 0xe5, 0xc3, 0x60, 0xe8, 0x07, 0xd4, 0xe9, 0xb3, 0x01, 0x5b, 0x94, 0x6b, 0x55, 0x26, 0xb7,
-	0xb3, 0x89, 0x6d, 0x2e, 0x61, 0xa4, 0x02, 0x48, 0x87, 0x5b, 0x43, 0x37, 0x49, 0xa7, 0x30, 0xaf,
-	0x84, 0x81, 0x73, 0x41, 0xa9, 0x34, 0x77, 0x8d, 0x9b, 0x9b, 0xd9, 0xed, 0xb4, 0xd4, 0x50, 0xc8,
-	0x0e, 0x93, 0x35, 0x72, 0xa2, 0x67, 0x94, 0x59, 0x09, 0x82, 0x30, 0x7e, 0x1d, 0xfe, 0x84, 0xcf,
-	0xab, 0x2c, 0x9a, 0x57, 0x13, 0x02, 0x67, 0x94, 0x6a, 0xfb, 0x70, 0xcb, 0x0c, 0x06, 0x34, 0x66,
-	0xb3, 0xbf, 0x9d, 0xd0, 0x09, 0xed, 0xb8, 0x57, 0xc3, 0xd0, 0xf5, 0xb4, 0x3f, 0xae, 0xc0, 0xd6,
-	0x94, 0xd3, 0x4d, 0xdc, 0x64, 0x12, 0xa3, 0xcf, 0xa0, 0xc2, 0x9d, 0xc3, 0xf4, 0xaf, 0x3f, 0x6e,
-	0xb0, 0x45, 0x0b, 0x22, 0x27, 0xcc, 0x51, 0x84, 0x4b, 0xa1, 0x87, 0xa0, 0x26, 0xfe, 0x88, 0xc6,
-	0x89, 0x3b, 0x1a, 0xa7, 0xae, 0x17, 0x06, 0xd8, 0x9a, 0xd2, 0xa5, 0xfb, 0x7f, 0x04, 0x7b, 0x7e,
-	0x90, 0xd0, 0x28, 0x70, 0x87, 0x0e, 0x8d, 0xa2, 0x30, 0x72, 0x3c, 0x9a, 0xb8, 0xfe, 0x30, 0x96,
-	0xde, 0xdd, 0x4d, 0xb9, 0x98, 0x31, 0x9b, 0x82, 0x87, 0x74, 0xb8, 0x37, 0x76, 0xa3, 0x24, 0xa0,
-	0x91, 0x73, 0xe9, 0xc7, 0xfe, 0xab, 0x21, 0x2d, 0x4c, 0x16, 0x77, 0xe6, 0x8e, 0x14, 0x7a, 0x2e,
-	0x64, 0xf2, 0x4b, 0x68, 0x7f, 0x5b, 0x82, 0x0a, 0x8f, 0x2d, 0x04, 0xf5, 0xae, 0xad, 0xdb, 0xbd,
-	0xae, 0xd3, 0xb3, 0x9e, 0x59, 0xed, 0x17, 0x96, 0xfa, 0x01, 0x6a, 0xc0, 0xae, 0xa4, 0x9d, 0x61,
-	0xdc, 0x74, 0x7a, 0x9d, 0x56, 0x5b, 0x6f, 0xe2, 0xa6, 0xaa, 0x14, 0x39, 0xd8, 0xfa, 0xb6, 0x87,
-	0x7b, 0xb8, 0xa9, 0x96, 0x90, 0x06, 0x1f, 0xe6, 0x39, 0x1d, 0xd2, 0x36, 0x70, 0xb7, 0x6b, 0x5a,
-	0x4f, 0x9d, 0xae, 0xad, 0x13, 0x1b, 0x37, 0xd5, 0x32, 0xfa, 0x18, 0x8e, 0x96, 0xc9, 0xf4, 0x0c,
-	0x03, 0x63, 0xb6, 0x47, 0x05, 0xdd, 0x87, 0x7b, 0x4b, 0xa4, 0xce, 0x74, 0xb3, 0x85, 0x9b, 0x6a,
-	0x15, 0xdd, 0x81, 0xbd, 0xbc, 0x48, 0xb3, 0xd7, 0x69, 0x99, 0x86, 0xce, 0x36, 0x59, 0x41, 0xb7,
-	0x60, 0x5b, 0xf2, 0xf4, 0x8e, 0xe9, 0x18, 0x7a, 0x8b, 0x4d, 0x61, 0x57, 0xe1, 0x30, 0x47, 0x5e,
-	0xb8, 0xf5, 0x05, 0x3a, 0x82, 0xbb, 0x8b, 0x85, 0xe4, 0xce, 0x03, 0x4d, 0x87, 0x9a, 0xed, 0x8f,
-	0x28, 0x71, 0x83, 0x01, 0x45, 0x07, 0x50, 0x7b, 0x45, 0x07, 0x7e, 0xe0, 0xc4, 0xb4, 0x2f, 0xef,
-	0xc6, 0x1a, 0x27, 0x74, 0x69, 0x1f, 0xed, 0xc3, 0x2a, 0x0d, 0x3c, 0xce, 0x12, 0xce, 0x5f, 0xa1,
-	0x81, 0xd7, 0xa5, 0x7d, 0x8d, 0x40, 0xcd, 0x0a, 0xbb, 0x22, 0x0c, 0xd1, 0x01, 0x94, 0x59, 0xb4,
-	0x2a, 0x85, 0x68, 0x25, 0x8c, 0x8a, 0x1e, 0xc0, 0xda, 0x05, 0xa5, 0x4e, 0x72, 0x35, 0x16, 0xf7,
-	0xa0, 0xfe, 0x78, 0x73, 0x2a, 0x61, 0x5f, 0x8d, 0x29, 0x59, 0xbd, 0xa0, 0xfc, 0x87, 0xf6, 0x67,
-	0x0a, 0xac, 0x36, 0xe9, 0x38, 0x8c, 0xfd, 0x04, 0x7d, 0x04, 0xab, 0x9e, 0xf8, 0x39, 0xbf, 0x6c,
-	0xca, 0x29, 0x5e, 0xd8, 0x99, 0x6b, 0x97, 0x1d, 0x39, 0x77, 0x61, 0xf3, 0xb7, 0x8d, 0xa9, 0xf7,
-	0x03, 0xd8, 0x90, 0x6b, 0x5d, 0x73, 0xbe, 0x75, 0x29, 0xc2, 0xcf, 0xe8, 0x03, 0xe8, 0x7d, 0x36,
-	0xbd, 0xe5, 0x07, 0x6f, 0x90, 0x0a, 0xe5, 0x49, 0x34, 0x94, 0xf5, 0x82, 0xfd, 0x14, 0xd9, 0x39,
-	0x18, 0x4c, 0xdc, 0x01, 0x9d, 0xd6, 0x0a, 0x39, 0x46, 0x9f, 0x03, 0x8a, 0x68, 0x9c, 0x44, 0x7e,
-	0x3f, 0xa1, 0x9e, 0x93, 0x16, 0x9b, 0xf2, 0x51, 0xf9, 0x41, 0x8d, 0x6c, 0x67, 0x1c, 0x43, 0x30,
-	0xb4, 0x7f, 0x53, 0xa0, 0xd2, 0x1d, 0x86, 0x09, 0xab, 0x25, 0x23, 0x1a, 0xf5, 0x5f, 0xbb, 0x41,
-	0xe2, 0xf8, 0x9e, 0xdc, 0x0d, 0x52, 0x92, 0xe9, 0xa1, 0x7b, 0x00, 0x31, 0x8d, 0x2e, 0x59, 0x92,
-	0xf6, 0x3d, 0xb9, 0x6d, 0x4d, 0x52, 0x4c, 0x8f, 0x79, 0x38, 0x4e, 0xdc, 0x28, 0xe1, 0x36, 0x29,
-	0x0b, 0x0f, 0x73, 0x02, 0x33, 0xc1, 0x7d, 0xd8, 0xf0, 0x26, 0x51, 0x66, 0xb3, 0x8a, 0x48, 0xef,
-	0x29, 0x8d, 0x89, 0x3c, 0x04, 0xd5, 0xbd, 0x74, 0xfd, 0xa1, 0xfb, 0xca, 0x67, 0x35, 0x8f, 0xe7,
-	0x6d, 0x51, 0xac, 0xb6, 0xf2, 0x74, 0xdb, 0x1d, 0xa0, 0xcf, 0xa1, 0x16, 0xd1, 0x38, 0x9c, 0x44,
-	0x7d, 0x1a, 0x37, 0x56, 0xb8, 0xe3, 0xb6, 0x98, 0x35, 0x89, 0x24, 0x9a, 0x5e, 0x4c, 0x32, 0x09,
-	0xed, 0xcf, 0x15, 0xa8, 0xb6, 0xa8, 0x1b, 0x53, 0x74, 0x1b, 0xd6, 0x86, 0xec, 0x47, 0xa6, 0xe0,
-	0x2a, 0x1f, 0x9b, 0x1e, 0xba, 0x0b, 0x95, 0x78, 0x18, 0x26, 0x5c, 0xaf, 0xf5, 0xc7, 0x6b, 0x6c,
-	0x39, 0x66, 0x16, 0xc2, 0xa9, 0xac, 0x8e, 0x4e, 0x62, 0x1a, 0x39, 0x11, 0xbd, 0xa0, 0xac, 0xd8,
-	0x50, 0x99, 0x74, 0x36, 0x19, 0x95, 0xa4, 0x44, 0xf4, 0xab, 0x70, 0x5b, 0xac, 0x4f, 0xdf, 0x8e,
-	0x7d, 0xa9, 0x2e, 0xcb, 0x63, 0x39, 0x9d, 0xf7, 0xb8, 0x00, 0x9e, 0xf2, 0xd9, 0x15, 0x61, 0xa1,
-	0xfe, 0x08, 0xea, 0xfc, 0x8c, 0xd9, 0x62, 0xcb, 0x0f, 0xab, 0xfd, 0xb7, 0x02, 0xab, 0x69, 0x3d,
-	0xb9, 0x07, 0x20, 0x6b, 0x4e, 0x26, 0x58, 0x93, 0x94, 0x1b, 0xf5, 0xfa, 0x0d, 0x50, 0xb9, 0x5e,
-	0x7e, 0x70, 0x11, 0x46, 0x23, 0x7e, 0x20, 0x59, 0x46, 0x76, 0x98, 0x64, 0x2f, 0xa6, 0x91, 0x99,
-	0xb1, 0xc8, 0xd6, 0x64, 0x96, 0x80, 0x1e, 0xc2, 0x4a, 0xcc, 0x93, 0x3a, 0xd7, 0xae, 0x2e, 0x6a,
-	0xbd, 0x3c, 0x99, 0xc8, 0xf6, 0x44, 0x0a, 0xa0, 0xa7, 0xb0, 0x33, 0x76, 0xaf, 0x46, 0x94, 0x85,
-	0x57, 0x6e, 0xb7, 0x2a, 0xdf, 0x6d, 0x8f, 0x5f, 0x06, 0xc1, 0xce, 0x6f, 0x88, 0xc6, 0x73, 0x34,
-	0xed, 0x9f, 0x15, 0xd8, 0x2a, 0x1c, 0x8c, 0x65, 0x10, 0xa1, 0x47, 0x6a, 0x81, 0x15, 0x7e, 0x52,
-	0x1e, 0xb4, 0x03, 0xff, 0x92, 0x06, 0x4e, 0xe0, 0x8e, 0xd2, 0xbb, 0x52, 0xe3, 0x14, 0xcb, 0x1d,
-	0x51, 0x16, 0xf4, 0x17, 0xee, 0xc8, 0x1f, 0x5e, 0x09, 0xbe, 0x70, 0x2a, 0x08, 0x12, 0x17, 0xc8,
-	0xa1, 0x99, 0xca, 0x4d, 0x68, 0x86, 0x01, 0xa3, 0x84, 0x0e, 0xe9, 0xf8, 0x75, 0x18, 0x50, 0x19,
-	0xbb, 0x19, 0x01, 0xed, 0x42, 0x95, 0x8e, 0x5c, 0x7f, 0xc8, 0x23, 0xb6, 0x46, 0xc4, 0x40, 0xfb,
-	0x45, 0x19, 0x0e, 0xa4, 0xe2, 0x9d, 0x28, 0xec, 0xd3, 0x38, 0xf6, 0x83, 0x41, 0xc7, 0x8d, 0xdc,
-	0x11, 0x4d, 0x68, 0x14, 0x23, 0x02, 0xb5, 0xb1, 0xa0, 0x87, 0x91, 0x2c, 0xaa, 0x3f, 0xc8, 0x19,
-	0x6b, 0xd1, 0x9c, 0x02, 0x2f, 0x8c, 0x44, 0x41, 0x9f, 0x2e, 0x83, 0x7e, 0x04, 0xbb, 0xa9, 0x2b,
-	0x46, 0x34, 0x79, 0x1d, 0x7a, 0x4e, 0x12, 0xbe, 0xa1, 0x81, 0x30, 0x0f, 0x17, 0x4e, 0xed, 0x7e,
-	0xce, 0xd9, 0x36, 0xe3, 0xb2, 0x52, 0x3a, 0x09, 0xc6, 0x6e, 0x14, 0x53, 0xcf, 0x59, 0x38, 0x5d,
-	0x68, 0x7c, 0x27, 0x15, 0xea, 0xcc, 0x2f, 0xd1, 0x80, 0xd5, 0x4b, 0x1a, 0xc5, 0x19, 0x90, 0x4d,
-	0x87, 0xe8, 0x11, 0x6c, 0xa7, 0x6b, 0x66, 0xea, 0x56, 0x24, 0x6c, 0x2b, 0xa8, 0xa3, 0x79, 0xa0,
-	0x16, 0x55, 0x64, 0xa5, 0xb0, 0xa3, 0xbf, 0x3c, 0xc7, 0x96, 0x9d, 0x16, 0xa3, 0x36, 0x71, 0x7a,
-	0x56, 0xb7, 0x83, 0x0d, 0xf3, 0xcc, 0xc4, 0x4d, 0xf5, 0x03, 0xb4, 0x0b, 0x6a, 0xc6, 0xea, 0xda,
-	0xc4, 0xec, 0x60, 0x55, 0x41, 0xfb, 0xb0, 0x93, 0x51, 0x4f, 0x89, 0x6e, 0x5a, 0x36, 0xc1, 0x58,
-	0x2d, 0x69, 0xff, 0x54, 0x82, 0x6d, 0x16, 0x67, 0x72, 0x2b, 0x81, 0x1a, 0xd1, 0x13, 0xd8, 0xe3,
-	0x91, 0x96, 0x9e, 0x56, 0xa2, 0xcc, 0x69, 0xe0, 0xed, 0x4c, 0x8a, 0x53, 0x4c, 0x0f, 0x7d, 0x01,
-	0xbb, 0x97, 0xee, 0xd0, 0xf7, 0x1c, 0x91, 0x21, 0xa7, 0x29, 0x41, 0x94, 0x8e, 0x6d, 0xce, 0xeb,
-	0x32, 0x96, 0xcc, 0x06, 0xe8, 0x11, 0x20, 0x31, 0x81, 0xd5, 0xc5, 0xa9, 0xb8, 0xc8, 0xaa, 0x5b,
-	0x9c, 0x83, 0x03, 0x2f, 0x15, 0x7e, 0x08, 0x15, 0x5e, 0x57, 0xc4, 0x15, 0xbc, 0x95, 0x8b, 0x0e,
-	0x89, 0x74, 0x59, 0x7d, 0xe1, 0x22, 0x2c, 0x8f, 0x85, 0x91, 0x3f, 0xf0, 0x03, 0xde, 0x32, 0x4c,
-	0x82, 0x84, 0x3b, 0xad, 0x4a, 0x36, 0x53, 0x2a, 0x2f, 0x0b, 0x19, 0xd4, 0x4e, 0xa4, 0xd4, 0x8a,
-	0x00, 0xc3, 0x92, 0x28, 0x84, 0x8e, 0x33, 0x97, 0x65, 0x46, 0x58, 0x15, 0x19, 0x7b, 0x3c, 0x6b,
-	0x00, 0xed, 0x4f, 0xab, 0x80, 0xe6, 0xaf, 0x37, 0xd2, 0x61, 0x7b, 0x1c, 0xd1, 0x74, 0x15, 0x99,
-	0x49, 0x44, 0x90, 0xef, 0x8a, 0xf2, 0x98, 0x32, 0x65, 0x32, 0x51, 0xc7, 0x05, 0x0a, 0x83, 0x85,
-	0xe9, 0xfc, 0x24, 0x72, 0x83, 0xd8, 0xed, 0xa7, 0x47, 0x11, 0x97, 0x3d, 0x8d, 0x74, 0x3b, 0x63,
-	0x9a, 0x1e, 0x3a, 0x84, 0x2a, 0x6f, 0x2d, 0xe6, 0x30, 0x33, 0x11, 0x74, 0xf4, 0x00, 0x20, 0x71,
-	0xdf, 0x3a, 0xee, 0x88, 0xab, 0x5f, 0x44, 0xc8, 0xa4, 0x96, 0xb8, 0x6f, 0x75, 0xce, 0x43, 0xbf,
-	0x93, 0x5d, 0x26, 0x19, 0xb9, 0xd4, 0x73, 0x5e, 0x5d, 0x71, 0xc3, 0xd6, 0x1f, 0x3f, 0x5c, 0x9c,
-	0xd8, 0x0a, 0x57, 0x94, 0x7a, 0xa7, 0x57, 0xd3, 0x3b, 0x97, 0xa3, 0xa1, 0xcf, 0x16, 0xd9, 0x98,
-	0xe7, 0x8f, 0x6f, 0x3e, 0x98, 0xb3, 0x32, 0xfa, 0x72, 0x69, 0x6c, 0xae, 0xca, 0x29, 0x0b, 0xa3,
-	0xf3, 0x93, 0x0c, 0x05, 0xad, 0x71, 0x45, 0xd7, 0xd9, 0xa1, 0x25, 0x46, 0xca, 0x70, 0xd0, 0xe7,
-	0xb0, 0x1e, 0x84, 0xce, 0xb4, 0x6b, 0xa8, 0x71, 0x51, 0x8e, 0x62, 0xa6, 0x18, 0x8d, 0x75, 0x0d,
-	0x29, 0x5c, 0xfb, 0x02, 0xea, 0x17, 0x94, 0xc6, 0x8e, 0xcb, 0x22, 0xd8, 0x7d, 0x4b, 0xe3, 0x06,
-	0x14, 0xad, 0xb8, 0xc1, 0x04, 0xf4, 0xc0, 0xb3, 0x19, 0x5b, 0x1b, 0x4d, 0x43, 0x24, 0x6f, 0x81,
-	0x8f, 0xe1, 0xa8, 0x70, 0xaf, 0x71, 0xd3, 0x39, 0x7d, 0x59, 0xb8, 0xda, 0xd9, 0x25, 0x16, 0xdc,
-	0xa7, 0xed, 0xf6, 0xd3, 0x16, 0x16, 0x28, 0x7c, 0x86, 0xd1, 0xd1, 0x89, 0x6d, 0x61, 0xa2, 0x96,
-	0x4e, 0x37, 0x00, 0xa6, 0xf5, 0xc8, 0xd3, 0x7e, 0xbf, 0x02, 0x75, 0x59, 0xb7, 0xce, 0x5c, 0x7f,
-	0x38, 0x89, 0x28, 0x3a, 0x81, 0x6a, 0xdf, 0x9d, 0xc4, 0x33, 0xad, 0xcc, 0xac, 0xc8, 0x89, 0xc1,
-	0xf8, 0x44, 0x88, 0xa1, 0xdf, 0x64, 0xc0, 0xeb, 0xf7, 0xa8, 0x80, 0x5d, 0x6e, 0xe4, 0x09, 0xb0,
-	0x57, 0xe2, 0x93, 0x11, 0x9b, 0x6c, 0x44, 0xd4, 0xf3, 0x13, 0xc3, 0x8d, 0x3c, 0x7e, 0x23, 0xd5,
-	0x54, 0x3a, 0xa5, 0xa0, 0x23, 0x58, 0xf7, 0x68, 0xdc, 0x8f, 0xfc, 0x71, 0x92, 0xa5, 0xc8, 0x3c,
-	0x49, 0xfb, 0xf7, 0x12, 0x54, 0xf9, 0xa6, 0x0c, 0xbb, 0x1b, 0x7a, 0xaf, 0x8b, 0xe7, 0x73, 0x5c,
-	0xb7, 0xd5, 0xb6, 0x9d, 0x9e, 0xa5, 0x3f, 0xd7, 0xcd, 0x96, 0x7e, 0xca, 0xad, 0x70, 0x08, 0x07,
-	0x9c, 0xaa, 0xb7, 0x08, 0xd6, 0x9b, 0x2f, 0x9d, 0xd3, 0x76, 0xfb, 0x99, 0x34, 0x63, 0x97, 0x19,
-	0x03, 0x6d, 0xc3, 0x66, 0x0b, 0xeb, 0x5d, 0xec, 0xe0, 0xef, 0x3a, 0x26, 0xe1, 0x1d, 0xc8, 0x21,
-	0x1c, 0xb4, 0x7b, 0x76, 0xd7, 0x6c, 0x62, 0xc7, 0xd0, 0x2d, 0x03, 0xb7, 0x5a, 0xba, 0x6d, 0xb6,
-	0x2d, 0xe7, 0x85, 0x69, 0x35, 0xdb, 0x2f, 0xd4, 0x4a, 0xde, 0x33, 0x98, 0x90, 0x36, 0x71, 0x0c,
-	0x9d, 0x34, 0x1d, 0xfb, 0x65, 0x07, 0x3b, 0x04, 0xff, 0x16, 0x36, 0x6c, 0xde, 0x7f, 0x1c, 0xc2,
-	0xc1, 0x02, 0xa9, 0x26, 0x36, 0x5a, 0xa6, 0xc5, 0x9b, 0x90, 0xbb, 0xd0, 0x48, 0x05, 0xda, 0x1d,
-	0xbe, 0x83, 0xd5, 0xb6, 0x9d, 0xe7, 0x7a, 0xcb, 0x6c, 0xaa, 0xab, 0xec, 0x60, 0x33, 0xd3, 0xd5,
-	0x35, 0xd6, 0x3e, 0xb1, 0x53, 0xb3, 0x53, 0x31, 0x49, 0x66, 0x83, 0xd9, 0x05, 0xd4, 0x1a, 0xba,
-	0x07, 0xb7, 0x99, 0x8e, 0xac, 0x1f, 0x49, 0x75, 0x96, 0x4a, 0xe0, 0xa6, 0x0a, 0xe8, 0x00, 0xf6,
-	0x53, 0x36, 0x5b, 0x22, 0xd5, 0x8f, 0x19, 0x6b, 0x5d, 0x7b, 0x09, 0x2a, 0x43, 0x48, 0x7a, 0x0e,
-	0x74, 0x4e, 0x51, 0x94, 0xb2, 0x10, 0x45, 0x7d, 0x0a, 0x5b, 0x3c, 0x4d, 0x3a, 0x12, 0xa8, 0x0e,
-	0x85, 0xdb, 0xab, 0xa4, 0xce, 0xc9, 0x7a, 0x4a, 0xd5, 0x5e, 0x00, 0xca, 0x2f, 0xdb, 0x1b, 0x7b,
-	0x6e, 0x42, 0x59, 0x16, 0x64, 0xcb, 0x38, 0x79, 0x98, 0xdb, 0x50, 0x8e, 0xca, 0x0f, 0xd6, 0x45,
-	0x16, 0x2c, 0x9e, 0x86, 0xa8, 0x71, 0x81, 0xa2, 0xfd, 0x2e, 0xac, 0xe7, 0xc0, 0x2f, 0x83, 0x8e,
-	0x71, 0xe2, 0x5e, 0x5c, 0xe4, 0xa0, 0x23, 0x1f, 0x9b, 0x1e, 0x43, 0x4a, 0x51, 0x18, 0x8e, 0xb2,
-	0x04, 0xb9, 0xc2, 0x86, 0x02, 0x29, 0xb1, 0x26, 0xf8, 0xca, 0x89, 0xfd, 0x9f, 0x8a, 0xbc, 0x58,
-	0x25, 0x35, 0x4e, 0xe9, 0xfa, 0x3f, 0xa5, 0xda, 0xcf, 0x15, 0x00, 0xdb, 0xef, 0xbf, 0xa1, 0xbc,
-	0x43, 0x41, 0x1f, 0x43, 0x3d, 0xe1, 0x23, 0x1e, 0xe5, 0xd9, 0x3e, 0x1b, 0xc9, 0x54, 0xc6, 0xf4,
-	0x58, 0x55, 0x8f, 0x5f, 0x87, 0x51, 0xe2, 0xe4, 0xc3, 0x5a, 0x6c, 0xab, 0x72, 0x46, 0x33, 0xa3,
-	0xdf, 0x98, 0x93, 0xb5, 0xbf, 0x29, 0xc1, 0x5a, 0xcb, 0x0f, 0xa8, 0x99, 0xd0, 0x51, 0xa1, 0x1b,
-	0x51, 0xae, 0xed, 0x46, 0x4a, 0x37, 0x74, 0x23, 0xe5, 0xf9, 0x6e, 0xe4, 0x4b, 0x58, 0x15, 0x9a,
-	0x30, 0xdc, 0xc7, 0x3c, 0x71, 0xc0, 0x8e, 0x93, 0xee, 0x7e, 0xd2, 0x8e, 0x3c, 0x1a, 0x51, 0x4f,
-	0x18, 0x24, 0x26, 0xa9, 0x6c, 0xa6, 0x43, 0x75, 0x49, 0x5d, 0xc9, 0x00, 0xf3, 0xca, 0x0d, 0x80,
-	0xf9, 0x8e, 0x01, 0xf5, 0xd9, 0x6d, 0x98, 0x52, 0xd2, 0xe8, 0x53, 0x95, 0xd7, 0x04, 0xc1, 0xf4,
-	0x18, 0xbc, 0x14, 0xb5, 0x5a, 0x84, 0x9e, 0x18, 0x68, 0xff, 0x5a, 0x86, 0xbd, 0xf4, 0xd4, 0x67,
-	0x93, 0xe1, 0x85, 0x3f, 0x9c, 0xc6, 0xf4, 0x11, 0x54, 0xfc, 0x84, 0x8e, 0x64, 0x4c, 0x6f, 0xe4,
-	0xf5, 0x23, 0x9c, 0x83, 0x9e, 0xc1, 0x4a, 0x44, 0xe3, 0xc9, 0x30, 0x91, 0x59, 0xec, 0x49, 0x5e,
-	0x66, 0x76, 0xb5, 0x93, 0x79, 0x12, 0xe1, 0x53, 0x89, 0x5c, 0x02, 0xfd, 0x10, 0x76, 0x27, 0xc1,
-	0x45, 0x2a, 0x31, 0xa4, 0x4e, 0x44, 0xdd, 0x78, 0x9a, 0xe5, 0x76, 0x66, 0x78, 0x84, 0xb3, 0xb8,
-	0x8f, 0xc7, 0x61, 0x12, 0x3b, 0xe1, 0x98, 0x06, 0xbc, 0x08, 0x57, 0x49, 0x8d, 0x53, 0xda, 0x63,
-	0x1a, 0xa0, 0x2f, 0x60, 0x3d, 0x17, 0x83, 0x8d, 0x2a, 0xf7, 0x53, 0x9d, 0x9d, 0x31, 0x0b, 0x54,
-	0x02, 0x59, 0x40, 0x6a, 0xff, 0xa2, 0x40, 0x63, 0xd9, 0x39, 0xd1, 0x31, 0xfc, 0x8a, 0x69, 0xe3,
-	0x73, 0xe7, 0xac, 0xd7, 0x3a, 0x33, 0x59, 0x32, 0x30, 0x5b, 0xa6, 0xfd, 0xd2, 0x21, 0xb8, 0xdb,
-	0x6b, 0xd9, 0x85, 0x2c, 0xbb, 0x05, 0xeb, 0x86, 0x6e, 0xa5, 0xa2, 0xaa, 0xb2, 0x30, 0xed, 0x96,
-	0x58, 0x86, 0xec, 0x59, 0xd3, 0xf5, 0x5a, 0xd8, 0xb1, 0x4d, 0xe3, 0x19, 0xb6, 0x1d, 0xa3, 0x7d,
-	0x7e, 0x6a, 0x5a, 0x3c, 0x9d, 0xaa, 0x65, 0xb4, 0x03, 0x5b, 0xa6, 0x65, 0xb4, 0x09, 0xc1, 0x06,
-	0xab, 0x71, 0xa6, 0x81, 0xd5, 0x0a, 0xfa, 0x08, 0x0e, 0xf9, 0x69, 0x66, 0xe7, 0xb7, 0xed, 0x6f,
-	0x30, 0x71, 0x08, 0xd6, 0xbb, 0x6d, 0x4b, 0xad, 0x6a, 0x7f, 0x59, 0x86, 0x1d, 0x1e, 0x22, 0x05,
-	0xcf, 0x9a, 0x53, 0xbf, 0x89, 0xd2, 0xf5, 0x43, 0x66, 0x93, 0x05, 0x82, 0x8b, 0x68, 0x05, 0xaf,
-	0x3d, 0x83, 0x1d, 0x16, 0x0a, 0xce, 0xc5, 0x8c, 0x50, 0xa3, 0xc4, 0x6d, 0x7d, 0x67, 0x79, 0x3c,
-	0x10, 0xe4, 0xcf, 0x47, 0xdc, 0xfb, 0x87, 0x80, 0xf6, 0x0f, 0x0a, 0xdc, 0x5e, 0x7a, 0x4a, 0xf4,
-	0x08, 0x3e, 0x6d, 0x93, 0x26, 0x26, 0xdf, 0xcf, 0x69, 0x07, 0xb0, 0x3f, 0x6b, 0x5e, 0x56, 0x92,
-	0x1c, 0x66, 0x76, 0xb5, 0x84, 0x3e, 0x81, 0xfb, 0xb3, 0xcc, 0x2e, 0x26, 0xcf, 0x4d, 0x03, 0x17,
-	0x9c, 0xf7, 0x31, 0x1c, 0x89, 0x13, 0x5c, 0xe3, 0xa8, 0x8a, 0xf6, 0x1f, 0x0a, 0x54, 0xb9, 0x16,
-	0x2c, 0x33, 0x87, 0xec, 0x47, 0x2e, 0x33, 0xf3, 0xb1, 0xe9, 0x2d, 0xec, 0xc5, 0x4b, 0xef, 0xd1,
-	0x8b, 0x2f, 0x69, 0xb0, 0xcb, 0xef, 0xdb, 0x60, 0x17, 0x5f, 0x82, 0x2a, 0x73, 0x2f, 0x41, 0x69,
-	0xe6, 0x10, 0x37, 0x6e, 0x41, 0xe6, 0xd0, 0xfe, 0xab, 0x04, 0x1b, 0xc2, 0x6d, 0x12, 0x4c, 0x7d,
-	0x36, 0x0b, 0xa6, 0xf6, 0xb2, 0x88, 0x5c, 0x04, 0xa5, 0xbe, 0x86, 0xfa, 0x5c, 0xc0, 0x31, 0x2d,
-	0xf6, 0x97, 0x04, 0x32, 0x29, 0x88, 0x2f, 0xc1, 0x62, 0xe5, 0xef, 0x8f, 0xc5, 0x2a, 0xf3, 0x58,
-	0xec, 0x0f, 0x94, 0x1b, 0xb0, 0xd8, 0x3e, 0xec, 0x2c, 0x88, 0x0d, 0x55, 0x79, 0x27, 0xe4, 0x54,
-	0xba, 0x09, 0x39, 0x95, 0xe7, 0xb1, 0x51, 0x45, 0xfb, 0x0a, 0x1a, 0xc6, 0x6b, 0xda, 0x7f, 0x33,
-	0x03, 0x17, 0xe8, 0x8f, 0x27, 0x34, 0x4e, 0xae, 0xc7, 0x30, 0xda, 0xcf, 0xcb, 0x70, 0x7b, 0xc1,
-	0xd4, 0x78, 0x1c, 0x06, 0x31, 0xfd, 0x3f, 0xc2, 0x3f, 0xc8, 0x83, 0xdd, 0x69, 0xe1, 0x8d, 0xe8,
-	0x8f, 0x27, 0x7e, 0x44, 0x59, 0xf0, 0x49, 0xc7, 0xf0, 0x34, 0xb5, 0xf4, 0x0c, 0x27, 0x4d, 0x39,
-	0x93, 0x64, 0x13, 0xc9, 0x8e, 0x37, 0x4f, 0x64, 0x17, 0x61, 0xe6, 0x25, 0x71, 0xc2, 0x61, 0x96,
-	0x6c, 0xe2, 0x78, 0xe4, 0xcd, 0x83, 0x30, 0x82, 0xdc, 0x39, 0x9a, 0x36, 0x82, 0x9d, 0x05, 0x9b,
-	0x32, 0xf7, 0x35, 0x7b, 0x44, 0xa0, 0x61, 0x82, 0xbf, 0xed, 0x99, 0x04, 0x73, 0x27, 0xcc, 0x7a,
-	0xbf, 0x01, 0xbb, 0xcd, 0x36, 0x87, 0x97, 0xdd, 0x6f, 0xda, 0x2f, 0x9c, 0x74, 0x86, 0xaa, 0xa0,
-	0x3d, 0x40, 0xe7, 0xbd, 0x6e, 0x91, 0x5e, 0xd2, 0xbe, 0x82, 0xfd, 0xa7, 0x34, 0x99, 0x05, 0x03,
-	0xd2, 0x77, 0xd7, 0x3f, 0xf2, 0x69, 0x7f, 0xa7, 0x40, 0x63, 0x7e, 0xaa, 0xf4, 0xdd, 0x0d, 0x0f,
-	0x84, 0x5f, 0x41, 0x3d, 0x65, 0x4b, 0x64, 0x52, 0x5a, 0x86, 0x4c, 0x36, 0x5f, 0xe5, 0x87, 0x8b,
-	0xbb, 0xf7, 0xf2, 0xfb, 0x74, 0xef, 0x9a, 0x07, 0x87, 0xdc, 0xe1, 0x0b, 0x53, 0xbc, 0x50, 0xfd,
-	0xc6, 0x77, 0xe9, 0x34, 0x1b, 0x95, 0x96, 0x66, 0xa3, 0x3f, 0x52, 0xe0, 0x68, 0xf9, 0x36, 0xd2,
-	0x4c, 0xf3, 0x39, 0x47, 0x79, 0xbf, 0x9c, 0x33, 0xdf, 0xf0, 0x96, 0xae, 0x6f, 0x78, 0xff, 0xba,
-	0x0c, 0xbb, 0x46, 0x44, 0xdd, 0x24, 0xfd, 0x36, 0xf8, 0x4e, 0x37, 0x15, 0x7d, 0x01, 0x35, 0xf1,
-	0x2e, 0x1c, 0xd1, 0x0b, 0xb9, 0x05, 0x4f, 0x69, 0xb3, 0xcf, 0xc7, 0x44, 0x3c, 0x1e, 0x13, 0x7a,
-	0xf1, 0xbf, 0x7e, 0xe4, 0x5d, 0x52, 0x58, 0x2a, 0xef, 0x5d, 0x58, 0xfa, 0x70, 0xaf, 0xf0, 0x54,
-	0xc2, 0xa2, 0x6e, 0x3c, 0x7d, 0xb8, 0x94, 0xa8, 0xf9, 0xf0, 0x86, 0xf7, 0x4d, 0x72, 0x30, 0xbe,
-	0xe6, 0xc1, 0xf4, 0x11, 0x6c, 0xfb, 0x1e, 0x1d, 0x8d, 0xc3, 0x84, 0x7f, 0x29, 0x16, 0x4f, 0x93,
-	0xe2, 0xc9, 0x55, 0xcd, 0x31, 0xc4, 0x83, 0xe4, 0xe7, 0x80, 0x5c, 0xcf, 0xf3, 0xd9, 0xe9, 0xdc,
-	0x21, 0x4f, 0x49, 0x34, 0x4e, 0xe4, 0x23, 0xd6, 0x76, 0xc6, 0x91, 0x8e, 0xd1, 0xfe, 0x5e, 0x81,
-	0x5b, 0x05, 0x8f, 0xc9, 0xe8, 0xf9, 0x04, 0x56, 0xf3, 0x5f, 0x7e, 0xe5, 0x1b, 0x4a, 0x2a, 0x95,
-	0xf2, 0x10, 0x86, 0x9d, 0x05, 0x2f, 0x34, 0xd2, 0x8b, 0xb7, 0x52, 0x6f, 0xcc, 0x3c, 0xd0, 0x90,
-	0xed, 0xb9, 0x37, 0x1b, 0xf4, 0x6b, 0xb0, 0x95, 0xde, 0xd9, 0x0b, 0x51, 0x3f, 0xa5, 0x43, 0xd1,
-	0xfc, 0x23, 0x05, 0x49, 0xaf, 0xb7, 0x1c, 0x6b, 0xff, 0xa8, 0x00, 0x12, 0x4a, 0xf0, 0xa8, 0xce,
-	0xee, 0x59, 0x95, 0x23, 0x91, 0xfc, 0x97, 0x30, 0x21, 0x20, 0xe8, 0x37, 0x7b, 0xaf, 0xf4, 0xff,
-	0xe5, 0xbd, 0xf2, 0x62, 0xef, 0xb1, 0xfc, 0x3c, 0xa3, 0x88, 0xf4, 0xc5, 0x8d, 0x9a, 0x7c, 0x09,
-	0x9b, 0x02, 0x84, 0xa5, 0xc6, 0x13, 0x27, 0x57, 0x8b, 0xa0, 0x84, 0x6c, 0x84, 0xb9, 0x91, 0xf6,
-	0x65, 0x6a, 0x37, 0x79, 0xd3, 0xa6, 0x76, 0xe3, 0x37, 0x2d, 0xbf, 0x9b, 0x10, 0x10, 0x74, 0x2d,
-	0x4e, 0x4f, 0x29, 0xa7, 0x65, 0xa7, 0xbc, 0x76, 0xde, 0x22, 0x27, 0x97, 0xde, 0xd9, 0xc9, 0x27,
-	0xb0, 0xd3, 0xf2, 0xe3, 0xb4, 0x22, 0x4c, 0xeb, 0xc8, 0xb2, 0xef, 0x24, 0xda, 0xd7, 0xb0, 0x3b,
-	0x2b, 0x2f, 0x4f, 0xf9, 0x29, 0xac, 0xc9, 0x95, 0x63, 0xf9, 0x24, 0x31, 0x13, 0xd8, 0x53, 0xa6,
-	0xf6, 0x14, 0xb6, 0xd9, 0x02, 0xdc, 0x7c, 0x37, 0x6e, 0x37, 0x03, 0x83, 0x4b, 0xfc, 0xd3, 0x64,
-	0x0a, 0x83, 0x99, 0x95, 0xf3, 0x0b, 0xcd, 0xfb, 0xb4, 0xbc, 0xc8, 0xa7, 0xda, 0xaf, 0xc3, 0xae,
-	0xa8, 0xda, 0x85, 0x5c, 0xfa, 0x6e, 0x17, 0x93, 0xdf, 0xec, 0xc2, 0xfc, 0x5f, 0xba, 0x9b, 0x7d,
-	0x7c, 0x96, 0xff, 0x3b, 0x06, 0x7f, 0x0c, 0xe2, 0xff, 0x59, 0x68, 0xf7, 0x88, 0x81, 0x73, 0xff,
-	0x59, 0xd8, 0x82, 0x75, 0x49, 0x3b, 0xc3, 0xfc, 0xaf, 0x0a, 0x75, 0x00, 0x49, 0xd0, 0x3b, 0xa6,
-	0x5a, 0x3a, 0xfe, 0x2b, 0x05, 0xd6, 0x8d, 0x30, 0x48, 0x68, 0x20, 0x1e, 0x7b, 0x76, 0x60, 0xcb,
-	0x68, 0x5b, 0xb6, 0xc0, 0x38, 0xe9, 0x2a, 0xbb, 0xa0, 0xa6, 0xc4, 0x73, 0x4c, 0x8c, 0x6f, 0x74,
-	0xcb, 0x56, 0x95, 0xbc, 0xa8, 0x6c, 0x98, 0xd4, 0x12, 0x83, 0x42, 0x29, 0x51, 0xb6, 0xc7, 0xbc,
-	0x4d, 0x53, 0xcb, 0xe8, 0x0e, 0xec, 0xa5, 0x9c, 0xc2, 0x1b, 0x5e, 0x05, 0x69, 0xf0, 0xe1, 0x62,
-	0xde, 0x74, 0xe5, 0xea, 0xf1, 0x13, 0xa8, 0x4d, 0x3f, 0xa1, 0x33, 0x5c, 0x75, 0x66, 0x7e, 0x87,
-	0x9b, 0x0e, 0xd1, 0x6d, 0xec, 0x34, 0xf1, 0x99, 0xde, 0x6b, 0xd9, 0xea, 0x07, 0x4c, 0xbd, 0x0e,
-	0x26, 0x4e, 0x07, 0x13, 0xd6, 0x8d, 0x29, 0xc7, 0x3f, 0x83, 0x6d, 0x09, 0xe7, 0xb2, 0x2e, 0x80,
-	0x35, 0xdc, 0x12, 0xcb, 0x39, 0x06, 0xc1, 0x4d, 0xd3, 0x16, 0x70, 0x7b, 0x16, 0xd3, 0x2d, 0x11,
-	0x32, 0xda, 0x56, 0xd3, 0x64, 0x27, 0xd3, 0x59, 0x5b, 0xf9, 0x21, 0xdc, 0x59, 0x24, 0xa4, 0xb7,
-	0x5e, 0xe8, 0x2f, 0xbb, 0x6a, 0xe9, 0xf8, 0x17, 0x0a, 0x6c, 0xcf, 0x7d, 0x9f, 0x61, 0x4b, 0x17,
-	0xb4, 0xe4, 0xfd, 0xc0, 0xec, 0xfe, 0xf7, 0xe0, 0x76, 0xd1, 0x14, 0xa6, 0xf5, 0xb4, 0x85, 0x9d,
-	0x5e, 0x97, 0xf5, 0x15, 0xf3, 0x4f, 0xa9, 0xe7, 0xbd, 0x96, 0x6d, 0x72, 0x6e, 0x09, 0x1d, 0xc1,
-	0xdd, 0x02, 0xb7, 0x67, 0xb5, 0xcc, 0x73, 0xd3, 0xc6, 0x4d, 0x2e, 0x51, 0x3e, 0xfe, 0x43, 0x05,
-	0x36, 0x67, 0x10, 0x1f, 0xd3, 0x25, 0x7d, 0x28, 0x9d, 0xfe, 0xf5, 0x25, 0x7f, 0xa0, 0x4d, 0xa8,
-	0x19, 0x6d, 0xeb, 0xcc, 0x24, 0xe7, 0x3c, 0x90, 0xee, 0xc3, 0xbd, 0x0e, 0xb6, 0x9a, 0x4c, 0x3c,
-	0x8d, 0x09, 0x47, 0xf2, 0x25, 0xc8, 0x45, 0x1b, 0xb0, 0x26, 0x9e, 0x5b, 0x79, 0x0b, 0xb3, 0x0e,
-	0xab, 0x56, 0x9b, 0x03, 0x61, 0xb5, 0xc2, 0xda, 0x28, 0x39, 0x70, 0x3a, 0xd8, 0xd2, 0x5b, 0xe6,
-	0x6f, 0xe3, 0xa6, 0x5a, 0x3d, 0x1e, 0x43, 0x7d, 0xb6, 0x5b, 0x63, 0x9a, 0xe4, 0x2d, 0xbb, 0xc0,
-	0x50, 0x6b, 0x50, 0x79, 0x6e, 0x76, 0x75, 0x11, 0xdb, 0xe7, 0x7a, 0xd7, 0xc6, 0x84, 0x89, 0xaa,
-	0x25, 0x16, 0xb6, 0xfa, 0x39, 0x26, 0xa6, 0xa1, 0x5b, 0x0e, 0xfe, 0xae, 0x43, 0x70, 0xb7, 0xab,
-	0x96, 0xd9, 0xa9, 0x9a, 0x66, 0xd7, 0x68, 0x3f, 0xc7, 0x44, 0xad, 0x1c, 0xff, 0x89, 0x02, 0x6a,
-	0x11, 0xbc, 0x72, 0xdd, 0x08, 0x4e, 0x2d, 0xb8, 0xd0, 0x1a, 0xfc, 0x2b, 0x04, 0xce, 0x7d, 0xae,
-	0x78, 0x6e, 0x8a, 0xff, 0x02, 0x1d, 0xc0, 0x7e, 0x8e, 0xc1, 0x7a, 0x82, 0x29, 0xb3, 0x54, 0x98,
-	0x45, 0xf0, 0x59, 0xcf, 0x6a, 0x72, 0xe3, 0xcc, 0x32, 0x84, 0xc6, 0xb8, 0xa9, 0x56, 0x5e, 0xad,
-	0xf0, 0x7f, 0x18, 0x3e, 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x84, 0x9d, 0xca, 0x4f, 0x6d,
-	0x28, 0x00, 0x00,
+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,
 }
