// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/managed_placement_view.proto

package resources

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

// A managed placement view.
type ManagedPlacementView struct {
	// The resource name of the Managed Placement view.
	// Managed placement view resource names have the form:
	//
	// `customers/{customer_id}/managedPlacementViews/{ad_group_id}~{criterion_id}`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ManagedPlacementView proto.InternalMessageInfo

func (m *ManagedPlacementView) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func init() {
	proto.RegisterType((*ManagedPlacementView)(nil), "google.ads.googleads.v3.resources.ManagedPlacementView")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/managed_placement_view.proto", fileDescriptor_e3083284e69e9877)
}

var fileDescriptor_e3083284e69e9877 = []byte{
	// 327 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xf3, 0x40,
	0x14, 0x85, 0x49, 0x7e, 0xf8, 0xc1, 0xa0, 0x9b, 0xe2, 0xc2, 0x16, 0x17, 0x56, 0x29, 0xb8, 0x71,
	0x66, 0x91, 0xdd, 0x08, 0x42, 0xea, 0xa2, 0x20, 0x28, 0xa5, 0x8b, 0x2c, 0x24, 0x50, 0xc6, 0xe4,
	0x32, 0x04, 0x3a, 0x73, 0x43, 0x6e, 0xda, 0x2e, 0x4a, 0xb7, 0x3e, 0x88, 0x4b, 0xd7, 0x3e, 0x85,
	0x8f, 0xd2, 0xa7, 0x90, 0x76, 0x3a, 0x53, 0x85, 0xa0, 0xbb, 0x43, 0xee, 0x77, 0xce, 0xbd, 0x73,
	0x12, 0xdd, 0x29, 0x44, 0x35, 0x03, 0x2e, 0x0b, 0xe2, 0x56, 0x6e, 0xd5, 0x22, 0xe6, 0x35, 0x10,
	0xce, 0xeb, 0x1c, 0x88, 0x6b, 0x69, 0xa4, 0x82, 0x62, 0x5a, 0xcd, 0x64, 0x0e, 0x1a, 0x4c, 0x33,
	0x5d, 0x94, 0xb0, 0x64, 0x55, 0x8d, 0x0d, 0x76, 0xfa, 0xd6, 0xc4, 0x64, 0x41, 0xcc, 0xfb, 0xd9,
	0x22, 0x66, 0xde, 0xdf, 0xeb, 0xba, 0x15, 0x55, 0xe9, 0x53, 0xad, 0xbb, 0x77, 0xfe, 0x6d, 0x24,
	0x8d, 0xc1, 0x46, 0x36, 0x25, 0x1a, 0xb2, 0xd3, 0xcb, 0x8f, 0x20, 0x3a, 0x7d, 0xb4, 0xcb, 0xc7,
	0x6e, 0x77, 0x5a, 0xc2, 0xb2, 0x73, 0x15, 0x9d, 0xb8, 0xa0, 0xa9, 0x91, 0x1a, 0xce, 0x82, 0x8b,
	0xe0, 0xfa, 0x68, 0x72, 0xec, 0x3e, 0x3e, 0x49, 0x0d, 0x62, 0xb9, 0x49, 0x9a, 0xe8, 0xe6, 0x70,
	0xd3, 0x5e, 0x55, 0x25, 0xb1, 0x1c, 0x35, 0x6f, 0x0d, 0xbe, 0xcf, 0xe7, 0xd4, 0xa0, 0x86, 0x9a,
	0xf8, 0xca, 0xc9, 0xb5, 0x2b, 0xe0, 0x07, 0x4a, 0x7c, 0xd5, 0xde, 0xcb, 0x7a, 0xf8, 0x1a, 0x46,
	0x83, 0x1c, 0x35, 0xfb, 0xb3, 0x99, 0x61, 0xb7, 0xed, 0x88, 0xf1, 0xf6, 0xed, 0xe3, 0xe0, 0xf9,
	0x61, 0xef, 0x57, 0x38, 0x93, 0x46, 0x31, 0xac, 0x15, 0x57, 0x60, 0x76, 0xcd, 0xf0, 0xc3, 0x5b,
	0x7e, 0xf9, 0x71, 0xb7, 0x5e, 0xbd, 0x85, 0xff, 0x46, 0x49, 0xf2, 0x1e, 0xf6, 0x47, 0x36, 0x32,
	0x29, 0x88, 0x59, 0xb9, 0x55, 0x69, 0xcc, 0x26, 0x8e, 0xfc, 0x74, 0x4c, 0x96, 0x14, 0x94, 0x79,
	0x26, 0x4b, 0xe3, 0xcc, 0x33, 0x9b, 0x70, 0x60, 0x07, 0x42, 0x24, 0x05, 0x09, 0xe1, 0x29, 0x21,
	0xd2, 0x58, 0x08, 0xcf, 0xbd, 0xfc, 0xdf, 0x1d, 0x1b, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb1,
	0x9e, 0x8d, 0xf0, 0x64, 0x02, 0x00, 0x00,
}
