// Copyright 2018 The LUCI Authors.
//
// 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.31.0
// 	protoc        v3.21.7
// source: go.chromium.org/luci/cv/api/config/v2/config.proto

package cfgpb

import (
	_ "github.com/envoyproxy/protoc-gen-validate/validate"
	_ "go.chromium.org/luci/common/proto"
	v1 "go.chromium.org/luci/cv/api/v1"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
	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)
)

// Determines how visible the results of a build for this builder are in Gerrit
// comments.
//
// This doesn't affect the buildbucket plugin (green/red chips).
type CommentLevel int32

const (
	// Currently default to full visibility.
	CommentLevel_COMMENT_LEVEL_UNSET CommentLevel = 0
	// The CQ reports the summary markdown and a link to the buildbucket build id
	// in Milo with the builder name in the URL in a Gerrit comment.
	CommentLevel_COMMENT_LEVEL_FULL CommentLevel = 1
	// The CQ reports a generic "Build failed: https://ci.chromium.org/b/1234"
	// with no summary markdown.
	CommentLevel_COMMENT_LEVEL_RESTRICTED CommentLevel = 2
)

// Enum value maps for CommentLevel.
var (
	CommentLevel_name = map[int32]string{
		0: "COMMENT_LEVEL_UNSET",
		1: "COMMENT_LEVEL_FULL",
		2: "COMMENT_LEVEL_RESTRICTED",
	}
	CommentLevel_value = map[string]int32{
		"COMMENT_LEVEL_UNSET":      0,
		"COMMENT_LEVEL_FULL":       1,
		"COMMENT_LEVEL_RESTRICTED": 2,
	}
)

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

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

func (CommentLevel) Descriptor() protoreflect.EnumDescriptor {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes[0].Descriptor()
}

func (CommentLevel) Type() protoreflect.EnumType {
	return &file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes[0]
}

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

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

// A boolean with an "unset" default value.
type Toggle int32

const (
	Toggle_UNSET Toggle = 0
	Toggle_YES   Toggle = 1
	Toggle_NO    Toggle = 2
)

// Enum value maps for Toggle.
var (
	Toggle_name = map[int32]string{
		0: "UNSET",
		1: "YES",
		2: "NO",
	}
	Toggle_value = map[string]int32{
		"UNSET": 0,
		"YES":   1,
		"NO":    2,
	}
)

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

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

func (Toggle) Descriptor() protoreflect.EnumDescriptor {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes[1].Descriptor()
}

func (Toggle) Type() protoreflect.EnumType {
	return &file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes[1]
}

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

// Deprecated: Use Toggle.Descriptor instead.
func (Toggle) EnumDescriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{1}
}

// See `allow_owner_if_submittable` doc below.
type Verifiers_GerritCQAbility_CQAction int32

const (
	Verifiers_GerritCQAbility_UNSET   Verifiers_GerritCQAbility_CQAction = 0
	Verifiers_GerritCQAbility_DRY_RUN Verifiers_GerritCQAbility_CQAction = 1
	// COMMIT implies ability to trigger dry run as well.
	Verifiers_GerritCQAbility_COMMIT Verifiers_GerritCQAbility_CQAction = 2
)

// Enum value maps for Verifiers_GerritCQAbility_CQAction.
var (
	Verifiers_GerritCQAbility_CQAction_name = map[int32]string{
		0: "UNSET",
		1: "DRY_RUN",
		2: "COMMIT",
	}
	Verifiers_GerritCQAbility_CQAction_value = map[string]int32{
		"UNSET":   0,
		"DRY_RUN": 1,
		"COMMIT":  2,
	}
)

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

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

func (Verifiers_GerritCQAbility_CQAction) Descriptor() protoreflect.EnumDescriptor {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes[2].Descriptor()
}

func (Verifiers_GerritCQAbility_CQAction) Type() protoreflect.EnumType {
	return &file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes[2]
}

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

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

// This message describes a CQ configuration.
//
// The config file commit-queue.cfg should be stored in the config directory of
// your project, alongside cr-buildbucket.cfg.
//
// Pro-tip: a command line tool exists to validate a locally generated .cfg
// file and verify that it matches arbitrary given CLs as expected.
// See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/main/cv/#luci-cv-command-line-utils
type Config struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Deprecated. Ignored. Do not use.
	// See also https://crbug.com/1208569 to implement an alternative.
	//
	// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
	DrainingStartTime string `protobuf:"bytes,1,opt,name=draining_start_time,json=drainingStartTime,proto3" json:"draining_start_time,omitempty"`
	// Optional.
	//
	// Originally, this was used to specify the URL of the CQ status app where
	// users have access to their Run details. Currently, with the migration
	// from CQ to LUCI CV, this field no longer serves as the same meaning,
	// but is used to decide the visibility of the Run details via LUCI CV UI at
	// https://luci-change-verifier.appspot.com/ui/recents
	//
	// This field accepts the following values:
	//   - "chromium-cq-status.appspot.com": all Runs in this Project are public.
	//   - "internal-cq-status.appspot.com": all Runs in this Project are visible
	//     to Googler only.
	//
	// Note that the Run details page contains the name of the builders launched
	// to verify CL(s). Therefore, if this Project launches internal builders for
	// public repos and the builder names are confidential, please don't
	// use public host.
	//
	// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
	CqStatusHost string `protobuf:"bytes,2,opt,name=cq_status_host,json=cqStatusHost,proto3" json:"cq_status_host,omitempty"`
	// Optional options for how CLs should be submitted.
	SubmitOptions *SubmitOptions `protobuf:"bytes,3,opt,name=submit_options,json=submitOptions,proto3" json:"submit_options,omitempty"`
	// At least 1 ConfigGroup is required.
	ConfigGroups []*ConfigGroup `protobuf:"bytes,4,rep,name=config_groups,json=configGroups,proto3" json:"config_groups,omitempty"`
	// Deprecated. Ignored. Do not use.
	//
	// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
	ProjectScopedAccount Toggle `protobuf:"varint,5,opt,name=project_scoped_account,json=projectScopedAccount,proto3,enum=cv.config.Toggle" json:"project_scoped_account,omitempty"`
}

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

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

func (*Config) ProtoMessage() {}

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

// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
func (x *Config) GetDrainingStartTime() string {
	if x != nil {
		return x.DrainingStartTime
	}
	return ""
}

// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
func (x *Config) GetCqStatusHost() string {
	if x != nil {
		return x.CqStatusHost
	}
	return ""
}

func (x *Config) GetSubmitOptions() *SubmitOptions {
	if x != nil {
		return x.SubmitOptions
	}
	return nil
}

func (x *Config) GetConfigGroups() []*ConfigGroup {
	if x != nil {
		return x.ConfigGroups
	}
	return nil
}

// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
func (x *Config) GetProjectScopedAccount() Toggle {
	if x != nil {
		return x.ProjectScopedAccount
	}
	return Toggle_UNSET
}

// ConfigGroup allows one to share single verifiers config across a set of
// Gerrit repositories, which may be in different Gerrit installations.
type ConfigGroup struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The human- and machine-readable name (unique within this project) of this
	// config group. This is used in messages posted to users and in monitoring
	// data. Must match regex "^[a-zA-Z][a-zA-Z0-9_-]*$".
	Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"`
	// At least 1 Gerrit instance with repositories to work with is required.
	Gerrit []*ConfigGroup_Gerrit `protobuf:"bytes,1,rep,name=gerrit,proto3" json:"gerrit,omitempty"`
	// Optional. If specified, CQ will consider sets of dependent CLs to test and
	// submit at the same time.
	//
	// Typical use-case is testing & submitting changes to multiple repos at the
	// same time, in which case all such repos must be declared up-front in
	// `Gerrit` part of this config_group.
	//
	// Not allowed to be used together with
	// submit_options.allow_submit_with_open_deps=true.
	CombineCls *CombineCLs `protobuf:"bytes,4,opt,name=combine_cls,json=combineCls,proto3" json:"combine_cls,omitempty"`
	// Defines how to verify a CL before submitting it. Required.
	Verifiers *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,omitempty"`
	// If set, this ConfigGroup will be used if no other ConfigGroup matches.
	//
	// At most 1 config_group can be YES.
	//
	// Example use is to define specific config_group for refs/heads/main,
	// and fallback one for refs/heads/* which will pick up all CLs on
	// non-main branches.
	//
	// TODO(crbug/966115): provide a better solution.
	Fallback Toggle `protobuf:"varint,5,opt,name=fallback,proto3,enum=cv.config.Toggle" json:"fallback,omitempty"`
	// Optional. Additional run modes supported besides standard DRY_RUN and
	// FULL_RUN.
	//
	// If specified, the order matters. CQ will create the Run with the first
	// mode for which triggering conditions are fulfilled. If there is no such
	// mode, CQ will fallback to standard DRY_RUN or FULL_RUN.
	//
	// All the mode names must be unique.
	AdditionalModes []*Mode `protobuf:"bytes,7,rep,name=additional_modes,json=additionalModes,proto3" json:"additional_modes,omitempty"`
	// Per-user limits.
	//
	// At the time of a Run creation, CV will iterate `user_limits` and apply the
	// first applicable limit to the Run. If none of the limit(s) are applicable,
	// CV will apply `user_limits_default` to the run.
	UserLimits []*UserLimit `protobuf:"bytes,8,rep,name=user_limits,json=userLimits,proto3" json:"user_limits,omitempty"`
	// Default per-user limit.
	//
	// If CV couldn't find an applicable limit from `user_limits`, this limit
	// will be applied.
	UserLimitDefault *UserLimit `protobuf:"bytes,9,opt,name=user_limit_default,json=userLimitDefault,proto3" json:"user_limit_default,omitempty"`
	// PostActions to be performed on a Run completion.
	//
	// On a Run completion, all the post actions with matching conditions will
	// be executed.
	//
	// All actions must have a unique name in the list.
	PostActions []*ConfigGroup_PostAction `protobuf:"bytes,10,rep,name=post_actions,json=postActions,proto3" json:"post_actions,omitempty"`
	// TryjobExperiments that will be conditionally enabled for Tryjobs.
	TryjobExperiments []*ConfigGroup_TryjobExperiment `protobuf:"bytes,11,rep,name=tryjob_experiments,json=tryjobExperiments,proto3" json:"tryjob_experiments,omitempty"`
}

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

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

func (*ConfigGroup) ProtoMessage() {}

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

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

func (x *ConfigGroup) GetGerrit() []*ConfigGroup_Gerrit {
	if x != nil {
		return x.Gerrit
	}
	return nil
}

