// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: project_mgmt/project.proto

package project_mgmt

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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)
)

// Defines ACLs for a project's builders.
type BuildbucketAcls struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A list of LUCI Auth Service groups that can view a project's builds.
	BuildbucketReaders []string `protobuf:"bytes,1,rep,name=buildbucket_readers,json=buildbucketReaders,proto3" json:"buildbucket_readers,omitempty"`
}

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

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

func (*BuildbucketAcls) ProtoMessage() {}

func (x *BuildbucketAcls) ProtoReflect() protoreflect.Message {
	mi := &file_project_mgmt_project_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 BuildbucketAcls.ProtoReflect.Descriptor instead.
func (*BuildbucketAcls) Descriptor() ([]byte, []int) {
	return file_project_mgmt_project_proto_rawDescGZIP(), []int{0}
}

func (x *BuildbucketAcls) GetBuildbucketReaders() []string {
	if x != nil {
		return x.BuildbucketReaders
	}
	return nil
}

// Describes the location of a local manifest file.
// See https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md#local-manifests.
type LocalManifest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// URL of the repo with the local manifest. E.g.
	// https://chrome-internal.googlesource.com/chromeos/project/...
	RepoUrl string `protobuf:"bytes,1,opt,name=repo_url,json=repoUrl,proto3" json:"repo_url,omitempty"`
	// Path to the local manifest.
	// Relative to the repo.
	ManifestPath string `protobuf:"bytes,2,opt,name=manifest_path,json=manifestPath,proto3" json:"manifest_path,omitempty"`
}

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

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

func (*LocalManifest) ProtoMessage() {}

func (x *LocalManifest) ProtoReflect() protoreflect.Message {
	mi := &file_project_mgmt_project_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 LocalManifest.ProtoReflect.Descriptor instead.
func (*LocalManifest) Descriptor() ([]byte, []int) {
	return file_project_mgmt_project_proto_rawDescGZIP(), []int{1}
}

func (x *LocalManifest) GetRepoUrl() string {
	if x != nil {
		return x.RepoUrl
	}
	return ""
}

func (x *LocalManifest) GetManifestPath() string {
	if x != nil {
		return x.ManifestPath
	}
	return ""
}

// Information about the project's HWID file in the chromeos-hwid repo.
type HWIDInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A key in the project.yaml metadata file, to look up the branch, path, etc.
	// For example, to match the entry in the project.yaml file:
	//
	// MILKYWAY:
	//   board: GALAXY
	//   branch: master
	//   version: 3
	//   path: v3/MILKYWAY
	//
	// project_key should be 'MILKYWAY'. The matching is case-insensitive.
	ProjectKey string `protobuf:"bytes,1,opt,name=project_key,json=projectKey,proto3" json:"project_key,omitempty"`
}

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

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

func (*HWIDInfo) ProtoMessage() {}

func (x *HWIDInfo) ProtoReflect() protoreflect.Message {
	mi := &file_project_mgmt_project_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 HWIDInfo.ProtoReflect.Descriptor instead.
func (*HWIDInfo) Descriptor() ([]byte, []int) {
	return file_project_mgmt_project_proto_rawDescGZIP(), []int{2}
}

func (x *HWIDInfo) GetProjectKey() string {
	if x != nil {
		return x.ProjectKey
	}
	return ""
}

// Defines the metadata for a project, which ultimately controls how this
// project is managed throughout the infrastructure.
//
// NEXT ID: 9
type Project struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Defines the human-readable name for the project.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Defines the git-repo path for the project.
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// Defines the path that stores all of the project configuration.
	// Relative to the git-repo
	ConfigPath string `protobuf:"bytes,3,opt,name=config_path,json=configPath,proto3" json:"config_path,omitempty"`
	// Defines the path the repo is checked out to in the source tree, i.e. the
	// "path" attribute in the manifest.
	RepoCheckoutPath string `protobuf:"bytes,4,opt,name=repo_checkout_path,json=repoCheckoutPath,proto3" json:"repo_checkout_path,omitempty"`
	// Defines ACLs for a project's builders.
	BuildbucketAcls *BuildbucketAcls `protobuf:"bytes,5,opt,name=buildbucket_acls,json=buildbucketAcls,proto3" json:"buildbucket_acls,omitempty"`
	// Define the project's local_manifest.
	LocalManifest *LocalManifest `protobuf:"bytes,6,opt,name=local_manifest,json=localManifest,proto3" json:"local_manifest,omitempty"`
	// The Google Storage bucket for artifacts from the project's builds.
	GsBucket string    `protobuf:"bytes,7,opt,name=gs_bucket,json=gsBucket,proto3" json:"gs_bucket,omitempty"`
	HwidInfo *HWIDInfo `protobuf:"bytes,8,opt,name=hwid_info,json=hwidInfo,proto3" json:"hwid_info,omitempty"`
}

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

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

func (*Project) ProtoMessage() {}

