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

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

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

struct Tree;

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Forest;

/*** <<< POST-INCLUDE [Forest] >>> ***/

#include "Tree.h"

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

static asn_TYPE_member_t asn_MBR_Forest_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Tree,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Forest_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Forest_specs_1 = {
	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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Forest_tags_1,
	sizeof(asn_DEF_Forest_tags_1)
		/sizeof(asn_DEF_Forest_tags_1[0]), /* 1 */
	asn_DEF_Forest_tags_1,	/* Same as above */
	sizeof(asn_DEF_Forest_tags_1)
		/sizeof(asn_DEF_Forest_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Forest_1,
	1,	/* Single element */
	&asn_SPC_Forest_specs_1	/* Additional specs */
};


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

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Tree;

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

static asn_TYPE_member_t asn_MBR_Tree_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, height),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "height"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, width),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "width"
		},
};
static const ber_tlv_tag_t asn_DEF_Tree_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Tree_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* width */
};
static asn_SEQUENCE_specifics_t asn_SPC_Tree_specs_1 = {
	sizeof(struct Tree),
	offsetof(struct Tree, _asn_ctx),
	asn_MAP_Tree_tag2el_1,
	2,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Tree_tags_1,
	sizeof(asn_DEF_Tree_tags_1)
		/sizeof(asn_DEF_Tree_tags_1[0]), /* 1 */
	asn_DEF_Tree_tags_1,	/* Same as above */
	sizeof(asn_DEF_Tree_tags_1)
		/sizeof(asn_DEF_Tree_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Tree_1,
	2,	/* Elements count */
	&asn_SPC_Tree_specs_1	/* Additional specs */
};


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

#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;

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

struct Forest;

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

typedef struct 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;
} Member;

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

typedef struct Stuff {
	struct trees {
		A_SET_OF(struct Forest) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *trees;
	struct anything {
		A_SET_OF(Member) 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 Stuff__other_u {
			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;

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

extern asn_TYPE_descriptor_t asn_DEF_Stuff;

/*** <<< POST-INCLUDE [Stuff] >>> ***/

#include "Forest.h"

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

static asn_TYPE_member_t asn_MBR_trees_2[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Forest,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_trees_tags_2[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_trees_specs_2 = {
	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_2 = {
	"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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_trees_tags_2,
	sizeof(asn_DEF_trees_tags_2)
		/sizeof(asn_DEF_trees_tags_2[0]) - 1, /* 1 */
	asn_DEF_trees_tags_2,	/* Same as above */
	sizeof(asn_DEF_trees_tags_2)
		/sizeof(asn_DEF_trees_tags_2[0]), /* 2 */
	0,	/* No PER visible constraints */
	asn_MBR_trees_2,
	1,	/* Single element */
	&asn_SPC_trees_specs_2	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Member_5[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Member, cup_of_coffee),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "cup-of-coffee"
		},
};
static const ber_tlv_tag_t asn_DEF_Member_tags_5[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_5[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* cup-of-coffee */
};
static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_5 = {
	sizeof(struct Member),
	offsetof(struct Member, _asn_ctx),
	asn_MAP_Member_tag2el_5,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_Member_5 = {
	"SEQUENCE",
	"SEQUENCE",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Member_tags_5,
	sizeof(asn_DEF_Member_tags_5)
		/sizeof(asn_DEF_Member_tags_5[0]), /* 1 */
	asn_DEF_Member_tags_5,	/* Same as above */
	sizeof(asn_DEF_Member_tags_5)
		/sizeof(asn_DEF_Member_tags_5[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Member_5,
	1,	/* Elements count */
	&asn_SPC_Member_specs_5	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_anything_4[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Member_5,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_anything_tags_4[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_anything_specs_4 = {
	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_4 = {
	"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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_anything_tags_4,
	sizeof(asn_DEF_anything_tags_4)
		/sizeof(asn_DEF_anything_tags_4[0]) - 1, /* 1 */
	asn_DEF_anything_tags_4,	/* Same as above */
	sizeof(asn_DEF_anything_tags_4)
		/sizeof(asn_DEF_anything_tags_4[0]), /* 2 */
	0,	/* No PER visible constraints */
	asn_MBR_anything_4,
	1,	/* Single element */
	&asn_SPC_anything_specs_4	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_other_9[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct other, choice.a),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.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 = &asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "b"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_other_tag2el_9[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 } /* b */
};
static asn_CHOICE_specifics_t asn_SPC_other_specs_9 = {
	sizeof(struct other),
	offsetof(struct other, _asn_ctx),
	offsetof(struct other, present),
	sizeof(((struct other *)0)->present),
	asn_MAP_other_tag2el_9,
	2,	/* Count of tags in the map */
	.canonical_order = 0,
	.ext_start = -1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_other_9 = {
	"other",
	"other",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No PER visible constraints */
	asn_MBR_other_9,
	2,	/* Elements count */
	&asn_SPC_other_specs_9	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Stuff_1[] = {
	{ ATF_POINTER, 3, offsetof(struct Stuff, trees),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_trees_2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "trees"
		},
	{ ATF_POINTER, 2, offsetof(struct Stuff, anything),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_anything_4,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "anything"
		},
	{ ATF_POINTER, 1, offsetof(struct Stuff, other),
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = &asn_DEF_other_9,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "other"
		},
};
static const ber_tlv_tag_t asn_DEF_Stuff_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Stuff_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 } /* b */
};
static const asn_TYPE_tag2member_t asn_MAP_Stuff_tag2el_cxer_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 } /* a */
};
static const uint8_t asn_MAP_Stuff_mmap_1[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6) | (0 << 5)
};
static asn_SET_specifics_t asn_SPC_Stuff_specs_1 = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _asn_ctx),
	offsetof(struct Stuff, _presence_map),
	asn_MAP_Stuff_tag2el_1,
	4,	/* Count of tags in the map */
	asn_MAP_Stuff_tag2el_cxer_1,
	3,	/* Count of tags in the CXER map */
	1,	/* Whether extensible */
	(unsigned int *)asn_MAP_Stuff_mmap_1	/* 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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Stuff_tags_1,
	sizeof(asn_DEF_Stuff_tags_1)
		/sizeof(asn_DEF_Stuff_tags_1[0]), /* 1 */
	asn_DEF_Stuff_tags_1,	/* Same as above */
	sizeof(asn_DEF_Stuff_tags_1)
		/sizeof(asn_DEF_Stuff_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Stuff_1,
	3,	/* Elements count */
	&asn_SPC_Stuff_specs_1	/* Additional specs */
};

