// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v4.24.4
// source: google/streetview/publish/v1/rpcmessages.proto

package publish

import (
	reflect "reflect"
	sync "sync"

	longrunningpb "cloud.google.com/go/longrunning/autogen/longrunningpb"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	status "google.golang.org/genproto/googleapis/rpc/status"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Specifies which view of the [Photo][google.streetview.publish.v1.Photo]
// to include in the response.
type PhotoView int32

const (
	// Server responses do not include the download URL for the photo bytes.
	// The default value.
	PhotoView_BASIC PhotoView = 0
	// Server responses include the download URL for the photo bytes.
	PhotoView_INCLUDE_DOWNLOAD_URL PhotoView = 1
)

// Enum value maps for PhotoView.
var (
	PhotoView_name = map[int32]string{
		0: "BASIC",
		1: "INCLUDE_DOWNLOAD_URL",
	}
	PhotoView_value = map[string]int32{
		"BASIC":                0,
		"INCLUDE_DOWNLOAD_URL": 1,
	}
)

func (x PhotoView) Enum() *PhotoView {
	p := new(PhotoView)
	*p = x
	return p
}

func (x PhotoView) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PhotoView) Descriptor() protoreflect.EnumDescriptor {
	return file_google_streetview_publish_v1_rpcmessages_proto_enumTypes[0].Descriptor()
}

func (PhotoView) Type() protoreflect.EnumType {
	return &file_google_streetview_publish_v1_rpcmessages_proto_enumTypes[0]
}

func (x PhotoView) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PhotoView.Descriptor instead.
func (PhotoView) EnumDescriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{0}
}

// Input forms of [PhotoSequence][google.streetview.publish.v1.PhotoSequence].
type CreatePhotoSequenceRequest_InputType int32

const (
	// Not specified. Server will return
	// [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT].
	CreatePhotoSequenceRequest_INPUT_TYPE_UNSPECIFIED CreatePhotoSequenceRequest_InputType = 0
	// 360 Video.
	CreatePhotoSequenceRequest_VIDEO CreatePhotoSequenceRequest_InputType = 1
	// Extensible Device Metadata, http://www.xdm.org
	CreatePhotoSequenceRequest_XDM CreatePhotoSequenceRequest_InputType = 2
)

// Enum value maps for CreatePhotoSequenceRequest_InputType.
var (
	CreatePhotoSequenceRequest_InputType_name = map[int32]string{
		0: "INPUT_TYPE_UNSPECIFIED",
		1: "VIDEO",
		2: "XDM",
	}
	CreatePhotoSequenceRequest_InputType_value = map[string]int32{
		"INPUT_TYPE_UNSPECIFIED": 0,
		"VIDEO":                  1,
		"XDM":                    2,
	}
)

func (x CreatePhotoSequenceRequest_InputType) Enum() *CreatePhotoSequenceRequest_InputType {
	p := new(CreatePhotoSequenceRequest_InputType)
	*p = x
	return p
}

func (x CreatePhotoSequenceRequest_InputType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (CreatePhotoSequenceRequest_InputType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_streetview_publish_v1_rpcmessages_proto_enumTypes[1].Descriptor()
}

func (CreatePhotoSequenceRequest_InputType) Type() protoreflect.EnumType {
	return &file_google_streetview_publish_v1_rpcmessages_proto_enumTypes[1]
}

func (x CreatePhotoSequenceRequest_InputType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use CreatePhotoSequenceRequest_InputType.Descriptor instead.
func (CreatePhotoSequenceRequest_InputType) EnumDescriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{12, 0}
}

// Request to create a [Photo][google.streetview.publish.v1.Photo].
type CreatePhotoRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. Photo to create.
	Photo *Photo `protobuf:"bytes,1,opt,name=photo,proto3" json:"photo,omitempty"`
}

func (x *CreatePhotoRequest) Reset() {
	*x = CreatePhotoRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CreatePhotoRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreatePhotoRequest) ProtoMessage() {}

