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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "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 landing page view with metrics aggregated at the expanded final URL
// level.
type ExpandedLandingPageView struct {
	// The resource name of the expanded landing page view.
	// Expanded landing page view resource names have the form:
	//
	// `customers/{customer_id}/expandedLandingPageViews/{expanded_final_url_fingerprint}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The final URL that clicks are directed to.
	ExpandedFinalUrl     *wrappers.StringValue `protobuf:"bytes,2,opt,name=expanded_final_url,json=expandedFinalUrl,proto3" json:"expanded_final_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_ExpandedLandingPageView proto.InternalMessageInfo

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

func (m *ExpandedLandingPageView) GetExpandedFinalUrl() *wrappers.StringValue {
	if m != nil {
		return m.ExpandedFinalUrl
	}
	return nil
}

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

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

var fileDescriptor_10d3300869449542 = []byte{
	// 395 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x41, 0x6b, 0xdb, 0x30,
	0x18, 0xc5, 0x1e, 0x0c, 0xe6, 0x6d, 0x30, 0x7c, 0x59, 0x16, 0xc2, 0x48, 0x36, 0x02, 0x39, 0x49,
	0x63, 0xbe, 0xa9, 0x27, 0x07, 0xda, 0x40, 0x28, 0x25, 0xa4, 0xd4, 0x87, 0x62, 0x30, 0x8a, 0xa5,
	0x08, 0x81, 0x2d, 0x19, 0xc9, 0x4e, 0x0a, 0x21, 0x85, 0x1e, 0x7b, 0xe9, 0x8f, 0xe8, 0xb1, 0x3f,
	0xa5, 0x3f, 0x25, 0xbf, 0xa2, 0x38, 0xb6, 0x94, 0x52, 0x48, 0x7b, 0x7b, 0xf6, 0xf7, 0xde, 0xd3,
	0x7b, 0x9f, 0xe4, 0x8d, 0x99, 0x94, 0x2c, 0xa3, 0x10, 0x13, 0x0d, 0x1b, 0x58, 0xa3, 0x55, 0x00,
	0x15, 0xd5, 0xb2, 0x52, 0x29, 0xd5, 0x90, 0xde, 0x14, 0x58, 0x10, 0x4a, 0x92, 0x0c, 0x0b, 0xc2,
	0x05, 0x4b, 0x0a, 0xcc, 0x68, 0xb2, 0xe2, 0x74, 0x0d, 0x0a, 0x25, 0x4b, 0xe9, 0x0f, 0x1a, 0x21,
	0xc0, 0x44, 0x03, 0xeb, 0x01, 0x56, 0x01, 0xb0, 0x1e, 0xdd, 0x5f, 0xe6, 0x98, 0x82, 0x5b, 0xe7,
	0x46, 0xdd, 0xfd, 0xdd, 0x8e, 0xf6, 0x5f, 0x8b, 0x6a, 0x09, 0xd7, 0x0a, 0x17, 0x05, 0x55, 0xba,
	0x9d, 0xf7, 0x5e, 0x49, 0xb1, 0x10, 0xb2, 0xc4, 0x25, 0x97, 0xa2, 0x9d, 0xfe, 0x79, 0x70, 0xbd,
	0x9f, 0xa7, 0x6d, 0xc0, 0xf3, 0x26, 0xdf, 0x0c, 0x33, 0x1a, 0x71, 0xba, 0xf6, 0xff, 0x7a, 0xdf,
	0xcd, 0x59, 0x89, 0xc0, 0x39, 0xed, 0x38, 0x7d, 0x67, 0xf4, 0x65, 0xfe, 0xcd, 0xfc, 0xbc, 0xc0,
	0x39, 0xf5, 0xa7, 0x9e, 0x6f, 0x0b, 0x2e, 0xb9, 0xc0, 0x59, 0x52, 0xa9, 0xac, 0xe3, 0xf6, 0x9d,
	0xd1, 0xd7, 0xff, 0xbd, 0xb6, 0x0e, 0x30, 0xd9, 0xc0, 0x65, 0xa9, 0xb8, 0x60, 0x11, 0xce, 0x2a,
	0x3a, 0xff, 0x61, 0x74, 0x67, 0xb5, 0xec, 0x4a, 0x65, 0xe8, 0xce, 0xd9, 0x85, 0xb7, 0xde, 0xbf,
	0xc3, 0x0e, 0x5a, 0x54, 0x70, 0x0d, 0x52, 0x99, 0xc3, 0x63, 0x41, 0xa7, 0x69, 0xa5, 0x4b, 0x99,
	0x53, 0xa5, 0xe1, 0xc6, 0xc0, 0xad, 0xdd, 0xfb, 0x1b, 0xb6, 0x86, 0x9b, 0xe3, 0x37, 0xb2, 0x1d,
	0xdf, 0xbb, 0xde, 0x30, 0x95, 0x39, 0xf8, 0xf0, 0x4e, 0xc6, 0xbd, 0x23, 0x71, 0x66, 0x75, 0xd9,
	0x99, 0x73, 0x3d, 0x6d, 0x2d, 0x98, 0xcc, 0xb0, 0x60, 0x40, 0x2a, 0x06, 0x19, 0x15, 0xfb, 0x55,
	0xc0, 0x43, 0xb1, 0x77, 0x5e, 0xce, 0x89, 0x45, 0x8f, 0xee, 0xa7, 0x49, 0x18, 0x3e, 0xb9, 0x83,
	0x49, 0x63, 0x19, 0x12, 0x0d, 0x1a, 0x58, 0xa3, 0x28, 0x00, 0x73, 0xc3, 0x7c, 0x36, 0x9c, 0x38,
	0x24, 0x3a, 0xb6, 0x9c, 0x38, 0x0a, 0x62, 0xcb, 0xd9, 0xb9, 0xc3, 0x66, 0x80, 0x50, 0x48, 0x34,
	0x42, 0x96, 0x85, 0x50, 0x14, 0x20, 0x64, 0x79, 0x8b, 0xcf, 0xfb, 0xb0, 0xc1, 0x4b, 0x00, 0x00,
	0x00, 0xff, 0xff, 0xae, 0x79, 0x3b, 0xbe, 0xe5, 0x02, 0x00, 0x00,
}
