// Copyright 2023 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.33.0
// 	protoc        v3.21.7
// source: go.chromium.org/luci/bisection/proto/v1/heuristic.proto

package bisectionpb

import (
	proto "go.chromium.org/luci/buildbucket/proto"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	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)
)

type SuspectConfidenceLevel int32

const (
	SuspectConfidenceLevel_SUSPECT_CONFIDENCE_LEVEL_UNSPECIFIED SuspectConfidenceLevel = 0
	SuspectConfidenceLevel_LOW                                  SuspectConfidenceLevel = 1
	SuspectConfidenceLevel_MEDIUM                               SuspectConfidenceLevel = 2
	SuspectConfidenceLevel_HIGH                                 SuspectConfidenceLevel = 3
)

// Enum value maps for SuspectConfidenceLevel.
var (
	SuspectConfidenceLevel_name = map[int32]string{
		0: "SUSPECT_CONFIDENCE_LEVEL_UNSPECIFIED",
		1: "LOW",
		2: "MEDIUM",
		3: "HIGH",
	}
	SuspectConfidenceLevel_value = map[string]int32{
		"SUSPECT_CONFIDENCE_LEVEL_UNSPECIFIED": 0,
		"LOW":                                  1,
		"MEDIUM":                               2,
		"HIGH":                                 3,
	}
)

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

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

func (SuspectConfidenceLevel) Descriptor() protoreflect.EnumDescriptor {
	return file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_enumTypes[0].Descriptor()
}

func (SuspectConfidenceLevel) Type() protoreflect.EnumType {
	return &file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_enumTypes[0]
}

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

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

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

	// The status of the heuristic analysis.
	Status AnalysisStatus `protobuf:"varint,1,opt,name=status,proto3,enum=luci.bisection.v1.AnalysisStatus" json:"status,omitempty"`
	// One or more suspects of the heuristic analysis.
	// This field exists only when status = FINISHED.
	Suspects []*HeuristicSuspect `protobuf:"bytes,2,rep,name=suspects,proto3" json:"suspects,omitempty"`
	// Start time of heuristic analysis.
	StartTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// End time of heuristic analysis.
	EndTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
}

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

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

func (*HeuristicAnalysisResult) ProtoMessage() {}

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

func (x *HeuristicAnalysisResult) GetStatus() AnalysisStatus {
	if x != nil {
		return x.Status
	}
	return AnalysisStatus_ANALYSIS_STATUS_UNSPECIFIED
}

func (x *HeuristicAnalysisResult) GetSuspects() []*HeuristicSuspect {
	if x != nil {
		return x.Suspects
	}
	return nil
}

func (x *HeuristicAnalysisResult) GetStartTime() *timestamppb.Timestamp {
	if x != nil {
		return x.StartTime
	}
	return nil
}