func (x *CreatePhotoRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CreatePhotoRequest.ProtoReflect.Descriptor instead.
func (*CreatePhotoRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{0}
}

func (x *CreatePhotoRequest) GetPhoto() *Photo {
	if x != nil {
		return x.Photo
	}
	return nil
}

// Request to get a [Photo][google.streetview.publish.v1.Photo].
//
// # By default
//
// * does not return the download URL for the photo bytes.
//
// Parameters:
//
// * `view` controls if the download URL for the photo bytes is returned.
type GetPhotoRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. ID of the [Photo][google.streetview.publish.v1.Photo].
	PhotoId string `protobuf:"bytes,1,opt,name=photo_id,json=photoId,proto3" json:"photo_id,omitempty"`
	// Required. Specifies if a download URL for the photo bytes should be
	// returned in the [Photo][google.streetview.publish.v1.Photo] response.
	View PhotoView `protobuf:"varint,2,opt,name=view,proto3,enum=google.streetview.publish.v1.PhotoView" json:"view,omitempty"`
	// The BCP-47 language code, such as "en-US" or "sr-Latn". For more
	// information, see
	// http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
	// If language_code is unspecified, the user's language preference for Google
	// services is used.
	LanguageCode string `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
}

func (x *GetPhotoRequest) Reset() {
	*x = GetPhotoRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetPhotoRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetPhotoRequest) ProtoMessage() {}

func (x *GetPhotoRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetPhotoRequest.ProtoReflect.Descriptor instead.
func (*GetPhotoRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{1}
}

func (x *GetPhotoRequest) GetPhotoId() string {
	if x != nil {
		return x.PhotoId
	}
	return ""
}

func (x *GetPhotoRequest) GetView() PhotoView {
	if x != nil {
		return x.View
	}
	return PhotoView_BASIC
}

func (x *GetPhotoRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

// Request to get one or more [Photos][google.streetview.publish.v1.Photo].
// By default
//
// * does not return the download URL for the photo bytes.
//
// Parameters:
//
// * `view` controls if the download URL for the photo bytes is returned.
type BatchGetPhotosRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. IDs of the [Photos][google.streetview.publish.v1.Photo]. For HTTP
	// GET requests, the URL query parameter should be
	// `photoIds=<id1>&photoIds=<id2>&...`.
	PhotoIds []string `protobuf:"bytes,1,rep,name=photo_ids,json=photoIds,proto3" json:"photo_ids,omitempty"`
	// Required. Specifies if a download URL for the photo bytes should be
	// returned in the Photo response.
	View PhotoView `protobuf:"varint,2,opt,name=view,proto3,enum=google.streetview.publish.v1.PhotoView" json:"view,omitempty"`
	// Optional. The BCP-47 language code, such as "en-US" or "sr-Latn". For more
	// information, see
	// http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
	// If language_code is unspecified, the user's language preference for Google
	// services is used.
	LanguageCode string `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
}

func (x *BatchGetPhotosRequest) Reset() {
	*x = BatchGetPhotosRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BatchGetPhotosRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchGetPhotosRequest) ProtoMessage() {}