func (x *ConfigGroup) GetCombineCls() *CombineCLs {
	if x != nil {
		return x.CombineCls
	}
	return nil
}

func (x *ConfigGroup) GetVerifiers() *Verifiers {
	if x != nil {
		return x.Verifiers
	}
	return nil
}

func (x *ConfigGroup) GetFallback() Toggle {
	if x != nil {
		return x.Fallback
	}
	return Toggle_UNSET
}

func (x *ConfigGroup) GetAdditionalModes() []*Mode {
	if x != nil {
		return x.AdditionalModes
	}
	return nil
}

func (x *ConfigGroup) GetUserLimits() []*UserLimit {
	if x != nil {
		return x.UserLimits
	}
	return nil
}

func (x *ConfigGroup) GetUserLimitDefault() *UserLimit {
	if x != nil {
		return x.UserLimitDefault
	}
	return nil
}

func (x *ConfigGroup) GetPostActions() []*ConfigGroup_PostAction {
	if x != nil {
		return x.PostActions
	}
	return nil
}

func (x *ConfigGroup) GetTryjobExperiments() []*ConfigGroup_TryjobExperiment {
	if x != nil {
		return x.TryjobExperiments
	}
	return nil
}

// SubmitOptions control how CQ submits CLs.
type SubmitOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Optional. Maximum number of successful CQ attempts completed by submitting
	// corresponding Gerrit CL(s) before waiting burst_delay.
	//
	// This feature today applies to all attempts processed by this CQ, across all
	// config_groups.
	//
	// Must be >0 to take effect. Requires burst_delay to be set, too.
	MaxBurst int32 `protobuf:"varint,1,opt,name=max_burst,json=maxBurst,proto3" json:"max_burst,omitempty"`
	// Optional. Delay between bursts of submissions of CQ attempts.
	// See max_burst for more info.
	//
	// Must be >0 to take effect. Requires max_burst to be set, too.
	BurstDelay *durationpb.Duration `protobuf:"bytes,2,opt,name=burst_delay,json=burstDelay,proto3" json:"burst_delay,omitempty"`
}

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

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

func (*SubmitOptions) ProtoMessage() {}

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

func (x *SubmitOptions) GetMaxBurst() int32 {
	if x != nil {
		return x.MaxBurst
	}
	return 0
}

func (x *SubmitOptions) GetBurstDelay() *durationpb.Duration {
	if x != nil {
		return x.BurstDelay
	}
	return nil
}

// Mode defines a CQ Run mode and how it can be triggered.
//
// The mode ACL check will be same as dry run (i.e. use `dry_run_access_list`)
// if 1 is provided for `cq_label_value`. Otherwise, the check will the same as
// full run (i.e. checking whether CL is approved and whether CL owner is
// committer) if 2 is provided for `cq_label_value`.
type Mode struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the mode.
	//
	// Must match regex "^[A-Z][A-Z_]{0,39}$".
	// Must not be one of the reserved Run modes
	//   - DRY_RUN
	//   - FULL_RUN
	//   - NEW_PATCHSET_RUN
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Value of Commit-Queue label that triggers a run in the mode.
	//
	// Must be either 1 or 2. If 2 is provided, LUCI CV will follow the
	// FULL_RUN behavior that it will submit CL(s) in this run after all
	// tryjobs have passed.
	CqLabelValue int32 `protobuf:"varint,2,opt,name=cq_label_value,json=cqLabelValue,proto3" json:"cq_label_value,omitempty"`
	// Label that MUST also be voted with `triggering_value` in addition to
	// "Commit-Queue" label to trigger a run in the mode.
	//
	// Must not be "Commit-Queue"
	TriggeringLabel string `protobuf:"bytes,3,opt,name=triggering_label,json=triggeringLabel,proto3" json:"triggering_label,omitempty"`
	// Value of the `triggering_label` that triggers a run in the mode.
	//
	// Must be > 0.
	TriggeringValue int32 `protobuf:"varint,4,opt,name=triggering_value,json=triggeringValue,proto3" json:"triggering_value,omitempty"`
}

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

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

func (*Mode) ProtoMessage() {}

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

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

func (x *Mode) GetCqLabelValue() int32 {
	if x != nil {
		return x.CqLabelValue
	}
	return 0
}

func (x *Mode) GetTriggeringLabel() string {
	if x != nil {
		return x.TriggeringLabel
	}
	return ""
}

func (x *Mode) GetTriggeringValue() int32 {
	if x != nil {
		return x.TriggeringValue
	}
	return 0
}

// CombineCLs defines how CQ works with >1 CL per attempt.
//
// Dependencies between CLs are either implicit via Git child->parent
// relationship (e.g. stacked CLs in Gerrit) or explicit via "CQ-Depend:"
// footer in CL description (next to Change-Id:). "CQ-Depend" may span
// across repositories and even Gerrit hosts. For example, a CL on
// https://pdfium-review.googlesource.com may declare dependency on
// https://chromium-review.googlesource.com/1111111 by adding this footer:
//
//	CQ-Depend: chromium:1111111
//
// The "chromium" part means that 1111111 is on the
// chromium-review.googlesource.com host. It can be omitted if dependency
// is on the same host as the CL depending on it.
//
// CQ-Depend alone or with Git dependencies may form cycles, which is useful
// to require CQ to test & submit all CLs in a cycle at the same time, never
// alone.
//
// A user must vote on CQ label on **each CL** individually. Since it can't be
// instantaneous, `stabilization_delay` controls how long CQ waits for all
// CQ+1/2 votes before computing maximal expanded set of CLs and starting the
// attempt.
//
// For any CL with CQ+1/2 vote, each of its dependency must have the same CQ
// vote and be configured for CQ **in the same config group**, else CQ would
// abort the attempt with appropriate error message.
//
// Each tryjob CQ triggers via Buildbucket will be associated with each CL of
// the attempt via `gerrit_changes` parameter of Buildbucket. These changes are
// then available to a build as it is being executed. If ran via recipes,
// the `ordered_gerrit_changes` property of
// https://chromium.googlesource.com/infra/luci/recipes-py/+/HEAD/README.recipes.md#class-cqapi_recipeapi
// can be used to CLs in the right order.
//
// WARNING: When submitting CLs, CQ can not do so atomically (all submitted or
// none submitted) because Gerrit doesn't support this even for the same repo.
type CombineCLs struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Roughly, how long CQ waits for CQ to be triggered on each of the related
	// CLs.
	//
	// Must be greater than 10s.
	// 30s is recommended.
	//
	// Technically precise definition is time to wait since the latest CL among
	// related ones receives CQ+1/2 vote before starting actual attempt.
	//
	// For example, during this delay, a CQ vote may be added on another CL
	// which depends on previously CQ-ed CL in this not-yet-started attempt. Then,
	// CQ would extend the attempt with additional CL and reset the waiting
	// counter.
	//
	// Additional implication is that a standalone CL w/o any other relations to
	// other CLs will need to wait this much time before CQ would start processing
	// it (i.e., before it triggers first tryjob).
	StabilizationDelay *durationpb.Duration `protobuf:"bytes,1,opt,name=stabilization_delay,json=stabilizationDelay,proto3" json:"stabilization_delay,omitempty"`
}

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

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

func (*CombineCLs) ProtoMessage() {}

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

func (x *CombineCLs) GetStabilizationDelay() *durationpb.Duration {
	if x != nil {
		return x.StabilizationDelay
	}
	return nil
}

// Verifiers are various types of checks that a Commit Queue performs on a CL.
// All verifiers must pass in order for a CL to be submitted. Configuration file
// describes types of verifiers that should be applied to each CL and their
// parameters.
type Verifiers struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. GerritCQAbility ensures that a user who triggered
	// this CQ attempt actually has rights to do so based on 3 factors:
	//   - membership of the user in committers & dryrunners group,
	//   - the state of CL/patchset on which CQ is triggered,
	//   - relationship of the user to the CL.
	GerritCqAbility *Verifiers_GerritCQAbility `protobuf:"bytes,1,opt,name=gerrit_cq_ability,json=gerritCqAbility,proto3" json:"gerrit_cq_ability,omitempty"`
	// This verifier is used to check tree status before committing a CL. If the
	// tree is closed, then the verifier will wait until it is reopened.
	TreeStatus *Verifiers_TreeStatus `protobuf:"bytes,2,opt,name=tree_status,json=treeStatus,proto3" json:"tree_status,omitempty"`
	// This verifier triggers a set of builds through Buildbucket.
	//
	// CQ automatically retries failed tryjobs and only allows CL to land if each
	// builder has succeeded in the latest retry.
	// If a given tryjob result is too old (>1 day) it is ignored.
	//
	// Typically, builds from Buildbucket are executed on LUCI stack, however, CQ
	// is agnostic to how and where builds are executed.
	Tryjob *Verifiers_Tryjob `protobuf:"bytes,3,opt,name=tryjob,proto3" json:"tryjob,omitempty"`
	// CQLinter is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
	Cqlinter *Verifiers_CQLinter `protobuf:"bytes,4,opt,name=cqlinter,proto3" json:"cqlinter,omitempty"`
	// Fake is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
	Fake *Verifiers_Fake `protobuf:"bytes,5,opt,name=fake,proto3" json:"fake,omitempty"`
}

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

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

func (*Verifiers) ProtoMessage() {}

func (x *Verifiers) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_cv_api_config_v2_config_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 Verifiers.ProtoReflect.Descriptor instead.
func (*Verifiers) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{5}
}

func (x *Verifiers) GetGerritCqAbility() *Verifiers_GerritCQAbility {
	if x != nil {
		return x.GerritCqAbility
	}
	return nil
}

func (x *Verifiers) GetTreeStatus() *Verifiers_TreeStatus {
	if x != nil {
		return x.TreeStatus
	}
	return nil
}

func (x *Verifiers) GetTryjob() *Verifiers_Tryjob {
	if x != nil {
		return x.Tryjob
	}
	return nil
}

func (x *Verifiers) GetCqlinter() *Verifiers_CQLinter {
	if x != nil {
		return x.Cqlinter
	}
	return nil
}

func (x *Verifiers) GetFake() *Verifiers_Fake {
	if x != nil {
		return x.Fake
	}
	return nil
}

