// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/openflow_13.proto

package openflow_13

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

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

// Port numbering. Ports are numbered starting from 1.
type OfpPortNo int32

const (
	OfpPortNo_OFPP_INVALID OfpPortNo = 0
	// Maximum number of physical and logical switch ports.
	OfpPortNo_OFPP_MAX OfpPortNo = 2147483392
	// Reserved OpenFlow Port (fake output "ports").
	OfpPortNo_OFPP_IN_PORT    OfpPortNo = 2147483640
	OfpPortNo_OFPP_TABLE      OfpPortNo = 2147483641
	OfpPortNo_OFPP_NORMAL     OfpPortNo = 2147483642
	OfpPortNo_OFPP_FLOOD      OfpPortNo = 2147483643
	OfpPortNo_OFPP_ALL        OfpPortNo = 2147483644
	OfpPortNo_OFPP_CONTROLLER OfpPortNo = 2147483645
	OfpPortNo_OFPP_LOCAL      OfpPortNo = 2147483646
	OfpPortNo_OFPP_ANY        OfpPortNo = 2147483647
)

var OfpPortNo_name = map[int32]string{
	0:          "OFPP_INVALID",
	2147483392: "OFPP_MAX",
	2147483640: "OFPP_IN_PORT",
	2147483641: "OFPP_TABLE",
	2147483642: "OFPP_NORMAL",
	2147483643: "OFPP_FLOOD",
	2147483644: "OFPP_ALL",
	2147483645: "OFPP_CONTROLLER",
	2147483646: "OFPP_LOCAL",
	2147483647: "OFPP_ANY",
}

var OfpPortNo_value = map[string]int32{
	"OFPP_INVALID":    0,
	"OFPP_MAX":        2147483392,
	"OFPP_IN_PORT":    2147483640,
	"OFPP_TABLE":      2147483641,
	"OFPP_NORMAL":     2147483642,
	"OFPP_FLOOD":      2147483643,
	"OFPP_ALL":        2147483644,
	"OFPP_CONTROLLER": 2147483645,
	"OFPP_LOCAL":      2147483646,
	"OFPP_ANY":        2147483647,
}

func (x OfpPortNo) String() string {
	return proto.EnumName(OfpPortNo_name, int32(x))
}

func (OfpPortNo) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{0}
}

type OfpType int32

const (
	// Immutable messages.
	OfpType_OFPT_HELLO        OfpType = 0
	OfpType_OFPT_ERROR        OfpType = 1
	OfpType_OFPT_ECHO_REQUEST OfpType = 2
	OfpType_OFPT_ECHO_REPLY   OfpType = 3
	OfpType_OFPT_EXPERIMENTER OfpType = 4
	// Switch configuration messages.
	OfpType_OFPT_FEATURES_REQUEST   OfpType = 5
	OfpType_OFPT_FEATURES_REPLY     OfpType = 6
	OfpType_OFPT_GET_CONFIG_REQUEST OfpType = 7
	OfpType_OFPT_GET_CONFIG_REPLY   OfpType = 8
	OfpType_OFPT_SET_CONFIG         OfpType = 9
	// Asynchronous messages.
	OfpType_OFPT_PACKET_IN    OfpType = 10
	OfpType_OFPT_FLOW_REMOVED OfpType = 11
	OfpType_OFPT_PORT_STATUS  OfpType = 12
	// Controller command messages.
	OfpType_OFPT_PACKET_OUT OfpType = 13
	OfpType_OFPT_FLOW_MOD   OfpType = 14
	OfpType_OFPT_GROUP_MOD  OfpType = 15
	OfpType_OFPT_PORT_MOD   OfpType = 16
	OfpType_OFPT_TABLE_MOD  OfpType = 17
	// Multipart messages.
	OfpType_OFPT_MULTIPART_REQUEST OfpType = 18
	OfpType_OFPT_MULTIPART_REPLY   OfpType = 19
	// Barrier messages.
	OfpType_OFPT_BARRIER_REQUEST OfpType = 20
	OfpType_OFPT_BARRIER_REPLY   OfpType = 21
	// Queue Configuration messages.
	OfpType_OFPT_QUEUE_GET_CONFIG_REQUEST OfpType = 22
	OfpType_OFPT_QUEUE_GET_CONFIG_REPLY   OfpType = 23
	// Controller role change request messages.
	OfpType_OFPT_ROLE_REQUEST OfpType = 24
	OfpType_OFPT_ROLE_REPLY   OfpType = 25
	// Asynchronous message configuration.
	OfpType_OFPT_GET_ASYNC_REQUEST OfpType = 26
	OfpType_OFPT_GET_ASYNC_REPLY   OfpType = 27
	OfpType_OFPT_SET_ASYNC         OfpType = 28
	// Meters and rate limiters configuration messages.
	OfpType_OFPT_METER_MOD OfpType = 29
)

var OfpType_name = map[int32]string{
	0:  "OFPT_HELLO",
	1:  "OFPT_ERROR",
	2:  "OFPT_ECHO_REQUEST",
	3:  "OFPT_ECHO_REPLY",
	4:  "OFPT_EXPERIMENTER",
	5:  "OFPT_FEATURES_REQUEST",
	6:  "OFPT_FEATURES_REPLY",
	7:  "OFPT_GET_CONFIG_REQUEST",
	8:  "OFPT_GET_CONFIG_REPLY",
	9:  "OFPT_SET_CONFIG",
	10: "OFPT_PACKET_IN",
	11: "OFPT_FLOW_REMOVED",
	12: "OFPT_PORT_STATUS",
	13: "OFPT_PACKET_OUT",
	14: "OFPT_FLOW_MOD",
	15: "OFPT_GROUP_MOD",
	16: "OFPT_PORT_MOD",
	17: "OFPT_TABLE_MOD",
	18: "OFPT_MULTIPART_REQUEST",
	19: "OFPT_MULTIPART_REPLY",
	20: "OFPT_BARRIER_REQUEST",
	21: "OFPT_BARRIER_REPLY",
	22: "OFPT_QUEUE_GET_CONFIG_REQUEST",
	23: "OFPT_QUEUE_GET_CONFIG_REPLY",
	24: "OFPT_ROLE_REQUEST",
	25: "OFPT_ROLE_REPLY",
	26: "OFPT_GET_ASYNC_REQUEST",
	27: "OFPT_GET_ASYNC_REPLY",
	28: "OFPT_SET_ASYNC",
	29: "OFPT_METER_MOD",
}

var OfpType_value = map[string]int32{
	"OFPT_HELLO":                    0,
	"OFPT_ERROR":                    1,
	"OFPT_ECHO_REQUEST":             2,
	"OFPT_ECHO_REPLY":               3,
	"OFPT_EXPERIMENTER":             4,
	"OFPT_FEATURES_REQUEST":         5,
	"OFPT_FEATURES_REPLY":           6,
	"OFPT_GET_CONFIG_REQUEST":       7,
	"OFPT_GET_CONFIG_REPLY":         8,
	"OFPT_SET_CONFIG":               9,
	"OFPT_PACKET_IN":                10,
	"OFPT_FLOW_REMOVED":             11,
	"OFPT_PORT_STATUS":              12,
	"OFPT_PACKET_OUT":               13,
	"OFPT_FLOW_MOD":                 14,
	"OFPT_GROUP_MOD":                15,
	"OFPT_PORT_MOD":                 16,
	"OFPT_TABLE_MOD":                17,
	"OFPT_MULTIPART_REQUEST":        18,
	"OFPT_MULTIPART_REPLY":          19,
	"OFPT_BARRIER_REQUEST":          20,
	"OFPT_BARRIER_REPLY":            21,
	"OFPT_QUEUE_GET_CONFIG_REQUEST": 22,
	"OFPT_QUEUE_GET_CONFIG_REPLY":   23,
	"OFPT_ROLE_REQUEST":             24,
	"OFPT_ROLE_REPLY":               25,
	"OFPT_GET_ASYNC_REQUEST":        26,
	"OFPT_GET_ASYNC_REPLY":          27,
	"OFPT_SET_ASYNC":                28,
	"OFPT_METER_MOD":                29,
}

func (x OfpType) String() string {
	return proto.EnumName(OfpType_name, int32(x))
}

func (OfpType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{1}
}

// Hello elements types.
type OfpHelloElemType int32

const (
	OfpHelloElemType_OFPHET_INVALID       OfpHelloElemType = 0
	OfpHelloElemType_OFPHET_VERSIONBITMAP OfpHelloElemType = 1
)

var OfpHelloElemType_name = map[int32]string{
	0: "OFPHET_INVALID",
	1: "OFPHET_VERSIONBITMAP",
}

var OfpHelloElemType_value = map[string]int32{
	"OFPHET_INVALID":       0,
	"OFPHET_VERSIONBITMAP": 1,
}

func (x OfpHelloElemType) String() string {
	return proto.EnumName(OfpHelloElemType_name, int32(x))
}

func (OfpHelloElemType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{2}
}

type OfpConfigFlags int32

const (
	// Handling of IP fragments.
	OfpConfigFlags_OFPC_FRAG_NORMAL OfpConfigFlags = 0
	OfpConfigFlags_OFPC_FRAG_DROP   OfpConfigFlags = 1
	OfpConfigFlags_OFPC_FRAG_REASM  OfpConfigFlags = 2
	OfpConfigFlags_OFPC_FRAG_MASK   OfpConfigFlags = 3
)

var OfpConfigFlags_name = map[int32]string{
	0: "OFPC_FRAG_NORMAL",
	1: "OFPC_FRAG_DROP",
	2: "OFPC_FRAG_REASM",
	3: "OFPC_FRAG_MASK",
}

var OfpConfigFlags_value = map[string]int32{
	"OFPC_FRAG_NORMAL": 0,
	"OFPC_FRAG_DROP":   1,
	"OFPC_FRAG_REASM":  2,
	"OFPC_FRAG_MASK":   3,
}

func (x OfpConfigFlags) String() string {
	return proto.EnumName(OfpConfigFlags_name, int32(x))
}

func (OfpConfigFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{3}
}

// Flags to configure the table. Reserved for future use.
type OfpTableConfig int32

const (
	OfpTableConfig_OFPTC_INVALID         OfpTableConfig = 0
	OfpTableConfig_OFPTC_DEPRECATED_MASK OfpTableConfig = 3
)

var OfpTableConfig_name = map[int32]string{
	0: "OFPTC_INVALID",
	3: "OFPTC_DEPRECATED_MASK",
}

var OfpTableConfig_value = map[string]int32{
	"OFPTC_INVALID":         0,
	"OFPTC_DEPRECATED_MASK": 3,
}

func (x OfpTableConfig) String() string {
	return proto.EnumName(OfpTableConfig_name, int32(x))
}

func (OfpTableConfig) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{4}
}

// Table numbering. Tables can use any number up to OFPT_MAX.
type OfpTable int32

const (
	OfpTable_OFPTT_INVALID OfpTable = 0
	// Last usable table number.
	OfpTable_OFPTT_MAX OfpTable = 254
	// Fake tables.
	OfpTable_OFPTT_ALL OfpTable = 255
)

var OfpTable_name = map[int32]string{
	0:   "OFPTT_INVALID",
	254: "OFPTT_MAX",
	255: "OFPTT_ALL",
}

var OfpTable_value = map[string]int32{
	"OFPTT_INVALID": 0,
	"OFPTT_MAX":     254,
	"OFPTT_ALL":     255,
}

func (x OfpTable) String() string {
	return proto.EnumName(OfpTable_name, int32(x))
}

func (OfpTable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{5}
}

// Capabilities supported by the datapath.
type OfpCapabilities int32

const (
	OfpCapabilities_OFPC_INVALID      OfpCapabilities = 0
	OfpCapabilities_OFPC_FLOW_STATS   OfpCapabilities = 1
	OfpCapabilities_OFPC_TABLE_STATS  OfpCapabilities = 2
	OfpCapabilities_OFPC_PORT_STATS   OfpCapabilities = 4
	OfpCapabilities_OFPC_GROUP_STATS  OfpCapabilities = 8
	OfpCapabilities_OFPC_IP_REASM     OfpCapabilities = 32
	OfpCapabilities_OFPC_QUEUE_STATS  OfpCapabilities = 64
	OfpCapabilities_OFPC_PORT_BLOCKED OfpCapabilities = 256
)

var OfpCapabilities_name = map[int32]string{
	0:   "OFPC_INVALID",
	1:   "OFPC_FLOW_STATS",
	2:   "OFPC_TABLE_STATS",
	4:   "OFPC_PORT_STATS",
	8:   "OFPC_GROUP_STATS",
	32:  "OFPC_IP_REASM",
	64:  "OFPC_QUEUE_STATS",
	256: "OFPC_PORT_BLOCKED",
}

var OfpCapabilities_value = map[string]int32{
	"OFPC_INVALID":      0,
	"OFPC_FLOW_STATS":   1,
	"OFPC_TABLE_STATS":  2,
	"OFPC_PORT_STATS":   4,
	"OFPC_GROUP_STATS":  8,
	"OFPC_IP_REASM":     32,
	"OFPC_QUEUE_STATS":  64,
	"OFPC_PORT_BLOCKED": 256,
}

func (x OfpCapabilities) String() string {
	return proto.EnumName(OfpCapabilities_name, int32(x))
}

func (OfpCapabilities) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{6}
}

// Flags to indicate behavior of the physical port.  These flags are
// used in ofp_port to describe the current configuration.  They are
// used in the ofp_port_mod message to configure the port's behavior.
type OfpPortConfig int32

const (
	OfpPortConfig_OFPPC_INVALID      OfpPortConfig = 0
	OfpPortConfig_OFPPC_PORT_DOWN    OfpPortConfig = 1
	OfpPortConfig_OFPPC_NO_RECV      OfpPortConfig = 4
	OfpPortConfig_OFPPC_NO_FWD       OfpPortConfig = 32
	OfpPortConfig_OFPPC_NO_PACKET_IN OfpPortConfig = 64
)

var OfpPortConfig_name = map[int32]string{
	0:  "OFPPC_INVALID",
	1:  "OFPPC_PORT_DOWN",
	4:  "OFPPC_NO_RECV",
	32: "OFPPC_NO_FWD",
	64: "OFPPC_NO_PACKET_IN",
}

var OfpPortConfig_value = map[string]int32{
	"OFPPC_INVALID":      0,
	"OFPPC_PORT_DOWN":    1,
	"OFPPC_NO_RECV":      4,
	"OFPPC_NO_FWD":       32,
	"OFPPC_NO_PACKET_IN": 64,
}

func (x OfpPortConfig) String() string {
	return proto.EnumName(OfpPortConfig_name, int32(x))
}

func (OfpPortConfig) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{7}
}

// Current state of the physical port.  These are not configurable from
// the controller.
type OfpPortState int32

const (
	OfpPortState_OFPPS_INVALID   OfpPortState = 0
	OfpPortState_OFPPS_LINK_DOWN OfpPortState = 1
	OfpPortState_OFPPS_BLOCKED   OfpPortState = 2
	OfpPortState_OFPPS_LIVE      OfpPortState = 4
)

var OfpPortState_name = map[int32]string{
	0: "OFPPS_INVALID",
	1: "OFPPS_LINK_DOWN",
	2: "OFPPS_BLOCKED",
	4: "OFPPS_LIVE",
}

var OfpPortState_value = map[string]int32{
	"OFPPS_INVALID":   0,
	"OFPPS_LINK_DOWN": 1,
	"OFPPS_BLOCKED":   2,
	"OFPPS_LIVE":      4,
}

func (x OfpPortState) String() string {
	return proto.EnumName(OfpPortState_name, int32(x))
}

func (OfpPortState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{8}
}

// Features of ports available in a datapath.
type OfpPortFeatures int32

const (
	OfpPortFeatures_OFPPF_INVALID    OfpPortFeatures = 0
	OfpPortFeatures_OFPPF_10MB_HD    OfpPortFeatures = 1
	OfpPortFeatures_OFPPF_10MB_FD    OfpPortFeatures = 2
	OfpPortFeatures_OFPPF_100MB_HD   OfpPortFeatures = 4
	OfpPortFeatures_OFPPF_100MB_FD   OfpPortFeatures = 8
	OfpPortFeatures_OFPPF_1GB_HD     OfpPortFeatures = 16
	OfpPortFeatures_OFPPF_1GB_FD     OfpPortFeatures = 32
	OfpPortFeatures_OFPPF_10GB_FD    OfpPortFeatures = 64
	OfpPortFeatures_OFPPF_40GB_FD    OfpPortFeatures = 128
	OfpPortFeatures_OFPPF_100GB_FD   OfpPortFeatures = 256
	OfpPortFeatures_OFPPF_1TB_FD     OfpPortFeatures = 512
	OfpPortFeatures_OFPPF_OTHER      OfpPortFeatures = 1024
	OfpPortFeatures_OFPPF_COPPER     OfpPortFeatures = 2048
	OfpPortFeatures_OFPPF_FIBER      OfpPortFeatures = 4096
	OfpPortFeatures_OFPPF_AUTONEG    OfpPortFeatures = 8192
	OfpPortFeatures_OFPPF_PAUSE      OfpPortFeatures = 16384
	OfpPortFeatures_OFPPF_PAUSE_ASYM OfpPortFeatures = 32768
)

var OfpPortFeatures_name = map[int32]string{
	0:     "OFPPF_INVALID",
	1:     "OFPPF_10MB_HD",
	2:     "OFPPF_10MB_FD",
	4:     "OFPPF_100MB_HD",
	8:     "OFPPF_100MB_FD",
	16:    "OFPPF_1GB_HD",
	32:    "OFPPF_1GB_FD",
	64:    "OFPPF_10GB_FD",
	128:   "OFPPF_40GB_FD",
	256:   "OFPPF_100GB_FD",
	512:   "OFPPF_1TB_FD",
	1024:  "OFPPF_OTHER",
	2048:  "OFPPF_COPPER",
	4096:  "OFPPF_FIBER",
	8192:  "OFPPF_AUTONEG",
	16384: "OFPPF_PAUSE",
	32768: "OFPPF_PAUSE_ASYM",
}

var OfpPortFeatures_value = map[string]int32{
	"OFPPF_INVALID":    0,
	"OFPPF_10MB_HD":    1,
	"OFPPF_10MB_FD":    2,
	"OFPPF_100MB_HD":   4,
	"OFPPF_100MB_FD":   8,
	"OFPPF_1GB_HD":     16,
	"OFPPF_1GB_FD":     32,
	"OFPPF_10GB_FD":    64,
	"OFPPF_40GB_FD":    128,
	"OFPPF_100GB_FD":   256,
	"OFPPF_1TB_FD":     512,
	"OFPPF_OTHER":      1024,
	"OFPPF_COPPER":     2048,
	"OFPPF_FIBER":      4096,
	"OFPPF_AUTONEG":    8192,
	"OFPPF_PAUSE":      16384,
	"OFPPF_PAUSE_ASYM": 32768,
}

func (x OfpPortFeatures) String() string {
	return proto.EnumName(OfpPortFeatures_name, int32(x))
}

func (OfpPortFeatures) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{9}
}

// What changed about the physical port
type OfpPortReason int32

const (
	OfpPortReason_OFPPR_ADD    OfpPortReason = 0
	OfpPortReason_OFPPR_DELETE OfpPortReason = 1
	OfpPortReason_OFPPR_MODIFY OfpPortReason = 2
)

var OfpPortReason_name = map[int32]string{
	0: "OFPPR_ADD",
	1: "OFPPR_DELETE",
	2: "OFPPR_MODIFY",
}

var OfpPortReason_value = map[string]int32{
	"OFPPR_ADD":    0,
	"OFPPR_DELETE": 1,
	"OFPPR_MODIFY": 2,
}

func (x OfpPortReason) String() string {
	return proto.EnumName(OfpPortReason_name, int32(x))
}

func (OfpPortReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{10}
}

// The match type indicates the match structure (set of fields that compose the
// match) in use. The match type is placed in the type field at the beginning
// of all match structures. The "OpenFlow Extensible Match" type corresponds
// to OXM TLV format described below and must be supported by all OpenFlow
// switches. Extensions that define other match types may be published on the
// ONF wiki. Support for extensions is optional.
type OfpMatchType int32

const (
	OfpMatchType_OFPMT_STANDARD OfpMatchType = 0
	OfpMatchType_OFPMT_OXM      OfpMatchType = 1
)

var OfpMatchType_name = map[int32]string{
	0: "OFPMT_STANDARD",
	1: "OFPMT_OXM",
}

var OfpMatchType_value = map[string]int32{
	"OFPMT_STANDARD": 0,
	"OFPMT_OXM":      1,
}

func (x OfpMatchType) String() string {
	return proto.EnumName(OfpMatchType_name, int32(x))
}

func (OfpMatchType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{11}
}

// OXM Class IDs.
// The high order bit differentiate reserved classes from member classes.
// Classes 0x0000 to 0x7FFF are member classes, allocated by ONF.
// Classes 0x8000 to 0xFFFE are reserved classes, reserved for standardisation.
type OfpOxmClass int32

const (
	OfpOxmClass_OFPXMC_NXM_0          OfpOxmClass = 0
	OfpOxmClass_OFPXMC_NXM_1          OfpOxmClass = 1
	OfpOxmClass_OFPXMC_OPENFLOW_BASIC OfpOxmClass = 32768
	OfpOxmClass_OFPXMC_EXPERIMENTER   OfpOxmClass = 65535
)

var OfpOxmClass_name = map[int32]string{
	0:     "OFPXMC_NXM_0",
	1:     "OFPXMC_NXM_1",
	32768: "OFPXMC_OPENFLOW_BASIC",
	65535: "OFPXMC_EXPERIMENTER",
}

var OfpOxmClass_value = map[string]int32{
	"OFPXMC_NXM_0":          0,
	"OFPXMC_NXM_1":          1,
	"OFPXMC_OPENFLOW_BASIC": 32768,
	"OFPXMC_EXPERIMENTER":   65535,
}

func (x OfpOxmClass) String() string {
	return proto.EnumName(OfpOxmClass_name, int32(x))
}

func (OfpOxmClass) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{12}
}

// OXM Flow field types for OpenFlow basic class.
type OxmOfbFieldTypes int32

const (
	OxmOfbFieldTypes_OFPXMT_OFB_IN_PORT        OxmOfbFieldTypes = 0
	OxmOfbFieldTypes_OFPXMT_OFB_IN_PHY_PORT    OxmOfbFieldTypes = 1
	OxmOfbFieldTypes_OFPXMT_OFB_METADATA       OxmOfbFieldTypes = 2
	OxmOfbFieldTypes_OFPXMT_OFB_ETH_DST        OxmOfbFieldTypes = 3
	OxmOfbFieldTypes_OFPXMT_OFB_ETH_SRC        OxmOfbFieldTypes = 4
	OxmOfbFieldTypes_OFPXMT_OFB_ETH_TYPE       OxmOfbFieldTypes = 5
	OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID       OxmOfbFieldTypes = 6
	OxmOfbFieldTypes_OFPXMT_OFB_VLAN_PCP       OxmOfbFieldTypes = 7
	OxmOfbFieldTypes_OFPXMT_OFB_IP_DSCP        OxmOfbFieldTypes = 8
	OxmOfbFieldTypes_OFPXMT_OFB_IP_ECN         OxmOfbFieldTypes = 9
	OxmOfbFieldTypes_OFPXMT_OFB_IP_PROTO       OxmOfbFieldTypes = 10
	OxmOfbFieldTypes_OFPXMT_OFB_IPV4_SRC       OxmOfbFieldTypes = 11
	OxmOfbFieldTypes_OFPXMT_OFB_IPV4_DST       OxmOfbFieldTypes = 12
	OxmOfbFieldTypes_OFPXMT_OFB_TCP_SRC        OxmOfbFieldTypes = 13
	OxmOfbFieldTypes_OFPXMT_OFB_TCP_DST        OxmOfbFieldTypes = 14
	OxmOfbFieldTypes_OFPXMT_OFB_UDP_SRC        OxmOfbFieldTypes = 15
	OxmOfbFieldTypes_OFPXMT_OFB_UDP_DST        OxmOfbFieldTypes = 16
	OxmOfbFieldTypes_OFPXMT_OFB_SCTP_SRC       OxmOfbFieldTypes = 17
	OxmOfbFieldTypes_OFPXMT_OFB_SCTP_DST       OxmOfbFieldTypes = 18
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV4_TYPE    OxmOfbFieldTypes = 19
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV4_CODE    OxmOfbFieldTypes = 20
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_OP         OxmOfbFieldTypes = 21
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_SPA        OxmOfbFieldTypes = 22
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_TPA        OxmOfbFieldTypes = 23
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_SHA        OxmOfbFieldTypes = 24
	OxmOfbFieldTypes_OFPXMT_OFB_ARP_THA        OxmOfbFieldTypes = 25
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_SRC       OxmOfbFieldTypes = 26
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_DST       OxmOfbFieldTypes = 27
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_FLABEL    OxmOfbFieldTypes = 28
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV6_TYPE    OxmOfbFieldTypes = 29
	OxmOfbFieldTypes_OFPXMT_OFB_ICMPV6_CODE    OxmOfbFieldTypes = 30
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_ND_TARGET OxmOfbFieldTypes = 31
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_ND_SLL    OxmOfbFieldTypes = 32
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_ND_TLL    OxmOfbFieldTypes = 33
	OxmOfbFieldTypes_OFPXMT_OFB_MPLS_LABEL     OxmOfbFieldTypes = 34
	OxmOfbFieldTypes_OFPXMT_OFB_MPLS_TC        OxmOfbFieldTypes = 35
	OxmOfbFieldTypes_OFPXMT_OFB_MPLS_BOS       OxmOfbFieldTypes = 36
	OxmOfbFieldTypes_OFPXMT_OFB_PBB_ISID       OxmOfbFieldTypes = 37
	OxmOfbFieldTypes_OFPXMT_OFB_TUNNEL_ID      OxmOfbFieldTypes = 38
	OxmOfbFieldTypes_OFPXMT_OFB_IPV6_EXTHDR    OxmOfbFieldTypes = 39
)

var OxmOfbFieldTypes_name = map[int32]string{
	0:  "OFPXMT_OFB_IN_PORT",
	1:  "OFPXMT_OFB_IN_PHY_PORT",
	2:  "OFPXMT_OFB_METADATA",
	3:  "OFPXMT_OFB_ETH_DST",
	4:  "OFPXMT_OFB_ETH_SRC",
	5:  "OFPXMT_OFB_ETH_TYPE",
	6:  "OFPXMT_OFB_VLAN_VID",
	7:  "OFPXMT_OFB_VLAN_PCP",
	8:  "OFPXMT_OFB_IP_DSCP",
	9:  "OFPXMT_OFB_IP_ECN",
	10: "OFPXMT_OFB_IP_PROTO",
	11: "OFPXMT_OFB_IPV4_SRC",
	12: "OFPXMT_OFB_IPV4_DST",
	13: "OFPXMT_OFB_TCP_SRC",
	14: "OFPXMT_OFB_TCP_DST",
	15: "OFPXMT_OFB_UDP_SRC",
	16: "OFPXMT_OFB_UDP_DST",
	17: "OFPXMT_OFB_SCTP_SRC",
	18: "OFPXMT_OFB_SCTP_DST",
	19: "OFPXMT_OFB_ICMPV4_TYPE",
	20: "OFPXMT_OFB_ICMPV4_CODE",
	21: "OFPXMT_OFB_ARP_OP",
	22: "OFPXMT_OFB_ARP_SPA",
	23: "OFPXMT_OFB_ARP_TPA",
	24: "OFPXMT_OFB_ARP_SHA",
	25: "OFPXMT_OFB_ARP_THA",
	26: "OFPXMT_OFB_IPV6_SRC",
	27: "OFPXMT_OFB_IPV6_DST",
	28: "OFPXMT_OFB_IPV6_FLABEL",
	29: "OFPXMT_OFB_ICMPV6_TYPE",
	30: "OFPXMT_OFB_ICMPV6_CODE",
	31: "OFPXMT_OFB_IPV6_ND_TARGET",
	32: "OFPXMT_OFB_IPV6_ND_SLL",
	33: "OFPXMT_OFB_IPV6_ND_TLL",
	34: "OFPXMT_OFB_MPLS_LABEL",
	35: "OFPXMT_OFB_MPLS_TC",
	36: "OFPXMT_OFB_MPLS_BOS",
	37: "OFPXMT_OFB_PBB_ISID",
	38: "OFPXMT_OFB_TUNNEL_ID",
	39: "OFPXMT_OFB_IPV6_EXTHDR",
}

var OxmOfbFieldTypes_value = map[string]int32{
	"OFPXMT_OFB_IN_PORT":        0,
	"OFPXMT_OFB_IN_PHY_PORT":    1,
	"OFPXMT_OFB_METADATA":       2,
	"OFPXMT_OFB_ETH_DST":        3,
	"OFPXMT_OFB_ETH_SRC":        4,
	"OFPXMT_OFB_ETH_TYPE":       5,
	"OFPXMT_OFB_VLAN_VID":       6,
	"OFPXMT_OFB_VLAN_PCP":       7,
	"OFPXMT_OFB_IP_DSCP":        8,
	"OFPXMT_OFB_IP_ECN":         9,
	"OFPXMT_OFB_IP_PROTO":       10,
	"OFPXMT_OFB_IPV4_SRC":       11,
	"OFPXMT_OFB_IPV4_DST":       12,
	"OFPXMT_OFB_TCP_SRC":        13,
	"OFPXMT_OFB_TCP_DST":        14,
	"OFPXMT_OFB_UDP_SRC":        15,
	"OFPXMT_OFB_UDP_DST":        16,
	"OFPXMT_OFB_SCTP_SRC":       17,
	"OFPXMT_OFB_SCTP_DST":       18,
	"OFPXMT_OFB_ICMPV4_TYPE":    19,
	"OFPXMT_OFB_ICMPV4_CODE":    20,
	"OFPXMT_OFB_ARP_OP":         21,
	"OFPXMT_OFB_ARP_SPA":        22,
	"OFPXMT_OFB_ARP_TPA":        23,
	"OFPXMT_OFB_ARP_SHA":        24,
	"OFPXMT_OFB_ARP_THA":        25,
	"OFPXMT_OFB_IPV6_SRC":       26,
	"OFPXMT_OFB_IPV6_DST":       27,
	"OFPXMT_OFB_IPV6_FLABEL":    28,
	"OFPXMT_OFB_ICMPV6_TYPE":    29,
	"OFPXMT_OFB_ICMPV6_CODE":    30,
	"OFPXMT_OFB_IPV6_ND_TARGET": 31,
	"OFPXMT_OFB_IPV6_ND_SLL":    32,
	"OFPXMT_OFB_IPV6_ND_TLL":    33,
	"OFPXMT_OFB_MPLS_LABEL":     34,
	"OFPXMT_OFB_MPLS_TC":        35,
	"OFPXMT_OFB_MPLS_BOS":       36,
	"OFPXMT_OFB_PBB_ISID":       37,
	"OFPXMT_OFB_TUNNEL_ID":      38,
	"OFPXMT_OFB_IPV6_EXTHDR":    39,
}

func (x OxmOfbFieldTypes) String() string {
	return proto.EnumName(OxmOfbFieldTypes_name, int32(x))
}

func (OxmOfbFieldTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{13}
}

// The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
// special conditions.
type OfpVlanId int32

const (
	OfpVlanId_OFPVID_NONE    OfpVlanId = 0
	OfpVlanId_OFPVID_PRESENT OfpVlanId = 4096
)

var OfpVlanId_name = map[int32]string{
	0:    "OFPVID_NONE",
	4096: "OFPVID_PRESENT",
}

var OfpVlanId_value = map[string]int32{
	"OFPVID_NONE":    0,
	"OFPVID_PRESENT": 4096,
}

func (x OfpVlanId) String() string {
	return proto.EnumName(OfpVlanId_name, int32(x))
}

func (OfpVlanId) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{14}
}

// Bit definitions for IPv6 Extension Header pseudo-field.
type OfpIpv6ExthdrFlags int32

const (
	OfpIpv6ExthdrFlags_OFPIEH_INVALID OfpIpv6ExthdrFlags = 0
	OfpIpv6ExthdrFlags_OFPIEH_NONEXT  OfpIpv6ExthdrFlags = 1
	OfpIpv6ExthdrFlags_OFPIEH_ESP     OfpIpv6ExthdrFlags = 2
	OfpIpv6ExthdrFlags_OFPIEH_AUTH    OfpIpv6ExthdrFlags = 4
	OfpIpv6ExthdrFlags_OFPIEH_DEST    OfpIpv6ExthdrFlags = 8
	OfpIpv6ExthdrFlags_OFPIEH_FRAG    OfpIpv6ExthdrFlags = 16
	OfpIpv6ExthdrFlags_OFPIEH_ROUTER  OfpIpv6ExthdrFlags = 32
	OfpIpv6ExthdrFlags_OFPIEH_HOP     OfpIpv6ExthdrFlags = 64
	OfpIpv6ExthdrFlags_OFPIEH_UNREP   OfpIpv6ExthdrFlags = 128
	OfpIpv6ExthdrFlags_OFPIEH_UNSEQ   OfpIpv6ExthdrFlags = 256
)

var OfpIpv6ExthdrFlags_name = map[int32]string{
	0:   "OFPIEH_INVALID",
	1:   "OFPIEH_NONEXT",
	2:   "OFPIEH_ESP",
	4:   "OFPIEH_AUTH",
	8:   "OFPIEH_DEST",
	16:  "OFPIEH_FRAG",
	32:  "OFPIEH_ROUTER",
	64:  "OFPIEH_HOP",
	128: "OFPIEH_UNREP",
	256: "OFPIEH_UNSEQ",
}

var OfpIpv6ExthdrFlags_value = map[string]int32{
	"OFPIEH_INVALID": 0,
	"OFPIEH_NONEXT":  1,
	"OFPIEH_ESP":     2,
	"OFPIEH_AUTH":    4,
	"OFPIEH_DEST":    8,
	"OFPIEH_FRAG":    16,
	"OFPIEH_ROUTER":  32,
	"OFPIEH_HOP":     64,
	"OFPIEH_UNREP":   128,
	"OFPIEH_UNSEQ":   256,
}

func (x OfpIpv6ExthdrFlags) String() string {
	return proto.EnumName(OfpIpv6ExthdrFlags_name, int32(x))
}

func (OfpIpv6ExthdrFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{15}
}

type OfpActionType int32

const (
	OfpActionType_OFPAT_OUTPUT       OfpActionType = 0
	OfpActionType_OFPAT_COPY_TTL_OUT OfpActionType = 11
	OfpActionType_OFPAT_COPY_TTL_IN  OfpActionType = 12
	OfpActionType_OFPAT_SET_MPLS_TTL OfpActionType = 15
	OfpActionType_OFPAT_DEC_MPLS_TTL OfpActionType = 16
	OfpActionType_OFPAT_PUSH_VLAN    OfpActionType = 17
	OfpActionType_OFPAT_POP_VLAN     OfpActionType = 18
	OfpActionType_OFPAT_PUSH_MPLS    OfpActionType = 19
	OfpActionType_OFPAT_POP_MPLS     OfpActionType = 20
	OfpActionType_OFPAT_SET_QUEUE    OfpActionType = 21
	OfpActionType_OFPAT_GROUP        OfpActionType = 22
	OfpActionType_OFPAT_SET_NW_TTL   OfpActionType = 23
	OfpActionType_OFPAT_DEC_NW_TTL   OfpActionType = 24
	OfpActionType_OFPAT_SET_FIELD    OfpActionType = 25
	OfpActionType_OFPAT_PUSH_PBB     OfpActionType = 26
	OfpActionType_OFPAT_POP_PBB      OfpActionType = 27
	OfpActionType_OFPAT_EXPERIMENTER OfpActionType = 65535
)

var OfpActionType_name = map[int32]string{
	0:     "OFPAT_OUTPUT",
	11:    "OFPAT_COPY_TTL_OUT",
	12:    "OFPAT_COPY_TTL_IN",
	15:    "OFPAT_SET_MPLS_TTL",
	16:    "OFPAT_DEC_MPLS_TTL",
	17:    "OFPAT_PUSH_VLAN",
	18:    "OFPAT_POP_VLAN",
	19:    "OFPAT_PUSH_MPLS",
	20:    "OFPAT_POP_MPLS",
	21:    "OFPAT_SET_QUEUE",
	22:    "OFPAT_GROUP",
	23:    "OFPAT_SET_NW_TTL",
	24:    "OFPAT_DEC_NW_TTL",
	25:    "OFPAT_SET_FIELD",
	26:    "OFPAT_PUSH_PBB",
	27:    "OFPAT_POP_PBB",
	65535: "OFPAT_EXPERIMENTER",
}

var OfpActionType_value = map[string]int32{
	"OFPAT_OUTPUT":       0,
	"OFPAT_COPY_TTL_OUT": 11,
	"OFPAT_COPY_TTL_IN":  12,
	"OFPAT_SET_MPLS_TTL": 15,
	"OFPAT_DEC_MPLS_TTL": 16,
	"OFPAT_PUSH_VLAN":    17,
	"OFPAT_POP_VLAN":     18,
	"OFPAT_PUSH_MPLS":    19,
	"OFPAT_POP_MPLS":     20,
	"OFPAT_SET_QUEUE":    21,
	"OFPAT_GROUP":        22,
	"OFPAT_SET_NW_TTL":   23,
	"OFPAT_DEC_NW_TTL":   24,
	"OFPAT_SET_FIELD":    25,
	"OFPAT_PUSH_PBB":     26,
	"OFPAT_POP_PBB":      27,
	"OFPAT_EXPERIMENTER": 65535,
}

func (x OfpActionType) String() string {
	return proto.EnumName(OfpActionType_name, int32(x))
}

func (OfpActionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{16}
}

type OfpControllerMaxLen int32

const (
	OfpControllerMaxLen_OFPCML_INVALID   OfpControllerMaxLen = 0
	OfpControllerMaxLen_OFPCML_MAX       OfpControllerMaxLen = 65509
	OfpControllerMaxLen_OFPCML_NO_BUFFER OfpControllerMaxLen = 65535
)

var OfpControllerMaxLen_name = map[int32]string{
	0:     "OFPCML_INVALID",
	65509: "OFPCML_MAX",
	65535: "OFPCML_NO_BUFFER",
}

var OfpControllerMaxLen_value = map[string]int32{
	"OFPCML_INVALID":   0,
	"OFPCML_MAX":       65509,
	"OFPCML_NO_BUFFER": 65535,
}

func (x OfpControllerMaxLen) String() string {
	return proto.EnumName(OfpControllerMaxLen_name, int32(x))
}

func (OfpControllerMaxLen) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{17}
}

type OfpInstructionType int32

const (
	OfpInstructionType_OFPIT_INVALID        OfpInstructionType = 0
	OfpInstructionType_OFPIT_GOTO_TABLE     OfpInstructionType = 1
	OfpInstructionType_OFPIT_WRITE_METADATA OfpInstructionType = 2
	OfpInstructionType_OFPIT_WRITE_ACTIONS  OfpInstructionType = 3
	OfpInstructionType_OFPIT_APPLY_ACTIONS  OfpInstructionType = 4
	OfpInstructionType_OFPIT_CLEAR_ACTIONS  OfpInstructionType = 5
	OfpInstructionType_OFPIT_METER          OfpInstructionType = 6
	OfpInstructionType_OFPIT_EXPERIMENTER   OfpInstructionType = 65535
)

var OfpInstructionType_name = map[int32]string{
	0:     "OFPIT_INVALID",
	1:     "OFPIT_GOTO_TABLE",
	2:     "OFPIT_WRITE_METADATA",
	3:     "OFPIT_WRITE_ACTIONS",
	4:     "OFPIT_APPLY_ACTIONS",
	5:     "OFPIT_CLEAR_ACTIONS",
	6:     "OFPIT_METER",
	65535: "OFPIT_EXPERIMENTER",
}

var OfpInstructionType_value = map[string]int32{
	"OFPIT_INVALID":        0,
	"OFPIT_GOTO_TABLE":     1,
	"OFPIT_WRITE_METADATA": 2,
	"OFPIT_WRITE_ACTIONS":  3,
	"OFPIT_APPLY_ACTIONS":  4,
	"OFPIT_CLEAR_ACTIONS":  5,
	"OFPIT_METER":          6,
	"OFPIT_EXPERIMENTER":   65535,
}

func (x OfpInstructionType) String() string {
	return proto.EnumName(OfpInstructionType_name, int32(x))
}

func (OfpInstructionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{18}
}

type OfpFlowModCommand int32

const (
	OfpFlowModCommand_OFPFC_ADD           OfpFlowModCommand = 0
	OfpFlowModCommand_OFPFC_MODIFY        OfpFlowModCommand = 1
	OfpFlowModCommand_OFPFC_MODIFY_STRICT OfpFlowModCommand = 2
	OfpFlowModCommand_OFPFC_DELETE        OfpFlowModCommand = 3
	OfpFlowModCommand_OFPFC_DELETE_STRICT OfpFlowModCommand = 4
)

var OfpFlowModCommand_name = map[int32]string{
	0: "OFPFC_ADD",
	1: "OFPFC_MODIFY",
	2: "OFPFC_MODIFY_STRICT",
	3: "OFPFC_DELETE",
	4: "OFPFC_DELETE_STRICT",
}

var OfpFlowModCommand_value = map[string]int32{
	"OFPFC_ADD":           0,
	"OFPFC_MODIFY":        1,
	"OFPFC_MODIFY_STRICT": 2,
	"OFPFC_DELETE":        3,
	"OFPFC_DELETE_STRICT": 4,
}

func (x OfpFlowModCommand) String() string {
	return proto.EnumName(OfpFlowModCommand_name, int32(x))
}

func (OfpFlowModCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{19}
}

type OfpFlowModFlags int32

const (
	OfpFlowModFlags_OFPFF_INVALID       OfpFlowModFlags = 0
	OfpFlowModFlags_OFPFF_SEND_FLOW_REM OfpFlowModFlags = 1
	OfpFlowModFlags_OFPFF_CHECK_OVERLAP OfpFlowModFlags = 2
	OfpFlowModFlags_OFPFF_RESET_COUNTS  OfpFlowModFlags = 4
	OfpFlowModFlags_OFPFF_NO_PKT_COUNTS OfpFlowModFlags = 8
	OfpFlowModFlags_OFPFF_NO_BYT_COUNTS OfpFlowModFlags = 16
)

var OfpFlowModFlags_name = map[int32]string{
	0:  "OFPFF_INVALID",
	1:  "OFPFF_SEND_FLOW_REM",
	2:  "OFPFF_CHECK_OVERLAP",
	4:  "OFPFF_RESET_COUNTS",
	8:  "OFPFF_NO_PKT_COUNTS",
	16: "OFPFF_NO_BYT_COUNTS",
}

var OfpFlowModFlags_value = map[string]int32{
	"OFPFF_INVALID":       0,
	"OFPFF_SEND_FLOW_REM": 1,
	"OFPFF_CHECK_OVERLAP": 2,
	"OFPFF_RESET_COUNTS":  4,
	"OFPFF_NO_PKT_COUNTS": 8,
	"OFPFF_NO_BYT_COUNTS": 16,
}

func (x OfpFlowModFlags) String() string {
	return proto.EnumName(OfpFlowModFlags_name, int32(x))
}

func (OfpFlowModFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{20}
}

// Group numbering. Groups can use any number up to OFPG_MAX.
type OfpGroup int32

const (
	OfpGroup_OFPG_INVALID OfpGroup = 0
	// Last usable group number.
	OfpGroup_OFPG_MAX OfpGroup = 2147483392
	// Fake groups.
	OfpGroup_OFPG_ALL OfpGroup = 2147483644
	OfpGroup_OFPG_ANY OfpGroup = 2147483647
)

var OfpGroup_name = map[int32]string{
	0:          "OFPG_INVALID",
	2147483392: "OFPG_MAX",
	2147483644: "OFPG_ALL",
	2147483647: "OFPG_ANY",
}

var OfpGroup_value = map[string]int32{
	"OFPG_INVALID": 0,
	"OFPG_MAX":     2147483392,
	"OFPG_ALL":     2147483644,
	"OFPG_ANY":     2147483647,
}

func (x OfpGroup) String() string {
	return proto.EnumName(OfpGroup_name, int32(x))
}

func (OfpGroup) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{21}
}

// Group commands
type OfpGroupModCommand int32

const (
	OfpGroupModCommand_OFPGC_ADD    OfpGroupModCommand = 0
	OfpGroupModCommand_OFPGC_MODIFY OfpGroupModCommand = 1
	OfpGroupModCommand_OFPGC_DELETE OfpGroupModCommand = 2
)

var OfpGroupModCommand_name = map[int32]string{
	0: "OFPGC_ADD",
	1: "OFPGC_MODIFY",
	2: "OFPGC_DELETE",
}

var OfpGroupModCommand_value = map[string]int32{
	"OFPGC_ADD":    0,
	"OFPGC_MODIFY": 1,
	"OFPGC_DELETE": 2,
}

func (x OfpGroupModCommand) String() string {
	return proto.EnumName(OfpGroupModCommand_name, int32(x))
}

func (OfpGroupModCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{22}
}

// Group types.  Values in the range [128; 255] are reserved for experimental
// use.
type OfpGroupType int32

const (
	OfpGroupType_OFPGT_ALL      OfpGroupType = 0
	OfpGroupType_OFPGT_SELECT   OfpGroupType = 1
	OfpGroupType_OFPGT_INDIRECT OfpGroupType = 2
	OfpGroupType_OFPGT_FF       OfpGroupType = 3
)

var OfpGroupType_name = map[int32]string{
	0: "OFPGT_ALL",
	1: "OFPGT_SELECT",
	2: "OFPGT_INDIRECT",
	3: "OFPGT_FF",
}

var OfpGroupType_value = map[string]int32{
	"OFPGT_ALL":      0,
	"OFPGT_SELECT":   1,
	"OFPGT_INDIRECT": 2,
	"OFPGT_FF":       3,
}

func (x OfpGroupType) String() string {
	return proto.EnumName(OfpGroupType_name, int32(x))
}

func (OfpGroupType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{23}
}

// Why is this packet being sent to the controller?
type OfpPacketInReason int32

const (
	OfpPacketInReason_OFPR_NO_MATCH    OfpPacketInReason = 0
	OfpPacketInReason_OFPR_ACTION      OfpPacketInReason = 1
	OfpPacketInReason_OFPR_INVALID_TTL OfpPacketInReason = 2
)

var OfpPacketInReason_name = map[int32]string{
	0: "OFPR_NO_MATCH",
	1: "OFPR_ACTION",
	2: "OFPR_INVALID_TTL",
}

var OfpPacketInReason_value = map[string]int32{
	"OFPR_NO_MATCH":    0,
	"OFPR_ACTION":      1,
	"OFPR_INVALID_TTL": 2,
}

func (x OfpPacketInReason) String() string {
	return proto.EnumName(OfpPacketInReason_name, int32(x))
}

func (OfpPacketInReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{24}
}

// Why was this flow removed?
type OfpFlowRemovedReason int32

const (
	OfpFlowRemovedReason_OFPRR_IDLE_TIMEOUT OfpFlowRemovedReason = 0
	OfpFlowRemovedReason_OFPRR_HARD_TIMEOUT OfpFlowRemovedReason = 1
	OfpFlowRemovedReason_OFPRR_DELETE       OfpFlowRemovedReason = 2
	OfpFlowRemovedReason_OFPRR_GROUP_DELETE OfpFlowRemovedReason = 3
	OfpFlowRemovedReason_OFPRR_METER_DELETE OfpFlowRemovedReason = 4
)

var OfpFlowRemovedReason_name = map[int32]string{
	0: "OFPRR_IDLE_TIMEOUT",
	1: "OFPRR_HARD_TIMEOUT",
	2: "OFPRR_DELETE",
	3: "OFPRR_GROUP_DELETE",
	4: "OFPRR_METER_DELETE",
}

var OfpFlowRemovedReason_value = map[string]int32{
	"OFPRR_IDLE_TIMEOUT": 0,
	"OFPRR_HARD_TIMEOUT": 1,
	"OFPRR_DELETE":       2,
	"OFPRR_GROUP_DELETE": 3,
	"OFPRR_METER_DELETE": 4,
}

func (x OfpFlowRemovedReason) String() string {
	return proto.EnumName(OfpFlowRemovedReason_name, int32(x))
}

func (OfpFlowRemovedReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{25}
}

// Meter numbering. Flow meters can use any number up to OFPM_MAX.
type OfpMeter int32

const (
	OfpMeter_OFPM_ZERO OfpMeter = 0
	// Last usable meter.
	OfpMeter_OFPM_MAX OfpMeter = 2147418112
	// Virtual meters.
	OfpMeter_OFPM_SLOWPATH   OfpMeter = 2147483645
	OfpMeter_OFPM_CONTROLLER OfpMeter = 2147483646
	OfpMeter_OFPM_ALL        OfpMeter = 2147483647
)

var OfpMeter_name = map[int32]string{
	0:          "OFPM_ZERO",
	2147418112: "OFPM_MAX",
	2147483645: "OFPM_SLOWPATH",
	2147483646: "OFPM_CONTROLLER",
	2147483647: "OFPM_ALL",
}

var OfpMeter_value = map[string]int32{
	"OFPM_ZERO":       0,
	"OFPM_MAX":        2147418112,
	"OFPM_SLOWPATH":   2147483645,
	"OFPM_CONTROLLER": 2147483646,
	"OFPM_ALL":        2147483647,
}

func (x OfpMeter) String() string {
	return proto.EnumName(OfpMeter_name, int32(x))
}

func (OfpMeter) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{26}
}

// Meter band types
type OfpMeterBandType int32

const (
	OfpMeterBandType_OFPMBT_INVALID      OfpMeterBandType = 0
	OfpMeterBandType_OFPMBT_DROP         OfpMeterBandType = 1
	OfpMeterBandType_OFPMBT_DSCP_REMARK  OfpMeterBandType = 2
	OfpMeterBandType_OFPMBT_EXPERIMENTER OfpMeterBandType = 65535
)

var OfpMeterBandType_name = map[int32]string{
	0:     "OFPMBT_INVALID",
	1:     "OFPMBT_DROP",
	2:     "OFPMBT_DSCP_REMARK",
	65535: "OFPMBT_EXPERIMENTER",
}

var OfpMeterBandType_value = map[string]int32{
	"OFPMBT_INVALID":      0,
	"OFPMBT_DROP":         1,
	"OFPMBT_DSCP_REMARK":  2,
	"OFPMBT_EXPERIMENTER": 65535,
}

func (x OfpMeterBandType) String() string {
	return proto.EnumName(OfpMeterBandType_name, int32(x))
}

func (OfpMeterBandType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{27}
}

// Meter commands
type OfpMeterModCommand int32

const (
	OfpMeterModCommand_OFPMC_ADD    OfpMeterModCommand = 0
	OfpMeterModCommand_OFPMC_MODIFY OfpMeterModCommand = 1
	OfpMeterModCommand_OFPMC_DELETE OfpMeterModCommand = 2
)

var OfpMeterModCommand_name = map[int32]string{
	0: "OFPMC_ADD",
	1: "OFPMC_MODIFY",
	2: "OFPMC_DELETE",
}

var OfpMeterModCommand_value = map[string]int32{
	"OFPMC_ADD":    0,
	"OFPMC_MODIFY": 1,
	"OFPMC_DELETE": 2,
}

func (x OfpMeterModCommand) String() string {
	return proto.EnumName(OfpMeterModCommand_name, int32(x))
}

func (OfpMeterModCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{28}
}

// Meter configuration flags
type OfpMeterFlags int32

const (
	OfpMeterFlags_OFPMF_INVALID OfpMeterFlags = 0
	OfpMeterFlags_OFPMF_KBPS    OfpMeterFlags = 1
	OfpMeterFlags_OFPMF_PKTPS   OfpMeterFlags = 2
	OfpMeterFlags_OFPMF_BURST   OfpMeterFlags = 4
	OfpMeterFlags_OFPMF_STATS   OfpMeterFlags = 8
)

var OfpMeterFlags_name = map[int32]string{
	0: "OFPMF_INVALID",
	1: "OFPMF_KBPS",
	2: "OFPMF_PKTPS",
	4: "OFPMF_BURST",
	8: "OFPMF_STATS",
}

var OfpMeterFlags_value = map[string]int32{
	"OFPMF_INVALID": 0,
	"OFPMF_KBPS":    1,
	"OFPMF_PKTPS":   2,
	"OFPMF_BURST":   4,
	"OFPMF_STATS":   8,
}

func (x OfpMeterFlags) String() string {
	return proto.EnumName(OfpMeterFlags_name, int32(x))
}

func (OfpMeterFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{29}
}

// Values for 'type' in ofp_error_message.  These values are immutable: they
// will not change in future versions of the protocol (although new values may
// be added).
type OfpErrorType int32

const (
	OfpErrorType_OFPET_HELLO_FAILED          OfpErrorType = 0
	OfpErrorType_OFPET_BAD_REQUEST           OfpErrorType = 1
	OfpErrorType_OFPET_BAD_ACTION            OfpErrorType = 2
	OfpErrorType_OFPET_BAD_INSTRUCTION       OfpErrorType = 3
	OfpErrorType_OFPET_BAD_MATCH             OfpErrorType = 4
	OfpErrorType_OFPET_FLOW_MOD_FAILED       OfpErrorType = 5
	OfpErrorType_OFPET_GROUP_MOD_FAILED      OfpErrorType = 6
	OfpErrorType_OFPET_PORT_MOD_FAILED       OfpErrorType = 7
	OfpErrorType_OFPET_TABLE_MOD_FAILED      OfpErrorType = 8
	OfpErrorType_OFPET_QUEUE_OP_FAILED       OfpErrorType = 9
	OfpErrorType_OFPET_SWITCH_CONFIG_FAILED  OfpErrorType = 10
	OfpErrorType_OFPET_ROLE_REQUEST_FAILED   OfpErrorType = 11
	OfpErrorType_OFPET_METER_MOD_FAILED      OfpErrorType = 12
	OfpErrorType_OFPET_TABLE_FEATURES_FAILED OfpErrorType = 13
	OfpErrorType_OFPET_EXPERIMENTER          OfpErrorType = 65535
)

var OfpErrorType_name = map[int32]string{
	0:     "OFPET_HELLO_FAILED",
	1:     "OFPET_BAD_REQUEST",
	2:     "OFPET_BAD_ACTION",
	3:     "OFPET_BAD_INSTRUCTION",
	4:     "OFPET_BAD_MATCH",
	5:     "OFPET_FLOW_MOD_FAILED",
	6:     "OFPET_GROUP_MOD_FAILED",
	7:     "OFPET_PORT_MOD_FAILED",
	8:     "OFPET_TABLE_MOD_FAILED",
	9:     "OFPET_QUEUE_OP_FAILED",
	10:    "OFPET_SWITCH_CONFIG_FAILED",
	11:    "OFPET_ROLE_REQUEST_FAILED",
	12:    "OFPET_METER_MOD_FAILED",
	13:    "OFPET_TABLE_FEATURES_FAILED",
	65535: "OFPET_EXPERIMENTER",
}

var OfpErrorType_value = map[string]int32{
	"OFPET_HELLO_FAILED":          0,
	"OFPET_BAD_REQUEST":           1,
	"OFPET_BAD_ACTION":            2,
	"OFPET_BAD_INSTRUCTION":       3,
	"OFPET_BAD_MATCH":             4,
	"OFPET_FLOW_MOD_FAILED":       5,
	"OFPET_GROUP_MOD_FAILED":      6,
	"OFPET_PORT_MOD_FAILED":       7,
	"OFPET_TABLE_MOD_FAILED":      8,
	"OFPET_QUEUE_OP_FAILED":       9,
	"OFPET_SWITCH_CONFIG_FAILED":  10,
	"OFPET_ROLE_REQUEST_FAILED":   11,
	"OFPET_METER_MOD_FAILED":      12,
	"OFPET_TABLE_FEATURES_FAILED": 13,
	"OFPET_EXPERIMENTER":          65535,
}

func (x OfpErrorType) String() string {
	return proto.EnumName(OfpErrorType_name, int32(x))
}

func (OfpErrorType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{30}
}

// ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
// ASCII text string that may give failure details.
type OfpHelloFailedCode int32

const (
	OfpHelloFailedCode_OFPHFC_INCOMPATIBLE OfpHelloFailedCode = 0
	OfpHelloFailedCode_OFPHFC_EPERM        OfpHelloFailedCode = 1
)

var OfpHelloFailedCode_name = map[int32]string{
	0: "OFPHFC_INCOMPATIBLE",
	1: "OFPHFC_EPERM",
}

var OfpHelloFailedCode_value = map[string]int32{
	"OFPHFC_INCOMPATIBLE": 0,
	"OFPHFC_EPERM":        1,
}

func (x OfpHelloFailedCode) String() string {
	return proto.EnumName(OfpHelloFailedCode_name, int32(x))
}

func (OfpHelloFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{31}
}

// ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
// the first 64 bytes of the failed request.
type OfpBadRequestCode int32

const (
	OfpBadRequestCode_OFPBRC_BAD_VERSION               OfpBadRequestCode = 0
	OfpBadRequestCode_OFPBRC_BAD_TYPE                  OfpBadRequestCode = 1
	OfpBadRequestCode_OFPBRC_BAD_MULTIPART             OfpBadRequestCode = 2
	OfpBadRequestCode_OFPBRC_BAD_EXPERIMENTER          OfpBadRequestCode = 3
	OfpBadRequestCode_OFPBRC_BAD_EXP_TYPE              OfpBadRequestCode = 4
	OfpBadRequestCode_OFPBRC_EPERM                     OfpBadRequestCode = 5
	OfpBadRequestCode_OFPBRC_BAD_LEN                   OfpBadRequestCode = 6
	OfpBadRequestCode_OFPBRC_BUFFER_EMPTY              OfpBadRequestCode = 7
	OfpBadRequestCode_OFPBRC_BUFFER_UNKNOWN            OfpBadRequestCode = 8
	OfpBadRequestCode_OFPBRC_BAD_TABLE_ID              OfpBadRequestCode = 9
	OfpBadRequestCode_OFPBRC_IS_SLAVE                  OfpBadRequestCode = 10
	OfpBadRequestCode_OFPBRC_BAD_PORT                  OfpBadRequestCode = 11
	OfpBadRequestCode_OFPBRC_BAD_PACKET                OfpBadRequestCode = 12
	OfpBadRequestCode_OFPBRC_MULTIPART_BUFFER_OVERFLOW OfpBadRequestCode = 13
)

var OfpBadRequestCode_name = map[int32]string{
	0:  "OFPBRC_BAD_VERSION",
	1:  "OFPBRC_BAD_TYPE",
	2:  "OFPBRC_BAD_MULTIPART",
	3:  "OFPBRC_BAD_EXPERIMENTER",
	4:  "OFPBRC_BAD_EXP_TYPE",
	5:  "OFPBRC_EPERM",
	6:  "OFPBRC_BAD_LEN",
	7:  "OFPBRC_BUFFER_EMPTY",
	8:  "OFPBRC_BUFFER_UNKNOWN",
	9:  "OFPBRC_BAD_TABLE_ID",
	10: "OFPBRC_IS_SLAVE",
	11: "OFPBRC_BAD_PORT",
	12: "OFPBRC_BAD_PACKET",
	13: "OFPBRC_MULTIPART_BUFFER_OVERFLOW",
}

var OfpBadRequestCode_value = map[string]int32{
	"OFPBRC_BAD_VERSION":               0,
	"OFPBRC_BAD_TYPE":                  1,
	"OFPBRC_BAD_MULTIPART":             2,
	"OFPBRC_BAD_EXPERIMENTER":          3,
	"OFPBRC_BAD_EXP_TYPE":              4,
	"OFPBRC_EPERM":                     5,
	"OFPBRC_BAD_LEN":                   6,
	"OFPBRC_BUFFER_EMPTY":              7,
	"OFPBRC_BUFFER_UNKNOWN":            8,
	"OFPBRC_BAD_TABLE_ID":              9,
	"OFPBRC_IS_SLAVE":                  10,
	"OFPBRC_BAD_PORT":                  11,
	"OFPBRC_BAD_PACKET":                12,
	"OFPBRC_MULTIPART_BUFFER_OVERFLOW": 13,
}

func (x OfpBadRequestCode) String() string {
	return proto.EnumName(OfpBadRequestCode_name, int32(x))
}

func (OfpBadRequestCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{32}
}

// ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
// the first 64 bytes of the failed request.
type OfpBadActionCode int32

const (
	OfpBadActionCode_OFPBAC_BAD_TYPE           OfpBadActionCode = 0
	OfpBadActionCode_OFPBAC_BAD_LEN            OfpBadActionCode = 1
	OfpBadActionCode_OFPBAC_BAD_EXPERIMENTER   OfpBadActionCode = 2
	OfpBadActionCode_OFPBAC_BAD_EXP_TYPE       OfpBadActionCode = 3
	OfpBadActionCode_OFPBAC_BAD_OUT_PORT       OfpBadActionCode = 4
	OfpBadActionCode_OFPBAC_BAD_ARGUMENT       OfpBadActionCode = 5
	OfpBadActionCode_OFPBAC_EPERM              OfpBadActionCode = 6
	OfpBadActionCode_OFPBAC_TOO_MANY           OfpBadActionCode = 7
	OfpBadActionCode_OFPBAC_BAD_QUEUE          OfpBadActionCode = 8
	OfpBadActionCode_OFPBAC_BAD_OUT_GROUP      OfpBadActionCode = 9
	OfpBadActionCode_OFPBAC_MATCH_INCONSISTENT OfpBadActionCode = 10
	OfpBadActionCode_OFPBAC_UNSUPPORTED_ORDER  OfpBadActionCode = 11
	OfpBadActionCode_OFPBAC_BAD_TAG            OfpBadActionCode = 12
	OfpBadActionCode_OFPBAC_BAD_SET_TYPE       OfpBadActionCode = 13
	OfpBadActionCode_OFPBAC_BAD_SET_LEN        OfpBadActionCode = 14
	OfpBadActionCode_OFPBAC_BAD_SET_ARGUMENT   OfpBadActionCode = 15
)

var OfpBadActionCode_name = map[int32]string{
	0:  "OFPBAC_BAD_TYPE",
	1:  "OFPBAC_BAD_LEN",
	2:  "OFPBAC_BAD_EXPERIMENTER",
	3:  "OFPBAC_BAD_EXP_TYPE",
	4:  "OFPBAC_BAD_OUT_PORT",
	5:  "OFPBAC_BAD_ARGUMENT",
	6:  "OFPBAC_EPERM",
	7:  "OFPBAC_TOO_MANY",
	8:  "OFPBAC_BAD_QUEUE",
	9:  "OFPBAC_BAD_OUT_GROUP",
	10: "OFPBAC_MATCH_INCONSISTENT",
	11: "OFPBAC_UNSUPPORTED_ORDER",
	12: "OFPBAC_BAD_TAG",
	13: "OFPBAC_BAD_SET_TYPE",
	14: "OFPBAC_BAD_SET_LEN",
	15: "OFPBAC_BAD_SET_ARGUMENT",
}

var OfpBadActionCode_value = map[string]int32{
	"OFPBAC_BAD_TYPE":           0,
	"OFPBAC_BAD_LEN":            1,
	"OFPBAC_BAD_EXPERIMENTER":   2,
	"OFPBAC_BAD_EXP_TYPE":       3,
	"OFPBAC_BAD_OUT_PORT":       4,
	"OFPBAC_BAD_ARGUMENT":       5,
	"OFPBAC_EPERM":              6,
	"OFPBAC_TOO_MANY":           7,
	"OFPBAC_BAD_QUEUE":          8,
	"OFPBAC_BAD_OUT_GROUP":      9,
	"OFPBAC_MATCH_INCONSISTENT": 10,
	"OFPBAC_UNSUPPORTED_ORDER":  11,
	"OFPBAC_BAD_TAG":            12,
	"OFPBAC_BAD_SET_TYPE":       13,
	"OFPBAC_BAD_SET_LEN":        14,
	"OFPBAC_BAD_SET_ARGUMENT":   15,
}

func (x OfpBadActionCode) String() string {
	return proto.EnumName(OfpBadActionCode_name, int32(x))
}

func (OfpBadActionCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{33}
}

// ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at
// least the first 64 bytes of the failed request.
type OfpBadInstructionCode int32

const (
	OfpBadInstructionCode_OFPBIC_UNKNOWN_INST        OfpBadInstructionCode = 0
	OfpBadInstructionCode_OFPBIC_UNSUP_INST          OfpBadInstructionCode = 1
	OfpBadInstructionCode_OFPBIC_BAD_TABLE_ID        OfpBadInstructionCode = 2
	OfpBadInstructionCode_OFPBIC_UNSUP_METADATA      OfpBadInstructionCode = 3
	OfpBadInstructionCode_OFPBIC_UNSUP_METADATA_MASK OfpBadInstructionCode = 4
	OfpBadInstructionCode_OFPBIC_BAD_EXPERIMENTER    OfpBadInstructionCode = 5
	OfpBadInstructionCode_OFPBIC_BAD_EXP_TYPE        OfpBadInstructionCode = 6
	OfpBadInstructionCode_OFPBIC_BAD_LEN             OfpBadInstructionCode = 7
	OfpBadInstructionCode_OFPBIC_EPERM               OfpBadInstructionCode = 8
)

var OfpBadInstructionCode_name = map[int32]string{
	0: "OFPBIC_UNKNOWN_INST",
	1: "OFPBIC_UNSUP_INST",
	2: "OFPBIC_BAD_TABLE_ID",
	3: "OFPBIC_UNSUP_METADATA",
	4: "OFPBIC_UNSUP_METADATA_MASK",
	5: "OFPBIC_BAD_EXPERIMENTER",
	6: "OFPBIC_BAD_EXP_TYPE",
	7: "OFPBIC_BAD_LEN",
	8: "OFPBIC_EPERM",
}

var OfpBadInstructionCode_value = map[string]int32{
	"OFPBIC_UNKNOWN_INST":        0,
	"OFPBIC_UNSUP_INST":          1,
	"OFPBIC_BAD_TABLE_ID":        2,
	"OFPBIC_UNSUP_METADATA":      3,
	"OFPBIC_UNSUP_METADATA_MASK": 4,
	"OFPBIC_BAD_EXPERIMENTER":    5,
	"OFPBIC_BAD_EXP_TYPE":        6,
	"OFPBIC_BAD_LEN":             7,
	"OFPBIC_EPERM":               8,
}

func (x OfpBadInstructionCode) String() string {
	return proto.EnumName(OfpBadInstructionCode_name, int32(x))
}

func (OfpBadInstructionCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{34}
}

// ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
// the first 64 bytes of the failed request.
type OfpBadMatchCode int32

const (
	OfpBadMatchCode_OFPBMC_BAD_TYPE         OfpBadMatchCode = 0
	OfpBadMatchCode_OFPBMC_BAD_LEN          OfpBadMatchCode = 1
	OfpBadMatchCode_OFPBMC_BAD_TAG          OfpBadMatchCode = 2
	OfpBadMatchCode_OFPBMC_BAD_DL_ADDR_MASK OfpBadMatchCode = 3
	OfpBadMatchCode_OFPBMC_BAD_NW_ADDR_MASK OfpBadMatchCode = 4
	OfpBadMatchCode_OFPBMC_BAD_WILDCARDS    OfpBadMatchCode = 5
	OfpBadMatchCode_OFPBMC_BAD_FIELD        OfpBadMatchCode = 6
	OfpBadMatchCode_OFPBMC_BAD_VALUE        OfpBadMatchCode = 7
	OfpBadMatchCode_OFPBMC_BAD_MASK         OfpBadMatchCode = 8
	OfpBadMatchCode_OFPBMC_BAD_PREREQ       OfpBadMatchCode = 9
	OfpBadMatchCode_OFPBMC_DUP_FIELD        OfpBadMatchCode = 10
	OfpBadMatchCode_OFPBMC_EPERM            OfpBadMatchCode = 11
)

var OfpBadMatchCode_name = map[int32]string{
	0:  "OFPBMC_BAD_TYPE",
	1:  "OFPBMC_BAD_LEN",
	2:  "OFPBMC_BAD_TAG",
	3:  "OFPBMC_BAD_DL_ADDR_MASK",
	4:  "OFPBMC_BAD_NW_ADDR_MASK",
	5:  "OFPBMC_BAD_WILDCARDS",
	6:  "OFPBMC_BAD_FIELD",
	7:  "OFPBMC_BAD_VALUE",
	8:  "OFPBMC_BAD_MASK",
	9:  "OFPBMC_BAD_PREREQ",
	10: "OFPBMC_DUP_FIELD",
	11: "OFPBMC_EPERM",
}

var OfpBadMatchCode_value = map[string]int32{
	"OFPBMC_BAD_TYPE":         0,
	"OFPBMC_BAD_LEN":          1,
	"OFPBMC_BAD_TAG":          2,
	"OFPBMC_BAD_DL_ADDR_MASK": 3,
	"OFPBMC_BAD_NW_ADDR_MASK": 4,
	"OFPBMC_BAD_WILDCARDS":    5,
	"OFPBMC_BAD_FIELD":        6,
	"OFPBMC_BAD_VALUE":        7,
	"OFPBMC_BAD_MASK":         8,
	"OFPBMC_BAD_PREREQ":       9,
	"OFPBMC_DUP_FIELD":        10,
	"OFPBMC_EPERM":            11,
}

func (x OfpBadMatchCode) String() string {
	return proto.EnumName(OfpBadMatchCode_name, int32(x))
}

func (OfpBadMatchCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{35}
}

// ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpFlowModFailedCode int32

const (
	OfpFlowModFailedCode_OFPFMFC_UNKNOWN      OfpFlowModFailedCode = 0
	OfpFlowModFailedCode_OFPFMFC_TABLE_FULL   OfpFlowModFailedCode = 1
	OfpFlowModFailedCode_OFPFMFC_BAD_TABLE_ID OfpFlowModFailedCode = 2
	OfpFlowModFailedCode_OFPFMFC_OVERLAP      OfpFlowModFailedCode = 3
	OfpFlowModFailedCode_OFPFMFC_EPERM        OfpFlowModFailedCode = 4
	OfpFlowModFailedCode_OFPFMFC_BAD_TIMEOUT  OfpFlowModFailedCode = 5
	OfpFlowModFailedCode_OFPFMFC_BAD_COMMAND  OfpFlowModFailedCode = 6
	OfpFlowModFailedCode_OFPFMFC_BAD_FLAGS    OfpFlowModFailedCode = 7
)

var OfpFlowModFailedCode_name = map[int32]string{
	0: "OFPFMFC_UNKNOWN",
	1: "OFPFMFC_TABLE_FULL",
	2: "OFPFMFC_BAD_TABLE_ID",
	3: "OFPFMFC_OVERLAP",
	4: "OFPFMFC_EPERM",
	5: "OFPFMFC_BAD_TIMEOUT",
	6: "OFPFMFC_BAD_COMMAND",
	7: "OFPFMFC_BAD_FLAGS",
}

var OfpFlowModFailedCode_value = map[string]int32{
	"OFPFMFC_UNKNOWN":      0,
	"OFPFMFC_TABLE_FULL":   1,
	"OFPFMFC_BAD_TABLE_ID": 2,
	"OFPFMFC_OVERLAP":      3,
	"OFPFMFC_EPERM":        4,
	"OFPFMFC_BAD_TIMEOUT":  5,
	"OFPFMFC_BAD_COMMAND":  6,
	"OFPFMFC_BAD_FLAGS":    7,
}

func (x OfpFlowModFailedCode) String() string {
	return proto.EnumName(OfpFlowModFailedCode_name, int32(x))
}

func (OfpFlowModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{36}
}

// ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpGroupModFailedCode int32

const (
	OfpGroupModFailedCode_OFPGMFC_GROUP_EXISTS         OfpGroupModFailedCode = 0
	OfpGroupModFailedCode_OFPGMFC_INVALID_GROUP        OfpGroupModFailedCode = 1
	OfpGroupModFailedCode_OFPGMFC_WEIGHT_UNSUPPORTED   OfpGroupModFailedCode = 2
	OfpGroupModFailedCode_OFPGMFC_OUT_OF_GROUPS        OfpGroupModFailedCode = 3
	OfpGroupModFailedCode_OFPGMFC_OUT_OF_BUCKETS       OfpGroupModFailedCode = 4
	OfpGroupModFailedCode_OFPGMFC_CHAINING_UNSUPPORTED OfpGroupModFailedCode = 5
	OfpGroupModFailedCode_OFPGMFC_WATCH_UNSUPPORTED    OfpGroupModFailedCode = 6
	OfpGroupModFailedCode_OFPGMFC_LOOP                 OfpGroupModFailedCode = 7
	OfpGroupModFailedCode_OFPGMFC_UNKNOWN_GROUP        OfpGroupModFailedCode = 8
	OfpGroupModFailedCode_OFPGMFC_CHAINED_GROUP        OfpGroupModFailedCode = 9
	OfpGroupModFailedCode_OFPGMFC_BAD_TYPE             OfpGroupModFailedCode = 10
	OfpGroupModFailedCode_OFPGMFC_BAD_COMMAND          OfpGroupModFailedCode = 11
	OfpGroupModFailedCode_OFPGMFC_BAD_BUCKET           OfpGroupModFailedCode = 12
	OfpGroupModFailedCode_OFPGMFC_BAD_WATCH            OfpGroupModFailedCode = 13
	OfpGroupModFailedCode_OFPGMFC_EPERM                OfpGroupModFailedCode = 14
)

var OfpGroupModFailedCode_name = map[int32]string{
	0:  "OFPGMFC_GROUP_EXISTS",
	1:  "OFPGMFC_INVALID_GROUP",
	2:  "OFPGMFC_WEIGHT_UNSUPPORTED",
	3:  "OFPGMFC_OUT_OF_GROUPS",
	4:  "OFPGMFC_OUT_OF_BUCKETS",
	5:  "OFPGMFC_CHAINING_UNSUPPORTED",
	6:  "OFPGMFC_WATCH_UNSUPPORTED",
	7:  "OFPGMFC_LOOP",
	8:  "OFPGMFC_UNKNOWN_GROUP",
	9:  "OFPGMFC_CHAINED_GROUP",
	10: "OFPGMFC_BAD_TYPE",
	11: "OFPGMFC_BAD_COMMAND",
	12: "OFPGMFC_BAD_BUCKET",
	13: "OFPGMFC_BAD_WATCH",
	14: "OFPGMFC_EPERM",
}

var OfpGroupModFailedCode_value = map[string]int32{
	"OFPGMFC_GROUP_EXISTS":         0,
	"OFPGMFC_INVALID_GROUP":        1,
	"OFPGMFC_WEIGHT_UNSUPPORTED":   2,
	"OFPGMFC_OUT_OF_GROUPS":        3,
	"OFPGMFC_OUT_OF_BUCKETS":       4,
	"OFPGMFC_CHAINING_UNSUPPORTED": 5,
	"OFPGMFC_WATCH_UNSUPPORTED":    6,
	"OFPGMFC_LOOP":                 7,
	"OFPGMFC_UNKNOWN_GROUP":        8,
	"OFPGMFC_CHAINED_GROUP":        9,
	"OFPGMFC_BAD_TYPE":             10,
	"OFPGMFC_BAD_COMMAND":          11,
	"OFPGMFC_BAD_BUCKET":           12,
	"OFPGMFC_BAD_WATCH":            13,
	"OFPGMFC_EPERM":                14,
}

func (x OfpGroupModFailedCode) String() string {
	return proto.EnumName(OfpGroupModFailedCode_name, int32(x))
}

func (OfpGroupModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{37}
}

// ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpPortModFailedCode int32

const (
	OfpPortModFailedCode_OFPPMFC_BAD_PORT      OfpPortModFailedCode = 0
	OfpPortModFailedCode_OFPPMFC_BAD_HW_ADDR   OfpPortModFailedCode = 1
	OfpPortModFailedCode_OFPPMFC_BAD_CONFIG    OfpPortModFailedCode = 2
	OfpPortModFailedCode_OFPPMFC_BAD_ADVERTISE OfpPortModFailedCode = 3
	OfpPortModFailedCode_OFPPMFC_EPERM         OfpPortModFailedCode = 4
)

var OfpPortModFailedCode_name = map[int32]string{
	0: "OFPPMFC_BAD_PORT",
	1: "OFPPMFC_BAD_HW_ADDR",
	2: "OFPPMFC_BAD_CONFIG",
	3: "OFPPMFC_BAD_ADVERTISE",
	4: "OFPPMFC_EPERM",
}

var OfpPortModFailedCode_value = map[string]int32{
	"OFPPMFC_BAD_PORT":      0,
	"OFPPMFC_BAD_HW_ADDR":   1,
	"OFPPMFC_BAD_CONFIG":    2,
	"OFPPMFC_BAD_ADVERTISE": 3,
	"OFPPMFC_EPERM":         4,
}

func (x OfpPortModFailedCode) String() string {
	return proto.EnumName(OfpPortModFailedCode_name, int32(x))
}

func (OfpPortModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{38}
}

// ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpTableModFailedCode int32

const (
	OfpTableModFailedCode_OFPTMFC_BAD_TABLE  OfpTableModFailedCode = 0
	OfpTableModFailedCode_OFPTMFC_BAD_CONFIG OfpTableModFailedCode = 1
	OfpTableModFailedCode_OFPTMFC_EPERM      OfpTableModFailedCode = 2
)

var OfpTableModFailedCode_name = map[int32]string{
	0: "OFPTMFC_BAD_TABLE",
	1: "OFPTMFC_BAD_CONFIG",
	2: "OFPTMFC_EPERM",
}

var OfpTableModFailedCode_value = map[string]int32{
	"OFPTMFC_BAD_TABLE":  0,
	"OFPTMFC_BAD_CONFIG": 1,
	"OFPTMFC_EPERM":      2,
}

func (x OfpTableModFailedCode) String() string {
	return proto.EnumName(OfpTableModFailedCode_name, int32(x))
}

func (OfpTableModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{39}
}

// ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
// at least the first 64 bytes of the failed request
type OfpQueueOpFailedCode int32

const (
	OfpQueueOpFailedCode_OFPQOFC_BAD_PORT  OfpQueueOpFailedCode = 0
	OfpQueueOpFailedCode_OFPQOFC_BAD_QUEUE OfpQueueOpFailedCode = 1
	OfpQueueOpFailedCode_OFPQOFC_EPERM     OfpQueueOpFailedCode = 2
)

var OfpQueueOpFailedCode_name = map[int32]string{
	0: "OFPQOFC_BAD_PORT",
	1: "OFPQOFC_BAD_QUEUE",
	2: "OFPQOFC_EPERM",
}

var OfpQueueOpFailedCode_value = map[string]int32{
	"OFPQOFC_BAD_PORT":  0,
	"OFPQOFC_BAD_QUEUE": 1,
	"OFPQOFC_EPERM":     2,
}

func (x OfpQueueOpFailedCode) String() string {
	return proto.EnumName(OfpQueueOpFailedCode_name, int32(x))
}

func (OfpQueueOpFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{40}
}

// ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
// at least the first 64 bytes of the failed request.
type OfpSwitchConfigFailedCode int32

const (
	OfpSwitchConfigFailedCode_OFPSCFC_BAD_FLAGS OfpSwitchConfigFailedCode = 0
	OfpSwitchConfigFailedCode_OFPSCFC_BAD_LEN   OfpSwitchConfigFailedCode = 1
	OfpSwitchConfigFailedCode_OFPSCFC_EPERM     OfpSwitchConfigFailedCode = 2
)

var OfpSwitchConfigFailedCode_name = map[int32]string{
	0: "OFPSCFC_BAD_FLAGS",
	1: "OFPSCFC_BAD_LEN",
	2: "OFPSCFC_EPERM",
}

var OfpSwitchConfigFailedCode_value = map[string]int32{
	"OFPSCFC_BAD_FLAGS": 0,
	"OFPSCFC_BAD_LEN":   1,
	"OFPSCFC_EPERM":     2,
}

func (x OfpSwitchConfigFailedCode) String() string {
	return proto.EnumName(OfpSwitchConfigFailedCode_name, int32(x))
}

func (OfpSwitchConfigFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{41}
}

// ofp_error_msg 'code' values for OFPET_ROLE_REQUEST_FAILED. 'data' contains
// at least the first 64 bytes of the failed request.
type OfpRoleRequestFailedCode int32

const (
	OfpRoleRequestFailedCode_OFPRRFC_STALE    OfpRoleRequestFailedCode = 0
	OfpRoleRequestFailedCode_OFPRRFC_UNSUP    OfpRoleRequestFailedCode = 1
	OfpRoleRequestFailedCode_OFPRRFC_BAD_ROLE OfpRoleRequestFailedCode = 2
)

var OfpRoleRequestFailedCode_name = map[int32]string{
	0: "OFPRRFC_STALE",
	1: "OFPRRFC_UNSUP",
	2: "OFPRRFC_BAD_ROLE",
}

var OfpRoleRequestFailedCode_value = map[string]int32{
	"OFPRRFC_STALE":    0,
	"OFPRRFC_UNSUP":    1,
	"OFPRRFC_BAD_ROLE": 2,
}

func (x OfpRoleRequestFailedCode) String() string {
	return proto.EnumName(OfpRoleRequestFailedCode_name, int32(x))
}

func (OfpRoleRequestFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{42}
}

// ofp_error_msg 'code' values for OFPET_METER_MOD_FAILED.  'data' contains
// at least the first 64 bytes of the failed request.
type OfpMeterModFailedCode int32

const (
	OfpMeterModFailedCode_OFPMMFC_UNKNOWN         OfpMeterModFailedCode = 0
	OfpMeterModFailedCode_OFPMMFC_METER_EXISTS    OfpMeterModFailedCode = 1
	OfpMeterModFailedCode_OFPMMFC_INVALID_METER   OfpMeterModFailedCode = 2
	OfpMeterModFailedCode_OFPMMFC_UNKNOWN_METER   OfpMeterModFailedCode = 3
	OfpMeterModFailedCode_OFPMMFC_BAD_COMMAND     OfpMeterModFailedCode = 4
	OfpMeterModFailedCode_OFPMMFC_BAD_FLAGS       OfpMeterModFailedCode = 5
	OfpMeterModFailedCode_OFPMMFC_BAD_RATE        OfpMeterModFailedCode = 6
	OfpMeterModFailedCode_OFPMMFC_BAD_BURST       OfpMeterModFailedCode = 7
	OfpMeterModFailedCode_OFPMMFC_BAD_BAND        OfpMeterModFailedCode = 8
	OfpMeterModFailedCode_OFPMMFC_BAD_BAND_DETAIL OfpMeterModFailedCode = 9
	OfpMeterModFailedCode_OFPMMFC_OUT_OF_METERS   OfpMeterModFailedCode = 10
	OfpMeterModFailedCode_OFPMMFC_OUT_OF_BANDS    OfpMeterModFailedCode = 11
)

var OfpMeterModFailedCode_name = map[int32]string{
	0:  "OFPMMFC_UNKNOWN",
	1:  "OFPMMFC_METER_EXISTS",
	2:  "OFPMMFC_INVALID_METER",
	3:  "OFPMMFC_UNKNOWN_METER",
	4:  "OFPMMFC_BAD_COMMAND",
	5:  "OFPMMFC_BAD_FLAGS",
	6:  "OFPMMFC_BAD_RATE",
	7:  "OFPMMFC_BAD_BURST",
	8:  "OFPMMFC_BAD_BAND",
	9:  "OFPMMFC_BAD_BAND_DETAIL",
	10: "OFPMMFC_OUT_OF_METERS",
	11: "OFPMMFC_OUT_OF_BANDS",
}

var OfpMeterModFailedCode_value = map[string]int32{
	"OFPMMFC_UNKNOWN":         0,
	"OFPMMFC_METER_EXISTS":    1,
	"OFPMMFC_INVALID_METER":   2,
	"OFPMMFC_UNKNOWN_METER":   3,
	"OFPMMFC_BAD_COMMAND":     4,
	"OFPMMFC_BAD_FLAGS":       5,
	"OFPMMFC_BAD_RATE":        6,
	"OFPMMFC_BAD_BURST":       7,
	"OFPMMFC_BAD_BAND":        8,
	"OFPMMFC_BAD_BAND_DETAIL": 9,
	"OFPMMFC_OUT_OF_METERS":   10,
	"OFPMMFC_OUT_OF_BANDS":    11,
}

func (x OfpMeterModFailedCode) String() string {
	return proto.EnumName(OfpMeterModFailedCode_name, int32(x))
}

func (OfpMeterModFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{43}
}

// ofp_error_msg 'code' values for OFPET_TABLE_FEATURES_FAILED. 'data' contains
// at least the first 64 bytes of the failed request.
type OfpTableFeaturesFailedCode int32

const (
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_TABLE    OfpTableFeaturesFailedCode = 0
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_METADATA OfpTableFeaturesFailedCode = 1
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_TYPE     OfpTableFeaturesFailedCode = 2
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_LEN      OfpTableFeaturesFailedCode = 3
	OfpTableFeaturesFailedCode_OFPTFFC_BAD_ARGUMENT OfpTableFeaturesFailedCode = 4
	OfpTableFeaturesFailedCode_OFPTFFC_EPERM        OfpTableFeaturesFailedCode = 5
)

var OfpTableFeaturesFailedCode_name = map[int32]string{
	0: "OFPTFFC_BAD_TABLE",
	1: "OFPTFFC_BAD_METADATA",
	2: "OFPTFFC_BAD_TYPE",
	3: "OFPTFFC_BAD_LEN",
	4: "OFPTFFC_BAD_ARGUMENT",
	5: "OFPTFFC_EPERM",
}

var OfpTableFeaturesFailedCode_value = map[string]int32{
	"OFPTFFC_BAD_TABLE":    0,
	"OFPTFFC_BAD_METADATA": 1,
	"OFPTFFC_BAD_TYPE":     2,
	"OFPTFFC_BAD_LEN":      3,
	"OFPTFFC_BAD_ARGUMENT": 4,
	"OFPTFFC_EPERM":        5,
}

func (x OfpTableFeaturesFailedCode) String() string {
	return proto.EnumName(OfpTableFeaturesFailedCode_name, int32(x))
}

func (OfpTableFeaturesFailedCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{44}
}

type OfpMultipartType int32

const (
	// Description of this OpenFlow switch.
	// The request body is empty.
	// The reply body is struct ofp_desc.
	OfpMultipartType_OFPMP_DESC OfpMultipartType = 0
	// Individual flow statistics.
	// The request body is struct ofp_flow_stats_request.
	// The reply body is an array of struct ofp_flow_stats.
	OfpMultipartType_OFPMP_FLOW OfpMultipartType = 1
	// Aggregate flow statistics.
	// The request body is struct ofp_aggregate_stats_request.
	// The reply body is struct ofp_aggregate_stats_reply.
	OfpMultipartType_OFPMP_AGGREGATE OfpMultipartType = 2
	// Flow table statistics.
	// The request body is empty.
	// The reply body is an array of struct ofp_table_stats.
	OfpMultipartType_OFPMP_TABLE OfpMultipartType = 3
	// Port statistics.
	// The request body is struct ofp_port_stats_request.
	// The reply body is an array of struct ofp_port_stats.
	OfpMultipartType_OFPMP_PORT_STATS OfpMultipartType = 4
	// Queue statistics for a port
	// The request body is struct ofp_queue_stats_request.
	// The reply body is an array of struct ofp_queue_stats
	OfpMultipartType_OFPMP_QUEUE OfpMultipartType = 5
	// Group counter statistics.
	// The request body is struct ofp_group_stats_request.
	// The reply is an array of struct ofp_group_stats.
	OfpMultipartType_OFPMP_GROUP OfpMultipartType = 6
	// Group description.
	// The request body is empty.
	// The reply body is an array of struct ofp_group_desc.
	OfpMultipartType_OFPMP_GROUP_DESC OfpMultipartType = 7
	// Group features.
	// The request body is empty.
	// The reply body is struct ofp_group_features.
	OfpMultipartType_OFPMP_GROUP_FEATURES OfpMultipartType = 8
	// Meter statistics.
	// The request body is struct ofp_meter_multipart_requests.
	// The reply body is an array of struct ofp_meter_stats.
	OfpMultipartType_OFPMP_METER OfpMultipartType = 9
	// Meter configuration.
	// The request body is struct ofp_meter_multipart_requests.
	// The reply body is an array of struct ofp_meter_config.
	OfpMultipartType_OFPMP_METER_CONFIG OfpMultipartType = 10
	// Meter features.
	// The request body is empty.
	// The reply body is struct ofp_meter_features.
	OfpMultipartType_OFPMP_METER_FEATURES OfpMultipartType = 11
	// Table features.
	// The request body is either empty or contains an array of
	// struct ofp_table_features containing the controller's
	// desired view of the switch. If the switch is unable to
	// set the specified view an error is returned.
	// The reply body is an array of struct ofp_table_features.
	OfpMultipartType_OFPMP_TABLE_FEATURES OfpMultipartType = 12
	// Port description.
	// The request body is empty.
	// The reply body is an array of struct ofp_port.
	OfpMultipartType_OFPMP_PORT_DESC OfpMultipartType = 13
	// Experimenter extension.
	// The request and reply bodies begin with
	// struct ofp_experimenter_multipart_header.
	// The request and reply bodies are otherwise experimenter-defined.
	OfpMultipartType_OFPMP_EXPERIMENTER OfpMultipartType = 65535
)

var OfpMultipartType_name = map[int32]string{
	0:     "OFPMP_DESC",
	1:     "OFPMP_FLOW",
	2:     "OFPMP_AGGREGATE",
	3:     "OFPMP_TABLE",
	4:     "OFPMP_PORT_STATS",
	5:     "OFPMP_QUEUE",
	6:     "OFPMP_GROUP",
	7:     "OFPMP_GROUP_DESC",
	8:     "OFPMP_GROUP_FEATURES",
	9:     "OFPMP_METER",
	10:    "OFPMP_METER_CONFIG",
	11:    "OFPMP_METER_FEATURES",
	12:    "OFPMP_TABLE_FEATURES",
	13:    "OFPMP_PORT_DESC",
	65535: "OFPMP_EXPERIMENTER",
}

var OfpMultipartType_value = map[string]int32{
	"OFPMP_DESC":           0,
	"OFPMP_FLOW":           1,
	"OFPMP_AGGREGATE":      2,
	"OFPMP_TABLE":          3,
	"OFPMP_PORT_STATS":     4,
	"OFPMP_QUEUE":          5,
	"OFPMP_GROUP":          6,
	"OFPMP_GROUP_DESC":     7,
	"OFPMP_GROUP_FEATURES": 8,
	"OFPMP_METER":          9,
	"OFPMP_METER_CONFIG":   10,
	"OFPMP_METER_FEATURES": 11,
	"OFPMP_TABLE_FEATURES": 12,
	"OFPMP_PORT_DESC":      13,
	"OFPMP_EXPERIMENTER":   65535,
}

func (x OfpMultipartType) String() string {
	return proto.EnumName(OfpMultipartType_name, int32(x))
}

func (OfpMultipartType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{45}
}

type OfpMultipartRequestFlags int32

const (
	OfpMultipartRequestFlags_OFPMPF_REQ_INVALID OfpMultipartRequestFlags = 0
	OfpMultipartRequestFlags_OFPMPF_REQ_MORE    OfpMultipartRequestFlags = 1
)

var OfpMultipartRequestFlags_name = map[int32]string{
	0: "OFPMPF_REQ_INVALID",
	1: "OFPMPF_REQ_MORE",
}

var OfpMultipartRequestFlags_value = map[string]int32{
	"OFPMPF_REQ_INVALID": 0,
	"OFPMPF_REQ_MORE":    1,
}

func (x OfpMultipartRequestFlags) String() string {
	return proto.EnumName(OfpMultipartRequestFlags_name, int32(x))
}

func (OfpMultipartRequestFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{46}
}

type OfpMultipartReplyFlags int32

const (
	OfpMultipartReplyFlags_OFPMPF_REPLY_INVALID OfpMultipartReplyFlags = 0
	OfpMultipartReplyFlags_OFPMPF_REPLY_MORE    OfpMultipartReplyFlags = 1
)

var OfpMultipartReplyFlags_name = map[int32]string{
	0: "OFPMPF_REPLY_INVALID",
	1: "OFPMPF_REPLY_MORE",
}

var OfpMultipartReplyFlags_value = map[string]int32{
	"OFPMPF_REPLY_INVALID": 0,
	"OFPMPF_REPLY_MORE":    1,
}

func (x OfpMultipartReplyFlags) String() string {
	return proto.EnumName(OfpMultipartReplyFlags_name, int32(x))
}

func (OfpMultipartReplyFlags) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{47}
}

// Table Feature property types.
// Low order bit cleared indicates a property for a regular Flow Entry.
// Low order bit set indicates a property for the Table-Miss Flow Entry.
type OfpTableFeaturePropType int32

const (
	OfpTableFeaturePropType_OFPTFPT_INSTRUCTIONS        OfpTableFeaturePropType = 0
	OfpTableFeaturePropType_OFPTFPT_INSTRUCTIONS_MISS   OfpTableFeaturePropType = 1
	OfpTableFeaturePropType_OFPTFPT_NEXT_TABLES         OfpTableFeaturePropType = 2
	OfpTableFeaturePropType_OFPTFPT_NEXT_TABLES_MISS    OfpTableFeaturePropType = 3
	OfpTableFeaturePropType_OFPTFPT_WRITE_ACTIONS       OfpTableFeaturePropType = 4
	OfpTableFeaturePropType_OFPTFPT_WRITE_ACTIONS_MISS  OfpTableFeaturePropType = 5
	OfpTableFeaturePropType_OFPTFPT_APPLY_ACTIONS       OfpTableFeaturePropType = 6
	OfpTableFeaturePropType_OFPTFPT_APPLY_ACTIONS_MISS  OfpTableFeaturePropType = 7
	OfpTableFeaturePropType_OFPTFPT_MATCH               OfpTableFeaturePropType = 8
	OfpTableFeaturePropType_OFPTFPT_WILDCARDS           OfpTableFeaturePropType = 10
	OfpTableFeaturePropType_OFPTFPT_WRITE_SETFIELD      OfpTableFeaturePropType = 12
	OfpTableFeaturePropType_OFPTFPT_WRITE_SETFIELD_MISS OfpTableFeaturePropType = 13
	OfpTableFeaturePropType_OFPTFPT_APPLY_SETFIELD      OfpTableFeaturePropType = 14
	OfpTableFeaturePropType_OFPTFPT_APPLY_SETFIELD_MISS OfpTableFeaturePropType = 15
	OfpTableFeaturePropType_OFPTFPT_EXPERIMENTER        OfpTableFeaturePropType = 65534
	OfpTableFeaturePropType_OFPTFPT_EXPERIMENTER_MISS   OfpTableFeaturePropType = 65535
)

var OfpTableFeaturePropType_name = map[int32]string{
	0:     "OFPTFPT_INSTRUCTIONS",
	1:     "OFPTFPT_INSTRUCTIONS_MISS",
	2:     "OFPTFPT_NEXT_TABLES",
	3:     "OFPTFPT_NEXT_TABLES_MISS",
	4:     "OFPTFPT_WRITE_ACTIONS",
	5:     "OFPTFPT_WRITE_ACTIONS_MISS",
	6:     "OFPTFPT_APPLY_ACTIONS",
	7:     "OFPTFPT_APPLY_ACTIONS_MISS",
	8:     "OFPTFPT_MATCH",
	10:    "OFPTFPT_WILDCARDS",
	12:    "OFPTFPT_WRITE_SETFIELD",
	13:    "OFPTFPT_WRITE_SETFIELD_MISS",
	14:    "OFPTFPT_APPLY_SETFIELD",
	15:    "OFPTFPT_APPLY_SETFIELD_MISS",
	65534: "OFPTFPT_EXPERIMENTER",
	65535: "OFPTFPT_EXPERIMENTER_MISS",
}

var OfpTableFeaturePropType_value = map[string]int32{
	"OFPTFPT_INSTRUCTIONS":        0,
	"OFPTFPT_INSTRUCTIONS_MISS":   1,
	"OFPTFPT_NEXT_TABLES":         2,
	"OFPTFPT_NEXT_TABLES_MISS":    3,
	"OFPTFPT_WRITE_ACTIONS":       4,
	"OFPTFPT_WRITE_ACTIONS_MISS":  5,
	"OFPTFPT_APPLY_ACTIONS":       6,
	"OFPTFPT_APPLY_ACTIONS_MISS":  7,
	"OFPTFPT_MATCH":               8,
	"OFPTFPT_WILDCARDS":           10,
	"OFPTFPT_WRITE_SETFIELD":      12,
	"OFPTFPT_WRITE_SETFIELD_MISS": 13,
	"OFPTFPT_APPLY_SETFIELD":      14,
	"OFPTFPT_APPLY_SETFIELD_MISS": 15,
	"OFPTFPT_EXPERIMENTER":        65534,
	"OFPTFPT_EXPERIMENTER_MISS":   65535,
}

func (x OfpTableFeaturePropType) String() string {
	return proto.EnumName(OfpTableFeaturePropType_name, int32(x))
}

func (OfpTableFeaturePropType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{48}
}

// Group configuration flags
type OfpGroupCapabilities int32

const (
	OfpGroupCapabilities_OFPGFC_INVALID         OfpGroupCapabilities = 0
	OfpGroupCapabilities_OFPGFC_SELECT_WEIGHT   OfpGroupCapabilities = 1
	OfpGroupCapabilities_OFPGFC_SELECT_LIVENESS OfpGroupCapabilities = 2
	OfpGroupCapabilities_OFPGFC_CHAINING        OfpGroupCapabilities = 4
	OfpGroupCapabilities_OFPGFC_CHAINING_CHECKS OfpGroupCapabilities = 8
)

var OfpGroupCapabilities_name = map[int32]string{
	0: "OFPGFC_INVALID",
	1: "OFPGFC_SELECT_WEIGHT",
	2: "OFPGFC_SELECT_LIVENESS",
	4: "OFPGFC_CHAINING",
	8: "OFPGFC_CHAINING_CHECKS",
}

var OfpGroupCapabilities_value = map[string]int32{
	"OFPGFC_INVALID":         0,
	"OFPGFC_SELECT_WEIGHT":   1,
	"OFPGFC_SELECT_LIVENESS": 2,
	"OFPGFC_CHAINING":        4,
	"OFPGFC_CHAINING_CHECKS": 8,
}

func (x OfpGroupCapabilities) String() string {
	return proto.EnumName(OfpGroupCapabilities_name, int32(x))
}

func (OfpGroupCapabilities) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{49}
}

type OfpQueueProperties int32

const (
	OfpQueueProperties_OFPQT_INVALID      OfpQueueProperties = 0
	OfpQueueProperties_OFPQT_MIN_RATE     OfpQueueProperties = 1
	OfpQueueProperties_OFPQT_MAX_RATE     OfpQueueProperties = 2
	OfpQueueProperties_OFPQT_EXPERIMENTER OfpQueueProperties = 65535
)

var OfpQueueProperties_name = map[int32]string{
	0:     "OFPQT_INVALID",
	1:     "OFPQT_MIN_RATE",
	2:     "OFPQT_MAX_RATE",
	65535: "OFPQT_EXPERIMENTER",
}

var OfpQueueProperties_value = map[string]int32{
	"OFPQT_INVALID":      0,
	"OFPQT_MIN_RATE":     1,
	"OFPQT_MAX_RATE":     2,
	"OFPQT_EXPERIMENTER": 65535,
}

func (x OfpQueueProperties) String() string {
	return proto.EnumName(OfpQueueProperties_name, int32(x))
}

func (OfpQueueProperties) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{50}
}

// Controller roles.
type OfpControllerRole int32

const (
	OfpControllerRole_OFPCR_ROLE_NOCHANGE OfpControllerRole = 0
	OfpControllerRole_OFPCR_ROLE_EQUAL    OfpControllerRole = 1
	OfpControllerRole_OFPCR_ROLE_MASTER   OfpControllerRole = 2
	OfpControllerRole_OFPCR_ROLE_SLAVE    OfpControllerRole = 3
)

var OfpControllerRole_name = map[int32]string{
	0: "OFPCR_ROLE_NOCHANGE",
	1: "OFPCR_ROLE_EQUAL",
	2: "OFPCR_ROLE_MASTER",
	3: "OFPCR_ROLE_SLAVE",
}

var OfpControllerRole_value = map[string]int32{
	"OFPCR_ROLE_NOCHANGE": 0,
	"OFPCR_ROLE_EQUAL":    1,
	"OFPCR_ROLE_MASTER":   2,
	"OFPCR_ROLE_SLAVE":    3,
}

func (x OfpControllerRole) String() string {
	return proto.EnumName(OfpControllerRole_name, int32(x))
}

func (OfpControllerRole) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{51}
}

// Header on all OpenFlow packets.
type OfpHeader struct {
	Version              uint32   `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
	Type                 OfpType  `protobuf:"varint,2,opt,name=type,proto3,enum=openflow_13.OfpType" json:"type,omitempty"`
	Xid                  uint32   `protobuf:"varint,3,opt,name=xid,proto3" json:"xid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_OfpHeader proto.InternalMessageInfo

func (m *OfpHeader) GetVersion() uint32 {
	if m != nil {
		return m.Version
	}
	return 0
}

func (m *OfpHeader) GetType() OfpType {
	if m != nil {
		return m.Type
	}
	return OfpType_OFPT_HELLO
}

func (m *OfpHeader) GetXid() uint32 {
	if m != nil {
		return m.Xid
	}
	return 0
}

// Common header for all Hello Elements
type OfpHelloElemHeader struct {
	Type OfpHelloElemType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpHelloElemType" json:"type,omitempty"`
	// Types that are valid to be assigned to Element:
	//	*OfpHelloElemHeader_Versionbitmap
	Element              isOfpHelloElemHeader_Element `protobuf_oneof:"element"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *OfpHelloElemHeader) Reset()         { *m = OfpHelloElemHeader{} }
func (m *OfpHelloElemHeader) String() string { return proto.CompactTextString(m) }
func (*OfpHelloElemHeader) ProtoMessage()    {}
func (*OfpHelloElemHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{1}
}

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

var xxx_messageInfo_OfpHelloElemHeader proto.InternalMessageInfo

func (m *OfpHelloElemHeader) GetType() OfpHelloElemType {
	if m != nil {
		return m.Type
	}
	return OfpHelloElemType_OFPHET_INVALID
}

type isOfpHelloElemHeader_Element interface {
	isOfpHelloElemHeader_Element()
}

type OfpHelloElemHeader_Versionbitmap struct {
	Versionbitmap *OfpHelloElemVersionbitmap `protobuf:"bytes,2,opt,name=versionbitmap,proto3,oneof"`
}

func (*OfpHelloElemHeader_Versionbitmap) isOfpHelloElemHeader_Element() {}

func (m *OfpHelloElemHeader) GetElement() isOfpHelloElemHeader_Element {
	if m != nil {
		return m.Element
	}
	return nil
}

func (m *OfpHelloElemHeader) GetVersionbitmap() *OfpHelloElemVersionbitmap {
	if x, ok := m.GetElement().(*OfpHelloElemHeader_Versionbitmap); ok {
		return x.Versionbitmap
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpHelloElemHeader) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpHelloElemHeader_Versionbitmap)(nil),
	}
}

// Version bitmap Hello Element
type OfpHelloElemVersionbitmap struct {
	Bitmaps              []uint32 `protobuf:"varint,2,rep,packed,name=bitmaps,proto3" json:"bitmaps,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpHelloElemVersionbitmap) Reset()         { *m = OfpHelloElemVersionbitmap{} }
func (m *OfpHelloElemVersionbitmap) String() string { return proto.CompactTextString(m) }
func (*OfpHelloElemVersionbitmap) ProtoMessage()    {}
func (*OfpHelloElemVersionbitmap) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{2}
}

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

var xxx_messageInfo_OfpHelloElemVersionbitmap proto.InternalMessageInfo

func (m *OfpHelloElemVersionbitmap) GetBitmaps() []uint32 {
	if m != nil {
		return m.Bitmaps
	}
	return nil
}

// OFPT_HELLO.  This message includes zero or more hello elements having
// variable size. Unknown elements types must be ignored/skipped, to allow
// for future extensions.
type OfpHello struct {
	// Hello element list
	Elements             []*OfpHelloElemHeader `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpHello) Reset()         { *m = OfpHello{} }
func (m *OfpHello) String() string { return proto.CompactTextString(m) }
func (*OfpHello) ProtoMessage()    {}
func (*OfpHello) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{3}
}

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

var xxx_messageInfo_OfpHello proto.InternalMessageInfo

func (m *OfpHello) GetElements() []*OfpHelloElemHeader {
	if m != nil {
		return m.Elements
	}
	return nil
}

// Switch configuration.
type OfpSwitchConfig struct {
	//ofp_header header;
	Flags                uint32   `protobuf:"varint,1,opt,name=flags,proto3" json:"flags,omitempty"`
	MissSendLen          uint32   `protobuf:"varint,2,opt,name=miss_send_len,json=missSendLen,proto3" json:"miss_send_len,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpSwitchConfig) Reset()         { *m = OfpSwitchConfig{} }
func (m *OfpSwitchConfig) String() string { return proto.CompactTextString(m) }
func (*OfpSwitchConfig) ProtoMessage()    {}
func (*OfpSwitchConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{4}
}

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

var xxx_messageInfo_OfpSwitchConfig proto.InternalMessageInfo

func (m *OfpSwitchConfig) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpSwitchConfig) GetMissSendLen() uint32 {
	if m != nil {
		return m.MissSendLen
	}
	return 0
}

// Configure/Modify behavior of a flow table
type OfpTableMod struct {
	//ofp_header header;
	TableId              uint32   `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Config               uint32   `protobuf:"varint,2,opt,name=config,proto3" json:"config,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableMod) Reset()         { *m = OfpTableMod{} }
func (m *OfpTableMod) String() string { return proto.CompactTextString(m) }
func (*OfpTableMod) ProtoMessage()    {}
func (*OfpTableMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{5}
}

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

var xxx_messageInfo_OfpTableMod proto.InternalMessageInfo

func (m *OfpTableMod) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpTableMod) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

// Description of a port
type OfpPort struct {
	PortNo uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	HwAddr []uint32 `protobuf:"varint,2,rep,packed,name=hw_addr,json=hwAddr,proto3" json:"hw_addr,omitempty"`
	Name   string   `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	Config uint32   `protobuf:"varint,4,opt,name=config,proto3" json:"config,omitempty"`
	State  uint32   `protobuf:"varint,5,opt,name=state,proto3" json:"state,omitempty"`
	// Bitmaps of OFPPF_* that describe features.  All bits zeroed if
	// unsupported or unavailable.
	Curr                 uint32   `protobuf:"varint,6,opt,name=curr,proto3" json:"curr,omitempty"`
	Advertised           uint32   `protobuf:"varint,7,opt,name=advertised,proto3" json:"advertised,omitempty"`
	Supported            uint32   `protobuf:"varint,8,opt,name=supported,proto3" json:"supported,omitempty"`
	Peer                 uint32   `protobuf:"varint,9,opt,name=peer,proto3" json:"peer,omitempty"`
	CurrSpeed            uint32   `protobuf:"varint,10,opt,name=curr_speed,json=currSpeed,proto3" json:"curr_speed,omitempty"`
	MaxSpeed             uint32   `protobuf:"varint,11,opt,name=max_speed,json=maxSpeed,proto3" json:"max_speed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPort) Reset()         { *m = OfpPort{} }
func (m *OfpPort) String() string { return proto.CompactTextString(m) }
func (*OfpPort) ProtoMessage()    {}
func (*OfpPort) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{6}
}

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

var xxx_messageInfo_OfpPort proto.InternalMessageInfo

func (m *OfpPort) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpPort) GetHwAddr() []uint32 {
	if m != nil {
		return m.HwAddr
	}
	return nil
}

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

func (m *OfpPort) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

func (m *OfpPort) GetState() uint32 {
	if m != nil {
		return m.State
	}
	return 0
}

func (m *OfpPort) GetCurr() uint32 {
	if m != nil {
		return m.Curr
	}
	return 0
}

func (m *OfpPort) GetAdvertised() uint32 {
	if m != nil {
		return m.Advertised
	}
	return 0
}

func (m *OfpPort) GetSupported() uint32 {
	if m != nil {
		return m.Supported
	}
	return 0
}

func (m *OfpPort) GetPeer() uint32 {
	if m != nil {
		return m.Peer
	}
	return 0
}

func (m *OfpPort) GetCurrSpeed() uint32 {
	if m != nil {
		return m.CurrSpeed
	}
	return 0
}

func (m *OfpPort) GetMaxSpeed() uint32 {
	if m != nil {
		return m.MaxSpeed
	}
	return 0
}

// Switch features.
type OfpSwitchFeatures struct {
	//ofp_header header;
	DatapathId  uint64 `protobuf:"varint,1,opt,name=datapath_id,json=datapathId,proto3" json:"datapath_id,omitempty"`
	NBuffers    uint32 `protobuf:"varint,2,opt,name=n_buffers,json=nBuffers,proto3" json:"n_buffers,omitempty"`
	NTables     uint32 `protobuf:"varint,3,opt,name=n_tables,json=nTables,proto3" json:"n_tables,omitempty"`
	AuxiliaryId uint32 `protobuf:"varint,4,opt,name=auxiliary_id,json=auxiliaryId,proto3" json:"auxiliary_id,omitempty"`
	// Features.
	Capabilities         uint32   `protobuf:"varint,5,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpSwitchFeatures) Reset()         { *m = OfpSwitchFeatures{} }
func (m *OfpSwitchFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpSwitchFeatures) ProtoMessage()    {}
func (*OfpSwitchFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{7}
}

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

var xxx_messageInfo_OfpSwitchFeatures proto.InternalMessageInfo

func (m *OfpSwitchFeatures) GetDatapathId() uint64 {
	if m != nil {
		return m.DatapathId
	}
	return 0
}

func (m *OfpSwitchFeatures) GetNBuffers() uint32 {
	if m != nil {
		return m.NBuffers
	}
	return 0
}

func (m *OfpSwitchFeatures) GetNTables() uint32 {
	if m != nil {
		return m.NTables
	}
	return 0
}

func (m *OfpSwitchFeatures) GetAuxiliaryId() uint32 {
	if m != nil {
		return m.AuxiliaryId
	}
	return 0
}

func (m *OfpSwitchFeatures) GetCapabilities() uint32 {
	if m != nil {
		return m.Capabilities
	}
	return 0
}

// A physical port has changed in the datapath
type OfpPortStatus struct {
	//ofp_header header;
	Reason               OfpPortReason `protobuf:"varint,1,opt,name=reason,proto3,enum=openflow_13.OfpPortReason" json:"reason,omitempty"`
	Desc                 *OfpPort      `protobuf:"bytes,2,opt,name=desc,proto3" json:"desc,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *OfpPortStatus) Reset()         { *m = OfpPortStatus{} }
func (m *OfpPortStatus) String() string { return proto.CompactTextString(m) }
func (*OfpPortStatus) ProtoMessage()    {}
func (*OfpPortStatus) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{8}
}

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

var xxx_messageInfo_OfpPortStatus proto.InternalMessageInfo

func (m *OfpPortStatus) GetReason() OfpPortReason {
	if m != nil {
		return m.Reason
	}
	return OfpPortReason_OFPPR_ADD
}

func (m *OfpPortStatus) GetDesc() *OfpPort {
	if m != nil {
		return m.Desc
	}
	return nil
}

// Modify behavior of the physical port
type OfpPortMod struct {
	//ofp_header header;
	PortNo uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	HwAddr []uint32 `protobuf:"varint,2,rep,packed,name=hw_addr,json=hwAddr,proto3" json:"hw_addr,omitempty"`
	// The hardware address is not
	//configurable.  This is used to
	//sanity-check the request, so it must
	//be the same as returned in an
	//ofp_port struct.
	Config               uint32   `protobuf:"varint,3,opt,name=config,proto3" json:"config,omitempty"`
	Mask                 uint32   `protobuf:"varint,4,opt,name=mask,proto3" json:"mask,omitempty"`
	Advertise            uint32   `protobuf:"varint,5,opt,name=advertise,proto3" json:"advertise,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPortMod) Reset()         { *m = OfpPortMod{} }
func (m *OfpPortMod) String() string { return proto.CompactTextString(m) }
func (*OfpPortMod) ProtoMessage()    {}
func (*OfpPortMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{9}
}

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

var xxx_messageInfo_OfpPortMod proto.InternalMessageInfo

func (m *OfpPortMod) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpPortMod) GetHwAddr() []uint32 {
	if m != nil {
		return m.HwAddr
	}
	return nil
}

func (m *OfpPortMod) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

func (m *OfpPortMod) GetMask() uint32 {
	if m != nil {
		return m.Mask
	}
	return 0
}

func (m *OfpPortMod) GetAdvertise() uint32 {
	if m != nil {
		return m.Advertise
	}
	return 0
}

// Fields to match against flows
type OfpMatch struct {
	Type                 OfpMatchType   `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMatchType" json:"type,omitempty"`
	OxmFields            []*OfpOxmField `protobuf:"bytes,2,rep,name=oxm_fields,json=oxmFields,proto3" json:"oxm_fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *OfpMatch) Reset()         { *m = OfpMatch{} }
func (m *OfpMatch) String() string { return proto.CompactTextString(m) }
func (*OfpMatch) ProtoMessage()    {}
func (*OfpMatch) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{10}
}

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

var xxx_messageInfo_OfpMatch proto.InternalMessageInfo

func (m *OfpMatch) GetType() OfpMatchType {
	if m != nil {
		return m.Type
	}
	return OfpMatchType_OFPMT_STANDARD
}

func (m *OfpMatch) GetOxmFields() []*OfpOxmField {
	if m != nil {
		return m.OxmFields
	}
	return nil
}

// OXM Flow match fields
type OfpOxmField struct {
	OxmClass OfpOxmClass `protobuf:"varint,1,opt,name=oxm_class,json=oxmClass,proto3,enum=openflow_13.OfpOxmClass" json:"oxm_class,omitempty"`
	// Types that are valid to be assigned to Field:
	//	*OfpOxmField_OfbField
	//	*OfpOxmField_ExperimenterField
	Field                isOfpOxmField_Field `protobuf_oneof:"field"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpOxmField) Reset()         { *m = OfpOxmField{} }
func (m *OfpOxmField) String() string { return proto.CompactTextString(m) }
func (*OfpOxmField) ProtoMessage()    {}
func (*OfpOxmField) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{11}
}

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

var xxx_messageInfo_OfpOxmField proto.InternalMessageInfo

func (m *OfpOxmField) GetOxmClass() OfpOxmClass {
	if m != nil {
		return m.OxmClass
	}
	return OfpOxmClass_OFPXMC_NXM_0
}

type isOfpOxmField_Field interface {
	isOfpOxmField_Field()
}

type OfpOxmField_OfbField struct {
	OfbField *OfpOxmOfbField `protobuf:"bytes,4,opt,name=ofb_field,json=ofbField,proto3,oneof"`
}

type OfpOxmField_ExperimenterField struct {
	ExperimenterField *OfpOxmExperimenterField `protobuf:"bytes,5,opt,name=experimenter_field,json=experimenterField,proto3,oneof"`
}

func (*OfpOxmField_OfbField) isOfpOxmField_Field() {}

func (*OfpOxmField_ExperimenterField) isOfpOxmField_Field() {}

func (m *OfpOxmField) GetField() isOfpOxmField_Field {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *OfpOxmField) GetOfbField() *OfpOxmOfbField {
	if x, ok := m.GetField().(*OfpOxmField_OfbField); ok {
		return x.OfbField
	}
	return nil
}

func (m *OfpOxmField) GetExperimenterField() *OfpOxmExperimenterField {
	if x, ok := m.GetField().(*OfpOxmField_ExperimenterField); ok {
		return x.ExperimenterField
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpOxmField) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpOxmField_OfbField)(nil),
		(*OfpOxmField_ExperimenterField)(nil),
	}
}

// OXM OpenFlow Basic Match Field
type OfpOxmOfbField struct {
	Type    OxmOfbFieldTypes `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OxmOfbFieldTypes" json:"type,omitempty"`
	HasMask bool             `protobuf:"varint,2,opt,name=has_mask,json=hasMask,proto3" json:"has_mask,omitempty"`
	// Types that are valid to be assigned to Value:
	//	*OfpOxmOfbField_Port
	//	*OfpOxmOfbField_PhysicalPort
	//	*OfpOxmOfbField_TableMetadata
	//	*OfpOxmOfbField_EthDst
	//	*OfpOxmOfbField_EthSrc
	//	*OfpOxmOfbField_EthType
	//	*OfpOxmOfbField_VlanVid
	//	*OfpOxmOfbField_VlanPcp
	//	*OfpOxmOfbField_IpDscp
	//	*OfpOxmOfbField_IpEcn
	//	*OfpOxmOfbField_IpProto
	//	*OfpOxmOfbField_Ipv4Src
	//	*OfpOxmOfbField_Ipv4Dst
	//	*OfpOxmOfbField_TcpSrc
	//	*OfpOxmOfbField_TcpDst
	//	*OfpOxmOfbField_UdpSrc
	//	*OfpOxmOfbField_UdpDst
	//	*OfpOxmOfbField_SctpSrc
	//	*OfpOxmOfbField_SctpDst
	//	*OfpOxmOfbField_Icmpv4Type
	//	*OfpOxmOfbField_Icmpv4Code
	//	*OfpOxmOfbField_ArpOp
	//	*OfpOxmOfbField_ArpSpa
	//	*OfpOxmOfbField_ArpTpa
	//	*OfpOxmOfbField_ArpSha
	//	*OfpOxmOfbField_ArpTha
	//	*OfpOxmOfbField_Ipv6Src
	//	*OfpOxmOfbField_Ipv6Dst
	//	*OfpOxmOfbField_Ipv6Flabel
	//	*OfpOxmOfbField_Icmpv6Type
	//	*OfpOxmOfbField_Icmpv6Code
	//	*OfpOxmOfbField_Ipv6NdTarget
	//	*OfpOxmOfbField_Ipv6NdSsl
	//	*OfpOxmOfbField_Ipv6NdTll
	//	*OfpOxmOfbField_MplsLabel
	//	*OfpOxmOfbField_MplsTc
	//	*OfpOxmOfbField_MplsBos
	//	*OfpOxmOfbField_PbbIsid
	//	*OfpOxmOfbField_TunnelId
	//	*OfpOxmOfbField_Ipv6Exthdr
	Value isOfpOxmOfbField_Value `protobuf_oneof:"value"`
	// Optional mask values (must be present when has_mask is true
	//
	// Types that are valid to be assigned to Mask:
	//	*OfpOxmOfbField_TableMetadataMask
	//	*OfpOxmOfbField_EthDstMask
	//	*OfpOxmOfbField_EthSrcMask
	//	*OfpOxmOfbField_VlanVidMask
	//	*OfpOxmOfbField_Ipv4SrcMask
	//	*OfpOxmOfbField_Ipv4DstMask
	//	*OfpOxmOfbField_ArpSpaMask
	//	*OfpOxmOfbField_ArpTpaMask
	//	*OfpOxmOfbField_Ipv6SrcMask
	//	*OfpOxmOfbField_Ipv6DstMask
	//	*OfpOxmOfbField_Ipv6FlabelMask
	//	*OfpOxmOfbField_PbbIsidMask
	//	*OfpOxmOfbField_TunnelIdMask
	//	*OfpOxmOfbField_Ipv6ExthdrMask
	Mask                 isOfpOxmOfbField_Mask `protobuf_oneof:"mask"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpOxmOfbField) Reset()         { *m = OfpOxmOfbField{} }
func (m *OfpOxmOfbField) String() string { return proto.CompactTextString(m) }
func (*OfpOxmOfbField) ProtoMessage()    {}
func (*OfpOxmOfbField) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{12}
}

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

var xxx_messageInfo_OfpOxmOfbField proto.InternalMessageInfo

func (m *OfpOxmOfbField) GetType() OxmOfbFieldTypes {
	if m != nil {
		return m.Type
	}
	return OxmOfbFieldTypes_OFPXMT_OFB_IN_PORT
}

func (m *OfpOxmOfbField) GetHasMask() bool {
	if m != nil {
		return m.HasMask
	}
	return false
}

type isOfpOxmOfbField_Value interface {
	isOfpOxmOfbField_Value()
}

type OfpOxmOfbField_Port struct {
	Port uint32 `protobuf:"varint,3,opt,name=port,proto3,oneof"`
}

type OfpOxmOfbField_PhysicalPort struct {
	PhysicalPort uint32 `protobuf:"varint,4,opt,name=physical_port,json=physicalPort,proto3,oneof"`
}

type OfpOxmOfbField_TableMetadata struct {
	TableMetadata uint64 `protobuf:"varint,5,opt,name=table_metadata,json=tableMetadata,proto3,oneof"`
}

type OfpOxmOfbField_EthDst struct {
	EthDst []byte `protobuf:"bytes,6,opt,name=eth_dst,json=ethDst,proto3,oneof"`
}

type OfpOxmOfbField_EthSrc struct {
	EthSrc []byte `protobuf:"bytes,7,opt,name=eth_src,json=ethSrc,proto3,oneof"`
}

type OfpOxmOfbField_EthType struct {
	EthType uint32 `protobuf:"varint,8,opt,name=eth_type,json=ethType,proto3,oneof"`
}

type OfpOxmOfbField_VlanVid struct {
	VlanVid uint32 `protobuf:"varint,9,opt,name=vlan_vid,json=vlanVid,proto3,oneof"`
}

type OfpOxmOfbField_VlanPcp struct {
	VlanPcp uint32 `protobuf:"varint,10,opt,name=vlan_pcp,json=vlanPcp,proto3,oneof"`
}

type OfpOxmOfbField_IpDscp struct {
	IpDscp uint32 `protobuf:"varint,11,opt,name=ip_dscp,json=ipDscp,proto3,oneof"`
}

type OfpOxmOfbField_IpEcn struct {
	IpEcn uint32 `protobuf:"varint,12,opt,name=ip_ecn,json=ipEcn,proto3,oneof"`
}

type OfpOxmOfbField_IpProto struct {
	IpProto uint32 `protobuf:"varint,13,opt,name=ip_proto,json=ipProto,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4Src struct {
	Ipv4Src uint32 `protobuf:"varint,14,opt,name=ipv4_src,json=ipv4Src,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4Dst struct {
	Ipv4Dst uint32 `protobuf:"varint,15,opt,name=ipv4_dst,json=ipv4Dst,proto3,oneof"`
}

type OfpOxmOfbField_TcpSrc struct {
	TcpSrc uint32 `protobuf:"varint,16,opt,name=tcp_src,json=tcpSrc,proto3,oneof"`
}

type OfpOxmOfbField_TcpDst struct {
	TcpDst uint32 `protobuf:"varint,17,opt,name=tcp_dst,json=tcpDst,proto3,oneof"`
}

type OfpOxmOfbField_UdpSrc struct {
	UdpSrc uint32 `protobuf:"varint,18,opt,name=udp_src,json=udpSrc,proto3,oneof"`
}

type OfpOxmOfbField_UdpDst struct {
	UdpDst uint32 `protobuf:"varint,19,opt,name=udp_dst,json=udpDst,proto3,oneof"`
}

type OfpOxmOfbField_SctpSrc struct {
	SctpSrc uint32 `protobuf:"varint,20,opt,name=sctp_src,json=sctpSrc,proto3,oneof"`
}

type OfpOxmOfbField_SctpDst struct {
	SctpDst uint32 `protobuf:"varint,21,opt,name=sctp_dst,json=sctpDst,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv4Type struct {
	Icmpv4Type uint32 `protobuf:"varint,22,opt,name=icmpv4_type,json=icmpv4Type,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv4Code struct {
	Icmpv4Code uint32 `protobuf:"varint,23,opt,name=icmpv4_code,json=icmpv4Code,proto3,oneof"`
}

type OfpOxmOfbField_ArpOp struct {
	ArpOp uint32 `protobuf:"varint,24,opt,name=arp_op,json=arpOp,proto3,oneof"`
}

type OfpOxmOfbField_ArpSpa struct {
	ArpSpa uint32 `protobuf:"varint,25,opt,name=arp_spa,json=arpSpa,proto3,oneof"`
}

type OfpOxmOfbField_ArpTpa struct {
	ArpTpa uint32 `protobuf:"varint,26,opt,name=arp_tpa,json=arpTpa,proto3,oneof"`
}

type OfpOxmOfbField_ArpSha struct {
	ArpSha []byte `protobuf:"bytes,27,opt,name=arp_sha,json=arpSha,proto3,oneof"`
}

type OfpOxmOfbField_ArpTha struct {
	ArpTha []byte `protobuf:"bytes,28,opt,name=arp_tha,json=arpTha,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Src struct {
	Ipv6Src []byte `protobuf:"bytes,29,opt,name=ipv6_src,json=ipv6Src,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Dst struct {
	Ipv6Dst []byte `protobuf:"bytes,30,opt,name=ipv6_dst,json=ipv6Dst,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Flabel struct {
	Ipv6Flabel uint32 `protobuf:"varint,31,opt,name=ipv6_flabel,json=ipv6Flabel,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv6Type struct {
	Icmpv6Type uint32 `protobuf:"varint,32,opt,name=icmpv6_type,json=icmpv6Type,proto3,oneof"`
}

type OfpOxmOfbField_Icmpv6Code struct {
	Icmpv6Code uint32 `protobuf:"varint,33,opt,name=icmpv6_code,json=icmpv6Code,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6NdTarget struct {
	Ipv6NdTarget []byte `protobuf:"bytes,34,opt,name=ipv6_nd_target,json=ipv6NdTarget,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6NdSsl struct {
	Ipv6NdSsl []byte `protobuf:"bytes,35,opt,name=ipv6_nd_ssl,json=ipv6NdSsl,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6NdTll struct {
	Ipv6NdTll []byte `protobuf:"bytes,36,opt,name=ipv6_nd_tll,json=ipv6NdTll,proto3,oneof"`
}

type OfpOxmOfbField_MplsLabel struct {
	MplsLabel uint32 `protobuf:"varint,37,opt,name=mpls_label,json=mplsLabel,proto3,oneof"`
}

type OfpOxmOfbField_MplsTc struct {
	MplsTc uint32 `protobuf:"varint,38,opt,name=mpls_tc,json=mplsTc,proto3,oneof"`
}

type OfpOxmOfbField_MplsBos struct {
	MplsBos uint32 `protobuf:"varint,39,opt,name=mpls_bos,json=mplsBos,proto3,oneof"`
}

type OfpOxmOfbField_PbbIsid struct {
	PbbIsid uint32 `protobuf:"varint,40,opt,name=pbb_isid,json=pbbIsid,proto3,oneof"`
}

type OfpOxmOfbField_TunnelId struct {
	TunnelId uint64 `protobuf:"varint,41,opt,name=tunnel_id,json=tunnelId,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6Exthdr struct {
	Ipv6Exthdr uint32 `protobuf:"varint,42,opt,name=ipv6_exthdr,json=ipv6Exthdr,proto3,oneof"`
}

func (*OfpOxmOfbField_Port) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_PhysicalPort) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TableMetadata) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_EthDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_EthSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_EthType) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_VlanVid) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_VlanPcp) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_IpDscp) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_IpEcn) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_IpProto) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv4Src) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv4Dst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TcpSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TcpDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_UdpSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_UdpDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_SctpSrc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_SctpDst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv4Type) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv4Code) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpOp) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpSpa) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpTpa) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpSha) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_ArpTha) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Src) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Dst) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Flabel) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv6Type) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Icmpv6Code) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6NdTarget) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6NdSsl) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6NdTll) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_MplsLabel) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_MplsTc) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_MplsBos) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_PbbIsid) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_TunnelId) isOfpOxmOfbField_Value() {}

func (*OfpOxmOfbField_Ipv6Exthdr) isOfpOxmOfbField_Value() {}

func (m *OfpOxmOfbField) GetValue() isOfpOxmOfbField_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *OfpOxmOfbField) GetPort() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Port); ok {
		return x.Port
	}
	return 0
}

func (m *OfpOxmOfbField) GetPhysicalPort() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_PhysicalPort); ok {
		return x.PhysicalPort
	}
	return 0
}

func (m *OfpOxmOfbField) GetTableMetadata() uint64 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TableMetadata); ok {
		return x.TableMetadata
	}
	return 0
}

func (m *OfpOxmOfbField) GetEthDst() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_EthDst); ok {
		return x.EthDst
	}
	return nil
}

func (m *OfpOxmOfbField) GetEthSrc() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_EthSrc); ok {
		return x.EthSrc
	}
	return nil
}

func (m *OfpOxmOfbField) GetEthType() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_EthType); ok {
		return x.EthType
	}
	return 0
}

func (m *OfpOxmOfbField) GetVlanVid() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_VlanVid); ok {
		return x.VlanVid
	}
	return 0
}

func (m *OfpOxmOfbField) GetVlanPcp() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_VlanPcp); ok {
		return x.VlanPcp
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpDscp() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_IpDscp); ok {
		return x.IpDscp
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpEcn() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_IpEcn); ok {
		return x.IpEcn
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpProto() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_IpProto); ok {
		return x.IpProto
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4Src() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv4Src); ok {
		return x.Ipv4Src
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4Dst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv4Dst); ok {
		return x.Ipv4Dst
	}
	return 0
}

func (m *OfpOxmOfbField) GetTcpSrc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TcpSrc); ok {
		return x.TcpSrc
	}
	return 0
}

func (m *OfpOxmOfbField) GetTcpDst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TcpDst); ok {
		return x.TcpDst
	}
	return 0
}

func (m *OfpOxmOfbField) GetUdpSrc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_UdpSrc); ok {
		return x.UdpSrc
	}
	return 0
}

func (m *OfpOxmOfbField) GetUdpDst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_UdpDst); ok {
		return x.UdpDst
	}
	return 0
}

func (m *OfpOxmOfbField) GetSctpSrc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_SctpSrc); ok {
		return x.SctpSrc
	}
	return 0
}

func (m *OfpOxmOfbField) GetSctpDst() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_SctpDst); ok {
		return x.SctpDst
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv4Type() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv4Type); ok {
		return x.Icmpv4Type
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv4Code() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv4Code); ok {
		return x.Icmpv4Code
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpOp() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpOp); ok {
		return x.ArpOp
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpSpa() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpSpa); ok {
		return x.ArpSpa
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpTpa() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpTpa); ok {
		return x.ArpTpa
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpSha() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpSha); ok {
		return x.ArpSha
	}
	return nil
}

func (m *OfpOxmOfbField) GetArpTha() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_ArpTha); ok {
		return x.ArpTha
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6Src() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Src); ok {
		return x.Ipv6Src
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6Dst() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Dst); ok {
		return x.Ipv6Dst
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6Flabel() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Flabel); ok {
		return x.Ipv6Flabel
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv6Type() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv6Type); ok {
		return x.Icmpv6Type
	}
	return 0
}

func (m *OfpOxmOfbField) GetIcmpv6Code() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Icmpv6Code); ok {
		return x.Icmpv6Code
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6NdTarget() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6NdTarget); ok {
		return x.Ipv6NdTarget
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6NdSsl() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6NdSsl); ok {
		return x.Ipv6NdSsl
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6NdTll() []byte {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6NdTll); ok {
		return x.Ipv6NdTll
	}
	return nil
}

func (m *OfpOxmOfbField) GetMplsLabel() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_MplsLabel); ok {
		return x.MplsLabel
	}
	return 0
}

func (m *OfpOxmOfbField) GetMplsTc() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_MplsTc); ok {
		return x.MplsTc
	}
	return 0
}

func (m *OfpOxmOfbField) GetMplsBos() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_MplsBos); ok {
		return x.MplsBos
	}
	return 0
}

func (m *OfpOxmOfbField) GetPbbIsid() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_PbbIsid); ok {
		return x.PbbIsid
	}
	return 0
}

func (m *OfpOxmOfbField) GetTunnelId() uint64 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_TunnelId); ok {
		return x.TunnelId
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6Exthdr() uint32 {
	if x, ok := m.GetValue().(*OfpOxmOfbField_Ipv6Exthdr); ok {
		return x.Ipv6Exthdr
	}
	return 0
}

type isOfpOxmOfbField_Mask interface {
	isOfpOxmOfbField_Mask()
}

type OfpOxmOfbField_TableMetadataMask struct {
	TableMetadataMask uint64 `protobuf:"varint,105,opt,name=table_metadata_mask,json=tableMetadataMask,proto3,oneof"`
}

type OfpOxmOfbField_EthDstMask struct {
	EthDstMask []byte `protobuf:"bytes,106,opt,name=eth_dst_mask,json=ethDstMask,proto3,oneof"`
}

type OfpOxmOfbField_EthSrcMask struct {
	EthSrcMask []byte `protobuf:"bytes,107,opt,name=eth_src_mask,json=ethSrcMask,proto3,oneof"`
}

type OfpOxmOfbField_VlanVidMask struct {
	VlanVidMask uint32 `protobuf:"varint,109,opt,name=vlan_vid_mask,json=vlanVidMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4SrcMask struct {
	Ipv4SrcMask uint32 `protobuf:"varint,114,opt,name=ipv4_src_mask,json=ipv4SrcMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv4DstMask struct {
	Ipv4DstMask uint32 `protobuf:"varint,115,opt,name=ipv4_dst_mask,json=ipv4DstMask,proto3,oneof"`
}

type OfpOxmOfbField_ArpSpaMask struct {
	ArpSpaMask uint32 `protobuf:"varint,125,opt,name=arp_spa_mask,json=arpSpaMask,proto3,oneof"`
}

type OfpOxmOfbField_ArpTpaMask struct {
	ArpTpaMask uint32 `protobuf:"varint,126,opt,name=arp_tpa_mask,json=arpTpaMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6SrcMask struct {
	Ipv6SrcMask []byte `protobuf:"bytes,129,opt,name=ipv6_src_mask,json=ipv6SrcMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6DstMask struct {
	Ipv6DstMask []byte `protobuf:"bytes,130,opt,name=ipv6_dst_mask,json=ipv6DstMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6FlabelMask struct {
	Ipv6FlabelMask uint32 `protobuf:"varint,131,opt,name=ipv6_flabel_mask,json=ipv6FlabelMask,proto3,oneof"`
}

type OfpOxmOfbField_PbbIsidMask struct {
	PbbIsidMask uint32 `protobuf:"varint,140,opt,name=pbb_isid_mask,json=pbbIsidMask,proto3,oneof"`
}

type OfpOxmOfbField_TunnelIdMask struct {
	TunnelIdMask uint64 `protobuf:"varint,141,opt,name=tunnel_id_mask,json=tunnelIdMask,proto3,oneof"`
}

type OfpOxmOfbField_Ipv6ExthdrMask struct {
	Ipv6ExthdrMask uint32 `protobuf:"varint,142,opt,name=ipv6_exthdr_mask,json=ipv6ExthdrMask,proto3,oneof"`
}

func (*OfpOxmOfbField_TableMetadataMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_EthDstMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_EthSrcMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_VlanVidMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv4SrcMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv4DstMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_ArpSpaMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_ArpTpaMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6SrcMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6DstMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6FlabelMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_PbbIsidMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_TunnelIdMask) isOfpOxmOfbField_Mask() {}

func (*OfpOxmOfbField_Ipv6ExthdrMask) isOfpOxmOfbField_Mask() {}

func (m *OfpOxmOfbField) GetMask() isOfpOxmOfbField_Mask {
	if m != nil {
		return m.Mask
	}
	return nil
}

func (m *OfpOxmOfbField) GetTableMetadataMask() uint64 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_TableMetadataMask); ok {
		return x.TableMetadataMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetEthDstMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_EthDstMask); ok {
		return x.EthDstMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetEthSrcMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_EthSrcMask); ok {
		return x.EthSrcMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetVlanVidMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_VlanVidMask); ok {
		return x.VlanVidMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4SrcMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv4SrcMask); ok {
		return x.Ipv4SrcMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv4DstMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv4DstMask); ok {
		return x.Ipv4DstMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpSpaMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_ArpSpaMask); ok {
		return x.ArpSpaMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetArpTpaMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_ArpTpaMask); ok {
		return x.ArpTpaMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6SrcMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6SrcMask); ok {
		return x.Ipv6SrcMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6DstMask() []byte {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6DstMask); ok {
		return x.Ipv6DstMask
	}
	return nil
}

func (m *OfpOxmOfbField) GetIpv6FlabelMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6FlabelMask); ok {
		return x.Ipv6FlabelMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetPbbIsidMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_PbbIsidMask); ok {
		return x.PbbIsidMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetTunnelIdMask() uint64 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_TunnelIdMask); ok {
		return x.TunnelIdMask
	}
	return 0
}

func (m *OfpOxmOfbField) GetIpv6ExthdrMask() uint32 {
	if x, ok := m.GetMask().(*OfpOxmOfbField_Ipv6ExthdrMask); ok {
		return x.Ipv6ExthdrMask
	}
	return 0
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpOxmOfbField) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpOxmOfbField_Port)(nil),
		(*OfpOxmOfbField_PhysicalPort)(nil),
		(*OfpOxmOfbField_TableMetadata)(nil),
		(*OfpOxmOfbField_EthDst)(nil),
		(*OfpOxmOfbField_EthSrc)(nil),
		(*OfpOxmOfbField_EthType)(nil),
		(*OfpOxmOfbField_VlanVid)(nil),
		(*OfpOxmOfbField_VlanPcp)(nil),
		(*OfpOxmOfbField_IpDscp)(nil),
		(*OfpOxmOfbField_IpEcn)(nil),
		(*OfpOxmOfbField_IpProto)(nil),
		(*OfpOxmOfbField_Ipv4Src)(nil),
		(*OfpOxmOfbField_Ipv4Dst)(nil),
		(*OfpOxmOfbField_TcpSrc)(nil),
		(*OfpOxmOfbField_TcpDst)(nil),
		(*OfpOxmOfbField_UdpSrc)(nil),
		(*OfpOxmOfbField_UdpDst)(nil),
		(*OfpOxmOfbField_SctpSrc)(nil),
		(*OfpOxmOfbField_SctpDst)(nil),
		(*OfpOxmOfbField_Icmpv4Type)(nil),
		(*OfpOxmOfbField_Icmpv4Code)(nil),
		(*OfpOxmOfbField_ArpOp)(nil),
		(*OfpOxmOfbField_ArpSpa)(nil),
		(*OfpOxmOfbField_ArpTpa)(nil),
		(*OfpOxmOfbField_ArpSha)(nil),
		(*OfpOxmOfbField_ArpTha)(nil),
		(*OfpOxmOfbField_Ipv6Src)(nil),
		(*OfpOxmOfbField_Ipv6Dst)(nil),
		(*OfpOxmOfbField_Ipv6Flabel)(nil),
		(*OfpOxmOfbField_Icmpv6Type)(nil),
		(*OfpOxmOfbField_Icmpv6Code)(nil),
		(*OfpOxmOfbField_Ipv6NdTarget)(nil),
		(*OfpOxmOfbField_Ipv6NdSsl)(nil),
		(*OfpOxmOfbField_Ipv6NdTll)(nil),
		(*OfpOxmOfbField_MplsLabel)(nil),
		(*OfpOxmOfbField_MplsTc)(nil),
		(*OfpOxmOfbField_MplsBos)(nil),
		(*OfpOxmOfbField_PbbIsid)(nil),
		(*OfpOxmOfbField_TunnelId)(nil),
		(*OfpOxmOfbField_Ipv6Exthdr)(nil),
		(*OfpOxmOfbField_TableMetadataMask)(nil),
		(*OfpOxmOfbField_EthDstMask)(nil),
		(*OfpOxmOfbField_EthSrcMask)(nil),
		(*OfpOxmOfbField_VlanVidMask)(nil),
		(*OfpOxmOfbField_Ipv4SrcMask)(nil),
		(*OfpOxmOfbField_Ipv4DstMask)(nil),
		(*OfpOxmOfbField_ArpSpaMask)(nil),
		(*OfpOxmOfbField_ArpTpaMask)(nil),
		(*OfpOxmOfbField_Ipv6SrcMask)(nil),
		(*OfpOxmOfbField_Ipv6DstMask)(nil),
		(*OfpOxmOfbField_Ipv6FlabelMask)(nil),
		(*OfpOxmOfbField_PbbIsidMask)(nil),
		(*OfpOxmOfbField_TunnelIdMask)(nil),
		(*OfpOxmOfbField_Ipv6ExthdrMask)(nil),
	}
}

// Header for OXM experimenter match fields.
// The experimenter class should not use OXM_HEADER() macros for defining
// fields due to this extra header.
type OfpOxmExperimenterField struct {
	OxmHeader            uint32   `protobuf:"varint,1,opt,name=oxm_header,json=oxmHeader,proto3" json:"oxm_header,omitempty"`
	Experimenter         uint32   `protobuf:"varint,2,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpOxmExperimenterField) Reset()         { *m = OfpOxmExperimenterField{} }
func (m *OfpOxmExperimenterField) String() string { return proto.CompactTextString(m) }
func (*OfpOxmExperimenterField) ProtoMessage()    {}
func (*OfpOxmExperimenterField) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{13}
}

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

var xxx_messageInfo_OfpOxmExperimenterField proto.InternalMessageInfo

func (m *OfpOxmExperimenterField) GetOxmHeader() uint32 {
	if m != nil {
		return m.OxmHeader
	}
	return 0
}

func (m *OfpOxmExperimenterField) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

// Action header that is common to all actions.  The length includes the
// header and any padding used to make the action 64-bit aligned.
// NB: The length of an action *must* always be a multiple of eight.
type OfpAction struct {
	Type OfpActionType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpActionType" json:"type,omitempty"`
	// Types that are valid to be assigned to Action:
	//	*OfpAction_Output
	//	*OfpAction_MplsTtl
	//	*OfpAction_Push
	//	*OfpAction_PopMpls
	//	*OfpAction_Group
	//	*OfpAction_NwTtl
	//	*OfpAction_SetField
	//	*OfpAction_Experimenter
	Action               isOfpAction_Action `protobuf_oneof:"action"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *OfpAction) Reset()         { *m = OfpAction{} }
func (m *OfpAction) String() string { return proto.CompactTextString(m) }
func (*OfpAction) ProtoMessage()    {}
func (*OfpAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{14}
}

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

var xxx_messageInfo_OfpAction proto.InternalMessageInfo

func (m *OfpAction) GetType() OfpActionType {
	if m != nil {
		return m.Type
	}
	return OfpActionType_OFPAT_OUTPUT
}

type isOfpAction_Action interface {
	isOfpAction_Action()
}

type OfpAction_Output struct {
	Output *OfpActionOutput `protobuf:"bytes,2,opt,name=output,proto3,oneof"`
}

type OfpAction_MplsTtl struct {
	MplsTtl *OfpActionMplsTtl `protobuf:"bytes,3,opt,name=mpls_ttl,json=mplsTtl,proto3,oneof"`
}

type OfpAction_Push struct {
	Push *OfpActionPush `protobuf:"bytes,4,opt,name=push,proto3,oneof"`
}

type OfpAction_PopMpls struct {
	PopMpls *OfpActionPopMpls `protobuf:"bytes,5,opt,name=pop_mpls,json=popMpls,proto3,oneof"`
}

type OfpAction_Group struct {
	Group *OfpActionGroup `protobuf:"bytes,6,opt,name=group,proto3,oneof"`
}

type OfpAction_NwTtl struct {
	NwTtl *OfpActionNwTtl `protobuf:"bytes,7,opt,name=nw_ttl,json=nwTtl,proto3,oneof"`
}

type OfpAction_SetField struct {
	SetField *OfpActionSetField `protobuf:"bytes,8,opt,name=set_field,json=setField,proto3,oneof"`
}

type OfpAction_Experimenter struct {
	Experimenter *OfpActionExperimenter `protobuf:"bytes,9,opt,name=experimenter,proto3,oneof"`
}

func (*OfpAction_Output) isOfpAction_Action() {}

func (*OfpAction_MplsTtl) isOfpAction_Action() {}

func (*OfpAction_Push) isOfpAction_Action() {}

func (*OfpAction_PopMpls) isOfpAction_Action() {}

func (*OfpAction_Group) isOfpAction_Action() {}

func (*OfpAction_NwTtl) isOfpAction_Action() {}

func (*OfpAction_SetField) isOfpAction_Action() {}

func (*OfpAction_Experimenter) isOfpAction_Action() {}

func (m *OfpAction) GetAction() isOfpAction_Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *OfpAction) GetOutput() *OfpActionOutput {
	if x, ok := m.GetAction().(*OfpAction_Output); ok {
		return x.Output
	}
	return nil
}

func (m *OfpAction) GetMplsTtl() *OfpActionMplsTtl {
	if x, ok := m.GetAction().(*OfpAction_MplsTtl); ok {
		return x.MplsTtl
	}
	return nil
}

func (m *OfpAction) GetPush() *OfpActionPush {
	if x, ok := m.GetAction().(*OfpAction_Push); ok {
		return x.Push
	}
	return nil
}

func (m *OfpAction) GetPopMpls() *OfpActionPopMpls {
	if x, ok := m.GetAction().(*OfpAction_PopMpls); ok {
		return x.PopMpls
	}
	return nil
}

func (m *OfpAction) GetGroup() *OfpActionGroup {
	if x, ok := m.GetAction().(*OfpAction_Group); ok {
		return x.Group
	}
	return nil
}

func (m *OfpAction) GetNwTtl() *OfpActionNwTtl {
	if x, ok := m.GetAction().(*OfpAction_NwTtl); ok {
		return x.NwTtl
	}
	return nil
}

func (m *OfpAction) GetSetField() *OfpActionSetField {
	if x, ok := m.GetAction().(*OfpAction_SetField); ok {
		return x.SetField
	}
	return nil
}

func (m *OfpAction) GetExperimenter() *OfpActionExperimenter {
	if x, ok := m.GetAction().(*OfpAction_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpAction) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpAction_Output)(nil),
		(*OfpAction_MplsTtl)(nil),
		(*OfpAction_Push)(nil),
		(*OfpAction_PopMpls)(nil),
		(*OfpAction_Group)(nil),
		(*OfpAction_NwTtl)(nil),
		(*OfpAction_SetField)(nil),
		(*OfpAction_Experimenter)(nil),
	}
}

// Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
// When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
// number of bytes to send.  A 'max_len' of zero means no bytes of the
// packet should be sent. A 'max_len' of OFPCML_NO_BUFFER means that
// the packet is not buffered and the complete packet is to be sent to
// the controller.
type OfpActionOutput struct {
	Port                 uint32   `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	MaxLen               uint32   `protobuf:"varint,2,opt,name=max_len,json=maxLen,proto3" json:"max_len,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionOutput) Reset()         { *m = OfpActionOutput{} }
func (m *OfpActionOutput) String() string { return proto.CompactTextString(m) }
func (*OfpActionOutput) ProtoMessage()    {}
func (*OfpActionOutput) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{15}
}

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

var xxx_messageInfo_OfpActionOutput proto.InternalMessageInfo

func (m *OfpActionOutput) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *OfpActionOutput) GetMaxLen() uint32 {
	if m != nil {
		return m.MaxLen
	}
	return 0
}

// Action structure for OFPAT_SET_MPLS_TTL.
type OfpActionMplsTtl struct {
	MplsTtl              uint32   `protobuf:"varint,1,opt,name=mpls_ttl,json=mplsTtl,proto3" json:"mpls_ttl,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionMplsTtl) Reset()         { *m = OfpActionMplsTtl{} }
func (m *OfpActionMplsTtl) String() string { return proto.CompactTextString(m) }
func (*OfpActionMplsTtl) ProtoMessage()    {}
func (*OfpActionMplsTtl) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{16}
}

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

var xxx_messageInfo_OfpActionMplsTtl proto.InternalMessageInfo

func (m *OfpActionMplsTtl) GetMplsTtl() uint32 {
	if m != nil {
		return m.MplsTtl
	}
	return 0
}

// Action structure for OFPAT_PUSH_VLAN/MPLS/PBB.
type OfpActionPush struct {
	Ethertype            uint32   `protobuf:"varint,1,opt,name=ethertype,proto3" json:"ethertype,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionPush) Reset()         { *m = OfpActionPush{} }
func (m *OfpActionPush) String() string { return proto.CompactTextString(m) }
func (*OfpActionPush) ProtoMessage()    {}
func (*OfpActionPush) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{17}
}

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

var xxx_messageInfo_OfpActionPush proto.InternalMessageInfo

func (m *OfpActionPush) GetEthertype() uint32 {
	if m != nil {
		return m.Ethertype
	}
	return 0
}

// Action structure for OFPAT_POP_MPLS.
type OfpActionPopMpls struct {
	Ethertype            uint32   `protobuf:"varint,1,opt,name=ethertype,proto3" json:"ethertype,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionPopMpls) Reset()         { *m = OfpActionPopMpls{} }
func (m *OfpActionPopMpls) String() string { return proto.CompactTextString(m) }
func (*OfpActionPopMpls) ProtoMessage()    {}
func (*OfpActionPopMpls) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{18}
}

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

var xxx_messageInfo_OfpActionPopMpls proto.InternalMessageInfo

func (m *OfpActionPopMpls) GetEthertype() uint32 {
	if m != nil {
		return m.Ethertype
	}
	return 0
}

// Action structure for OFPAT_GROUP.
type OfpActionGroup struct {
	GroupId              uint32   `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionGroup) Reset()         { *m = OfpActionGroup{} }
func (m *OfpActionGroup) String() string { return proto.CompactTextString(m) }
func (*OfpActionGroup) ProtoMessage()    {}
func (*OfpActionGroup) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{19}
}

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

var xxx_messageInfo_OfpActionGroup proto.InternalMessageInfo

func (m *OfpActionGroup) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

// Action structure for OFPAT_SET_NW_TTL.
type OfpActionNwTtl struct {
	NwTtl                uint32   `protobuf:"varint,1,opt,name=nw_ttl,json=nwTtl,proto3" json:"nw_ttl,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionNwTtl) Reset()         { *m = OfpActionNwTtl{} }
func (m *OfpActionNwTtl) String() string { return proto.CompactTextString(m) }
func (*OfpActionNwTtl) ProtoMessage()    {}
func (*OfpActionNwTtl) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{20}
}

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

var xxx_messageInfo_OfpActionNwTtl proto.InternalMessageInfo

func (m *OfpActionNwTtl) GetNwTtl() uint32 {
	if m != nil {
		return m.NwTtl
	}
	return 0
}

// Action structure for OFPAT_SET_FIELD.
type OfpActionSetField struct {
	Field                *OfpOxmField `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpActionSetField) Reset()         { *m = OfpActionSetField{} }
func (m *OfpActionSetField) String() string { return proto.CompactTextString(m) }
func (*OfpActionSetField) ProtoMessage()    {}
func (*OfpActionSetField) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{21}
}

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

var xxx_messageInfo_OfpActionSetField proto.InternalMessageInfo

func (m *OfpActionSetField) GetField() *OfpOxmField {
	if m != nil {
		return m.Field
	}
	return nil
}

// Action header for OFPAT_EXPERIMENTER.
// The rest of the body is experimenter-defined.
type OfpActionExperimenter struct {
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionExperimenter) Reset()         { *m = OfpActionExperimenter{} }
func (m *OfpActionExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpActionExperimenter) ProtoMessage()    {}
func (*OfpActionExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{22}
}

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

var xxx_messageInfo_OfpActionExperimenter proto.InternalMessageInfo

func (m *OfpActionExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpActionExperimenter) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Instruction header that is common to all instructions.  The length includes
// the header and any padding used to make the instruction 64-bit aligned.
// NB: The length of an instruction *must* always be a multiple of eight.
type OfpInstruction struct {
	Type uint32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	// Types that are valid to be assigned to Data:
	//	*OfpInstruction_GotoTable
	//	*OfpInstruction_WriteMetadata
	//	*OfpInstruction_Actions
	//	*OfpInstruction_Meter
	//	*OfpInstruction_Experimenter
	Data                 isOfpInstruction_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpInstruction) Reset()         { *m = OfpInstruction{} }
func (m *OfpInstruction) String() string { return proto.CompactTextString(m) }
func (*OfpInstruction) ProtoMessage()    {}
func (*OfpInstruction) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{23}
}

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

var xxx_messageInfo_OfpInstruction proto.InternalMessageInfo

func (m *OfpInstruction) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

type isOfpInstruction_Data interface {
	isOfpInstruction_Data()
}

type OfpInstruction_GotoTable struct {
	GotoTable *OfpInstructionGotoTable `protobuf:"bytes,2,opt,name=goto_table,json=gotoTable,proto3,oneof"`
}

type OfpInstruction_WriteMetadata struct {
	WriteMetadata *OfpInstructionWriteMetadata `protobuf:"bytes,3,opt,name=write_metadata,json=writeMetadata,proto3,oneof"`
}

type OfpInstruction_Actions struct {
	Actions *OfpInstructionActions `protobuf:"bytes,4,opt,name=actions,proto3,oneof"`
}

type OfpInstruction_Meter struct {
	Meter *OfpInstructionMeter `protobuf:"bytes,5,opt,name=meter,proto3,oneof"`
}

type OfpInstruction_Experimenter struct {
	Experimenter *OfpInstructionExperimenter `protobuf:"bytes,6,opt,name=experimenter,proto3,oneof"`
}

func (*OfpInstruction_GotoTable) isOfpInstruction_Data() {}

func (*OfpInstruction_WriteMetadata) isOfpInstruction_Data() {}

func (*OfpInstruction_Actions) isOfpInstruction_Data() {}

func (*OfpInstruction_Meter) isOfpInstruction_Data() {}

func (*OfpInstruction_Experimenter) isOfpInstruction_Data() {}

func (m *OfpInstruction) GetData() isOfpInstruction_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *OfpInstruction) GetGotoTable() *OfpInstructionGotoTable {
	if x, ok := m.GetData().(*OfpInstruction_GotoTable); ok {
		return x.GotoTable
	}
	return nil
}

func (m *OfpInstruction) GetWriteMetadata() *OfpInstructionWriteMetadata {
	if x, ok := m.GetData().(*OfpInstruction_WriteMetadata); ok {
		return x.WriteMetadata
	}
	return nil
}

func (m *OfpInstruction) GetActions() *OfpInstructionActions {
	if x, ok := m.GetData().(*OfpInstruction_Actions); ok {
		return x.Actions
	}
	return nil
}

func (m *OfpInstruction) GetMeter() *OfpInstructionMeter {
	if x, ok := m.GetData().(*OfpInstruction_Meter); ok {
		return x.Meter
	}
	return nil
}

func (m *OfpInstruction) GetExperimenter() *OfpInstructionExperimenter {
	if x, ok := m.GetData().(*OfpInstruction_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpInstruction) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpInstruction_GotoTable)(nil),
		(*OfpInstruction_WriteMetadata)(nil),
		(*OfpInstruction_Actions)(nil),
		(*OfpInstruction_Meter)(nil),
		(*OfpInstruction_Experimenter)(nil),
	}
}

// Instruction structure for OFPIT_GOTO_TABLE
type OfpInstructionGotoTable struct {
	TableId              uint32   `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionGotoTable) Reset()         { *m = OfpInstructionGotoTable{} }
func (m *OfpInstructionGotoTable) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionGotoTable) ProtoMessage()    {}
func (*OfpInstructionGotoTable) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{24}
}

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

var xxx_messageInfo_OfpInstructionGotoTable proto.InternalMessageInfo

func (m *OfpInstructionGotoTable) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

// Instruction structure for OFPIT_WRITE_METADATA
type OfpInstructionWriteMetadata struct {
	Metadata             uint64   `protobuf:"varint,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	MetadataMask         uint64   `protobuf:"varint,2,opt,name=metadata_mask,json=metadataMask,proto3" json:"metadata_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionWriteMetadata) Reset()         { *m = OfpInstructionWriteMetadata{} }
func (m *OfpInstructionWriteMetadata) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionWriteMetadata) ProtoMessage()    {}
func (*OfpInstructionWriteMetadata) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{25}
}

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

var xxx_messageInfo_OfpInstructionWriteMetadata proto.InternalMessageInfo

func (m *OfpInstructionWriteMetadata) GetMetadata() uint64 {
	if m != nil {
		return m.Metadata
	}
	return 0
}

func (m *OfpInstructionWriteMetadata) GetMetadataMask() uint64 {
	if m != nil {
		return m.MetadataMask
	}
	return 0
}

// Instruction structure for OFPIT_WRITE/APPLY/CLEAR_ACTIONS
type OfpInstructionActions struct {
	Actions              []*OfpAction `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpInstructionActions) Reset()         { *m = OfpInstructionActions{} }
func (m *OfpInstructionActions) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionActions) ProtoMessage()    {}
func (*OfpInstructionActions) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{26}
}

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

var xxx_messageInfo_OfpInstructionActions proto.InternalMessageInfo

func (m *OfpInstructionActions) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Instruction structure for OFPIT_METER
type OfpInstructionMeter struct {
	MeterId              uint32   `protobuf:"varint,1,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionMeter) Reset()         { *m = OfpInstructionMeter{} }
func (m *OfpInstructionMeter) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionMeter) ProtoMessage()    {}
func (*OfpInstructionMeter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{27}
}

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

var xxx_messageInfo_OfpInstructionMeter proto.InternalMessageInfo

func (m *OfpInstructionMeter) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

// Instruction structure for experimental instructions
type OfpInstructionExperimenter struct {
	Experimenter uint32 `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	// Experimenter-defined arbitrary additional data.
	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpInstructionExperimenter) Reset()         { *m = OfpInstructionExperimenter{} }
func (m *OfpInstructionExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpInstructionExperimenter) ProtoMessage()    {}
func (*OfpInstructionExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{28}
}

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

var xxx_messageInfo_OfpInstructionExperimenter proto.InternalMessageInfo

func (m *OfpInstructionExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpInstructionExperimenter) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Flow setup and teardown (controller -> datapath).
type OfpFlowMod struct {
	//ofp_header header;
	Cookie               uint64            `protobuf:"varint,1,opt,name=cookie,proto3" json:"cookie,omitempty"`
	CookieMask           uint64            `protobuf:"varint,2,opt,name=cookie_mask,json=cookieMask,proto3" json:"cookie_mask,omitempty"`
	TableId              uint32            `protobuf:"varint,3,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Command              OfpFlowModCommand `protobuf:"varint,4,opt,name=command,proto3,enum=openflow_13.OfpFlowModCommand" json:"command,omitempty"`
	IdleTimeout          uint32            `protobuf:"varint,5,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"`
	HardTimeout          uint32            `protobuf:"varint,6,opt,name=hard_timeout,json=hardTimeout,proto3" json:"hard_timeout,omitempty"`
	Priority             uint32            `protobuf:"varint,7,opt,name=priority,proto3" json:"priority,omitempty"`
	BufferId             uint32            `protobuf:"varint,8,opt,name=buffer_id,json=bufferId,proto3" json:"buffer_id,omitempty"`
	OutPort              uint32            `protobuf:"varint,9,opt,name=out_port,json=outPort,proto3" json:"out_port,omitempty"`
	OutGroup             uint32            `protobuf:"varint,10,opt,name=out_group,json=outGroup,proto3" json:"out_group,omitempty"`
	Flags                uint32            `protobuf:"varint,11,opt,name=flags,proto3" json:"flags,omitempty"`
	Match                *OfpMatch         `protobuf:"bytes,12,opt,name=match,proto3" json:"match,omitempty"`
	Instructions         []*OfpInstruction `protobuf:"bytes,13,rep,name=instructions,proto3" json:"instructions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpFlowMod) Reset()         { *m = OfpFlowMod{} }
func (m *OfpFlowMod) String() string { return proto.CompactTextString(m) }
func (*OfpFlowMod) ProtoMessage()    {}
func (*OfpFlowMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{29}
}

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

var xxx_messageInfo_OfpFlowMod proto.InternalMessageInfo

func (m *OfpFlowMod) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowMod) GetCookieMask() uint64 {
	if m != nil {
		return m.CookieMask
	}
	return 0
}

func (m *OfpFlowMod) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowMod) GetCommand() OfpFlowModCommand {
	if m != nil {
		return m.Command
	}
	return OfpFlowModCommand_OFPFC_ADD
}

func (m *OfpFlowMod) GetIdleTimeout() uint32 {
	if m != nil {
		return m.IdleTimeout
	}
	return 0
}

func (m *OfpFlowMod) GetHardTimeout() uint32 {
	if m != nil {
		return m.HardTimeout
	}
	return 0
}

func (m *OfpFlowMod) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *OfpFlowMod) GetBufferId() uint32 {
	if m != nil {
		return m.BufferId
	}
	return 0
}

func (m *OfpFlowMod) GetOutPort() uint32 {
	if m != nil {
		return m.OutPort
	}
	return 0
}

func (m *OfpFlowMod) GetOutGroup() uint32 {
	if m != nil {
		return m.OutGroup
	}
	return 0
}

func (m *OfpFlowMod) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpFlowMod) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

func (m *OfpFlowMod) GetInstructions() []*OfpInstruction {
	if m != nil {
		return m.Instructions
	}
	return nil
}

// Bucket for use in groups.
type OfpBucket struct {
	Weight               uint32       `protobuf:"varint,1,opt,name=weight,proto3" json:"weight,omitempty"`
	WatchPort            uint32       `protobuf:"varint,2,opt,name=watch_port,json=watchPort,proto3" json:"watch_port,omitempty"`
	WatchGroup           uint32       `protobuf:"varint,3,opt,name=watch_group,json=watchGroup,proto3" json:"watch_group,omitempty"`
	Actions              []*OfpAction `protobuf:"bytes,4,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpBucket) Reset()         { *m = OfpBucket{} }
func (m *OfpBucket) String() string { return proto.CompactTextString(m) }
func (*OfpBucket) ProtoMessage()    {}
func (*OfpBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{30}
}

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

var xxx_messageInfo_OfpBucket proto.InternalMessageInfo

func (m *OfpBucket) GetWeight() uint32 {
	if m != nil {
		return m.Weight
	}
	return 0
}

func (m *OfpBucket) GetWatchPort() uint32 {
	if m != nil {
		return m.WatchPort
	}
	return 0
}

func (m *OfpBucket) GetWatchGroup() uint32 {
	if m != nil {
		return m.WatchGroup
	}
	return 0
}

func (m *OfpBucket) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Group setup and teardown (controller -> datapath).
type OfpGroupMod struct {
	//ofp_header header;
	Command              OfpGroupModCommand `protobuf:"varint,1,opt,name=command,proto3,enum=openflow_13.OfpGroupModCommand" json:"command,omitempty"`
	Type                 OfpGroupType       `protobuf:"varint,2,opt,name=type,proto3,enum=openflow_13.OfpGroupType" json:"type,omitempty"`
	GroupId              uint32             `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	Buckets              []*OfpBucket       `protobuf:"bytes,4,rep,name=buckets,proto3" json:"buckets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *OfpGroupMod) Reset()         { *m = OfpGroupMod{} }
func (m *OfpGroupMod) String() string { return proto.CompactTextString(m) }
func (*OfpGroupMod) ProtoMessage()    {}
func (*OfpGroupMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{31}
}

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

var xxx_messageInfo_OfpGroupMod proto.InternalMessageInfo

func (m *OfpGroupMod) GetCommand() OfpGroupModCommand {
	if m != nil {
		return m.Command
	}
	return OfpGroupModCommand_OFPGC_ADD
}

func (m *OfpGroupMod) GetType() OfpGroupType {
	if m != nil {
		return m.Type
	}
	return OfpGroupType_OFPGT_ALL
}

func (m *OfpGroupMod) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *OfpGroupMod) GetBuckets() []*OfpBucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

// Send packet (controller -> datapath).
type OfpPacketOut struct {
	//ofp_header header;
	BufferId uint32       `protobuf:"varint,1,opt,name=buffer_id,json=bufferId,proto3" json:"buffer_id,omitempty"`
	InPort   uint32       `protobuf:"varint,2,opt,name=in_port,json=inPort,proto3" json:"in_port,omitempty"`
	Actions  []*OfpAction `protobuf:"bytes,3,rep,name=actions,proto3" json:"actions,omitempty"`
	// The variable size action list is optionally followed by packet data.
	// This data is only present and meaningful if buffer_id == -1.
	Data                 []byte   `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPacketOut) Reset()         { *m = OfpPacketOut{} }
func (m *OfpPacketOut) String() string { return proto.CompactTextString(m) }
func (*OfpPacketOut) ProtoMessage()    {}
func (*OfpPacketOut) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{32}
}

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

var xxx_messageInfo_OfpPacketOut proto.InternalMessageInfo

func (m *OfpPacketOut) GetBufferId() uint32 {
	if m != nil {
		return m.BufferId
	}
	return 0
}

func (m *OfpPacketOut) GetInPort() uint32 {
	if m != nil {
		return m.InPort
	}
	return 0
}

func (m *OfpPacketOut) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

func (m *OfpPacketOut) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Packet received on port (datapath -> controller).
type OfpPacketIn struct {
	//ofp_header header;
	BufferId             uint32            `protobuf:"varint,1,opt,name=buffer_id,json=bufferId,proto3" json:"buffer_id,omitempty"`
	Reason               OfpPacketInReason `protobuf:"varint,2,opt,name=reason,proto3,enum=openflow_13.OfpPacketInReason" json:"reason,omitempty"`
	TableId              uint32            `protobuf:"varint,3,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Cookie               uint64            `protobuf:"varint,4,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Match                *OfpMatch         `protobuf:"bytes,5,opt,name=match,proto3" json:"match,omitempty"`
	Data                 []byte            `protobuf:"bytes,6,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpPacketIn) Reset()         { *m = OfpPacketIn{} }
func (m *OfpPacketIn) String() string { return proto.CompactTextString(m) }
func (*OfpPacketIn) ProtoMessage()    {}
func (*OfpPacketIn) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{33}
}

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

var xxx_messageInfo_OfpPacketIn proto.InternalMessageInfo

func (m *OfpPacketIn) GetBufferId() uint32 {
	if m != nil {
		return m.BufferId
	}
	return 0
}

func (m *OfpPacketIn) GetReason() OfpPacketInReason {
	if m != nil {
		return m.Reason
	}
	return OfpPacketInReason_OFPR_NO_MATCH
}

func (m *OfpPacketIn) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpPacketIn) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpPacketIn) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

func (m *OfpPacketIn) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Flow removed (datapath -> controller).
type OfpFlowRemoved struct {
	//ofp_header header;
	Cookie               uint64               `protobuf:"varint,1,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Priority             uint32               `protobuf:"varint,2,opt,name=priority,proto3" json:"priority,omitempty"`
	Reason               OfpFlowRemovedReason `protobuf:"varint,3,opt,name=reason,proto3,enum=openflow_13.OfpFlowRemovedReason" json:"reason,omitempty"`
	TableId              uint32               `protobuf:"varint,4,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	DurationSec          uint32               `protobuf:"varint,5,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32               `protobuf:"varint,6,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	IdleTimeout          uint32               `protobuf:"varint,7,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"`
	HardTimeout          uint32               `protobuf:"varint,8,opt,name=hard_timeout,json=hardTimeout,proto3" json:"hard_timeout,omitempty"`
	PacketCount          uint64               `protobuf:"varint,9,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64               `protobuf:"varint,10,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	Match                *OfpMatch            `protobuf:"bytes,121,opt,name=match,proto3" json:"match,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *OfpFlowRemoved) Reset()         { *m = OfpFlowRemoved{} }
func (m *OfpFlowRemoved) String() string { return proto.CompactTextString(m) }
func (*OfpFlowRemoved) ProtoMessage()    {}
func (*OfpFlowRemoved) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{34}
}

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

var xxx_messageInfo_OfpFlowRemoved proto.InternalMessageInfo

func (m *OfpFlowRemoved) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowRemoved) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *OfpFlowRemoved) GetReason() OfpFlowRemovedReason {
	if m != nil {
		return m.Reason
	}
	return OfpFlowRemovedReason_OFPRR_IDLE_TIMEOUT
}

func (m *OfpFlowRemoved) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowRemoved) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpFlowRemoved) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpFlowRemoved) GetIdleTimeout() uint32 {
	if m != nil {
		return m.IdleTimeout
	}
	return 0
}

func (m *OfpFlowRemoved) GetHardTimeout() uint32 {
	if m != nil {
		return m.HardTimeout
	}
	return 0
}

func (m *OfpFlowRemoved) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpFlowRemoved) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpFlowRemoved) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

// Common header for all meter bands
type OfpMeterBandHeader struct {
	Type      OfpMeterBandType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMeterBandType" json:"type,omitempty"`
	Rate      uint32           `protobuf:"varint,2,opt,name=rate,proto3" json:"rate,omitempty"`
	BurstSize uint32           `protobuf:"varint,3,opt,name=burst_size,json=burstSize,proto3" json:"burst_size,omitempty"`
	// Types that are valid to be assigned to Data:
	//	*OfpMeterBandHeader_Drop
	//	*OfpMeterBandHeader_DscpRemark
	//	*OfpMeterBandHeader_Experimenter
	Data                 isOfpMeterBandHeader_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *OfpMeterBandHeader) Reset()         { *m = OfpMeterBandHeader{} }
func (m *OfpMeterBandHeader) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandHeader) ProtoMessage()    {}
func (*OfpMeterBandHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{35}
}

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

var xxx_messageInfo_OfpMeterBandHeader proto.InternalMessageInfo

func (m *OfpMeterBandHeader) GetType() OfpMeterBandType {
	if m != nil {
		return m.Type
	}
	return OfpMeterBandType_OFPMBT_INVALID
}

func (m *OfpMeterBandHeader) GetRate() uint32 {
	if m != nil {
		return m.Rate
	}
	return 0
}

func (m *OfpMeterBandHeader) GetBurstSize() uint32 {
	if m != nil {
		return m.BurstSize
	}
	return 0
}

type isOfpMeterBandHeader_Data interface {
	isOfpMeterBandHeader_Data()
}

type OfpMeterBandHeader_Drop struct {
	Drop *OfpMeterBandDrop `protobuf:"bytes,4,opt,name=drop,proto3,oneof"`
}

type OfpMeterBandHeader_DscpRemark struct {
	DscpRemark *OfpMeterBandDscpRemark `protobuf:"bytes,5,opt,name=dscp_remark,json=dscpRemark,proto3,oneof"`
}

type OfpMeterBandHeader_Experimenter struct {
	Experimenter *OfpMeterBandExperimenter `protobuf:"bytes,6,opt,name=experimenter,proto3,oneof"`
}

func (*OfpMeterBandHeader_Drop) isOfpMeterBandHeader_Data() {}

func (*OfpMeterBandHeader_DscpRemark) isOfpMeterBandHeader_Data() {}

func (*OfpMeterBandHeader_Experimenter) isOfpMeterBandHeader_Data() {}

func (m *OfpMeterBandHeader) GetData() isOfpMeterBandHeader_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *OfpMeterBandHeader) GetDrop() *OfpMeterBandDrop {
	if x, ok := m.GetData().(*OfpMeterBandHeader_Drop); ok {
		return x.Drop
	}
	return nil
}

func (m *OfpMeterBandHeader) GetDscpRemark() *OfpMeterBandDscpRemark {
	if x, ok := m.GetData().(*OfpMeterBandHeader_DscpRemark); ok {
		return x.DscpRemark
	}
	return nil
}

func (m *OfpMeterBandHeader) GetExperimenter() *OfpMeterBandExperimenter {
	if x, ok := m.GetData().(*OfpMeterBandHeader_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpMeterBandHeader) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpMeterBandHeader_Drop)(nil),
		(*OfpMeterBandHeader_DscpRemark)(nil),
		(*OfpMeterBandHeader_Experimenter)(nil),
	}
}

// OFPMBT_DROP band - drop packets
type OfpMeterBandDrop struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandDrop) Reset()         { *m = OfpMeterBandDrop{} }
func (m *OfpMeterBandDrop) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandDrop) ProtoMessage()    {}
func (*OfpMeterBandDrop) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{36}
}

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

var xxx_messageInfo_OfpMeterBandDrop proto.InternalMessageInfo

// OFPMBT_DSCP_REMARK band - Remark DSCP in the IP header
type OfpMeterBandDscpRemark struct {
	PrecLevel            uint32   `protobuf:"varint,1,opt,name=prec_level,json=precLevel,proto3" json:"prec_level,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandDscpRemark) Reset()         { *m = OfpMeterBandDscpRemark{} }
func (m *OfpMeterBandDscpRemark) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandDscpRemark) ProtoMessage()    {}
func (*OfpMeterBandDscpRemark) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{37}
}

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

var xxx_messageInfo_OfpMeterBandDscpRemark proto.InternalMessageInfo

func (m *OfpMeterBandDscpRemark) GetPrecLevel() uint32 {
	if m != nil {
		return m.PrecLevel
	}
	return 0
}

// OFPMBT_EXPERIMENTER band - Experimenter type.
// The rest of the band is experimenter-defined.
type OfpMeterBandExperimenter struct {
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandExperimenter) Reset()         { *m = OfpMeterBandExperimenter{} }
func (m *OfpMeterBandExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandExperimenter) ProtoMessage()    {}
func (*OfpMeterBandExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{38}
}

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

var xxx_messageInfo_OfpMeterBandExperimenter proto.InternalMessageInfo

func (m *OfpMeterBandExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

// Meter configuration. OFPT_METER_MOD.
type OfpMeterMod struct {
	Command              OfpMeterModCommand    `protobuf:"varint,1,opt,name=command,proto3,enum=openflow_13.OfpMeterModCommand" json:"command,omitempty"`
	Flags                uint32                `protobuf:"varint,2,opt,name=flags,proto3" json:"flags,omitempty"`
	MeterId              uint32                `protobuf:"varint,3,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	Bands                []*OfpMeterBandHeader `protobuf:"bytes,4,rep,name=bands,proto3" json:"bands,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpMeterMod) Reset()         { *m = OfpMeterMod{} }
func (m *OfpMeterMod) String() string { return proto.CompactTextString(m) }
func (*OfpMeterMod) ProtoMessage()    {}
func (*OfpMeterMod) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{39}
}

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

var xxx_messageInfo_OfpMeterMod proto.InternalMessageInfo

func (m *OfpMeterMod) GetCommand() OfpMeterModCommand {
	if m != nil {
		return m.Command
	}
	return OfpMeterModCommand_OFPMC_ADD
}

func (m *OfpMeterMod) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMeterMod) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

func (m *OfpMeterMod) GetBands() []*OfpMeterBandHeader {
	if m != nil {
		return m.Bands
	}
	return nil
}

// OFPT_ERROR: Error message (datapath -> controller).
type OfpErrorMsg struct {
	Header               *OfpHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
	Type                 uint32     `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"`
	Code                 uint32     `protobuf:"varint,3,opt,name=code,proto3" json:"code,omitempty"`
	Data                 []byte     `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *OfpErrorMsg) Reset()         { *m = OfpErrorMsg{} }
func (m *OfpErrorMsg) String() string { return proto.CompactTextString(m) }
func (*OfpErrorMsg) ProtoMessage()    {}
func (*OfpErrorMsg) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{40}
}

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

var xxx_messageInfo_OfpErrorMsg proto.InternalMessageInfo

func (m *OfpErrorMsg) GetHeader() *OfpHeader {
	if m != nil {
		return m.Header
	}
	return nil
}

func (m *OfpErrorMsg) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

func (m *OfpErrorMsg) GetCode() uint32 {
	if m != nil {
		return m.Code
	}
	return 0
}

func (m *OfpErrorMsg) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// OFPET_EXPERIMENTER: Error message (datapath -> controller).
type OfpErrorExperimenterMsg struct {
	Type                 uint32   `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	ExpType              uint32   `protobuf:"varint,2,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	Experimenter         uint32   `protobuf:"varint,3,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	Data                 []byte   `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpErrorExperimenterMsg) Reset()         { *m = OfpErrorExperimenterMsg{} }
func (m *OfpErrorExperimenterMsg) String() string { return proto.CompactTextString(m) }
func (*OfpErrorExperimenterMsg) ProtoMessage()    {}
func (*OfpErrorExperimenterMsg) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{41}
}

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

var xxx_messageInfo_OfpErrorExperimenterMsg proto.InternalMessageInfo

func (m *OfpErrorExperimenterMsg) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

func (m *OfpErrorExperimenterMsg) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpErrorExperimenterMsg) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpErrorExperimenterMsg) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

type OfpMultipartRequest struct {
	//ofp_header header;
	Type                 OfpMultipartType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMultipartType" json:"type,omitempty"`
	Flags                uint32           `protobuf:"varint,2,opt,name=flags,proto3" json:"flags,omitempty"`
	Body                 []byte           `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *OfpMultipartRequest) Reset()         { *m = OfpMultipartRequest{} }
func (m *OfpMultipartRequest) String() string { return proto.CompactTextString(m) }
func (*OfpMultipartRequest) ProtoMessage()    {}
func (*OfpMultipartRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{42}
}

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

var xxx_messageInfo_OfpMultipartRequest proto.InternalMessageInfo

func (m *OfpMultipartRequest) GetType() OfpMultipartType {
	if m != nil {
		return m.Type
	}
	return OfpMultipartType_OFPMP_DESC
}

func (m *OfpMultipartRequest) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMultipartRequest) GetBody() []byte {
	if m != nil {
		return m.Body
	}
	return nil
}

type OfpMultipartReply struct {
	//ofp_header header;
	Type                 OfpMultipartType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpMultipartType" json:"type,omitempty"`
	Flags                uint32           `protobuf:"varint,2,opt,name=flags,proto3" json:"flags,omitempty"`
	Body                 []byte           `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *OfpMultipartReply) Reset()         { *m = OfpMultipartReply{} }
func (m *OfpMultipartReply) String() string { return proto.CompactTextString(m) }
func (*OfpMultipartReply) ProtoMessage()    {}
func (*OfpMultipartReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{43}
}

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

var xxx_messageInfo_OfpMultipartReply proto.InternalMessageInfo

func (m *OfpMultipartReply) GetType() OfpMultipartType {
	if m != nil {
		return m.Type
	}
	return OfpMultipartType_OFPMP_DESC
}

func (m *OfpMultipartReply) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMultipartReply) GetBody() []byte {
	if m != nil {
		return m.Body
	}
	return nil
}

// Body of reply to OFPMP_DESC request.  Each entry is a NULL-terminated
// ASCII string.
type OfpDesc struct {
	MfrDesc              string   `protobuf:"bytes,1,opt,name=mfr_desc,json=mfrDesc,proto3" json:"mfr_desc,omitempty"`
	HwDesc               string   `protobuf:"bytes,2,opt,name=hw_desc,json=hwDesc,proto3" json:"hw_desc,omitempty"`
	SwDesc               string   `protobuf:"bytes,3,opt,name=sw_desc,json=swDesc,proto3" json:"sw_desc,omitempty"`
	SerialNum            string   `protobuf:"bytes,4,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
	DpDesc               string   `protobuf:"bytes,5,opt,name=dp_desc,json=dpDesc,proto3" json:"dp_desc,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpDesc) Reset()         { *m = OfpDesc{} }
func (m *OfpDesc) String() string { return proto.CompactTextString(m) }
func (*OfpDesc) ProtoMessage()    {}
func (*OfpDesc) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{44}
}

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

var xxx_messageInfo_OfpDesc proto.InternalMessageInfo

func (m *OfpDesc) GetMfrDesc() string {
	if m != nil {
		return m.MfrDesc
	}
	return ""
}

func (m *OfpDesc) GetHwDesc() string {
	if m != nil {
		return m.HwDesc
	}
	return ""
}

func (m *OfpDesc) GetSwDesc() string {
	if m != nil {
		return m.SwDesc
	}
	return ""
}

func (m *OfpDesc) GetSerialNum() string {
	if m != nil {
		return m.SerialNum
	}
	return ""
}

func (m *OfpDesc) GetDpDesc() string {
	if m != nil {
		return m.DpDesc
	}
	return ""
}

// Body for ofp_multipart_request of type OFPMP_FLOW.
type OfpFlowStatsRequest struct {
	TableId              uint32    `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	OutPort              uint32    `protobuf:"varint,2,opt,name=out_port,json=outPort,proto3" json:"out_port,omitempty"`
	OutGroup             uint32    `protobuf:"varint,3,opt,name=out_group,json=outGroup,proto3" json:"out_group,omitempty"`
	Cookie               uint64    `protobuf:"varint,4,opt,name=cookie,proto3" json:"cookie,omitempty"`
	CookieMask           uint64    `protobuf:"varint,5,opt,name=cookie_mask,json=cookieMask,proto3" json:"cookie_mask,omitempty"`
	Match                *OfpMatch `protobuf:"bytes,6,opt,name=match,proto3" json:"match,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *OfpFlowStatsRequest) Reset()         { *m = OfpFlowStatsRequest{} }
func (m *OfpFlowStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpFlowStatsRequest) ProtoMessage()    {}
func (*OfpFlowStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{45}
}

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

var xxx_messageInfo_OfpFlowStatsRequest proto.InternalMessageInfo

func (m *OfpFlowStatsRequest) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetOutPort() uint32 {
	if m != nil {
		return m.OutPort
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetOutGroup() uint32 {
	if m != nil {
		return m.OutGroup
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetCookieMask() uint64 {
	if m != nil {
		return m.CookieMask
	}
	return 0
}

func (m *OfpFlowStatsRequest) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

// Body of reply to OFPMP_FLOW request.
type OfpFlowStats struct {
	Id                   uint64            `protobuf:"varint,14,opt,name=id,proto3" json:"id,omitempty"`
	TableId              uint32            `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	DurationSec          uint32            `protobuf:"varint,2,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32            `protobuf:"varint,3,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	Priority             uint32            `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	IdleTimeout          uint32            `protobuf:"varint,5,opt,name=idle_timeout,json=idleTimeout,proto3" json:"idle_timeout,omitempty"`
	HardTimeout          uint32            `protobuf:"varint,6,opt,name=hard_timeout,json=hardTimeout,proto3" json:"hard_timeout,omitempty"`
	Flags                uint32            `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"`
	Cookie               uint64            `protobuf:"varint,8,opt,name=cookie,proto3" json:"cookie,omitempty"`
	PacketCount          uint64            `protobuf:"varint,9,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64            `protobuf:"varint,10,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	Match                *OfpMatch         `protobuf:"bytes,12,opt,name=match,proto3" json:"match,omitempty"`
	Instructions         []*OfpInstruction `protobuf:"bytes,13,rep,name=instructions,proto3" json:"instructions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpFlowStats) Reset()         { *m = OfpFlowStats{} }
func (m *OfpFlowStats) String() string { return proto.CompactTextString(m) }
func (*OfpFlowStats) ProtoMessage()    {}
func (*OfpFlowStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{46}
}

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

var xxx_messageInfo_OfpFlowStats proto.InternalMessageInfo

func (m *OfpFlowStats) GetId() uint64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *OfpFlowStats) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpFlowStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpFlowStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpFlowStats) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *OfpFlowStats) GetIdleTimeout() uint32 {
	if m != nil {
		return m.IdleTimeout
	}
	return 0
}

func (m *OfpFlowStats) GetHardTimeout() uint32 {
	if m != nil {
		return m.HardTimeout
	}
	return 0
}

func (m *OfpFlowStats) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpFlowStats) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpFlowStats) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpFlowStats) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpFlowStats) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

func (m *OfpFlowStats) GetInstructions() []*OfpInstruction {
	if m != nil {
		return m.Instructions
	}
	return nil
}

// Body for ofp_multipart_request of type OFPMP_AGGREGATE.
type OfpAggregateStatsRequest struct {
	TableId              uint32    `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	OutPort              uint32    `protobuf:"varint,2,opt,name=out_port,json=outPort,proto3" json:"out_port,omitempty"`
	OutGroup             uint32    `protobuf:"varint,3,opt,name=out_group,json=outGroup,proto3" json:"out_group,omitempty"`
	Cookie               uint64    `protobuf:"varint,4,opt,name=cookie,proto3" json:"cookie,omitempty"`
	CookieMask           uint64    `protobuf:"varint,5,opt,name=cookie_mask,json=cookieMask,proto3" json:"cookie_mask,omitempty"`
	Match                *OfpMatch `protobuf:"bytes,6,opt,name=match,proto3" json:"match,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *OfpAggregateStatsRequest) Reset()         { *m = OfpAggregateStatsRequest{} }
func (m *OfpAggregateStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpAggregateStatsRequest) ProtoMessage()    {}
func (*OfpAggregateStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{47}
}

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

var xxx_messageInfo_OfpAggregateStatsRequest proto.InternalMessageInfo

func (m *OfpAggregateStatsRequest) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetOutPort() uint32 {
	if m != nil {
		return m.OutPort
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetOutGroup() uint32 {
	if m != nil {
		return m.OutGroup
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetCookieMask() uint64 {
	if m != nil {
		return m.CookieMask
	}
	return 0
}

func (m *OfpAggregateStatsRequest) GetMatch() *OfpMatch {
	if m != nil {
		return m.Match
	}
	return nil
}

// Body of reply to OFPMP_AGGREGATE request.
type OfpAggregateStatsReply struct {
	PacketCount          uint64   `protobuf:"varint,1,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64   `protobuf:"varint,2,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	FlowCount            uint32   `protobuf:"varint,3,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpAggregateStatsReply) Reset()         { *m = OfpAggregateStatsReply{} }
func (m *OfpAggregateStatsReply) String() string { return proto.CompactTextString(m) }
func (*OfpAggregateStatsReply) ProtoMessage()    {}
func (*OfpAggregateStatsReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{48}
}

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

var xxx_messageInfo_OfpAggregateStatsReply proto.InternalMessageInfo

func (m *OfpAggregateStatsReply) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpAggregateStatsReply) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpAggregateStatsReply) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

// Common header for all Table Feature Properties
type OfpTableFeatureProperty struct {
	Type OfpTableFeaturePropType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpTableFeaturePropType" json:"type,omitempty"`
	// Types that are valid to be assigned to Value:
	//	*OfpTableFeatureProperty_Instructions
	//	*OfpTableFeatureProperty_NextTables
	//	*OfpTableFeatureProperty_Actions
	//	*OfpTableFeatureProperty_Oxm
	//	*OfpTableFeatureProperty_Experimenter
	Value                isOfpTableFeatureProperty_Value `protobuf_oneof:"value"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *OfpTableFeatureProperty) Reset()         { *m = OfpTableFeatureProperty{} }
func (m *OfpTableFeatureProperty) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeatureProperty) ProtoMessage()    {}
func (*OfpTableFeatureProperty) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{49}
}

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

var xxx_messageInfo_OfpTableFeatureProperty proto.InternalMessageInfo

func (m *OfpTableFeatureProperty) GetType() OfpTableFeaturePropType {
	if m != nil {
		return m.Type
	}
	return OfpTableFeaturePropType_OFPTFPT_INSTRUCTIONS
}

type isOfpTableFeatureProperty_Value interface {
	isOfpTableFeatureProperty_Value()
}

type OfpTableFeatureProperty_Instructions struct {
	Instructions *OfpTableFeaturePropInstructions `protobuf:"bytes,2,opt,name=instructions,proto3,oneof"`
}

type OfpTableFeatureProperty_NextTables struct {
	NextTables *OfpTableFeaturePropNextTables `protobuf:"bytes,3,opt,name=next_tables,json=nextTables,proto3,oneof"`
}

type OfpTableFeatureProperty_Actions struct {
	Actions *OfpTableFeaturePropActions `protobuf:"bytes,4,opt,name=actions,proto3,oneof"`
}

type OfpTableFeatureProperty_Oxm struct {
	Oxm *OfpTableFeaturePropOxm `protobuf:"bytes,5,opt,name=oxm,proto3,oneof"`
}

type OfpTableFeatureProperty_Experimenter struct {
	Experimenter *OfpTableFeaturePropExperimenter `protobuf:"bytes,6,opt,name=experimenter,proto3,oneof"`
}

func (*OfpTableFeatureProperty_Instructions) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_NextTables) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_Actions) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_Oxm) isOfpTableFeatureProperty_Value() {}

func (*OfpTableFeatureProperty_Experimenter) isOfpTableFeatureProperty_Value() {}

func (m *OfpTableFeatureProperty) GetValue() isOfpTableFeatureProperty_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetInstructions() *OfpTableFeaturePropInstructions {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Instructions); ok {
		return x.Instructions
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetNextTables() *OfpTableFeaturePropNextTables {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_NextTables); ok {
		return x.NextTables
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetActions() *OfpTableFeaturePropActions {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Actions); ok {
		return x.Actions
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetOxm() *OfpTableFeaturePropOxm {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Oxm); ok {
		return x.Oxm
	}
	return nil
}

func (m *OfpTableFeatureProperty) GetExperimenter() *OfpTableFeaturePropExperimenter {
	if x, ok := m.GetValue().(*OfpTableFeatureProperty_Experimenter); ok {
		return x.Experimenter
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OfpTableFeatureProperty) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OfpTableFeatureProperty_Instructions)(nil),
		(*OfpTableFeatureProperty_NextTables)(nil),
		(*OfpTableFeatureProperty_Actions)(nil),
		(*OfpTableFeatureProperty_Oxm)(nil),
		(*OfpTableFeatureProperty_Experimenter)(nil),
	}
}

// Instructions property
type OfpTableFeaturePropInstructions struct {
	// One of OFPTFPT_INSTRUCTIONS,
	//OFPTFPT_INSTRUCTIONS_MISS.
	Instructions         []*OfpInstruction `protobuf:"bytes,1,rep,name=instructions,proto3" json:"instructions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpTableFeaturePropInstructions) Reset()         { *m = OfpTableFeaturePropInstructions{} }
func (m *OfpTableFeaturePropInstructions) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropInstructions) ProtoMessage()    {}
func (*OfpTableFeaturePropInstructions) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{50}
}

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

var xxx_messageInfo_OfpTableFeaturePropInstructions proto.InternalMessageInfo

func (m *OfpTableFeaturePropInstructions) GetInstructions() []*OfpInstruction {
	if m != nil {
		return m.Instructions
	}
	return nil
}

// Next Tables property
type OfpTableFeaturePropNextTables struct {
	// One of OFPTFPT_NEXT_TABLES,
	//OFPTFPT_NEXT_TABLES_MISS.
	NextTableIds         []uint32 `protobuf:"varint,1,rep,packed,name=next_table_ids,json=nextTableIds,proto3" json:"next_table_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableFeaturePropNextTables) Reset()         { *m = OfpTableFeaturePropNextTables{} }
func (m *OfpTableFeaturePropNextTables) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropNextTables) ProtoMessage()    {}
func (*OfpTableFeaturePropNextTables) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{51}
}

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

var xxx_messageInfo_OfpTableFeaturePropNextTables proto.InternalMessageInfo

func (m *OfpTableFeaturePropNextTables) GetNextTableIds() []uint32 {
	if m != nil {
		return m.NextTableIds
	}
	return nil
}

// Actions property
type OfpTableFeaturePropActions struct {
	// One of OFPTFPT_WRITE_ACTIONS,
	//OFPTFPT_WRITE_ACTIONS_MISS,
	//OFPTFPT_APPLY_ACTIONS,
	//OFPTFPT_APPLY_ACTIONS_MISS.
	Actions              []*OfpAction `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpTableFeaturePropActions) Reset()         { *m = OfpTableFeaturePropActions{} }
func (m *OfpTableFeaturePropActions) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropActions) ProtoMessage()    {}
func (*OfpTableFeaturePropActions) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{52}
}

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

var xxx_messageInfo_OfpTableFeaturePropActions proto.InternalMessageInfo

func (m *OfpTableFeaturePropActions) GetActions() []*OfpAction {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Match, Wildcard or Set-Field property
type OfpTableFeaturePropOxm struct {
	// TODO is this a uint32???
	OxmIds               []uint32 `protobuf:"varint,3,rep,packed,name=oxm_ids,json=oxmIds,proto3" json:"oxm_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableFeaturePropOxm) Reset()         { *m = OfpTableFeaturePropOxm{} }
func (m *OfpTableFeaturePropOxm) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropOxm) ProtoMessage()    {}
func (*OfpTableFeaturePropOxm) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{53}
}

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

var xxx_messageInfo_OfpTableFeaturePropOxm proto.InternalMessageInfo

func (m *OfpTableFeaturePropOxm) GetOxmIds() []uint32 {
	if m != nil {
		return m.OxmIds
	}
	return nil
}

// Experimenter table feature property
type OfpTableFeaturePropExperimenter struct {
	// One of OFPTFPT_EXPERIMENTER,
	//OFPTFPT_EXPERIMENTER_MISS.
	Experimenter         uint32   `protobuf:"varint,2,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	ExpType              uint32   `protobuf:"varint,3,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	ExperimenterData     []uint32 `protobuf:"varint,4,rep,packed,name=experimenter_data,json=experimenterData,proto3" json:"experimenter_data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableFeaturePropExperimenter) Reset()         { *m = OfpTableFeaturePropExperimenter{} }
func (m *OfpTableFeaturePropExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeaturePropExperimenter) ProtoMessage()    {}
func (*OfpTableFeaturePropExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{54}
}

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

var xxx_messageInfo_OfpTableFeaturePropExperimenter proto.InternalMessageInfo

func (m *OfpTableFeaturePropExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpTableFeaturePropExperimenter) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpTableFeaturePropExperimenter) GetExperimenterData() []uint32 {
	if m != nil {
		return m.ExperimenterData
	}
	return nil
}

// Body for ofp_multipart_request of type OFPMP_TABLE_FEATURES./
// Body of reply to OFPMP_TABLE_FEATURES request.
type OfpTableFeatures struct {
	TableId       uint32 `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	Name          string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	MetadataMatch uint64 `protobuf:"varint,3,opt,name=metadata_match,json=metadataMatch,proto3" json:"metadata_match,omitempty"`
	MetadataWrite uint64 `protobuf:"varint,4,opt,name=metadata_write,json=metadataWrite,proto3" json:"metadata_write,omitempty"`
	Config        uint32 `protobuf:"varint,5,opt,name=config,proto3" json:"config,omitempty"`
	MaxEntries    uint32 `protobuf:"varint,6,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty"`
	// Table Feature Property list
	Properties           []*OfpTableFeatureProperty `protobuf:"bytes,7,rep,name=properties,proto3" json:"properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *OfpTableFeatures) Reset()         { *m = OfpTableFeatures{} }
func (m *OfpTableFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpTableFeatures) ProtoMessage()    {}
func (*OfpTableFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{55}
}

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

var xxx_messageInfo_OfpTableFeatures proto.InternalMessageInfo

func (m *OfpTableFeatures) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

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

func (m *OfpTableFeatures) GetMetadataMatch() uint64 {
	if m != nil {
		return m.MetadataMatch
	}
	return 0
}

func (m *OfpTableFeatures) GetMetadataWrite() uint64 {
	if m != nil {
		return m.MetadataWrite
	}
	return 0
}

func (m *OfpTableFeatures) GetConfig() uint32 {
	if m != nil {
		return m.Config
	}
	return 0
}

func (m *OfpTableFeatures) GetMaxEntries() uint32 {
	if m != nil {
		return m.MaxEntries
	}
	return 0
}

func (m *OfpTableFeatures) GetProperties() []*OfpTableFeatureProperty {
	if m != nil {
		return m.Properties
	}
	return nil
}

// Body of reply to OFPMP_TABLE request.
type OfpTableStats struct {
	TableId              uint32   `protobuf:"varint,1,opt,name=table_id,json=tableId,proto3" json:"table_id,omitempty"`
	ActiveCount          uint32   `protobuf:"varint,2,opt,name=active_count,json=activeCount,proto3" json:"active_count,omitempty"`
	LookupCount          uint64   `protobuf:"varint,3,opt,name=lookup_count,json=lookupCount,proto3" json:"lookup_count,omitempty"`
	MatchedCount         uint64   `protobuf:"varint,4,opt,name=matched_count,json=matchedCount,proto3" json:"matched_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpTableStats) Reset()         { *m = OfpTableStats{} }
func (m *OfpTableStats) String() string { return proto.CompactTextString(m) }
func (*OfpTableStats) ProtoMessage()    {}
func (*OfpTableStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{56}
}

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

var xxx_messageInfo_OfpTableStats proto.InternalMessageInfo

func (m *OfpTableStats) GetTableId() uint32 {
	if m != nil {
		return m.TableId
	}
	return 0
}

func (m *OfpTableStats) GetActiveCount() uint32 {
	if m != nil {
		return m.ActiveCount
	}
	return 0
}

func (m *OfpTableStats) GetLookupCount() uint64 {
	if m != nil {
		return m.LookupCount
	}
	return 0
}

func (m *OfpTableStats) GetMatchedCount() uint64 {
	if m != nil {
		return m.MatchedCount
	}
	return 0
}

// Body for ofp_multipart_request of type OFPMP_PORT.
type OfpPortStatsRequest struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPortStatsRequest) Reset()         { *m = OfpPortStatsRequest{} }
func (m *OfpPortStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpPortStatsRequest) ProtoMessage()    {}
func (*OfpPortStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{57}
}

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

var xxx_messageInfo_OfpPortStatsRequest proto.InternalMessageInfo

func (m *OfpPortStatsRequest) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

// Body of reply to OFPMP_PORT request. If a counter is unsupported, set
// the field to all ones.
type OfpPortStats struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	RxPackets            uint64   `protobuf:"varint,2,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	TxPackets            uint64   `protobuf:"varint,3,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	RxBytes              uint64   `protobuf:"varint,4,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	TxBytes              uint64   `protobuf:"varint,5,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	RxDropped            uint64   `protobuf:"varint,6,opt,name=rx_dropped,json=rxDropped,proto3" json:"rx_dropped,omitempty"`
	TxDropped            uint64   `protobuf:"varint,7,opt,name=tx_dropped,json=txDropped,proto3" json:"tx_dropped,omitempty"`
	RxErrors             uint64   `protobuf:"varint,8,opt,name=rx_errors,json=rxErrors,proto3" json:"rx_errors,omitempty"`
	TxErrors             uint64   `protobuf:"varint,9,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"`
	RxFrameErr           uint64   `protobuf:"varint,10,opt,name=rx_frame_err,json=rxFrameErr,proto3" json:"rx_frame_err,omitempty"`
	RxOverErr            uint64   `protobuf:"varint,11,opt,name=rx_over_err,json=rxOverErr,proto3" json:"rx_over_err,omitempty"`
	RxCrcErr             uint64   `protobuf:"varint,12,opt,name=rx_crc_err,json=rxCrcErr,proto3" json:"rx_crc_err,omitempty"`
	Collisions           uint64   `protobuf:"varint,13,opt,name=collisions,proto3" json:"collisions,omitempty"`
	DurationSec          uint32   `protobuf:"varint,14,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32   `protobuf:"varint,15,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpPortStats) Reset()         { *m = OfpPortStats{} }
func (m *OfpPortStats) String() string { return proto.CompactTextString(m) }
func (*OfpPortStats) ProtoMessage()    {}
func (*OfpPortStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{58}
}

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

var xxx_messageInfo_OfpPortStats proto.InternalMessageInfo

func (m *OfpPortStats) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpPortStats) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *OfpPortStats) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *OfpPortStats) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *OfpPortStats) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *OfpPortStats) GetRxDropped() uint64 {
	if m != nil {
		return m.RxDropped
	}
	return 0
}

func (m *OfpPortStats) GetTxDropped() uint64 {
	if m != nil {
		return m.TxDropped
	}
	return 0
}

func (m *OfpPortStats) GetRxErrors() uint64 {
	if m != nil {
		return m.RxErrors
	}
	return 0
}

func (m *OfpPortStats) GetTxErrors() uint64 {
	if m != nil {
		return m.TxErrors
	}
	return 0
}

func (m *OfpPortStats) GetRxFrameErr() uint64 {
	if m != nil {
		return m.RxFrameErr
	}
	return 0
}

func (m *OfpPortStats) GetRxOverErr() uint64 {
	if m != nil {
		return m.RxOverErr
	}
	return 0
}

func (m *OfpPortStats) GetRxCrcErr() uint64 {
	if m != nil {
		return m.RxCrcErr
	}
	return 0
}

func (m *OfpPortStats) GetCollisions() uint64 {
	if m != nil {
		return m.Collisions
	}
	return 0
}

func (m *OfpPortStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpPortStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

// Body of OFPMP_GROUP request.
type OfpGroupStatsRequest struct {
	GroupId              uint32   `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpGroupStatsRequest) Reset()         { *m = OfpGroupStatsRequest{} }
func (m *OfpGroupStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpGroupStatsRequest) ProtoMessage()    {}
func (*OfpGroupStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{59}
}

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

var xxx_messageInfo_OfpGroupStatsRequest proto.InternalMessageInfo

func (m *OfpGroupStatsRequest) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

// Used in group stats replies.
type OfpBucketCounter struct {
	PacketCount          uint64   `protobuf:"varint,1,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64   `protobuf:"varint,2,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpBucketCounter) Reset()         { *m = OfpBucketCounter{} }
func (m *OfpBucketCounter) String() string { return proto.CompactTextString(m) }
func (*OfpBucketCounter) ProtoMessage()    {}
func (*OfpBucketCounter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{60}
}

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

var xxx_messageInfo_OfpBucketCounter proto.InternalMessageInfo

func (m *OfpBucketCounter) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpBucketCounter) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

// Body of reply to OFPMP_GROUP request.
type OfpGroupStats struct {
	GroupId              uint32              `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	RefCount             uint32              `protobuf:"varint,2,opt,name=ref_count,json=refCount,proto3" json:"ref_count,omitempty"`
	PacketCount          uint64              `protobuf:"varint,3,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	ByteCount            uint64              `protobuf:"varint,4,opt,name=byte_count,json=byteCount,proto3" json:"byte_count,omitempty"`
	DurationSec          uint32              `protobuf:"varint,5,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32              `protobuf:"varint,6,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	BucketStats          []*OfpBucketCounter `protobuf:"bytes,7,rep,name=bucket_stats,json=bucketStats,proto3" json:"bucket_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpGroupStats) Reset()         { *m = OfpGroupStats{} }
func (m *OfpGroupStats) String() string { return proto.CompactTextString(m) }
func (*OfpGroupStats) ProtoMessage()    {}
func (*OfpGroupStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{61}
}

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

var xxx_messageInfo_OfpGroupStats proto.InternalMessageInfo

func (m *OfpGroupStats) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *OfpGroupStats) GetRefCount() uint32 {
	if m != nil {
		return m.RefCount
	}
	return 0
}

func (m *OfpGroupStats) GetPacketCount() uint64 {
	if m != nil {
		return m.PacketCount
	}
	return 0
}

func (m *OfpGroupStats) GetByteCount() uint64 {
	if m != nil {
		return m.ByteCount
	}
	return 0
}

func (m *OfpGroupStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpGroupStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpGroupStats) GetBucketStats() []*OfpBucketCounter {
	if m != nil {
		return m.BucketStats
	}
	return nil
}

// Body of reply to OFPMP_GROUP_DESC request.
type OfpGroupDesc struct {
	Type                 OfpGroupType `protobuf:"varint,1,opt,name=type,proto3,enum=openflow_13.OfpGroupType" json:"type,omitempty"`
	GroupId              uint32       `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	Buckets              []*OfpBucket `protobuf:"bytes,3,rep,name=buckets,proto3" json:"buckets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *OfpGroupDesc) Reset()         { *m = OfpGroupDesc{} }
func (m *OfpGroupDesc) String() string { return proto.CompactTextString(m) }
func (*OfpGroupDesc) ProtoMessage()    {}
func (*OfpGroupDesc) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{62}
}

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

var xxx_messageInfo_OfpGroupDesc proto.InternalMessageInfo

func (m *OfpGroupDesc) GetType() OfpGroupType {
	if m != nil {
		return m.Type
	}
	return OfpGroupType_OFPGT_ALL
}

func (m *OfpGroupDesc) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *OfpGroupDesc) GetBuckets() []*OfpBucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

type OfpGroupEntry struct {
	Desc                 *OfpGroupDesc  `protobuf:"bytes,1,opt,name=desc,proto3" json:"desc,omitempty"`
	Stats                *OfpGroupStats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *OfpGroupEntry) Reset()         { *m = OfpGroupEntry{} }
func (m *OfpGroupEntry) String() string { return proto.CompactTextString(m) }
func (*OfpGroupEntry) ProtoMessage()    {}
func (*OfpGroupEntry) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{63}
}

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

var xxx_messageInfo_OfpGroupEntry proto.InternalMessageInfo

func (m *OfpGroupEntry) GetDesc() *OfpGroupDesc {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *OfpGroupEntry) GetStats() *OfpGroupStats {
	if m != nil {
		return m.Stats
	}
	return nil
}

// Body of reply to OFPMP_GROUP_FEATURES request. Group features.
type OfpGroupFeatures struct {
	Types                uint32   `protobuf:"varint,1,opt,name=types,proto3" json:"types,omitempty"`
	Capabilities         uint32   `protobuf:"varint,2,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
	MaxGroups            []uint32 `protobuf:"varint,3,rep,packed,name=max_groups,json=maxGroups,proto3" json:"max_groups,omitempty"`
	Actions              []uint32 `protobuf:"varint,4,rep,packed,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpGroupFeatures) Reset()         { *m = OfpGroupFeatures{} }
func (m *OfpGroupFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpGroupFeatures) ProtoMessage()    {}
func (*OfpGroupFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{64}
}

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

var xxx_messageInfo_OfpGroupFeatures proto.InternalMessageInfo

func (m *OfpGroupFeatures) GetTypes() uint32 {
	if m != nil {
		return m.Types
	}
	return 0
}

func (m *OfpGroupFeatures) GetCapabilities() uint32 {
	if m != nil {
		return m.Capabilities
	}
	return 0
}

func (m *OfpGroupFeatures) GetMaxGroups() []uint32 {
	if m != nil {
		return m.MaxGroups
	}
	return nil
}

func (m *OfpGroupFeatures) GetActions() []uint32 {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Body of OFPMP_METER and OFPMP_METER_CONFIG requests.
type OfpMeterMultipartRequest struct {
	MeterId              uint32   `protobuf:"varint,1,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterMultipartRequest) Reset()         { *m = OfpMeterMultipartRequest{} }
func (m *OfpMeterMultipartRequest) String() string { return proto.CompactTextString(m) }
func (*OfpMeterMultipartRequest) ProtoMessage()    {}
func (*OfpMeterMultipartRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{65}
}

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

var xxx_messageInfo_OfpMeterMultipartRequest proto.InternalMessageInfo

func (m *OfpMeterMultipartRequest) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

// Statistics for each meter band
type OfpMeterBandStats struct {
	PacketBandCount      uint64   `protobuf:"varint,1,opt,name=packet_band_count,json=packetBandCount,proto3" json:"packet_band_count,omitempty"`
	ByteBandCount        uint64   `protobuf:"varint,2,opt,name=byte_band_count,json=byteBandCount,proto3" json:"byte_band_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterBandStats) Reset()         { *m = OfpMeterBandStats{} }
func (m *OfpMeterBandStats) String() string { return proto.CompactTextString(m) }
func (*OfpMeterBandStats) ProtoMessage()    {}
func (*OfpMeterBandStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{66}
}

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

var xxx_messageInfo_OfpMeterBandStats proto.InternalMessageInfo

func (m *OfpMeterBandStats) GetPacketBandCount() uint64 {
	if m != nil {
		return m.PacketBandCount
	}
	return 0
}

func (m *OfpMeterBandStats) GetByteBandCount() uint64 {
	if m != nil {
		return m.ByteBandCount
	}
	return 0
}

// Body of reply to OFPMP_METER request. Meter statistics.
type OfpMeterStats struct {
	MeterId              uint32               `protobuf:"varint,1,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	FlowCount            uint32               `protobuf:"varint,2,opt,name=flow_count,json=flowCount,proto3" json:"flow_count,omitempty"`
	PacketInCount        uint64               `protobuf:"varint,3,opt,name=packet_in_count,json=packetInCount,proto3" json:"packet_in_count,omitempty"`
	ByteInCount          uint64               `protobuf:"varint,4,opt,name=byte_in_count,json=byteInCount,proto3" json:"byte_in_count,omitempty"`
	DurationSec          uint32               `protobuf:"varint,5,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32               `protobuf:"varint,6,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	BandStats            []*OfpMeterBandStats `protobuf:"bytes,7,rep,name=band_stats,json=bandStats,proto3" json:"band_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *OfpMeterStats) Reset()         { *m = OfpMeterStats{} }
func (m *OfpMeterStats) String() string { return proto.CompactTextString(m) }
func (*OfpMeterStats) ProtoMessage()    {}
func (*OfpMeterStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{67}
}

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

var xxx_messageInfo_OfpMeterStats proto.InternalMessageInfo

func (m *OfpMeterStats) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

func (m *OfpMeterStats) GetFlowCount() uint32 {
	if m != nil {
		return m.FlowCount
	}
	return 0
}

func (m *OfpMeterStats) GetPacketInCount() uint64 {
	if m != nil {
		return m.PacketInCount
	}
	return 0
}

func (m *OfpMeterStats) GetByteInCount() uint64 {
	if m != nil {
		return m.ByteInCount
	}
	return 0
}

func (m *OfpMeterStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpMeterStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

func (m *OfpMeterStats) GetBandStats() []*OfpMeterBandStats {
	if m != nil {
		return m.BandStats
	}
	return nil
}

// Body of reply to OFPMP_METER_CONFIG request. Meter configuration.
type OfpMeterConfig struct {
	Flags                uint32                `protobuf:"varint,1,opt,name=flags,proto3" json:"flags,omitempty"`
	MeterId              uint32                `protobuf:"varint,2,opt,name=meter_id,json=meterId,proto3" json:"meter_id,omitempty"`
	Bands                []*OfpMeterBandHeader `protobuf:"bytes,3,rep,name=bands,proto3" json:"bands,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpMeterConfig) Reset()         { *m = OfpMeterConfig{} }
func (m *OfpMeterConfig) String() string { return proto.CompactTextString(m) }
func (*OfpMeterConfig) ProtoMessage()    {}
func (*OfpMeterConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{68}
}

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

var xxx_messageInfo_OfpMeterConfig proto.InternalMessageInfo

func (m *OfpMeterConfig) GetFlags() uint32 {
	if m != nil {
		return m.Flags
	}
	return 0
}

func (m *OfpMeterConfig) GetMeterId() uint32 {
	if m != nil {
		return m.MeterId
	}
	return 0
}

func (m *OfpMeterConfig) GetBands() []*OfpMeterBandHeader {
	if m != nil {
		return m.Bands
	}
	return nil
}

// Body of reply to OFPMP_METER_FEATURES request. Meter features.
type OfpMeterFeatures struct {
	MaxMeter             uint32   `protobuf:"varint,1,opt,name=max_meter,json=maxMeter,proto3" json:"max_meter,omitempty"`
	BandTypes            uint32   `protobuf:"varint,2,opt,name=band_types,json=bandTypes,proto3" json:"band_types,omitempty"`
	Capabilities         uint32   `protobuf:"varint,3,opt,name=capabilities,proto3" json:"capabilities,omitempty"`
	MaxBands             uint32   `protobuf:"varint,4,opt,name=max_bands,json=maxBands,proto3" json:"max_bands,omitempty"`
	MaxColor             uint32   `protobuf:"varint,5,opt,name=max_color,json=maxColor,proto3" json:"max_color,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpMeterFeatures) Reset()         { *m = OfpMeterFeatures{} }
func (m *OfpMeterFeatures) String() string { return proto.CompactTextString(m) }
func (*OfpMeterFeatures) ProtoMessage()    {}
func (*OfpMeterFeatures) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{69}
}

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

var xxx_messageInfo_OfpMeterFeatures proto.InternalMessageInfo

func (m *OfpMeterFeatures) GetMaxMeter() uint32 {
	if m != nil {
		return m.MaxMeter
	}
	return 0
}

func (m *OfpMeterFeatures) GetBandTypes() uint32 {
	if m != nil {
		return m.BandTypes
	}
	return 0
}

func (m *OfpMeterFeatures) GetCapabilities() uint32 {
	if m != nil {
		return m.Capabilities
	}
	return 0
}

func (m *OfpMeterFeatures) GetMaxBands() uint32 {
	if m != nil {
		return m.MaxBands
	}
	return 0
}

func (m *OfpMeterFeatures) GetMaxColor() uint32 {
	if m != nil {
		return m.MaxColor
	}
	return 0
}

type OfpMeterEntry struct {
	Config               *OfpMeterConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	Stats                *OfpMeterStats  `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *OfpMeterEntry) Reset()         { *m = OfpMeterEntry{} }
func (m *OfpMeterEntry) String() string { return proto.CompactTextString(m) }
func (*OfpMeterEntry) ProtoMessage()    {}
func (*OfpMeterEntry) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{70}
}

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

var xxx_messageInfo_OfpMeterEntry proto.InternalMessageInfo

func (m *OfpMeterEntry) GetConfig() *OfpMeterConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *OfpMeterEntry) GetStats() *OfpMeterStats {
	if m != nil {
		return m.Stats
	}
	return nil
}

// Body for ofp_multipart_request/reply of type OFPMP_EXPERIMENTER.
type OfpExperimenterMultipartHeader struct {
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	ExpType              uint32   `protobuf:"varint,2,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	Data                 []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpExperimenterMultipartHeader) Reset()         { *m = OfpExperimenterMultipartHeader{} }
func (m *OfpExperimenterMultipartHeader) String() string { return proto.CompactTextString(m) }
func (*OfpExperimenterMultipartHeader) ProtoMessage()    {}
func (*OfpExperimenterMultipartHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{71}
}

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

var xxx_messageInfo_OfpExperimenterMultipartHeader proto.InternalMessageInfo

func (m *OfpExperimenterMultipartHeader) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpExperimenterMultipartHeader) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpExperimenterMultipartHeader) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Experimenter extension.
type OfpExperimenterHeader struct {
	//ofp_header header;  /* Type OFPT_EXPERIMENTER. */
	Experimenter         uint32   `protobuf:"varint,1,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	ExpType              uint32   `protobuf:"varint,2,opt,name=exp_type,json=expType,proto3" json:"exp_type,omitempty"`
	Data                 []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpExperimenterHeader) Reset()         { *m = OfpExperimenterHeader{} }
func (m *OfpExperimenterHeader) String() string { return proto.CompactTextString(m) }
func (*OfpExperimenterHeader) ProtoMessage()    {}
func (*OfpExperimenterHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{72}
}

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

var xxx_messageInfo_OfpExperimenterHeader proto.InternalMessageInfo

func (m *OfpExperimenterHeader) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpExperimenterHeader) GetExpType() uint32 {
	if m != nil {
		return m.ExpType
	}
	return 0
}

func (m *OfpExperimenterHeader) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Common description for a queue.
type OfpQueuePropHeader struct {
	Property             uint32   `protobuf:"varint,1,opt,name=property,proto3" json:"property,omitempty"`
	Len                  uint32   `protobuf:"varint,2,opt,name=len,proto3" json:"len,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueuePropHeader) Reset()         { *m = OfpQueuePropHeader{} }
func (m *OfpQueuePropHeader) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropHeader) ProtoMessage()    {}
func (*OfpQueuePropHeader) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{73}
}

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

var xxx_messageInfo_OfpQueuePropHeader proto.InternalMessageInfo

func (m *OfpQueuePropHeader) GetProperty() uint32 {
	if m != nil {
		return m.Property
	}
	return 0
}

func (m *OfpQueuePropHeader) GetLen() uint32 {
	if m != nil {
		return m.Len
	}
	return 0
}

// Min-Rate queue property description.
type OfpQueuePropMinRate struct {
	PropHeader           *OfpQueuePropHeader `protobuf:"bytes,1,opt,name=prop_header,json=propHeader,proto3" json:"prop_header,omitempty"`
	Rate                 uint32              `protobuf:"varint,2,opt,name=rate,proto3" json:"rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpQueuePropMinRate) Reset()         { *m = OfpQueuePropMinRate{} }
func (m *OfpQueuePropMinRate) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropMinRate) ProtoMessage()    {}
func (*OfpQueuePropMinRate) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{74}
}

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

var xxx_messageInfo_OfpQueuePropMinRate proto.InternalMessageInfo

func (m *OfpQueuePropMinRate) GetPropHeader() *OfpQueuePropHeader {
	if m != nil {
		return m.PropHeader
	}
	return nil
}

func (m *OfpQueuePropMinRate) GetRate() uint32 {
	if m != nil {
		return m.Rate
	}
	return 0
}

// Max-Rate queue property description.
type OfpQueuePropMaxRate struct {
	PropHeader           *OfpQueuePropHeader `protobuf:"bytes,1,opt,name=prop_header,json=propHeader,proto3" json:"prop_header,omitempty"`
	Rate                 uint32              `protobuf:"varint,2,opt,name=rate,proto3" json:"rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpQueuePropMaxRate) Reset()         { *m = OfpQueuePropMaxRate{} }
func (m *OfpQueuePropMaxRate) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropMaxRate) ProtoMessage()    {}
func (*OfpQueuePropMaxRate) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{75}
}

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

var xxx_messageInfo_OfpQueuePropMaxRate proto.InternalMessageInfo

func (m *OfpQueuePropMaxRate) GetPropHeader() *OfpQueuePropHeader {
	if m != nil {
		return m.PropHeader
	}
	return nil
}

func (m *OfpQueuePropMaxRate) GetRate() uint32 {
	if m != nil {
		return m.Rate
	}
	return 0
}

// Experimenter queue property description.
type OfpQueuePropExperimenter struct {
	PropHeader           *OfpQueuePropHeader `protobuf:"bytes,1,opt,name=prop_header,json=propHeader,proto3" json:"prop_header,omitempty"`
	Experimenter         uint32              `protobuf:"varint,2,opt,name=experimenter,proto3" json:"experimenter,omitempty"`
	Data                 []byte              `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *OfpQueuePropExperimenter) Reset()         { *m = OfpQueuePropExperimenter{} }
func (m *OfpQueuePropExperimenter) String() string { return proto.CompactTextString(m) }
func (*OfpQueuePropExperimenter) ProtoMessage()    {}
func (*OfpQueuePropExperimenter) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{76}
}

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

var xxx_messageInfo_OfpQueuePropExperimenter proto.InternalMessageInfo

func (m *OfpQueuePropExperimenter) GetPropHeader() *OfpQueuePropHeader {
	if m != nil {
		return m.PropHeader
	}
	return nil
}

func (m *OfpQueuePropExperimenter) GetExperimenter() uint32 {
	if m != nil {
		return m.Experimenter
	}
	return 0
}

func (m *OfpQueuePropExperimenter) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Full description for a queue.
type OfpPacketQueue struct {
	QueueId              uint32                `protobuf:"varint,1,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	Port                 uint32                `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
	Properties           []*OfpQueuePropHeader `protobuf:"bytes,4,rep,name=properties,proto3" json:"properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *OfpPacketQueue) Reset()         { *m = OfpPacketQueue{} }
func (m *OfpPacketQueue) String() string { return proto.CompactTextString(m) }
func (*OfpPacketQueue) ProtoMessage()    {}
func (*OfpPacketQueue) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{77}
}

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

var xxx_messageInfo_OfpPacketQueue proto.InternalMessageInfo

func (m *OfpPacketQueue) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

func (m *OfpPacketQueue) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *OfpPacketQueue) GetProperties() []*OfpQueuePropHeader {
	if m != nil {
		return m.Properties
	}
	return nil
}

// Query for port queue configuration.
type OfpQueueGetConfigRequest struct {
	//ofp_header header;
	Port                 uint32   `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueueGetConfigRequest) Reset()         { *m = OfpQueueGetConfigRequest{} }
func (m *OfpQueueGetConfigRequest) String() string { return proto.CompactTextString(m) }
func (*OfpQueueGetConfigRequest) ProtoMessage()    {}
func (*OfpQueueGetConfigRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{78}
}

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

var xxx_messageInfo_OfpQueueGetConfigRequest proto.InternalMessageInfo

func (m *OfpQueueGetConfigRequest) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

// Queue configuration for a given port.
type OfpQueueGetConfigReply struct {
	//ofp_header header;
	Port                 uint32            `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	Queues               []*OfpPacketQueue `protobuf:"bytes,2,rep,name=queues,proto3" json:"queues,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpQueueGetConfigReply) Reset()         { *m = OfpQueueGetConfigReply{} }
func (m *OfpQueueGetConfigReply) String() string { return proto.CompactTextString(m) }
func (*OfpQueueGetConfigReply) ProtoMessage()    {}
func (*OfpQueueGetConfigReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{79}
}

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

var xxx_messageInfo_OfpQueueGetConfigReply proto.InternalMessageInfo

func (m *OfpQueueGetConfigReply) GetPort() uint32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *OfpQueueGetConfigReply) GetQueues() []*OfpPacketQueue {
	if m != nil {
		return m.Queues
	}
	return nil
}

// OFPAT_SET_QUEUE action struct: send packets to given queue on port.
type OfpActionSetQueue struct {
	Type                 uint32   `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"`
	QueueId              uint32   `protobuf:"varint,3,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpActionSetQueue) Reset()         { *m = OfpActionSetQueue{} }
func (m *OfpActionSetQueue) String() string { return proto.CompactTextString(m) }
func (*OfpActionSetQueue) ProtoMessage()    {}
func (*OfpActionSetQueue) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{80}
}

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

var xxx_messageInfo_OfpActionSetQueue proto.InternalMessageInfo

func (m *OfpActionSetQueue) GetType() uint32 {
	if m != nil {
		return m.Type
	}
	return 0
}

func (m *OfpActionSetQueue) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

type OfpQueueStatsRequest struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	QueueId              uint32   `protobuf:"varint,2,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueueStatsRequest) Reset()         { *m = OfpQueueStatsRequest{} }
func (m *OfpQueueStatsRequest) String() string { return proto.CompactTextString(m) }
func (*OfpQueueStatsRequest) ProtoMessage()    {}
func (*OfpQueueStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{81}
}

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

var xxx_messageInfo_OfpQueueStatsRequest proto.InternalMessageInfo

func (m *OfpQueueStatsRequest) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpQueueStatsRequest) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

type OfpQueueStats struct {
	PortNo               uint32   `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	QueueId              uint32   `protobuf:"varint,2,opt,name=queue_id,json=queueId,proto3" json:"queue_id,omitempty"`
	TxBytes              uint64   `protobuf:"varint,3,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"varint,4,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	TxErrors             uint64   `protobuf:"varint,5,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"`
	DurationSec          uint32   `protobuf:"varint,6,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	DurationNsec         uint32   `protobuf:"varint,7,opt,name=duration_nsec,json=durationNsec,proto3" json:"duration_nsec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpQueueStats) Reset()         { *m = OfpQueueStats{} }
func (m *OfpQueueStats) String() string { return proto.CompactTextString(m) }
func (*OfpQueueStats) ProtoMessage()    {}
func (*OfpQueueStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{82}
}

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

var xxx_messageInfo_OfpQueueStats proto.InternalMessageInfo

func (m *OfpQueueStats) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OfpQueueStats) GetQueueId() uint32 {
	if m != nil {
		return m.QueueId
	}
	return 0
}

func (m *OfpQueueStats) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *OfpQueueStats) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *OfpQueueStats) GetTxErrors() uint64 {
	if m != nil {
		return m.TxErrors
	}
	return 0
}

func (m *OfpQueueStats) GetDurationSec() uint32 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *OfpQueueStats) GetDurationNsec() uint32 {
	if m != nil {
		return m.DurationNsec
	}
	return 0
}

// Role request and reply message.
type OfpRoleRequest struct {
	//ofp_header header;        /* Type OFPT_ROLE_REQUEST/OFPT_ROLE_REPLY. */
	Role                 OfpControllerRole `protobuf:"varint,1,opt,name=role,proto3,enum=openflow_13.OfpControllerRole" json:"role,omitempty"`
	GenerationId         uint64            `protobuf:"varint,2,opt,name=generation_id,json=generationId,proto3" json:"generation_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *OfpRoleRequest) Reset()         { *m = OfpRoleRequest{} }
func (m *OfpRoleRequest) String() string { return proto.CompactTextString(m) }
func (*OfpRoleRequest) ProtoMessage()    {}
func (*OfpRoleRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{83}
}

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

var xxx_messageInfo_OfpRoleRequest proto.InternalMessageInfo

func (m *OfpRoleRequest) GetRole() OfpControllerRole {
	if m != nil {
		return m.Role
	}
	return OfpControllerRole_OFPCR_ROLE_NOCHANGE
}

func (m *OfpRoleRequest) GetGenerationId() uint64 {
	if m != nil {
		return m.GenerationId
	}
	return 0
}

// Asynchronous message configuration.
type OfpAsyncConfig struct {
	//ofp_header header;    /* OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC. */
	PacketInMask         []uint32 `protobuf:"varint,1,rep,packed,name=packet_in_mask,json=packetInMask,proto3" json:"packet_in_mask,omitempty"`
	PortStatusMask       []uint32 `protobuf:"varint,2,rep,packed,name=port_status_mask,json=portStatusMask,proto3" json:"port_status_mask,omitempty"`
	FlowRemovedMask      []uint32 `protobuf:"varint,3,rep,packed,name=flow_removed_mask,json=flowRemovedMask,proto3" json:"flow_removed_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OfpAsyncConfig) Reset()         { *m = OfpAsyncConfig{} }
func (m *OfpAsyncConfig) String() string { return proto.CompactTextString(m) }
func (*OfpAsyncConfig) ProtoMessage()    {}
func (*OfpAsyncConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{84}
}

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

var xxx_messageInfo_OfpAsyncConfig proto.InternalMessageInfo

func (m *OfpAsyncConfig) GetPacketInMask() []uint32 {
	if m != nil {
		return m.PacketInMask
	}
	return nil
}

func (m *OfpAsyncConfig) GetPortStatusMask() []uint32 {
	if m != nil {
		return m.PortStatusMask
	}
	return nil
}

func (m *OfpAsyncConfig) GetFlowRemovedMask() []uint32 {
	if m != nil {
		return m.FlowRemovedMask
	}
	return nil
}

type MeterModUpdate struct {
	Id                   string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	MeterMod             *OfpMeterMod `protobuf:"bytes,2,opt,name=meter_mod,json=meterMod,proto3" json:"meter_mod,omitempty"`
	Xid                  uint32       `protobuf:"varint,3,opt,name=xid,proto3" json:"xid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *MeterModUpdate) Reset()         { *m = MeterModUpdate{} }
func (m *MeterModUpdate) String() string { return proto.CompactTextString(m) }
func (*MeterModUpdate) ProtoMessage()    {}
func (*MeterModUpdate) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{85}
}

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

var xxx_messageInfo_MeterModUpdate proto.InternalMessageInfo

func (m *MeterModUpdate) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *MeterModUpdate) GetMeterMod() *OfpMeterMod {
	if m != nil {
		return m.MeterMod
	}
	return nil
}

func (m *MeterModUpdate) GetXid() uint32 {
	if m != nil {
		return m.Xid
	}
	return 0
}

type MeterStatsReply struct {
	MeterStats           []*OfpMeterStats `protobuf:"bytes,1,rep,name=meter_stats,json=meterStats,proto3" json:"meter_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *MeterStatsReply) Reset()         { *m = MeterStatsReply{} }
func (m *MeterStatsReply) String() string { return proto.CompactTextString(m) }
func (*MeterStatsReply) ProtoMessage()    {}
func (*MeterStatsReply) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{86}
}

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

var xxx_messageInfo_MeterStatsReply proto.InternalMessageInfo

func (m *MeterStatsReply) GetMeterStats() []*OfpMeterStats {
	if m != nil {
		return m.MeterStats
	}
	return nil
}

type FlowTableUpdate struct {
	Id                   string      `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	FlowMod              *OfpFlowMod `protobuf:"bytes,2,opt,name=flow_mod,json=flowMod,proto3" json:"flow_mod,omitempty"`
	Xid                  uint32      `protobuf:"varint,3,opt,name=xid,proto3" json:"xid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *FlowTableUpdate) Reset()         { *m = FlowTableUpdate{} }
func (m *FlowTableUpdate) String() string { return proto.CompactTextString(m) }
func (*FlowTableUpdate) ProtoMessage()    {}
func (*FlowTableUpdate) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{87}
}

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

var xxx_messageInfo_FlowTableUpdate proto.InternalMessageInfo

func (m *FlowTableUpdate) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *FlowTableUpdate) GetFlowMod() *OfpFlowMod {
	if m != nil {
		return m.FlowMod
	}
	return nil
}

func (m *FlowTableUpdate) GetXid() uint32 {
	if m != nil {
		return m.Xid
	}
	return 0
}

type FlowGroupTableUpdate struct {
	Id                   string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	GroupMod             *OfpGroupMod `protobuf:"bytes,2,opt,name=group_mod,json=groupMod,proto3" json:"group_mod,omitempty"`
	Xid                  uint32       `protobuf:"varint,3,opt,name=xid,proto3" json:"xid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *FlowGroupTableUpdate) Reset()         { *m = FlowGroupTableUpdate{} }
func (m *FlowGroupTableUpdate) String() string { return proto.CompactTextString(m) }
func (*FlowGroupTableUpdate) ProtoMessage()    {}
func (*FlowGroupTableUpdate) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{88}
}

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

var xxx_messageInfo_FlowGroupTableUpdate proto.InternalMessageInfo

func (m *FlowGroupTableUpdate) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *FlowGroupTableUpdate) GetGroupMod() *OfpGroupMod {
	if m != nil {
		return m.GroupMod
	}
	return nil
}

func (m *FlowGroupTableUpdate) GetXid() uint32 {
	if m != nil {
		return m.Xid
	}
	return 0
}

type Flows struct {
	Items                []*OfpFlowStats `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Flows) Reset()         { *m = Flows{} }
func (m *Flows) String() string { return proto.CompactTextString(m) }
func (*Flows) ProtoMessage()    {}
func (*Flows) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{89}
}

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

var xxx_messageInfo_Flows proto.InternalMessageInfo

func (m *Flows) GetItems() []*OfpFlowStats {
	if m != nil {
		return m.Items
	}
	return nil
}

type Meters struct {
	Items                []*OfpMeterEntry `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *Meters) Reset()         { *m = Meters{} }
func (m *Meters) String() string { return proto.CompactTextString(m) }
func (*Meters) ProtoMessage()    {}
func (*Meters) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{90}
}

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

var xxx_messageInfo_Meters proto.InternalMessageInfo

func (m *Meters) GetItems() []*OfpMeterEntry {
	if m != nil {
		return m.Items
	}
	return nil
}

type FlowGroups struct {
	Items                []*OfpGroupEntry `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *FlowGroups) Reset()         { *m = FlowGroups{} }
func (m *FlowGroups) String() string { return proto.CompactTextString(m) }
func (*FlowGroups) ProtoMessage()    {}
func (*FlowGroups) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{91}
}

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

var xxx_messageInfo_FlowGroups proto.InternalMessageInfo

func (m *FlowGroups) GetItems() []*OfpGroupEntry {
	if m != nil {
		return m.Items
	}
	return nil
}

type FlowChanges struct {
	ToAdd                *Flows   `protobuf:"bytes,1,opt,name=to_add,json=toAdd,proto3" json:"to_add,omitempty"`
	ToRemove             *Flows   `protobuf:"bytes,2,opt,name=to_remove,json=toRemove,proto3" json:"to_remove,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FlowChanges) Reset()         { *m = FlowChanges{} }
func (m *FlowChanges) String() string { return proto.CompactTextString(m) }
func (*FlowChanges) ProtoMessage()    {}
func (*FlowChanges) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{92}
}

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

var xxx_messageInfo_FlowChanges proto.InternalMessageInfo

func (m *FlowChanges) GetToAdd() *Flows {
	if m != nil {
		return m.ToAdd
	}
	return nil
}

func (m *FlowChanges) GetToRemove() *Flows {
	if m != nil {
		return m.ToRemove
	}
	return nil
}

type FlowGroupChanges struct {
	ToAdd                *FlowGroups `protobuf:"bytes,1,opt,name=to_add,json=toAdd,proto3" json:"to_add,omitempty"`
	ToRemove             *FlowGroups `protobuf:"bytes,2,opt,name=to_remove,json=toRemove,proto3" json:"to_remove,omitempty"`
	ToUpdate             *FlowGroups `protobuf:"bytes,3,opt,name=to_update,json=toUpdate,proto3" json:"to_update,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *FlowGroupChanges) Reset()         { *m = FlowGroupChanges{} }
func (m *FlowGroupChanges) String() string { return proto.CompactTextString(m) }
func (*FlowGroupChanges) ProtoMessage()    {}
func (*FlowGroupChanges) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{93}
}

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

var xxx_messageInfo_FlowGroupChanges proto.InternalMessageInfo

func (m *FlowGroupChanges) GetToAdd() *FlowGroups {
	if m != nil {
		return m.ToAdd
	}
	return nil
}

func (m *FlowGroupChanges) GetToRemove() *FlowGroups {
	if m != nil {
		return m.ToRemove
	}
	return nil
}

func (m *FlowGroupChanges) GetToUpdate() *FlowGroups {
	if m != nil {
		return m.ToUpdate
	}
	return nil
}

type PacketIn struct {
	Id                   string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	PacketIn             *OfpPacketIn `protobuf:"bytes,2,opt,name=packet_in,json=packetIn,proto3" json:"packet_in,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *PacketIn) Reset()         { *m = PacketIn{} }
func (m *PacketIn) String() string { return proto.CompactTextString(m) }
func (*PacketIn) ProtoMessage()    {}
func (*PacketIn) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{94}
}

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

var xxx_messageInfo_PacketIn proto.InternalMessageInfo

func (m *PacketIn) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *PacketIn) GetPacketIn() *OfpPacketIn {
	if m != nil {
		return m.PacketIn
	}
	return nil
}

type PacketOut struct {
	Id                   string        `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	PacketOut            *OfpPacketOut `protobuf:"bytes,2,opt,name=packet_out,json=packetOut,proto3" json:"packet_out,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *PacketOut) Reset()         { *m = PacketOut{} }
func (m *PacketOut) String() string { return proto.CompactTextString(m) }
func (*PacketOut) ProtoMessage()    {}
func (*PacketOut) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{95}
}

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

var xxx_messageInfo_PacketOut proto.InternalMessageInfo

func (m *PacketOut) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *PacketOut) GetPacketOut() *OfpPacketOut {
	if m != nil {
		return m.PacketOut
	}
	return nil
}

type ChangeEvent struct {
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Types that are valid to be assigned to Event:
	//	*ChangeEvent_PortStatus
	//	*ChangeEvent_Error
	Event                isChangeEvent_Event `protobuf_oneof:"event"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *ChangeEvent) Reset()         { *m = ChangeEvent{} }
func (m *ChangeEvent) String() string { return proto.CompactTextString(m) }
func (*ChangeEvent) ProtoMessage()    {}
func (*ChangeEvent) Descriptor() ([]byte, []int) {
	return fileDescriptor_08e3a4e375aeddc7, []int{96}
}

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

var xxx_messageInfo_ChangeEvent proto.InternalMessageInfo

func (m *ChangeEvent) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

type isChangeEvent_Event interface {
	isChangeEvent_Event()
}

type ChangeEvent_PortStatus struct {
	PortStatus *OfpPortStatus `protobuf:"bytes,2,opt,name=port_status,json=portStatus,proto3,oneof"`
}

type ChangeEvent_Error struct {
	Error *OfpErrorMsg `protobuf:"bytes,3,opt,name=error,proto3,oneof"`
}

func (*ChangeEvent_PortStatus) isChangeEvent_Event() {}

func (*ChangeEvent_Error) isChangeEvent_Event() {}

func (m *ChangeEvent) GetEvent() isChangeEvent_Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *ChangeEvent) GetPortStatus() *OfpPortStatus {
	if x, ok := m.GetEvent().(*ChangeEvent_PortStatus); ok {
		return x.PortStatus
	}
	return nil
}

func (m *ChangeEvent) GetError() *OfpErrorMsg {
	if x, ok := m.GetEvent().(*ChangeEvent_Error); ok {
		return x.Error
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ChangeEvent) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ChangeEvent_PortStatus)(nil),
		(*ChangeEvent_Error)(nil),
	}
}

func init() {
	proto.RegisterEnum("openflow_13.OfpPortNo", OfpPortNo_name, OfpPortNo_value)
	proto.RegisterEnum("openflow_13.OfpType", OfpType_name, OfpType_value)
	proto.RegisterEnum("openflow_13.OfpHelloElemType", OfpHelloElemType_name, OfpHelloElemType_value)
	proto.RegisterEnum("openflow_13.OfpConfigFlags", OfpConfigFlags_name, OfpConfigFlags_value)
	proto.RegisterEnum("openflow_13.OfpTableConfig", OfpTableConfig_name, OfpTableConfig_value)
	proto.RegisterEnum("openflow_13.OfpTable", OfpTable_name, OfpTable_value)
	proto.RegisterEnum("openflow_13.OfpCapabilities", OfpCapabilities_name, OfpCapabilities_value)
	proto.RegisterEnum("openflow_13.OfpPortConfig", OfpPortConfig_name, OfpPortConfig_value)
	proto.RegisterEnum("openflow_13.OfpPortState", OfpPortState_name, OfpPortState_value)
	proto.RegisterEnum("openflow_13.OfpPortFeatures", OfpPortFeatures_name, OfpPortFeatures_value)
	proto.RegisterEnum("openflow_13.OfpPortReason", OfpPortReason_name, OfpPortReason_value)
	proto.RegisterEnum("openflow_13.OfpMatchType", OfpMatchType_name, OfpMatchType_value)
	proto.RegisterEnum("openflow_13.OfpOxmClass", OfpOxmClass_name, OfpOxmClass_value)
	proto.RegisterEnum("openflow_13.OxmOfbFieldTypes", OxmOfbFieldTypes_name, OxmOfbFieldTypes_value)
	proto.RegisterEnum("openflow_13.OfpVlanId", OfpVlanId_name, OfpVlanId_value)
	proto.RegisterEnum("openflow_13.OfpIpv6ExthdrFlags", OfpIpv6ExthdrFlags_name, OfpIpv6ExthdrFlags_value)
	proto.RegisterEnum("openflow_13.OfpActionType", OfpActionType_name, OfpActionType_value)
	proto.RegisterEnum("openflow_13.OfpControllerMaxLen", OfpControllerMaxLen_name, OfpControllerMaxLen_value)
	proto.RegisterEnum("openflow_13.OfpInstructionType", OfpInstructionType_name, OfpInstructionType_value)
	proto.RegisterEnum("openflow_13.OfpFlowModCommand", OfpFlowModCommand_name, OfpFlowModCommand_value)
	proto.RegisterEnum("openflow_13.OfpFlowModFlags", OfpFlowModFlags_name, OfpFlowModFlags_value)
	proto.RegisterEnum("openflow_13.OfpGroup", OfpGroup_name, OfpGroup_value)
	proto.RegisterEnum("openflow_13.OfpGroupModCommand", OfpGroupModCommand_name, OfpGroupModCommand_value)
	proto.RegisterEnum("openflow_13.OfpGroupType", OfpGroupType_name, OfpGroupType_value)
	proto.RegisterEnum("openflow_13.OfpPacketInReason", OfpPacketInReason_name, OfpPacketInReason_value)
	proto.RegisterEnum("openflow_13.OfpFlowRemovedReason", OfpFlowRemovedReason_name, OfpFlowRemovedReason_value)
	proto.RegisterEnum("openflow_13.OfpMeter", OfpMeter_name, OfpMeter_value)
	proto.RegisterEnum("openflow_13.OfpMeterBandType", OfpMeterBandType_name, OfpMeterBandType_value)
	proto.RegisterEnum("openflow_13.OfpMeterModCommand", OfpMeterModCommand_name, OfpMeterModCommand_value)
	proto.RegisterEnum("openflow_13.OfpMeterFlags", OfpMeterFlags_name, OfpMeterFlags_value)
	proto.RegisterEnum("openflow_13.OfpErrorType", OfpErrorType_name, OfpErrorType_value)
	proto.RegisterEnum("openflow_13.OfpHelloFailedCode", OfpHelloFailedCode_name, OfpHelloFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpBadRequestCode", OfpBadRequestCode_name, OfpBadRequestCode_value)
	proto.RegisterEnum("openflow_13.OfpBadActionCode", OfpBadActionCode_name, OfpBadActionCode_value)
	proto.RegisterEnum("openflow_13.OfpBadInstructionCode", OfpBadInstructionCode_name, OfpBadInstructionCode_value)
	proto.RegisterEnum("openflow_13.OfpBadMatchCode", OfpBadMatchCode_name, OfpBadMatchCode_value)
	proto.RegisterEnum("openflow_13.OfpFlowModFailedCode", OfpFlowModFailedCode_name, OfpFlowModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpGroupModFailedCode", OfpGroupModFailedCode_name, OfpGroupModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpPortModFailedCode", OfpPortModFailedCode_name, OfpPortModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpTableModFailedCode", OfpTableModFailedCode_name, OfpTableModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpQueueOpFailedCode", OfpQueueOpFailedCode_name, OfpQueueOpFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpSwitchConfigFailedCode", OfpSwitchConfigFailedCode_name, OfpSwitchConfigFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpRoleRequestFailedCode", OfpRoleRequestFailedCode_name, OfpRoleRequestFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpMeterModFailedCode", OfpMeterModFailedCode_name, OfpMeterModFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpTableFeaturesFailedCode", OfpTableFeaturesFailedCode_name, OfpTableFeaturesFailedCode_value)
	proto.RegisterEnum("openflow_13.OfpMultipartType", OfpMultipartType_name, OfpMultipartType_value)
	proto.RegisterEnum("openflow_13.OfpMultipartRequestFlags", OfpMultipartRequestFlags_name, OfpMultipartRequestFlags_value)
	proto.RegisterEnum("openflow_13.OfpMultipartReplyFlags", OfpMultipartReplyFlags_name, OfpMultipartReplyFlags_value)
	proto.RegisterEnum("openflow_13.OfpTableFeaturePropType", OfpTableFeaturePropType_name, OfpTableFeaturePropType_value)
	proto.RegisterEnum("openflow_13.OfpGroupCapabilities", OfpGroupCapabilities_name, OfpGroupCapabilities_value)
	proto.RegisterEnum("openflow_13.OfpQueueProperties", OfpQueueProperties_name, OfpQueueProperties_value)
	proto.RegisterEnum("openflow_13.OfpControllerRole", OfpControllerRole_name, OfpControllerRole_value)
	proto.RegisterType((*OfpHeader)(nil), "openflow_13.ofp_header")
	proto.RegisterType((*OfpHelloElemHeader)(nil), "openflow_13.ofp_hello_elem_header")
	proto.RegisterType((*OfpHelloElemVersionbitmap)(nil), "openflow_13.ofp_hello_elem_versionbitmap")
	proto.RegisterType((*OfpHello)(nil), "openflow_13.ofp_hello")
	proto.RegisterType((*OfpSwitchConfig)(nil), "openflow_13.ofp_switch_config")
	proto.RegisterType((*OfpTableMod)(nil), "openflow_13.ofp_table_mod")
	proto.RegisterType((*OfpPort)(nil), "openflow_13.ofp_port")
	proto.RegisterType((*OfpSwitchFeatures)(nil), "openflow_13.ofp_switch_features")
	proto.RegisterType((*OfpPortStatus)(nil), "openflow_13.ofp_port_status")
	proto.RegisterType((*OfpPortMod)(nil), "openflow_13.ofp_port_mod")
	proto.RegisterType((*OfpMatch)(nil), "openflow_13.ofp_match")
	proto.RegisterType((*OfpOxmField)(nil), "openflow_13.ofp_oxm_field")
	proto.RegisterType((*OfpOxmOfbField)(nil), "openflow_13.ofp_oxm_ofb_field")
	proto.RegisterType((*OfpOxmExperimenterField)(nil), "openflow_13.ofp_oxm_experimenter_field")
	proto.RegisterType((*OfpAction)(nil), "openflow_13.ofp_action")
	proto.RegisterType((*OfpActionOutput)(nil), "openflow_13.ofp_action_output")
	proto.RegisterType((*OfpActionMplsTtl)(nil), "openflow_13.ofp_action_mpls_ttl")
	proto.RegisterType((*OfpActionPush)(nil), "openflow_13.ofp_action_push")
	proto.RegisterType((*OfpActionPopMpls)(nil), "openflow_13.ofp_action_pop_mpls")
	proto.RegisterType((*OfpActionGroup)(nil), "openflow_13.ofp_action_group")
	proto.RegisterType((*OfpActionNwTtl)(nil), "openflow_13.ofp_action_nw_ttl")
	proto.RegisterType((*OfpActionSetField)(nil), "openflow_13.ofp_action_set_field")
	proto.RegisterType((*OfpActionExperimenter)(nil), "openflow_13.ofp_action_experimenter")
	proto.RegisterType((*OfpInstruction)(nil), "openflow_13.ofp_instruction")
	proto.RegisterType((*OfpInstructionGotoTable)(nil), "openflow_13.ofp_instruction_goto_table")
	proto.RegisterType((*OfpInstructionWriteMetadata)(nil), "openflow_13.ofp_instruction_write_metadata")
	proto.RegisterType((*OfpInstructionActions)(nil), "openflow_13.ofp_instruction_actions")
	proto.RegisterType((*OfpInstructionMeter)(nil), "openflow_13.ofp_instruction_meter")
	proto.RegisterType((*OfpInstructionExperimenter)(nil), "openflow_13.ofp_instruction_experimenter")
	proto.RegisterType((*OfpFlowMod)(nil), "openflow_13.ofp_flow_mod")
	proto.RegisterType((*OfpBucket)(nil), "openflow_13.ofp_bucket")
	proto.RegisterType((*OfpGroupMod)(nil), "openflow_13.ofp_group_mod")
	proto.RegisterType((*OfpPacketOut)(nil), "openflow_13.ofp_packet_out")
	proto.RegisterType((*OfpPacketIn)(nil), "openflow_13.ofp_packet_in")
	proto.RegisterType((*OfpFlowRemoved)(nil), "openflow_13.ofp_flow_removed")
	proto.RegisterType((*OfpMeterBandHeader)(nil), "openflow_13.ofp_meter_band_header")
	proto.RegisterType((*OfpMeterBandDrop)(nil), "openflow_13.ofp_meter_band_drop")
	proto.RegisterType((*OfpMeterBandDscpRemark)(nil), "openflow_13.ofp_meter_band_dscp_remark")
	proto.RegisterType((*OfpMeterBandExperimenter)(nil), "openflow_13.ofp_meter_band_experimenter")
	proto.RegisterType((*OfpMeterMod)(nil), "openflow_13.ofp_meter_mod")
	proto.RegisterType((*OfpErrorMsg)(nil), "openflow_13.ofp_error_msg")
	proto.RegisterType((*OfpErrorExperimenterMsg)(nil), "openflow_13.ofp_error_experimenter_msg")
	proto.RegisterType((*OfpMultipartRequest)(nil), "openflow_13.ofp_multipart_request")
	proto.RegisterType((*OfpMultipartReply)(nil), "openflow_13.ofp_multipart_reply")
	proto.RegisterType((*OfpDesc)(nil), "openflow_13.ofp_desc")
	proto.RegisterType((*OfpFlowStatsRequest)(nil), "openflow_13.ofp_flow_stats_request")
	proto.RegisterType((*OfpFlowStats)(nil), "openflow_13.ofp_flow_stats")
	proto.RegisterType((*OfpAggregateStatsRequest)(nil), "openflow_13.ofp_aggregate_stats_request")
	proto.RegisterType((*OfpAggregateStatsReply)(nil), "openflow_13.ofp_aggregate_stats_reply")
	proto.RegisterType((*OfpTableFeatureProperty)(nil), "openflow_13.ofp_table_feature_property")
	proto.RegisterType((*OfpTableFeaturePropInstructions)(nil), "openflow_13.ofp_table_feature_prop_instructions")
	proto.RegisterType((*OfpTableFeaturePropNextTables)(nil), "openflow_13.ofp_table_feature_prop_next_tables")
	proto.RegisterType((*OfpTableFeaturePropActions)(nil), "openflow_13.ofp_table_feature_prop_actions")
	proto.RegisterType((*OfpTableFeaturePropOxm)(nil), "openflow_13.ofp_table_feature_prop_oxm")
	proto.RegisterType((*OfpTableFeaturePropExperimenter)(nil), "openflow_13.ofp_table_feature_prop_experimenter")
	proto.RegisterType((*OfpTableFeatures)(nil), "openflow_13.ofp_table_features")
	proto.RegisterType((*OfpTableStats)(nil), "openflow_13.ofp_table_stats")
	proto.RegisterType((*OfpPortStatsRequest)(nil), "openflow_13.ofp_port_stats_request")
	proto.RegisterType((*OfpPortStats)(nil), "openflow_13.ofp_port_stats")
	proto.RegisterType((*OfpGroupStatsRequest)(nil), "openflow_13.ofp_group_stats_request")
	proto.RegisterType((*OfpBucketCounter)(nil), "openflow_13.ofp_bucket_counter")
	proto.RegisterType((*OfpGroupStats)(nil), "openflow_13.ofp_group_stats")
	proto.RegisterType((*OfpGroupDesc)(nil), "openflow_13.ofp_group_desc")
	proto.RegisterType((*OfpGroupEntry)(nil), "openflow_13.ofp_group_entry")
	proto.RegisterType((*OfpGroupFeatures)(nil), "openflow_13.ofp_group_features")
	proto.RegisterType((*OfpMeterMultipartRequest)(nil), "openflow_13.ofp_meter_multipart_request")
	proto.RegisterType((*OfpMeterBandStats)(nil), "openflow_13.ofp_meter_band_stats")
	proto.RegisterType((*OfpMeterStats)(nil), "openflow_13.ofp_meter_stats")
	proto.RegisterType((*OfpMeterConfig)(nil), "openflow_13.ofp_meter_config")
	proto.RegisterType((*OfpMeterFeatures)(nil), "openflow_13.ofp_meter_features")
	proto.RegisterType((*OfpMeterEntry)(nil), "openflow_13.ofp_meter_entry")
	proto.RegisterType((*OfpExperimenterMultipartHeader)(nil), "openflow_13.ofp_experimenter_multipart_header")
	proto.RegisterType((*OfpExperimenterHeader)(nil), "openflow_13.ofp_experimenter_header")
	proto.RegisterType((*OfpQueuePropHeader)(nil), "openflow_13.ofp_queue_prop_header")
	proto.RegisterType((*OfpQueuePropMinRate)(nil), "openflow_13.ofp_queue_prop_min_rate")
	proto.RegisterType((*OfpQueuePropMaxRate)(nil), "openflow_13.ofp_queue_prop_max_rate")
	proto.RegisterType((*OfpQueuePropExperimenter)(nil), "openflow_13.ofp_queue_prop_experimenter")
	proto.RegisterType((*OfpPacketQueue)(nil), "openflow_13.ofp_packet_queue")
	proto.RegisterType((*OfpQueueGetConfigRequest)(nil), "openflow_13.ofp_queue_get_config_request")
	proto.RegisterType((*OfpQueueGetConfigReply)(nil), "openflow_13.ofp_queue_get_config_reply")
	proto.RegisterType((*OfpActionSetQueue)(nil), "openflow_13.ofp_action_set_queue")
	proto.RegisterType((*OfpQueueStatsRequest)(nil), "openflow_13.ofp_queue_stats_request")
	proto.RegisterType((*OfpQueueStats)(nil), "openflow_13.ofp_queue_stats")
	proto.RegisterType((*OfpRoleRequest)(nil), "openflow_13.ofp_role_request")
	proto.RegisterType((*OfpAsyncConfig)(nil), "openflow_13.ofp_async_config")
	proto.RegisterType((*MeterModUpdate)(nil), "openflow_13.MeterModUpdate")
	proto.RegisterType((*MeterStatsReply)(nil), "openflow_13.MeterStatsReply")
	proto.RegisterType((*FlowTableUpdate)(nil), "openflow_13.FlowTableUpdate")
	proto.RegisterType((*FlowGroupTableUpdate)(nil), "openflow_13.FlowGroupTableUpdate")
	proto.RegisterType((*Flows)(nil), "openflow_13.Flows")
	proto.RegisterType((*Meters)(nil), "openflow_13.Meters")
	proto.RegisterType((*FlowGroups)(nil), "openflow_13.FlowGroups")
	proto.RegisterType((*FlowChanges)(nil), "openflow_13.FlowChanges")
	proto.RegisterType((*FlowGroupChanges)(nil), "openflow_13.FlowGroupChanges")
	proto.RegisterType((*PacketIn)(nil), "openflow_13.PacketIn")
	proto.RegisterType((*PacketOut)(nil), "openflow_13.PacketOut")
	proto.RegisterType((*ChangeEvent)(nil), "openflow_13.ChangeEvent")
}

func init() { proto.RegisterFile("voltha_protos/openflow_13.proto", fileDescriptor_08e3a4e375aeddc7) }

var fileDescriptor_08e3a4e375aeddc7 = []byte{
	// 8470 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x5b, 0x8c, 0x1c, 0x59,
	0x96, 0x90, 0xf3, 0x51, 0x55, 0x99, 0x37, 0xab, 0xca, 0xe1, 0xf0, 0x2b, 0xed, 0xb2, 0xdb, 0x76,
	0x4e, 0xf7, 0x4c, 0x4f, 0x0e, 0xdb, 0x6e, 0xbb, 0xdd, 0x9e, 0xd9, 0x79, 0x2c, 0x8e, 0xcc, 0x8c,
	0xac, 0xcc, 0x76, 0xbe, 0x1c, 0x11, 0x55, 0xb6, 0x07, 0x41, 0x28, 0x2b, 0x33, 0x5c, 0x95, 0xeb,
	0xcc, 0x8c, 0x9c, 0x88, 0xa8, 0x72, 0x79, 0x99, 0x45, 0x86, 0x15, 0x42, 0x02, 0x76, 0x17, 0xb4,
	0x1f, 0x23, 0xc1, 0x22, 0xb1, 0x02, 0x3e, 0x10, 0x12, 0x1f, 0x48, 0x48, 0x48, 0x7c, 0xaf, 0x04,
	0x12, 0x02, 0x69, 0x25, 0xb4, 0x3f, 0xbb, 0x7f, 0xcb, 0x0f, 0xd2, 0xfe, 0xc3, 0x32, 0x8c, 0xd1,
	0xb9, 0xe7, 0xdc, 0x1b, 0x37, 0xf2, 0x51, 0x5d, 0x33, 0xf4, 0xf0, 0xc1, 0x97, 0x33, 0xce, 0xeb,
	0x9e, 0x7b, 0xee, 0x39, 0xe7, 0x9e, 0x7b, 0xe2, 0x46, 0x99, 0xdd, 0x39, 0xf1, 0xc7, 0xd1, 0x51,
	0xdf, 0x9d, 0x05, 0x7e, 0xe4, 0x87, 0xf7, 0xfd, 0x99, 0x37, 0x7d, 0x35, 0xf6, 0xdf, 0xb8, 0x0f,
	0x3e, 0xfb, 0x84, 0x83, 0xf4, 0x82, 0x02, 0xba, 0x79, 0xeb, 0xd0, 0xf7, 0x0f, 0xc7, 0xde, 0xfd,
	0xfe, 0x6c, 0x74, 0xbf, 0x3f, 0x9d, 0xfa, 0x51, 0x3f, 0x1a, 0xf9, 0xd3, 0x10, 0x49, 0x4b, 0x03,
	0xc6, 0xfc, 0x57, 0x33, 0xf7, 0xc8, 0xeb, 0x0f, 0xbd, 0x40, 0x2f, 0xb2, 0x8d, 0x13, 0x2f, 0x08,
	0x47, 0xfe, 0xb4, 0x98, 0xba, 0x9b, 0xfa, 0x78, 0xcb, 0x12, 0x8f, 0xfa, 0x37, 0x59, 0x36, 0x7a,
	0x3b, 0xf3, 0x8a, 0xe9, 0xbb, 0xa9, 0x8f, 0xb7, 0x1f, 0x5e, 0xfd, 0x44, 0x1d, 0x14, 0x04, 0x00,
	0xd2, 0xe2, 0x24, 0xba, 0xc6, 0x32, 0xa7, 0xa3, 0x61, 0x31, 0xc3, 0x05, 0xc0, 0xcf, 0xd2, 0xbf,
	0x4a, 0xb1, 0xab, 0x38, 0xca, 0x78, 0xec, 0xbb, 0xde, 0xd8, 0x9b, 0x88, 0x01, 0x1f, 0x91, 0xd8,
	0x14, 0x17, 0x7b, 0x77, 0x41, 0xac, 0xc2, 0xa1, 0x8c, 0xf0, 0x8c, 0x6d, 0x91, 0x5e, 0x07, 0xa3,
	0x68, 0xd2, 0x9f, 0x71, 0xad, 0x0a, 0x0f, 0xbf, 0x79, 0x16, 0x7b, 0x82, 0xa1, 0x71, 0xc1, 0x4a,
	0x4a, 0xa8, 0xe4, 0xd9, 0x06, 0x90, 0x79, 0xd3, 0xa8, 0xf4, 0x1d, 0x76, 0xeb, 0x2c, 0x5e, 0x30,
	0x12, 0xfe, 0x0a, 0x8b, 0xe9, 0xbb, 0x19, 0x30, 0x12, 0x3d, 0x96, 0x9e, 0xb2, 0xbc, 0xe4, 0xd4,
	0x7f, 0x8d, 0xe5, 0x48, 0x62, 0x58, 0x4c, 0xdd, 0xcd, 0x7c, 0x5c, 0x78, 0x58, 0x3a, 0x4b, 0x3f,
	0x34, 0x88, 0x25, 0x79, 0x4a, 0x6d, 0x76, 0x09, 0x48, 0xc2, 0x37, 0xa3, 0x68, 0x70, 0xe4, 0x0e,
	0xfc, 0xe9, 0xab, 0xd1, 0xa1, 0x7e, 0x85, 0xad, 0xbd, 0x1a, 0xf7, 0x0f, 0x43, 0x5a, 0x1e, 0x7c,
	0xd0, 0x4b, 0x6c, 0x6b, 0x32, 0x0a, 0x43, 0x37, 0xf4, 0xa6, 0x43, 0x77, 0xec, 0x4d, 0xb9, 0x3d,
	0xb6, 0xac, 0x02, 0x00, 0x6d, 0x6f, 0x3a, 0x6c, 0x79, 0xd3, 0x52, 0x85, 0x6d, 0xf1, 0x75, 0xea,
	0x1f, 0x8c, 0x3d, 0x77, 0xe2, 0x0f, 0xf5, 0x1b, 0x2c, 0x87, 0x0f, 0xa3, 0xa1, 0x58, 0x6c, 0xfe,
	0xdc, 0x1c, 0xea, 0xd7, 0xd8, 0x3a, 0x8e, 0x47, 0x82, 0xe8, 0xa9, 0xf4, 0x4f, 0xd3, 0x2c, 0x07,
	0x42, 0x66, 0x7e, 0x10, 0xe9, 0xd7, 0xd9, 0x06, 0xfc, 0xeb, 0x4e, 0x7d, 0x62, 0x5f, 0x87, 0xc7,
	0x8e, 0x0f, 0x88, 0xa3, 0x37, 0x6e, 0x7f, 0x38, 0x0c, 0xc8, 0x3e, 0xeb, 0x47, 0x6f, 0x8c, 0xe1,
	0x30, 0xd0, 0x75, 0x96, 0x9d, 0xf6, 0x27, 0x1e, 0xf7, 0x8c, 0xbc, 0xc5, 0x7f, 0x2b, 0x43, 0x65,
	0xd5, 0xa1, 0x60, 0xa2, 0x61, 0xd4, 0x8f, 0xbc, 0xe2, 0x1a, 0x4e, 0x94, 0x3f, 0x80, 0x84, 0xc1,
	0x71, 0x10, 0x14, 0xd7, 0x39, 0x90, 0xff, 0xd6, 0x3f, 0x60, 0xac, 0x3f, 0x3c, 0xf1, 0x82, 0x68,
	0x14, 0x7a, 0xc3, 0xe2, 0x06, 0xc7, 0x28, 0x10, 0xfd, 0x16, 0xcb, 0x87, 0xc7, 0x33, 0xd0, 0xcd,
	0x1b, 0x16, 0x73, 0x1c, 0x1d, 0x03, 0x40, 0xe2, 0xcc, 0xf3, 0x82, 0x62, 0x1e, 0x25, 0xc2, 0x6f,
	0xfd, 0x36, 0x63, 0x20, 0xd9, 0x0d, 0x67, 0x9e, 0x37, 0x2c, 0x32, 0x64, 0x01, 0x88, 0x0d, 0x00,
	0x7d, 0x87, 0xe5, 0x27, 0xfd, 0x53, 0xc2, 0x16, 0x38, 0x36, 0x37, 0xe9, 0x9f, 0x72, 0x64, 0xe9,
	0xdf, 0xa6, 0xd8, 0x65, 0x65, 0xd9, 0x5e, 0x79, 0xfd, 0xe8, 0x38, 0xf0, 0x42, 0xfd, 0x0e, 0x2b,
	0x0c, 0xfb, 0x51, 0x7f, 0xd6, 0x8f, 0x8e, 0x84, 0xc1, 0xb3, 0x16, 0x13, 0xa0, 0x26, 0x97, 0x3a,
	0x75, 0x0f, 0x8e, 0x5f, 0xbd, 0xf2, 0x82, 0x90, 0xcc, 0x9e, 0x9b, 0x56, 0xf0, 0x19, 0xd6, 0x6a,
	0x8a, 0x4b, 0x17, 0x52, 0x5c, 0x6d, 0x4c, 0x1d, 0xfe, 0xa8, 0xdf, 0x63, 0x9b, 0xfd, 0xe3, 0xd3,
	0xd1, 0x78, 0xd4, 0x0f, 0xde, 0x82, 0x64, 0x34, 0x63, 0x41, 0xc2, 0x9a, 0x43, 0xbd, 0xc4, 0x36,
	0x07, 0xfd, 0x59, 0xff, 0x60, 0x34, 0x1e, 0x45, 0x23, 0x2f, 0x24, 0x93, 0x26, 0x60, 0xa5, 0x80,
	0x5d, 0x14, 0x2b, 0xeb, 0x82, 0xad, 0x8f, 0x43, 0xfd, 0x11, 0x5b, 0x0f, 0xbc, 0x7e, 0x48, 0xb9,
	0x60, 0xfb, 0xe1, 0xad, 0x05, 0xf7, 0xe5, 0xd4, 0x48, 0x63, 0x11, 0x2d, 0x24, 0x8a, 0xa1, 0x17,
	0x0e, 0x28, 0x24, 0xaf, 0x2e, 0xe5, 0xb1, 0x38, 0x49, 0xe9, 0xef, 0xa6, 0xd8, 0xa6, 0x14, 0x03,
	0x2e, 0xf9, 0xf3, 0xbb, 0x54, 0xec, 0x3e, 0x99, 0x84, 0xfb, 0xe8, 0x2c, 0x3b, 0xe9, 0x87, 0xaf,
	0xc9, 0x1a, 0xfc, 0x37, 0x38, 0x82, 0x74, 0x0b, 0xb2, 0x41, 0x0c, 0x28, 0xbd, 0xc1, 0xd8, 0x9d,
	0xf4, 0xa3, 0xc1, 0x91, 0x7e, 0x3f, 0x91, 0x96, 0x76, 0x16, 0x26, 0xc1, 0xa9, 0xd4, 0x8c, 0xf4,
	0xab, 0x8c, 0xf9, 0xa7, 0x13, 0xf7, 0xd5, 0xc8, 0x1b, 0x0f, 0x31, 0x2d, 0x14, 0x1e, 0xde, 0x5c,
	0x60, 0x93, 0x24, 0x56, 0xde, 0x3f, 0x9d, 0xd4, 0x39, 0x71, 0xe9, 0xbf, 0xa7, 0x30, 0x32, 0x25,
	0x52, 0xff, 0x36, 0x03, 0xb4, 0x3b, 0x18, 0xf7, 0xc3, 0x90, 0x54, 0x58, 0x2e, 0x8b, 0x53, 0x58,
	0x39, 0xff, 0x74, 0x52, 0x85, 0x5f, 0xfa, 0x0f, 0x60, 0x0e, 0x07, 0x28, 0x85, 0x4f, 0xbd, 0xf0,
	0xf0, 0x83, 0xa5, 0x8c, 0x92, 0xaa, 0x71, 0xc1, 0xca, 0xf9, 0xaf, 0x0e, 0xb8, 0x2a, 0xfa, 0x0b,
	0xa6, 0x7b, 0xa7, 0x33, 0x2f, 0x18, 0x41, 0x02, 0xf2, 0x02, 0x92, 0xb3, 0xc6, 0xe5, 0x7c, 0x63,
	0xa9, 0x9c, 0x45, 0xf2, 0xc6, 0x05, 0xeb, 0x92, 0x0a, 0xe5, 0x92, 0x2b, 0x1b, 0x6c, 0x8d, 0x63,
	0x4b, 0x7f, 0xbc, 0x8d, 0x59, 0x2d, 0xa1, 0xc4, 0xd9, 0xbb, 0x80, 0x4a, 0xc9, 0x4d, 0x1e, 0x92,
	0xcd, 0x6f, 0xb0, 0xdc, 0x51, 0x3f, 0x74, 0xf9, 0x3a, 0x83, 0xb7, 0xe5, 0xac, 0x8d, 0xa3, 0x7e,
	0xd8, 0x86, 0xa5, 0xbe, 0xc2, 0xb2, 0xe0, 0x39, 0xe8, 0x14, 0x8d, 0x0b, 0x16, 0x7f, 0xd2, 0x3f,
	0x62, 0x5b, 0xb3, 0xa3, 0xb7, 0xe1, 0x68, 0xd0, 0x1f, 0x73, 0x9f, 0x43, 0xef, 0x68, 0x5c, 0xb0,
	0x36, 0x05, 0xb8, 0x07, 0x64, 0xdf, 0x60, 0xdb, 0x94, 0x25, 0xbd, 0xa8, 0x0f, 0x11, 0xca, 0x4d,
	0x90, 0x85, 0x3d, 0x83, 0xc3, 0xdb, 0x04, 0xd6, 0x6f, 0xb0, 0x0d, 0x2f, 0x3a, 0x72, 0x87, 0x61,
	0xc4, 0x13, 0xd2, 0x66, 0xe3, 0x82, 0xb5, 0xee, 0x45, 0x47, 0xb5, 0x30, 0x12, 0xa8, 0x30, 0x18,
	0xf0, 0x8c, 0x24, 0x50, 0x76, 0x30, 0xd0, 0x77, 0x58, 0x0e, 0x50, 0x7c, 0xc2, 0x39, 0x52, 0x00,
	0x88, 0x1d, 0x98, 0xd3, 0x0e, 0xcb, 0x9d, 0x8c, 0xfb, 0x53, 0xf7, 0x64, 0x34, 0xc4, 0x94, 0x04,
	0x48, 0x80, 0xec, 0x8f, 0x86, 0x12, 0x39, 0x1b, 0xcc, 0x30, 0x2b, 0x09, 0x64, 0x6f, 0x30, 0x83,
	0x11, 0x47, 0x33, 0x77, 0x18, 0x0e, 0x66, 0x98, 0x93, 0x60, 0xc4, 0xd1, 0xac, 0x16, 0x0e, 0x66,
	0xfa, 0x75, 0xb6, 0x3e, 0x9a, 0xb9, 0xde, 0x60, 0x5a, 0xdc, 0x24, 0xcc, 0xda, 0x68, 0x66, 0x0e,
	0xa6, 0x20, 0x70, 0x34, 0xc3, 0x32, 0xa2, 0xb8, 0x25, 0x04, 0x8e, 0x66, 0x3d, 0x5e, 0x44, 0x70,
	0xe4, 0xc9, 0x23, 0x3e, 0x87, 0xed, 0x18, 0x79, 0xf2, 0x88, 0x26, 0xc1, 0x91, 0x30, 0xf7, 0x8b,
	0x2a, 0x92, 0x26, 0x1f, 0x0d, 0x66, 0x9c, 0x51, 0x13, 0xaa, 0x44, 0x83, 0x19, 0xf0, 0x11, 0x0a,
	0xd8, 0x2e, 0x29, 0x28, 0xe2, 0x3a, 0x1e, 0x22, 0x97, 0x2e, 0x50, 0xc7, 0x43, 0xc1, 0x05, 0x28,
	0xe0, 0xba, 0xac, 0xa0, 0x80, 0x6b, 0x87, 0xe5, 0xc2, 0x41, 0x84, 0x6c, 0x57, 0x84, 0x22, 0x00,
	0x21, 0x2d, 0x39, 0x12, 0x18, 0xaf, 0xaa, 0x48, 0xe0, 0xbc, 0xc7, 0x0a, 0xa3, 0xc1, 0x04, 0x26,
	0xc1, 0x97, 0xe2, 0x1a, 0xe1, 0x19, 0x02, 0xf9, 0x6a, 0xc4, 0x24, 0x03, 0x7f, 0xe8, 0x15, 0xaf,
	0x27, 0x49, 0xaa, 0xfe, 0xd0, 0x03, 0xdb, 0xf6, 0x83, 0x99, 0xeb, 0xcf, 0x8a, 0x45, 0x61, 0xdb,
	0x7e, 0x30, 0xeb, 0xf2, 0xf5, 0x00, 0x44, 0x38, 0xeb, 0x17, 0x6f, 0x08, 0x9d, 0xfb, 0xc1, 0xcc,
	0x9e, 0xf5, 0x05, 0x2a, 0x9a, 0xf5, 0x8b, 0x37, 0x15, 0x94, 0x13, 0xa3, 0xc2, 0xa3, 0x7e, 0x71,
	0x47, 0xf8, 0x0d, 0x70, 0x1d, 0xc5, 0x5c, 0x47, 0xfd, 0xe2, 0x2d, 0x05, 0xe5, 0x1c, 0xf5, 0x69,
	0x35, 0x1e, 0x73, 0x23, 0xdc, 0x26, 0x1c, 0xac, 0xc6, 0xe3, 0x78, 0xa9, 0x1e, 0x73, 0x23, 0x7c,
	0xa0, 0x22, 0x85, 0x11, 0x00, 0xf9, 0x6a, 0xdc, 0x3f, 0xf0, 0xc6, 0xc5, 0x3b, 0x72, 0x86, 0xb3,
	0x93, 0xc7, 0x75, 0x0e, 0x93, 0x46, 0x78, 0x8c, 0x76, 0xba, 0x9b, 0x30, 0xc2, 0xe3, 0x84, 0x9d,
	0x1e, 0xa3, 0x9d, 0xee, 0x25, 0x49, 0xb8, 0x9d, 0xbe, 0xce, 0xb6, 0xf9, 0x40, 0xd3, 0xa1, 0x1b,
	0xf5, 0x83, 0x43, 0x2f, 0x2a, 0x96, 0x48, 0x97, 0x4d, 0x80, 0x77, 0x86, 0x0e, 0x87, 0xea, 0x77,
	0x49, 0xa1, 0xe9, 0xd0, 0x0d, 0xc3, 0x71, 0xf1, 0x6b, 0x44, 0x94, 0x47, 0x22, 0x3b, 0x1c, 0xab,
	0x14, 0xd1, 0x78, 0x5c, 0xfc, 0x30, 0x49, 0xe1, 0x8c, 0xc7, 0xfa, 0x1d, 0xc6, 0x26, 0xb3, 0x71,
	0xe8, 0xe2, 0x9c, 0x3e, 0x22, 0x6d, 0xf2, 0x00, 0x6b, 0xf1, 0x29, 0xdd, 0x60, 0x1b, 0x9c, 0x20,
	0x1a, 0x14, 0xbf, 0x2e, 0x16, 0x00, 0x00, 0x0e, 0xb7, 0x16, 0x47, 0x1d, 0xf8, 0x61, 0xf1, 0x1b,
	0xc2, 0x65, 0x00, 0x52, 0xf1, 0x43, 0x40, 0xce, 0x0e, 0x0e, 0xdc, 0x51, 0x38, 0x1a, 0x16, 0x3f,
	0x16, 0xc8, 0xd9, 0xc1, 0x41, 0x33, 0x1c, 0x0d, 0xf5, 0xdb, 0x2c, 0x1f, 0x1d, 0x4f, 0xa7, 0xde,
	0x18, 0x76, 0xe1, 0x6f, 0x52, 0xc6, 0xc8, 0x21, 0xa8, 0x39, 0x94, 0x96, 0xf6, 0x4e, 0xa3, 0xa3,
	0x61, 0x50, 0x2c, 0xab, 0x96, 0x36, 0x39, 0x4c, 0xff, 0x94, 0x5d, 0x4e, 0x26, 0x1e, 0xcc, 0x6d,
	0x23, 0x2e, 0x2b, 0x65, 0x5d, 0x4a, 0x64, 0x1f, 0x9e, 0xe7, 0x4a, 0x6c, 0x93, 0x32, 0x10, 0x92,
	0xfe, 0x3a, 0x37, 0x46, 0xca, 0x62, 0x98, 0x86, 0x54, 0x9a, 0x30, 0x18, 0x20, 0xcd, 0x6b, 0x85,
	0xc6, 0x0e, 0x06, 0x9c, 0xe6, 0x43, 0xb6, 0x25, 0xd2, 0x0e, 0x12, 0x4d, 0xb8, 0x7a, 0x29, 0xab,
	0x40, 0xb9, 0x47, 0x50, 0x89, 0x8c, 0x80, 0x54, 0x81, 0xa0, 0xa2, 0xb4, 0x90, 0xa0, 0x92, 0x4a,
	0x85, 0x2a, 0x95, 0xa2, 0x15, 0x85, 0x07, 0x12, 0xfd, 0x26, 0x11, 0x31, 0x8c, 0x11, 0x95, 0x26,
	0x12, 0x34, 0x7f, 0x43, 0xa1, 0x71, 0x88, 0xe6, 0x23, 0x3e, 0xda, 0xe3, 0x58, 0xa7, 0xbf, 0x99,
	0xa2, 0xf9, 0x15, 0x28, 0x00, 0x12, 0x64, 0x52, 0xa9, 0xbf, 0x95, 0x20, 0x13, 0x5a, 0x7d, 0x8b,
	0x69, 0x4a, 0x38, 0x20, 0xe5, 0x6f, 0xa5, 0x68, 0xd8, 0xed, 0x38, 0x28, 0x84, 0x4c, 0xe1, 0x0d,
	0x48, 0xf9, 0xf7, 0x05, 0x65, 0x81, 0x7c, 0x82, 0x93, 0xc1, 0x76, 0x22, 0xfc, 0x02, 0xe9, 0x7e,
	0x3b, 0x45, 0x2b, 0xba, 0x29, 0xbc, 0x23, 0x31, 0x38, 0x7a, 0x08, 0x92, 0xfe, 0x4e, 0x62, 0x70,
	0xf4, 0x13, 0x20, 0x86, 0x1d, 0xf5, 0xa4, 0x3f, 0x3e, 0xf6, 0x2a, 0xeb, 0x58, 0xe9, 0x94, 0x5c,
	0x76, 0x73, 0xf5, 0xae, 0x0c, 0x25, 0x2d, 0x60, 0xf0, 0x90, 0x41, 0xc5, 0x15, 0x14, 0x19, 0x0d,
	0x3c, 0x86, 0x81, 0x8f, 0x28, 0x4c, 0x54, 0x7f, 0x26, 0x60, 0xa5, 0x7f, 0x93, 0xc5, 0xa3, 0x62,
	0x7f, 0x00, 0xe7, 0x47, 0xfd, 0xd3, 0xc4, 0x9e, 0xbd, 0x58, 0x1b, 0x22, 0x99, 0x5a, 0x23, 0x7d,
	0x87, 0xad, 0xfb, 0xc7, 0xd1, 0xec, 0x38, 0xa2, 0xda, 0xf0, 0x83, 0x55, 0x3c, 0x48, 0x05, 0x41,
	0x89, 0xbf, 0xf4, 0x1f, 0x50, 0x50, 0x46, 0xd1, 0x98, 0x6f, 0xe9, 0x85, 0x25, 0x27, 0x45, 0xe2,
	0x15, 0x74, 0x22, 0x6c, 0x9d, 0x68, 0xac, 0x3f, 0x64, 0xd9, 0xd9, 0x71, 0x78, 0x44, 0x15, 0xd1,
	0x4a, 0x55, 0x81, 0x86, 0xd7, 0x0a, 0xc7, 0xe1, 0x11, 0x0c, 0x39, 0xf3, 0x67, 0x5c, 0x1c, 0x55,
	0x40, 0x2b, 0x87, 0x14, 0x74, 0x3c, 0x19, 0xf8, 0xb3, 0xf6, 0x6c, 0x1c, 0xea, 0x9f, 0xb3, 0xb5,
	0xc3, 0xc0, 0x3f, 0x9e, 0xf1, 0xc2, 0xa0, 0xf0, 0xf0, 0xf6, 0x2a, 0x5e, 0x4e, 0x04, 0x9b, 0x06,
	0xff, 0xa1, 0x7f, 0x9b, 0xad, 0x4f, 0xdf, 0xf0, 0x69, 0x6e, 0x9c, 0x6d, 0x22, 0xa4, 0x02, 0xc6,
	0xe9, 0x1b, 0x98, 0xe2, 0x13, 0x96, 0x0f, 0xbd, 0x88, 0x2a, 0xb6, 0x1c, 0xe7, 0xbd, 0xb7, 0x8a,
	0x57, 0x12, 0x42, 0x7e, 0x0a, 0xbd, 0x08, 0x8b, 0xbf, 0x2f, 0xe6, 0x5c, 0x20, 0xcf, 0x85, 0x7c,
	0xb8, 0x4a, 0x88, 0x4a, 0x0b, 0x49, 0x5c, 0x7d, 0xae, 0xe4, 0xd8, 0x3a, 0x92, 0x95, 0x9e, 0x60,
	0xb9, 0x97, 0x58, 0x58, 0x7e, 0xe6, 0x82, 0xf2, 0x2b, 0x45, 0x67, 0x2e, 0x3a, 0x4d, 0xc2, 0xa1,
	0x2a, 0x3e, 0xbc, 0xae, 0x4f, 0xfa, 0xa7, 0x70, 0x6e, 0xfd, 0x14, 0xcf, 0x53, 0x73, 0xcb, 0x0b,
	0xc5, 0x9f, 0x74, 0x09, 0x3a, 0xbd, 0xd2, 0x72, 0x97, 0xee, 0xe3, 0x51, 0x46, 0x59, 0x55, 0x28,
	0xfd, 0xbd, 0xe8, 0xc8, 0x0b, 0xa4, 0xc7, 0x6e, 0x59, 0x31, 0xa0, 0xf4, 0x59, 0x62, 0x08, 0xb1,
	0x9c, 0x5f, 0xc2, 0xf4, 0x2b, 0x4c, 0x9b, 0x5f, 0x47, 0x50, 0x8a, 0xff, 0x50, 0x8e, 0xd4, 0xfc,
	0xb9, 0x39, 0x2c, 0x95, 0x13, 0x86, 0xc0, 0xe5, 0xd3, 0xaf, 0xca, 0xe5, 0xa6, 0xe3, 0x3c, 0x5f,
	0xcc, 0x52, 0x83, 0x5d, 0x59, 0xb6, 0x5c, 0xfa, 0xa7, 0x54, 0x45, 0x73, 0xea, 0xb3, 0xcf, 0x17,
	0x54, 0x6e, 0x3f, 0x63, 0xd7, 0x57, 0xac, 0xd9, 0x42, 0xc8, 0xa7, 0x16, 0x43, 0x1e, 0x16, 0x8a,
	0xd7, 0xbf, 0xb0, 0x22, 0x9b, 0x16, 0xff, 0x5d, 0xfa, 0xfd, 0x0c, 0x9a, 0x77, 0x34, 0x0d, 0xa3,
	0xe0, 0x18, 0x73, 0x81, 0xae, 0xe4, 0x82, 0x2d, 0x8a, 0xf6, 0x06, 0x63, 0x87, 0x7e, 0xe4, 0xe3,
	0xa9, 0x95, 0x22, 0x7e, 0xf1, 0x10, 0xa1, 0x48, 0x71, 0x63, 0x72, 0xd8, 0xad, 0xe1, 0x89, 0x1f,
	0x71, 0x75, 0x87, 0x6d, 0xbf, 0x09, 0x46, 0x91, 0x52, 0x8f, 0x63, 0x0e, 0xf8, 0xd6, 0x99, 0xd2,
	0x92, 0x2c, 0x50, 0xbc, 0x73, 0x88, 0x2c, 0xde, 0x9f, 0xb0, 0x0d, 0x34, 0x4b, 0x48, 0x79, 0xe1,
	0xc3, 0x33, 0xc5, 0x11, 0x2d, 0xc4, 0x38, 0xfd, 0xd4, 0xbf, 0xcb, 0xd6, 0x26, 0x1e, 0x98, 0x0e,
	0xf3, 0x43, 0xe9, 0x4c, 0x7e, 0x4e, 0x09, 0xf1, 0xca, 0x7f, 0xe8, 0xdd, 0x39, 0xeb, 0xaf, 0xaf,
	0x68, 0x60, 0xa9, 0x22, 0xce, 0x0c, 0xb9, 0x75, 0x5c, 0xaa, 0xd2, 0xb7, 0x71, 0x1b, 0x58, 0x6e,
	0xd7, 0x33, 0x7a, 0x3e, 0xa5, 0x3e, 0xfb, 0xe0, 0x6c, 0x13, 0xea, 0x37, 0x59, 0x4e, 0xae, 0x00,
	0xf6, 0x2f, 0xe4, 0xb3, 0xfe, 0x35, 0xb6, 0x95, 0x2c, 0x5a, 0xd2, 0x9c, 0x60, 0x73, 0xa2, 0x54,
	0x2b, 0xa5, 0x16, 0x7a, 0xe3, 0x12, 0xb3, 0xea, 0x0f, 0xe2, 0xd5, 0xc0, 0x5e, 0xd9, 0xf5, 0x15,
	0x89, 0x47, 0x9a, 0xbf, 0xf4, 0x10, 0x7b, 0x8a, 0x0b, 0x46, 0xe6, 0xa9, 0x01, 0x7e, 0x28, 0x93,
	0xe4, 0xcf, 0xcd, 0x61, 0x69, 0x1f, 0x5b, 0x7b, 0xab, 0xac, 0xfa, 0x0b, 0x07, 0xc5, 0x9f, 0x64,
	0xb0, 0x93, 0xc1, 0xf5, 0x9d, 0xf8, 0xd4, 0x41, 0xf3, 0x5f, 0x8f, 0x3c, 0xb2, 0x14, 0x3d, 0xe9,
	0x77, 0x58, 0x01, 0x7f, 0xa9, 0x56, 0x62, 0x08, 0xe2, 0x45, 0x80, 0xba, 0x42, 0x99, 0x64, 0x57,
	0xee, 0x7b, 0x6c, 0x63, 0xe0, 0x4f, 0x26, 0xfd, 0x29, 0x9e, 0xed, 0xb7, 0x97, 0x64, 0x78, 0x31,
	0xbe, 0x4b, 0x84, 0x96, 0xe0, 0xd0, 0xef, 0xb1, 0xcd, 0xd1, 0x70, 0xec, 0xb9, 0xd1, 0x68, 0xe2,
	0xf9, 0xc7, 0x11, 0xf5, 0x3f, 0x0a, 0x00, 0x73, 0x10, 0x04, 0x24, 0x47, 0xfd, 0x60, 0x28, 0x49,
	0xb0, 0xc9, 0x56, 0x00, 0x98, 0x20, 0xb9, 0xc9, 0x72, 0xb3, 0x60, 0xe4, 0x07, 0xa3, 0xe8, 0x2d,
	0x75, 0xda, 0xe4, 0xb3, 0xbe, 0xc3, 0xf2, 0xd8, 0xbe, 0x02, 0xd5, 0xb1, 0xcf, 0x96, 0x43, 0x40,
	0x93, 0x37, 0x1b, 0xfd, 0xe3, 0x08, 0x4f, 0xdd, 0xd8, 0x6a, 0xdb, 0xf0, 0x8f, 0x23, 0x7e, 0xdc,
	0xde, 0x61, 0x79, 0x40, 0xe1, 0x76, 0x89, 0xcd, 0x36, 0xa0, 0xdd, 0xe5, 0x19, 0x55, 0xf6, 0x3b,
	0x0b, 0x6a, 0xbf, 0xf3, 0x2f, 0xb1, 0x35, 0xde, 0x81, 0xe1, 0xe7, 0xd9, 0xc2, 0xc3, 0x6b, 0xcb,
	0xfb, 0x33, 0x16, 0x12, 0xe9, 0x4f, 0xd8, 0xa6, 0xb2, 0xe0, 0x61, 0x71, 0x8b, 0x3b, 0xd8, 0xad,
	0xb3, 0x62, 0xcd, 0x4a, 0x70, 0x94, 0x7e, 0x92, 0xc2, 0xd2, 0xe7, 0xe0, 0x78, 0xf0, 0xda, 0x8b,
	0x60, 0x71, 0xdf, 0x78, 0xa3, 0xc3, 0x23, 0xb1, 0x83, 0xd1, 0x13, 0x14, 0x59, 0x6f, 0x78, 0x63,
	0x88, 0x4f, 0x13, 0xb7, 0xb1, 0x3c, 0x87, 0xf0, 0x89, 0xde, 0x61, 0x05, 0x44, 0xe3, 0x54, 0x71,
	0x75, 0x91, 0x03, 0x27, 0xfb, 0x40, 0x4d, 0x49, 0xe7, 0x0b, 0x82, 0xff, 0x44, 0xcd, 0x23, 0xdc,
	0x76, 0xc0, 0xf3, 0xbe, 0x1f, 0x7b, 0x09, 0x96, 0x66, 0x8b, 0x79, 0x49, 0x12, 0x2f, 0xba, 0xc9,
	0xfd, 0x44, 0x9b, 0x7f, 0x67, 0x05, 0xab, 0x52, 0xd4, 0xa9, 0x5b, 0x5e, 0x26, 0xb1, 0xe5, 0xc1,
	0x74, 0xd0, 0x60, 0xab, 0xa7, 0x83, 0x78, 0x4b, 0xd0, 0x95, 0x7e, 0x3b, 0xc5, 0xb6, 0x79, 0x47,
	0xb0, 0x0f, 0xcf, 0x50, 0x2f, 0x24, 0xdd, 0x2a, 0x35, 0xe7, 0x56, 0xd7, 0xd9, 0xc6, 0x68, 0xaa,
	0x9a, 0x7b, 0x7d, 0x34, 0xe5, 0xb6, 0x56, 0x4c, 0x99, 0x39, 0x9f, 0x29, 0x65, 0x5c, 0x67, 0xd5,
	0xb8, 0x26, 0xf3, 0x92, 0x3e, 0xa3, 0xe9, 0xd9, 0xea, 0xfc, 0xaa, 0xec, 0x98, 0xa6, 0x57, 0x04,
	0xa8, 0x14, 0x34, 0xdf, 0x36, 0x3d, 0x23, 0xee, 0xe3, 0x5c, 0x92, 0x4d, 0xe4, 0x12, 0x19, 0x05,
	0x6b, 0xe7, 0x89, 0x02, 0x31, 0xbd, 0x75, 0x65, 0x7a, 0xff, 0x24, 0x83, 0x45, 0x0c, 0x67, 0x0a,
	0xbc, 0x89, 0x7f, 0xe2, 0xad, 0x4e, 0x5d, 0x6a, 0xec, 0xa7, 0xe7, 0x62, 0xff, 0xfb, 0x72, 0xe2,
	0x19, 0x3e, 0xf1, 0x0f, 0x97, 0x67, 0x26, 0x1a, 0xe2, 0xac, 0xb9, 0x67, 0x93, 0x73, 0xbf, 0xc7,
	0x36, 0x87, 0xc7, 0x41, 0x9f, 0x0a, 0xa1, 0x81, 0x48, 0x5b, 0x02, 0x66, 0x7b, 0x03, 0xd8, 0x7a,
	0x24, 0xc9, 0x14, 0x68, 0x30, 0x6f, 0x49, 0xbe, 0x4e, 0xe8, 0x0d, 0x16, 0xd2, 0xdf, 0xc6, 0x97,
	0xa7, 0xbf, 0xdc, 0x62, 0xfa, 0xbb, 0xc7, 0x36, 0x69, 0x01, 0x07, 0xfe, 0xf1, 0x14, 0x33, 0x59,
	0xd6, 0x2a, 0x20, 0xac, 0x0a, 0x20, 0xc8, 0x01, 0x07, 0x6f, 0x23, 0x8f, 0x08, 0x18, 0x27, 0xc8,
	0x03, 0x04, 0xd1, 0x72, 0xcd, 0xde, 0x9e, 0x63, 0xcd, 0x4a, 0x7f, 0x92, 0xc6, 0x3d, 0x0e, 0xb7,
	0xb3, 0x83, 0xfe, 0x74, 0x78, 0xde, 0xf7, 0x66, 0x0a, 0x87, 0x12, 0xac, 0x3a, 0xcb, 0x06, 0xfd,
	0xc8, 0xa3, 0xe5, 0xe3, 0xbf, 0xb9, 0xc2, 0xc7, 0x41, 0x18, 0xb9, 0xe1, 0xe8, 0x37, 0x3c, 0x72,
	0xbd, 0x3c, 0x87, 0xd8, 0xa3, 0xdf, 0xf0, 0xf4, 0xc7, 0x2c, 0x3b, 0x0c, 0xfc, 0x19, 0xd5, 0x48,
	0x67, 0x0e, 0x04, 0x74, 0x70, 0x7e, 0x82, 0x7f, 0xf5, 0x2f, 0x58, 0x61, 0x18, 0x0e, 0x66, 0xb0,
	0xe4, 0xfd, 0xe0, 0xf5, 0xca, 0x26, 0xb2, 0xca, 0x1e, 0x93, 0x37, 0x2e, 0x58, 0x0c, 0x1e, 0x2d,
	0xfe, 0xa4, 0x77, 0x96, 0x16, 0x4b, 0x1f, 0x9f, 0x25, 0xec, 0x5c, 0xb5, 0xd2, 0x55, 0xac, 0xfb,
	0xe7, 0xa6, 0x50, 0xfa, 0x1e, 0x96, 0x50, 0xcb, 0x55, 0x03, 0x7b, 0xcd, 0x02, 0x6f, 0xe0, 0x8e,
	0xbd, 0x13, 0x4f, 0xd4, 0xed, 0x79, 0x80, 0xb4, 0x00, 0x50, 0x32, 0xd8, 0xce, 0x19, 0xaa, 0x9c,
	0xa7, 0xc0, 0x28, 0xfd, 0x3b, 0x4a, 0x3a, 0x28, 0xe3, 0x9c, 0x39, 0x5d, 0x12, 0x2f, 0xe6, 0x74,
	0xb9, 0x87, 0xa6, 0xd5, 0x3d, 0x54, 0xad, 0x92, 0x32, 0x89, 0x2a, 0x49, 0xff, 0x0e, 0x5b, 0x03,
	0xcd, 0x45, 0xda, 0x2e, 0x9d, 0x65, 0x68, 0x7a, 0x6d, 0x89, 0x0c, 0xa5, 0x1f, 0xa3, 0xe6, 0x5e,
	0x10, 0xf8, 0x81, 0x3b, 0x09, 0x0f, 0xf5, 0xfb, 0x6c, 0x5d, 0xe9, 0x39, 0x2c, 0x4b, 0xc3, 0x24,
	0x80, 0xc8, 0xe4, 0x51, 0x22, 0xad, 0x1c, 0x25, 0x74, 0x96, 0xe5, 0x7d, 0xc5, 0x0c, 0xbd, 0xf5,
	0xf3, 0x87, 0xde, 0xd2, 0x6c, 0xfd, 0x5b, 0x29, 0x5c, 0x39, 0x1c, 0x3e, 0xd1, 0x05, 0x01, 0x5d,
	0x96, 0x9d, 0x52, 0x6e, 0xb0, 0x9c, 0x77, 0x8a, 0x1b, 0x1a, 0x0d, 0xb9, 0xe1, 0x9d, 0xce, 0x78,
	0x53, 0x73, 0x7e, 0xa9, 0x32, 0x67, 0xd4, 0x82, 0xaa, 0x16, 0x27, 0x14, 0xb3, 0xc7, 0xe3, 0x68,
	0x34, 0xeb, 0xf3, 0x17, 0x64, 0x3f, 0x3a, 0xf6, 0xc2, 0x48, 0xff, 0x2c, 0x11, 0xb3, 0x77, 0x16,
	0xad, 0x2a, 0x39, 0x94, 0x90, 0x5d, 0xbe, 0x78, 0x3a, 0xcb, 0x1e, 0xf8, 0xc3, 0xb7, 0x5c, 0xa7,
	0x4d, 0x8b, 0xff, 0x2e, 0x45, 0xe4, 0xcd, 0xca, 0xb8, 0xb3, 0xf1, 0xdb, 0x5f, 0xf6, 0xa8, 0xbf,
	0x9b, 0xc2, 0x57, 0xc2, 0x43, 0x2f, 0x1c, 0x70, 0x9f, 0x7a, 0x15, 0xf0, 0xdf, 0x7c, 0xbc, 0xbc,
	0xb5, 0x31, 0x79, 0x15, 0xd4, 0x00, 0x85, 0x6f, 0xf0, 0xe4, 0x9b, 0xc1, 0xbc, 0xb5, 0x7e, 0xf4,
	0x46, 0x20, 0x42, 0x42, 0xe0, 0x7b, 0xe1, 0xf5, 0x10, 0x11, 0xb7, 0x19, 0x0b, 0xbd, 0x60, 0xd4,
	0x1f, 0xbb, 0xd3, 0xe3, 0x09, 0xb7, 0x70, 0xde, 0xca, 0x23, 0xa4, 0x73, 0x3c, 0x01, 0xbe, 0x21,
	0x0e, 0xcb, 0x93, 0x4b, 0xde, 0x5a, 0x1f, 0xce, 0x80, 0xaf, 0xf4, 0x47, 0x29, 0x76, 0x4d, 0xee,
	0x38, 0x61, 0xd4, 0x8f, 0x42, 0xb9, 0x02, 0x67, 0xbc, 0xf2, 0x56, 0x0b, 0xd4, 0xf4, 0x19, 0x05,
	0x6a, 0x66, 0xae, 0x40, 0x5d, 0xb5, 0x39, 0xcf, 0x15, 0xfa, 0x6b, 0x0b, 0x85, 0xbe, 0xdc, 0x09,
	0xd6, 0xcf, 0xb3, 0x13, 0xfc, 0x61, 0x06, 0x0b, 0xa3, 0x78, 0x52, 0xfa, 0x36, 0x4b, 0x8f, 0x86,
	0xfc, 0xcd, 0x4c, 0xd6, 0x4a, 0x8f, 0xce, 0x7c, 0x9f, 0x3f, 0xbf, 0x8b, 0xa6, 0xcf, 0xb1, 0x8b,
	0x66, 0x96, 0xec, 0xa2, 0x6a, 0x09, 0x90, 0x9d, 0x2b, 0x01, 0xbe, 0x9a, 0x03, 0x86, 0x74, 0xbc,
	0x0d, 0xd5, 0xf1, 0x62, 0x23, 0xe7, 0x12, 0x46, 0xfe, 0x0a, 0xf7, 0xe3, 0xff, 0x47, 0x27, 0x89,
	0x3f, 0x4e, 0xe1, 0xfe, 0xd0, 0x3f, 0x3c, 0x0c, 0xbc, 0xc3, 0x7e, 0xe4, 0xfd, 0x7f, 0xe3, 0xa1,
	0x3f, 0x66, 0x37, 0x96, 0x4f, 0x0c, 0x92, 0xd0, 0xfc, 0x42, 0xa5, 0xbe, 0x6c, 0xa1, 0xd2, 0xf3,
	0x0b, 0x75, 0x9b, 0x31, 0x3e, 0x34, 0xa2, 0xa9, 0x4c, 0x01, 0x08, 0x47, 0x97, 0xfe, 0x3c, 0x83,
	0xa9, 0x1f, 0x8d, 0x47, 0xb7, 0x2e, 0xdc, 0x59, 0xe0, 0xcf, 0xbc, 0x80, 0xd7, 0xa7, 0x6a, 0x12,
	0x5c, 0xac, 0x1c, 0x16, 0xd9, 0xd4, 0x6c, 0xb8, 0x3f, 0xb7, 0xec, 0xd8, 0xcc, 0xfa, 0xf4, 0x3c,
	0x52, 0x54, 0x3e, 0xfe, 0xae, 0x4b, 0x79, 0xd6, 0x2d, 0x56, 0x98, 0x7a, 0xa7, 0x91, 0x7a, 0xb1,
	0xa3, 0xf0, 0xf0, 0xfe, 0x79, 0xc4, 0x2a, 0x6c, 0x50, 0x2b, 0xc1, 0x23, 0x5d, 0x07, 0xd9, 0x9d,
	0x6f, 0x6b, 0x7d, 0xeb, 0x3c, 0xf2, 0x96, 0x74, 0xb7, 0xbe, 0xc7, 0x32, 0xfe, 0xe9, 0x64, 0x65,
	0xe1, 0xb6, 0x44, 0x88, 0x7f, 0x3a, 0x69, 0x5c, 0xb0, 0x80, 0x0b, 0x2c, 0xb6, 0xa4, 0x62, 0x3b,
	0x97, 0xc5, 0xce, 0xac, 0xdc, 0xc4, 0x5b, 0x8f, 0xd2, 0x21, 0xfb, 0xda, 0x39, 0x2c, 0xbe, 0x10,
	0xb0, 0xa9, 0x9f, 0x3b, 0x60, 0xbf, 0x60, 0xa5, 0x2f, 0x5f, 0x03, 0xfd, 0x43, 0xb6, 0x1d, 0x3f,
	0xba, 0xa3, 0x21, 0x8e, 0xb4, 0x65, 0x6d, 0xca, 0x95, 0x69, 0x0e, 0xc3, 0x92, 0x8d, 0x2d, 0xb6,
	0xd5, 0xf6, 0xff, 0x45, 0xda, 0x60, 0x9f, 0xaf, 0x72, 0x7c, 0x58, 0x0f, 0xd8, 0x25, 0xfd, 0xd3,
	0x09, 0xd7, 0x28, 0x83, 0x17, 0x67, 0xfc, 0xd3, 0x09, 0xe8, 0xf2, 0x0f, 0x53, 0x2b, 0x2d, 0x78,
	0x66, 0xc1, 0xba, 0xe4, 0xcd, 0x50, 0xa2, 0x88, 0xca, 0x24, 0x8b, 0xa8, 0x6f, 0xb1, 0xc4, 0x6d,
	0x10, 0x97, 0xaa, 0x25, 0xd0, 0x44, 0x53, 0x11, 0x35, 0xa8, 0x9c, 0x7e, 0x2f, 0xcd, 0xf4, 0x05,
	0x9d, 0xc2, 0xb3, 0x72, 0xa2, 0xb8, 0x51, 0x96, 0x56, 0x6e, 0x94, 0x7d, 0xc4, 0xb6, 0x95, 0x56,
	0x24, 0xe4, 0xaf, 0x0c, 0x4f, 0x26, 0x5b, 0x71, 0x2f, 0x12, 0x72, 0xb9, 0x4a, 0xc6, 0x1b, 0x9d,
	0x94, 0x1e, 0x25, 0xd9, 0x73, 0x00, 0x2a, 0x17, 0x8c, 0xd6, 0x12, 0x17, 0x8c, 0xee, 0xb0, 0xc2,
	0xa4, 0x7f, 0xea, 0x7a, 0xd3, 0x28, 0x18, 0x79, 0x21, 0x6d, 0x65, 0x6c, 0xd2, 0x3f, 0x35, 0x11,
	0xa2, 0xef, 0xc2, 0x39, 0x81, 0xa7, 0x1f, 0xc0, 0x6f, 0xf0, 0xd5, 0x3c, 0x4f, 0x18, 0x41, 0xbe,
	0xb2, 0x14, 0xd6, 0xd2, 0x4f, 0x52, 0xd8, 0x70, 0x47, 0x52, 0xdc, 0xfb, 0xcf, 0xde, 0xeb, 0xc1,
	0x35, 0x4e, 0xd4, 0x4c, 0xba, 0x65, 0x15, 0x10, 0x86, 0xb9, 0xf4, 0x1e, 0xdb, 0x1c, 0xfb, 0xfe,
	0xeb, 0xe3, 0x99, 0x92, 0x4d, 0xb3, 0x56, 0x01, 0x61, 0x48, 0xf2, 0x35, 0xb6, 0xc5, 0x6d, 0xe7,
	0x0d, 0x89, 0x26, 0x4b, 0xfd, 0x5c, 0x04, 0x62, 0xd2, 0x7d, 0x80, 0x85, 0x96, 0xbc, 0x33, 0x16,
	0x6f, 0x63, 0xab, 0x2e, 0x72, 0x95, 0xfe, 0x94, 0xea, 0x98, 0x98, 0x67, 0xf5, 0xa5, 0xaf, 0xdb,
	0x8c, 0x05, 0xa7, 0xd4, 0x31, 0x09, 0xc5, 0x8e, 0x10, 0x9c, 0xf6, 0x10, 0x00, 0xe8, 0x28, 0x46,
	0xe3, 0x1c, 0xf2, 0x91, 0x44, 0xdf, 0x60, 0xb9, 0xe0, 0xd4, 0x85, 0x0d, 0x24, 0x24, 0xe5, 0x37,
	0x82, 0xd3, 0x0a, 0x3c, 0x72, 0xeb, 0x09, 0x14, 0x6e, 0x7b, 0x1b, 0x11, 0xa1, 0x70, 0x4c, 0x38,
	0x06, 0xce, 0xbc, 0x21, 0x5f, 0x55, 0x3e, 0x66, 0x0d, 0x01, 0x34, 0xa6, 0x40, 0x6f, 0x88, 0x31,
	0x05, 0x7a, 0x87, 0xe5, 0x83, 0x53, 0x3c, 0x7e, 0x84, 0x54, 0xaa, 0xe4, 0x82, 0x53, 0x93, 0x3f,
	0x03, 0x32, 0x92, 0x48, 0xac, 0x54, 0x72, 0x91, 0x40, 0xde, 0x65, 0x9b, 0xc1, 0xa9, 0xfb, 0x2a,
	0xe8, 0x4f, 0x3c, 0x20, 0xa1, 0x42, 0x85, 0x05, 0xa7, 0x75, 0x00, 0x99, 0xfc, 0x9a, 0x63, 0x21,
	0x38, 0x75, 0xfd, 0x13, 0x2f, 0xe0, 0x04, 0x05, 0xa1, 0x5a, 0xf7, 0xc4, 0x0b, 0x00, 0x7f, 0x8b,
	0x6b, 0x3e, 0x08, 0x06, 0x1c, 0xbd, 0x29, 0x06, 0xaf, 0x06, 0x03, 0xe4, 0x66, 0x03, 0x7f, 0x3c,
	0x1e, 0x85, 0x54, 0xb7, 0xd0, 0x5e, 0x2f, 0x20, 0x0b, 0x15, 0xe2, 0xf6, 0x39, 0x2a, 0xc4, 0x8b,
	0x8b, 0x15, 0x62, 0xe9, 0x11, 0xb6, 0xf8, 0xb1, 0x25, 0xb8, 0x50, 0xda, 0xac, 0x7a, 0x39, 0xb6,
	0x8f, 0x71, 0x8f, 0x5d, 0x40, 0x74, 0x38, 0x2f, 0xf8, 0xbf, 0x2f, 0x1a, 0x4a, 0x3f, 0x49, 0x63,
	0xe8, 0x28, 0xea, 0x9c, 0xa1, 0x06, 0x5f, 0x3e, 0xef, 0x55, 0x22, 0x6e, 0x72, 0x81, 0xf7, 0x4a,
	0x06, 0x4d, 0x42, 0x9b, 0xcc, 0x97, 0x69, 0x93, 0x9d, 0x2f, 0x61, 0xbe, 0xaa, 0x5e, 0x56, 0x85,
	0x6d, 0x92, 0xa5, 0xf8, 0x8c, 0x28, 0xb7, 0xdc, 0x59, 0xd1, 0x5c, 0x15, 0xe6, 0xb4, 0x0a, 0xf8,
	0x6c, 0x03, 0x0f, 0x1c, 0xdb, 0xb6, 0x63, 0xcb, 0xf0, 0xc3, 0xdb, 0x97, 0xdd, 0x79, 0x3c, 0xb3,
	0xf5, 0x9b, 0x5e, 0xd9, 0xfa, 0xcd, 0x9c, 0xb3, 0xf5, 0x7b, 0xa2, 0x2e, 0x15, 0xa4, 0xd5, 0xb7,
	0xa0, 0x91, 0x3c, 0x4a, 0x16, 0x56, 0x6a, 0x04, 0x24, 0x78, 0xa1, 0x54, 0x7f, 0x88, 0x97, 0x86,
	0x45, 0x85, 0x76, 0x6b, 0x05, 0x07, 0xa7, 0xc1, 0x2b, 0xc5, 0x61, 0xe9, 0xef, 0xa4, 0xd0, 0xf9,
	0x10, 0x25, 0x37, 0x9d, 0x2b, 0x6c, 0x8d, 0xdf, 0x35, 0x14, 0x6f, 0x66, 0xf9, 0xc3, 0xc2, 0x4d,
	0xda, 0xf4, 0xe2, 0x4d, 0x5a, 0xf0, 0x02, 0xd8, 0x19, 0xb8, 0x3c, 0xb1, 0xeb, 0xe6, 0x27, 0xfd,
	0x53, 0x5e, 0x8d, 0x87, 0x7a, 0x31, 0xd9, 0xe4, 0xdf, 0x8a, 0x77, 0xf2, 0xef, 0xa8, 0xad, 0xa3,
	0xc5, 0xf6, 0xc1, 0x19, 0xaf, 0xb5, 0x7e, 0x1d, 0x5f, 0x18, 0x2b, 0x6d, 0x19, 0xf4, 0xf5, 0x32,
	0xbb, 0x44, 0x3e, 0xcb, 0x81, 0x6a, 0x18, 0x5d, 0x44, 0x44, 0xa5, 0x3f, 0xc5, 0x64, 0xae, 0x7f,
	0x9d, 0x5d, 0xe4, 0xce, 0xab, 0x50, 0x62, 0x3c, 0x6d, 0x01, 0x58, 0xd2, 0x95, 0xfe, 0x80, 0x62,
	0x0a, 0x07, 0x93, 0x31, 0xb5, 0x42, 0xb5, 0xb9, 0xba, 0x3d, 0x3d, 0x57, 0xb7, 0xc3, 0xa8, 0x71,
	0x4b, 0x5c, 0x0d, 0xac, 0x2d, 0x04, 0x37, 0xa7, 0x48, 0x57, 0x62, 0x5c, 0x8d, 0x98, 0x0a, 0xa3,
	0xab, 0x00, 0x40, 0x41, 0xf3, 0x55, 0xc5, 0xd7, 0x13, 0xc6, 0x62, 0x1b, 0x52, 0x74, 0xdd, 0x3b,
	0xab, 0x07, 0x86, 0xfe, 0x94, 0x87, 0xdf, 0x18, 0x5d, 0xbf, 0x89, 0x6d, 0x75, 0x24, 0x39, 0xf3,
	0xe6, 0xbe, 0x6a, 0xb9, 0xf4, 0x8a, 0x2e, 0x5c, 0xe6, 0xe7, 0xed, 0xc2, 0xfd, 0x6b, 0x72, 0x69,
	0x24, 0x90, 0x2e, 0x4d, 0xf7, 0xd6, 0xf1, 0x9d, 0x75, 0x4a, 0xde, 0x5b, 0x6f, 0xf3, 0x97, 0xa6,
	0xb7, 0x69, 0xd2, 0xe8, 0xf4, 0xb4, 0x4e, 0x00, 0x71, 0x96, 0x3a, 0x7e, 0x66, 0x89, 0xe3, 0x93,
	0x7c, 0xd1, 0x3a, 0x14, 0xf2, 0xc1, 0x75, 0x24, 0x72, 0xe0, 0x8f, 0xfd, 0x80, 0x56, 0x06, 0x90,
	0x55, 0x78, 0x2e, 0xfd, 0x58, 0x75, 0x29, 0x8c, 0xfd, 0xcf, 0x65, 0xdd, 0x95, 0x5a, 0x71, 0x83,
	0x46, 0xb5, 0xae, 0x2c, 0xcb, 0xbe, 0x34, 0x03, 0x28, 0x6e, 0x2b, 0x32, 0xc0, 0x09, 0xbb, 0xc7,
	0xbb, 0x86, 0x89, 0x7e, 0xa1, 0x0c, 0xbf, 0xa3, 0xe5, 0x37, 0xa4, 0x52, 0x5f, 0x52, 0x07, 0xcf,
	0x35, 0x13, 0x45, 0xa3, 0x30, 0xa3, 0x34, 0x0a, 0xc7, 0xb8, 0x57, 0x26, 0xc6, 0xfd, 0xe5, 0x8d,
	0x66, 0x62, 0x5b, 0xf2, 0x47, 0xc7, 0xde, 0x31, 0xd5, 0xf9, 0x34, 0x16, 0x6f, 0xea, 0x60, 0xdd,
	0x29, 0xbc, 0x42, 0x9e, 0x9b, 0x35, 0x96, 0x89, 0x6f, 0xe4, 0xc0, 0xcf, 0x52, 0x80, 0x4a, 0x2b,
	0x62, 0x26, 0xa3, 0xa9, 0xcb, 0xdf, 0x24, 0x54, 0x59, 0x41, 0x91, 0x4b, 0xeb, 0xb6, 0xe8, 0xb6,
	0x0b, 0x1a, 0x60, 0xb5, 0xdb, 0x90, 0xfd, 0xdf, 0xf9, 0x57, 0x14, 0xcb, 0xc6, 0xec, 0x9f, 0xfe,
	0x92, 0xc7, 0xfc, 0x47, 0xd4, 0xa8, 0x51, 0x38, 0x13, 0xd6, 0xff, 0x4a, 0x06, 0x3e, 0xcf, 0xe1,
	0x6a, 0xd9, 0x5a, 0xfe, 0xed, 0x14, 0x26, 0x18, 0x4a, 0x9d, 0x7c, 0x10, 0xf0, 0x07, 0x1c, 0x2d,
	0x4e, 0xc2, 0xfc, 0x19, 0x8f, 0x49, 0x4a, 0xdb, 0x08, 0x2f, 0x5c, 0x55, 0x12, 0xe7, 0x93, 0x55,
	0x9d, 0xfe, 0x15, 0xfa, 0xd3, 0xd1, 0xe4, 0x21, 0x5e, 0xa7, 0x40, 0xa2, 0x43, 0x5e, 0x6b, 0x40,
	0x14, 0xca, 0x2d, 0x6b, 0xc9, 0x45, 0xaf, 0xd2, 0x21, 0x9e, 0x57, 0x97, 0xf0, 0xcc, 0xc6, 0x6f,
	0x97, 0x5e, 0x0d, 0xfb, 0x9c, 0xad, 0x73, 0x6a, 0xf1, 0x5d, 0xc5, 0xed, 0x55, 0x6f, 0x55, 0x39,
	0x95, 0x45, 0xc4, 0x25, 0x73, 0xe1, 0x16, 0x15, 0xda, 0x69, 0xc5, 0x6b, 0x00, 0x69, 0xbb, 0x4c,
	0xc2, 0x76, 0xa5, 0xb6, 0xea, 0x7c, 0xe7, 0x3b, 0xe5, 0x24, 0xc4, 0xa5, 0x93, 0xe2, 0xfe, 0x8c,
	0x4e, 0x73, 0x8a, 0xbc, 0x5f, 0x44, 0x4e, 0xe2, 0x0c, 0x93, 0x59, 0x38, 0xc3, 0x28, 0x07, 0xa3,
	0xec, 0xfc, 0xc1, 0x28, 0x71, 0x0e, 0x59, 0x9b, 0x3b, 0x87, 0xcc, 0xef, 0xa1, 0xeb, 0xe7, 0xd8,
	0x43, 0x37, 0x96, 0x9c, 0x03, 0x26, 0xe8, 0xa0, 0x81, 0x3f, 0xf6, 0xa4, 0xb9, 0x1e, 0xb1, 0x2c,
	0x3c, 0xaf, 0x7c, 0x67, 0x39, 0xf0, 0xa7, 0x51, 0xe0, 0x8f, 0xc7, 0x5e, 0xc0, 0xf9, 0x2c, 0x4e,
	0x0d, 0xc3, 0x1d, 0x7a, 0x53, 0x8f, 0x06, 0x24, 0x43, 0x64, 0xad, 0xcd, 0x18, 0xd8, 0x1c, 0x96,
	0x7e, 0x87, 0x02, 0xa2, 0x1f, 0xbe, 0x9d, 0x0e, 0xc4, 0x8e, 0xfb, 0x21, 0xdb, 0x8e, 0x6b, 0x0b,
	0xde, 0xe3, 0xa4, 0xa6, 0x8c, 0x28, 0x2d, 0x78, 0x97, 0xf3, 0x63, 0xa6, 0x29, 0x1f, 0x3d, 0x89,
	0x6b, 0x39, 0x40, 0xb7, 0x0d, 0x70, 0x9b, 0x83, 0x39, 0x65, 0x99, 0x5d, 0x4a, 0xbc, 0xc5, 0xe6,
	0xa4, 0x58, 0xdf, 0x5d, 0x04, 0x84, 0x85, 0x70, 0x7e, 0xd5, 0xe9, 0x35, 0xdb, 0xe6, 0xfb, 0x6a,
	0xdb, 0x1f, 0xee, 0xcd, 0x86, 0x90, 0xa9, 0xb0, 0x5d, 0x8f, 0x6f, 0x45, 0xd2, 0x23, 0xfe, 0x91,
	0x8f, 0x7c, 0x67, 0x47, 0xbb, 0xd5, 0xcd, 0xd5, 0x6f, 0xf5, 0x2c, 0x2c, 0x13, 0xda, 0xfe, 0x70,
	0xc9, 0xe7, 0x95, 0x3d, 0x76, 0x91, 0x0f, 0xc6, 0x8b, 0x0f, 0x8b, 0xc7, 0xd1, 0x0f, 0x58, 0x41,
	0xd9, 0xe9, 0x56, 0xf6, 0xbd, 0xd4, 0xdd, 0x90, 0x4d, 0xa4, 0x8c, 0xd2, 0x88, 0x5d, 0xac, 0x8f,
	0xfd, 0x37, 0xbc, 0x73, 0xb5, 0x42, 0xff, 0x47, 0x2c, 0x27, 0x6e, 0x1b, 0x91, 0xfa, 0x37, 0x56,
	0x5e, 0x47, 0xb2, 0x36, 0xe0, 0xd7, 0x72, 0xe5, 0x7f, 0xc4, 0xae, 0xc0, 0x50, 0xbc, 0x3a, 0x3e,
	0x6b, 0xbc, 0x6f, 0xb3, 0xbc, 0xbc, 0xb7, 0xb2, 0xd2, 0x5e, 0x92, 0xc2, 0xc2, 0xa3, 0xc9, 0xf2,
	0x21, 0xbf, 0xcb, 0xd6, 0x60, 0xc8, 0x50, 0x7f, 0xc0, 0xd6, 0x46, 0x91, 0x37, 0x11, 0xf6, 0xd9,
	0x59, 0x3e, 0x01, 0x2a, 0x16, 0x38, 0x65, 0xe9, 0xfb, 0x6c, 0x9d, 0xdb, 0x3a, 0x84, 0x52, 0x43,
	0x65, 0x5e, 0x65, 0x5c, 0x5e, 0xce, 0x08, 0xee, 0x27, 0x8c, 0xc9, 0xc9, 0x9e, 0x43, 0x82, 0x72,
	0x18, 0x12, 0x12, 0x46, 0xac, 0x00, 0x12, 0xaa, 0x47, 0xfd, 0xe9, 0xa1, 0x17, 0xea, 0xdf, 0x64,
	0xeb, 0x91, 0xef, 0xf6, 0x87, 0xe2, 0x4e, 0xa8, 0x9e, 0x90, 0xc1, 0x67, 0x69, 0xad, 0x45, 0xbe,
	0x31, 0x1c, 0xea, 0xf7, 0x59, 0x3e, 0xf2, 0xc9, 0x79, 0xc9, 0x80, 0xcb, 0xa8, 0x73, 0x91, 0x8f,
	0x8e, 0x0c, 0x65, 0xa4, 0x26, 0xb5, 0x15, 0x03, 0x7e, 0x32, 0x37, 0xe0, 0xf5, 0x05, 0x11, 0x38,
	0x39, 0x31, 0xea, 0xa3, 0xc5, 0x51, 0x57, 0xb2, 0xc8, 0xa1, 0x89, 0xeb, 0x98, 0x7b, 0x02, 0xf5,
	0xc5, 0xcf, 0xe2, 0x42, 0x97, 0x29, 0xd9, 0x2c, 0xd7, 0xa3, 0xd0, 0x5e, 0xe6, 0x3e, 0x32, 0x19,
	0xac, 0x74, 0x1f, 0x49, 0x61, 0xe5, 0x44, 0x8e, 0x28, 0x3d, 0x67, 0x79, 0x14, 0xda, 0x3d, 0x8e,
	0x16, 0xa4, 0x7e, 0x97, 0xb1, 0xf8, 0xaa, 0x12, 0x89, 0xdd, 0x59, 0x25, 0xd6, 0x3f, 0x8e, 0x2c,
	0x52, 0xa2, 0x7b, 0x1c, 0x95, 0xfe, 0x71, 0x8a, 0x15, 0xd0, 0xaa, 0xe6, 0x89, 0x37, 0x5d, 0x94,
	0xfd, 0x97, 0x59, 0x41, 0x49, 0x4c, 0x2b, 0x0b, 0x5a, 0x85, 0xa6, 0x71, 0xc1, 0x62, 0x71, 0xce,
	0x02, 0xf7, 0xe2, 0x59, 0x9e, 0x0c, 0xb8, 0x38, 0x5d, 0xf9, 0x9a, 0xbe, 0x71, 0xc1, 0x42, 0xd2,
	0xca, 0x06, 0x5b, 0xf3, 0x40, 0x9b, 0xf2, 0x7f, 0x4d, 0xb1, 0x82, 0x14, 0x3f, 0xf5, 0x75, 0x8d,
	0x6d, 0x76, 0xeb, 0xbd, 0x9e, 0xdb, 0xec, 0xec, 0x1b, 0xad, 0x66, 0x4d, 0xbb, 0xa0, 0x6b, 0x2c,
	0xc7, 0x21, 0x6d, 0xe3, 0x85, 0xf6, 0xee, 0x67, 0xef, 0xdf, 0x6f, 0xe8, 0x57, 0x24, 0x8d, 0xdb,
	0xeb, 0x5a, 0x8e, 0xf6, 0x3f, 0xde, 0x03, 0x54, 0x67, 0x8c, 0x43, 0x1d, 0xa3, 0xd2, 0x32, 0xb5,
	0xff, 0xc9, 0x61, 0x97, 0x59, 0x81, 0xc3, 0x3a, 0x5d, 0xab, 0x6d, 0xb4, 0xb4, 0xbf, 0x48, 0x10,
	0xd6, 0x5b, 0xdd, 0x6e, 0x4d, 0xfb, 0x5f, 0x1c, 0x26, 0x06, 0x31, 0x5a, 0x2d, 0xed, 0xa7, 0x1c,
	0x72, 0x9d, 0x5d, 0xe4, 0x90, 0x6a, 0xb7, 0xe3, 0x58, 0xdd, 0x56, 0xcb, 0xb4, 0xb4, 0xff, 0x9d,
	0x60, 0x6f, 0x75, 0xab, 0x46, 0x4b, 0xfb, 0x59, 0x92, 0xbd, 0xf3, 0x52, 0x7b, 0x0f, 0x90, 0xf2,
	0x7f, 0x58, 0xc3, 0xf7, 0xd5, 0x7c, 0xdb, 0xdf, 0xe6, 0x2c, 0x8e, 0xdb, 0x30, 0x5b, 0xad, 0xae,
	0x76, 0x41, 0x3e, 0x9b, 0x96, 0xd5, 0xb5, 0xb4, 0x94, 0x7e, 0x95, 0x5d, 0xc2, 0xe7, 0x6a, 0xa3,
	0xeb, 0x5a, 0xe6, 0xb3, 0x3d, 0xd3, 0x76, 0xb4, 0xb4, 0x7e, 0x99, 0xab, 0x20, 0xc1, 0xbd, 0xd6,
	0x4b, 0x2d, 0x13, 0xd3, 0xbe, 0xe8, 0x99, 0x56, 0xb3, 0x6d, 0x76, 0x1c, 0xd3, 0xd2, 0xb2, 0xfa,
	0x0d, 0x76, 0x95, 0x83, 0xeb, 0xa6, 0xe1, 0xec, 0x59, 0xa6, 0x2d, 0xc5, 0xac, 0xe9, 0xd7, 0xd9,
	0xe5, 0x79, 0x14, 0x88, 0x5a, 0xd7, 0x77, 0xd8, 0x75, 0x8e, 0xd8, 0x35, 0x1d, 0x98, 0x66, 0xbd,
	0xb9, 0x2b, 0xb9, 0x36, 0xa4, 0xc0, 0x04, 0x12, 0xf8, 0x72, 0x52, 0x2f, 0x5b, 0xa2, 0xb4, 0xbc,
	0xae, 0xb3, 0x6d, 0x0e, 0xec, 0x19, 0xd5, 0xa7, 0xa6, 0xe3, 0x36, 0x3b, 0x1a, 0x93, 0xba, 0xd6,
	0x5b, 0xdd, 0xe7, 0xae, 0x65, 0xb6, 0xbb, 0xfb, 0x66, 0x4d, 0x2b, 0xe8, 0x57, 0x98, 0x86, 0xa4,
	0x5d, 0xcb, 0x71, 0x6d, 0xc7, 0x70, 0xf6, 0x6c, 0x6d, 0x53, 0x4a, 0x25, 0x01, 0xdd, 0x3d, 0x47,
	0xdb, 0xd2, 0x2f, 0xb1, 0xad, 0x58, 0x42, 0xbb, 0x5b, 0xd3, 0xb6, 0xe5, 0x40, 0xbb, 0x56, 0x77,
	0xaf, 0xc7, 0x61, 0x17, 0x25, 0x19, 0x97, 0x08, 0x20, 0x4d, 0x92, 0x71, 0x77, 0xe0, 0xb0, 0x4b,
	0xfa, 0x4d, 0x76, 0x8d, 0xc3, 0xda, 0x7b, 0x2d, 0xa7, 0xd9, 0x33, 0x2c, 0x47, 0xce, 0x57, 0xd7,
	0x8b, 0xec, 0xca, 0x02, 0x0e, 0xa6, 0x7b, 0x59, 0x62, 0x2a, 0x86, 0x65, 0x35, 0x4d, 0x4b, 0xf2,
	0x5c, 0xd1, 0xaf, 0x31, 0x7d, 0x0e, 0x03, 0x1c, 0x57, 0xf5, 0x7b, 0xec, 0x36, 0x87, 0x3f, 0xdb,
	0x33, 0xf7, 0xcc, 0x65, 0xe6, 0xbd, 0xa6, 0xdf, 0x61, 0x3b, 0xab, 0x48, 0x40, 0xc6, 0x75, 0x69,
	0x3b, 0xab, 0xdb, 0x32, 0x25, 0x5f, 0x51, 0x5a, 0x89, 0xc0, 0x40, 0x7b, 0x43, 0xce, 0x0b, 0xc4,
	0x18, 0xf6, 0xcb, 0x4e, 0x55, 0x32, 0xdc, 0x94, 0xda, 0xab, 0x38, 0xe0, 0xda, 0x91, 0x16, 0xb2,
	0x05, 0x46, 0xbb, 0x25, 0x61, 0x6d, 0xd3, 0x31, 0x2d, 0x6e, 0xb5, 0xdb, 0xe5, 0x2a, 0x5e, 0xf8,
	0x98, 0xfb, 0x13, 0x09, 0x44, 0xda, 0xe0, 0x6b, 0x2d, 0x62, 0x15, 0x07, 0x03, 0xd8, 0xbe, 0x69,
	0xd9, 0xcd, 0x6e, 0xa7, 0xd2, 0x74, 0xda, 0x46, 0x4f, 0x4b, 0x95, 0x3d, 0x2c, 0x9c, 0xa8, 0x08,
	0xc7, 0xa6, 0x04, 0xfa, 0x41, 0xd5, 0xad, 0x5b, 0xc6, 0xae, 0x08, 0xd1, 0x0b, 0x24, 0x97, 0xa0,
	0x35, 0xab, 0xdb, 0xd3, 0x52, 0x34, 0x6b, 0x82, 0x59, 0xa6, 0x61, 0xb7, 0xb5, 0x74, 0x92, 0xb0,
	0x6d, 0xd8, 0x4f, 0xb5, 0x4c, 0xf9, 0x09, 0x0e, 0x83, 0x2f, 0x2d, 0xa8, 0x3e, 0x23, 0xe7, 0xa8,
	0x2a, 0x7a, 0x92, 0x73, 0x57, 0xdd, 0x9a, 0xd9, 0xb3, 0xcc, 0xaa, 0xe1, 0x98, 0x35, 0x21, 0xe1,
	0xd7, 0xf0, 0xfb, 0x6c, 0xbc, 0xc7, 0x4e, 0xac, 0xea, 0x14, 0xb7, 0x59, 0x1e, 0x41, 0x90, 0x8f,
	0x7e, 0x96, 0x8a, 0x9f, 0x21, 0x75, 0xbc, 0x4f, 0x95, 0xff, 0x3d, 0x95, 0x88, 0x89, 0x96, 0x05,
	0x66, 0x35, 0x55, 0x03, 0x39, 0x23, 0x70, 0x6c, 0x88, 0x01, 0x5b, 0x4b, 0x49, 0x83, 0xa0, 0xcf,
	0x22, 0x34, 0x2d, 0x49, 0x65, 0xb8, 0xd8, 0x5a, 0x56, 0x92, 0x62, 0x14, 0x20, 0x34, 0x47, 0xfa,
	0x56, 0xdd, 0x66, 0x8f, 0xac, 0x74, 0x57, 0x12, 0xa2, 0xa3, 0x21, 0xe1, 0x13, 0xfd, 0x1a, 0xf7,
	0x2e, 0x92, 0x59, 0x69, 0x75, 0xab, 0x4f, 0xcd, 0x9a, 0xf6, 0x2e, 0x5d, 0x3e, 0x51, 0x3e, 0xcf,
	0x4f, 0x98, 0x6f, 0x89, 0xf2, 0x82, 0xbd, 0xd6, 0x7d, 0xde, 0xd1, 0x52, 0x31, 0x5d, 0x07, 0x92,
	0x55, 0x75, 0x5f, 0xcb, 0x8a, 0x64, 0xce, 0x41, 0xf5, 0xe7, 0x35, 0xed, 0x2e, 0x45, 0x0c, 0x42,
	0xe2, 0x4c, 0xf1, 0xa4, 0xfc, 0x57, 0xe6, 0x5e, 0xd7, 0x08, 0xd3, 0xf7, 0xec, 0xc5, 0x61, 0x6d,
	0xb7, 0xd5, 0xec, 0x3c, 0x9d, 0x1b, 0xd6, 0x96, 0xb3, 0x48, 0x53, 0x7a, 0xe5, 0x74, 0xfb, 0xa6,
	0x96, 0x2d, 0xff, 0x69, 0x1a, 0x3f, 0x8a, 0xe1, 0xd2, 0x65, 0x9b, 0x8a, 0x18, 0xeb, 0xca, 0x00,
	0x12, 0xf4, 0xe0, 0xd3, 0x76, 0xc5, 0x6d, 0xd4, 0x62, 0xf1, 0x04, 0xaa, 0xd7, 0xa4, 0xdf, 0x71,
	0x10, 0x91, 0x65, 0xe7, 0x61, 0xf5, 0x9a, 0x96, 0x13, 0xb3, 0xaf, 0xbb, 0x0f, 0x76, 0x39, 0x95,
	0x96, 0x84, 0xd4, 0xc1, 0x1e, 0x8a, 0x78, 0x04, 0x3d, 0xd1, 0x75, 0x01, 0x7a, 0x44, 0xa0, 0x77,
	0xe0, 0xff, 0xb1, 0x78, 0x02, 0xa6, 0xf5, 0x4b, 0x52, 0x9a, 0x83, 0x20, 0x30, 0x78, 0x01, 0x41,
	0x5d, 0xa7, 0x61, 0x5a, 0xda, 0xbb, 0x5c, 0x4c, 0x54, 0xed, 0xf6, 0x7a, 0x00, 0xd2, 0x62, 0xa2,
	0x7a, 0xb3, 0x02, 0x90, 0xbb, 0xf1, 0x90, 0xc6, 0x9e, 0xd3, 0xed, 0x98, 0xbb, 0xda, 0xbb, 0x27,
	0xfa, 0x25, 0x41, 0xd5, 0x33, 0xf6, 0x6c, 0x53, 0x7b, 0xf7, 0x2e, 0xa5, 0x5f, 0xe3, 0xae, 0x24,
	0x40, 0x90, 0x33, 0xda, 0xda, 0xbb, 0x77, 0xe9, 0x72, 0x4d, 0x71, 0x1a, 0xba, 0x6a, 0xbb, 0xc5,
	0xa3, 0xa2, 0x67, 0xb9, 0x46, 0x0d, 0xf7, 0xf0, 0x4d, 0x7c, 0xac, 0x99, 0x2d, 0xd3, 0x31, 0xb5,
	0x54, 0x0c, 0x69, 0x77, 0x6b, 0xcd, 0xfa, 0x4b, 0x2d, 0x5d, 0xfe, 0x0c, 0x5d, 0x20, 0xfe, 0x93,
	0x07, 0x64, 0xd4, 0x36, 0x77, 0xfa, 0x4e, 0xcd, 0xb0, 0x40, 0x12, 0x0a, 0x6e, 0x3b, 0x6e, 0xf7,
	0x45, 0x5b, 0x4b, 0x95, 0x5f, 0xc7, 0x7f, 0xd3, 0x80, 0xff, 0x91, 0x02, 0x92, 0xfb, 0xa2, 0x5d,
	0x75, 0x3b, 0x2f, 0xda, 0xee, 0xa7, 0x72, 0x6c, 0x01, 0x79, 0xa0, 0xa5, 0xf4, 0x1d, 0x1e, 0xfd,
	0x00, 0xe9, 0xf6, 0xcc, 0x0e, 0x8f, 0xc0, 0x8a, 0x61, 0x37, 0xab, 0x30, 0x19, 0xfd, 0x06, 0xdf,
	0x2d, 0x01, 0x99, 0xd8, 0x61, 0xdf, 0xbf, 0xcf, 0x94, 0xff, 0x41, 0x8e, 0x5d, 0x5e, 0xf2, 0x67,
	0x02, 0xc8, 0xa9, 0x5f, 0x80, 0x52, 0xf5, 0x8a, 0xac, 0x4a, 0x2e, 0x50, 0x5a, 0x56, 0xe1, 0x8d,
	0x97, 0x88, 0x4b, 0xd1, 0xa6, 0x2c, 0x70, 0x6d, 0xd3, 0x31, 0x6a, 0x86, 0x63, 0x68, 0xe9, 0x39,
	0x61, 0xa6, 0xd3, 0x70, 0x6b, 0xb6, 0xa3, 0x65, 0x96, 0xc0, 0x6d, 0xab, 0xaa, 0x65, 0xe7, 0x04,
	0x01, 0xdc, 0x79, 0xd9, 0x33, 0xe5, 0xb6, 0x2f, 0x10, 0xfb, 0x2d, 0xa3, 0xe3, 0xee, 0x37, 0x6b,
	0xda, 0xfa, 0x32, 0x44, 0xaf, 0xda, 0xd3, 0x36, 0xe6, 0xe7, 0xd1, 0x73, 0x6b, 0x76, 0xb5, 0xa7,
	0xe5, 0x68, 0x2b, 0x52, 0xe0, 0x66, 0xb5, 0xa3, 0xe5, 0xe7, 0xe4, 0x34, 0x7b, 0x6e, 0xcf, 0xea,
	0x3a, 0x5d, 0x8d, 0x2d, 0x20, 0xf6, 0x1f, 0x71, 0x5d, 0x0b, 0xcb, 0x10, 0x30, 0xb9, 0xcd, 0xb9,
	0x91, 0x9d, 0x6a, 0x8f, 0x33, 0x6c, 0x2d, 0x81, 0x03, 0xfd, 0xf6, 0x1c, 0x7c, 0xaf, 0x86, 0xf4,
	0x17, 0x97, 0xc0, 0x81, 0x5e, 0x9b, 0x1b, 0xd8, 0xae, 0x3a, 0xc8, 0x70, 0x69, 0x19, 0xa2, 0xc6,
	0xcb, 0x81, 0xb9, 0xb5, 0xab, 0xb6, 0x41, 0x59, 0x6e, 0xd9, 0xcb, 0xcb, 0x71, 0xd5, 0x6e, 0xcd,
	0xd4, 0xae, 0xcc, 0xd9, 0xca, 0xb0, 0x7a, 0x6e, 0xb7, 0xa7, 0x5d, 0x9d, 0x53, 0x0c, 0xc0, 0x76,
	0xcf, 0xd0, 0xae, 0x2d, 0x81, 0x3b, 0x3d, 0x43, 0xbb, 0xbe, 0x8c, 0xbe, 0x61, 0x68, 0xc5, 0x65,
	0xf4, 0x0d, 0x43, 0xbb, 0xb1, 0x68, 0xd9, 0xc7, 0x7c, 0x82, 0x37, 0x97, 0x21, 0x60, 0x82, 0x3b,
	0xf3, 0x93, 0x00, 0x44, 0xbd, 0x65, 0x54, 0xcc, 0x96, 0x76, 0x6b, 0xd9, 0x04, 0x1f, 0xe3, 0xe4,
	0x6f, 0x2f, 0xc7, 0xf1, 0xc9, 0x7f, 0xa0, 0xdf, 0x66, 0x37, 0xe6, 0x65, 0x76, 0x6a, 0xae, 0x63,
	0x58, 0xbb, 0xa6, 0xa3, 0xdd, 0x59, 0x36, 0x64, 0xa7, 0xe6, 0xda, 0xad, 0x96, 0x76, 0x77, 0x05,
	0xce, 0x69, 0xb5, 0xb4, 0x7b, 0xb4, 0x5b, 0xcb, 0x58, 0xe9, 0xb5, 0x6c, 0x17, 0x35, 0x2d, 0xcd,
	0xd9, 0x83, 0xa3, 0x9c, 0xaa, 0xf6, 0xb5, 0xf9, 0xf0, 0x02, 0x78, 0xa5, 0x6b, 0x6b, 0x1f, 0xce,
	0x21, 0x7a, 0x95, 0x8a, 0xdb, 0xb4, 0x9b, 0x35, 0xed, 0x23, 0x2a, 0x5d, 0xa4, 0xab, 0xed, 0x75,
	0x3a, 0x66, 0xcb, 0x6d, 0xd6, 0xb4, 0xaf, 0x2f, 0x53, 0xcd, 0x7c, 0xe1, 0x34, 0x6a, 0x96, 0xf6,
	0x8d, 0xf2, 0x67, 0x78, 0x7a, 0xe1, 0x1f, 0xb5, 0x8f, 0x86, 0xfa, 0x45, 0x9e, 0x34, 0xf7, 0x9b,
	0x35, 0xb7, 0xd3, 0xed, 0x98, 0x7c, 0xcb, 0xda, 0x26, 0x40, 0xcf, 0x32, 0x6d, 0xb3, 0xe3, 0x68,
	0xef, 0xee, 0x96, 0xff, 0x63, 0x0a, 0x5b, 0x86, 0xa3, 0xd9, 0xc9, 0x63, 0xfa, 0x08, 0x5b, 0x5c,
	0x7c, 0x05, 0xea, 0xa6, 0xd9, 0x58, 0xd8, 0x93, 0x00, 0x06, 0x22, 0x5f, 0x40, 0xee, 0xc0, 0xfd,
	0x0d, 0x40, 0xa6, 0xdd, 0xd3, 0xd2, 0x34, 0x2a, 0x3c, 0x1b, 0x7b, 0x4e, 0x43, 0xcb, 0x2a, 0x80,
	0x1a, 0x14, 0x81, 0x39, 0x05, 0x00, 0xc5, 0x92, 0xa6, 0x29, 0x52, 0xad, 0xee, 0x1e, 0xe4, 0xb7,
	0xbb, 0x8a, 0xd4, 0x46, 0xb7, 0xa7, 0x3d, 0xa1, 0x9d, 0x03, 0x9e, 0xf7, 0x3a, 0x96, 0xd9, 0x83,
	0x6d, 0x48, 0x05, 0xd9, 0xe6, 0x33, 0x28, 0x18, 0x7e, 0x9a, 0x4e, 0x7c, 0x05, 0x4b, 0x7f, 0x98,
	0x0b, 0xc8, 0x0c, 0x5e, 0xc3, 0xf7, 0xf6, 0x20, 0x13, 0xe2, 0x32, 0x19, 0x50, 0xe4, 0xf6, 0x5e,
	0xba, 0x8e, 0xd3, 0xe2, 0xe5, 0x7d, 0x81, 0xa2, 0x45, 0x85, 0x37, 0x3b, 0x32, 0x1d, 0x18, 0x58,
	0x9a, 0xe2, 0xa2, 0x3a, 0x2d, 0x19, 0xde, 0x86, 0xe3, 0xd6, 0xcc, 0x6a, 0x0c, 0xd7, 0xa8, 0x30,
	0x30, 0x1c, 0xb7, 0xb7, 0x67, 0x37, 0x78, 0x46, 0xd3, 0x2e, 0x91, 0x31, 0x01, 0xd8, 0xed, 0x21,
	0x4c, 0x9f, 0x23, 0x04, 0x09, 0xda, 0xe5, 0x24, 0x21, 0x87, 0x5d, 0x89, 0x09, 0x41, 0x03, 0x5e,
	0x3a, 0x69, 0x57, 0xc9, 0x8a, 0x06, 0x1d, 0x3d, 0xb4, 0x6b, 0x54, 0x5b, 0x11, 0x55, 0xe7, 0x39,
	0xd7, 0xe6, 0x7a, 0x0c, 0x05, 0x2d, 0x09, 0x5a, 0x4c, 0x4a, 0xac, 0x37, 0xcd, 0x56, 0x4d, 0xbb,
	0xa1, 0x0c, 0x0d, 0xfa, 0xf4, 0x2a, 0x15, 0xed, 0x26, 0x2d, 0x0d, 0xa9, 0x03, 0xa0, 0x1d, 0xbd,
	0x28, 0xe6, 0xbd, 0xb0, 0x25, 0xed, 0xe3, 0xd5, 0x18, 0xa5, 0xa5, 0x49, 0x5f, 0x37, 0x8b, 0xea,
	0xb8, 0xdd, 0x4a, 0x1c, 0xa5, 0x19, 0xc1, 0xa0, 0x78, 0xfd, 0x6f, 0xef, 0x33, 0xb4, 0xa5, 0x03,
	0xa4, 0xd3, 0x75, 0x2b, 0x7b, 0xf5, 0x3a, 0xc9, 0xfd, 0x2f, 0xc2, 0x45, 0x95, 0x2f, 0x18, 0xf9,
	0xda, 0x92, 0xe3, 0xa8, 0x15, 0x31, 0xce, 0xb7, 0xe9, 0xb8, 0xbb, 0x5d, 0xa7, 0x4b, 0xc7, 0xef,
	0x14, 0xc5, 0x53, 0xd3, 0x71, 0x9f, 0x5b, 0x4d, 0xc7, 0x54, 0x77, 0x38, 0x0c, 0x41, 0x89, 0x31,
	0xaa, 0x4e, 0xb3, 0xdb, 0xb1, 0xb5, 0x4c, 0x8c, 0x30, 0x7a, 0xbd, 0xd6, 0x4b, 0x89, 0xc8, 0xc6,
	0x88, 0x6a, 0xcb, 0x34, 0x2c, 0x89, 0x58, 0x13, 0x7e, 0x4d, 0xe7, 0x15, 0x6d, 0x9d, 0x2c, 0xd5,
	0x5c, 0x62, 0xa9, 0xbf, 0x8e, 0x13, 0x9a, 0xff, 0x72, 0x91, 0x0a, 0x8a, 0x7a, 0x35, 0x51, 0xa9,
	0xd4, 0xab, 0xa2, 0x2e, 0x11, 0x3b, 0xb5, 0x84, 0xb8, 0xb6, 0x63, 0x35, 0xab, 0x70, 0x3c, 0x97,
	0xa4, 0x54, 0xd4, 0x64, 0x62, 0x52, 0x84, 0x08, 0xd2, 0x6c, 0xf9, 0x9f, 0xd1, 0x9b, 0x52, 0x39,
	0x3a, 0xc6, 0x3b, 0x1a, 0xb3, 0xae, 0x96, 0xa0, 0x24, 0xa2, 0xee, 0xda, 0x66, 0xa7, 0x26, 0x0f,
	0xce, 0xb1, 0x1a, 0x75, 0xb7, 0xda, 0x30, 0xab, 0x4f, 0xdd, 0xee, 0xbe, 0x69, 0xb5, 0x8c, 0x9e,
	0x2c, 0x18, 0xea, 0x75, 0x17, 0x12, 0x0c, 0x44, 0xd2, 0x5e, 0xc7, 0x89, 0x8d, 0x56, 0xaf, 0xf3,
	0x52, 0xfb, 0xa9, 0x44, 0xe4, 0x12, 0x88, 0xca, 0x4b, 0x89, 0xd0, 0xca, 0x36, 0x1e, 0x7d, 0xf0,
	0x1b, 0x73, 0x9c, 0xdd, 0xee, 0x42, 0x23, 0x66, 0x57, 0x69, 0xc4, 0x08, 0x48, 0xdc, 0x35, 0x91,
	0x10, 0xd9, 0x08, 0xf9, 0x02, 0xdf, 0x07, 0x2e, 0x7c, 0x0b, 0x48, 0x86, 0xdf, 0x4d, 0x1a, 0x7e,
	0x57, 0x31, 0xbc, 0x84, 0x90, 0x7d, 0xd3, 0x65, 0x5b, 0xbd, 0x4c, 0xc2, 0xdd, 0x91, 0x84, 0xe0,
	0xe9, 0x4b, 0x0a, 0x81, 0x20, 0x6b, 0x99, 0x55, 0xc8, 0x95, 0x18, 0x06, 0xbb, 0xe0, 0xaf, 0xb5,
	0xa6, 0x65, 0xf2, 0x85, 0xdb, 0x44, 0x25, 0x1d, 0xb7, 0x5e, 0xd7, 0x32, 0xe5, 0x1e, 0x3a, 0xc6,
	0xfc, 0x17, 0x73, 0xb4, 0x38, 0x16, 0x58, 0xa9, 0x6d, 0x38, 0xd5, 0x86, 0x76, 0x81, 0xdc, 0x4d,
	0x38, 0xa0, 0x3c, 0xb0, 0x59, 0xc2, 0x48, 0x3c, 0xd4, 0xd3, 0xe5, 0xbf, 0x97, 0xc2, 0x77, 0x39,
	0x4b, 0xbe, 0x45, 0xa3, 0xd5, 0xb2, 0x2c, 0xb7, 0x59, 0x6b, 0x99, 0xae, 0xd3, 0x6c, 0x9b, 0x5d,
	0x25, 0x43, 0x5a, 0x96, 0xdb, 0x30, 0xac, 0x9a, 0x84, 0x0b, 0x23, 0x58, 0xb2, 0x72, 0x4e, 0xc7,
	0x94, 0x78, 0xf4, 0x93, 0xce, 0x27, 0xe1, 0x78, 0x76, 0x27, 0x78, 0xb6, 0x3c, 0xa5, 0x3f, 0x38,
	0xc6, 0x5f, 0xbf, 0x53, 0xf9, 0xec, 0xfe, 0xd0, 0xb4, 0xba, 0x72, 0x49, 0xdb, 0xb8, 0xa4, 0xef,
	0x7e, 0xfa, 0x7e, 0x43, 0xbf, 0xca, 0x67, 0xdd, 0x76, 0xed, 0x56, 0xf7, 0x79, 0xcf, 0x70, 0x1a,
	0xd4, 0xf4, 0xc2, 0x6e, 0x58, 0x5b, 0xed, 0x86, 0xa9, 0x9d, 0xaf, 0x36, 0x9e, 0x7e, 0xf9, 0x82,
	0x4f, 0x16, 0xbe, 0x76, 0x52, 0x8b, 0xf9, 0x8a, 0x9a, 0x39, 0xd0, 0x9e, 0x00, 0xa3, 0x73, 0x3e,
	0xce, 0x81, 0x03, 0xec, 0x2a, 0x9c, 0x61, 0xdb, 0x86, 0xf5, 0x54, 0x13, 0x45, 0x39, 0xc0, 0x17,
	0xe2, 0xfa, 0x0b, 0xf5, 0xd3, 0xb5, 0x45, 0xff, 0x6a, 0x27, 0xfd, 0xab, 0xbd, 0xe0, 0x5f, 0x6d,
	0xc5, 0xbf, 0x0e, 0xd5, 0xfb, 0x01, 0x6a, 0x88, 0xb6, 0xeb, 0x89, 0x0e, 0x00, 0x43, 0xd0, 0xd3,
	0x4a, 0x0f, 0x4e, 0xed, 0x34, 0x8b, 0x3a, 0x44, 0x59, 0xcf, 0x96, 0xfb, 0x71, 0xbb, 0xee, 0x56,
	0xf6, 0x2c, 0xdb, 0x91, 0xfb, 0x71, 0xbb, 0x2e, 0xce, 0xe9, 0xe5, 0x7f, 0x4e, 0xd7, 0x13, 0xb1,
	0x33, 0xca, 0xed, 0x83, 0x53, 0x37, 0xa9, 0x49, 0xe8, 0xd6, 0x8d, 0x66, 0xcb, 0x84, 0xd1, 0x70,
	0x8b, 0x34, 0x1d, 0xb7, 0x62, 0xd4, 0x64, 0x5b, 0x47, 0x78, 0x1e, 0x81, 0xc9, 0x1f, 0xd3, 0x54,
	0x29, 0x11, 0xb4, 0xd9, 0xb1, 0x1d, 0x6b, 0x0f, 0x51, 0x19, 0xda, 0x7f, 0x08, 0x85, 0x0e, 0x9d,
	0x8d, 0xe9, 0x45, 0x7f, 0x4d, 0x8c, 0xbb, 0x46, 0x55, 0x8f, 0xa9, 0xf4, 0xd9, 0x04, 0x6e, 0x3d,
	0x66, 0x13, 0xfd, 0x36, 0x81, 0xda, 0x88, 0xd9, 0x64, 0xdf, 0x4d, 0xe0, 0x72, 0x31, 0x1b, 0xf6,
	0x22, 0xba, 0x3d, 0x81, 0xca, 0xeb, 0x1f, 0xb0, 0x9b, 0x88, 0xb2, 0x9f, 0x37, 0x9d, 0x6a, 0x43,
	0x34, 0xc3, 0x08, 0xcf, 0xa8, 0xb2, 0x34, 0x93, 0xed, 0x30, 0x81, 0x2e, 0xc4, 0xa3, 0xca, 0xbe,
	0x95, 0xc0, 0x6d, 0x52, 0xa7, 0x4d, 0x6a, 0x24, 0xbb, 0xa0, 0x44, 0xb0, 0x45, 0x7b, 0x86, 0xb9,
	0xc4, 0xb7, 0x2a, 0xea, 0x9f, 0x13, 0x7d, 0xd5, 0x1f, 0x8d, 0xf9, 0x35, 0x55, 0xfe, 0xd7, 0xb8,
	0xc0, 0x1f, 0x1b, 0xf5, 0xaa, 0xdb, 0xec, 0x54, 0xbb, 0xed, 0x9e, 0xe1, 0x34, 0x61, 0xd7, 0x13,
	0x5e, 0x06, 0x08, 0xb3, 0x67, 0x5a, 0x70, 0x42, 0xfd, 0xf3, 0x34, 0xe6, 0x97, 0x83, 0xfe, 0x50,
	0xbc, 0xa1, 0x44, 0x19, 0xb8, 0xe0, 0x15, 0xab, 0xca, 0x57, 0x84, 0xfa, 0x65, 0xb2, 0xcb, 0x21,
	0xe0, 0xbc, 0xea, 0x16, 0xbb, 0xa9, 0x00, 0xca, 0x1e, 0xa5, 0x96, 0xa6, 0x26, 0xae, 0xc0, 0x24,
	0xa6, 0x20, 0x36, 0x24, 0x05, 0x89, 0xf2, 0x44, 0x67, 0x06, 0x10, 0xa8, 0xe7, 0x1a, 0xc5, 0xa7,
	0x20, 0x6d, 0x99, 0x1d, 0x79, 0x52, 0xe4, 0x30, 0x5e, 0x1a, 0xb8, 0x66, 0xbb, 0xe7, 0xbc, 0x94,
	0xcd, 0x61, 0x05, 0xb1, 0xd7, 0x79, 0xda, 0xe9, 0x3e, 0xef, 0xc8, 0xdd, 0x45, 0xaa, 0xcf, 0x6d,
	0xde, 0x84, 0x25, 0x8e, 0xe7, 0xd5, 0xb4, 0x5d, 0xbb, 0x65, 0xec, 0x9b, 0x1a, 0x9b, 0x9b, 0x2c,
	0x3f, 0x1b, 0x8b, 0xaa, 0x50, 0x02, 0x79, 0x9b, 0x48, 0xdb, 0xd4, 0x3f, 0x64, 0x77, 0x09, 0x1c,
	0xf7, 0x68, 0x69, 0x78, 0xd8, 0x0d, 0xc1, 0x85, 0xb5, 0xad, 0xf2, 0xef, 0x67, 0x30, 0xff, 0x80,
	0xbd, 0xa9, 0x28, 0xe5, 0xe6, 0xa6, 0x91, 0x0c, 0xc5, 0xac, 0xa2, 0xd7, 0x28, 0x80, 0x30, 0xe9,
	0x94, 0x30, 0xa8, 0xb1, 0xc4, 0xa0, 0xa2, 0x76, 0x51, 0x90, 0x28, 0x29, 0x33, 0x87, 0xe8, 0xee,
	0x61, 0x6c, 0xc8, 0x6d, 0x58, 0x20, 0x0c, 0x6b, 0x77, 0x0f, 0x84, 0x69, 0x6b, 0x62, 0x09, 0x0c,
	0xb1, 0x04, 0xeb, 0x8a, 0x8a, 0x4e, 0x17, 0x36, 0x9d, 0x0e, 0x98, 0x1a, 0x03, 0x5d, 0xf0, 0x63,
	0x29, 0x9a, 0x13, 0xfe, 0xa0, 0x0c, 0x87, 0x35, 0x69, 0x9e, 0x22, 0x05, 0x30, 0x3c, 0xc8, 0xb9,
	0x83, 0x76, 0xec, 0xa6, 0xed, 0xc0, 0xa8, 0x4c, 0xbf, 0xc5, 0x8a, 0x84, 0xde, 0xeb, 0xd8, 0x7b,
	0x3d, 0x50, 0xd2, 0xac, 0xb9, 0x5d, 0xab, 0x66, 0x5a, 0x5a, 0x61, 0xce, 0x1e, 0x8e, 0xb1, 0xab,
	0x6d, 0xce, 0x4d, 0x00, 0x4a, 0x0c, 0x3e, 0x65, 0x71, 0x38, 0x57, 0x11, 0x60, 0xc0, 0xed, 0x39,
	0x03, 0xf2, 0xee, 0xb2, 0x98, 0xf5, 0xc5, 0xf2, 0x5f, 0xa4, 0x58, 0x51, 0x2c, 0x8f, 0x5a, 0x5c,
	0x2a, 0x61, 0x55, 0x69, 0x56, 0x85, 0x3f, 0xf1, 0x1c, 0x26, 0x93, 0x20, 0x22, 0xec, 0xbd, 0x1e,
	0x82, 0x53, 0x0a, 0x7d, 0xc2, 0xd7, 0x44, 0x1e, 0x8c, 0xe9, 0x65, 0xf5, 0x99, 0xa1, 0x4c, 0xb3,
	0x88, 0xc2, 0xfe, 0x6f, 0x56, 0x68, 0xdf, 0x5c, 0xb2, 0xfc, 0x6b, 0x73, 0x03, 0xca, 0xe5, 0x5f,
	0x17, 0x86, 0x6b, 0xc6, 0x8e, 0xb4, 0x21, 0x16, 0xb8, 0x29, 0x16, 0x38, 0x57, 0xfe, 0x17, 0xf4,
	0xe1, 0x01, 0x4c, 0x1e, 0xfb, 0x5c, 0xaa, 0x6b, 0xb6, 0x97, 0xb9, 0x66, 0x5b, 0x75, 0xcd, 0x24,
	0x0c, 0x96, 0x47, 0xc6, 0x3f, 0xc1, 0x6a, 0x2d, 0xd8, 0xee, 0x2c, 0x6a, 0x66, 0xcf, 0x21, 0x3b,
	0xcf, 0x15, 0x64, 0x56, 0xf8, 0x10, 0x21, 0x9f, 0x37, 0x5b, 0xb5, 0xaa, 0x61, 0xd5, 0xa0, 0xac,
	0x26, 0x9f, 0x23, 0x0c, 0x1e, 0x56, 0xd6, 0xe7, 0xa0, 0xfb, 0x46, 0x6b, 0xcf, 0xd4, 0x36, 0xe6,
	0x94, 0xe7, 0xa2, 0x45, 0xc7, 0x48, 0x00, 0x7b, 0x96, 0x69, 0x99, 0xcf, 0xb4, 0xbc, 0x22, 0xa1,
	0xb6, 0xd7, 0x23, 0xb9, 0x4c, 0xd8, 0xa9, 0x2d, 0xec, 0x54, 0x28, 0xff, 0x11, 0x39, 0x49, 0x5c,
	0x2e, 0x2b, 0xb9, 0x17, 0x07, 0xac, 0xb7, 0xeb, 0xd2, 0x4b, 0x64, 0xf9, 0xc4, 0x81, 0x94, 0xe6,
	0xf7, 0x5a, 0x2d, 0x99, 0x37, 0x39, 0x7c, 0xce, 0x45, 0x14, 0x31, 0xa2, 0x96, 0xce, 0x88, 0x82,
	0xbc, 0x2d, 0xf3, 0xb7, 0x2c, 0xa3, 0xa5, 0x04, 0xaa, 0xcc, 0xd6, 0xe6, 0x11, 0xd5, 0x6e, 0xbb,
	0x6d, 0x74, 0xc0, 0x4e, 0x38, 0x79, 0x89, 0xa8, 0xb7, 0x8c, 0x5d, 0x5b, 0xdb, 0x28, 0xff, 0x41,
	0x06, 0xbf, 0x5c, 0x8b, 0x2b, 0x61, 0x75, 0x56, 0xa8, 0xe8, 0x2e, 0x30, 0xe1, 0x86, 0x6b, 0xbe,
	0x68, 0xda, 0x8e, 0x2d, 0xdf, 0x55, 0x70, 0x8c, 0x28, 0x33, 0x31, 0xd6, 0x53, 0xe4, 0xcb, 0x1c,
	0xf5, 0xdc, 0x6c, 0xee, 0x36, 0x1c, 0x35, 0xa8, 0x65, 0x18, 0x70, 0x3c, 0xa4, 0x88, 0x6e, 0x1d,
	0x39, 0xe1, 0xac, 0x85, 0x3b, 0xa6, 0x8a, 0xaa, 0xec, 0x41, 0x9e, 0x85, 0x93, 0xc3, 0x5d, 0x76,
	0x4b, 0xe0, 0xaa, 0x0d, 0xa3, 0xd9, 0x69, 0x76, 0x76, 0x13, 0x82, 0xd7, 0x28, 0xc9, 0xe0, 0xc0,
	0x3c, 0xcb, 0xa8, 0xe8, 0x75, 0x51, 0x86, 0x03, 0xba, 0xd5, 0xed, 0xf6, 0xe4, 0x86, 0xb1, 0xab,
	0x2c, 0x1a, 0x4d, 0x22, 0xa7, 0xa2, 0xf8, 0x68, 0x66, 0x4d, 0xe6, 0x32, 0xf4, 0x97, 0x5d, 0x69,
	0x7b, 0x88, 0x0c, 0xd1, 0x5e, 0xdc, 0x9d, 0x37, 0x7c, 0x81, 0x9c, 0x40, 0x22, 0x70, 0x42, 0xda,
	0x26, 0x2d, 0x88, 0x84, 0x73, 0x8d, 0xe5, 0xbb, 0xc5, 0xdd, 0x78, 0xb1, 0xb7, 0xcb, 0xbf, 0x4b,
	0x8e, 0x27, 0xfe, 0x52, 0x70, 0x62, 0x89, 0x50, 0x9b, 0x9e, 0x10, 0x43, 0x4d, 0x5e, 0xd4, 0x46,
	0x42, 0x1b, 0x18, 0x63, 0xb2, 0x96, 0xed, 0xc5, 0x6a, 0xf2, 0x17, 0xa5, 0x62, 0x51, 0x24, 0xdc,
	0xa8, 0xed, 0x9b, 0x96, 0xd3, 0xb4, 0x4d, 0xe9, 0x7e, 0x3d, 0xc5, 0xfd, 0xca, 0x7f, 0x15, 0x9d,
	0x46, 0xfe, 0x39, 0xed, 0x84, 0x46, 0xf4, 0x8e, 0x30, 0xe1, 0xdd, 0x32, 0x18, 0x9c, 0xb9, 0x91,
	0xc5, 0xbb, 0x0c, 0x27, 0x16, 0x9f, 0x2e, 0xff, 0x10, 0xe7, 0x8b, 0xb7, 0xbf, 0xfc, 0xd9, 0x92,
	0xf9, 0x3e, 0xeb, 0x26, 0xe7, 0x8b, 0x63, 0x4a, 0x28, 0x6e, 0x48, 0x42, 0x36, 0x07, 0x0b, 0xd9,
	0x7f, 0x8d, 0xdd, 0x5e, 0xf8, 0xc3, 0xe2, 0x4b, 0xd4, 0xb7, 0xab, 0x89, 0x40, 0x11, 0x05, 0x90,
	0x04, 0x63, 0xea, 0x43, 0xf9, 0x1c, 0x18, 0xeb, 0x7e, 0x6b, 0xfe, 0xee, 0x57, 0x42, 0x3c, 0x1d,
	0xe0, 0xac, 0x7a, 0x15, 0xea, 0x6e, 0x6e, 0x19, 0x05, 0xc4, 0x3d, 0x36, 0x3e, 0xc2, 0x59, 0x34,
	0x1a, 0xd4, 0x97, 0x5a, 0xba, 0xfc, 0x87, 0x69, 0xb4, 0x7b, 0x7c, 0xac, 0x58, 0x4c, 0x41, 0xed,
	0x64, 0x0a, 0xc2, 0x08, 0xe6, 0x40, 0xac, 0x42, 0x29, 0x82, 0x53, 0xb4, 0xe2, 0x6d, 0x35, 0x82,
	0xb1, 0x5f, 0x91, 0x56, 0x51, 0x22, 0x2e, 0x10, 0x25, 0x2a, 0x8a, 0xf6, 0xbc, 0x9b, 0x67, 0xc9,
	0x6c, 0xed, 0x64, 0x7e, 0x11, 0x49, 0x5b, 0x82, 0x2d, 0xc3, 0x31, 0x65, 0x32, 0x6a, 0xc7, 0x31,
	0x61, 0xf1, 0xb7, 0xfb, 0x73, 0xc4, 0x15, 0x90, 0x9c, 0xa3, 0xed, 0x22, 0x01, 0x75, 0x6b, 0xa6,
	0x63, 0x34, 0x5b, 0x5a, 0x5e, 0x55, 0x95, 0x32, 0x06, 0xd7, 0xd4, 0xd6, 0x98, 0x3a, 0x75, 0x91,
	0x4c, 0x8c, 0x4e, 0xcd, 0xd6, 0x0a, 0xe5, 0x7f, 0x99, 0x5a, 0xf2, 0x2d, 0x62, 0xb8, 0xcc, 0x89,
	0xeb, 0x73, 0x4e, 0x4c, 0xef, 0xad, 0x05, 0x58, 0xee, 0xe0, 0x62, 0xc5, 0x62, 0x06, 0xc8, 0x0a,
	0xf2, 0xb2, 0x44, 0x5d, 0xf1, 0x9a, 0xcc, 0xbc, 0x10, 0x59, 0x87, 0x64, 0x45, 0x2c, 0xd4, 0xa5,
	0x3f, 0xad, 0x95, 0xff, 0x33, 0xed, 0xce, 0xc9, 0xbf, 0x54, 0x20, 0x8e, 0x7b, 0x70, 0xd2, 0xb6,
	0xab, 0xf1, 0xf1, 0x8f, 0xdf, 0x1f, 0x79, 0x2e, 0xdf, 0x4d, 0xb7, 0x7b, 0xae, 0xb1, 0xbb, 0x6b,
	0x99, 0xbb, 0x06, 0x3f, 0xa4, 0xd3, 0x89, 0x4f, 0xdc, 0x46, 0xc9, 0x08, 0x83, 0xf7, 0x92, 0x6f,
	0x71, 0x25, 0x19, 0x86, 0xd1, 0x5a, 0x0c, 0xc0, 0x14, 0xb8, 0x1e, 0xf3, 0x89, 0xd3, 0xbe, 0x5d,
	0xd5, 0x36, 0x84, 0xc1, 0x05, 0x54, 0x9c, 0x69, 0x64, 0xa7, 0xb7, 0xdd, 0x23, 0x37, 0xca, 0x8b,
	0x23, 0x35, 0x01, 0x44, 0x32, 0x60, 0xb1, 0x08, 0x84, 0x4b, 0x11, 0x85, 0x18, 0x93, 0x3c, 0x30,
	0xc9, 0x2b, 0x1a, 0x62, 0x12, 0x5c, 0x17, 0x71, 0x7c, 0x6a, 0xf7, 0x96, 0x1d, 0xcd, 0x77, 0x96,
	0xfe, 0x85, 0x0a, 0x57, 0x7c, 0x6d, 0x8f, 0x8c, 0x75, 0x38, 0xcf, 0x2d, 0xbc, 0xe6, 0x15, 0xf0,
	0x76, 0xd7, 0x32, 0xb5, 0x54, 0xb9, 0x45, 0xf1, 0x98, 0xfc, 0xab, 0x13, 0x24, 0x49, 0x68, 0x5c,
	0xc7, 0xbb, 0x0d, 0x8a, 0x2c, 0x72, 0x7f, 0x89, 0x21, 0x69, 0x7f, 0x96, 0x41, 0xd5, 0x56, 0x7c,
	0x8f, 0x2d, 0xfd, 0xa6, 0xe7, 0xa8, 0xa7, 0x68, 0x48, 0x4e, 0xb8, 0xf3, 0x2d, 0x60, 0xdc, 0x76,
	0xd3, 0xb6, 0x65, 0x45, 0xca, 0xd1, 0x1d, 0xf3, 0x05, 0x9d, 0x39, 0x6d, 0x2d, 0x4d, 0x75, 0xf7,
	0x3c, 0x02, 0xd9, 0x32, 0xe2, 0x3e, 0x02, 0x60, 0x93, 0x4d, 0xd1, 0x2c, 0xed, 0xf1, 0x8b, 0x28,
	0x64, 0x5d, 0x53, 0x59, 0x93, 0x6d, 0xd3, 0x75, 0x95, 0x35, 0x81, 0x42, 0xd6, 0x0d, 0x19, 0x03,
	0x3d, 0x87, 0x1a, 0x02, 0x39, 0x19, 0x8c, 0x30, 0x9a, 0x2c, 0x08, 0x99, 0xb8, 0x60, 0x12, 0x2b,
	0x61, 0x9b, 0x0e, 0x96, 0x6f, 0xe2, 0x7c, 0xbd, 0x04, 0x87, 0xc3, 0x6c, 0xa9, 0xcc, 0xa8, 0x86,
	0x64, 0xde, 0x56, 0x99, 0x93, 0x38, 0x64, 0xbe, 0xa8, 0xdf, 0x8c, 0x57, 0x22, 0xe1, 0x5f, 0x3f,
	0x7b, 0x9f, 0xd1, 0xef, 0xc4, 0x6b, 0xa1, 0xe2, 0x90, 0x15, 0x1c, 0xf0, 0xf7, 0xe8, 0x4f, 0x74,
	0x60, 0xc9, 0x95, 0xb8, 0x91, 0x41, 0x7d, 0xc1, 0x7a, 0x75, 0xe1, 0xf6, 0x0a, 0xc0, 0xb0, 0x7d,
	0x48, 0x45, 0x95, 0x96, 0x12, 0xd5, 0x52, 0x8c, 0x69, 0x35, 0xf7, 0xcd, 0x8e, 0x69, 0xc7, 0xd7,
	0x33, 0x76, 0x95, 0x62, 0x49, 0xcb, 0x2a, 0x0c, 0xb2, 0x82, 0xe2, 0x7d, 0x5b, 0x5b, 0xcb, 0x95,
	0x5f, 0x63, 0x43, 0x20, 0xbe, 0xf2, 0x8e, 0xb7, 0xdc, 0xc5, 0x16, 0xaa, 0x36, 0xc8, 0x50, 0xcb,
	0x67, 0x8e, 0xdb, 0x6e, 0x76, 0x30, 0xa3, 0xa7, 0x14, 0x98, 0xf1, 0x02, 0x61, 0x69, 0x8a, 0xc1,
	0x67, 0x4b, 0x5a, 0x18, 0x3f, 0xc2, 0xd3, 0xf0, 0xdc, 0x9d, 0x67, 0xf2, 0xd3, 0xaa, 0x85, 0xfd,
	0x94, 0x4e, 0xb7, 0xda, 0x30, 0x3a, 0xbb, 0xa6, 0x6c, 0xe6, 0x0b, 0x84, 0xf9, 0x6c, 0xcf, 0x68,
	0xc9, 0x0b, 0x6a, 0x02, 0xda, 0x36, 0x6c, 0xdc, 0xbd, 0x92, 0xc4, 0x78, 0xa6, 0xcf, 0x54, 0xf6,
	0xd8, 0x07, 0x7e, 0x70, 0xc8, 0x6f, 0x01, 0x0e, 0xfc, 0x60, 0xf8, 0x09, 0xfe, 0x2f, 0x32, 0xf2,
	0x56, 0xe0, 0x83, 0xcf, 0x7e, 0xf8, 0xd9, 0xe1, 0x28, 0x3a, 0x3a, 0x3e, 0xf8, 0x64, 0xe0, 0x4f,
	0xee, 0x0b, 0xb2, 0xfb, 0x48, 0xf6, 0x2b, 0xf4, 0x9f, 0xcd, 0x9c, 0x7c, 0x7e, 0xff, 0xd0, 0x57,
	0xff, 0xcb, 0x99, 0x83, 0x75, 0x8e, 0xf9, 0xec, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x46,
	0xe4, 0xda, 0x96, 0x66, 0x00, 0x00,
}