func (x *BatchGetPhotosRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchGetPhotosRequest.ProtoReflect.Descriptor instead.
func (*BatchGetPhotosRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{2}
}

func (x *BatchGetPhotosRequest) GetPhotoIds() []string {
	if x != nil {
		return x.PhotoIds
	}
	return nil
}

func (x *BatchGetPhotosRequest) GetView() PhotoView {
	if x != nil {
		return x.View
	}
	return PhotoView_BASIC
}

func (x *BatchGetPhotosRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

// Response to batch get of [Photos][google.streetview.publish.v1.Photo].
type BatchGetPhotosResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of results for each individual
	// [Photo][google.streetview.publish.v1.Photo] requested, in the same order as
	// the requests in
	// [BatchGetPhotos][google.streetview.publish.v1.StreetViewPublishService.BatchGetPhotos].
	Results []*PhotoResponse `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
}

func (x *BatchGetPhotosResponse) Reset() {
	*x = BatchGetPhotosResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BatchGetPhotosResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchGetPhotosResponse) ProtoMessage() {}

func (x *BatchGetPhotosResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchGetPhotosResponse.ProtoReflect.Descriptor instead.
func (*BatchGetPhotosResponse) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{3}
}

func (x *BatchGetPhotosResponse) GetResults() []*PhotoResponse {
	if x != nil {
		return x.Results
	}
	return nil
}

// Response payload for a single
// [Photo][google.streetview.publish.v1.Photo]
// in batch operations including
// [BatchGetPhotos][google.streetview.publish.v1.StreetViewPublishService.BatchGetPhotos]
// and
// [BatchUpdatePhotos][google.streetview.publish.v1.StreetViewPublishService.BatchUpdatePhotos].
type PhotoResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The status for the operation to get or update a single photo in the batch
	// request.
	Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
	// The [Photo][google.streetview.publish.v1.Photo] resource, if the request
	// was successful.
	Photo *Photo `protobuf:"bytes,2,opt,name=photo,proto3" json:"photo,omitempty"`
}

func (x *PhotoResponse) Reset() {
	*x = PhotoResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PhotoResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PhotoResponse) ProtoMessage() {}

func (x *PhotoResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PhotoResponse.ProtoReflect.Descriptor instead.
func (*PhotoResponse) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{4}
}

func (x *PhotoResponse) GetStatus() *status.Status {
	if x != nil {
		return x.Status
	}
	return nil
}

func (x *PhotoResponse) GetPhoto() *Photo {
	if x != nil {
		return x.Photo
	}
	return nil
}

// Request to list all photos that belong to the user sending the request.
//
// # By default
//
// * does not return the download URL for the photo bytes.
//
// Parameters:
//
// * `view` controls if the download URL for the photo bytes is returned.
// * `pageSize` determines the maximum number of photos to return.
// * `pageToken` is the next page token value returned from a previous
// [ListPhotos][google.streetview.publish.v1.StreetViewPublishService.ListPhotos]
//
//	request, if any.
//
// * `filter` allows filtering by a given parameter. 'placeId' is the only
// parameter supported at the moment.
type ListPhotosRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. Specifies if a download URL for the photos bytes should be
	// returned in the Photos response.
	View PhotoView `protobuf:"varint,1,opt,name=view,proto3,enum=google.streetview.publish.v1.PhotoView" json:"view,omitempty"`
	// Optional. The maximum number of photos to return.
	// `pageSize` must be non-negative. If `pageSize` is zero or is not provided,
	// the default page size of 100 is used.
	// The number of photos returned in the response may be less than `pageSize`
	// if the number of photos that belong to the user is less than `pageSize`.
	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional. The
	// [nextPageToken][google.streetview.publish.v1.ListPhotosResponse.next_page_token]
	// value returned from a previous
	// [ListPhotos][google.streetview.publish.v1.StreetViewPublishService.ListPhotos]
	// request, if any.
	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Optional. The filter expression. For example:
	// `placeId=ChIJj61dQgK6j4AR4GeTYWZsKWw`.
	//
	// The filters supported are: `placeId`, `min_latitude`, `max_latitude`,
	// `min_longitude`, `max_longitude`. See https://google.aip.dev/160 for more
	// information.
	Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"`
	// Optional. The BCP-47 language code, such as "en-US" or "sr-Latn". For more
	// information, see
	// http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
	// If language_code is unspecified, the user's language preference for Google
	// services is used.
	LanguageCode string `protobuf:"bytes,5,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
}

func (x *ListPhotosRequest) Reset() {
	*x = ListPhotosRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListPhotosRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListPhotosRequest) ProtoMessage() {}

func (x *ListPhotosRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListPhotosRequest.ProtoReflect.Descriptor instead.
func (*ListPhotosRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{5}
}

func (x *ListPhotosRequest) GetView() PhotoView {
	if x != nil {
		return x.View
	}
	return PhotoView_BASIC
}

func (x *ListPhotosRequest) GetPageSize() int32 {
	if x != nil {
		return x.PageSize
	}
	return 0
}

func (x *ListPhotosRequest) GetPageToken() string {
	if x != nil {
		return x.PageToken
	}
	return ""
}

func (x *ListPhotosRequest) GetFilter() string {
	if x != nil {
		return x.Filter
	}
	return ""
}

func (x *ListPhotosRequest) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

// Response to list all photos that belong to a user.
type ListPhotosResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of photos. The
	// [pageSize][google.streetview.publish.v1.ListPhotosRequest.page_size] field
	// in the request determines the number of items returned.
	Photos []*Photo `protobuf:"bytes,1,rep,name=photos,proto3" json:"photos,omitempty"`
	// Token to retrieve the next page of results, or empty if there are no more
	// results in the list.
	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
}

func (x *ListPhotosResponse) Reset() {
	*x = ListPhotosResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListPhotosResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListPhotosResponse) ProtoMessage() {}

func (x *ListPhotosResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListPhotosResponse.ProtoReflect.Descriptor instead.
func (*ListPhotosResponse) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{6}
}

func (x *ListPhotosResponse) GetPhotos() []*Photo {
	if x != nil {
		return x.Photos
	}
	return nil
}

func (x *ListPhotosResponse) GetNextPageToken() string {
	if x != nil {
		return x.NextPageToken
	}
	return ""
}

// Request to update the metadata of a
// [Photo][google.streetview.publish.v1.Photo]. Updating the pixels of a photo
// is not supported.
type UpdatePhotoRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. [Photo][google.streetview.publish.v1.Photo] object containing the
	// new metadata.
	Photo *Photo `protobuf:"bytes,1,opt,name=photo,proto3" json:"photo,omitempty"`
	// Required. Mask that identifies fields on the photo metadata to update.
	// If not present, the old [Photo][google.streetview.publish.v1.Photo]
	// metadata is entirely replaced with the
	// new [Photo][google.streetview.publish.v1.Photo] metadata in this request.
	// The update fails if invalid fields are specified. Multiple fields can be
	// specified in a comma-delimited list.
	//
	// The following fields are valid:
	//
	// * `pose.heading`
	// * `pose.lat_lng_pair`
	// * `pose.pitch`
	// * `pose.roll`
	// * `pose.level`
	// * `pose.altitude`
	// * `connections`
	// * `places`
	//
	// > Note: When
	// [updateMask][google.streetview.publish.v1.UpdatePhotoRequest.update_mask]
	// contains repeated fields, the entire set of repeated values get replaced
	// with the new contents. For example, if
	// [updateMask][google.streetview.publish.v1.UpdatePhotoRequest.update_mask]
	// contains `connections` and `UpdatePhotoRequest.photo.connections` is empty,
	// all connections are removed.
	UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
}

func (x *UpdatePhotoRequest) Reset() {
	*x = UpdatePhotoRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UpdatePhotoRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdatePhotoRequest) ProtoMessage() {}

func (x *UpdatePhotoRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UpdatePhotoRequest.ProtoReflect.Descriptor instead.
func (*UpdatePhotoRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{7}
}

func (x *UpdatePhotoRequest) GetPhoto() *Photo {
	if x != nil {
		return x.Photo
	}
	return nil
}

func (x *UpdatePhotoRequest) GetUpdateMask() *fieldmaskpb.FieldMask {
	if x != nil {
		return x.UpdateMask
	}
	return nil
}

// Request to update the metadata of photos.
// Updating the pixels of photos is not supported.
type BatchUpdatePhotosRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. List of
	// [UpdatePhotoRequests][google.streetview.publish.v1.UpdatePhotoRequest].
	UpdatePhotoRequests []*UpdatePhotoRequest `protobuf:"bytes,1,rep,name=update_photo_requests,json=updatePhotoRequests,proto3" json:"update_photo_requests,omitempty"`
}

func (x *BatchUpdatePhotosRequest) Reset() {
	*x = BatchUpdatePhotosRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BatchUpdatePhotosRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchUpdatePhotosRequest) ProtoMessage() {}

func (x *BatchUpdatePhotosRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchUpdatePhotosRequest.ProtoReflect.Descriptor instead.
func (*BatchUpdatePhotosRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{8}
}

func (x *BatchUpdatePhotosRequest) GetUpdatePhotoRequests() []*UpdatePhotoRequest {
	if x != nil {
		return x.UpdatePhotoRequests
	}
	return nil
}

// Response to batch update of metadata of one or more
// [Photos][google.streetview.publish.v1.Photo].
type BatchUpdatePhotosResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of results for each individual
	// [Photo][google.streetview.publish.v1.Photo] updated, in the same order as
	// the request.
	Results []*PhotoResponse `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
}

func (x *BatchUpdatePhotosResponse) Reset() {
	*x = BatchUpdatePhotosResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BatchUpdatePhotosResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchUpdatePhotosResponse) ProtoMessage() {}

func (x *BatchUpdatePhotosResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[9]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchUpdatePhotosResponse.ProtoReflect.Descriptor instead.
func (*BatchUpdatePhotosResponse) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{9}
}

func (x *BatchUpdatePhotosResponse) GetResults() []*PhotoResponse {
	if x != nil {
		return x.Results
	}
	return nil
}

// Request to delete a [Photo][google.streetview.publish.v1.Photo].
type DeletePhotoRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. ID of the [Photo][google.streetview.publish.v1.Photo].
	PhotoId string `protobuf:"bytes,1,opt,name=photo_id,json=photoId,proto3" json:"photo_id,omitempty"`
}

