// Copyright 2024 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.
// source: internal/testprotos/lazy/lazy_extension_test.proto

package lazy

import (
	messagesetpb "google.golang.org/protobuf/internal/testprotos/messageset/messagesetpb"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

type FlyingFoxSpecies int32

const (
	FlyingFoxSpecies_FLYING_FOX_UNDEFINED FlyingFoxSpecies = 0
	FlyingFoxSpecies_GREY_HEADED          FlyingFoxSpecies = 1
	FlyingFoxSpecies_BLACK                FlyingFoxSpecies = 2
	FlyingFoxSpecies_SPECTACLED           FlyingFoxSpecies = 3
	FlyingFoxSpecies_LARGE_EARED          FlyingFoxSpecies = 4
	FlyingFoxSpecies_DUSKY                FlyingFoxSpecies = 5
	FlyingFoxSpecies_TORRESIAN            FlyingFoxSpecies = 6
	FlyingFoxSpecies_BARE_BACKED          FlyingFoxSpecies = 7
)

// Enum value maps for FlyingFoxSpecies.
var (
	FlyingFoxSpecies_name = map[int32]string{
		0: "FLYING_FOX_UNDEFINED",
		1: "GREY_HEADED",
		2: "BLACK",
		3: "SPECTACLED",
		4: "LARGE_EARED",
		5: "DUSKY",
		6: "TORRESIAN",
		7: "BARE_BACKED",
	}
	FlyingFoxSpecies_value = map[string]int32{
		"FLYING_FOX_UNDEFINED": 0,
		"GREY_HEADED":          1,
		"BLACK":                2,
		"SPECTACLED":           3,
		"LARGE_EARED":          4,
		"DUSKY":                5,
		"TORRESIAN":            6,
		"BARE_BACKED":          7,
	}
)

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

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

func (FlyingFoxSpecies) Descriptor() protoreflect.EnumDescriptor {
	return file_internal_testprotos_lazy_lazy_extension_test_proto_enumTypes[0].Descriptor()
}

func (FlyingFoxSpecies) Type() protoreflect.EnumType {
	return &file_internal_testprotos_lazy_lazy_extension_test_proto_enumTypes[0]
}

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

// Deprecated: Do not use.
func (x *FlyingFoxSpecies) UnmarshalJSON(b []byte) error {
	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
	if err != nil {
		return err
	}
	*x = FlyingFoxSpecies(num)
	return nil
}

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

type PipistrelleSpecies int32

const (
	PipistrelleSpecies_PIPISTRELLE_UNDEFINED PipistrelleSpecies = 0
	PipistrelleSpecies_FOREST                PipistrelleSpecies = 1
	PipistrelleSpecies_INDIAN                PipistrelleSpecies = 2
	PipistrelleSpecies_EGYPTIAN              PipistrelleSpecies = 3
	PipistrelleSpecies_RUSTY                 PipistrelleSpecies = 4
	PipistrelleSpecies_LEAST                 PipistrelleSpecies = 5
)

// Enum value maps for PipistrelleSpecies.
var (
	PipistrelleSpecies_name = map[int32]string{
		0: "PIPISTRELLE_UNDEFINED",
		1: "FOREST",
		2: "INDIAN",
		3: "EGYPTIAN",
		4: "RUSTY",
		5: "LEAST",
	}
	PipistrelleSpecies_value = map[string]int32{
		"PIPISTRELLE_UNDEFINED": 0,
		"FOREST":                1,
		"INDIAN":                2,
		"EGYPTIAN":              3,
		"RUSTY":                 4,
		"LEAST":                 5,
	}
)

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

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

func (PipistrelleSpecies) Descriptor() protoreflect.EnumDescriptor {
	return file_internal_testprotos_lazy_lazy_extension_test_proto_enumTypes[1].Descriptor()
}

func (PipistrelleSpecies) Type() protoreflect.EnumType {
	return &file_internal_testprotos_lazy_lazy_extension_test_proto_enumTypes[1]
}

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

// Deprecated: Do not use.
func (x *PipistrelleSpecies) UnmarshalJSON(b []byte) error {
	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
	if err != nil {
		return err
	}
	*x = PipistrelleSpecies(num)
	return nil
}

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

// This message contains a message set.
type Holder struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Data *messagesetpb.MessageSet `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"`
}

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

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

func (*Holder) ProtoMessage() {}

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

func (x *Holder) GetData() *messagesetpb.MessageSet {
	if x != nil {
		return x.Data
	}
	return nil
}

