
/*** <<< INCLUDES [Test-structure-1] >>> ***/

#include <Test-structure-1.h>
#include <INTEGER.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Test-structure-1] >>> ***/


struct Test_structure_1;	/* Forward declaration */
extern asn_TYPE_descriptor_t asn_DEF_Test_structure_1;

/*** <<< TYPE-DECLS [Test-structure-1] >>> ***/


typedef struct Test_structure_1 {
	struct t_member1 {
		A_SET_OF(struct Test_structure_1) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} t_member1;
	struct t_member2 {
		A_SEQUENCE_OF(struct Test_structure_1) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} t_member2;
	struct Test_structure_1	*t_member3	/* OPTIONAL */;
	INTEGER_t	 t_member4;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Test_structure_1_t;

/*** <<< STAT-DEFS [Test-structure-1] >>> ***/

static asn_TYPE_member_t asn_MBR_t_member1[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Test_structure_1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_t_member1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_t_member1_specs = {
	sizeof(struct t_member1),
	offsetof(struct t_member1, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_t_member1 = {
	"t-member1",
	"t-member1",
	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_t_member1_tags,
	sizeof(asn_DEF_t_member1_tags)
		/sizeof(asn_DEF_t_member1_tags[0]), /* 1 */
	asn_DEF_t_member1_tags,	/* Same as above */
	sizeof(asn_DEF_t_member1_tags)
		/sizeof(asn_DEF_t_member1_tags[0]), /* 1 */
	asn_MBR_t_member1,
	1,	/* Single element */
	&asn_DEF_t_member1_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_t_member2[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Test_structure_1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_t_member2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_t_member2_specs = {
	sizeof(struct t_member2),
	offsetof(struct t_member2, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_t_member2 = {
	"t-member2",
	"t-member2",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_t_member2_tags,
	sizeof(asn_DEF_t_member2_tags)
		/sizeof(asn_DEF_t_member2_tags[0]), /* 1 */
	asn_DEF_t_member2_tags,	/* Same as above */
	sizeof(asn_DEF_t_member2_tags)
		/sizeof(asn_DEF_t_member2_tags[0]), /* 1 */
	asn_MBR_t_member2,
	1,	/* Single element */
	&asn_DEF_t_member2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Test_structure_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member1),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_t_member1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "t-member1"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member2),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_t_member2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "t-member2"
		},
	{ ATF_POINTER, 1, offsetof(struct Test_structure_1, t_member3),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Test_structure_1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "t-member3"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member4),
		.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 = "t-member4"
		},
};
static ber_tlv_tag_t asn_DEF_Test_structure_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Test_structure_1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, 0, 0 }, /* t-member4 at 19 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* t-member2 at 16 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 }, /* t-member3 at 17 */
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* t-member1 at 15 */
};
static asn_SEQUENCE_specifics_t asn_DEF_Test_structure_1_specs = {
	sizeof(struct Test_structure_1),
	offsetof(struct Test_structure_1, _asn_ctx),
	asn_DEF_Test_structure_1_tag2el,
	4,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Test_structure_1 = {
	"Test-structure-1",
	"Test-structure-1",
	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_Test_structure_1_tags,
	sizeof(asn_DEF_Test_structure_1_tags)
		/sizeof(asn_DEF_Test_structure_1_tags[0]), /* 1 */
	asn_DEF_Test_structure_1_tags,	/* Same as above */
	sizeof(asn_DEF_Test_structure_1_tags)
		/sizeof(asn_DEF_Test_structure_1_tags[0]), /* 1 */
	asn_MBR_Test_structure_1,
	4,	/* Elements count */
	&asn_DEF_Test_structure_1_specs	/* Additional specs */
};


/*** <<< INCLUDES [Choice-1] >>> ***/

#include <Choice-1.h>
#include <INTEGER.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [Choice-1] >>> ***/

typedef enum Choice_1_PR {
	Choice_1_PR_NOTHING,	/* No components present */
	Choice_1_PR_and,
	Choice_1_PR_or,
	Choice_1_PR_not,
	Choice_1_PR_other,
} Choice_1_PR;

struct Choice_1;	/* Forward declaration */

struct Choice_1;	/* Forward declaration */
extern asn_TYPE_descriptor_t asn_DEF_Choice_1;

/*** <<< TYPE-DECLS [Choice-1] >>> ***/


typedef struct Choice_1 {
	Choice_1_PR present;
	union {
		struct Choice_1	*and;
		struct or {
			A_SET_OF(struct Choice_1) list;
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} or;
		struct Choice_1	*not;
		INTEGER_t	 other;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Choice_1_t;

/*** <<< STAT-DEFS [Choice-1] >>> ***/

static asn_TYPE_member_t asn_MBR_or[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Choice_1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_or_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_or_specs = {
	sizeof(struct or),
	offsetof(struct or, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_or = {
	"or",
	"or",
	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_or_tags,
	sizeof(asn_DEF_or_tags)
		/sizeof(asn_DEF_or_tags[0]) - 1, /* 1 */
	asn_DEF_or_tags,	/* Same as above */
	sizeof(asn_DEF_or_tags)
		/sizeof(asn_DEF_or_tags[0]), /* 2 */
	asn_MBR_or,
	1,	/* Single element */
	&asn_DEF_or_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Choice_1[] = {
	{ ATF_POINTER, 0, offsetof(struct Choice_1, choice.and),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = (void *)&asn_DEF_Choice_1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "and"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.or),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_or,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "or"
		},
	{ ATF_POINTER, 0, offsetof(struct Choice_1, choice.not),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = (void *)&asn_DEF_Choice_1,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "not"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.other),
		.tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "other"
		},
};
static asn_TYPE_tag2member_t asn_DEF_Choice_1_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* and at 22 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* or at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* not at 24 */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 }, /* other at 26 */
};
static asn_CHOICE_specifics_t asn_DEF_Choice_1_specs = {
	sizeof(struct Choice_1),
	offsetof(struct Choice_1, _asn_ctx),
	offsetof(struct Choice_1, present),
	sizeof(((struct Choice_1 *)0)->present),
	asn_DEF_Choice_1_tag2el,
	4,	/* Count of tags in the map */
	0	/* Whether extensible */
};
asn_TYPE_descriptor_t asn_DEF_Choice_1 = {
	"Choice-1",
	"Choice-1",
	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_Choice_1,
	4,	/* Elements count */
	&asn_DEF_Choice_1_specs	/* Additional specs */
};


/*** <<< INCLUDES [Test-structure-2] >>> ***/

#include <Test-structure-3.h>
#include <constr_SET.h>

/*** <<< DEPS [Test-structure-2] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Test_structure_2_PR {
	Test_structure_2_PR_m1,	/* Member m1 is present */
} Test_structure_2_PR;

struct Test_structure_3;	/* Forward declaration */
extern asn_TYPE_descriptor_t asn_DEF_Test_structure_2;

/*** <<< TYPE-DECLS [Test-structure-2] >>> ***/


typedef struct Test_structure_2 {
	struct Test_structure_3	*m1	/* OPTIONAL */;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pTest_structure_2, Test_structure_2_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Test_structure_2_t;

/*** <<< STAT-DEFS [Test-structure-2] >>> ***/

static asn_TYPE_member_t asn_MBR_Test_structure_2[] = {
	{ ATF_POINTER, 1, offsetof(struct Test_structure_2, m1),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Test_structure_3,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "m1"
		},
};
static ber_tlv_tag_t asn_DEF_Test_structure_2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Test_structure_2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* m1 at 28 */
};
static uint8_t asn_DEF_Test_structure_2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7)
};
static asn_SET_specifics_t asn_DEF_Test_structure_2_specs = {
	sizeof(struct Test_structure_2),
	offsetof(struct Test_structure_2, _asn_ctx),
	offsetof(struct Test_structure_2, _presence_map),
	asn_DEF_Test_structure_2_tag2el,
	1,	/* Count of tags in the map */
	asn_DEF_Test_structure_2_tag2el,	/* Same as above */
	1,	/* Count of tags in the CANONICAL-XER map */
	0,	/* Whether extensible */
	(unsigned int *)asn_DEF_Test_structure_2_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_Test_structure_2 = {
	"Test-structure-2",
	"Test-structure-2",
	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_Test_structure_2_tags,
	sizeof(asn_DEF_Test_structure_2_tags)
		/sizeof(asn_DEF_Test_structure_2_tags[0]), /* 1 */
	asn_DEF_Test_structure_2_tags,	/* Same as above */
	sizeof(asn_DEF_Test_structure_2_tags)
		/sizeof(asn_DEF_Test_structure_2_tags[0]), /* 1 */
	asn_MBR_Test_structure_2,
	1,	/* Elements count */
	&asn_DEF_Test_structure_2_specs	/* Additional specs */
};


/*** <<< INCLUDES [Test-structure-3] >>> ***/

#include <Test-structure-2.h>
#include <constr_SET.h>

/*** <<< DEPS [Test-structure-3] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Test_structure_3_PR {
	Test_structure_3_PR_m1,	/* Member m1 is present */
} Test_structure_3_PR;

struct Test_structure_2;	/* Forward declaration */
extern asn_TYPE_descriptor_t asn_DEF_Test_structure_3;

/*** <<< TYPE-DECLS [Test-structure-3] >>> ***/


typedef struct Test_structure_3 {
	struct Test_structure_2	*m1	/* OPTIONAL */;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pTest_structure_3, Test_structure_3_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Test_structure_3_t;

/*** <<< STAT-DEFS [Test-structure-3] >>> ***/

static asn_TYPE_member_t asn_MBR_Test_structure_3[] = {
	{ ATF_POINTER, 1, offsetof(struct Test_structure_3, m1),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Test_structure_2,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "m1"
		},
};
static ber_tlv_tag_t asn_DEF_Test_structure_3_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Test_structure_3_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* m1 at 29 */
};
static uint8_t asn_DEF_Test_structure_3_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7)
};
static asn_SET_specifics_t asn_DEF_Test_structure_3_specs = {
	sizeof(struct Test_structure_3),
	offsetof(struct Test_structure_3, _asn_ctx),
	offsetof(struct Test_structure_3, _presence_map),
	asn_DEF_Test_structure_3_tag2el,
	1,	/* Count of tags in the map */
	asn_DEF_Test_structure_3_tag2el,	/* Same as above */
	1,	/* Count of tags in the CANONICAL-XER map */
	0,	/* Whether extensible */
	(unsigned int *)asn_DEF_Test_structure_3_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_Test_structure_3 = {
	"Test-structure-3",
	"Test-structure-3",
	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_Test_structure_3_tags,
	sizeof(asn_DEF_Test_structure_3_tags)
		/sizeof(asn_DEF_Test_structure_3_tags[0]), /* 1 */
	asn_DEF_Test_structure_3_tags,	/* Same as above */
	sizeof(asn_DEF_Test_structure_3_tags)
		/sizeof(asn_DEF_Test_structure_3_tags[0]), /* 1 */
	asn_MBR_Test_structure_3,
	1,	/* Elements count */
	&asn_DEF_Test_structure_3_specs	/* Additional specs */
};

