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

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: prototype/design_project.proto

package prototype

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

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

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

	// Defines the human-readable name for the project.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Defines the git-repo path for the project.
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// Defines the path that stores all of the project configuration.
	// Relative to the git-repo
	ConfigPath string `protobuf:"bytes,3,opt,name=config_path,json=configPath,proto3" json:"config_path,omitempty"`
	// Define the project's local_manifest.
	RepoManifestPath string `protobuf:"bytes,4,opt,name=repo_manifest_path,json=repoManifestPath,proto3" json:"repo_manifest_path,omitempty"`
	// The Google Storage bucket for artifacts from the project's builds.
	GsBucket string `protobuf:"bytes,5,opt,name=gs_bucket,json=gsBucket,proto3" json:"gs_bucket,omitempty"`
	// Defines config needed to maintain firmware builders for the project.
	FirmwareConfig *DesignProject_FirmwareConfig `protobuf:"bytes,6,opt,name=firmware_config,json=firmwareConfig,proto3" json:"firmware_config,omitempty"`
	// Define factory build config needed for manufacturing verification.
	FactoryConfig *DesignProject_FactoryConfig `protobuf:"bytes,7,opt,name=factory_config,json=factoryConfig,proto3" json:"factory_config,omitempty"`
	// Defines signing config unique to the given design project.
	SigningConfig *DesignProject_SigningConfig `protobuf:"bytes,8,opt,name=signing_config,json=signingConfig,proto3" json:"signing_config,omitempty"`
}

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

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

func (*DesignProject) ProtoMessage() {}

func (x *DesignProject) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DesignProject.ProtoReflect.Descriptor instead.
func (*DesignProject) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0}
}

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

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

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

func (x *DesignProject) GetRepoManifestPath() string {
	if x != nil {
		return x.RepoManifestPath
	}
	return ""
}

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

func (x *DesignProject) GetFirmwareConfig() *DesignProject_FirmwareConfig {
	if x != nil {
		return x.FirmwareConfig
	}
	return nil
}

func (x *DesignProject) GetFactoryConfig() *DesignProject_FactoryConfig {
	if x != nil {
		return x.FactoryConfig
	}
	return nil
}

func (x *DesignProject) GetSigningConfig() *DesignProject_SigningConfig {
	if x != nil {
		return x.SigningConfig
	}
	return nil
}

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

	// Defines the firmware branch that will be maintained for the project.
	FirmwareBranch string `protobuf:"bytes,1,opt,name=firmware_branch,json=firmwareBranch,proto3" json:"firmware_branch,omitempty"`
}

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

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

func (*DesignProject_FirmwareConfig) ProtoMessage() {}

func (x *DesignProject_FirmwareConfig) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DesignProject_FirmwareConfig.ProtoReflect.Descriptor instead.
func (*DesignProject_FirmwareConfig) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0, 0}
}

func (x *DesignProject_FirmwareConfig) GetFirmwareBranch() string {
	if x != nil {
		return x.FirmwareBranch
	}
	return ""
}

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

	// Defines the factory branch that will be maintained for the project.
	FactoryBranch string `protobuf:"bytes,1,opt,name=factory_branch,json=factoryBranch,proto3" json:"factory_branch,omitempty"`
	// A key in the project.yaml metadata file, to look up the branch, path,
	// etc. For example, to match the entry in the project.yaml file:
	//
	// MILKYWAY:
	//   board: GALAXY
	//   branch: master
	//   version: 3
	//   path: v3/MILKYWAY
	//
	// project_key should be 'MILKYWAY'. The matching is case-insensitive.
	HwidProjectKey string `protobuf:"bytes,2,opt,name=hwid_project_key,json=hwidProjectKey,proto3" json:"hwid_project_key,omitempty"`
}

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

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

func (*DesignProject_FactoryConfig) ProtoMessage() {}

func (x *DesignProject_FactoryConfig) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DesignProject_FactoryConfig.ProtoReflect.Descriptor instead.
func (*DesignProject_FactoryConfig) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0, 1}
}

func (x *DesignProject_FactoryConfig) GetFactoryBranch() string {
	if x != nil {
		return x.FactoryBranch
	}
	return ""
}

