// Notes:
// 1. when creating a new var, type, etc,
//    the meta-data tree needs to be updated
//    (though possibly on a lazy basis)

option config_h=true;

// Define enum covering all RPC calls
enum RPC_Call {
NCRPC_CREATE=0;
NCRPC_OPEN=1;
NCRPC_NEW_NC=2;
NCRPC_FREE_NC=3;
NCRPC_REDEF=4;
NCRPC__ENDDEF=5;
NCRPC_SYNC=6;
NCRPC_ABORT=7;
NCRPC_CLOSE=8;
NCRPC_SET_FILL=9;
NCRPC_SET_BASE_PE=10;
NCRPC_INQ_BASE_PE=10;
NCRPC_INQ_FORMAT=12;
NCRPC_INQ=13;
NCRPC_INQ_TYPE=14;
NCRPC_DEF_DIM=15;
NCRPC_INQ_DIMID=16;
NCRPC_INQ_DIM=17;
NCRPC_INQ_UNLIMDIM=18;
NCRPC_RENAME_DIM=19;
NCRPC_INQ_ATT=20;
NCRPC_INQ_ATTID=21;
NCRPC_INQ_ATTNAME=22;
NCRPC_RENAME_ATT=23;
NCRPC_DEL_ATT=24;
NCRPC_GET_ATT=25;
NCRPC_PUT_ATT=26;
NCRPC_DEF_VAR=27;
NCRPC_INQ_VAR_ALL=28;
NCRPC_INQ_VARID=29;
NCRPC_RENAME_VAR=30;
NCRPC_PUT_VARA=31;
NCRPC_GET_VARA=32;
NCRPC_VAR_PAR_ACCESS=33;
NCRPC_INQ_NCID=34;
NCRPC_INQ_GRPS=35;
NCRPC_INQ_GRPNAME=36;
NCRPC_INQ_GRPNAME_FULL=37;
NCRPC_INQ_GRP_PARENT=38;
NCRPC_INQ_GRP_FULL_NCID=39;
NCRPC_INQ_VARIDS=40;
NCRPC_INQ_DIMIDS=41;
NCRPC_INQ_TYPEIDS=42;
NCRPC_INQ_TYPE_EQUAL=43;
NCRPC_DEF_GRP=44;
NCRPC_INQ_USER_TYPE=45;
NCRPC_DEF_COMPOUND=46;
NCRPC_INSERT_COMPOUND=47;
NCRPC_INSERT_ARRAY_COMPOUND=48;
NCRPC_INQ_TYPEID=49;
NCRPC_INQ_COMPOUND_FIELD=50;
NCRPC_INQ_COMPOUND_FIELDINDEX=51;
NCRPC_DEF_VLEN=52;
NCRPC_PUT_VLEN_ELEMENT=53;
NCRPC_GET_VLEN_ELEMENT=54;
NCRPC_DEF_ENUM=55;
NCRPC_INSERT_ENUM=56;
NCRPC_INQ_ENUM_MEMBER=57;
NCRPC_INQ_ENUM_IDENT=58;
NCRPC_DEF_OPAQUE=59;
NCRPC_DEF_VAR_DEFLATE=60;
NCRPC_DEF_VAR_FLETCHER32=61;
NCRPC_DEF_VAR_CHUNKING=62;
NCRPC_DEF_VAR_FILL=63;
NCRPC_DEF_VAR_ENDIAN=64;
NCRPC_SET_VAR_CHUNK_CACHE=65;
NCRPC_GET_VAR_CHUNK_CACHE=66;
NCRPC_INQ_UNLIMDIMS=67;
NCRPC_SHOW_METADATA=68;
NCRPC_INITIALIZE=69;
NCRPC_GETMETADATA=70;
}

message NCCreate {
    required string path		= 1;
    required int32 cmode		= 2;
    required uint64 initialsz		= 3;
    required int32 basepe		= 4;
    required int32 use_parallel		= 6;
}