// This message may be inserted into a message set.
type Rabbit struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
}

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

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

func (*Rabbit) ProtoMessage() {}

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

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

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

	Species *FlyingFoxSpecies `protobuf:"varint,1,opt,name=species,enum=lazy_extension_test.FlyingFoxSpecies" json:"species,omitempty"`
}

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

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

func (*FlyingFox) ProtoMessage() {}

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

func (x *FlyingFox) GetSpecies() FlyingFoxSpecies {
	if x != nil && x.Species != nil {
		return *x.Species
	}
	return FlyingFoxSpecies_FLYING_FOX_UNDEFINED
}

type Tree struct {
	state           protoimpl.MessageState
	sizeCache       protoimpl.SizeCache
	unknownFields   protoimpl.UnknownFields
	extensionFields protoimpl.ExtensionFields

	Eucalyptus *bool `protobuf:"varint,1,opt,name=eucalyptus" json:"eucalyptus,omitempty"`
}

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

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

func (*Tree) ProtoMessage() {}

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

func (x *Tree) GetEucalyptus() bool {
	if x != nil && x.Eucalyptus != nil {
		return *x.Eucalyptus
	}
	return false
}

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

	Species *PipistrelleSpecies `protobuf:"varint,1,opt,name=species,enum=lazy_extension_test.PipistrelleSpecies" json:"species,omitempty"`
}

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

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

func (*Pipistrelle) ProtoMessage() {}

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

func (x *Pipistrelle) GetSpecies() PipistrelleSpecies {
	if x != nil && x.Species != nil {
		return *x.Species
	}
	return PipistrelleSpecies_PIPISTRELLE_UNDEFINED
}

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

	Species *PipistrelleSpecies `protobuf:"varint,1,opt,name=species,enum=lazy_extension_test.PipistrelleSpecies" json:"species,omitempty"`
}

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

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

func (*Pipistrelles) ProtoMessage() {}

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

func (x *Pipistrelles) GetSpecies() PipistrelleSpecies {
	if x != nil && x.Species != nil {
		return *x.Species
	}
	return PipistrelleSpecies_PIPISTRELLE_UNDEFINED
}

// And the ugly version that is not encouraged
type BatNest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*BatNest) ProtoMessage() {}

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

var file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes = []protoimpl.ExtensionInfo{
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: (*FlyingFox)(nil),
		Field:         345570595,
		Name:          "lazy_extension_test.bat",
		Tag:           "bytes,345570595,opt,name=bat",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: (*FlyingFox)(nil),
		Field:         345570596,
		Name:          "lazy_extension_test.bat_pup",
		Tag:           "bytes,345570596,opt,name=bat_pup",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: ([]*FlyingFox)(nil),
		Field:         345570597,
		Name:          "lazy_extension_test.bat_posse",
		Tag:           "bytes,345570597,rep,name=bat_posse",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: ([]byte)(nil),
		Field:         345570598,
		Name:          "lazy_extension_test.binary_bat",
		Tag:           "bytes,345570598,opt,name=binary_bat",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: (*uint32)(nil),
		Field:         345570599,
		Name:          "lazy_extension_test.integer_bat",
		Tag:           "varint,345570599,opt,name=integer_bat",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: (*Pipistrelle)(nil),
		Field:         345570600,
		Name:          "lazy_extension_test.pipistrelle",
		Tag:           "group,345570600,opt,name=Pipistrelle",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: ([]*Pipistrelles)(nil),
		Field:         345570601,
		Name:          "lazy_extension_test.pipistrelles",
		Tag:           "group,345570601,rep,name=Pipistrelles",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*messagesetpb.MessageSet)(nil),
		ExtensionType: (*Rabbit)(nil),
		Field:         345570595,
		Name:          "lazy_extension_test.Rabbit.message_set_extension",
		Tag:           "bytes,345570595,opt,name=message_set_extension",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
	{
		ExtendedType:  (*Tree)(nil),
		ExtensionType: (*FlyingFox)(nil),
		Field:         345570602,
		Name:          "lazy_extension_test.BatNest.bat",
		Tag:           "bytes,345570602,opt,name=bat",
		Filename:      "internal/testprotos/lazy/lazy_extension_test.proto",
	},
}