// UserLimit specifies Run and Tryjob limits per user.
type UserLimit struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the limit. Must be unique across all the policies
	// with the LUCI project.
	//
	// Required. Must match regex '^[0-9A-Za-z][0-9A-Za-z\.\-@_+]{0,511}$'
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Principals to apply the limits to.
	//
	// Each entry can be either an identity string "user:<email>"
	// or a LUCI group reference "group:<name>"
	Principals []string `protobuf:"bytes,2,rep,name=principals,proto3" json:"principals,omitempty"`
	// Run limits. Required.
	Run *UserLimit_Run `protobuf:"bytes,5,opt,name=run,proto3" json:"run,omitempty"`
	// Tryjob limits. Required
	Tryjob *UserLimit_Tryjob `protobuf:"bytes,6,opt,name=tryjob,proto3" json:"tryjob,omitempty"`
}

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

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

func (*UserLimit) ProtoMessage() {}

func (x *UserLimit) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_cv_api_config_v2_config_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 UserLimit.ProtoReflect.Descriptor instead.
func (*UserLimit) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{6}
}

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

func (x *UserLimit) GetPrincipals() []string {
	if x != nil {
		return x.Principals
	}
	return nil
}

func (x *UserLimit) GetRun() *UserLimit_Run {
	if x != nil {
		return x.Run
	}
	return nil
}

func (x *UserLimit) GetTryjob() *UserLimit_Tryjob {
	if x != nil {
		return x.Tryjob
	}
	return nil
}

// Enumerates repositories on a Gerrit instance for which CQ should work.
type ConfigGroup_Gerrit struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Gerrit URL, e.g., https://chromium-review.googlesource.com.
	// No trailing slashes allowed.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Gerrit projects of this Gerrit instance to work with.
	//
	// At least 1 required.
	Projects []*ConfigGroup_Gerrit_Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"`
}

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

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

func (*ConfigGroup_Gerrit) ProtoMessage() {}

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

func (x *ConfigGroup_Gerrit) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

func (x *ConfigGroup_Gerrit) GetProjects() []*ConfigGroup_Gerrit_Project {
	if x != nil {
		return x.Projects
	}
	return nil
}

// Action to be performed on a Run completion.
type ConfigGroup_PostAction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the post action.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// If at least one of the conditions is met,
	// the action will be triggered on a Run completion.
	Conditions []*ConfigGroup_PostAction_TriggeringCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"`
	// Types that are assignable to Action:
	//
	//	*ConfigGroup_PostAction_VoteGerritLabels_
	Action isConfigGroup_PostAction_Action `protobuf_oneof:"action"`
}

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

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

func (*ConfigGroup_PostAction) ProtoMessage() {}

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

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

func (x *ConfigGroup_PostAction) GetConditions() []*ConfigGroup_PostAction_TriggeringCondition {
	if x != nil {
		return x.Conditions
	}
	return nil
}

func (m *ConfigGroup_PostAction) GetAction() isConfigGroup_PostAction_Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (x *ConfigGroup_PostAction) GetVoteGerritLabels() *ConfigGroup_PostAction_VoteGerritLabels {
	if x, ok := x.GetAction().(*ConfigGroup_PostAction_VoteGerritLabels_); ok {
		return x.VoteGerritLabels
	}
	return nil
}

type isConfigGroup_PostAction_Action interface {
	isConfigGroup_PostAction_Action()
}

type ConfigGroup_PostAction_VoteGerritLabels_ struct {
	VoteGerritLabels *ConfigGroup_PostAction_VoteGerritLabels `protobuf:"bytes,3,opt,name=vote_gerrit_labels,json=voteGerritLabels,proto3,oneof"`
}

func (*ConfigGroup_PostAction_VoteGerritLabels_) isConfigGroup_PostAction_Action() {}

// TryjobExperiment is experiment (e.g. Buildbucket Build experiment) that
// will be enabled on the Tryjobs of CLs that meet the condition.
//
// TODO(crbug/1440834): Currently this feature has a caveat that a Run with
// this experiment enabled may reuse the Tryjob from previous Run that
// doesn't have this experiment enabled. This typically happens to the Run
// triggered immediately after the config change.
type ConfigGroup_TryjobExperiment struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the experiment.
	//
	// See `experiments` field in
	// https://pkg.go.dev/go.chromium.org/luci/buildbucket/proto#BuilderConfig
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The condition to meet to enable this experiment.
	//
	// The absence of condition means the experiment will be enabled
	// unconditionally.
	Condition *ConfigGroup_TryjobExperiment_Condition `protobuf:"bytes,2,opt,name=condition,proto3" json:"condition,omitempty"`
}

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

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

func (*ConfigGroup_TryjobExperiment) ProtoMessage() {}

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

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

func (x *ConfigGroup_TryjobExperiment) GetCondition() *ConfigGroup_TryjobExperiment_Condition {
	if x != nil {
		return x.Condition
	}
	return nil
}

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

	// Repository name inside Gerrit host. Required.
	//
	// No leading or trailing slashes allowed, no '.git' at the end.
	// 'a/' prefix is also not allowed (it's used on *.googlesource.com for
	// forcing authentication).
	//
	// Examples on https://chromium-review.googlesource.com:
	//
	//	catapult
	//	chromium/src
	//	chromium/tools/depot_tools
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Limit CLs in this repo to only these refs. Required.
	//
	// If not specified, defaults to "refs/heads/master".
	//
	// NOTE: your Gerrit admin must configure Gerrit ACLs such that CQ has
	// read access to these refs, otherwise your users will be waiting for CQ
	// to act on their CLs forever.
	//
	// Regular expression is validated by https://github.com/google/re2 library.
	//
	// NOTE: Git globs aren't supported. Convert them to a regular expression,
	// e.g., Git glob "refs/heads/*" should be "refs/heads/[^/]+".
	// However, users typically expect "refs/heads/.+", since expectation is
	// that every typical Git branch to be CQ-able, including
	// "refs/heads/experimental/foobar".
	RefRegexp []string `protobuf:"bytes,2,rep,name=ref_regexp,json=refRegexp,proto3" json:"ref_regexp,omitempty"`
	// Exclude matching refs in this repo. Optional.
	//
	// If a ref is matches at least one of the ref_regexp_exclude,
	// then it is ignored by this config group regardless of ref_regexp.
	//
	// The syntax is the same as for ref_regexp.
	RefRegexpExclude []string `protobuf:"bytes,3,rep,name=ref_regexp_exclude,json=refRegexpExclude,proto3" json:"ref_regexp_exclude,omitempty"`
}

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

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

func (*ConfigGroup_Gerrit_Project) ProtoMessage() {}

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

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

func (x *ConfigGroup_Gerrit_Project) GetRefRegexp() []string {
	if x != nil {
		return x.RefRegexp
	}
	return nil
}

func (x *ConfigGroup_Gerrit_Project) GetRefRegexpExclude() []string {
	if x != nil {
		return x.RefRegexpExclude
	}
	return nil
}

// Condition to be met for the action to be triggered.
type ConfigGroup_PostAction_TriggeringCondition struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the mode to be matched.
	//
	// Must be FULL_RUN, DRY_RUN, NEW_PATCHSET_RUN, or one of the additional
	// modes configured.
	Mode string `protobuf:"bytes,1,opt,name=mode,proto3" json:"mode,omitempty"`
	// Statuses to trigger the action on.
	//
	// Must be terminal statuses.
	// Duplicates are not allowed.
	Statuses []v1.Run_Status `protobuf:"varint,2,rep,packed,name=statuses,proto3,enum=cv.v1.Run_Status" json:"statuses,omitempty"`
}

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

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

func (*ConfigGroup_PostAction_TriggeringCondition) ProtoMessage() {}

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

func (x *ConfigGroup_PostAction_TriggeringCondition) GetMode() string {
	if x != nil {
		return x.Mode
	}
	return ""
}

func (x *ConfigGroup_PostAction_TriggeringCondition) GetStatuses() []v1.Run_Status {
	if x != nil {
		return x.Statuses
	}
	return nil
}

// Vote Gerrit labels with given values.
type ConfigGroup_PostAction_VoteGerritLabels struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// All label names must be unique.
	Votes []*ConfigGroup_PostAction_VoteGerritLabels_Vote `protobuf:"bytes,1,rep,name=votes,proto3" json:"votes,omitempty"`
}

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

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

func (*ConfigGroup_PostAction_VoteGerritLabels) ProtoMessage() {}

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

func (x *ConfigGroup_PostAction_VoteGerritLabels) GetVotes() []*ConfigGroup_PostAction_VoteGerritLabels_Vote {
	if x != nil {
		return x.Votes
	}
	return nil
}

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

	// Gerrit label name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Value to set on the label
	Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*ConfigGroup_PostAction_VoteGerritLabels_Vote) ProtoMessage() {}

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

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

func (x *ConfigGroup_PostAction_VoteGerritLabels_Vote) GetValue() int32 {
	if x != nil {
		return x.Value
	}
	return 0
}

// Condition describes the condition for this experiment to be enabled.
type ConfigGroup_TryjobExperiment_Condition struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// ownerGroupAllowlist is a list of CrIA groups that the owner of the CL
	// must be a member in any of those groups in order to enable the
	// experiment.
	//
	// If the list is empty, this condition is considered as met.
	OwnerGroupAllowlist []string `protobuf:"bytes,1,rep,name=owner_group_allowlist,json=ownerGroupAllowlist,proto3" json:"owner_group_allowlist,omitempty"`
}

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

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

func (*ConfigGroup_TryjobExperiment_Condition) ProtoMessage() {}

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

func (x *ConfigGroup_TryjobExperiment_Condition) GetOwnerGroupAllowlist() []string {
	if x != nil {
		return x.OwnerGroupAllowlist
	}
	return nil
}