func (x *DeletePhotoRequest) Reset() {
	*x = DeletePhotoRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeletePhotoRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeletePhotoRequest) ProtoMessage() {}

func (x *DeletePhotoRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeletePhotoRequest.ProtoReflect.Descriptor instead.
func (*DeletePhotoRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{10}
}

func (x *DeletePhotoRequest) GetPhotoId() string {
	if x != nil {
		return x.PhotoId
	}
	return ""
}

// Request to delete multiple [Photos][google.streetview.publish.v1.Photo].
type BatchDeletePhotosRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. IDs of the [Photos][google.streetview.publish.v1.Photo]. HTTP
	// GET requests require the following syntax for the URL query parameter:
	// `photoIds=<id1>&photoIds=<id2>&...`.
	PhotoIds []string `protobuf:"bytes,1,rep,name=photo_ids,json=photoIds,proto3" json:"photo_ids,omitempty"`
}

func (x *BatchDeletePhotosRequest) Reset() {
	*x = BatchDeletePhotosRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BatchDeletePhotosRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchDeletePhotosRequest) ProtoMessage() {}

func (x *BatchDeletePhotosRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchDeletePhotosRequest.ProtoReflect.Descriptor instead.
func (*BatchDeletePhotosRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{11}
}

func (x *BatchDeletePhotosRequest) GetPhotoIds() []string {
	if x != nil {
		return x.PhotoIds
	}
	return nil
}

// Request to create a
// [PhotoSequence][google.streetview.publish.v1.PhotoSequence] from a video.
type CreatePhotoSequenceRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. [PhotoSequence][google.streetview.publish.v1.PhotoSequence] to
	// create.
	PhotoSequence *PhotoSequence `protobuf:"bytes,1,opt,name=photo_sequence,json=photoSequence,proto3" json:"photo_sequence,omitempty"`
	// Required. The input form of
	// [PhotoSequence][google.streetview.publish.v1.PhotoSequence].
	InputType CreatePhotoSequenceRequest_InputType `protobuf:"varint,2,opt,name=input_type,json=inputType,proto3,enum=google.streetview.publish.v1.CreatePhotoSequenceRequest_InputType" json:"input_type,omitempty"`
}

func (x *CreatePhotoSequenceRequest) Reset() {
	*x = CreatePhotoSequenceRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CreatePhotoSequenceRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreatePhotoSequenceRequest) ProtoMessage() {}