// Extension fields to Tree.
var (
	// optional lazy_extension_test.FlyingFox bat = 345570595;
	E_Bat = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[0]
	// optional lazy_extension_test.FlyingFox bat_pup = 345570596;
	E_BatPup = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[1]
	// repeated lazy_extension_test.FlyingFox bat_posse = 345570597;
	E_BatPosse = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[2]
	// optional bytes binary_bat = 345570598;
	E_BinaryBat = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[3]
	// optional uint32 integer_bat = 345570599;
	E_IntegerBat = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[4]
	// optional lazy_extension_test.Pipistrelle pipistrelle = 345570600;
	E_Pipistrelle = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[5]
	// repeated lazy_extension_test.Pipistrelles pipistrelles = 345570601;
	E_Pipistrelles = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[6]
	// optional lazy_extension_test.FlyingFox bat = 345570602;
	E_BatNest_Bat = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[8]
)

// Extension fields to messagesetpb.MessageSet.
var (
	// optional lazy_extension_test.Rabbit message_set_extension = 345570595;
	E_Rabbit_MessageSetExtension = &file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes[7]
)

var File_internal_testprotos_lazy_lazy_extension_test_proto protoreflect.FileDescriptor

var file_internal_testprotos_lazy_lazy_extension_test_proto_rawDesc = []byte{
	0x0a, 0x32, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x61, 0x7a, 0x79, 0x2f, 0x6c, 0x61, 0x7a, 0x79, 0x5f,
	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x69, 0x6e, 0x74, 0x65, 0x72,
	0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6d,
	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x65, 0x74, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
	0x65, 0x73, 0x65, 0x74, 0x70, 0x62, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73,
	0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x42, 0x0a, 0x06, 0x48, 0x6f, 0x6c, 0x64,
	0x65, 0x72, 0x12, 0x38, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x24, 0x2e, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73,
	0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x97, 0x01, 0x0a,
	0x06, 0x52, 0x61, 0x62, 0x62, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x79, 0x0a, 0x15, 0x6d,
	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x65, 0x74, 0x2e,
	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0xa3, 0xfa, 0xe3, 0xa4, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65,
	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x61, 0x62, 0x62, 0x69,
	0x74, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74,
	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4c, 0x0a, 0x09, 0x46, 0x6c, 0x79, 0x69, 0x6e, 0x67,
	0x46, 0x6f, 0x78, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65,
	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6c, 0x79, 0x69, 0x6e,
	0x67, 0x46, 0x6f, 0x78, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x70, 0x65,
	0x63, 0x69, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x04, 0x54, 0x72, 0x65, 0x65, 0x12, 0x1e, 0x0a, 0x0a,
	0x65, 0x75, 0x63, 0x61, 0x6c, 0x79, 0x70, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x0a, 0x65, 0x75, 0x63, 0x61, 0x6c, 0x79, 0x70, 0x74, 0x75, 0x73, 0x2a, 0x09, 0x08, 0x90,
	0x4e, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x50, 0x0a, 0x0b, 0x50, 0x69, 0x70, 0x69, 0x73,
	0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65,
	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65,
	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x69,
	0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73,
	0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x0c, 0x50, 0x69, 0x70,
	0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x70, 0x65,
	0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x6c, 0x61, 0x7a,
	0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74,
	0x2e, 0x50, 0x69, 0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63,
	0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x07,
	0x42, 0x61, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x32, 0x4f, 0x0a, 0x03, 0x62, 0x61, 0x74, 0x12, 0x19,
	0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
	0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xaa, 0xfa, 0xe3, 0xa4, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6c, 0x79, 0x69, 0x6e, 0x67,
	0x46, 0x6f, 0x78, 0x52, 0x03, 0x62, 0x61, 0x74, 0x2a, 0x94, 0x01, 0x0a, 0x10, 0x46, 0x6c, 0x79,
	0x69, 0x6e, 0x67, 0x46, 0x6f, 0x78, 0x53, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a,
	0x14, 0x46, 0x4c, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x58, 0x5f, 0x55, 0x4e, 0x44, 0x45,
	0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x52, 0x45, 0x59, 0x5f,
	0x48, 0x45, 0x41, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x4c, 0x41, 0x43,
	0x4b, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x50, 0x45, 0x43, 0x54, 0x41, 0x43, 0x4c, 0x45,
	0x44, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x5f, 0x45, 0x41, 0x52,
	0x45, 0x44, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x55, 0x53, 0x4b, 0x59, 0x10, 0x05, 0x12,
	0x0d, 0x0a, 0x09, 0x54, 0x4f, 0x52, 0x52, 0x45, 0x53, 0x49, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f,
	0x0a, 0x0b, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x07, 0x2a,
	0x6b, 0x0a, 0x12, 0x50, 0x69, 0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x53, 0x70,
	0x65, 0x63, 0x69, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x49, 0x50, 0x49, 0x53, 0x54, 0x52,
	0x45, 0x4c, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x0a, 0x0a, 0x06, 0x46, 0x4f, 0x52, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06,
	0x49, 0x4e, 0x44, 0x49, 0x41, 0x4e, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x47, 0x59, 0x50,
	0x54, 0x49, 0x41, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x53, 0x54, 0x59, 0x10,
	0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x10, 0x05, 0x3a, 0x4f, 0x0a, 0x03,
	0x62, 0x61, 0x74, 0x12, 0x19, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xa3,
	0xfa, 0xe3, 0xa4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f,
	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46,
	0x6c, 0x79, 0x69, 0x6e, 0x67, 0x46, 0x6f, 0x78, 0x52, 0x03, 0x62, 0x61, 0x74, 0x3a, 0x56, 0x0a,
	0x07, 0x62, 0x61, 0x74, 0x5f, 0x70, 0x75, 0x70, 0x12, 0x19, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f,
	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54,
	0x72, 0x65, 0x65, 0x18, 0xa4, 0xfa, 0xe3, 0xa4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
	0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
	0x65, 0x73, 0x74, 0x2e, 0x46, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x46, 0x6f, 0x78, 0x52, 0x06, 0x62,
	0x61, 0x74, 0x50, 0x75, 0x70, 0x3a, 0x5a, 0x0a, 0x09, 0x62, 0x61, 0x74, 0x5f, 0x70, 0x6f, 0x73,
	0x73, 0x65, 0x12, 0x19, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xa5, 0xfa,
	0xe3, 0xa4, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65,
	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6c,
	0x79, 0x69, 0x6e, 0x67, 0x46, 0x6f, 0x78, 0x52, 0x08, 0x62, 0x61, 0x74, 0x50, 0x6f, 0x73, 0x73,
	0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x61, 0x74, 0x12,
	0x19, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xa6, 0xfa, 0xe3, 0xa4, 0x01,
	0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x42, 0x61, 0x74, 0x3a,
	0x3e, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x74, 0x12, 0x19,
	0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
	0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xa7, 0xfa, 0xe3, 0xa4, 0x01, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x42, 0x61, 0x74, 0x3a,
	0x61, 0x0a, 0x0b, 0x70, 0x69, 0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x12, 0x19,
	0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
	0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xa8, 0xfa, 0xe3, 0xa4, 0x01, 0x20,
	0x01, 0x28, 0x0a, 0x32, 0x20, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x69, 0x70, 0x69, 0x73, 0x74,
	0x72, 0x65, 0x6c, 0x6c, 0x65, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c,
	0x6c, 0x65, 0x3a, 0x64, 0x0a, 0x0c, 0x70, 0x69, 0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c,
	0x65, 0x73, 0x12, 0x19, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x72, 0x65, 0x65, 0x18, 0xa9, 0xfa,
	0xe3, 0xa4, 0x01, 0x20, 0x03, 0x28, 0x0a, 0x32, 0x21, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x65,
	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x69,
	0x70, 0x69, 0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x69,
	0x73, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x61, 0x7a, 0x79,
}