message NCCreate_Return {
    required int32 ncstatus		= 1;
    required int32 ncid			= 2;
}

message NCOpen {
    required string path		= 1;
    required int32 cmode		= 2;
    required int32 basepe		= 3;
    repeated uint64 chunksizehint	= 4;
    required int32 use_parallel		= 5;
    required bytes parameters		= 6;
}

message NCOpen_Return {
    required int32 ncstatus		= 1;
    required int32 ncid			= 2;
}

message NCRedef {
    required int32 ncid			= 1;
}

message NCRedef_Return {
    required int32 ncstatus		= 1;
}

message NC_Enddef {
    required int32 ncid			= 1;
    required uint64 minfree		= 2;
    required uint64 v_align		= 3;
    required uint64 v_minfree		= 4;
    required uint64 r_align		= 5;
}

message NC_Enddef_Return {
    required int32 ncstatus		= 1;
}

message NCSync {
    required int32 ncid			= 1;
}

message NCSync_Return {
    required int32 ncstatus		= 1;
}

message NCAbort {
    required int32 ncid			= 1;
}

message NCAbort_Return {
    required int32 ncstatus		= 1;
}

message NCClose {
    required int32 ncid			= 1;
}

message NCClose_Return {
    required int32 ncstatus		= 1;
}

message NCSet_Fill {
    required int32 ncid			= 1;
    required int32 fillmode		= 2;
}

message NCSet_Fill_Return {
    required int32 ncstatus		= 1;
    required int32 oldmode		= 2;
}

message NCInq_Base_PE {
    required int32 ncid			= 1;
}

message NCInq_Base_PE_Return {
    required int32 ncstatus		= 1;
    required int32 pe			= 2;
}

message NCSet_base_pe {
    required int32 ncid			= 1;
    required int32 pe			= 2;
}

message NCSet_base_pe_Return {
    required int32 ncstatus		= 1;
}

message NCInq_format {
    required int32 ncid			= 1;
}

message NCInq_format_Return {
    required int32 ncstatus		= 1;
    required int32 format		= 2;
}

message NCInq {
    required int32 ncid			= 1;
}

message NCInq_Return {
    required int32 ncstatus		= 1;
    required int32 ndims		= 2;
    required int32 nvars		= 3;
    required int32 natts		= 4;
    required int32 unlimdimid		= 5;
}

message NCInq_Type {
    required int32 ncid			= 1;
    required int32 xtype		= 2;
}

message NCInq_Type_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
    required uint64 size		= 3;
}

message NCDef_Dim {
    required int32 ncid			= 1;
    required string name		= 2;
    required uint64 len			= 3;
}

message NCDef_Dim_Return {
    required int32 ncstatus		= 1;
    required int32 dimid		= 2;
}

message NCInq_dimid {
    required int32 ncid			= 1;
    required string name		= 2;
}

message NCInq_dimid_Return {
    required int32 ncstatus		= 1;
    required int32 dimid		= 2;
}

message NCInq_dim {
    required int32 ncid			= 1;
    required int32 dimid		= 2;
}

message NCInq_dim_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
    required uint64 len			= 3;
}

message NCInq_unlimdim {
    required int32 ncid			= 1;
}

message NCInq_unlimdim_Return {
    required int32 ncstatus		= 1;
    required int32 unlimdimid		= 2;
}

message NCRename_dim {
    required int32 ncid			= 1;
    required int32 dimid		= 2;
    required string name		= 3;
}

message NCRename_dim_Return {
    required int32 ncstatus		= 1;
}

message NCInq_att {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
}

message NCInq_att_Return {
    required int32 ncstatus		= 1;
    required int32 xtype		= 2;
    required uint64 len			= 3;
}

message NCInq_attid {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
}

message NCInq_attid_Return {
    required int32 ncstatus		= 1;
    required int32 attid		= 2;
}