// Next tag: 8.
type Verifiers_GerritCQAbility struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. List of chrome-infra-auth groups, whose members are authorized
	// to trigger full CQ runs.
	//
	// Typically, such groups are named "project-<name>-committers".
	CommitterList []string `protobuf:"bytes,1,rep,name=committer_list,json=committerList,proto3" json:"committer_list,omitempty"`
	// Optional, but strongly recommended. List of chrome-infra-auth groups,
	// whose members are authorized to trigger CQ dry run on Gerrit CLs.
	//
	// By default, they are allowed to trigger CQ dry runs on their own
	// CLs only, but this can be relaxed, if `allow_non_owner_dry_runner`
	// is set.
	//
	// Typically, such groups are named "project-<name>-tryjob-access".
	DryRunAccessList []string `protobuf:"bytes,2,rep,name=dry_run_access_list,json=dryRunAccessList,proto3" json:"dry_run_access_list,omitempty"`
	// Optional, but required to use auto-triggered runs on new patchset upload,
	// it defines a list of chrome-infra-auth groups whose members are
	// authorized to trigger a new patchset runs. That is, CV will check the
	// owner of the CL when a new patchset is uploaded against these.
	NewPatchsetRunAccessList []string `protobuf:"bytes,5,rep,name=new_patchset_run_access_list,json=newPatchsetRunAccessList,proto3" json:"new_patchset_run_access_list,omitempty"`
	// Optional. allow_submit_with_open_deps controls how CQ full run behaves
	// when current Gerrit CL has open dependencies (not yet submitted CLs on
	// which *this* CL depends).
	//
	// If set to false (default), CQ will abort full run attempt immediately if
	// open dependencies are detected.
	//
	// If set to true, then CQ will not abort full run and upon passing all
	// other verifiers, CQ will attempt to submit the CL regardless of open
	// dependencies and whether CQ verified those open dependencies.
	// In turn, if Gerrit project config allows this, Gerrit will execute submit
	// of all dependent CLs first and then this CL.
	AllowSubmitWithOpenDeps bool `protobuf:"varint,3,opt,name=allow_submit_with_open_deps,json=allowSubmitWithOpenDeps,proto3" json:"allow_submit_with_open_deps,omitempty"`
	// Optional. Allow CL owner to trigger CQ dry or full run on their own CL,
	// even if not a member of `committer_list` or `dry_run_access_list`.
	// Defaults to no such allowance.
	//
	// WARNING: using this option is not recommended if you have sticky
	// Code-Review label because this allows a malicious developer to upload
	// an good looking patchset at first, get code review approval,
	// and then upload a bad patchset and CQ it right away.
	//
	// CL owner is Gerrit user owning a CL, i.e., its first patchset uploader.
	// not to be confused with OWNERS files.
	AllowOwnerIfSubmittable Verifiers_GerritCQAbility_CQAction `protobuf:"varint,4,opt,name=allow_owner_if_submittable,json=allowOwnerIfSubmittable,proto3,enum=cv.config.Verifiers_GerritCQAbility_CQAction" json:"allow_owner_if_submittable,omitempty"`
	// Optional. Consider CL dependencies that are owned by members of
	// `dry_run_access_list` as trusted, even if they are not approved.
	//
	// By default, unapproved dependencies are only trusted if they are owned
	// by members of `committer_list`.
	//
	// This allows CQ dry run on CLs with unapproved dependencies owned by
	// members of `dry_run_access_list`.
	TrustDryRunnerDeps bool `protobuf:"varint,6,opt,name=trust_dry_runner_deps,json=trustDryRunnerDeps,proto3" json:"trust_dry_runner_deps,omitempty"`
	// Optional. Allow members of `dry_run_access_list` to trigger CQ dry run
	// on Gerrit CLs they do not own, even if the CL hasn't been approved.
	//
	// By default, members of `dry_run_access_list` can only trigger CQ dry run
	// on Gerrit CLs they own.
	AllowNonOwnerDryRunner bool `protobuf:"varint,7,opt,name=allow_non_owner_dry_runner,json=allowNonOwnerDryRunner,proto3" json:"allow_non_owner_dry_runner,omitempty"`
}

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

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

func (*Verifiers_GerritCQAbility) ProtoMessage() {}

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

func (x *Verifiers_GerritCQAbility) GetCommitterList() []string {
	if x != nil {
		return x.CommitterList
	}
	return nil
}

func (x *Verifiers_GerritCQAbility) GetDryRunAccessList() []string {
	if x != nil {
		return x.DryRunAccessList
	}
	return nil
}

func (x *Verifiers_GerritCQAbility) GetNewPatchsetRunAccessList() []string {
	if x != nil {
		return x.NewPatchsetRunAccessList
	}
	return nil
}

func (x *Verifiers_GerritCQAbility) GetAllowSubmitWithOpenDeps() bool {
	if x != nil {
		return x.AllowSubmitWithOpenDeps
	}
	return false
}

func (x *Verifiers_GerritCQAbility) GetAllowOwnerIfSubmittable() Verifiers_GerritCQAbility_CQAction {
	if x != nil {
		return x.AllowOwnerIfSubmittable
	}
	return Verifiers_GerritCQAbility_UNSET
}

func (x *Verifiers_GerritCQAbility) GetTrustDryRunnerDeps() bool {
	if x != nil {
		return x.TrustDryRunnerDeps
	}
	return false
}

func (x *Verifiers_GerritCQAbility) GetAllowNonOwnerDryRunner() bool {
	if x != nil {
		return x.AllowNonOwnerDryRunner
	}
	return false
}

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

	// Required. URL of the project tree status app.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
}

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

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

func (*Verifiers_TreeStatus) ProtoMessage() {}

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

func (x *Verifiers_TreeStatus) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

// Tryjob configures builders which CQ may trigger and/or use to verify CL(s).
type Verifiers_Tryjob struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Builders on which tryjobs should be triggered.
	//
	// CQ won't allow adding any builder via `CQ-Include-Trybots:` in CL
	// description except those in this list (including the equivalent
	// builders).
	Builders []*Verifiers_Tryjob_Builder `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
	// Optional, defaulting to no retries whatsoever.
	RetryConfig *Verifiers_Tryjob_RetryConfig `protobuf:"bytes,2,opt,name=retry_config,json=retryConfig,proto3" json:"retry_config,omitempty"`
	// DEPRECATED. Use per-builder `cancel_stale` instead.
	//
	// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
	CancelStaleTryjobs Toggle `protobuf:"varint,3,opt,name=cancel_stale_tryjobs,json=cancelStaleTryjobs,proto3,enum=cv.config.Toggle" json:"cancel_stale_tryjobs,omitempty"`
}

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

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

func (*Verifiers_Tryjob) ProtoMessage() {}

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

func (x *Verifiers_Tryjob) GetBuilders() []*Verifiers_Tryjob_Builder {
	if x != nil {
		return x.Builders
	}
	return nil
}

func (x *Verifiers_Tryjob) GetRetryConfig() *Verifiers_Tryjob_RetryConfig {
	if x != nil {
		return x.RetryConfig
	}
	return nil
}

// Deprecated: Marked as deprecated in go.chromium.org/luci/cv/api/config/v2/config.proto.
func (x *Verifiers_Tryjob) GetCancelStaleTryjobs() Toggle {
	if x != nil {
		return x.CancelStaleTryjobs
	}
	return Toggle_UNSET
}

// CQLinter is for internal use in CQ.
//
// Deprecated. Do not use.
// TODO(crbug/1127991): Remove after migration off CQDaemon is completed.
type Verifiers_CQLinter struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *Verifiers_CQLinter) Reset() {
	*x = Verifiers_CQLinter{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_CQLinter) ProtoMessage() {}

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

// Fake is for internal use in CQ.
//
// Deprecated. Do not use.
// TODO(crbug/1127991): Remove after migration off CQDaemon is completed.
type Verifiers_Fake struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name          string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	EventualState string `protobuf:"bytes,2,opt,name=eventual_state,json=eventualState,proto3" json:"eventual_state,omitempty"`
	Delay         int32  `protobuf:"varint,3,opt,name=delay,proto3" json:"delay,omitempty"`
}

func (x *Verifiers_Fake) Reset() {
	*x = Verifiers_Fake{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_Fake) ProtoMessage() {}

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

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

func (x *Verifiers_Fake) GetEventualState() string {
	if x != nil {
		return x.EventualState
	}
	return ""
}

func (x *Verifiers_Fake) GetDelay() int32 {
	if x != nil {
		return x.Delay
	}
	return 0
}

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

	// The buildbucket host name.
	//
	// Optional. If empty, default to "cr-buildbucket.appspot.com".
	Host string `protobuf:"bytes,16,opt,name=host,proto3" json:"host,omitempty"`
	// Required. Name of the builder as <project>/<bucket>/<builder>
	//
	// Examples:
	//
	//	"chromium/try/linux-tester"
	//	"other-project/try/shared-try-builder"
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// If true, this builder will only be used if specified via
	// `CQ-Include-Trybots:` on CL description.
	//
	// If false, the builder may still be included via `CQ-Include-Trybots:`
	// on CL description.
	//
	// This is useful if you want individual CLs to opt-in to this builder,
	// e.g.:
	//
	//	builder {name: "win-release"}                      # required for all.
	//	builder {name: "win-debug" includable_only: true}  # opt in only.
	//
	// Not combinable with:
	//   - location_filters
	//   - experiment_percentage
	IncludableOnly bool `protobuf:"varint,9,opt,name=includable_only,json=includableOnly,proto3" json:"includable_only,omitempty"`
	// Determines how visible the results of a build for this builder are in
	// Gerrit for this tryjob.
	//
	// This doesn't affect the buildbucket plugin (green/red chips).
	ResultVisibility CommentLevel `protobuf:"varint,10,opt,name=result_visibility,json=resultVisibility,proto3,enum=cv.config.CommentLevel" json:"result_visibility,omitempty"`
	// Optional. If true, a fresh build will be required for each CQ attempt.
	//
	// Default is false, meaning CQ may re-use a successful build
	// triggered before current CQ attempt started.
	//
	// This option is typically used for builders which run depot_tools'
	// PRESUBMIT scripts, which are supposed to be quick to run and provide
	// additional OWNERS, lint, etc checks which are useful to run against
	// the latest revision of the CL's target branch.
	DisableReuse bool `protobuf:"varint,2,opt,name=disable_reuse,json=disableReuse,proto3" json:"disable_reuse,omitempty"`
	// Optional. If YES (default), running or not-yet-started builds of this
	// builder previously triggered by CQ will be cancelled as soon as
	// a substantially different patchset is uploaded to a CL.
	//
	// The following paragraph is only applicable to LUCI Change Verifier (
	// The successor of legacy CQ). As of 09/2020, the implementation is
	// still WIP. TODO(crbug/1127991): Remove after migration is done.
	//
	// CV will snapshot the value of this option when a Run is created
	// and use it throughout the lifecycle of this Run. Therefore,
	// modification on this option will only take effect on newly-created
	// Runs after config change is propagated to CV.
	CancelStale Toggle `protobuf:"varint,11,opt,name=cancel_stale,json=cancelStale,proto3,enum=cv.config.Toggle" json:"cancel_stale,omitempty"`
	// Optional. When this field is present, it marks given builder as
	// experimental. It is only triggered on a given percentage of the CLs
	// and the outcome does not affect the decision of whether a CL can land
	// or not. This is typically used to test new builders and estimate their
	// capacity requirements. May be combined with location_filters.
	ExperimentPercentage float32 `protobuf:"fixed32,4,opt,name=experiment_percentage,json=experimentPercentage,proto3" json:"experiment_percentage,omitempty"`
	// Optionally specified alternative builder for CQ to choose instead.
	// If provided, CQ will choose only one of the equivalent builders as
	// required based purely on given CL and CL's owner and **regardless** of
	// the possibly already completed tryjobs.
	//
	// Note: The equivalent builders can be included using
	// `CQ-Include-Trybots:` footer. In this case, CQ will always try to
	// trigger the equivalent builders regardless of the equivalent
	// percentage.
	EquivalentTo    *Verifiers_Tryjob_EquivalentBuilder        `protobuf:"bytes,5,opt,name=equivalent_to,json=equivalentTo,proto3" json:"equivalent_to,omitempty"`
	LocationFilters []*Verifiers_Tryjob_Builder_LocationFilter `protobuf:"bytes,15,rep,name=location_filters,json=locationFilters,proto3" json:"location_filters,omitempty"`
	// If set, this builder will only be triggered if the CL owner (who first
	// uploaded the CL) is a member of at least one of these groups.
	OwnerWhitelistGroup []string `protobuf:"bytes,8,rep,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
	// If set, require this builder only if the Run mode matches one of the
	// modes in this list. If unset, it implies that only FULL_RUN and
	// DRY_RUN are allowed. Optional.
	ModeAllowlist []string `protobuf:"bytes,14,rep,name=mode_allowlist,json=modeAllowlist,proto3" json:"mode_allowlist,omitempty"`
}