var (
	file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescOnce sync.Once
	file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescData = file_internal_testprotos_lazy_lazy_extension_test_proto_rawDesc
)

func file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescGZIP() []byte {
	file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescOnce.Do(func() {
		file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescData)
	})
	return file_internal_testprotos_lazy_lazy_extension_test_proto_rawDescData
}

var file_internal_testprotos_lazy_lazy_extension_test_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_internal_testprotos_lazy_lazy_extension_test_proto_goTypes = []any{
	(FlyingFoxSpecies)(0),           // 0: lazy_extension_test.FlyingFoxSpecies
	(PipistrelleSpecies)(0),         // 1: lazy_extension_test.PipistrelleSpecies
	(*Holder)(nil),                  // 2: lazy_extension_test.Holder
	(*Rabbit)(nil),                  // 3: lazy_extension_test.Rabbit
	(*FlyingFox)(nil),               // 4: lazy_extension_test.FlyingFox
	(*Tree)(nil),                    // 5: lazy_extension_test.Tree
	(*Pipistrelle)(nil),             // 6: lazy_extension_test.Pipistrelle
	(*Pipistrelles)(nil),            // 7: lazy_extension_test.Pipistrelles
	(*BatNest)(nil),                 // 8: lazy_extension_test.BatNest
	(*messagesetpb.MessageSet)(nil), // 9: goproto.proto.messageset.MessageSet
}
var file_internal_testprotos_lazy_lazy_extension_test_proto_depIdxs = []int32{
	9,  // 0: lazy_extension_test.Holder.data:type_name -> goproto.proto.messageset.MessageSet
	0,  // 1: lazy_extension_test.FlyingFox.species:type_name -> lazy_extension_test.FlyingFoxSpecies
	1,  // 2: lazy_extension_test.Pipistrelle.species:type_name -> lazy_extension_test.PipistrelleSpecies
	1,  // 3: lazy_extension_test.Pipistrelles.species:type_name -> lazy_extension_test.PipistrelleSpecies
	5,  // 4: lazy_extension_test.bat:extendee -> lazy_extension_test.Tree
	5,  // 5: lazy_extension_test.bat_pup:extendee -> lazy_extension_test.Tree
	5,  // 6: lazy_extension_test.bat_posse:extendee -> lazy_extension_test.Tree
	5,  // 7: lazy_extension_test.binary_bat:extendee -> lazy_extension_test.Tree
	5,  // 8: lazy_extension_test.integer_bat:extendee -> lazy_extension_test.Tree
	5,  // 9: lazy_extension_test.pipistrelle:extendee -> lazy_extension_test.Tree
	5,  // 10: lazy_extension_test.pipistrelles:extendee -> lazy_extension_test.Tree
	9,  // 11: lazy_extension_test.Rabbit.message_set_extension:extendee -> goproto.proto.messageset.MessageSet
	5,  // 12: lazy_extension_test.BatNest.bat:extendee -> lazy_extension_test.Tree
	4,  // 13: lazy_extension_test.bat:type_name -> lazy_extension_test.FlyingFox
	4,  // 14: lazy_extension_test.bat_pup:type_name -> lazy_extension_test.FlyingFox
	4,  // 15: lazy_extension_test.bat_posse:type_name -> lazy_extension_test.FlyingFox
	6,  // 16: lazy_extension_test.pipistrelle:type_name -> lazy_extension_test.Pipistrelle
	7,  // 17: lazy_extension_test.pipistrelles:type_name -> lazy_extension_test.Pipistrelles
	3,  // 18: lazy_extension_test.Rabbit.message_set_extension:type_name -> lazy_extension_test.Rabbit
	4,  // 19: lazy_extension_test.BatNest.bat:type_name -> lazy_extension_test.FlyingFox
	20, // [20:20] is the sub-list for method output_type
	20, // [20:20] is the sub-list for method input_type
	13, // [13:20] is the sub-list for extension type_name
	4,  // [4:13] is the sub-list for extension extendee
	0,  // [0:4] is the sub-list for field type_name
}