func (x *CreatePhotoSequenceRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[12]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CreatePhotoSequenceRequest.ProtoReflect.Descriptor instead.
func (*CreatePhotoSequenceRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{12}
}

func (x *CreatePhotoSequenceRequest) GetPhotoSequence() *PhotoSequence {
	if x != nil {
		return x.PhotoSequence
	}
	return nil
}

func (x *CreatePhotoSequenceRequest) GetInputType() CreatePhotoSequenceRequest_InputType {
	if x != nil {
		return x.InputType
	}
	return CreatePhotoSequenceRequest_INPUT_TYPE_UNSPECIFIED
}

// Request to get a [PhotoSequence][google.streetview.publish.v1.PhotoSequence].
//
// # By default
//
// * does not return the download URL for the
// [PhotoSequence][google.streetview.publish.v1.PhotoSequence].
//
// Parameters:
//
// * `view` controls if the download URL for the
// [PhotoSequence][google.streetview.publish.v1.PhotoSequence] is
//
//	returned.
type GetPhotoSequenceRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. ID of the photo sequence.
	SequenceId string `protobuf:"bytes,1,opt,name=sequence_id,json=sequenceId,proto3" json:"sequence_id,omitempty"`
	// Specifies if a download URL for the photo sequence should be returned in
	// `download_url` of individual photos in the
	// [PhotoSequence][google.streetview.publish.v1.PhotoSequence] response.
	// > Note: Currently not implemented.
	//
	// Deprecated: Do not use.
	View PhotoView `protobuf:"varint,2,opt,name=view,proto3,enum=google.streetview.publish.v1.PhotoView" json:"view,omitempty"`
	// Optional. The filter expression. For example: `published_status=PUBLISHED`.
	//
	// The filters supported are: `published_status`.  See
	// https://google.aip.dev/160 for more information.
	Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"`
}

func (x *GetPhotoSequenceRequest) Reset() {
	*x = GetPhotoSequenceRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetPhotoSequenceRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetPhotoSequenceRequest) ProtoMessage() {}

func (x *GetPhotoSequenceRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[13]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetPhotoSequenceRequest.ProtoReflect.Descriptor instead.
func (*GetPhotoSequenceRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{13}
}

func (x *GetPhotoSequenceRequest) GetSequenceId() string {
	if x != nil {
		return x.SequenceId
	}
	return ""
}

// Deprecated: Do not use.
func (x *GetPhotoSequenceRequest) GetView() PhotoView {
	if x != nil {
		return x.View
	}
	return PhotoView_BASIC
}

func (x *GetPhotoSequenceRequest) GetFilter() string {
	if x != nil {
		return x.Filter
	}
	return ""
}

// Request to delete a
// [PhotoSequence][google.streetview.publish.v1.PhotoSequence].
type DeletePhotoSequenceRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. ID of the
	// [PhotoSequence][google.streetview.publish.v1.PhotoSequence].
	SequenceId string `protobuf:"bytes,1,opt,name=sequence_id,json=sequenceId,proto3" json:"sequence_id,omitempty"`
}

func (x *DeletePhotoSequenceRequest) Reset() {
	*x = DeletePhotoSequenceRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeletePhotoSequenceRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeletePhotoSequenceRequest) ProtoMessage() {}

func (x *DeletePhotoSequenceRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[14]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeletePhotoSequenceRequest.ProtoReflect.Descriptor instead.
func (*DeletePhotoSequenceRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{14}
}

func (x *DeletePhotoSequenceRequest) GetSequenceId() string {
	if x != nil {
		return x.SequenceId
	}
	return ""
}

// Response to batch delete of one or more
// [Photos][google.streetview.publish.v1.Photo].
type BatchDeletePhotosResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The status for the operation to delete a single
	// [Photo][google.streetview.publish.v1.Photo] in the batch request.
	Status []*status.Status `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty"`
}

func (x *BatchDeletePhotosResponse) Reset() {
	*x = BatchDeletePhotosResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BatchDeletePhotosResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchDeletePhotosResponse) ProtoMessage() {}

func (x *BatchDeletePhotosResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[15]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchDeletePhotosResponse.ProtoReflect.Descriptor instead.
func (*BatchDeletePhotosResponse) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{15}
}

func (x *BatchDeletePhotosResponse) GetStatus() []*status.Status {
	if x != nil {
		return x.Status
	}
	return nil
}

// Request to list all photo sequences that belong to the user sending the
// request.
//
// Parameters:
//
// * `pageSize` determines the maximum number of photo sequences to return.
// * `pageToken` is the next page token value returned from a previous
// [ListPhotoSequences][google.streetview.publish.v1.StreetViewPublishService.ListPhotoSequences]
//
//	request, if any.
type ListPhotoSequencesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Optional. The maximum number of photo sequences to return.
	// `pageSize` must be non-negative. If `pageSize` is zero or is not
	// provided, the default page size of 100 is used.
	// The number of photo sequences returned in the response may be less than
	// `pageSize` if the number of matches is less than `pageSize`.
	// This is currently unimplemented but is in process.
	PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional. The
	// [nextPageToken][google.streetview.publish.v1.ListPhotosResponse.next_page_token]
	// value returned from a previous
	// [ListPhotoSequences][google.streetview.publish.v1.StreetViewPublishService.ListPhotoSequences]
	// request, if any.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Optional. The filter expression. For example: `imagery_type=SPHERICAL`.
	//
	// The filters supported are: `imagery_type`, `processing_state`,
	// `min_latitude`, `max_latitude`, `min_longitude`, `max_longitude`,
	// `filename_query`, `min_capture_time_seconds`, `max_capture_time_seconds.
	// See https://google.aip.dev/160 for more information. Filename queries
	// should sent as a Phrase in order to support multiple words and special
	// characters by adding escaped quotes. Ex: filename_query="example of a
	// phrase.mp4"
	Filter string `protobuf:"bytes,4,opt,name=filter,proto3" json:"filter,omitempty"`
}

func (x *ListPhotoSequencesRequest) Reset() {
	*x = ListPhotoSequencesRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListPhotoSequencesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListPhotoSequencesRequest) ProtoMessage() {}