func (x *HeuristicAnalysisResult) GetEndTime() *timestamppb.Timestamp {
	if x != nil {
		return x.EndTime
	}
	return nil
}

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

	// A suspect revision of heuristic analysis.
	GitilesCommit *proto.GitilesCommit `protobuf:"bytes,1,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// Review URL for the suspect commit.
	ReviewUrl string `protobuf:"bytes,2,opt,name=reviewUrl,proto3" json:"reviewUrl,omitempty"`
	// Score is an integer representing the how confident we believe the suspect
	// is indeed the culprit.
	// A higher score means a stronger signal that the suspect is responsible for
	// a failure.
	Score int32 `protobuf:"varint,3,opt,name=score,proto3" json:"score,omitempty"`
	// The reason why heuristic analysis thinks the suspect caused a build
	// failure.
	Justification string `protobuf:"bytes,4,opt,name=justification,proto3" json:"justification,omitempty"`
	// Whether the suspect has been verified by the culprit verification
	// component.
	Verified bool `protobuf:"varint,5,opt,name=verified,proto3" json:"verified,omitempty"`
	// The level of confidence we have for the suspect.
	ConfidenceLevel SuspectConfidenceLevel `protobuf:"varint,6,opt,name=confidence_level,json=confidenceLevel,proto3,enum=luci.bisection.v1.SuspectConfidenceLevel" json:"confidence_level,omitempty"`
	// Title of the review for the suspect commit.
	ReviewTitle string `protobuf:"bytes,7,opt,name=reviewTitle,proto3" json:"reviewTitle,omitempty"`
	// The details of suspect verification for the suspect.
	VerificationDetails *SuspectVerificationDetails `protobuf:"bytes,8,opt,name=verification_details,json=verificationDetails,proto3" json:"verification_details,omitempty"`
}

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

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

func (*HeuristicSuspect) ProtoMessage() {}

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

func (x *HeuristicSuspect) GetGitilesCommit() *proto.GitilesCommit {
	if x != nil {
		return x.GitilesCommit
	}
	return nil
}

func (x *HeuristicSuspect) GetReviewUrl() string {
	if x != nil {
		return x.ReviewUrl
	}
	return ""
}

func (x *HeuristicSuspect) GetScore() int32 {
	if x != nil {
		return x.Score
	}
	return 0
}

func (x *HeuristicSuspect) GetJustification() string {
	if x != nil {
		return x.Justification
	}
	return ""
}

func (x *HeuristicSuspect) GetVerified() bool {
	if x != nil {
		return x.Verified
	}
	return false
}

func (x *HeuristicSuspect) GetConfidenceLevel() SuspectConfidenceLevel {
	if x != nil {
		return x.ConfidenceLevel
	}
	return SuspectConfidenceLevel_SUSPECT_CONFIDENCE_LEVEL_UNSPECIFIED
}

func (x *HeuristicSuspect) GetReviewTitle() string {
	if x != nil {
		return x.ReviewTitle
	}
	return ""
}

func (x *HeuristicSuspect) GetVerificationDetails() *SuspectVerificationDetails {
	if x != nil {
		return x.VerificationDetails
	}
	return nil
}

var File_go_chromium_org_luci_bisection_proto_v1_heuristic_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDesc = []byte{
	0x0a, 0x37, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x65, 0x75, 0x72, 0x69, 0x73,
	0x74, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x6c, 0x75, 0x63, 0x69, 0x2e,
	0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69,
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x34, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c,
	0x75, 0x63, 0x69, 0x2f, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x1a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62,
	0x75, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x87, 0x02, 0x0a, 0x17, 0x48, 0x65, 0x75,
	0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x62, 0x69, 0x73, 0x65,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
	0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
	0x3f, 0x0a, 0x08, 0x73, 0x75, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x75, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x53,
	0x75, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x08, 0x73, 0x75, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73,
	0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
	0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65,
	0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69,
	0x6d, 0x65, 0x22, 0xa8, 0x03, 0x0a, 0x10, 0x48, 0x65, 0x75, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63,
	0x53, 0x75, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x44, 0x0a, 0x0e, 0x67, 0x69, 0x74, 0x69, 0x6c,
	0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x32,
	0x2e, 0x47, 0x69, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x0d,
	0x67, 0x69, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1c, 0x0a,
	0x09, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x55, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73,
	0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72,
	0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66,
	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66,
	0x69, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66,
	0x69, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63,
	0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e,
	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
	0x31, 0x2e, 0x53, 0x75, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65,
	0x6e, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64,
	0x65, 0x6e, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x76,
	0x69, 0x65, 0x77, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
	0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x60, 0x0a, 0x14, 0x76,
	0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61,
	0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x69,
	0x2e, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75,
	0x73, 0x70, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x13, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2a, 0x61, 0x0a,
	0x16, 0x53, 0x75, 0x73, 0x70, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e,
	0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x55, 0x53, 0x50, 0x45,
	0x43, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x44, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x4c, 0x45,
	0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45,
	0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03,
	0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e,
	0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x62, 0x69, 0x73, 0x65, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x62, 0x69, 0x73, 0x65,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescData = file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDesc
)

func file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescData)
	})
	return file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDescData
}

var file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_goTypes = []interface{}{
	(SuspectConfidenceLevel)(0),        // 0: luci.bisection.v1.SuspectConfidenceLevel
	(*HeuristicAnalysisResult)(nil),    // 1: luci.bisection.v1.HeuristicAnalysisResult
	(*HeuristicSuspect)(nil),           // 2: luci.bisection.v1.HeuristicSuspect
	(AnalysisStatus)(0),                // 3: luci.bisection.v1.AnalysisStatus
	(*timestamppb.Timestamp)(nil),      // 4: google.protobuf.Timestamp
	(*proto.GitilesCommit)(nil),        // 5: buildbucket.v2.GitilesCommit
	(*SuspectVerificationDetails)(nil), // 6: luci.bisection.v1.SuspectVerificationDetails
}
var file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_depIdxs = []int32{
	3, // 0: luci.bisection.v1.HeuristicAnalysisResult.status:type_name -> luci.bisection.v1.AnalysisStatus
	2, // 1: luci.bisection.v1.HeuristicAnalysisResult.suspects:type_name -> luci.bisection.v1.HeuristicSuspect
	4, // 2: luci.bisection.v1.HeuristicAnalysisResult.start_time:type_name -> google.protobuf.Timestamp
	4, // 3: luci.bisection.v1.HeuristicAnalysisResult.end_time:type_name -> google.protobuf.Timestamp
	5, // 4: luci.bisection.v1.HeuristicSuspect.gitiles_commit:type_name -> buildbucket.v2.GitilesCommit
	0, // 5: luci.bisection.v1.HeuristicSuspect.confidence_level:type_name -> luci.bisection.v1.SuspectConfidenceLevel
	6, // 6: luci.bisection.v1.HeuristicSuspect.verification_details:type_name -> luci.bisection.v1.SuspectVerificationDetails
	7, // [7:7] is the sub-list for method output_type
	7, // [7:7] is the sub-list for method input_type
	7, // [7:7] is the sub-list for extension type_name
	7, // [7:7] is the sub-list for extension extendee
	0, // [0:7] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_init() }
func file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_init() {
	if File_go_chromium_org_luci_bisection_proto_v1_heuristic_proto != nil {
		return
	}
	file_go_chromium_org_luci_bisection_proto_v1_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HeuristicAnalysisResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HeuristicSuspect); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_depIdxs,
		EnumInfos:         file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_enumTypes,
		MessageInfos:      file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_bisection_proto_v1_heuristic_proto = out.File
	file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_rawDesc = nil
	file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_goTypes = nil
	file_go_chromium_org_luci_bisection_proto_v1_heuristic_proto_depIdxs = nil
}
