/*
 * 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_Shared-Network-Information.h"

static asn_TYPE_member_t asn_MBR_RANAP_Shared_Network_Information_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Shared_Network_Information, pLMNs_in_shared_network),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_PLMNs_in_shared_network,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"pLMNs-in-shared-network"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_Shared_Network_Information, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_RANAP_Shared_Network_Information_oms_1[] = { 1 };
static const ber_tlv_tag_t asn_DEF_RANAP_Shared_Network_Information_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_Shared_Network_Information_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNs-in-shared-network */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Shared_Network_Information_specs_1 = {
	sizeof(struct RANAP_Shared_Network_Information),
	offsetof(struct RANAP_Shared_Network_Information, _asn_ctx),
	asn_MAP_RANAP_Shared_Network_Information_tag2el_1,
	2,	/* Count of tags in the map */
	asn_MAP_RANAP_Shared_Network_Information_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_Shared_Network_Information = {
	"RANAP_Shared-Network-Information",
	"RANAP_Shared-Network-Information",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	SEQUENCE_decode_uper,
	SEQUENCE_encode_uper,
	SEQUENCE_decode_aper,
	SEQUENCE_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RANAP_Shared_Network_Information_tags_1,
	sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1)
		/sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1[0]), /* 1 */
	asn_DEF_RANAP_Shared_Network_Information_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1)
		/sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_Shared_Network_Information_1,
	2,	/* Elements count */
	&asn_SPC_RANAP_Shared_Network_Information_specs_1	/* Additional specs */
};

