
/*** <<< INCLUDES [Programming] >>> ***/

#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

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

struct Fault;

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

typedef struct Programming {
	A_SEQUENCE_OF(struct Fault) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Programming_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Programming;

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

#include "Fault.h"

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

static asn_TYPE_member_t asn_MBR_Programming_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Fault,
		.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_Programming_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Programming_specs_1 = {
	sizeof(struct Programming),
	offsetof(struct Programming, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Programming = {
	"Programming",
	"Programming",
	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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Programming_tags_1,
	sizeof(asn_DEF_Programming_tags_1)
		/sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */
	asn_DEF_Programming_tags_1,	/* Same as above */
	sizeof(asn_DEF_Programming_tags_1)
		/sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Programming_1,
	1,	/* Single element */
	&asn_SPC_Programming_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Fault] >>> ***/

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

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

struct Error;

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

typedef struct Fault {
	A_SET_OF(struct Error) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Fault_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Fault;

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

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_Fault_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.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_Fault_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Fault_specs_1 = {
	sizeof(struct Fault),
	offsetof(struct Fault, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Fault = {
	"Fault",
	"Fault",
	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_Fault_tags_1,
	sizeof(asn_DEF_Fault_tags_1)
		/sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */
	asn_DEF_Fault_tags_1,	/* Same as above */
	sizeof(asn_DEF_Fault_tags_1)
		/sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_Fault_1,
	1,	/* Single element */
	&asn_SPC_Fault_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Error] >>> ***/

#include <constr_SEQUENCE.h>

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

typedef struct Error {
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Error_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Error;

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

static const ber_tlv_tag_t asn_DEF_Error_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SEQUENCE_specifics_t asn_SPC_Error_specs_1 = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Error = {
	"Error",
	"Error",
	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_Error_tags_1,
	sizeof(asn_DEF_Error_tags_1)
		/sizeof(asn_DEF_Error_tags_1[0]), /* 1 */
	asn_DEF_Error_tags_1,	/* Same as above */
	sizeof(asn_DEF_Error_tags_1)
		/sizeof(asn_DEF_Error_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	&asn_SPC_Error_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqWithMandatory] >>> ***/

#include <UTF8String.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

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

struct Error;

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

typedef struct SeqWithMandatory {
	UTF8String_t	 someString;
	struct seqOfMan {
		A_SEQUENCE_OF(struct Error) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} seqOfMan;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqWithMandatory_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SeqWithMandatory;

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

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_seqOfMan_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.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_seqOfMan_tags_3[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_seqOfMan_specs_3 = {
	sizeof(struct seqOfMan),
	offsetof(struct seqOfMan, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_seqOfMan_3 = {
	"seqOfMan",
	"seqOfMan",
	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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_seqOfMan_tags_3,
	sizeof(asn_DEF_seqOfMan_tags_3)
		/sizeof(asn_DEF_seqOfMan_tags_3[0]), /* 2 */
	asn_DEF_seqOfMan_tags_3,	/* Same as above */
	sizeof(asn_DEF_seqOfMan_tags_3)
		/sizeof(asn_DEF_seqOfMan_tags_3[0]), /* 2 */
	0,	/* No PER visible constraints */
	asn_MBR_seqOfMan_3,
	1,	/* Single element */
	&asn_SPC_seqOfMan_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SeqWithMandatory_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, someString),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "someString"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, seqOfMan),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_seqOfMan_3,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "seqOfMan"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqWithMandatory_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SeqWithMandatory_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 0, 0, 0 }, /* someString */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* seqOfMan */
};
static asn_SEQUENCE_specifics_t asn_SPC_SeqWithMandatory_specs_1 = {
	sizeof(struct SeqWithMandatory),
	offsetof(struct SeqWithMandatory, _asn_ctx),
	asn_MAP_SeqWithMandatory_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_SeqWithMandatory = {
	"SeqWithMandatory",
	"SeqWithMandatory",
	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_SeqWithMandatory_tags_1,
	sizeof(asn_DEF_SeqWithMandatory_tags_1)
		/sizeof(asn_DEF_SeqWithMandatory_tags_1[0]), /* 1 */
	asn_DEF_SeqWithMandatory_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqWithMandatory_tags_1)
		/sizeof(asn_DEF_SeqWithMandatory_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_SeqWithMandatory_1,
	2,	/* Elements count */
	&asn_SPC_SeqWithMandatory_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqWithOptional] >>> ***/

#include <UTF8String.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

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

struct Error;

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

typedef struct SeqWithOptional {
	UTF8String_t	 someString;
	struct seqOfOpt {
		A_SEQUENCE_OF(struct Error) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *seqOfOpt;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqWithOptional_t;

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

extern asn_TYPE_descriptor_t asn_DEF_SeqWithOptional;

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

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_seqOfOpt_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.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_seqOfOpt_tags_3[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_seqOfOpt_specs_3 = {
	sizeof(struct seqOfOpt),
	offsetof(struct seqOfOpt, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_seqOfOpt_3 = {
	"seqOfOpt",
	"seqOfOpt",
	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, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_seqOfOpt_tags_3,
	sizeof(asn_DEF_seqOfOpt_tags_3)
		/sizeof(asn_DEF_seqOfOpt_tags_3[0]), /* 2 */
	asn_DEF_seqOfOpt_tags_3,	/* Same as above */
	sizeof(asn_DEF_seqOfOpt_tags_3)
		/sizeof(asn_DEF_seqOfOpt_tags_3[0]), /* 2 */
	0,	/* No PER visible constraints */
	asn_MBR_seqOfOpt_3,
	1,	/* Single element */
	&asn_SPC_seqOfOpt_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SeqWithOptional_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithOptional, someString),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "someString"
		},
	{ ATF_POINTER, 1, offsetof(struct SeqWithOptional, seqOfOpt),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_seqOfOpt_3,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "seqOfOpt"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqWithOptional_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SeqWithOptional_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 0, 0, 0 }, /* someString */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* seqOfOpt */
};
static asn_SEQUENCE_specifics_t asn_SPC_SeqWithOptional_specs_1 = {
	sizeof(struct SeqWithOptional),
	offsetof(struct SeqWithOptional, _asn_ctx),
	asn_MAP_SeqWithOptional_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_SeqWithOptional = {
	"SeqWithOptional",
	"SeqWithOptional",
	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_SeqWithOptional_tags_1,
	sizeof(asn_DEF_SeqWithOptional_tags_1)
		/sizeof(asn_DEF_SeqWithOptional_tags_1[0]), /* 1 */
	asn_DEF_SeqWithOptional_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqWithOptional_tags_1)
		/sizeof(asn_DEF_SeqWithOptional_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_SeqWithOptional_1,
	2,	/* Elements count */
	&asn_SPC_SeqWithOptional_specs_1	/* Additional specs */
};