message NCInq_attname {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required int32 attnum		= 3;
}

message NCInq_attname_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
}

message NCRename_att {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
    required string newname		= 4;
}

message NCRename_att_Return {
    required int32 ncstatus		= 1;
}

message NCDel_att {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
}

message NCDel_att_Return {
    required int32 ncstatus		= 1;
}

message NCGet_att {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
    required int32 xtype		= 4;
}

message NCGet_att_Return {
    required int32 ncstatus		= 1;
    required bytes values		= 2;
}

message NCPut_att {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
    required int32 vtype		= 4; // external value type
    required uint64 nelems		= 5;
    required bytes value		= 6;
    required int32 atype		= 7; // attribute type
}

message NCPut_att_Return {
    required int32 ncstatus		= 1;
}

message NCDef_Var {
    required int32 ncid			= 1;
    required string name		= 2;
    required int32 xtype		= 3;
    required int32 ndims		= 4;
    repeated int32 dimids		= 5;
}

message NCDef_Var_Return {
    required int32 ncstatus		= 1;
    required int32 varid		= 2;
}

message NCInq_varid {
    required int32 ncid			= 1;
    required string name		= 2;
}

message NCInq_varid_Return {
    required int32 ncstatus		= 1;
    required int32 varid		= 2;
}

message NCRename_var {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
}

message NCRename_var_Return {
    required int32 ncstatus		= 1;
}

message NCGet_vara {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    repeated uint64 start		= 3;
    repeated uint64 edges		= 4;
    required int32 memtype		= 5;
}

message NCGet_vara_Return {
    required int32 ncstatus		= 1;
    required bytes value		= 2;
}

message NCPut_vara {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    repeated uint64 start		= 3;
    repeated uint64 edges		= 4;
    required bytes value		= 5;
    required int32 memtype		= 6;
}

message NCPut_vara_Return {
    required int32 ncstatus		= 1;
}

message NCGet_vars {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    repeated uint64 start		= 3;
    repeated uint64 edges		= 4;
    repeated uint64 stride		= 5;
    required int32 memtype		= 6;
}

message NCGet_vars_Return {
    required int32 ncstatus		= 1;
    required bytes value		= 2;
}

message NCPut_vars {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    repeated uint64 start		= 3;
    repeated uint64 edges		= 4;
    repeated uint64 stride		= 5;
    required bytes value		= 6;
    required int32 memtype		= 7;
}

message NCPut_vars_Return {
    required int32 ncstatus		= 1;
}

message NCGet_varm {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    repeated uint64 start		= 3;
    repeated uint64 edges		= 4;
    repeated uint64 stride		= 5;
    repeated uint64 imap		= 6;
    required int32 memtype		= 7;
}

message NCGet_varm_Return {
    required int32 ncstatus		= 1;
    required bytes value		= 2;
}

message NCPut_varm {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    repeated uint64 start		= 3;
    repeated uint64 edges		= 4;
    repeated uint64 stride		= 5;
    repeated uint64 imap		= 6;
    required bytes value		= 7;
    required int32 memtype		= 8;
}

message NCPut_varm_Return {
    required int32 ncstatus		= 1;
}

message NCInq_var_all {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required string name		= 3;
}

message NCInq_var_all_Return {
    required int32 ncstatus		= 1;
    required int32 xtype		= 2;
    required int32 ndims		= 3;
    repeated int32 dimids		= 4;
    required int32 natts		= 5;
    required bool shuffle		= 6;
    required bool deflate		= 7;
    required int32 deflate_level	= 8;
    required bool fletcher32		= 9;
    required bool contiguous		= 10;
    repeated uint64 chunksizes		= 11;
    required bool no_fill		= 12;
    required bytes fill_value		= 13;
    required bool endianness		= 14;
    required int32 options_mask		= 15;
    required int32 pixels_per_block	= 16;
}

// #ifdef USE_NETCDF4