func (x *ListPhotoSequencesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[16]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListPhotoSequencesRequest.ProtoReflect.Descriptor instead.
func (*ListPhotoSequencesRequest) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{16}
}

func (x *ListPhotoSequencesRequest) GetPageSize() int32 {
	if x != nil {
		return x.PageSize
	}
	return 0
}

func (x *ListPhotoSequencesRequest) GetPageToken() string {
	if x != nil {
		return x.PageToken
	}
	return ""
}

func (x *ListPhotoSequencesRequest) GetFilter() string {
	if x != nil {
		return x.Filter
	}
	return ""
}

// Response to list all photo sequences that belong to a user.
type ListPhotoSequencesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of photo sequences via [Operation][google.longrunning.Operation]
	// interface.
	//
	// The maximum number of items returned is based on the
	// [pageSize][google.streetview.publish.v1.ListPhotoSequencesRequest.page_size]
	// field in the request.
	//
	// Each item in the list can have three possible states,
	//
	//   - `Operation.done` = false, if the processing of
	//     [PhotoSequence][google.streetview.publish.v1.PhotoSequence] is not
	//     finished yet.
	//   - `Operation.done` = true and `Operation.error` is populated, if there was
	//     an error in processing.
	//   - `Operation.done` = true and `Operation.response` contains a
	//     [PhotoSequence][google.streetview.publish.v1.PhotoSequence] message,
	//     In each sequence, only
	//     [Id][google.streetview.publish.v1.PhotoSequence.id] is populated.
	PhotoSequences []*longrunningpb.Operation `protobuf:"bytes,1,rep,name=photo_sequences,json=photoSequences,proto3" json:"photo_sequences,omitempty"`
	// Token to retrieve the next page of results, or empty if there are no more
	// results in the list.
	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
}

func (x *ListPhotoSequencesResponse) Reset() {
	*x = ListPhotoSequencesResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListPhotoSequencesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListPhotoSequencesResponse) ProtoMessage() {}

func (x *ListPhotoSequencesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[17]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListPhotoSequencesResponse.ProtoReflect.Descriptor instead.
func (*ListPhotoSequencesResponse) Descriptor() ([]byte, []int) {
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP(), []int{17}
}

func (x *ListPhotoSequencesResponse) GetPhotoSequences() []*longrunningpb.Operation {
	if x != nil {
		return x.PhotoSequences
	}
	return nil
}

func (x *ListPhotoSequencesResponse) GetNextPageToken() string {
	if x != nil {
		return x.NextPageToken
	}
	return ""
}

var File_google_streetview_publish_v1_rpcmessages_proto protoreflect.FileDescriptor

var file_google_streetview_publish_v1_rpcmessages_proto_rawDesc = []byte{
	0x0a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76,
	0x69, 0x65, 0x77, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x72,
	0x70, 0x63, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76,
	0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x1a, 0x1f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,
	0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f,
	0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f,
	0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74,
	0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77, 0x2f, 0x70, 0x75,
	0x62, 0x6c, 0x69, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
	0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x54, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61,
	0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e,
	0x0a, 0x05, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65,
	0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68, 0x6f,
	0x74, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x22, 0x98,
	0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x69, 0x64, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x68, 0x6f, 0x74, 0x6f,
	0x49, 0x64, 0x12, 0x40, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74,
	0x76, 0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e,
	0x50, 0x68, 0x6f, 0x74, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04,
	0x76, 0x69, 0x65, 0x77, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
	0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x6e,
	0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x42, 0x61,
	0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x69, 0x64, 0x73,
	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x68, 0x6f,
	0x74, 0x6f, 0x49, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72,
	0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e,
	0x76, 0x31, 0x2e, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x42, 0x03, 0xe0, 0x41,
	0x02, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x12, 0x28, 0x0a, 0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75,
	0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
	0xe0, 0x41, 0x01, 0x52, 0x0c, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x64,
	0x65, 0x22, 0x5f, 0x0a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x74, 0x50, 0x68, 0x6f,
	0x74, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x72,
	0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77,
	0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68, 0x6f, 0x74,
	0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x73, 0x22, 0x76, 0x0a, 0x0d, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63,
	0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
	0x39, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69,
	0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x22, 0xe2, 0x01, 0x0a, 0x11, 0x4c,
	0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x40, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69,
	0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x76, 0x69,
	0x65, 0x77, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65,
	0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b,
	0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70,
	0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74,
	0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66,
	0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
	0x01, 0x52, 0x0c, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22,
	0x79, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
	0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
	0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x68, 0x6f, 0x74,
	0x6f, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f,
	0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78,
	0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x96, 0x01, 0x0a, 0x12, 0x55,
	0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x3e, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74,
	0x76, 0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e,
	0x50, 0x68, 0x6f, 0x74, 0x6f, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x74,
	0x6f, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61,
	0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d,
	0x61, 0x73, 0x6b, 0x22, 0x85, 0x01, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64,
	0x61, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x69, 0x0a, 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x68, 0x6f, 0x74, 0x6f,
	0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76,
	0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x55,
	0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x62, 0x0a, 0x19, 0x42,
	0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x70, 0x75,
	0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22,
	0x34, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x69,
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x70, 0x68,
	0x6f, 0x74, 0x6f, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65,
	0x6c, 0x65, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x74, 0x6f,
	0x49, 0x64, 0x73, 0x22, 0x9a, 0x02, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x68,
	0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x57, 0x0a, 0x0e, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x73, 0x65, 0x71, 0x75,
	0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x70,
	0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x53,
	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0d, 0x70, 0x68,
	0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x0a, 0x69,
	0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x42, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76,
	0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43,
	0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e,
	0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x54,
	0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54,
	0x79, 0x70, 0x65, 0x22, 0x3b, 0x0a, 0x09, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65,
	0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,
	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05,
	0x56, 0x49, 0x44, 0x45, 0x4f, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x58, 0x44, 0x4d, 0x10, 0x02,
	0x22, 0x9d, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71,
	0x75, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0b,
	0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
	0x49, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74,
	0x76, 0x69, 0x65, 0x77, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x2e,
	0x50, 0x68, 0x6f, 0x74, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x76,
	0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
	0x22, 0x42, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x53,
	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24,
	0x0a, 0x0b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
	0x63, 0x65, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x44, 0x65, 0x6c,
	0x65, 0x74, 0x65, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x7e, 0x0a,
	0x19, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e,
	0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61,
	0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0,
	0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a,
	0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
	0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x8c, 0x01,
	0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71, 0x75, 0x65,
	0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0f,
	0x70, 0x68, 0x6f, 0x74, 0x6f, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6c,
	0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x53, 0x65, 0x71, 0x75, 0x65,
	0x6e, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67,
	0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e,
	0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0x30, 0x0a, 0x09,
	0x50, 0x68, 0x6f, 0x74, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x41, 0x53,
	0x49, 0x43, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f,
	0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x01, 0x42, 0x8d,
	0x01, 0x0a, 0x28, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x65,
	0x6f, 0x2e, 0x75, 0x67, 0x63, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77,
	0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x42, 0x1c, 0x53, 0x74, 0x72,
	0x65, 0x65, 0x74, 0x56, 0x69, 0x65, 0x77, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x70,
	0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5a, 0x43, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,
	0x2f, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x76, 0x69, 0x65, 0x77, 0x2f, 0x70, 0x75, 0x62, 0x6c,
	0x69, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_streetview_publish_v1_rpcmessages_proto_rawDescOnce sync.Once
	file_google_streetview_publish_v1_rpcmessages_proto_rawDescData = file_google_streetview_publish_v1_rpcmessages_proto_rawDesc
)

func file_google_streetview_publish_v1_rpcmessages_proto_rawDescGZIP() []byte {
	file_google_streetview_publish_v1_rpcmessages_proto_rawDescOnce.Do(func() {
		file_google_streetview_publish_v1_rpcmessages_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_streetview_publish_v1_rpcmessages_proto_rawDescData)
	})
	return file_google_streetview_publish_v1_rpcmessages_proto_rawDescData
}

