// Copyright 2016 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.12.1
// source: go.chromium.org/luci/dm/api/service/v1/ensure_graph_data.proto

package dm

import (
	templateproto "go.chromium.org/luci/common/data/text/templateproto"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

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

	// project is the luci-config project which defines the template.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// ref is the git ref of the project that defined this template. If omitted,
	// this will use the template definition from the project-wide configuration
	// and not the configuration located on a particular ref (like
	// 'refs/heads/master').
	Ref string `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	// specifier specifies the actual template name, as well as any substitution
	// parameters which that template might require.
	Specifier *templateproto.Specifier `protobuf:"bytes,4,opt,name=specifier,proto3" json:"specifier,omitempty"`
}

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

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

func (*TemplateInstantiation) ProtoMessage() {}

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

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

func (x *TemplateInstantiation) GetRef() string {
	if x != nil {
		return x.Ref
	}
	return ""
}

func (x *TemplateInstantiation) GetSpecifier() *templateproto.Specifier {
	if x != nil {
		return x.Specifier
	}
	return nil
}

// EnsureGraphDataReq allows you to assert the existence of Attempts in DM's
// graph, and allows you to declare dependencies from one Attempt to another.
//
// You can declare Attempts by any combination of:
//   * Providing a quest description plus a list of Attempt numbers for that
//     quest.
//   * Providing a template instantiation (for a project-declared quest
//     template) plus a list of Attempt numbers for that quest.
//   * Providing a raw set of quest_id -> attempt numbers for quests that you
//     already know that DM has a definition for.
//
// In response, DM will tell you what the IDs of all supplied Quests/Attempts
// are.
//
// To create a dependencies, call this method while running as part of an
// execution by filling the for_execution field. All attempts named as described
// above will become dependencies for the indicated execution. It is only
// possible for a currently-running execution to create dependencies for its own
// Attempt. In particular, it is not possible to create dependencies as
// a non-execution user (e.g. a human), nor is it possible for an execution to
// create attempts on behalf of some other execution.
//
// If the attempts were being created as dependencies, and were already in the
// Finished state, this request can also opt to include the AttemptResults
// directly.
type EnsureGraphDataReq struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Quest is a list of quest descriptors. DM will ensure that the
	// corresponding Quests exist. If they don't, they'll be created.
	Quest []*Quest_Desc `protobuf:"bytes,1,rep,name=quest,proto3" json:"quest,omitempty"`
	// QuestAttempt allows the addition of attempts which are derived from
	// the quest bodies provided above.
	// Each entry here maps 1:1 with the equivalent quest.
	QuestAttempt []*AttemptList_Nums `protobuf:"bytes,2,rep,name=quest_attempt,json=questAttempt,proto3" json:"quest_attempt,omitempty"`
	// TemplateQuest allows the addition of quests which are derived from
	// Templates, as defined on a per-project basis.
	TemplateQuest []*TemplateInstantiation `protobuf:"bytes,3,rep,name=template_quest,json=templateQuest,proto3" json:"template_quest,omitempty"`
	// TemplateAttempt allows the addition of attempts which are derived from
	// Templates. This must be equal in length to template_quest.
	// Each entry here maps 1:1 with the equivalent quest in template_quest.
	TemplateAttempt []*AttemptList_Nums `protobuf:"bytes,4,rep,name=template_attempt,json=templateAttempt,proto3" json:"template_attempt,omitempty"`
	// RawAttempts is a list that asserts that the following attempts should
	// exist. The quest ids in this list must be already-known to DM, NOT
	// included in the quest field above. This is useful when you know the ID of
	// the Quest, but not the actual definition of the quest.
	RawAttempts *AttemptList `protobuf:"bytes,5,opt,name=raw_attempts,json=rawAttempts,proto3" json:"raw_attempts,omitempty"`
	// ForExecution is an authentication pair (Execution_ID, Token).
	//
	// If this is provided then it will serve as authorization for the creation of
	// any `quests` included, and any `attempts` indicated will be set as
	// dependencies for the execution.
	//
	// If this omitted, then the request requires some user/bot authentication,
	// and any quests/attempts provided will be made standalone (e.g. nothing will
	// depend on them).
	ForExecution *Execution_Auth             `protobuf:"bytes,6,opt,name=for_execution,json=forExecution,proto3" json:"for_execution,omitempty"`
	Limit        *EnsureGraphDataReq_Limit   `protobuf:"bytes,7,opt,name=limit,proto3" json:"limit,omitempty"`
	Include      *EnsureGraphDataReq_Include `protobuf:"bytes,8,opt,name=include,proto3" json:"include,omitempty"`
}

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

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

func (*EnsureGraphDataReq) ProtoMessage() {}

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

func (x *EnsureGraphDataReq) GetQuest() []*Quest_Desc {
	if x != nil {
		return x.Quest
	}
	return nil
}

func (x *EnsureGraphDataReq) GetQuestAttempt() []*AttemptList_Nums {
	if x != nil {
		return x.QuestAttempt
	}
	return nil
}

func (x *EnsureGraphDataReq) GetTemplateQuest() []*TemplateInstantiation {
	if x != nil {
		return x.TemplateQuest
	}
	return nil
}

func (x *EnsureGraphDataReq) GetTemplateAttempt() []*AttemptList_Nums {
	if x != nil {
		return x.TemplateAttempt
	}
	return nil
}

func (x *EnsureGraphDataReq) GetRawAttempts() *AttemptList {
	if x != nil {
		return x.RawAttempts
	}
	return nil
}

func (x *EnsureGraphDataReq) GetForExecution() *Execution_Auth {
	if x != nil {
		return x.ForExecution
	}
	return nil
}

func (x *EnsureGraphDataReq) GetLimit() *EnsureGraphDataReq_Limit {
	if x != nil {
		return x.Limit
	}
	return nil
}

func (x *EnsureGraphDataReq) GetInclude() *EnsureGraphDataReq_Include {
	if x != nil {
		return x.Include
	}
	return nil
}

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

	// accepted is true when all new graph data was journaled successfully. This
	// means that `quests`, `attempts`, `template_quest`, `template_attempt` were
	// all well-formed and are scheduled to be added. They will 'eventually' be
	// readable via other APIs (like WalkGraph), but when they are, they'll have
	// the IDs reflected in this response.
	//
	// If `attempts` referrs to quests that don't exist and weren't provided in
	// `quests`, those quests will be listed in `result` with the DNE flag set.
	//
	// If `template_quest` had errors (missing template, bad params, etc.), the
	// errors will be located in `template_error`. If all of the templates parsed
	// successfully, the quest ids for those rendered `template_quest` will be in
	// `template_ids`.
	Accepted bool `protobuf:"varint,1,opt,name=accepted,proto3" json:"accepted,omitempty"`
	// quest_ids will be populated with the Quest.IDs of any quests defined
	// by quest in the initial request. Its length is guaranteed to match
	// the length of quest, if there were no errors.
	QuestIds []*Quest_ID `protobuf:"bytes,2,rep,name=quest_ids,json=questIds,proto3" json:"quest_ids,omitempty"`
	// template_ids will be populated with the Quest.IDs of any templates defined
	// by template_quest in the initial request. Its length is guaranteed to match
	// the length of template_quest, if there were no errors.
	TemplateIds []*Quest_ID `protobuf:"bytes,3,rep,name=template_ids,json=templateIds,proto3" json:"template_ids,omitempty"`
	// template_error is either empty if there were no template errors, or the
	// length of template_quest. Non-empty strings are errors.
	TemplateError []string `protobuf:"bytes,4,rep,name=template_error,json=templateError,proto3" json:"template_error,omitempty"`
	// result holds the graph data pertaining to the request, containing any
	// graph state that already existed at the time of the call. Any new data
	// that was added to the graph state (accepted==true) will appear with
	// `DNE==true`.
	//
	// Quest data will always be returned for any Quests which exist.
	//
	// If accepted==false, you can inspect this to determine why:
	//   * Quests (without data) mentioned by the `attempts` field that do not
	//     exist will have `DNE==true`.
	//
	// This also can be used to make adding dependencies a stateless
	// single-request action:
	//   * Attempts requested (assuming the corresponding Quest exists) will
	//     contain their current state. If Include.AttemptResult was true, the
	//     results will be populated (with the size limit mentioned in the request
	//     documentation).
	Result *GraphData `protobuf:"bytes,5,opt,name=result,proto3" json:"result,omitempty"`
	// (if `for_execution` was specified) ShouldHalt indicates that the request
	// was accepted by DM, and the execution should halt (DM will re-execute the
	// Attempt when it becomes unblocked). If this is true, then the execution's
	// auth Token is also revoked and will no longer work for futher API calls.
	//
	// If `for_execution` was provided in the request and this is false, it means
	// that the execution may continue executing.
	ShouldHalt bool `protobuf:"varint,6,opt,name=should_halt,json=shouldHalt,proto3" json:"should_halt,omitempty"`
}

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

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

func (*EnsureGraphDataRsp) ProtoMessage() {}

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

func (x *EnsureGraphDataRsp) GetAccepted() bool {
	if x != nil {
		return x.Accepted
	}
	return false
}

func (x *EnsureGraphDataRsp) GetQuestIds() []*Quest_ID {
	if x != nil {
		return x.QuestIds
	}
	return nil
}

func (x *EnsureGraphDataRsp) GetTemplateIds() []*Quest_ID {
	if x != nil {
		return x.TemplateIds
	}
	return nil
}

func (x *EnsureGraphDataRsp) GetTemplateError() []string {
	if x != nil {
		return x.TemplateError
	}
	return nil
}

func (x *EnsureGraphDataRsp) GetResult() *GraphData {
	if x != nil {
		return x.Result
	}
	return nil
}

func (x *EnsureGraphDataRsp) GetShouldHalt() bool {
	if x != nil {
		return x.ShouldHalt
	}
	return false
}

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

	// MaxDataSize sets the maximum amount of 'Data' (in bytes) that can be
	// returned, if include.attempt_result is set. If this limit is hit, then
	// the appropriate 'partial' value will be set for that object, but the base
	// object would still be included in the result.
	//
	// If this limit is 0, a default limit of 16MB will be used. If this limit
	// exceeds 30MB, it will be reduced to 30MB.
	MaxDataSize uint32 `protobuf:"varint,3,opt,name=max_data_size,json=maxDataSize,proto3" json:"max_data_size,omitempty"`
}

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

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

func (*EnsureGraphDataReq_Limit) ProtoMessage() {}

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

func (x *EnsureGraphDataReq_Limit) GetMaxDataSize() uint32 {
	if x != nil {
		return x.MaxDataSize
	}
	return 0
}

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

	Attempt *EnsureGraphDataReq_Include_Options `protobuf:"bytes,4,opt,name=attempt,proto3" json:"attempt,omitempty"`
}

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

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

func (*EnsureGraphDataReq_Include) ProtoMessage() {}

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

func (x *EnsureGraphDataReq_Include) GetAttempt() *EnsureGraphDataReq_Include_Options {
	if x != nil {
		return x.Attempt
	}
	return nil
}

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

	// Instructs finished objects to include the Result field.
	Result bool `protobuf:"varint,3,opt,name=result,proto3" json:"result,omitempty"`
}

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

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

func (*EnsureGraphDataReq_Include_Options) ProtoMessage() {}

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

func (x *EnsureGraphDataReq_Include_Options) GetResult() bool {
	if x != nil {
		return x.Result
	}
	return false
}

var File_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDesc = []byte{
	0x0a, 0x3e, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x64, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65,
	0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x5f,
	0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x02, 0x64, 0x6d, 0x1a, 0x42, 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, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x6d, 0x70,
	0x6c, 0x61, 0x74, 0x65, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
	0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x37, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x64,
	0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x76, 0x31,
	0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x1a, 0x32, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x64, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73,
	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x81, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
	0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
	0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x36, 0x0a, 0x09, 0x73,
	0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18,
	0x2e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53,
	0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
	0x69, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xad, 0x05, 0x0a, 0x12, 0x45, 0x6e,
	0x73, 0x75, 0x72, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71,
	0x12, 0x24, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x0e, 0x2e, 0x64, 0x6d, 0x2e, 0x51, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x52,
	0x05, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,
	0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
	0x64, 0x6d, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x4e,
	0x75, 0x6d, 0x73, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70,
	0x74, 0x12, 0x40, 0x0a, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x6d, 0x2e, 0x54,
	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x51, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f,
	0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
	0x64, 0x6d, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x2e, 0x4e,
	0x75, 0x6d, 0x73, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74,
	0x65, 0x6d, 0x70, 0x74, 0x12, 0x32, 0x0a, 0x0c, 0x72, 0x61, 0x77, 0x5f, 0x61, 0x74, 0x74, 0x65,
	0x6d, 0x70, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x64, 0x6d, 0x2e,
	0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0b, 0x72, 0x61, 0x77,
	0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x5f,
	0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x12, 0x2e, 0x64, 0x6d, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41,
	0x75, 0x74, 0x68, 0x52, 0x0c, 0x66, 0x6f, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x32, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x1c, 0x2e, 0x64, 0x6d, 0x2e, 0x45, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x47, 0x72, 0x61, 0x70,
	0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x05,
	0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
	0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x6d, 0x2e, 0x45, 0x6e, 0x73, 0x75,
	0x72, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x2e, 0x49,
	0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x1a,
	0x37, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f,
	0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x0b, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x4a, 0x04, 0x08, 0x01,
	0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0x9e, 0x01, 0x0a, 0x07, 0x49, 0x6e, 0x63,
	0x6c, 0x75, 0x64, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x6d, 0x2e, 0x45, 0x6e, 0x73, 0x75, 0x72,
	0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x2e, 0x49, 0x6e,
	0x63, 0x6c, 0x75, 0x64, 0x65, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x61,
	0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x1a, 0x39, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a,
	0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10,
	0x06, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08,
	0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xfb, 0x01, 0x0a, 0x12, 0x45, 0x6e,
	0x73, 0x75, 0x72, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x73, 0x70,
	0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x09,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x0c, 0x2e, 0x64, 0x6d, 0x2e, 0x51, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x44, 0x52, 0x08, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c,
	0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e,
	0x64, 0x6d, 0x2e, 0x51, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x44, 0x52, 0x0b, 0x74, 0x65, 0x6d,
	0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x65, 0x6d, 0x70,
	0x6c, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12,
	0x25, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x0d, 0x2e, 0x64, 0x6d, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
	0x5f, 0x68, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x68, 0x6f,
	0x75, 0x6c, 0x64, 0x48, 0x61, 0x6c, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescData = file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDesc
)

func file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescData)
	})
	return file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDescData
}

var file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_goTypes = []interface{}{
	(*TemplateInstantiation)(nil),              // 0: dm.TemplateInstantiation
	(*EnsureGraphDataReq)(nil),                 // 1: dm.EnsureGraphDataReq
	(*EnsureGraphDataRsp)(nil),                 // 2: dm.EnsureGraphDataRsp
	(*EnsureGraphDataReq_Limit)(nil),           // 3: dm.EnsureGraphDataReq.Limit
	(*EnsureGraphDataReq_Include)(nil),         // 4: dm.EnsureGraphDataReq.Include
	(*EnsureGraphDataReq_Include_Options)(nil), // 5: dm.EnsureGraphDataReq.Include.Options
	(*templateproto.Specifier)(nil),            // 6: templateproto.Specifier
	(*Quest_Desc)(nil),                         // 7: dm.Quest.Desc
	(*AttemptList_Nums)(nil),                   // 8: dm.AttemptList.Nums
	(*AttemptList)(nil),                        // 9: dm.AttemptList
	(*Execution_Auth)(nil),                     // 10: dm.Execution.Auth
	(*Quest_ID)(nil),                           // 11: dm.Quest.ID
	(*GraphData)(nil),                          // 12: dm.GraphData
}
var file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_depIdxs = []int32{
	6,  // 0: dm.TemplateInstantiation.specifier:type_name -> templateproto.Specifier
	7,  // 1: dm.EnsureGraphDataReq.quest:type_name -> dm.Quest.Desc
	8,  // 2: dm.EnsureGraphDataReq.quest_attempt:type_name -> dm.AttemptList.Nums
	0,  // 3: dm.EnsureGraphDataReq.template_quest:type_name -> dm.TemplateInstantiation
	8,  // 4: dm.EnsureGraphDataReq.template_attempt:type_name -> dm.AttemptList.Nums
	9,  // 5: dm.EnsureGraphDataReq.raw_attempts:type_name -> dm.AttemptList
	10, // 6: dm.EnsureGraphDataReq.for_execution:type_name -> dm.Execution.Auth
	3,  // 7: dm.EnsureGraphDataReq.limit:type_name -> dm.EnsureGraphDataReq.Limit
	4,  // 8: dm.EnsureGraphDataReq.include:type_name -> dm.EnsureGraphDataReq.Include
	11, // 9: dm.EnsureGraphDataRsp.quest_ids:type_name -> dm.Quest.ID
	11, // 10: dm.EnsureGraphDataRsp.template_ids:type_name -> dm.Quest.ID
	12, // 11: dm.EnsureGraphDataRsp.result:type_name -> dm.GraphData
	5,  // 12: dm.EnsureGraphDataReq.Include.attempt:type_name -> dm.EnsureGraphDataReq.Include.Options
	13, // [13:13] is the sub-list for method output_type
	13, // [13:13] is the sub-list for method input_type
	13, // [13:13] is the sub-list for extension type_name
	13, // [13:13] is the sub-list for extension extendee
	0,  // [0:13] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_init() }
func file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_init() {
	if File_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto != nil {
		return
	}
	file_go_chromium_org_luci_dm_api_service_v1_graph_data_proto_init()
	file_go_chromium_org_luci_dm_api_service_v1_types_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TemplateInstantiation); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnsureGraphDataReq); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnsureGraphDataRsp); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnsureGraphDataReq_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_dm_api_service_v1_ensure_graph_data_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnsureGraphDataReq_Include); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnsureGraphDataReq_Include_Options); 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_dm_api_service_v1_ensure_graph_data_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   6,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto = out.File
	file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_rawDesc = nil
	file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_goTypes = nil
	file_go_chromium_org_luci_dm_api_service_v1_ensure_graph_data_proto_depIdxs = nil
}
