// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/securitycenter/v1p1beta1/security_marks.proto

package securitycenter

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// User specified security marks that are attached to the parent Cloud Security
// Command Center (Cloud SCC) resource. Security marks are scoped within a Cloud
// SCC organization -- they can be modified and viewed by all users who have
// proper permissions on the organization.
type SecurityMarks struct {
	// The relative resource name of the SecurityMarks. See:
	// https://cloud.google.com/apis/design/resource_names#relative_resource_name
	// Examples:
	// "organizations/{organization_id}/assets/{asset_id}/securityMarks"
	// "organizations/{organization_id}/sources/{source_id}/findings/{finding_id}/securityMarks".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Mutable user specified security marks belonging to the parent resource.
	// Constraints are as follows:
	//
	//   * Keys and values are treated as case insensitive
	//   * Keys must be between 1 - 256 characters (inclusive)
	//   * Keys must be letters, numbers, underscores, or dashes
	//   * Values have leading and trailing whitespace trimmed, remaining
	//     characters must be between 1 - 4096 characters (inclusive)
	Marks                map[string]string `protobuf:"bytes,2,rep,name=marks,proto3" json:"marks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *SecurityMarks) Reset()         { *m = SecurityMarks{} }
func (m *SecurityMarks) String() string { return proto.CompactTextString(m) }
func (*SecurityMarks) ProtoMessage()    {}
func (*SecurityMarks) Descriptor() ([]byte, []int) {
	return fileDescriptor_e4a419f3fe84f720, []int{0}
}

func (m *SecurityMarks) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SecurityMarks.Unmarshal(m, b)
}
func (m *SecurityMarks) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SecurityMarks.Marshal(b, m, deterministic)
}
func (m *SecurityMarks) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SecurityMarks.Merge(m, src)
}
func (m *SecurityMarks) XXX_Size() int {
	return xxx_messageInfo_SecurityMarks.Size(m)
}
func (m *SecurityMarks) XXX_DiscardUnknown() {
	xxx_messageInfo_SecurityMarks.DiscardUnknown(m)
}

var xxx_messageInfo_SecurityMarks proto.InternalMessageInfo

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

func (m *SecurityMarks) GetMarks() map[string]string {
	if m != nil {
		return m.Marks
	}
	return nil
}

func init() {
	proto.RegisterType((*SecurityMarks)(nil), "google.cloud.securitycenter.v1p1beta1.SecurityMarks")
	proto.RegisterMapType((map[string]string)(nil), "google.cloud.securitycenter.v1p1beta1.SecurityMarks.MarksEntry")
}

func init() {
	proto.RegisterFile("google/cloud/securitycenter/v1p1beta1/security_marks.proto", fileDescriptor_e4a419f3fe84f720)
}

var fileDescriptor_e4a419f3fe84f720 = []byte{
	// 393 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xcf, 0x4a, 0x23, 0x31,
	0x18, 0x67, 0xa6, 0xdb, 0x85, 0xcd, 0xb2, 0xb0, 0x0c, 0x7b, 0xe8, 0x16, 0x0f, 0x45, 0x28, 0x54,
	0x84, 0x84, 0xd1, 0x4b, 0x8d, 0x07, 0xb1, 0x45, 0x3c, 0x29, 0xa5, 0xc5, 0x1e, 0xa4, 0x20, 0xe9,
	0x34, 0x86, 0xa1, 0x33, 0xc9, 0x90, 0x64, 0x0a, 0x75, 0xe8, 0x0b, 0xf9, 0x04, 0x1e, 0x7c, 0x02,
	0x1f, 0xa5, 0x57, 0xcf, 0x82, 0x34, 0x99, 0x4e, 0x3b, 0x3d, 0x68, 0x2f, 0x33, 0x5f, 0xf2, 0xfd,
	0xfe, 0x7c, 0xf9, 0x25, 0x00, 0x33, 0x21, 0x58, 0x44, 0x51, 0x10, 0x89, 0x74, 0x82, 0x14, 0x0d,
	0x52, 0x19, 0xea, 0x79, 0x40, 0xb9, 0xa6, 0x12, 0xcd, 0xfc, 0xc4, 0x1f, 0x53, 0x4d, 0xfc, 0xa2,
	0xf1, 0x10, 0x13, 0x39, 0x55, 0x30, 0x91, 0x42, 0x0b, 0xaf, 0x69, 0xb9, 0xd0, 0x70, 0x61, 0x99,
	0x0b, 0x0b, 0x6e, 0xfd, 0x20, 0xb7, 0x20, 0x49, 0x88, 0x08, 0xe7, 0x42, 0x13, 0x1d, 0x0a, 0x9e,
	0x8b, 0xd4, 0xff, 0x6f, 0x75, 0x25, 0x55, 0x22, 0x95, 0x01, 0xb5, 0xad, 0xc3, 0x77, 0x17, 0xfc,
	0x19, 0xe4, 0xaa, 0x37, 0x2b, 0x5f, 0xcf, 0x03, 0x3f, 0x38, 0x89, 0x69, 0xcd, 0x69, 0x38, 0xad,
	0x5f, 0x7d, 0x53, 0x7b, 0x77, 0xa0, 0x6a, 0x86, 0xaa, 0xb9, 0x8d, 0x4a, 0xeb, 0xf7, 0xc9, 0x05,
	0xdc, 0x6b, 0x2a, 0x58, 0x12, 0x86, 0xe6, 0x7b, 0xc5, 0xb5, 0x9c, 0xf7, 0xad, 0x5a, 0xbd, 0x0d,
	0xc0, 0x66, 0xd3, 0xfb, 0x0b, 0x2a, 0x53, 0x3a, 0xcf, 0x7d, 0x57, 0xa5, 0xf7, 0x0f, 0x54, 0x67,
	0x24, 0x4a, 0x69, 0xcd, 0x35, 0x7b, 0x76, 0x81, 0xdd, 0xb6, 0x83, 0x5f, 0x9d, 0xe5, 0xe5, 0x8b,
	0x03, 0x8e, 0x77, 0xac, 0xed, 0x58, 0x24, 0x09, 0x15, 0x0c, 0x44, 0x8c, 0xca, 0x07, 0x3b, 0x13,
	0x92, 0x11, 0x1e, 0x3e, 0xd9, 0x68, 0x50, 0xb6, 0xbd, 0x5c, 0x20, 0xa2, 0x14, 0xd5, 0x0a, 0x65,
	0xe6, 0xbf, 0x28, 0x2e, 0xc3, 0x52, 0x6f, 0xbf, 0xa4, 0xda, 0x40, 0x15, 0xca, 0x6c, 0xb1, 0x40,
	0x8f, 0x21, 0x9f, 0x84, 0x9c, 0x29, 0x94, 0xe5, 0xd5, 0x8e, 0x5e, 0xe7, 0xc3, 0x01, 0x47, 0x81,
	0x88, 0xf7, 0x8b, 0xb1, 0xe7, 0xdc, 0x0f, 0x72, 0x20, 0x13, 0x11, 0xe1, 0x0c, 0x0a, 0xc9, 0x10,
	0xa3, 0xdc, 0xdc, 0x20, 0xda, 0x9c, 0xf9, 0x9b, 0x07, 0x76, 0x5e, 0x6e, 0x3c, 0xbb, 0xcd, 0x6b,
	0xab, 0xda, 0x35, 0xf6, 0xeb, 0xb0, 0xba, 0xd6, 0x7e, 0xe8, 0xf7, 0xfc, 0xce, 0x8a, 0xf6, 0xb6,
	0xc6, 0x8d, 0x0c, 0x6e, 0x54, 0xc6, 0x8d, 0x86, 0x6b, 0xf9, 0xa5, 0xdb, 0xb2, 0x38, 0x8c, 0x0d,
	0x10, 0xe3, 0x32, 0x12, 0xe3, 0x02, 0x3a, 0xfe, 0x69, 0x46, 0x3f, 0xfd, 0x0c, 0x00, 0x00, 0xff,
	0xff, 0xc1, 0x77, 0x24, 0x97, 0x1a, 0x03, 0x00, 0x00,
}