message NCShow_metadata {
    required int32 ncid			= 1;
}

message NCShow_metadata_Return {
    required int32 ncstatus		= 1;
}

message NCInq_unlimdims {
    required int32 ncid			= 1;
}

message NCInq_unlimdims_Return {
    required int32 ncstatus		= 1;
    required int32 nunlimdims		= 2;
    repeated int32 unlimdimids		= 3;
}

message NCVar_par_access {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required bool par_access		= 3;
}

message NCVar_par_access_Return {
    required int32 ncstatus		= 1;
}

message NCInq_ncid {
    required int32 ncid			= 1;
    required string group		= 2;
}

message NCInq_ncid_Return {
    required int32 ncstatus		= 1;
    required int32 grp_ncid		= 2;
}

message NCInq_grps {
    required int32 ncid			= 1;
}

message NCInq_grps_Return {
    required int32 ncstatus		= 1;
    required int32 ngroups		= 2;
    repeated int32 ncids		= 3;
}

message NCInq_grpname {
    required int32 ncid			= 1;
}

message NCInq_grpname_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
}

message NCInq_grpname_full {
    required int32 ncid			= 1;
}

message NCInq_grpname_full_Return {
    required int32 ncstatus		= 1;
    repeated uint64 len			= 2;
    required string fullname		= 3;
}

message NCInq_grp_parent {
    required int32 ncid			= 1;
}

message NCInq_grp_parent_Return {
    required int32 ncstatus		= 1;
    required int32 parentncid		= 2;
}

message NCInq_grp_full_ncid {
    required int32 ncid			= 1;
    required string fullname		= 2;
}

message NCInq_grp_full_ncid_Return {
    required int32 ncstatus		= 1;
    required int32 groupncid		= 2;
}

message NCInq_varids {
    required int32 ncid			= 1;
}

message NCInq_varids_Return {
    required int32 ncstatus		= 1;
    required int32 nvars		= 2;
    repeated int32 varids		= 3;
}

message NCInq_dimids {
    required int32 ncid			= 1;
    required bool includeparents	= 2;
}

message NCInq_dimids_Return {
    required int32 ncstatus		= 1;
    required int32 ndims		= 2;
    repeated int32 dimids		= 3;
}

message NCInq_typeids {
    required int32 ncid			= 1;
}

message NCInq_typeids_Return {
    required int32 ncstatus		= 1;
    required int32 ntypes		= 2;
    repeated int32 typeids		= 3;
}

message NCInq_type_equal {
    required int32 ncid1		= 1;
    required int32 typeid1		= 2;
    required int32 ncid2		= 3;
    required int32 typeid2		= 4;
}

message NCInq_type_equal_Return {
    required int32 ncstatus		= 1;
    required bool equal			= 2;
}

message NCDef_Grp {
    required int32 ncid			= 1;
    required string name		= 2;
}

message NCDef_Grp_Return {
    required int32 ncstatus		= 1;
    required int32 grpncid		= 2;
}

message NCInq_user_type {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
}

message NCInq_user_type_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
    required uint64 size		= 3;
    required int32 basetype		= 4;
    required uint64 nfields		= 5;
    required int32 typeclass		= 6;
}

message NCInq_typeid {
    required int32 ncid			= 1;
    required string name		= 2;
}

message NCInq_typeid_Return {
    required int32 ncstatus		= 1;
    required int32 typeid		= 2;
}

message NCDef_Compound {
    required int32 ncid			= 1;
    required uint64 size		= 2;
    required string name		= 3;
}

message NCDef_Compound_Return {
    required int32 ncstatus		= 1;
    required int32 typeid		= 2;
}

message NCInsert_compound {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required string name		= 3;
    required uint64 offset		= 4;
    required int32 fieldtypeid		= 5;
}

message NCInsert_compound_Return {
    required int32 ncstatus		= 1;
}