func init() { file_internal_testprotos_lazy_lazy_extension_test_proto_init() }
func file_internal_testprotos_lazy_lazy_extension_test_proto_init() {
	if File_internal_testprotos_lazy_lazy_extension_test_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[0].Exporter = func(v any, i int) any {
			switch v := v.(*Holder); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[1].Exporter = func(v any, i int) any {
			switch v := v.(*Rabbit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[2].Exporter = func(v any, i int) any {
			switch v := v.(*FlyingFox); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[3].Exporter = func(v any, i int) any {
			switch v := v.(*Tree); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			case 3:
				return &v.extensionFields
			default:
				return nil
			}
		}
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[4].Exporter = func(v any, i int) any {
			switch v := v.(*Pipistrelle); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[5].Exporter = func(v any, i int) any {
			switch v := v.(*Pipistrelles); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes[6].Exporter = func(v any, i int) any {
			switch v := v.(*BatNest); 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_internal_testprotos_lazy_lazy_extension_test_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   7,
			NumExtensions: 9,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_lazy_lazy_extension_test_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_lazy_lazy_extension_test_proto_depIdxs,
		EnumInfos:         file_internal_testprotos_lazy_lazy_extension_test_proto_enumTypes,
		MessageInfos:      file_internal_testprotos_lazy_lazy_extension_test_proto_msgTypes,
		ExtensionInfos:    file_internal_testprotos_lazy_lazy_extension_test_proto_extTypes,
	}.Build()
	File_internal_testprotos_lazy_lazy_extension_test_proto = out.File
	file_internal_testprotos_lazy_lazy_extension_test_proto_rawDesc = nil
	file_internal_testprotos_lazy_lazy_extension_test_proto_goTypes = nil
	file_internal_testprotos_lazy_lazy_extension_test_proto_depIdxs = nil
}