func (x *Verifiers_Tryjob_Builder) Reset() {
	*x = Verifiers_Tryjob_Builder{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[20]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_Tryjob_Builder) ProtoMessage() {}

func (x *Verifiers_Tryjob_Builder) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[20]
	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 Verifiers_Tryjob_Builder.ProtoReflect.Descriptor instead.
func (*Verifiers_Tryjob_Builder) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{5, 2, 0}
}

func (x *Verifiers_Tryjob_Builder) GetHost() string {
	if x != nil {
		return x.Host
	}
	return ""
}

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

func (x *Verifiers_Tryjob_Builder) GetIncludableOnly() bool {
	if x != nil {
		return x.IncludableOnly
	}
	return false
}

func (x *Verifiers_Tryjob_Builder) GetResultVisibility() CommentLevel {
	if x != nil {
		return x.ResultVisibility
	}
	return CommentLevel_COMMENT_LEVEL_UNSET
}

func (x *Verifiers_Tryjob_Builder) GetDisableReuse() bool {
	if x != nil {
		return x.DisableReuse
	}
	return false
}

func (x *Verifiers_Tryjob_Builder) GetCancelStale() Toggle {
	if x != nil {
		return x.CancelStale
	}
	return Toggle_UNSET
}

func (x *Verifiers_Tryjob_Builder) GetExperimentPercentage() float32 {
	if x != nil {
		return x.ExperimentPercentage
	}
	return 0
}

func (x *Verifiers_Tryjob_Builder) GetEquivalentTo() *Verifiers_Tryjob_EquivalentBuilder {
	if x != nil {
		return x.EquivalentTo
	}
	return nil
}

func (x *Verifiers_Tryjob_Builder) GetLocationFilters() []*Verifiers_Tryjob_Builder_LocationFilter {
	if x != nil {
		return x.LocationFilters
	}
	return nil
}

func (x *Verifiers_Tryjob_Builder) GetOwnerWhitelistGroup() []string {
	if x != nil {
		return x.OwnerWhitelistGroup
	}
	return nil
}

