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

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.21.5
// source: relui.proto

package protos

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

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

// The type of artifact signing request.
type SignArtifactRequest_BuildType int32

const (
	SignArtifactRequest_BUILD_TYPE_UNSPECIFIED SignArtifactRequest_BuildType = 0
	SignArtifactRequest_BUILD_TYPE_MACOS       SignArtifactRequest_BuildType = 1
	SignArtifactRequest_BUILD_TYPE_WINDOWS     SignArtifactRequest_BuildType = 2
	SignArtifactRequest_BUILD_TYPE_GPG         SignArtifactRequest_BuildType = 3
)

// Enum value maps for SignArtifactRequest_BuildType.
var (
	SignArtifactRequest_BuildType_name = map[int32]string{
		0: "BUILD_TYPE_UNSPECIFIED",
		1: "BUILD_TYPE_MACOS",
		2: "BUILD_TYPE_WINDOWS",
		3: "BUILD_TYPE_GPG",
	}
	SignArtifactRequest_BuildType_value = map[string]int32{
		"BUILD_TYPE_UNSPECIFIED": 0,
		"BUILD_TYPE_MACOS":       1,
		"BUILD_TYPE_WINDOWS":     2,
		"BUILD_TYPE_GPG":         3,
	}
)

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

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

func (SignArtifactRequest_BuildType) Descriptor() protoreflect.EnumDescriptor {
	return file_relui_proto_enumTypes[0].Descriptor()
}

func (SignArtifactRequest_BuildType) Type() protoreflect.EnumType {
	return &file_relui_proto_enumTypes[0]
}

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

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