func (x *Project) ProtoReflect() protoreflect.Message {
	mi := &file_project_mgmt_project_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 Project.ProtoReflect.Descriptor instead.
func (*Project) Descriptor() ([]byte, []int) {
	return file_project_mgmt_project_proto_rawDescGZIP(), []int{3}
}

func (x *Project) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Project) GetRepo() string {
	if x != nil {
		return x.Repo
	}
	return ""
}

func (x *Project) GetConfigPath() string {
	if x != nil {
		return x.ConfigPath
	}
	return ""
}

func (x *Project) GetRepoCheckoutPath() string {
	if x != nil {
		return x.RepoCheckoutPath
	}
	return ""
}

func (x *Project) GetBuildbucketAcls() *BuildbucketAcls {
	if x != nil {
		return x.BuildbucketAcls
	}
	return nil
}

func (x *Project) GetLocalManifest() *LocalManifest {
	if x != nil {
		return x.LocalManifest
	}
	return nil
}

func (x *Project) GetGsBucket() string {
	if x != nil {
		return x.GsBucket
	}
	return ""
}

func (x *Project) GetHwidInfo() *HWIDInfo {
	if x != nil {
		return x.HwidInfo
	}
	return nil
}

type ProjectList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*Project `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*ProjectList) ProtoMessage() {}

func (x *ProjectList) ProtoReflect() protoreflect.Message {
	mi := &file_project_mgmt_project_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 ProjectList.ProtoReflect.Descriptor instead.
func (*ProjectList) Descriptor() ([]byte, []int) {
	return file_project_mgmt_project_proto_rawDescGZIP(), []int{4}
}

func (x *ProjectList) GetValue() []*Project {
	if x != nil {
		return x.Value
	}
	return nil
}

var File_project_mgmt_project_proto protoreflect.FileDescriptor

var file_project_mgmt_project_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x70,
	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x70, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x22, 0x42, 0x0a, 0x0f, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x6c, 0x73, 0x12, 0x2f, 0x0a,
	0x13, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x61,
	0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0x4f,
	0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12,
	0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61,
	0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22,
	0x2b, 0x0a, 0x08, 0x48, 0x57, 0x49, 0x44, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x70,
	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x65, 0x79, 0x22, 0xe0, 0x02, 0x0a,
	0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04,
	0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f,
	0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74,
	0x68, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f,
	0x75, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72,
	0x65, 0x70, 0x6f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12,
	0x48, 0x0a, 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x61,
	0x63, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x6c, 0x73, 0x52, 0x0f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
	0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x6c, 0x6f, 0x63,
	0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74,
	0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x0d,
	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a,
	0x09, 0x67, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x08, 0x67, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x68, 0x77,
	0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x48, 0x57, 0x49,
	0x44, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x68, 0x77, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x22,
	0x3a, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e,
	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x50, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x38, 0x5a, 0x36, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
	0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_project_mgmt_project_proto_rawDescOnce sync.Once
	file_project_mgmt_project_proto_rawDescData = file_project_mgmt_project_proto_rawDesc
)

func file_project_mgmt_project_proto_rawDescGZIP() []byte {
	file_project_mgmt_project_proto_rawDescOnce.Do(func() {
		file_project_mgmt_project_proto_rawDescData = protoimpl.X.CompressGZIP(file_project_mgmt_project_proto_rawDescData)
	})
	return file_project_mgmt_project_proto_rawDescData
}

var file_project_mgmt_project_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_project_mgmt_project_proto_goTypes = []interface{}{
	(*BuildbucketAcls)(nil), // 0: project_mgmt.BuildbucketAcls
	(*LocalManifest)(nil),   // 1: project_mgmt.LocalManifest
	(*HWIDInfo)(nil),        // 2: project_mgmt.HWIDInfo
	(*Project)(nil),         // 3: project_mgmt.Project
	(*ProjectList)(nil),     // 4: project_mgmt.ProjectList
}
var file_project_mgmt_project_proto_depIdxs = []int32{
	0, // 0: project_mgmt.Project.buildbucket_acls:type_name -> project_mgmt.BuildbucketAcls
	1, // 1: project_mgmt.Project.local_manifest:type_name -> project_mgmt.LocalManifest
	2, // 2: project_mgmt.Project.hwid_info:type_name -> project_mgmt.HWIDInfo
	3, // 3: project_mgmt.ProjectList.value:type_name -> project_mgmt.Project
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_project_mgmt_project_proto_init() }
func file_project_mgmt_project_proto_init() {
	if File_project_mgmt_project_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_project_mgmt_project_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildbucketAcls); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_project_mgmt_project_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocalManifest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_project_mgmt_project_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HWIDInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_project_mgmt_project_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Project); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_project_mgmt_project_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProjectList); 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_project_mgmt_project_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_project_mgmt_project_proto_goTypes,
		DependencyIndexes: file_project_mgmt_project_proto_depIdxs,
		MessageInfos:      file_project_mgmt_project_proto_msgTypes,
	}.Build()
	File_project_mgmt_project_proto = out.File
	file_project_mgmt_project_proto_rawDesc = nil
	file_project_mgmt_project_proto_goTypes = nil
	file_project_mgmt_project_proto_depIdxs = nil
}
