// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.28.1
// 	protoc        v3.20.0
// source: api/mesh/v1alpha1/dynamic_config.proto

package v1alpha1

import (
	reflect "reflect"
	sync "sync"
)

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"

	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

import (
	_ "github.com/apache/dubbo-kubernetes/api/mesh"
)

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)
)

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

	Key           string            `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Scope         string            `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ConfigVersion string            `protobuf:"bytes,3,opt,name=configVersion,proto3" json:"configVersion,omitempty"`
	Enabled       bool              `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"`
	Configs       []*OverrideConfig `protobuf:"bytes,5,rep,name=configs,proto3" json:"configs,omitempty"`
}

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

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

func (*DynamicConfig) ProtoMessage() {}

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

func (x *DynamicConfig) GetKey() string {
	if x != nil {
		return x.Key
	}
	return ""
}

func (x *DynamicConfig) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *DynamicConfig) GetConfigVersion() string {
	if x != nil {
		return x.ConfigVersion
	}
	return ""
}

func (x *DynamicConfig) GetEnabled() bool {
	if x != nil {
		return x.Enabled
	}
	return false
}

func (x *DynamicConfig) GetConfigs() []*OverrideConfig {
	if x != nil {
		return x.Configs
	}
	return nil
}

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

	Side              string            `protobuf:"bytes,1,opt,name=side,proto3" json:"side,omitempty"`
	Addresses         []string          `protobuf:"bytes,2,rep,name=addresses,proto3" json:"addresses,omitempty"`
	ProviderAddresses []string          `protobuf:"bytes,3,rep,name=providerAddresses,proto3" json:"providerAddresses,omitempty"`
	Parameters        map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	Applications      []string          `protobuf:"bytes,5,rep,name=applications,proto3" json:"applications,omitempty"`
	Services          []string          `protobuf:"bytes,6,rep,name=services,proto3" json:"services,omitempty"`
	Type              string            `protobuf:"bytes,7,opt,name=type,proto3" json:"type,omitempty"`
	Enabled           bool              `protobuf:"varint,8,opt,name=enabled,proto3" json:"enabled,omitempty"`
	Match             *ConditionMatch   `protobuf:"bytes,9,opt,name=match,proto3" json:"match,omitempty"`
}

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

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

func (*OverrideConfig) ProtoMessage() {}

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

func (x *OverrideConfig) GetSide() string {
	if x != nil {
		return x.Side
	}
	return ""
}

func (x *OverrideConfig) GetAddresses() []string {
	if x != nil {
		return x.Addresses
	}
	return nil
}

func (x *OverrideConfig) GetProviderAddresses() []string {
	if x != nil {
		return x.ProviderAddresses
	}
	return nil
}

func (x *OverrideConfig) GetParameters() map[string]string {
	if x != nil {
		return x.Parameters
	}
	return nil
}

func (x *OverrideConfig) GetApplications() []string {
	if x != nil {
		return x.Applications
	}
	return nil
}

func (x *OverrideConfig) GetServices() []string {
	if x != nil {
		return x.Services
	}
	return nil
}

func (x *OverrideConfig) GetType() string {
	if x != nil {
		return x.Type
	}
	return ""
}

func (x *OverrideConfig) GetEnabled() bool {
	if x != nil {
		return x.Enabled
	}
	return false
}

func (x *OverrideConfig) GetMatch() *ConditionMatch {
	if x != nil {
		return x.Match
	}
	return nil
}

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

	Address     *AddressMatch    `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
	Service     *ListStringMatch `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"`
	Application *ListStringMatch `protobuf:"bytes,3,opt,name=application,proto3" json:"application,omitempty"`
	Param       []*ParamMatch    `protobuf:"bytes,4,rep,name=param,proto3" json:"param,omitempty"`
}

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

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

func (*ConditionMatch) ProtoMessage() {}

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

func (x *ConditionMatch) GetAddress() *AddressMatch {
	if x != nil {
		return x.Address
	}
	return nil
}

func (x *ConditionMatch) GetService() *ListStringMatch {
	if x != nil {
		return x.Service
	}
	return nil
}

func (x *ConditionMatch) GetApplication() *ListStringMatch {
	if x != nil {
		return x.Application
	}
	return nil
}

