/*
 * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
 * From ASN.1 module "X2AP-PDU-Contents"
 * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
 * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
 */

#include "Old-ECGIs.h"

#include "ECGI.h"
static asn_per_constraints_t asn_PER_type_Old_ECGIs_constr_1 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_CONSTRAINED,	 8,  8,  1,  256 }	/* (SIZE(1..256)) */,
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_Old_ECGIs_1[] = {
	{ ATF_POINTER, 0, 0,
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_ECGI,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		""
		},
};
static const ber_tlv_tag_t asn_DEF_Old_ECGIs_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Old_ECGIs_specs_1 = {
	sizeof(struct Old_ECGIs),
	offsetof(struct Old_ECGIs, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Old_ECGIs = {
	"Old-ECGIs",
	"Old-ECGIs",
	&asn_OP_SEQUENCE_OF,
	asn_DEF_Old_ECGIs_tags_1,
	sizeof(asn_DEF_Old_ECGIs_tags_1)
		/sizeof(asn_DEF_Old_ECGIs_tags_1[0]), /* 1 */
	asn_DEF_Old_ECGIs_tags_1,	/* Same as above */
	sizeof(asn_DEF_Old_ECGIs_tags_1)
		/sizeof(asn_DEF_Old_ECGIs_tags_1[0]), /* 1 */
	{ 0, &asn_PER_type_Old_ECGIs_constr_1, SEQUENCE_OF_constraint },
	asn_MBR_Old_ECGIs_1,
	1,	/* Single element */
	&asn_SPC_Old_ECGIs_specs_1	/* Additional specs */
};

