/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RANAP-IEs"
 * 	found in "../../asn1/ranap/RANAP-IEs.asn"
 */

#include "RANAP_AuthorisedSNAs.h"

static asn_per_constraints_t asn_PER_type_RANAP_AuthorisedSNAs_constr_1 GCC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_RANAP_AuthorisedSNAs_1[] = {
	{ ATF_POINTER, 0, 0,
		-1 /* Ambiguous tag (CHOICE?) */,
		0,
		&asn_DEF_RANAP_SNAC,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		""
		},
};
static const ber_tlv_tag_t asn_DEF_RANAP_AuthorisedSNAs_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_RANAP_AuthorisedSNAs_specs_1 = {
	sizeof(struct RANAP_AuthorisedSNAs),
	offsetof(struct RANAP_AuthorisedSNAs, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_AuthorisedSNAs = {
	"RANAP_AuthorisedSNAs",
	"RANAP_AuthorisedSNAs",
	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,
	SEQUENCE_OF_decode_uper,
	SEQUENCE_OF_encode_uper,
	SEQUENCE_OF_decode_aper,
	SEQUENCE_OF_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RANAP_AuthorisedSNAs_tags_1,
	sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1)
		/sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1[0]), /* 1 */
	asn_DEF_RANAP_AuthorisedSNAs_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1)
		/sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1[0]), /* 1 */
	&asn_PER_type_RANAP_AuthorisedSNAs_constr_1,
	asn_MBR_RANAP_AuthorisedSNAs_1,
	1,	/* Single element */
	&asn_SPC_RANAP_AuthorisedSNAs_specs_1	/* Additional specs */
};