func (x *ConditionMatch) GetParam() []*ParamMatch {
	if x != nil {
		return x.Param
	}
	return nil
}

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

	Wildcard string `protobuf:"bytes,1,opt,name=wildcard,proto3" json:"wildcard,omitempty"`
	Cird     string `protobuf:"bytes,2,opt,name=cird,proto3" json:"cird,omitempty"`
	Exact    string `protobuf:"bytes,3,opt,name=exact,proto3" json:"exact,omitempty"`
}

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

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

func (*AddressMatch) ProtoMessage() {}

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

func (x *AddressMatch) GetWildcard() string {
	if x != nil {
		return x.Wildcard
	}
	return ""
}

func (x *AddressMatch) GetCird() string {
	if x != nil {
		return x.Cird
	}
	return ""
}

func (x *AddressMatch) GetExact() string {
	if x != nil {
		return x.Exact
	}
	return ""
}

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

	Oneof []*StringMatch `protobuf:"bytes,1,rep,name=oneof,proto3" json:"oneof,omitempty"`
}

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

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

func (*ListStringMatch) ProtoMessage() {}

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

func (x *ListStringMatch) GetOneof() []*StringMatch {
	if x != nil {
		return x.Oneof
	}
	return nil
}

var File_api_mesh_v1alpha1_dynamic_config_proto protoreflect.FileDescriptor

var file_api_mesh_v1alpha1_dynamic_config_proto_rawDesc = []byte{
	0x0a, 0x26, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70,
	0x68, 0x61, 0x31, 0x2f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e,
	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x16, 0x61,
	0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x68, 0x2f,
	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x61, 0x67, 0x5f, 0x72, 0x6f, 0x75,
	0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x02, 0x0a, 0x0d, 0x44, 0x79, 0x6e,
	0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
	0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f,
	0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62,
	0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x64, 0x12, 0x3d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x05, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x68,
	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
	0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x73, 0x3a, 0x7f, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x17, 0x0a, 0x15, 0x44, 0x79, 0x6e, 0x61, 0x6d,
	0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
	0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x0f, 0x12, 0x0d, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x06, 0x22, 0x04, 0x6d, 0x65, 0x73,
	0x68, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x04, 0x52, 0x02, 0x10, 0x01, 0xaa, 0x8c, 0x89, 0xa6, 0x01,
	0x11, 0x3a, 0x0f, 0x0a, 0x0d, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x12, 0x3a, 0x10, 0x12, 0x0e, 0x64, 0x79, 0x6e, 0x61,
	0x6d, 0x69, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0xaa, 0x8c, 0x89, 0xa6, 0x01, 0x02,
	0x68, 0x01, 0x22, 0xad, 0x03, 0x0a, 0x0e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x64, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64,
	0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64,
	0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69,
	0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72,
	0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74,
	0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x64, 0x75, 0x62, 0x62,
	0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
	0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50,
	0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a,
	0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70,
	0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x0c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a,
	0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79,
	0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18,
	0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63,
	0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e,
	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f,
	0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x6d, 0x61,
	0x74, 0x63, 0x68, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
	0x73, 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, 0x22, 0x8c, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
	0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x6d,
	0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64,
	0x72, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
	0x73, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x68,
	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74,
	0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69,
	0x63, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e,
	0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
	0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x0b, 0x61,
	0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x70, 0x61,
	0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x75, 0x62, 0x62,
	0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
	0x50, 0x61, 0x72, 0x61, 0x6d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x70, 0x61, 0x72, 0x61,
	0x6d, 0x22, 0x54, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4d, 0x61, 0x74, 0x63,
	0x68, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a,
	0x04, 0x63, 0x69, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x72,
	0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x05, 0x65, 0x78, 0x61, 0x63, 0x74, 0x22, 0x49, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x53,
	0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x6f, 0x6e,
	0x65, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x75, 0x62, 0x62,
	0x6f, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x6f, 0x6e, 0x65,
	0x6f, 0x66, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
	0x2f, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2d, 0x6b, 0x75,
	0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73,
	0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x33,
}