var file_google_streetview_publish_v1_rpcmessages_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_google_streetview_publish_v1_rpcmessages_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
var file_google_streetview_publish_v1_rpcmessages_proto_goTypes = []interface{}{
	(PhotoView)(0), // 0: google.streetview.publish.v1.PhotoView
	(CreatePhotoSequenceRequest_InputType)(0), // 1: google.streetview.publish.v1.CreatePhotoSequenceRequest.InputType
	(*CreatePhotoRequest)(nil),                // 2: google.streetview.publish.v1.CreatePhotoRequest
	(*GetPhotoRequest)(nil),                   // 3: google.streetview.publish.v1.GetPhotoRequest
	(*BatchGetPhotosRequest)(nil),             // 4: google.streetview.publish.v1.BatchGetPhotosRequest
	(*BatchGetPhotosResponse)(nil),            // 5: google.streetview.publish.v1.BatchGetPhotosResponse
	(*PhotoResponse)(nil),                     // 6: google.streetview.publish.v1.PhotoResponse
	(*ListPhotosRequest)(nil),                 // 7: google.streetview.publish.v1.ListPhotosRequest
	(*ListPhotosResponse)(nil),                // 8: google.streetview.publish.v1.ListPhotosResponse
	(*UpdatePhotoRequest)(nil),                // 9: google.streetview.publish.v1.UpdatePhotoRequest
	(*BatchUpdatePhotosRequest)(nil),          // 10: google.streetview.publish.v1.BatchUpdatePhotosRequest
	(*BatchUpdatePhotosResponse)(nil),         // 11: google.streetview.publish.v1.BatchUpdatePhotosResponse
	(*DeletePhotoRequest)(nil),                // 12: google.streetview.publish.v1.DeletePhotoRequest
	(*BatchDeletePhotosRequest)(nil),          // 13: google.streetview.publish.v1.BatchDeletePhotosRequest
	(*CreatePhotoSequenceRequest)(nil),        // 14: google.streetview.publish.v1.CreatePhotoSequenceRequest
	(*GetPhotoSequenceRequest)(nil),           // 15: google.streetview.publish.v1.GetPhotoSequenceRequest
	(*DeletePhotoSequenceRequest)(nil),        // 16: google.streetview.publish.v1.DeletePhotoSequenceRequest
	(*BatchDeletePhotosResponse)(nil),         // 17: google.streetview.publish.v1.BatchDeletePhotosResponse
	(*ListPhotoSequencesRequest)(nil),         // 18: google.streetview.publish.v1.ListPhotoSequencesRequest
	(*ListPhotoSequencesResponse)(nil),        // 19: google.streetview.publish.v1.ListPhotoSequencesResponse
	(*Photo)(nil),                             // 20: google.streetview.publish.v1.Photo
	(*status.Status)(nil),                     // 21: google.rpc.Status
	(*fieldmaskpb.FieldMask)(nil),             // 22: google.protobuf.FieldMask
	(*PhotoSequence)(nil),                     // 23: google.streetview.publish.v1.PhotoSequence
	(*longrunningpb.Operation)(nil),           // 24: google.longrunning.Operation
}
var file_google_streetview_publish_v1_rpcmessages_proto_depIdxs = []int32{
	20, // 0: google.streetview.publish.v1.CreatePhotoRequest.photo:type_name -> google.streetview.publish.v1.Photo
	0,  // 1: google.streetview.publish.v1.GetPhotoRequest.view:type_name -> google.streetview.publish.v1.PhotoView
	0,  // 2: google.streetview.publish.v1.BatchGetPhotosRequest.view:type_name -> google.streetview.publish.v1.PhotoView
	6,  // 3: google.streetview.publish.v1.BatchGetPhotosResponse.results:type_name -> google.streetview.publish.v1.PhotoResponse
	21, // 4: google.streetview.publish.v1.PhotoResponse.status:type_name -> google.rpc.Status
	20, // 5: google.streetview.publish.v1.PhotoResponse.photo:type_name -> google.streetview.publish.v1.Photo
	0,  // 6: google.streetview.publish.v1.ListPhotosRequest.view:type_name -> google.streetview.publish.v1.PhotoView
	20, // 7: google.streetview.publish.v1.ListPhotosResponse.photos:type_name -> google.streetview.publish.v1.Photo
	20, // 8: google.streetview.publish.v1.UpdatePhotoRequest.photo:type_name -> google.streetview.publish.v1.Photo
	22, // 9: google.streetview.publish.v1.UpdatePhotoRequest.update_mask:type_name -> google.protobuf.FieldMask
	9,  // 10: google.streetview.publish.v1.BatchUpdatePhotosRequest.update_photo_requests:type_name -> google.streetview.publish.v1.UpdatePhotoRequest
	6,  // 11: google.streetview.publish.v1.BatchUpdatePhotosResponse.results:type_name -> google.streetview.publish.v1.PhotoResponse
	23, // 12: google.streetview.publish.v1.CreatePhotoSequenceRequest.photo_sequence:type_name -> google.streetview.publish.v1.PhotoSequence
	1,  // 13: google.streetview.publish.v1.CreatePhotoSequenceRequest.input_type:type_name -> google.streetview.publish.v1.CreatePhotoSequenceRequest.InputType
	0,  // 14: google.streetview.publish.v1.GetPhotoSequenceRequest.view:type_name -> google.streetview.publish.v1.PhotoView
	21, // 15: google.streetview.publish.v1.BatchDeletePhotosResponse.status:type_name -> google.rpc.Status
	24, // 16: google.streetview.publish.v1.ListPhotoSequencesResponse.photo_sequences:type_name -> google.longrunning.Operation
	17, // [17:17] is the sub-list for method output_type
	17, // [17:17] is the sub-list for method input_type
	17, // [17:17] is the sub-list for extension type_name
	17, // [17:17] is the sub-list for extension extendee
	0,  // [0:17] is the sub-list for field type_name
}