func (x *DesignProject_FactoryConfig) GetHwidProjectKey() string {
	if x != nil {
		return x.HwidProjectKey
	}
	return ""
}

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

	// Key names have taken historically followed many different patterns.
	// To support all of the cases, this defines an explicit mapping between the
	// supported brands and corresponding keys present in the respective
	// keysets.
	// Going forward, this could be standardized, removing the need for the
	// explict mapping, but this will be required for the foreseeable future.
	BrandIdToKey map[string]string `protobuf:"bytes,1,rep,name=brand_id_to_key,json=brandIdToKey,proto3" json:"brand_id_to_key,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*DesignProject_SigningConfig) ProtoMessage() {}

func (x *DesignProject_SigningConfig) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_design_project_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DesignProject_SigningConfig.ProtoReflect.Descriptor instead.
func (*DesignProject_SigningConfig) Descriptor() ([]byte, []int) {
	return file_prototype_design_project_proto_rawDescGZIP(), []int{0, 2}
}

func (x *DesignProject_SigningConfig) GetBrandIdToKey() map[string]string {
	if x != nil {
		return x.BrandIdToKey
	}
	return nil
}

var File_prototype_design_project_proto protoreflect.FileDescriptor

var file_prototype_design_project_proto_rawDesc = []byte{
	0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x64, 0x65, 0x73, 0x69,
	0x67, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe4, 0x05, 0x0a, 0x0d,
	0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a,
	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f,
	0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6d,
	0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74,
	0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65,
	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65,
	0x74, 0x12, 0x50, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x0e, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72,
	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x0d, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x12, 0x4d, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x1a, 0x39, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f,
	0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x1a, 0x60, 0x0a, 0x0d,
	0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a,
	0x0e, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x72,
	0x61, 0x6e, 0x63, 0x68, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x77, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f,
	0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
	0x68, 0x77, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x65, 0x79, 0x1a, 0xb1,
	0x01, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x12, 0x5f, 0x0a, 0x0f, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f,
	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x50, 0x72, 0x6f, 0x6a,
	0x65, 0x63, 0x74, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x54, 0x6f, 0x4b, 0x65, 0x79, 0x45, 0x6e,
	0x74, 0x72, 0x79, 0x52, 0x0c, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x54, 0x6f, 0x4b, 0x65,
	0x79, 0x1a, 0x3f, 0x0a, 0x11, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x54, 0x6f, 0x4b, 0x65,
	0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
	0x38, 0x01, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_prototype_design_project_proto_rawDescOnce sync.Once
	file_prototype_design_project_proto_rawDescData = file_prototype_design_project_proto_rawDesc
)

func file_prototype_design_project_proto_rawDescGZIP() []byte {
	file_prototype_design_project_proto_rawDescOnce.Do(func() {
		file_prototype_design_project_proto_rawDescData = protoimpl.X.CompressGZIP(file_prototype_design_project_proto_rawDescData)
	})
	return file_prototype_design_project_proto_rawDescData
}

var file_prototype_design_project_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_prototype_design_project_proto_goTypes = []interface{}{
	(*DesignProject)(nil),                // 0: prototype.DesignProject
	(*DesignProject_FirmwareConfig)(nil), // 1: prototype.DesignProject.FirmwareConfig
	(*DesignProject_FactoryConfig)(nil),  // 2: prototype.DesignProject.FactoryConfig
	(*DesignProject_SigningConfig)(nil),  // 3: prototype.DesignProject.SigningConfig
	nil,                                  // 4: prototype.DesignProject.SigningConfig.BrandIdToKeyEntry
}
var file_prototype_design_project_proto_depIdxs = []int32{
	1, // 0: prototype.DesignProject.firmware_config:type_name -> prototype.DesignProject.FirmwareConfig
	2, // 1: prototype.DesignProject.factory_config:type_name -> prototype.DesignProject.FactoryConfig
	3, // 2: prototype.DesignProject.signing_config:type_name -> prototype.DesignProject.SigningConfig
	4, // 3: prototype.DesignProject.SigningConfig.brand_id_to_key:type_name -> prototype.DesignProject.SigningConfig.BrandIdToKeyEntry
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_prototype_design_project_proto_init() }
func file_prototype_design_project_proto_init() {
	if File_prototype_design_project_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_prototype_design_project_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_design_project_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject_FirmwareConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_design_project_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject_FactoryConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_prototype_design_project_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DesignProject_SigningConfig); 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_prototype_design_project_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_prototype_design_project_proto_goTypes,
		DependencyIndexes: file_prototype_design_project_proto_depIdxs,
		MessageInfos:      file_prototype_design_project_proto_msgTypes,
	}.Build()
	File_prototype_design_project_proto = out.File
	file_prototype_design_project_proto_rawDesc = nil
	file_prototype_design_project_proto_goTypes = nil
	file_prototype_design_project_proto_depIdxs = nil
}