var (
	file_api_mesh_v1alpha1_dynamic_config_proto_rawDescOnce sync.Once
	file_api_mesh_v1alpha1_dynamic_config_proto_rawDescData = file_api_mesh_v1alpha1_dynamic_config_proto_rawDesc
)

func file_api_mesh_v1alpha1_dynamic_config_proto_rawDescGZIP() []byte {
	file_api_mesh_v1alpha1_dynamic_config_proto_rawDescOnce.Do(func() {
		file_api_mesh_v1alpha1_dynamic_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_mesh_v1alpha1_dynamic_config_proto_rawDescData)
	})
	return file_api_mesh_v1alpha1_dynamic_config_proto_rawDescData
}

var file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_api_mesh_v1alpha1_dynamic_config_proto_goTypes = []interface{}{
	(*DynamicConfig)(nil),   // 0: dubbo.mesh.v1alpha1.DynamicConfig
	(*OverrideConfig)(nil),  // 1: dubbo.mesh.v1alpha1.OverrideConfig
	(*ConditionMatch)(nil),  // 2: dubbo.mesh.v1alpha1.ConditionMatch
	(*AddressMatch)(nil),    // 3: dubbo.mesh.v1alpha1.AddressMatch
	(*ListStringMatch)(nil), // 4: dubbo.mesh.v1alpha1.ListStringMatch
	nil,                     // 5: dubbo.mesh.v1alpha1.OverrideConfig.ParametersEntry
	(*ParamMatch)(nil),      // 6: dubbo.mesh.v1alpha1.ParamMatch
	(*StringMatch)(nil),     // 7: dubbo.mesh.v1alpha1.StringMatch
}
var file_api_mesh_v1alpha1_dynamic_config_proto_depIdxs = []int32{
	1, // 0: dubbo.mesh.v1alpha1.DynamicConfig.configs:type_name -> dubbo.mesh.v1alpha1.OverrideConfig
	5, // 1: dubbo.mesh.v1alpha1.OverrideConfig.parameters:type_name -> dubbo.mesh.v1alpha1.OverrideConfig.ParametersEntry
	2, // 2: dubbo.mesh.v1alpha1.OverrideConfig.match:type_name -> dubbo.mesh.v1alpha1.ConditionMatch
	3, // 3: dubbo.mesh.v1alpha1.ConditionMatch.address:type_name -> dubbo.mesh.v1alpha1.AddressMatch
	4, // 4: dubbo.mesh.v1alpha1.ConditionMatch.service:type_name -> dubbo.mesh.v1alpha1.ListStringMatch
	4, // 5: dubbo.mesh.v1alpha1.ConditionMatch.application:type_name -> dubbo.mesh.v1alpha1.ListStringMatch
	6, // 6: dubbo.mesh.v1alpha1.ConditionMatch.param:type_name -> dubbo.mesh.v1alpha1.ParamMatch
	7, // 7: dubbo.mesh.v1alpha1.ListStringMatch.oneof:type_name -> dubbo.mesh.v1alpha1.StringMatch
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	8, // [8:8] is the sub-list for extension type_name
	8, // [8:8] is the sub-list for extension extendee
	0, // [0:8] is the sub-list for field type_name
}

func init() { file_api_mesh_v1alpha1_dynamic_config_proto_init() }
func file_api_mesh_v1alpha1_dynamic_config_proto_init() {
	if File_api_mesh_v1alpha1_dynamic_config_proto != nil {
		return
	}
	file_api_mesh_v1alpha1_tag_route_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DynamicConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*OverrideConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ConditionMatch); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AddressMatch); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListStringMatch); 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_api_mesh_v1alpha1_dynamic_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   6,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_api_mesh_v1alpha1_dynamic_config_proto_goTypes,
		DependencyIndexes: file_api_mesh_v1alpha1_dynamic_config_proto_depIdxs,
		MessageInfos:      file_api_mesh_v1alpha1_dynamic_config_proto_msgTypes,
	}.Build()
	File_api_mesh_v1alpha1_dynamic_config_proto = out.File
	file_api_mesh_v1alpha1_dynamic_config_proto_rawDesc = nil
	file_api_mesh_v1alpha1_dynamic_config_proto_goTypes = nil
	file_api_mesh_v1alpha1_dynamic_config_proto_depIdxs = nil
}
