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

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

/*** <<< DEPS [Programming] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Programming;

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


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

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

static asn_TYPE_member_t asn_MBR_Programming[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_Fault,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Programming_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Programming_specs = {
	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,
	0,				/* Not implemented yet */
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Programming_tags,
	sizeof(asn_DEF_Programming_tags)
		/sizeof(asn_DEF_Programming_tags[0]), /* 1 */
	asn_DEF_Programming_tags,	/* Same as above */
	sizeof(asn_DEF_Programming_tags)
		/sizeof(asn_DEF_Programming_tags[0]), /* 1 */
	asn_MBR_Programming,
	1,	/* Single element */
	&asn_DEF_Programming_specs	/* Additional specs */
};


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

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

/*** <<< DEPS [Fault] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Fault;

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


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

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

static asn_TYPE_member_t asn_MBR_Fault[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Error,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Fault_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Fault_specs = {
	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,
	0,				/* Not implemented yet */
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Fault_tags,
	sizeof(asn_DEF_Fault_tags)
		/sizeof(asn_DEF_Fault_tags[0]), /* 1 */
	asn_DEF_Fault_tags,	/* Same as above */
	sizeof(asn_DEF_Fault_tags)
		/sizeof(asn_DEF_Fault_tags[0]), /* 1 */
	asn_MBR_Fault,
	1,	/* Single element */
	&asn_DEF_Fault_specs	/* Additional specs */
};


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

#include <constr_SEQUENCE.h>

/*** <<< DEPS [Error] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Error;

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

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

static ber_tlv_tag_t asn_DEF_Error_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Error_tag2el[] = {
};
static asn_SEQUENCE_specifics_t asn_DEF_Error_specs = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	asn_DEF_Error_tag2el,
	0,	/* Count of tags in the map */
	-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,	/* Use generic outmost tag fetcher */
	asn_DEF_Error_tags,
	sizeof(asn_DEF_Error_tags)
		/sizeof(asn_DEF_Error_tags[0]), /* 1 */
	asn_DEF_Error_tags,	/* Same as above */
	sizeof(asn_DEF_Error_tags)
		/sizeof(asn_DEF_Error_tags[0]), /* 1 */
	0, 0,	/* No members */
	&asn_DEF_Error_specs	/* Additional specs */
};

