/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "HNBAP-IEs"
 * 	found in "../../asn1/hnbap/HNBAP-IEs.asn"
 * 	`asn1c -gen-PER`
 */

#include "UE-Capabilities.h"

static asn_TYPE_member_t asn_MBR_UE_Capabilities_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct UE_Capabilities, access_stratum_release_indicator),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Access_stratum_release_indicator,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"access-stratum-release-indicator"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct UE_Capabilities, csg_capability),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_CSG_Capability,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"csg-capability"
		},
	{ ATF_POINTER, 1, offsetof(struct UE_Capabilities, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_UE_Capabilities_oms_1[] = { 2 };
static const ber_tlv_tag_t asn_DEF_UE_Capabilities_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_UE_Capabilities_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* access-stratum-release-indicator */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* csg-capability */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_UE_Capabilities_specs_1 = {
	sizeof(struct UE_Capabilities),
	offsetof(struct UE_Capabilities, _asn_ctx),
	asn_MAP_UE_Capabilities_tag2el_1,
	3,	/* Count of tags in the map */
	asn_MAP_UE_Capabilities_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	2,	/* Start extensions */
	4	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_UE_Capabilities = {
	"UE-Capabilities",
	"UE-Capabilities",
	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_UE_Capabilities_tags_1,
	sizeof(asn_DEF_UE_Capabilities_tags_1)
		/sizeof(asn_DEF_UE_Capabilities_tags_1[0]), /* 1 */
	asn_DEF_UE_Capabilities_tags_1,	/* Same as above */
	sizeof(asn_DEF_UE_Capabilities_tags_1)
		/sizeof(asn_DEF_UE_Capabilities_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_UE_Capabilities_1,
	3,	/* Elements count */
	&asn_SPC_UE_Capabilities_specs_1	/* Additional specs */
};