// Request an action from the signing client.
type SigningRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the request. This would normally reside within
	// the metadata. This is primarily used to route requests between
	// caller/responder. The server and client must use the same id for each
	// corresponging request.
	MessageId string `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
	// Request type for the signing client.
	//
	// Types that are assignable to RequestOneof:
	//
	//	*SigningRequest_Sign
	//	*SigningRequest_Status
	//	*SigningRequest_Cancel
	RequestOneof isSigningRequest_RequestOneof `protobuf_oneof:"request_oneof"`
}

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

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

func (*SigningRequest) ProtoMessage() {}

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

func (x *SigningRequest) GetMessageId() string {
	if x != nil {
		return x.MessageId
	}
	return ""
}

func (m *SigningRequest) GetRequestOneof() isSigningRequest_RequestOneof {
	if m != nil {
		return m.RequestOneof
	}
	return nil
}

func (x *SigningRequest) GetSign() *SignArtifactRequest {
	if x, ok := x.GetRequestOneof().(*SigningRequest_Sign); ok {
		return x.Sign
	}
	return nil
}

func (x *SigningRequest) GetStatus() *SignArtifactStatusRequest {
	if x, ok := x.GetRequestOneof().(*SigningRequest_Status); ok {
		return x.Status
	}
	return nil
}

func (x *SigningRequest) GetCancel() *SignArtifactCancelRequest {
	if x, ok := x.GetRequestOneof().(*SigningRequest_Cancel); ok {
		return x.Cancel
	}
	return nil
}

type isSigningRequest_RequestOneof interface {
	isSigningRequest_RequestOneof()
}

type SigningRequest_Sign struct {
	Sign *SignArtifactRequest `protobuf:"bytes,2,opt,name=sign,proto3,oneof"`
}

type SigningRequest_Status struct {
	Status *SignArtifactStatusRequest `protobuf:"bytes,3,opt,name=status,proto3,oneof"`
}

type SigningRequest_Cancel struct {
	Cancel *SignArtifactCancelRequest `protobuf:"bytes,4,opt,name=cancel,proto3,oneof"`
}

func (*SigningRequest_Sign) isSigningRequest_RequestOneof() {}

func (*SigningRequest_Status) isSigningRequest_RequestOneof() {}

func (*SigningRequest_Cancel) isSigningRequest_RequestOneof() {}

// Request to sign a release artifact.
type SignArtifactRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	BuildType SignArtifactRequest_BuildType `protobuf:"varint,1,opt,name=build_type,json=buildType,proto3,enum=protos.SignArtifactRequest_BuildType" json:"build_type,omitempty"`
	// The GCS URI for the artifact that should be signed.
	// This artifact must reside in the agreed upon private
	// GCS bucket.
	//
	// There must be at least one entry, and
	// each one points to an individual file.
	// For example, "gs://golang-release-staging/relui-scratch/<...>/go123.linux-amd64.tar.gz".
	GcsUri []string `protobuf:"bytes,2,rep,name=gcs_uri,json=gcsUri,proto3" json:"gcs_uri,omitempty"`
}

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

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

func (*SignArtifactRequest) ProtoMessage() {}

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

func (x *SignArtifactRequest) GetBuildType() SignArtifactRequest_BuildType {
	if x != nil {
		return x.BuildType
	}
	return SignArtifactRequest_BUILD_TYPE_UNSPECIFIED
}

func (x *SignArtifactRequest) GetGcsUri() []string {
	if x != nil {
		return x.GcsUri
	}
	return nil
}

// Request for an update on an existing signing request.
type SignArtifactStatusRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the signing job.
	JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
}

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

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

func (*SignArtifactStatusRequest) ProtoMessage() {}

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

func (x *SignArtifactStatusRequest) GetJobId() string {
	if x != nil {
		return x.JobId
	}
	return ""
}

// Request to stop a previous signing request sooner if possible.
type SignArtifactCancelRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the signing job.
	JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
}

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

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

func (*SignArtifactCancelRequest) ProtoMessage() {}

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

func (x *SignArtifactCancelRequest) GetJobId() string {
	if x != nil {
		return x.JobId
	}
	return ""
}

// The status of the signing request.
type SigningStatus struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the request. This would normally reside within
	// the metadata. This is primarily used to route requests between
	// caller/responder. The server and client must use the same id for each
	// corresponging request.
	MessageId string `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
	// The status type of the signing request.
	//
	// Types that are assignable to StatusOneof:
	//
	//	*SigningStatus_NotFound
	//	*SigningStatus_Started
	//	*SigningStatus_Running
	//	*SigningStatus_Failed
	//	*SigningStatus_Completed
	StatusOneof isSigningStatus_StatusOneof `protobuf_oneof:"status_oneof"`
}

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

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

func (*SigningStatus) ProtoMessage() {}

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

func (x *SigningStatus) GetMessageId() string {
	if x != nil {
		return x.MessageId
	}
	return ""
}

func (m *SigningStatus) GetStatusOneof() isSigningStatus_StatusOneof {
	if m != nil {
		return m.StatusOneof
	}
	return nil
}

func (x *SigningStatus) GetNotFound() *StatusNotFound {
	if x, ok := x.GetStatusOneof().(*SigningStatus_NotFound); ok {
		return x.NotFound
	}
	return nil
}

func (x *SigningStatus) GetStarted() *StatusStarted {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Started); ok {
		return x.Started
	}
	return nil
}

func (x *SigningStatus) GetRunning() *StatusRunning {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Running); ok {
		return x.Running
	}
	return nil
}

func (x *SigningStatus) GetFailed() *StatusFailed {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Failed); ok {
		return x.Failed
	}
	return nil
}

func (x *SigningStatus) GetCompleted() *StatusCompleted {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Completed); ok {
		return x.Completed
	}
	return nil
}

type isSigningStatus_StatusOneof interface {
	isSigningStatus_StatusOneof()
}

type SigningStatus_NotFound struct {
	NotFound *StatusNotFound `protobuf:"bytes,3,opt,name=not_found,json=notFound,proto3,oneof"`
}

type SigningStatus_Started struct {
	Started *StatusStarted `protobuf:"bytes,4,opt,name=started,proto3,oneof"`
}

type SigningStatus_Running struct {
	Running *StatusRunning `protobuf:"bytes,5,opt,name=running,proto3,oneof"`
}