func (x *Verifiers_Tryjob_Builder) GetModeAllowlist() []string {
	if x != nil {
		return x.ModeAllowlist
	}
	return nil
}

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

	// Required. Name of this builder.
	// Format is the same in the same format as Builder.name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Percentage expressing probability of CQ triggering this builder instead
	// of the builder to which this builder is equivalent to.
	//
	// A choice itself is made deterministically based on CL alone, hereby
	// all CQ attempts on all patchsets of a given CL will trigger the same
	// builder, assuming CQ config doesn't change in the mean time.
	//
	// Note that if `owner_whitelist_group` is also specified, the choice over
	// which of the two builders to trigger will be made only for CLs owned by
	// whitelisted group.
	//
	// If not specified, defaults to 0, meaning this builder is never
	// triggered by CQ, but an existing build can be re-used by CQ.
	//
	// To illustrate, suppose percentage=10. Then,
	//
	//	Without owner_whitelist_group,
	//	   ~10% of all CQ attempts will trigger this builder.
	//	With owner_whitelist_group set and, suppose, 1/5 of CQ attempts are
	//	   ran on CLs owned by this group, then only ~(1/10)*(1/5) or
	//	   ~2% of all CQ attempts will trigger this builder.
	Percentage float32 `protobuf:"fixed32,2,opt,name=percentage,proto3" json:"percentage,omitempty"`
	// If specified, limits the builder to CL owners in this group.
	OwnerWhitelistGroup string `protobuf:"bytes,3,opt,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
}

func (x *Verifiers_Tryjob_EquivalentBuilder) Reset() {
	*x = Verifiers_Tryjob_EquivalentBuilder{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[21]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_Tryjob_EquivalentBuilder) ProtoMessage() {}

func (x *Verifiers_Tryjob_EquivalentBuilder) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[21]
	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 Verifiers_Tryjob_EquivalentBuilder.ProtoReflect.Descriptor instead.
func (*Verifiers_Tryjob_EquivalentBuilder) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{5, 2, 1}
}

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

func (x *Verifiers_Tryjob_EquivalentBuilder) GetPercentage() float32 {
	if x != nil {
		return x.Percentage
	}
	return 0
}

func (x *Verifiers_Tryjob_EquivalentBuilder) GetOwnerWhitelistGroup() string {
	if x != nil {
		return x.OwnerWhitelistGroup
	}
	return ""
}

// Builder which can be included via `CQ-Include-Trybots:` in CL
// description.
type Verifiers_Tryjob_IncludableBuilder struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. Name of this builder.
	// Format is the same in the same format as Builder.name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

func (x *Verifiers_Tryjob_IncludableBuilder) Reset() {
	*x = Verifiers_Tryjob_IncludableBuilder{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[22]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_Tryjob_IncludableBuilder) ProtoMessage() {}

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

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

// Collection of parameters for deciding whether to retry a single build.
// If parameter is not specified, its value defaults to 0 (per proto3).
// Thus, omitting all parameters means no retries of any kind.
//
// CQ's retry logic is as follows:
// All builds triggered during the lifetime of a CQ attempt for a tryjob are
// weighted according to the failure type, as described below. The resulting
// weights are then added together. Call this number W. If W > single_quota,
// then no more builds are scheduled for that tryjob.
//
// W for every tryjob is then summed up. If that result is strictly greater
// than global_quota, then the CQ attempt fails, and no more builds are
// scheduled for the attempt.
type Verifiers_Tryjob_RetryConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Retry quota for a single tryjob.
	SingleQuota int32 `protobuf:"varint,1,opt,name=single_quota,json=singleQuota,proto3" json:"single_quota,omitempty"`
	// Retry quota for all tryjobs in a CL.
	GlobalQuota int32 `protobuf:"varint,2,opt,name=global_quota,json=globalQuota,proto3" json:"global_quota,omitempty"`
	// The weight assigned to each tryjob failure. A failure is as a
	// buildbucket build whose result == 'FAILURE'.
	FailureWeight int32 `protobuf:"varint,3,opt,name=failure_weight,json=failureWeight,proto3" json:"failure_weight,omitempty"`
	// The weight assigned to each transient failure. A transient failure is a
	// buildbucket build which has result == 'FAILURE' and 'failure_reason' in
	// ('BUILDBUCKET_FAILURE', 'INFRA_FAILURE').
	TransientFailureWeight int32 `protobuf:"varint,4,opt,name=transient_failure_weight,json=transientFailureWeight,proto3" json:"transient_failure_weight,omitempty"`
	// The weight assigned to tryjob timeouts. A tryjob timeout is as a
	// buildbucket build with result == 'CANCELED' and cancelation_reason ==
	// 'TIMEOUT'.
	TimeoutWeight int32 `protobuf:"varint,5,opt,name=timeout_weight,json=timeoutWeight,proto3" json:"timeout_weight,omitempty"`
}

func (x *Verifiers_Tryjob_RetryConfig) Reset() {
	*x = Verifiers_Tryjob_RetryConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[23]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_Tryjob_RetryConfig) ProtoMessage() {}

func (x *Verifiers_Tryjob_RetryConfig) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[23]
	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 Verifiers_Tryjob_RetryConfig.ProtoReflect.Descriptor instead.
func (*Verifiers_Tryjob_RetryConfig) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{5, 2, 3}
}

func (x *Verifiers_Tryjob_RetryConfig) GetSingleQuota() int32 {
	if x != nil {
		return x.SingleQuota
	}
	return 0
}

func (x *Verifiers_Tryjob_RetryConfig) GetGlobalQuota() int32 {
	if x != nil {
		return x.GlobalQuota
	}
	return 0
}

func (x *Verifiers_Tryjob_RetryConfig) GetFailureWeight() int32 {
	if x != nil {
		return x.FailureWeight
	}
	return 0
}

func (x *Verifiers_Tryjob_RetryConfig) GetTransientFailureWeight() int32 {
	if x != nil {
		return x.TransientFailureWeight
	}
	return 0
}

func (x *Verifiers_Tryjob_RetryConfig) GetTimeoutWeight() int32 {
	if x != nil {
		return x.TimeoutWeight
	}
	return 0
}

// Optional. Require this builder only if a file in the CL is included
// by location_filters.
//
// location_filters is an ordered list of LocationFilter messages, where
// each message includes regular expressions for the matching Gerrit
// host, Gerrit project and file path, as well as a boolean field to
// specify whether the filter is an exclude filter or not.
//
// Files "in the CL" means all files touched, i.e. added, modified or
// deleted.
//
// The Gerrit host, Gerrit project and file path are matched against the
// respective patterns in the LocationFilter. The last LocationFilter
// that match all patterns (host, project, and path) determines whether
// the file is considered included, i.e. if the last matching
// LocationFilter has exclude set to false, then it's included; else
// included.
//
// If none of the LocationFilters match, then the file is considered
// included if the first rule is an exclude rule; else the file is
// excluded.
//
// If host, project or path are empty, then they will match anything
// (".*") by default. The comparison is a full match; the pattern is
// implicitly anchored with "^" and "$", so there is no need add them.
// The syntax for regular expressions is Google's re2 syntax for regexp,
// documented here: https://github.com/google/re2/wiki/Syntax.
//
// If location_filters is non-empty, and no file in a CL is included by
// location_filters, then this builder will not be triggered. If
// location_filters is empty or not specified, then the builder will be
// triggered by default, subject to other conditions, e.g.
// mode_allowlist.
//
// This option currently can not be combined with the
// `GerritCQAbility.allow_submit_with_open_deps` option.
// If you need to combine, please talk to LUCI CV owners.
// (https://chromium.googlesource.com/infra/luci/luci-go/+/HEAD/cv/OWNERS)
//
// Examples:
//
//	location_filters: {path_regexp: "excluded/.+", exclude: true}
//	location_filters: {path_regexp: "excluded/exception", exclude: false}
//
//	  Result: files outside of the "excluded" directory will be
//	  included, and so will "excluded/exception" will, but other files
//	  in the "excluded" directory will not match.
//
//	location_filters: {path_regexp: ".*", exclude: false} // include all by default
//	location_filters: {host_regexp: "example.com",
//	                   project_regexp: "repo",
//	                   exclude: true}
//	location_filters: {host_regexp: "example.com",
//	                   project_regexp: "repo",
//	                   path_regexp: "all/one.txt",
//	                   exclude: false}
//
//	  Result: files in the specified host and repo will not be included,
//	  except all/one.txt which will be included; files outside of the
//	  given host/repo will be included.
type Verifiers_Tryjob_Builder_LocationFilter struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Pattern to match Gerrit host. Does not include scheme, which is
	// always assumed to be "https://".
	GerritHostRegexp string `protobuf:"bytes,1,opt,name=gerrit_host_regexp,json=gerritHostRegexp,proto3" json:"gerrit_host_regexp,omitempty"`
	// Pattern to match Gerrit project, e.g. "infra/luci/luci-go".
	GerritProjectRegexp string `protobuf:"bytes,2,opt,name=gerrit_project_regexp,json=gerritProjectRegexp,proto3" json:"gerrit_project_regexp,omitempty"`
	// Pattern to match file path. This is a relative path from repo root
	// (no starting slash).
	PathRegexp string `protobuf:"bytes,3,opt,name=path_regexp,json=pathRegexp,proto3" json:"path_regexp,omitempty"`
	// If exclude is true, then if this filter matches a file, the file is
	// considered not included. (If all files are not included, then the
	// builder is not triggered.)
	Exclude bool `protobuf:"varint,4,opt,name=exclude,proto3" json:"exclude,omitempty"`
}

func (x *Verifiers_Tryjob_Builder_LocationFilter) Reset() {
	*x = Verifiers_Tryjob_Builder_LocationFilter{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[24]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Verifiers_Tryjob_Builder_LocationFilter) ProtoMessage() {}

func (x *Verifiers_Tryjob_Builder_LocationFilter) ProtoReflect() protoreflect.Message {
	mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[24]
	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 Verifiers_Tryjob_Builder_LocationFilter.ProtoReflect.Descriptor instead.
func (*Verifiers_Tryjob_Builder_LocationFilter) Descriptor() ([]byte, []int) {
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP(), []int{5, 2, 0, 0}
}

func (x *Verifiers_Tryjob_Builder_LocationFilter) GetGerritHostRegexp() string {
	if x != nil {
		return x.GerritHostRegexp
	}
	return ""
}

func (x *Verifiers_Tryjob_Builder_LocationFilter) GetGerritProjectRegexp() string {
	if x != nil {
		return x.GerritProjectRegexp
	}
	return ""
}

func (x *Verifiers_Tryjob_Builder_LocationFilter) GetPathRegexp() string {
	if x != nil {
		return x.PathRegexp
	}
	return ""
}

func (x *Verifiers_Tryjob_Builder_LocationFilter) GetExclude() bool {
	if x != nil {
		return x.Exclude
	}
	return false
}

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

	// Required. value must be > 0, unless unlimited is set to True.
	//
	// Types that are assignable to Limit:
	//
	//	*UserLimit_Limit_Value
	//	*UserLimit_Limit_Unlimited
	Limit isUserLimit_Limit_Limit `protobuf_oneof:"limit"`
}

func (x *UserLimit_Limit) Reset() {
	*x = UserLimit_Limit{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[25]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*UserLimit_Limit) ProtoMessage() {}

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

func (m *UserLimit_Limit) GetLimit() isUserLimit_Limit_Limit {
	if m != nil {
		return m.Limit
	}
	return nil
}

func (x *UserLimit_Limit) GetValue() int64 {
	if x, ok := x.GetLimit().(*UserLimit_Limit_Value); ok {
		return x.Value
	}
	return 0
}

func (x *UserLimit_Limit) GetUnlimited() bool {
	if x, ok := x.GetLimit().(*UserLimit_Limit_Unlimited); ok {
		return x.Unlimited
	}
	return false
}

type isUserLimit_Limit_Limit interface {
	isUserLimit_Limit_Limit()
}

type UserLimit_Limit_Value struct {
	Value int64 `protobuf:"varint,1,opt,name=value,proto3,oneof"`
}

type UserLimit_Limit_Unlimited struct {
	Unlimited bool `protobuf:"varint,2,opt,name=unlimited,proto3,oneof"`
}

func (*UserLimit_Limit_Value) isUserLimit_Limit_Limit() {}

func (*UserLimit_Limit_Unlimited) isUserLimit_Limit_Limit() {}

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

	// Maximum number of active runs that the user can have at any moment.
	//
	// Required. Active Run is a Run that has started but not ended yet.
	MaxActive *UserLimit_Limit `protobuf:"bytes,1,opt,name=max_active,json=maxActive,proto3" json:"max_active,omitempty"`
}

func (x *UserLimit_Run) Reset() {
	*x = UserLimit_Run{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[26]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*UserLimit_Run) ProtoMessage() {}

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

func (x *UserLimit_Run) GetMaxActive() *UserLimit_Limit {
	if x != nil {
		return x.MaxActive
	}
	return nil
}

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

	// Maximum number of active tryjobs that the user can have at any
	// moment.
	//
	// Active tryjob is a tryjob that CV has successfully launched,
	// and has not ended yet from CV's point of view. Also, optional
	// tryjobs, which are experimental tryjobs that were not explicitly
	// requested via the git footer, are not counted as active tryjobs.
	//
	// Note that counting active tryjobs and launching tryjobs are not
	// atomic operations. So, # of active tryjobs may not match # of
	// the successfully launched tryjobs for a short period, but will
	// match eventually.
	//
	// If not specified, an unlimited number of active Tryjobs are allowed.
	MaxActive *UserLimit_Limit `protobuf:"bytes,1,opt,name=max_active,json=maxActive,proto3" json:"max_active,omitempty"`
}

func (x *UserLimit_Tryjob) Reset() {
	*x = UserLimit_Tryjob{}
	if protoimpl.UnsafeEnabled {
		mi := &file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[27]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*UserLimit_Tryjob) ProtoMessage() {}

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

func (x *UserLimit_Tryjob) GetMaxActive() *UserLimit_Limit {
	if x != nil {
		return x.MaxActive
	}
	return nil
}

var File_go_chromium_org_luci_cv_api_config_v2_config_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDesc = []byte{
	0x0a, 0x32, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x63, 0x76, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x32, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a,
	0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
	0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x63,
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x67, 0x6f, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f,
	0x63, 0x76, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x22, 0xb1, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32,
	0x0a, 0x13, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74,
	0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52,
	0x11, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69,
	0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0e, 0x63, 0x71, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f,
	0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c,
	0x63, 0x71, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0e,
	0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d,
	0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a,
	0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x04,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0c, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x4b, 0x0a, 0x16, 0x70, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63,
	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x63, 0x76, 0x2e,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x42, 0x02, 0x18,
	0x01, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64,
	0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xae, 0x0c, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x67,
	0x65, 0x72, 0x72, 0x69, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x76,
	0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x72,
	0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x52, 0x06, 0x67, 0x65, 0x72, 0x72,
	0x69, 0x74, 0x12, 0x36, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6c,
	0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x43, 0x4c, 0x73, 0x52, 0x0a,
	0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x43, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x09, 0x76, 0x65,
	0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,
	0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69,
	0x65, 0x72, 0x73, 0x52, 0x09, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x2d,
	0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x11, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x6f, 0x67,
	0x67, 0x6c, 0x65, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x3a, 0x0a,
	0x10, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65,
	0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69,
	0x6f, 0x6e, 0x61, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x75, 0x73, 0x65,
	0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14,
	0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c,
	0x69, 0x6d, 0x69, 0x74, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73,
	0x12, 0x42, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64,
	0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63,
	0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x6d,
	0x69, 0x74, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x66,
	0x61, 0x75, 0x6c, 0x74, 0x12, 0x53, 0x0a, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74,
	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x76, 0x2e,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x72, 0x6f,
	0x75, 0x70, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xfa,
	0x42, 0x0a, 0x92, 0x01, 0x07, 0x22, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x70, 0x6f,
	0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x65, 0x0a, 0x12, 0x74, 0x72, 0x79,
	0x6a, 0x6f, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18,
	0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x54, 0x72,
	0x79, 0x6a, 0x6f, 0x62, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0d,
	0xfa, 0x42, 0x0a, 0x92, 0x01, 0x07, 0x22, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x11, 0x74,
	0x72, 0x79, 0x6a, 0x6f, 0x62, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73,
	0x1a, 0xc9, 0x01, 0x0a, 0x06, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75,
	0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x41, 0x0a,
	0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x25, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x2e, 0x50,
	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,
	0x1a, 0x6a, 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,
	0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x02, 0x20,
	0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x2c,
	0x0a, 0x12, 0x72, 0x65, 0x66, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x5f, 0x65, 0x78, 0x63,
	0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x66, 0x52,
	0x65, 0x67, 0x65, 0x78, 0x70, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a, 0xa1, 0x04, 0x0a,
	0x0a, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,
	0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x66, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64,
	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63,
	0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
	0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,
	0x69, 0x6f, 0x6e, 0x42, 0x0f, 0xfa, 0x42, 0x0c, 0x92, 0x01, 0x09, 0x08, 0x01, 0x22, 0x05, 0x8a,
	0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x12, 0x62, 0x0a, 0x12, 0x76, 0x6f, 0x74, 0x65, 0x5f, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x5f,
	0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63,
	0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
	0x56, 0x6f, 0x74, 0x65, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73,
	0x48, 0x00, 0x52, 0x10, 0x76, 0x6f, 0x74, 0x65, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x4c, 0x61,
	0x62, 0x65, 0x6c, 0x73, 0x1a, 0x72, 0x0a, 0x13, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69,
	0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x04, 0x6d,
	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02,
	0x10, 0x01, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74,
	0x75, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x63, 0x76, 0x2e,
	0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0f, 0xfa,
	0x42, 0x0c, 0x92, 0x01, 0x09, 0x08, 0x01, 0x22, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08,
	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x1a, 0xa6, 0x01, 0x0a, 0x10, 0x56, 0x6f, 0x74,
	0x65, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x57, 0x0a,
	0x05, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x63,
	0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
	0x56, 0x6f, 0x74, 0x65, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73,
	0x2e, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52,
	0x05, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x1a, 0x39, 0x0a, 0x04, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x1b,
	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42,
	0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76,
	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x42, 0x0d, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x03, 0xf8, 0x42, 0x01,
	0x1a, 0xcf, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x45, 0x78, 0x70, 0x65, 0x72,
	0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x54, 0x72,
	0x79, 0x6a, 0x6f, 0x62, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43,
	0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
	0x69, 0x6f, 0x6e, 0x1a, 0x4d, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x40, 0x0a, 0x15, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f,
	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42,
	0x0c, 0xfa, 0x42, 0x09, 0x92, 0x01, 0x06, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x13, 0x6f,
	0x77, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69,
	0x73, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x68, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d,
	0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78,
	0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61,
	0x78, 0x42, 0x75, 0x72, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0b, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f,
	0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,
	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x62, 0x75, 0x72, 0x73, 0x74, 0x44, 0x65, 0x6c,
	0x61, 0x79, 0x22, 0x82, 0x02, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x53, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0xfa, 0x42, 0x3c, 0x72, 0x3a,
	0x32, 0x13, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x5d, 0x5b, 0x41, 0x2d, 0x5a, 0x5f, 0x5d, 0x7b, 0x30,
	0x2c, 0x33, 0x39, 0x7d, 0x24, 0x5a, 0x07, 0x44, 0x52, 0x59, 0x5f, 0x52, 0x55, 0x4e, 0x5a, 0x08,
	0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x5a, 0x10, 0x4e, 0x45, 0x57, 0x5f, 0x50, 0x41,
	0x54, 0x43, 0x48, 0x53, 0x45, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
	0x12, 0x2f, 0x0a, 0x0e, 0x63, 0x71, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x76, 0x61, 0x6c,
	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x1a, 0x04, 0x30,
	0x01, 0x30, 0x02, 0x52, 0x0c, 0x63, 0x71, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75,
	0x65, 0x12, 0x40, 0x0a, 0x10, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f,
	0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xfa, 0x42, 0x12,
	0x72, 0x10, 0x10, 0x01, 0x5a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2d, 0x51, 0x75, 0x65,
	0x75, 0x65, 0x52, 0x0f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x61,
	0x62, 0x65, 0x6c, 0x12, 0x32, 0x0a, 0x10, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69, 0x6e,
	0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xfa,
	0x42, 0x04, 0x1a, 0x02, 0x20, 0x00, 0x52, 0x0f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x69,
	0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x58, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x62, 0x69,
	0x6e, 0x65, 0x43, 0x4c, 0x73, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69,
	0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x73,
	0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x61,
	0x79, 0x22, 0x9e, 0x12, 0x0a, 0x09, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12,
	0x50, 0x0a, 0x11, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x5f, 0x63, 0x71, 0x5f, 0x61, 0x62, 0x69,
	0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x76, 0x2e,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73,
	0x2e, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x43, 0x51, 0x41, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
	0x52, 0x0f, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x43, 0x71, 0x41, 0x62, 0x69, 0x6c, 0x69, 0x74,
	0x79, 0x12, 0x40, 0x0a, 0x0b, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x72, 0x65,
	0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x74, 0x72, 0x65, 0x65, 0x53, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62,
	0x52, 0x06, 0x74, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x08, 0x63, 0x71, 0x6c, 0x69,
	0x6e, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x76, 0x2e,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73,
	0x2e, 0x43, 0x51, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x71, 0x6c, 0x69, 0x6e,
	0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x04, 0x66, 0x61, 0x6b, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x19, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x65,
	0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x52, 0x04, 0x66, 0x61,
	0x6b, 0x65, 0x1a, 0xf0, 0x03, 0x0a, 0x0f, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x43, 0x51, 0x41,
	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74,
	0x74, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d,
	0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a,
	0x13, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f,
	0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x64, 0x72, 0x79, 0x52,
	0x75, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c,
	0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x75, 0x6e,
	0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x18, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x63, 0x68, 0x73, 0x65, 0x74, 0x52,
	0x75, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x1b,
	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5f, 0x77, 0x69, 0x74,
	0x68, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x57, 0x69,
	0x74, 0x68, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x73, 0x12, 0x6a, 0x0a, 0x1a, 0x61, 0x6c,
	0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x75, 0x62,
	0x6d, 0x69, 0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d,
	0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66,
	0x69, 0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x72, 0x72, 0x69, 0x74, 0x43, 0x51, 0x41, 0x62, 0x69,
	0x6c, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x51, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x61,
	0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x66, 0x53, 0x75, 0x62, 0x6d, 0x69,
	0x74, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f,
	0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x73, 0x18,
	0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x74, 0x72, 0x75, 0x73, 0x74, 0x44, 0x72, 0x79, 0x52,
	0x75, 0x6e, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x70, 0x73, 0x12, 0x3a, 0x0a, 0x1a, 0x61, 0x6c, 0x6c,
	0x6f, 0x77, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x64, 0x72, 0x79,
	0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x61,
	0x6c, 0x6c, 0x6f, 0x77, 0x4e, 0x6f, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x44, 0x72, 0x79, 0x52,
	0x75, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x2e, 0x0a, 0x08, 0x43, 0x51, 0x41, 0x63, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07,
	0x44, 0x52, 0x59, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d,
	0x4d, 0x49, 0x54, 0x10, 0x02, 0x1a, 0x1e, 0x0a, 0x0a, 0x54, 0x72, 0x65, 0x65, 0x53, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0xe5, 0x0a, 0x0a, 0x06, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62,
	0x12, 0x3f, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56,
	0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x2e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x72,
	0x79, 0x6a, 0x6f, 0x62, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x47, 0x0a,
	0x14, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x5f, 0x74, 0x72,
	0x79, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x63, 0x76,
	0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x42, 0x02,
	0x18, 0x01, 0x52, 0x12, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x54,
	0x72, 0x79, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x80, 0x06, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e,
	0x63, 0x6c, 0x75, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x09, 0x20,
	0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4f,
	0x6e, 0x6c, 0x79, 0x12, 0x44, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x69,
	0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17,
	0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65,
	0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x56,
	0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73,
	0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x0c, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x75, 0x73, 0x65, 0x12, 0x34,
	0x0a, 0x0c, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x0b,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x52, 0x0b, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53,
	0x74, 0x61, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65,
	0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x02, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x50,
	0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x65, 0x71, 0x75,
	0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x2d, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72,
	0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x2e, 0x45, 0x71,
	0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52,
	0x0c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x12, 0x5d, 0x0a,
	0x10, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
	0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x72,
	0x79, 0x6a, 0x6f, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x6f, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x15,
	0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f,
	0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x6f, 0x77, 0x6e,
	0x65, 0x72, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,
	0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69,
	0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x6f, 0x64, 0x65, 0x41, 0x6c,
	0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x1a, 0xad, 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x67, 0x65,
	0x72, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x48, 0x6f,
	0x73, 0x74, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x67, 0x65, 0x72, 0x72,
	0x69, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78,
	0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x50,
	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x1f, 0x0a, 0x0b,
	0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x18, 0x0a,
	0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
	0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08,
	0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x1a, 0x7b, 0x0a, 0x11, 0x45, 0x71, 0x75,
	0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12,
	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61,
	0x67, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74,
	0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x13, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73,
	0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x27, 0x0a, 0x11, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64,
	0x61, 0x62, 0x6c, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a,
	0xdb, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
	0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x51, 0x75, 0x6f,
	0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x6f,
	0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
	0x51, 0x75, 0x6f, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
	0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x66,
	0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x38, 0x0a, 0x18,
	0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72,
	0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16,
	0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
	0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
	0x74, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d,
	0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x1a, 0x0a, 0x0a,
	0x08, 0x43, 0x51, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x1a, 0x57, 0x0a, 0x04, 0x46, 0x61, 0x6b,
	0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61,
	0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65,
	0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05,
	0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x6c,
	0x61, 0x79, 0x22, 0xf1, 0x02, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74,
	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61,
	0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69,
	0x70, 0x61, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x18, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73,
	0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x03, 0x72, 0x75, 0x6e,
	0x12, 0x33, 0x0a, 0x06, 0x74, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x1b, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65,
	0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x52, 0x06, 0x74,
	0x72, 0x79, 0x6a, 0x6f, 0x62, 0x1a, 0x48, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52,
	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x75, 0x6e, 0x6c, 0x69, 0x6d, 0x69,
	0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x6c,
	0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a,
	0x40, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x63,
	0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x76, 0x2e,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74,
	0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x41, 0x63, 0x74, 0x69, 0x76,
	0x65, 0x1a, 0x43, 0x0a, 0x06, 0x54, 0x72, 0x79, 0x6a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6d,
	0x61, 0x78, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1a, 0x2e, 0x63, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72,
	0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x09, 0x6d, 0x61, 0x78,
	0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2a, 0x5d, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,
	0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e,
	0x54, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12,
	0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c,
	0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4f, 0x4d, 0x4d, 0x45,
	0x4e, 0x54, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x52, 0x49, 0x43,
	0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x24, 0x0a, 0x06, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x12,
	0x09, 0x0a, 0x05, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x45,
	0x53, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x4f, 0x10, 0x02, 0x42, 0x6c, 0xa2, 0xfe, 0x23,
	0x3b, 0x0a, 0x39, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d,
	0x61, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x3a, 0x63, 0x6f, 0x6d, 0x6d,
	0x69, 0x74, 0x2d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x2e, 0x63, 0x66, 0x67, 0x5a, 0x2b, 0x67, 0x6f,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75,
	0x63, 0x69, 0x2f, 0x63, 0x76, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2f, 0x76, 0x32, 0x3b, 0x63, 0x66, 0x67, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescData = file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDesc
)

func file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescData)
	})
	return file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDescData
}

var file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes = make([]protoimpl.MessageInfo, 28)
var file_go_chromium_org_luci_cv_api_config_v2_config_proto_goTypes = []interface{}{
	(CommentLevel)(0),                                    // 0: cv.config.CommentLevel
	(Toggle)(0),                                          // 1: cv.config.Toggle
	(Verifiers_GerritCQAbility_CQAction)(0),              // 2: cv.config.Verifiers.GerritCQAbility.CQAction
	(*Config)(nil),                                       // 3: cv.config.Config
	(*ConfigGroup)(nil),                                  // 4: cv.config.ConfigGroup
	(*SubmitOptions)(nil),                                // 5: cv.config.SubmitOptions
	(*Mode)(nil),                                         // 6: cv.config.Mode
	(*CombineCLs)(nil),                                   // 7: cv.config.CombineCLs
	(*Verifiers)(nil),                                    // 8: cv.config.Verifiers
	(*UserLimit)(nil),                                    // 9: cv.config.UserLimit
	(*ConfigGroup_Gerrit)(nil),                           // 10: cv.config.ConfigGroup.Gerrit
	(*ConfigGroup_PostAction)(nil),                       // 11: cv.config.ConfigGroup.PostAction
	(*ConfigGroup_TryjobExperiment)(nil),                 // 12: cv.config.ConfigGroup.TryjobExperiment
	(*ConfigGroup_Gerrit_Project)(nil),                   // 13: cv.config.ConfigGroup.Gerrit.Project
	(*ConfigGroup_PostAction_TriggeringCondition)(nil),   // 14: cv.config.ConfigGroup.PostAction.TriggeringCondition
	(*ConfigGroup_PostAction_VoteGerritLabels)(nil),      // 15: cv.config.ConfigGroup.PostAction.VoteGerritLabels
	(*ConfigGroup_PostAction_VoteGerritLabels_Vote)(nil), // 16: cv.config.ConfigGroup.PostAction.VoteGerritLabels.Vote
	(*ConfigGroup_TryjobExperiment_Condition)(nil),       // 17: cv.config.ConfigGroup.TryjobExperiment.Condition
	(*Verifiers_GerritCQAbility)(nil),                    // 18: cv.config.Verifiers.GerritCQAbility
	(*Verifiers_TreeStatus)(nil),                         // 19: cv.config.Verifiers.TreeStatus
	(*Verifiers_Tryjob)(nil),                             // 20: cv.config.Verifiers.Tryjob
	(*Verifiers_CQLinter)(nil),                           // 21: cv.config.Verifiers.CQLinter
	(*Verifiers_Fake)(nil),                               // 22: cv.config.Verifiers.Fake
	(*Verifiers_Tryjob_Builder)(nil),                     // 23: cv.config.Verifiers.Tryjob.Builder
	(*Verifiers_Tryjob_EquivalentBuilder)(nil),           // 24: cv.config.Verifiers.Tryjob.EquivalentBuilder
	(*Verifiers_Tryjob_IncludableBuilder)(nil),           // 25: cv.config.Verifiers.Tryjob.IncludableBuilder
	(*Verifiers_Tryjob_RetryConfig)(nil),                 // 26: cv.config.Verifiers.Tryjob.RetryConfig
	(*Verifiers_Tryjob_Builder_LocationFilter)(nil),      // 27: cv.config.Verifiers.Tryjob.Builder.LocationFilter
	(*UserLimit_Limit)(nil),                              // 28: cv.config.UserLimit.Limit
	(*UserLimit_Run)(nil),                                // 29: cv.config.UserLimit.Run
	(*UserLimit_Tryjob)(nil),                             // 30: cv.config.UserLimit.Tryjob
	(*durationpb.Duration)(nil),                          // 31: google.protobuf.Duration
	(v1.Run_Status)(0),                                   // 32: cv.v1.Run.Status
}
var file_go_chromium_org_luci_cv_api_config_v2_config_proto_depIdxs = []int32{
	5,  // 0: cv.config.Config.submit_options:type_name -> cv.config.SubmitOptions
	4,  // 1: cv.config.Config.config_groups:type_name -> cv.config.ConfigGroup
	1,  // 2: cv.config.Config.project_scoped_account:type_name -> cv.config.Toggle
	10, // 3: cv.config.ConfigGroup.gerrit:type_name -> cv.config.ConfigGroup.Gerrit
	7,  // 4: cv.config.ConfigGroup.combine_cls:type_name -> cv.config.CombineCLs
	8,  // 5: cv.config.ConfigGroup.verifiers:type_name -> cv.config.Verifiers
	1,  // 6: cv.config.ConfigGroup.fallback:type_name -> cv.config.Toggle
	6,  // 7: cv.config.ConfigGroup.additional_modes:type_name -> cv.config.Mode
	9,  // 8: cv.config.ConfigGroup.user_limits:type_name -> cv.config.UserLimit
	9,  // 9: cv.config.ConfigGroup.user_limit_default:type_name -> cv.config.UserLimit
	11, // 10: cv.config.ConfigGroup.post_actions:type_name -> cv.config.ConfigGroup.PostAction
	12, // 11: cv.config.ConfigGroup.tryjob_experiments:type_name -> cv.config.ConfigGroup.TryjobExperiment
	31, // 12: cv.config.SubmitOptions.burst_delay:type_name -> google.protobuf.Duration
	31, // 13: cv.config.CombineCLs.stabilization_delay:type_name -> google.protobuf.Duration
	18, // 14: cv.config.Verifiers.gerrit_cq_ability:type_name -> cv.config.Verifiers.GerritCQAbility
	19, // 15: cv.config.Verifiers.tree_status:type_name -> cv.config.Verifiers.TreeStatus
	20, // 16: cv.config.Verifiers.tryjob:type_name -> cv.config.Verifiers.Tryjob
	21, // 17: cv.config.Verifiers.cqlinter:type_name -> cv.config.Verifiers.CQLinter
	22, // 18: cv.config.Verifiers.fake:type_name -> cv.config.Verifiers.Fake
	29, // 19: cv.config.UserLimit.run:type_name -> cv.config.UserLimit.Run
	30, // 20: cv.config.UserLimit.tryjob:type_name -> cv.config.UserLimit.Tryjob
	13, // 21: cv.config.ConfigGroup.Gerrit.projects:type_name -> cv.config.ConfigGroup.Gerrit.Project
	14, // 22: cv.config.ConfigGroup.PostAction.conditions:type_name -> cv.config.ConfigGroup.PostAction.TriggeringCondition
	15, // 23: cv.config.ConfigGroup.PostAction.vote_gerrit_labels:type_name -> cv.config.ConfigGroup.PostAction.VoteGerritLabels
	17, // 24: cv.config.ConfigGroup.TryjobExperiment.condition:type_name -> cv.config.ConfigGroup.TryjobExperiment.Condition
	32, // 25: cv.config.ConfigGroup.PostAction.TriggeringCondition.statuses:type_name -> cv.v1.Run.Status
	16, // 26: cv.config.ConfigGroup.PostAction.VoteGerritLabels.votes:type_name -> cv.config.ConfigGroup.PostAction.VoteGerritLabels.Vote
	2,  // 27: cv.config.Verifiers.GerritCQAbility.allow_owner_if_submittable:type_name -> cv.config.Verifiers.GerritCQAbility.CQAction
	23, // 28: cv.config.Verifiers.Tryjob.builders:type_name -> cv.config.Verifiers.Tryjob.Builder
	26, // 29: cv.config.Verifiers.Tryjob.retry_config:type_name -> cv.config.Verifiers.Tryjob.RetryConfig
	1,  // 30: cv.config.Verifiers.Tryjob.cancel_stale_tryjobs:type_name -> cv.config.Toggle
	0,  // 31: cv.config.Verifiers.Tryjob.Builder.result_visibility:type_name -> cv.config.CommentLevel
	1,  // 32: cv.config.Verifiers.Tryjob.Builder.cancel_stale:type_name -> cv.config.Toggle
	24, // 33: cv.config.Verifiers.Tryjob.Builder.equivalent_to:type_name -> cv.config.Verifiers.Tryjob.EquivalentBuilder
	27, // 34: cv.config.Verifiers.Tryjob.Builder.location_filters:type_name -> cv.config.Verifiers.Tryjob.Builder.LocationFilter
	28, // 35: cv.config.UserLimit.Run.max_active:type_name -> cv.config.UserLimit.Limit
	28, // 36: cv.config.UserLimit.Tryjob.max_active:type_name -> cv.config.UserLimit.Limit
	37, // [37:37] is the sub-list for method output_type
	37, // [37:37] is the sub-list for method input_type
	37, // [37:37] is the sub-list for extension type_name
	37, // [37:37] is the sub-list for extension extendee
	0,  // [0:37] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_cv_api_config_v2_config_proto_init() }
func file_go_chromium_org_luci_cv_api_config_v2_config_proto_init() {
	if File_go_chromium_org_luci_cv_api_config_v2_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SubmitOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Mode); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CombineCLs); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserLimit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_Gerrit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_PostAction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_TryjobExperiment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_Gerrit_Project); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_PostAction_TriggeringCondition); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_PostAction_VoteGerritLabels); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_PostAction_VoteGerritLabels_Vote); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConfigGroup_TryjobExperiment_Condition); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_GerritCQAbility); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_TreeStatus); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Tryjob); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_CQLinter); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Fake); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Tryjob_Builder); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Tryjob_EquivalentBuilder); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Tryjob_IncludableBuilder); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Tryjob_RetryConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Verifiers_Tryjob_Builder_LocationFilter); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserLimit_Limit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserLimit_Run); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserLimit_Tryjob); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[8].OneofWrappers = []interface{}{
		(*ConfigGroup_PostAction_VoteGerritLabels_)(nil),
	}
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes[25].OneofWrappers = []interface{}{
		(*UserLimit_Limit_Value)(nil),
		(*UserLimit_Limit_Unlimited)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   28,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_cv_api_config_v2_config_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_cv_api_config_v2_config_proto_depIdxs,
		EnumInfos:         file_go_chromium_org_luci_cv_api_config_v2_config_proto_enumTypes,
		MessageInfos:      file_go_chromium_org_luci_cv_api_config_v2_config_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_cv_api_config_v2_config_proto = out.File
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_rawDesc = nil
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_goTypes = nil
	file_go_chromium_org_luci_cv_api_config_v2_config_proto_depIdxs = nil
}