message NCInsert_array_compound {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required string name		= 3;
    required uint64 offset		= 4;
    required int32 fieldtypeid		= 5;
    required int32 ndims		= 6;
    repeated int32 dimsizes		= 7;
}

message NCInsert_array_compound_Return {
    required int32 ncstatus		= 1;
}

message NCInq_compound_field {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required int32 fieldid		= 3;
}

message NCInq_compound_field_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
    required uint64 offset		= 3;
    required int32 fieldtypeid		= 4;
    required int32 ndims		= 5;
    repeated int32 dimsizes		= 6;
}

message NCInq_compound_fieldindex {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required string name		= 3;
}

message NCInq_compound_fieldindex_Return {
    required int32 ncstatus		= 1;
    required int32 fieldid		= 2;
}

message NCDef_Vlen {
    required int32 ncid			= 1;
    required string name		= 2;
    required int32 base_typeid		= 3;
}

message NCDef_Vlen_Return {
    required int32 ncstatus		= 1;
    required int32 typeid		= 2;
}

message NCPut_vlen_element {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required bytes element		= 3;
    required uint64 len			= 4;
    required bytes data			= 5;
}

message NCPut_vlen_element_Return {
    required int32 ncstatus		= 1;
}

message NCGet_vlen_element {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
}

message NCGet_vlen_element_Return {
    required int32 ncstatus		= 1;
    required bytes element		= 2;
    required uint64 len			= 3;
    required bytes data			= 4;
}

message NCDef_Enum {
    required int32 ncid			= 1;
    required int32 basetypeid		= 2;
    required string name		= 3;
}

message NCDef_Enum_Return {
    required int32 ncstatus		= 1;
    required int32 typeid		= 2;
}

message NCInsert_enum {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required string name		= 3;
    required bytes value		= 4;
}

message NCInsert_enum_Return {
    required int32 ncstatus		= 1;
}

message NCInq_enum_member {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required int32 index		= 3;
}

message NCInq_enum_member_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
    required bytes value		= 3;
}

message NCInq_enum_ident {
    required int32 ncid			= 1;
    required int32 typeid		= 2;
    required uint64 value		= 3;
}

message NCInq_enum_ident_Return {
    required int32 ncstatus		= 1;
    required string name		= 2;
}

message NCDef_Opaque {
    required int32 ncid			= 1;
    required uint64 size		= 2;
    required string name		= 3;
}

message NCDef_Opaque_Return {
    required int32 ncstatus		= 1;
    required int32 typeid		= 2;
}

message NCDef_var_deflate {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required bool shuffle		= 3;
    required bool deflate		= 4;
    required int32 deflatelevel		= 5;
}

message NCDef_var_deflate_Return {
    required int32 ncstatus		= 1;
}

message NCDef_Var_Fletcher32 {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required bool fletcher32		= 3;
}

message NCDef_Var_Fletcher32_Return {
    required int32 ncstatus		= 1;
}

message NCDef_Var_Chunking {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required bool contiguous		= 3;
    repeated uint64 chunksizes		= 4;
}

message NCDef_Var_Chunking_Return {
    required int32 ncstatus		= 1;
}

message NCDef_Var_Fill {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required bool nofill		= 3;
    required bytes fill_value		= 4;
}

message NCDef_Var_Fill_Return {
    required int32 ncstatus		= 1;
}

message NCDef_Var_endian {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required bool bigendian		= 3;
}

message NCDef_Var_endian_Return {
    required int32 ncstatus		= 1;
}

message NCSet_var_chunk_cache {
    required int32 ncid			= 1;
    required int32 varid		= 2;
    required uint64 size		= 3;
    required uint64 nelems		= 4;
    required float preemption		= 5;
}

message NCSet_var_chunk_cache_Return {
    required int32 ncstatus		= 1;
}

message NCGet_var_chunk_cache {
    required int32 ncid			= 1;
    required int32 varid		= 2;
}

