
/*** <<< INCLUDES [Forest] >>> ***/

#include <Tree.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [Forest] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Forest;

/*** <<< TYPE-DECLS [Forest] >>> ***/


typedef struct Forest {
	A_SET_OF(Tree_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Forest_t;

/*** <<< STAT-DEFS [Forest] >>> ***/

static asn_TYPE_member_t asn_MBR_Forest[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Tree,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Forest_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Forest_specs = {
	sizeof(struct Forest),
	offsetof(struct Forest, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Forest = {
	"Forest",
	"Forest",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Forest_tags,
	sizeof(asn_DEF_Forest_tags)
		/sizeof(asn_DEF_Forest_tags[0]), /* 1 */
	asn_DEF_Forest_tags,	/* Same as above */
	sizeof(asn_DEF_Forest_tags)
		/sizeof(asn_DEF_Forest_tags[0]), /* 1 */
	asn_MBR_Forest,
	1,	/* Single element */
	&asn_DEF_Forest_specs	/* Additional specs */
};


/*** <<< INCLUDES [Tree] >>> ***/

#include <INTEGER.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Tree] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Tree;

/*** <<< TYPE-DECLS [Tree] >>> ***/


typedef struct Tree {
	INTEGER_t	 height;
	INTEGER_t	 width;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Tree_t;

/*** <<< STAT-DEFS [Tree] >>> ***/

static asn_TYPE_member_t asn_MBR_Tree[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, height),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "height"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, width),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "width"
		},
};
static ber_tlv_tag_t asn_DEF_Tree_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Tree_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* width at 19 */
};
static asn_SEQUENCE_specifics_t asn_DEF_Tree_specs = {
	sizeof(struct Tree),
	offsetof(struct Tree, _asn_ctx),
	asn_DEF_Tree_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Tree = {
	"Tree",
	"Tree",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Tree_tags,
	sizeof(asn_DEF_Tree_tags)
		/sizeof(asn_DEF_Tree_tags[0]), /* 1 */
	asn_DEF_Tree_tags,	/* Same as above */
	sizeof(asn_DEF_Tree_tags)
		/sizeof(asn_DEF_Tree_tags[0]), /* 1 */
	asn_MBR_Tree,
	2,	/* Elements count */
	&asn_DEF_Tree_specs	/* Additional specs */
};


/*** <<< INCLUDES [Stuff] >>> ***/

#include <Forest.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <BIT_STRING.h>
#include <constr_SEQUENCE.h>
#include <INTEGER.h>
#include <constr_CHOICE.h>
#include <constr_SET.h>

/*** <<< DEPS [Stuff] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Stuff_PR {
	Stuff_PR_trees,	/* Member trees is present */
	Stuff_PR_anything,	/* Member anything is present */
	Stuff_PR_other,	/* Member other is present */
} Stuff_PR;
typedef enum other_PR {
	other_PR_NOTHING,	/* No components present */
	other_PR_a,
	other_PR_b,
} other_PR;
extern asn_TYPE_descriptor_t asn_DEF_Stuff;

/*** <<< TYPE-DECLS [Stuff] >>> ***/


typedef struct Stuff {
	struct trees {
		A_SET_OF(Forest_t) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *trees;
	struct anything {
		A_SET_OF(struct anything_Member {
			BIT_STRING_t	 cup_of_coffee;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} ) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *anything;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	struct other {
		other_PR present;
		union {
			INTEGER_t	 a;
			INTEGER_t	 b;
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *other;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */
	unsigned int _presence_map
		[((3+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Stuff_t;

/*** <<< STAT-DEFS [Stuff] >>> ***/

static asn_TYPE_member_t asn_MBR_trees[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Forest,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_trees_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_trees_specs = {
	sizeof(struct trees),
	offsetof(struct trees, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_trees = {
	"trees",
	"trees",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_trees_tags,
	sizeof(asn_DEF_trees_tags)
		/sizeof(asn_DEF_trees_tags[0]) - 1, /* 1 */
	asn_DEF_trees_tags,	/* Same as above */
	sizeof(asn_DEF_trees_tags)
		/sizeof(asn_DEF_trees_tags[0]), /* 2 */
	asn_MBR_trees,
	1,	/* Single element */
	&asn_DEF_trees_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_anything_Member[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct anything_Member, cup_of_coffee),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "cup-of-coffee"
		},
};
static ber_tlv_tag_t asn_DEF_anything_Member_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_anything_Member_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* cup-of-coffee at 32 */
};
static asn_SEQUENCE_specifics_t asn_DEF_anything_Member_specs = {
	sizeof(struct anything_Member),
	offsetof(struct anything_Member, _asn_ctx),
	asn_DEF_anything_Member_tag2el,
	1,	/* Count of tags in the map */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_anything_Member = {
	"",
	"",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_anything_Member_tags,
	sizeof(asn_DEF_anything_Member_tags)
		/sizeof(asn_DEF_anything_Member_tags[0]), /* 1 */
	asn_DEF_anything_Member_tags,	/* Same as above */
	sizeof(asn_DEF_anything_Member_tags)
		/sizeof(asn_DEF_anything_Member_tags[0]), /* 1 */
	asn_MBR_anything_Member,
	1,	/* Elements count */
	&asn_DEF_anything_Member_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_anything[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_anything_Member,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_anything_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_anything_specs = {
	sizeof(struct anything),
	offsetof(struct anything, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_anything = {
	"anything",
	"anything",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_anything_tags,
	sizeof(asn_DEF_anything_tags)
		/sizeof(asn_DEF_anything_tags[0]) - 1, /* 1 */
	asn_DEF_anything_tags,	/* Same as above */
	sizeof(asn_DEF_anything_tags)
		/sizeof(asn_DEF_anything_tags[0]), /* 2 */
	asn_MBR_anything,
	1,	/* Single element */
	&asn_DEF_anything_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_other[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct other, choice.a),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "a"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct other, choice.b),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "b"
		},
};
static asn_TYPE_tag2member_t asn_DEF_other_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 26 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* b at 28 */
};
static asn_CHOICE_specifics_t asn_DEF_other_specs = {
	sizeof(struct other),
	offsetof(struct other, _asn_ctx),
	offsetof(struct other, present),
	sizeof(((struct other *)0)->present),
	asn_DEF_other_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_other = {
	"other",
	"other",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_other,
	2,	/* Elements count */
	&asn_DEF_other_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Stuff[] = {
	{ ATF_POINTER, 3, offsetof(struct Stuff, trees),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_trees,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "trees"
		},
	{ ATF_POINTER, 2, offsetof(struct Stuff, anything),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_anything,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "anything"
		},
	{ ATF_POINTER, 0, offsetof(struct Stuff, other),
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = (void *)&asn_DEF_other,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "other"
		},
};
static ber_tlv_tag_t asn_DEF_Stuff_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a at 26 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 } /* b at 28 */
};
static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el_cxer[] = {
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 } /* a at 26 */
};
static uint8_t asn_DEF_Stuff_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6) | (0 << 5)
};
static asn_SET_specifics_t asn_DEF_Stuff_specs = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _asn_ctx),
	offsetof(struct Stuff, _presence_map),
	asn_DEF_Stuff_tag2el,
	4,	/* Count of tags in the map */
	asn_DEF_Stuff_tag2el_cxer,
	3,	/* Count of tags in the CXER map */
	1,	/* Whether extensible */
	(unsigned int *)asn_DEF_Stuff_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_Stuff = {
	"Stuff",
	"Stuff",
	SET_free,
	SET_print,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_decode_xer,
	SET_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Stuff_tags,
	sizeof(asn_DEF_Stuff_tags)
		/sizeof(asn_DEF_Stuff_tags[0]), /* 1 */
	asn_DEF_Stuff_tags,	/* Same as above */
	sizeof(asn_DEF_Stuff_tags)
		/sizeof(asn_DEF_Stuff_tags[0]), /* 1 */
	asn_MBR_Stuff,
	3,	/* Elements count */
	&asn_DEF_Stuff_specs	/* Additional specs */
};