type SigningStatus_Failed struct {
	Failed *StatusFailed `protobuf:"bytes,6,opt,name=failed,proto3,oneof"`
}

type SigningStatus_Completed struct {
	Completed *StatusCompleted `protobuf:"bytes,7,opt,name=completed,proto3,oneof"`
}

func (*SigningStatus_NotFound) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Started) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Running) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Failed) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Completed) isSigningStatus_StatusOneof() {}

// The signing status for a signing request which does not exist.
type StatusNotFound struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*StatusNotFound) ProtoMessage() {}

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

// The signing status for an in progress signing request.
type StatusStarted struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the signing job that started.
	JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
}

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

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

func (*StatusStarted) ProtoMessage() {}

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

func (x *StatusStarted) GetJobId() string {
	if x != nil {
		return x.JobId
	}
	return ""
}

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

	// Details about the signing request status.
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
}

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

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

func (*StatusRunning) ProtoMessage() {}

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

func (x *StatusRunning) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

// The signing status for a failed signing request.
type StatusFailed struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Details about the signing request status.
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
}

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

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

func (*StatusFailed) ProtoMessage() {}

func (x *StatusFailed) ProtoReflect() protoreflect.Message {
	mi := &file_relui_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 StatusFailed.ProtoReflect.Descriptor instead.
func (*StatusFailed) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{8}
}

func (x *StatusFailed) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

// The signing status for a successfully completed signing request.
type StatusCompleted struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The GCS URIs of the signed artifact(s),
	// each one pointing to an individual file.
	// For example, "gs://golang-release-staging/relui-scratch/<...>/go123.linux-amd64.tar.gz".
	GcsUri []string `protobuf:"bytes,1,rep,name=gcs_uri,json=gcsUri,proto3" json:"gcs_uri,omitempty"`
}

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

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

func (*StatusCompleted) ProtoMessage() {}

func (x *StatusCompleted) ProtoReflect() protoreflect.Message {
	mi := &file_relui_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 StatusCompleted.ProtoReflect.Descriptor instead.
func (*StatusCompleted) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{9}
}

func (x *StatusCompleted) GetGcsUri() []string {
	if x != nil {
		return x.GcsUri
	}
	return nil
}

var File_relui_proto protoreflect.FileDescriptor

var file_relui_proto_rawDesc = []byte{
	0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x75, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e,
	0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73,
	0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65,
	0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53,
	0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74,
	0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52,
	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65,
	0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
	0x2e, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6e,
	0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61,
	0x6e, 0x63, 0x65, 0x6c, 0x42, 0x0f, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,
	0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0xdf, 0x01, 0x0a, 0x13, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a,
	0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x41,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x63, 0x73, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x63, 0x73, 0x55, 0x72, 0x69, 0x22, 0x69, 0x0a, 0x09,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49,
	0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
	0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x54,
	0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42,
	0x55, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57,
	0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50,
	0x45, 0x5f, 0x47, 0x50, 0x47, 0x10, 0x03, 0x22, 0x32, 0x0a, 0x19, 0x53, 0x69, 0x67, 0x6e, 0x41,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x19, 0x53,
	0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65,
	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f,
	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22,
	0xc4, 0x02, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,
	0x12, 0x35, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x6e,
	0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74,
	0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x48,
	0x00, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x75,
	0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x69,
	0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a,
	0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69,
	0x6c, 0x65, 0x64, 0x48, 0x00, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a,
	0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6d,
	0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x26, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74,
	0x75, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62,
	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64,
	0x22, 0x31, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e,
	0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
	0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69,
	0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43,
	0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x63, 0x73, 0x5f,
	0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x63, 0x73, 0x55, 0x72,
	0x69, 0x32, 0x5c, 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76,
	0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67,
	0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69,
	0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42,
	0x2a, 0x5a, 0x28, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x2f,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72,
	0x65, 0x6c, 0x75, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_relui_proto_rawDescOnce sync.Once
	file_relui_proto_rawDescData = file_relui_proto_rawDesc
)