func init() { file_google_streetview_publish_v1_rpcmessages_proto_init() }
func file_google_streetview_publish_v1_rpcmessages_proto_init() {
	if File_google_streetview_publish_v1_rpcmessages_proto != nil {
		return
	}
	file_google_streetview_publish_v1_resources_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreatePhotoRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetPhotoRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BatchGetPhotosRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BatchGetPhotosResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PhotoResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListPhotosRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListPhotosResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdatePhotoRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BatchUpdatePhotosRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BatchUpdatePhotosResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeletePhotoRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BatchDeletePhotosRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreatePhotoSequenceRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetPhotoSequenceRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeletePhotoSequenceRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BatchDeletePhotosResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListPhotoSequencesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_streetview_publish_v1_rpcmessages_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListPhotoSequencesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_streetview_publish_v1_rpcmessages_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   18,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_streetview_publish_v1_rpcmessages_proto_goTypes,
		DependencyIndexes: file_google_streetview_publish_v1_rpcmessages_proto_depIdxs,
		EnumInfos:         file_google_streetview_publish_v1_rpcmessages_proto_enumTypes,
		MessageInfos:      file_google_streetview_publish_v1_rpcmessages_proto_msgTypes,
	}.Build()
	File_google_streetview_publish_v1_rpcmessages_proto = out.File
	file_google_streetview_publish_v1_rpcmessages_proto_rawDesc = nil
	file_google_streetview_publish_v1_rpcmessages_proto_goTypes = nil
	file_google_streetview_publish_v1_rpcmessages_proto_depIdxs = nil
}