message NCGet_var_chunk_cache_Return {
    required int32 ncstatus		= 1;
    required uint64 size		= 2;
    required uint64 nelems		= 3;
    required float preemption		= 4;
}

// #endif //USE_NETCDF4

// #ifdef NONDISPATCH

message NCNC_set_log_level {
    required int32 newlevel		= 1;
}

message NCNC_set_log_level_Return {
    required int32 ncstatus		= 1;
}

message NCNC_inq_libvers {
}

message NCNC_inq_libvers_Return {
    required string version		= 1;
}

message NCNC_delete_mp {
    required string path		= 1;
    required int32 basepe		= 2;
}

message NCNC_delete_mp_Return {
    required int32 ncstatus		= 1;
}

// This procedure is special to rpc;
// it transports the complete metadata
// of a file from server to client at one shot



// #endif //NONDISPATCH


// Define messages for transporting
// the complete netcdf-4 metadata for a file

// Following should be consistent with netcdf.h
enum nc_meta  {
META_NAT=0; // Not A Type
META_BYTE=1; // signed 1 byte integer
META_CHAR=2; // ISO/ASCII character
META_SHORT=3; // signed 2 byte integer
META_INT=4; // signed 4 byte integer
META_FLOAT=5; // single precision floating point number
META_DOUBLE=6; // double precision floating point number
META_UBYTE=7; // unsigned 1 byte int
META_USHORT=8; // unsigned 2-byte int
META_UINT=9; // unsigned 4-byte int
META_INT64=10; // signed 8-byte int
META_UINT64=11; // unsigned 8-byte int
META_STRING=12; // string
META_VLEN=13; // vlen types
META_OPAQUE=14; // opaque types
META_ENUM=15; // enum types
META_COMPOUND=16; // compound types
META_ATOMIC=64; // Atomic type (NC_NAT-NC_STRING)
META_FIELD=65; // Compound Field
META_GRAPH=66; // Root of a node graph (not same as root group)
META_GROUP=67; // Group
META_VAR=68; // Variable
META_DIM=69; // Dimension
}

// Structure for representing the meta data as a graph
message MetaNode {
    required MetaNode root		= 1; // link to root of the graph
    required nc_meta nodeclass		= 2;
    required nc_meta subclass		= 3;
    // Following depend on nodeclass + subclass
    optional int32 ncid			= 4;
    optional int32 typeid		= 5;
    optional string name		= 6;
    optional uint64 size		= 7;
    optional MetaNode basetype		= 8; // vlen or enum or basetype
    optional MetaGraph graph		= 9; // root of the graph
    optional MetaGroup group		= 10;
    optional MetaVar var		= 11;
    optional MetaDim dim		= 12;
    optional MetaCompound compound_t	= 13;
    optional MetaEnum enum_t		= 14;
    // Vlen and opaque have no extra info
}

// Sub-messages

message MetaGraph {
    repeated MetaNode nodeset		= 1;
    required MetaNode rootgroup		= 2;
}

message MetaGroup {
    repeated MetaNode typeset		= 1; // types in group
    repeated MetaNode varset		= 2;  // vars in group
    repeated MetaNode dimrset		= 3; // dims in group
    repeated MetaNode groups		= 4;  // (sub)groups in group
}

message MetaVar {       // var node specific info
    repeated MetaNode dims		= 1;
}

message MetaDim {
    required uint64 actualsize		= 1; // actual size for unlimited
}

message MetaCompound {        // compound node specific info
    repeated MetaNode fields		= 1;
}

message MetaField {       // field node specific info
    repeated uint64 dims		= 1;
    required uint64 offset		= 2;
    required uint64 alignment		= 3;
}

message MetaEnum {
    repeated MetaEconst econsts		= 1;
}

// No need to represent enum constants as a metanode instance.
message MetaEconst {
    required string name		= 1;
    required bytes value		= 2;
}