func file_relui_proto_rawDescGZIP() []byte {
	file_relui_proto_rawDescOnce.Do(func() {
		file_relui_proto_rawDescData = protoimpl.X.CompressGZIP(file_relui_proto_rawDescData)
	})
	return file_relui_proto_rawDescData
}

var file_relui_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_relui_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
var file_relui_proto_goTypes = []interface{}{
	(SignArtifactRequest_BuildType)(0), // 0: protos.SignArtifactRequest.BuildType
	(*SigningRequest)(nil),             // 1: protos.SigningRequest
	(*SignArtifactRequest)(nil),        // 2: protos.SignArtifactRequest
	(*SignArtifactStatusRequest)(nil),  // 3: protos.SignArtifactStatusRequest
	(*SignArtifactCancelRequest)(nil),  // 4: protos.SignArtifactCancelRequest
	(*SigningStatus)(nil),              // 5: protos.SigningStatus
	(*StatusNotFound)(nil),             // 6: protos.StatusNotFound
	(*StatusStarted)(nil),              // 7: protos.StatusStarted
	(*StatusRunning)(nil),              // 8: protos.StatusRunning
	(*StatusFailed)(nil),               // 9: protos.StatusFailed
	(*StatusCompleted)(nil),            // 10: protos.StatusCompleted
}
var file_relui_proto_depIdxs = []int32{
	2,  // 0: protos.SigningRequest.sign:type_name -> protos.SignArtifactRequest
	3,  // 1: protos.SigningRequest.status:type_name -> protos.SignArtifactStatusRequest
	4,  // 2: protos.SigningRequest.cancel:type_name -> protos.SignArtifactCancelRequest
	0,  // 3: protos.SignArtifactRequest.build_type:type_name -> protos.SignArtifactRequest.BuildType
	6,  // 4: protos.SigningStatus.not_found:type_name -> protos.StatusNotFound
	7,  // 5: protos.SigningStatus.started:type_name -> protos.StatusStarted
	8,  // 6: protos.SigningStatus.running:type_name -> protos.StatusRunning
	9,  // 7: protos.SigningStatus.failed:type_name -> protos.StatusFailed
	10, // 8: protos.SigningStatus.completed:type_name -> protos.StatusCompleted
	5,  // 9: protos.ReleaseService.UpdateSigningStatus:input_type -> protos.SigningStatus
	1,  // 10: protos.ReleaseService.UpdateSigningStatus:output_type -> protos.SigningRequest
	10, // [10:11] is the sub-list for method output_type
	9,  // [9:10] is the sub-list for method input_type
	9,  // [9:9] is the sub-list for extension type_name
	9,  // [9:9] is the sub-list for extension extendee
	0,  // [0:9] is the sub-list for field type_name
}

func init() { file_relui_proto_init() }
func file_relui_proto_init() {
	if File_relui_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_relui_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SigningRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignArtifactRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignArtifactStatusRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignArtifactCancelRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SigningStatus); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusNotFound); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusStarted); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusRunning); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusFailed); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusCompleted); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_relui_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*SigningRequest_Sign)(nil),
		(*SigningRequest_Status)(nil),
		(*SigningRequest_Cancel)(nil),
	}
	file_relui_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*SigningStatus_NotFound)(nil),
		(*SigningStatus_Started)(nil),
		(*SigningStatus_Running)(nil),
		(*SigningStatus_Failed)(nil),
		(*SigningStatus_Completed)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_relui_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   10,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_relui_proto_goTypes,
		DependencyIndexes: file_relui_proto_depIdxs,
		EnumInfos:         file_relui_proto_enumTypes,
		MessageInfos:      file_relui_proto_msgTypes,
	}.Build()
	File_relui_proto = out.File
	file_relui_proto_rawDesc = nil
	file_relui_proto_goTypes = nil
	file_relui_proto_depIdxs = nil
}
