Enhanced SIM for E2AP v1 for TS UC
[sim/e2-interface.git] / e2sim / e2apv1sim / src / ASN1 / generated / X2AP-IEs.hpp
diff --git a/e2sim/e2apv1sim/src/ASN1/generated/X2AP-IEs.hpp b/e2sim/e2apv1sim/src/ASN1/generated/X2AP-IEs.hpp
new file mode 100644 (file)
index 0000000..f056563
--- /dev/null
@@ -0,0 +1,35962 @@
+/*****************************************************************************
+# Copyright 2019 AT&T Intellectual Property                                  *
+#                                                                            *
+# Licensed under the Apache License, Version 2.0 (the "License");            *
+# you may not use this file except in compliance with the License.           *
+# You may obtain a copy of the License at                                    *
+#                                                                            *
+#      http://www.apache.org/licenses/LICENSE-2.0                            *
+#                                                                            *
+# Unless required by applicable law or agreed to in writing, software        *
+# distributed under the License is distributed on an "AS IS" BASIS,          *
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *
+# See the License for the specific language governing permissions and        *
+# limitations under the License.                                             *
+#                                                                            *
+******************************************************************************/
+
+#pragma once
+
+#include "asn/asn.hpp"
+static_assert(ASN_API_VERSION_MAJOR == 5, "re-generate the ASN parser's code using 'make regen-asn' (do not use -j option)");
+
+#include "X2AP-Constants.hpp"
+#include "X2AP-CommonDataTypes.hpp"
+#include "X2AP-Containers.hpp"
+
+/*
+DL-ABS-status::= INTEGER (0..100)
+*/
+
+struct DL_ABS_status : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "DL-ABS-status";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UsableABSInformationFDD-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UsableABSInformationFDD_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UsableABSInformationFDD ::= SEQUENCE {
+       usable-abs-pattern-info                         BIT STRING (SIZE(40)),
+       iE-Extensions                                           ProtocolExtensionContainer { {UsableABSInformationFDD-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UsableABSInformationFDD : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "UsableABSInformationFDD";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct usable_abs_pattern_info_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<40>>;
+               static constexpr const char* name() {return "usable_abs_pattern_info_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       usable_abs_pattern_info_t& ref_usable_abs_pattern_info() {return usable_abs_pattern_info;}
+       usable_abs_pattern_info_t const& ref_usable_abs_pattern_info() const {return usable_abs_pattern_info;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UsableABSInformationFDD_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UsableABSInformationFDD_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(usable_abs_pattern_info);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(usable_abs_pattern_info);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               usable_abs_pattern_info.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       usable_abs_pattern_info_t       usable_abs_pattern_info;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UsableABSInformationTDD-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UsableABSInformationTDD_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UsableABSInformationTDD ::= SEQUENCE {
+       usaable-abs-pattern-info                        BIT STRING (SIZE(1..70, ...)),
+       iE-Extensions                                           ProtocolExtensionContainer { {UsableABSInformationTDD-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UsableABSInformationTDD : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "UsableABSInformationTDD";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct usaable_abs_pattern_info_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 70>>;
+               static constexpr const char* name() {return "usaable_abs_pattern_info_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       usaable_abs_pattern_info_t& ref_usaable_abs_pattern_info() {return usaable_abs_pattern_info;}
+       usaable_abs_pattern_info_t const& ref_usaable_abs_pattern_info() const {return usaable_abs_pattern_info;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UsableABSInformationTDD_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UsableABSInformationTDD_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(usaable_abs_pattern_info);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(usaable_abs_pattern_info);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               usaable_abs_pattern_info.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       usaable_abs_pattern_info_t      usaable_abs_pattern_info;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UsableABSInformation ::= CHOICE {
+       fdd                                     UsableABSInformationFDD,
+       tdd                                     UsableABSInformationTDD,
+       ...
+}
+*/
+
+struct UsableABSInformation : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "UsableABSInformation";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~UsableABSInformation() {clear();}
+       struct fdd_t : UsableABSInformationFDD
+       {
+               static constexpr const char* name() {return "fdd_t";}
+               using parent_t = UsableABSInformationFDD;
+
+       };
+       struct tdd_t : UsableABSInformationTDD
+       {
+               static constexpr const char* name() {return "tdd_t";}
+               using parent_t = UsableABSInformationTDD;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<fdd_t>(); break;
+               case 2: var.destroy<tdd_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<fdd_t>());
+               case 2: set_index(2); return v(var.build<tdd_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<fdd_t>());
+               case 2: return v(var.as<tdd_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<fdd_t>(1);
+               v.template operator()<tdd_t>(2);
+
+       }
+       fdd_t& select_fdd() { if(get_index() != 1) { clear(); set_index(1); return var.build<fdd_t>();} return var.as<fdd_t>();}
+       fdd_t const* get_fdd() const { if(get_index() == 1) { return &var.as<fdd_t>();} return nullptr; }
+       tdd_t& select_tdd() { if(get_index() != 2) { clear(); set_index(2); return var.build<tdd_t>();} return var.as<tdd_t>();}
+       tdd_t const* get_tdd() const { if(get_index() == 2) { return &var.as<tdd_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(fdd_t)];
+               char dummy2[sizeof(tdd_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+ABS-Status-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ABS_Status_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ABS-Status ::= SEQUENCE {
+       dL-ABS-status                                                           DL-ABS-status,
+       usableABSInformation                                            UsableABSInformation,
+       iE-Extensions                                                           ProtocolExtensionContainer { {ABS-Status-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ABS_Status : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ABS-Status";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct dL_ABS_status_t : DL_ABS_status
+       {
+               static constexpr const char* name() {return "dL_ABS_status_t";}
+               using parent_t = DL_ABS_status;
+
+       };
+       dL_ABS_status_t& ref_dL_ABS_status() {return dL_ABS_status;}
+       dL_ABS_status_t const& ref_dL_ABS_status() const {return dL_ABS_status;}
+       struct usableABSInformation_t : UsableABSInformation
+       {
+               static constexpr const char* name() {return "usableABSInformation_t";}
+               using parent_t = UsableABSInformation;
+
+       };
+       usableABSInformation_t& ref_usableABSInformation() {return usableABSInformation;}
+       usableABSInformation_t const& ref_usableABSInformation() const {return usableABSInformation;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ABS_Status_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ABS_Status_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(dL_ABS_status);
+               v(usableABSInformation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(dL_ABS_status);
+               v(usableABSInformation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               dL_ABS_status.clear();
+               usableABSInformation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       dL_ABS_status_t dL_ABS_status;
+       usableABSInformation_t  usableABSInformation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ABSInformationFDD-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ABSInformationFDD_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ABSInformationFDD ::= SEQUENCE {
+       abs-pattern-info                                        BIT STRING (SIZE(40)),
+       numberOfCellSpecificAntennaPorts        ENUMERATED {one, two, four, ...},
+       measurement-subset                                      BIT STRING (SIZE(40)),
+       iE-Extensions                                           ProtocolExtensionContainer { {ABSInformationFDD-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ABSInformationFDD : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "ABSInformationFDD";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct abs_pattern_info_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<40>>;
+               static constexpr const char* name() {return "abs_pattern_info_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       abs_pattern_info_t& ref_abs_pattern_info() {return abs_pattern_info;}
+       abs_pattern_info_t const& ref_abs_pattern_info() const {return abs_pattern_info;}
+       struct numberOfCellSpecificAntennaPorts_t : asn::enumerated<3, 0, true>
+       {
+               static constexpr const char* name() {return "numberOfCellSpecificAntennaPorts_t";}
+               using parent_t = asn::enumerated<3, 0, true>;
+               typedef enum {
+                       one
+                       ,two
+                       ,four
+               } index_t;
+
+       };
+
+       numberOfCellSpecificAntennaPorts_t& ref_numberOfCellSpecificAntennaPorts() {return numberOfCellSpecificAntennaPorts;}
+       numberOfCellSpecificAntennaPorts_t const& ref_numberOfCellSpecificAntennaPorts() const {return numberOfCellSpecificAntennaPorts;}
+       struct measurement_subset_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<40>>;
+               static constexpr const char* name() {return "measurement_subset_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       measurement_subset_t& ref_measurement_subset() {return measurement_subset;}
+       measurement_subset_t const& ref_measurement_subset() const {return measurement_subset;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ABSInformationFDD_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ABSInformationFDD_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(abs_pattern_info);
+               v(numberOfCellSpecificAntennaPorts);
+               v(measurement_subset);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(abs_pattern_info);
+               v(numberOfCellSpecificAntennaPorts);
+               v(measurement_subset);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               abs_pattern_info.clear();
+               numberOfCellSpecificAntennaPorts.clear();
+               measurement_subset.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       abs_pattern_info_t      abs_pattern_info;
+       numberOfCellSpecificAntennaPorts_t      numberOfCellSpecificAntennaPorts;
+       measurement_subset_t    measurement_subset;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ABSInformationTDD-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ABSInformationTDD_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ABSInformationTDD ::= SEQUENCE {
+       abs-pattern-info                                        BIT STRING (SIZE(1..70, ...)),
+       numberOfCellSpecificAntennaPorts        ENUMERATED {one, two, four, ...},
+       measurement-subset                                      BIT STRING (SIZE(1..70, ...)),
+       iE-Extensions                                           ProtocolExtensionContainer { {ABSInformationTDD-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ABSInformationTDD : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "ABSInformationTDD";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct abs_pattern_info_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 70>>;
+               static constexpr const char* name() {return "abs_pattern_info_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       abs_pattern_info_t& ref_abs_pattern_info() {return abs_pattern_info;}
+       abs_pattern_info_t const& ref_abs_pattern_info() const {return abs_pattern_info;}
+       struct numberOfCellSpecificAntennaPorts_t : asn::enumerated<3, 0, true>
+       {
+               static constexpr const char* name() {return "numberOfCellSpecificAntennaPorts_t";}
+               using parent_t = asn::enumerated<3, 0, true>;
+               typedef enum {
+                       one
+                       ,two
+                       ,four
+               } index_t;
+
+       };
+
+       numberOfCellSpecificAntennaPorts_t& ref_numberOfCellSpecificAntennaPorts() {return numberOfCellSpecificAntennaPorts;}
+       numberOfCellSpecificAntennaPorts_t const& ref_numberOfCellSpecificAntennaPorts() const {return numberOfCellSpecificAntennaPorts;}
+       struct measurement_subset_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 70>>;
+               static constexpr const char* name() {return "measurement_subset_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       measurement_subset_t& ref_measurement_subset() {return measurement_subset;}
+       measurement_subset_t const& ref_measurement_subset() const {return measurement_subset;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ABSInformationTDD_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ABSInformationTDD_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(abs_pattern_info);
+               v(numberOfCellSpecificAntennaPorts);
+               v(measurement_subset);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(abs_pattern_info);
+               v(numberOfCellSpecificAntennaPorts);
+               v(measurement_subset);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               abs_pattern_info.clear();
+               numberOfCellSpecificAntennaPorts.clear();
+               measurement_subset.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       abs_pattern_info_t      abs_pattern_info;
+       numberOfCellSpecificAntennaPorts_t      numberOfCellSpecificAntennaPorts;
+       measurement_subset_t    measurement_subset;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ABSInformation ::= CHOICE {
+       fdd                                     ABSInformationFDD,
+       tdd                                     ABSInformationTDD,
+       abs-inactive            NULL,
+       ...
+}
+*/
+
+struct ABSInformation : asn::choice<3, 0, true>
+{
+       static constexpr const char* name() {return "ABSInformation";}
+       using parent_t = asn::choice<3, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 4;}
+       void set_unknown() { set_index(4);  }
+       ~ABSInformation() {clear();}
+       struct fdd_t : ABSInformationFDD
+       {
+               static constexpr const char* name() {return "fdd_t";}
+               using parent_t = ABSInformationFDD;
+
+       };
+       struct tdd_t : ABSInformationTDD
+       {
+               static constexpr const char* name() {return "tdd_t";}
+               using parent_t = ABSInformationTDD;
+
+       };
+       struct abs_inactive_t : asn::nulltype
+       {
+               static constexpr const char* name() {return "abs_inactive_t";}
+               using parent_t = asn::nulltype;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<fdd_t>(); break;
+               case 2: var.destroy<tdd_t>(); break;
+               case 3: var.destroy<abs_inactive_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<fdd_t>());
+               case 2: set_index(2); return v(var.build<tdd_t>());
+               case 3: set_index(3); return v(var.build<abs_inactive_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<fdd_t>());
+               case 2: return v(var.as<tdd_t>());
+               case 3: return v(var.as<abs_inactive_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<fdd_t>(1);
+               v.template operator()<tdd_t>(2);
+               v.template operator()<abs_inactive_t>(3);
+
+       }
+       fdd_t& select_fdd() { if(get_index() != 1) { clear(); set_index(1); return var.build<fdd_t>();} return var.as<fdd_t>();}
+       fdd_t const* get_fdd() const { if(get_index() == 1) { return &var.as<fdd_t>();} return nullptr; }
+       tdd_t& select_tdd() { if(get_index() != 2) { clear(); set_index(2); return var.build<tdd_t>();} return var.as<tdd_t>();}
+       tdd_t const* get_tdd() const { if(get_index() == 2) { return &var.as<tdd_t>();} return nullptr; }
+       abs_inactive_t& select_abs_inactive() { if(get_index() != 3) { clear(); set_index(3); return var.build<abs_inactive_t>();} return var.as<abs_inactive_t>();}
+       abs_inactive_t const* get_abs_inactive() const { if(get_index() == 3) { return &var.as<abs_inactive_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(fdd_t)];
+               char dummy2[sizeof(tdd_t)];
+               char dummy3[sizeof(abs_inactive_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+Key-eNodeB-Star ::= BIT STRING (SIZE(256))
+*/
+
+struct Key_eNodeB_Star : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<256>>;
+       static constexpr const char* name() {return "Key-eNodeB-Star";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+NextHopChainingCount ::= INTEGER (0..7)
+*/
+
+struct NextHopChainingCount : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 7>>;
+       static constexpr const char* name() {return "NextHopChainingCount";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+AS-SecurityInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct AS_SecurityInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+AS-SecurityInformation ::= SEQUENCE {
+       key-eNodeB-star         Key-eNodeB-Star,
+       nextHopChainingCount                    NextHopChainingCount,
+       iE-Extensions                                           ProtocolExtensionContainer { {AS-SecurityInformation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct AS_SecurityInformation : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "AS-SecurityInformation";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct key_eNodeB_star_t : Key_eNodeB_Star
+       {
+               static constexpr const char* name() {return "key_eNodeB_star_t";}
+               using parent_t = Key_eNodeB_Star;
+
+       };
+       key_eNodeB_star_t& ref_key_eNodeB_star() {return key_eNodeB_star;}
+       key_eNodeB_star_t const& ref_key_eNodeB_star() const {return key_eNodeB_star;}
+       struct nextHopChainingCount_t : NextHopChainingCount
+       {
+               static constexpr const char* name() {return "nextHopChainingCount_t";}
+               using parent_t = NextHopChainingCount;
+
+       };
+       nextHopChainingCount_t& ref_nextHopChainingCount() {return nextHopChainingCount;}
+       nextHopChainingCount_t const& ref_nextHopChainingCount() const {return nextHopChainingCount;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<AS_SecurityInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<AS_SecurityInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(key_eNodeB_star);
+               v(nextHopChainingCount);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(key_eNodeB_star);
+               v(nextHopChainingCount);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               key_eNodeB_star.clear();
+               nextHopChainingCount.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       key_eNodeB_star_t       key_eNodeB_star;
+       nextHopChainingCount_t  nextHopChainingCount;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ActivationID ::= INTEGER (0..255)
+*/
+
+struct ActivationID : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 255>>;
+       static constexpr const char* name() {return "ActivationID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+AdditionalSpecialSubframePatterns ::= ENUMERATED {
+       ssp0,
+       ssp1,
+       ssp2,
+       ssp3,
+       ssp4,
+       ssp5,
+       ssp6,
+       ssp7,
+       ssp8,
+       ssp9,
+       ...
+}
+*/
+
+struct AdditionalSpecialSubframePatterns : asn::enumerated<10, 0, true>
+{
+       static constexpr const char* name() {return "AdditionalSpecialSubframePatterns";}
+       using parent_t = asn::enumerated<10, 0, true>;
+       typedef enum {
+               ssp0
+               ,ssp1
+               ,ssp2
+               ,ssp3
+               ,ssp4
+               ,ssp5
+               ,ssp6
+               ,ssp7
+               ,ssp8
+               ,ssp9
+       } index_t;
+
+};
+
+/*
+CyclicPrefixDL ::= ENUMERATED {
+       normal,
+       extended,
+       ...
+}
+*/
+
+struct CyclicPrefixDL : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "CyclicPrefixDL";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               normal
+               ,extended
+       } index_t;
+
+};
+
+/*
+CyclicPrefixUL ::= ENUMERATED {
+       normal,
+       extended,
+       ...
+}
+*/
+
+struct CyclicPrefixUL : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "CyclicPrefixUL";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               normal
+               ,extended
+       } index_t;
+
+};
+
+/*
+AdditionalSpecialSubframe-Info-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct AdditionalSpecialSubframe_Info_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+AdditionalSpecialSubframe-Info ::=             SEQUENCE {
+       additionalspecialSubframePatterns               AdditionalSpecialSubframePatterns,
+       cyclicPrefixDL                                                  CyclicPrefixDL,
+       cyclicPrefixUL                                                  CyclicPrefixUL,
+       iE-Extensions                                                   ProtocolExtensionContainer { {AdditionalSpecialSubframe-Info-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct AdditionalSpecialSubframe_Info : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "AdditionalSpecialSubframe-Info";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct additionalspecialSubframePatterns_t : AdditionalSpecialSubframePatterns
+       {
+               static constexpr const char* name() {return "additionalspecialSubframePatterns_t";}
+               using parent_t = AdditionalSpecialSubframePatterns;
+
+       };
+       additionalspecialSubframePatterns_t& ref_additionalspecialSubframePatterns() {return additionalspecialSubframePatterns;}
+       additionalspecialSubframePatterns_t const& ref_additionalspecialSubframePatterns() const {return additionalspecialSubframePatterns;}
+       struct cyclicPrefixDL_t : CyclicPrefixDL
+       {
+               static constexpr const char* name() {return "cyclicPrefixDL_t";}
+               using parent_t = CyclicPrefixDL;
+
+       };
+       cyclicPrefixDL_t& ref_cyclicPrefixDL() {return cyclicPrefixDL;}
+       cyclicPrefixDL_t const& ref_cyclicPrefixDL() const {return cyclicPrefixDL;}
+       struct cyclicPrefixUL_t : CyclicPrefixUL
+       {
+               static constexpr const char* name() {return "cyclicPrefixUL_t";}
+               using parent_t = CyclicPrefixUL;
+
+       };
+       cyclicPrefixUL_t& ref_cyclicPrefixUL() {return cyclicPrefixUL;}
+       cyclicPrefixUL_t const& ref_cyclicPrefixUL() const {return cyclicPrefixUL;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<AdditionalSpecialSubframe_Info_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<AdditionalSpecialSubframe_Info_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(additionalspecialSubframePatterns);
+               v(cyclicPrefixDL);
+               v(cyclicPrefixUL);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(additionalspecialSubframePatterns);
+               v(cyclicPrefixDL);
+               v(cyclicPrefixUL);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               additionalspecialSubframePatterns.clear();
+               cyclicPrefixDL.clear();
+               cyclicPrefixUL.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       additionalspecialSubframePatterns_t     additionalspecialSubframePatterns;
+       cyclicPrefixDL_t        cyclicPrefixDL;
+       cyclicPrefixUL_t        cyclicPrefixUL;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+AdditionalSpecialSubframePatternsExtension ::= ENUMERATED {
+       ssp10,
+       ...
+}
+*/
+
+struct AdditionalSpecialSubframePatternsExtension : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "AdditionalSpecialSubframePatternsExtension";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               ssp10
+       } index_t;
+
+};
+
+/*
+AdditionalSpecialSubframeExtension-Info-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct AdditionalSpecialSubframeExtension_Info_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+AdditionalSpecialSubframeExtension-Info ::=            SEQUENCE {
+       additionalspecialSubframePatternsExtension      AdditionalSpecialSubframePatternsExtension,
+       cyclicPrefixDL                                                          CyclicPrefixDL,
+       cyclicPrefixUL                                                          CyclicPrefixUL,
+       iE-Extensions                                                           ProtocolExtensionContainer { {AdditionalSpecialSubframeExtension-Info-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct AdditionalSpecialSubframeExtension_Info : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "AdditionalSpecialSubframeExtension-Info";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct additionalspecialSubframePatternsExtension_t : AdditionalSpecialSubframePatternsExtension
+       {
+               static constexpr const char* name() {return "additionalspecialSubframePatternsExtension_t";}
+               using parent_t = AdditionalSpecialSubframePatternsExtension;
+
+       };
+       additionalspecialSubframePatternsExtension_t& ref_additionalspecialSubframePatternsExtension() {return additionalspecialSubframePatternsExtension;}
+       additionalspecialSubframePatternsExtension_t const& ref_additionalspecialSubframePatternsExtension() const {return additionalspecialSubframePatternsExtension;}
+       struct cyclicPrefixDL_t : CyclicPrefixDL
+       {
+               static constexpr const char* name() {return "cyclicPrefixDL_t";}
+               using parent_t = CyclicPrefixDL;
+
+       };
+       cyclicPrefixDL_t& ref_cyclicPrefixDL() {return cyclicPrefixDL;}
+       cyclicPrefixDL_t const& ref_cyclicPrefixDL() const {return cyclicPrefixDL;}
+       struct cyclicPrefixUL_t : CyclicPrefixUL
+       {
+               static constexpr const char* name() {return "cyclicPrefixUL_t";}
+               using parent_t = CyclicPrefixUL;
+
+       };
+       cyclicPrefixUL_t& ref_cyclicPrefixUL() {return cyclicPrefixUL;}
+       cyclicPrefixUL_t const& ref_cyclicPrefixUL() const {return cyclicPrefixUL;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<AdditionalSpecialSubframeExtension_Info_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<AdditionalSpecialSubframeExtension_Info_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(additionalspecialSubframePatternsExtension);
+               v(cyclicPrefixDL);
+               v(cyclicPrefixUL);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(additionalspecialSubframePatternsExtension);
+               v(cyclicPrefixDL);
+               v(cyclicPrefixUL);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               additionalspecialSubframePatternsExtension.clear();
+               cyclicPrefixDL.clear();
+               cyclicPrefixUL.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       additionalspecialSubframePatternsExtension_t    additionalspecialSubframePatternsExtension;
+       cyclicPrefixDL_t        cyclicPrefixDL;
+       cyclicPrefixUL_t        cyclicPrefixUL;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+AerialUEsubscriptionInformation ::= ENUMERATED {
+       allowed,
+       not-allowed,
+       ...
+}
+*/
+
+struct AerialUEsubscriptionInformation : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "AerialUEsubscriptionInformation";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               allowed
+               ,not_allowed
+       } index_t;
+
+};
+
+/*
+PriorityLevel                          ::= INTEGER { spare (0), highest (1), lowest (14), no-priority (15) } (0..15)
+*/
+
+struct PriorityLevel : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 15>>;
+       static constexpr const char* name() {return "PriorityLevel";}
+       using parent_t = asn::integer<>;
+       enum {spare = 0, highest = 1, lowest = 14, no_priority = 15};
+
+};
+
+/*
+Pre-emptionCapability ::= ENUMERATED {
+       shall-not-trigger-pre-emption,
+       may-trigger-pre-emption
+}
+*/
+
+struct Pre_emptionCapability : asn::enumerated<2, 0, false>
+{
+       static constexpr const char* name() {return "Pre-emptionCapability";}
+       using parent_t = asn::enumerated<2, 0, false>;
+       typedef enum {
+               shall_not_trigger_pre_emption
+               ,may_trigger_pre_emption
+       } index_t;
+
+};
+
+/*
+Pre-emptionVulnerability ::= ENUMERATED {
+       not-pre-emptable,
+       pre-emptable
+}
+*/
+
+struct Pre_emptionVulnerability : asn::enumerated<2, 0, false>
+{
+       static constexpr const char* name() {return "Pre-emptionVulnerability";}
+       using parent_t = asn::enumerated<2, 0, false>;
+       typedef enum {
+               not_pre_emptable
+               ,pre_emptable
+       } index_t;
+
+};
+
+/*
+AllocationAndRetentionPriority-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct AllocationAndRetentionPriority_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+AllocationAndRetentionPriority ::= SEQUENCE {
+       priorityLevel                           PriorityLevel,
+       pre-emptionCapability           Pre-emptionCapability,
+       pre-emptionVulnerability        Pre-emptionVulnerability,
+       iE-Extensions                           ProtocolExtensionContainer { {AllocationAndRetentionPriority-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct AllocationAndRetentionPriority : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "AllocationAndRetentionPriority";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct priorityLevel_t : PriorityLevel
+       {
+               static constexpr const char* name() {return "priorityLevel_t";}
+               using parent_t = PriorityLevel;
+
+       };
+       priorityLevel_t& ref_priorityLevel() {return priorityLevel;}
+       priorityLevel_t const& ref_priorityLevel() const {return priorityLevel;}
+       struct pre_emptionCapability_t : Pre_emptionCapability
+       {
+               static constexpr const char* name() {return "pre_emptionCapability_t";}
+               using parent_t = Pre_emptionCapability;
+
+       };
+       pre_emptionCapability_t& ref_pre_emptionCapability() {return pre_emptionCapability;}
+       pre_emptionCapability_t const& ref_pre_emptionCapability() const {return pre_emptionCapability;}
+       struct pre_emptionVulnerability_t : Pre_emptionVulnerability
+       {
+               static constexpr const char* name() {return "pre_emptionVulnerability_t";}
+               using parent_t = Pre_emptionVulnerability;
+
+       };
+       pre_emptionVulnerability_t& ref_pre_emptionVulnerability() {return pre_emptionVulnerability;}
+       pre_emptionVulnerability_t const& ref_pre_emptionVulnerability() const {return pre_emptionVulnerability;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<AllocationAndRetentionPriority_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<AllocationAndRetentionPriority_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(priorityLevel);
+               v(pre_emptionCapability);
+               v(pre_emptionVulnerability);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(priorityLevel);
+               v(pre_emptionCapability);
+               v(pre_emptionVulnerability);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               priorityLevel.clear();
+               pre_emptionCapability.clear();
+               pre_emptionVulnerability.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       priorityLevel_t priorityLevel;
+       pre_emptionCapability_t pre_emptionCapability;
+       pre_emptionVulnerability_t      pre_emptionVulnerability;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+PLMN-Identity ::= OCTET STRING (SIZE(3))
+*/
+
+struct PLMN_Identity : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<3>>;
+       static constexpr const char* name() {return "PLMN-Identity";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+EUTRANCellIdentifier ::= BIT STRING (SIZE (28))
+*/
+
+struct EUTRANCellIdentifier : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<28>>;
+       static constexpr const char* name() {return "EUTRANCellIdentifier";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+ECGI-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ECGI_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ECGI ::= SEQUENCE {
+       pLMN-Identity                           PLMN-Identity,
+       eUTRANcellIdentifier            EUTRANCellIdentifier,
+       iE-Extensions                           ProtocolExtensionContainer { {ECGI-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ECGI : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ECGI";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct eUTRANcellIdentifier_t : EUTRANCellIdentifier
+       {
+               static constexpr const char* name() {return "eUTRANcellIdentifier_t";}
+               using parent_t = EUTRANCellIdentifier;
+
+       };
+       eUTRANcellIdentifier_t& ref_eUTRANcellIdentifier() {return eUTRANcellIdentifier;}
+       eUTRANcellIdentifier_t const& ref_eUTRANcellIdentifier() const {return eUTRANcellIdentifier;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ECGI_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ECGI_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(eUTRANcellIdentifier);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(eUTRANcellIdentifier);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               eUTRANcellIdentifier.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       eUTRANcellIdentifier_t  eUTRANcellIdentifier;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CellIdListforMDT ::= SEQUENCE (SIZE(1..maxnoofCellIDforMDT)) OF ECGI
+*/
+
+struct CellIdListforMDT_elm : ECGI
+{
+       static constexpr const char* name() {return "CellIdListforMDT_elm";}
+       using parent_t = ECGI;
+
+};
+struct CellIdListforMDT : asn::sequenceof<CellIdListforMDT_elm>
+{
+       static constexpr const char* name() {return "CellIdListforMDT";}
+       using parent_t = asn::sequenceof<CellIdListforMDT_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofCellIDforMDT >>;
+
+};
+/*
+CellBasedMDT-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CellBasedMDT_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CellBasedMDT::= SEQUENCE {
+       cellIdListforMDT        CellIdListforMDT,
+       iE-Extensions           ProtocolExtensionContainer { {CellBasedMDT-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CellBasedMDT : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "CellBasedMDT";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct cellIdListforMDT_t : CellIdListforMDT
+       {
+               static constexpr const char* name() {return "cellIdListforMDT_t";}
+               using parent_t = CellIdListforMDT;
+
+       };
+       cellIdListforMDT_t& ref_cellIdListforMDT() {return cellIdListforMDT;}
+       cellIdListforMDT_t const& ref_cellIdListforMDT() const {return cellIdListforMDT;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CellBasedMDT_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CellBasedMDT_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(cellIdListforMDT);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(cellIdListforMDT);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               cellIdListforMDT.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       cellIdListforMDT_t      cellIdListforMDT;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TAC ::= OCTET STRING (SIZE (2))
+*/
+
+struct TAC : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<2>>;
+       static constexpr const char* name() {return "TAC";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+TAListforMDT ::= SEQUENCE (SIZE(1..maxnoofTAforMDT)) OF TAC
+*/
+
+struct TAListforMDT_elm : TAC
+{
+       static constexpr const char* name() {return "TAListforMDT_elm";}
+       using parent_t = TAC;
+
+};
+struct TAListforMDT : asn::sequenceof<TAListforMDT_elm>
+{
+       static constexpr const char* name() {return "TAListforMDT";}
+       using parent_t = asn::sequenceof<TAListforMDT_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofTAforMDT >>;
+
+};
+/*
+TABasedMDT-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct TABasedMDT_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TABasedMDT::= SEQUENCE {
+       tAListforMDT            TAListforMDT,
+       iE-Extensions           ProtocolExtensionContainer { {TABasedMDT-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TABasedMDT : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "TABasedMDT";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct tAListforMDT_t : TAListforMDT
+       {
+               static constexpr const char* name() {return "tAListforMDT_t";}
+               using parent_t = TAListforMDT;
+
+       };
+       tAListforMDT_t& ref_tAListforMDT() {return tAListforMDT;}
+       tAListforMDT_t const& ref_tAListforMDT() const {return tAListforMDT;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TABasedMDT_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TABasedMDT_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(tAListforMDT);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(tAListforMDT);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               tAListforMDT.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       tAListforMDT_t  tAListforMDT;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TAI-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct TAI_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TAI-Item ::= SEQUENCE {
+       tAC                                     TAC,
+       pLMN-Identity           PLMN-Identity,
+       iE-Extensions           ProtocolExtensionContainer { {TAI-Item-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TAI_Item : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "TAI-Item";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct tAC_t : TAC
+       {
+               static constexpr const char* name() {return "tAC_t";}
+               using parent_t = TAC;
+
+       };
+       tAC_t& ref_tAC() {return tAC;}
+       tAC_t const& ref_tAC() const {return tAC;}
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TAI_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TAI_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(tAC);
+               v(pLMN_Identity);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(tAC);
+               v(pLMN_Identity);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               tAC.clear();
+               pLMN_Identity.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       tAC_t   tAC;
+       pLMN_Identity_t pLMN_Identity;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TAIListforMDT ::= SEQUENCE (SIZE(1..maxnoofTAforMDT)) OF TAI-Item
+*/
+
+struct TAIListforMDT_elm : TAI_Item
+{
+       static constexpr const char* name() {return "TAIListforMDT_elm";}
+       using parent_t = TAI_Item;
+
+};
+struct TAIListforMDT : asn::sequenceof<TAIListforMDT_elm>
+{
+       static constexpr const char* name() {return "TAIListforMDT";}
+       using parent_t = asn::sequenceof<TAIListforMDT_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofTAforMDT >>;
+
+};
+/*
+TAIBasedMDT-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct TAIBasedMDT_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TAIBasedMDT ::= SEQUENCE {
+       tAIListforMDT                   TAIListforMDT,
+       iE-Extensions                   ProtocolExtensionContainer { {TAIBasedMDT-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TAIBasedMDT : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "TAIBasedMDT";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct tAIListforMDT_t : TAIListforMDT
+       {
+               static constexpr const char* name() {return "tAIListforMDT_t";}
+               using parent_t = TAIListforMDT;
+
+       };
+       tAIListforMDT_t& ref_tAIListforMDT() {return tAIListforMDT;}
+       tAIListforMDT_t const& ref_tAIListforMDT() const {return tAIListforMDT;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TAIBasedMDT_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TAIBasedMDT_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(tAIListforMDT);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(tAIListforMDT);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               tAIListforMDT.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       tAIListforMDT_t tAIListforMDT;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+AreaScopeOfMDT ::= CHOICE {
+       cellBased                                       CellBasedMDT,
+       tABased                                         TABasedMDT,
+       pLMNWide                                        NULL,
+       ...,
+       tAIBased                                        TAIBasedMDT
+}
+*/
+
+struct AreaScopeOfMDT : asn::choice<4, 1, true>
+{
+       static constexpr const char* name() {return "AreaScopeOfMDT";}
+       using parent_t = asn::choice<4, 1, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 5;}
+       void set_unknown() { set_index(5);  }
+       ~AreaScopeOfMDT() {clear();}
+       struct cellBased_t : CellBasedMDT
+       {
+               static constexpr const char* name() {return "cellBased_t";}
+               using parent_t = CellBasedMDT;
+
+       };
+       struct tABased_t : TABasedMDT
+       {
+               static constexpr const char* name() {return "tABased_t";}
+               using parent_t = TABasedMDT;
+
+       };
+       struct pLMNWide_t : asn::nulltype
+       {
+               static constexpr const char* name() {return "pLMNWide_t";}
+               using parent_t = asn::nulltype;
+
+       };
+       struct tAIBased_t : TAIBasedMDT
+       {
+               static constexpr const char* name() {return "tAIBased_t";}
+               using parent_t = TAIBasedMDT;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<cellBased_t>(); break;
+               case 2: var.destroy<tABased_t>(); break;
+               case 3: var.destroy<pLMNWide_t>(); break;
+               case 4: var.destroy<tAIBased_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<cellBased_t>());
+               case 2: set_index(2); return v(var.build<tABased_t>());
+               case 3: set_index(3); return v(var.build<pLMNWide_t>());
+               case 4: set_index(4); return v(var.build<tAIBased_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<cellBased_t>());
+               case 2: return v(var.as<tABased_t>());
+               case 3: return v(var.as<pLMNWide_t>());
+               case 4: return v(var.as<tAIBased_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<cellBased_t>(1);
+               v.template operator()<tABased_t>(2);
+               v.template operator()<pLMNWide_t>(3);
+               v.template operator()<tAIBased_t>(4);
+
+       }
+       cellBased_t& select_cellBased() { if(get_index() != 1) { clear(); set_index(1); return var.build<cellBased_t>();} return var.as<cellBased_t>();}
+       cellBased_t const* get_cellBased() const { if(get_index() == 1) { return &var.as<cellBased_t>();} return nullptr; }
+       tABased_t& select_tABased() { if(get_index() != 2) { clear(); set_index(2); return var.build<tABased_t>();} return var.as<tABased_t>();}
+       tABased_t const* get_tABased() const { if(get_index() == 2) { return &var.as<tABased_t>();} return nullptr; }
+       pLMNWide_t& select_pLMNWide() { if(get_index() != 3) { clear(); set_index(3); return var.build<pLMNWide_t>();} return var.as<pLMNWide_t>();}
+       pLMNWide_t const* get_pLMNWide() const { if(get_index() == 3) { return &var.as<pLMNWide_t>();} return nullptr; }
+       tAIBased_t& select_tAIBased() { if(get_index() != 4) { clear(); set_index(4); return var.build<tAIBased_t>();} return var.as<tAIBased_t>();}
+       tAIBased_t const* get_tAIBased() const { if(get_index() == 4) { return &var.as<tAIBased_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(cellBased_t)];
+               char dummy2[sizeof(tABased_t)];
+               char dummy3[sizeof(pLMNWide_t)];
+               char dummy4[sizeof(tAIBased_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+CellIdListforQMC ::= SEQUENCE (SIZE(1..maxnoofCellIDforQMC)) OF ECGI
+*/
+
+struct CellIdListforQMC_elm : ECGI
+{
+       static constexpr const char* name() {return "CellIdListforQMC_elm";}
+       using parent_t = ECGI;
+
+};
+struct CellIdListforQMC : asn::sequenceof<CellIdListforQMC_elm>
+{
+       static constexpr const char* name() {return "CellIdListforQMC";}
+       using parent_t = asn::sequenceof<CellIdListforQMC_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofCellIDforQMC >>;
+
+};
+/*
+CellBasedQMC-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CellBasedQMC_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CellBasedQMC::= SEQUENCE {
+       cellIdListforQMC                CellIdListforQMC,
+       iE-Extensions           ProtocolExtensionContainer { {CellBasedQMC-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CellBasedQMC : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "CellBasedQMC";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct cellIdListforQMC_t : CellIdListforQMC
+       {
+               static constexpr const char* name() {return "cellIdListforQMC_t";}
+               using parent_t = CellIdListforQMC;
+
+       };
+       cellIdListforQMC_t& ref_cellIdListforQMC() {return cellIdListforQMC;}
+       cellIdListforQMC_t const& ref_cellIdListforQMC() const {return cellIdListforQMC;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CellBasedQMC_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CellBasedQMC_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(cellIdListforQMC);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(cellIdListforQMC);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               cellIdListforQMC.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       cellIdListforQMC_t      cellIdListforQMC;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TAListforQMC ::= SEQUENCE (SIZE(1..maxnoofTAforQMC)) OF TAC
+*/
+
+struct TAListforQMC_elm : TAC
+{
+       static constexpr const char* name() {return "TAListforQMC_elm";}
+       using parent_t = TAC;
+
+};
+struct TAListforQMC : asn::sequenceof<TAListforQMC_elm>
+{
+       static constexpr const char* name() {return "TAListforQMC";}
+       using parent_t = asn::sequenceof<TAListforQMC_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofTAforQMC >>;
+
+};
+/*
+TABasedQMC-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct TABasedQMC_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TABasedQMC ::= SEQUENCE {
+       tAListforQMC            TAListforQMC,
+       iE-Extensions           ProtocolExtensionContainer { {TABasedQMC-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TABasedQMC : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "TABasedQMC";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct tAListforQMC_t : TAListforQMC
+       {
+               static constexpr const char* name() {return "tAListforQMC_t";}
+               using parent_t = TAListforQMC;
+
+       };
+       tAListforQMC_t& ref_tAListforQMC() {return tAListforQMC;}
+       tAListforQMC_t const& ref_tAListforQMC() const {return tAListforQMC;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TABasedQMC_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TABasedQMC_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(tAListforQMC);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(tAListforQMC);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               tAListforQMC.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       tAListforQMC_t  tAListforQMC;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TAIListforQMC ::= SEQUENCE (SIZE(1..maxnoofTAforQMC)) OF TAI-Item
+*/
+
+struct TAIListforQMC_elm : TAI_Item
+{
+       static constexpr const char* name() {return "TAIListforQMC_elm";}
+       using parent_t = TAI_Item;
+
+};
+struct TAIListforQMC : asn::sequenceof<TAIListforQMC_elm>
+{
+       static constexpr const char* name() {return "TAIListforQMC";}
+       using parent_t = asn::sequenceof<TAIListforQMC_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofTAforQMC >>;
+
+};
+/*
+TAIBasedQMC-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct TAIBasedQMC_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TAIBasedQMC ::= SEQUENCE {
+       tAIListforQMC           TAIListforQMC,
+       iE-Extensions           ProtocolExtensionContainer { {TAIBasedQMC-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TAIBasedQMC : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "TAIBasedQMC";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct tAIListforQMC_t : TAIListforQMC
+       {
+               static constexpr const char* name() {return "tAIListforQMC_t";}
+               using parent_t = TAIListforQMC;
+
+       };
+       tAIListforQMC_t& ref_tAIListforQMC() {return tAIListforQMC;}
+       tAIListforQMC_t const& ref_tAIListforQMC() const {return tAIListforQMC;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TAIBasedQMC_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TAIBasedQMC_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(tAIListforQMC);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(tAIListforQMC);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               tAIListforQMC.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       tAIListforQMC_t tAIListforQMC;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+PLMNListforQMC ::= SEQUENCE (SIZE(1..maxnoofPLMNforQMC)) OF PLMN-Identity
+*/
+
+struct PLMNListforQMC_elm : PLMN_Identity
+{
+       static constexpr const char* name() {return "PLMNListforQMC_elm";}
+       using parent_t = PLMN_Identity;
+
+};
+struct PLMNListforQMC : asn::sequenceof<PLMNListforQMC_elm>
+{
+       static constexpr const char* name() {return "PLMNListforQMC";}
+       using parent_t = asn::sequenceof<PLMNListforQMC_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofPLMNforQMC >>;
+
+};
+/*
+PLMNAreaBasedQMC-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct PLMNAreaBasedQMC_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+PLMNAreaBasedQMC ::= SEQUENCE {
+       plmnListforQMC          PLMNListforQMC,
+       iE-Extensions           ProtocolExtensionContainer { {PLMNAreaBasedQMC-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct PLMNAreaBasedQMC : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "PLMNAreaBasedQMC";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct plmnListforQMC_t : PLMNListforQMC
+       {
+               static constexpr const char* name() {return "plmnListforQMC_t";}
+               using parent_t = PLMNListforQMC;
+
+       };
+       plmnListforQMC_t& ref_plmnListforQMC() {return plmnListforQMC;}
+       plmnListforQMC_t const& ref_plmnListforQMC() const {return plmnListforQMC;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<PLMNAreaBasedQMC_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<PLMNAreaBasedQMC_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(plmnListforQMC);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(plmnListforQMC);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               plmnListforQMC.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       plmnListforQMC_t        plmnListforQMC;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+AreaScopeOfQMC ::= CHOICE {
+       cellBased                                       CellBasedQMC,
+       tABased                                         TABasedQMC,
+       tAIBased                                        TAIBasedQMC,
+       pLMNAreaBased                           PLMNAreaBasedQMC,
+       ...
+}
+*/
+
+struct AreaScopeOfQMC : asn::choice<4, 0, true>
+{
+       static constexpr const char* name() {return "AreaScopeOfQMC";}
+       using parent_t = asn::choice<4, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 5;}
+       void set_unknown() { set_index(5);  }
+       ~AreaScopeOfQMC() {clear();}
+       struct cellBased_t : CellBasedQMC
+       {
+               static constexpr const char* name() {return "cellBased_t";}
+               using parent_t = CellBasedQMC;
+
+       };
+       struct tABased_t : TABasedQMC
+       {
+               static constexpr const char* name() {return "tABased_t";}
+               using parent_t = TABasedQMC;
+
+       };
+       struct tAIBased_t : TAIBasedQMC
+       {
+               static constexpr const char* name() {return "tAIBased_t";}
+               using parent_t = TAIBasedQMC;
+
+       };
+       struct pLMNAreaBased_t : PLMNAreaBasedQMC
+       {
+               static constexpr const char* name() {return "pLMNAreaBased_t";}
+               using parent_t = PLMNAreaBasedQMC;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<cellBased_t>(); break;
+               case 2: var.destroy<tABased_t>(); break;
+               case 3: var.destroy<tAIBased_t>(); break;
+               case 4: var.destroy<pLMNAreaBased_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<cellBased_t>());
+               case 2: set_index(2); return v(var.build<tABased_t>());
+               case 3: set_index(3); return v(var.build<tAIBased_t>());
+               case 4: set_index(4); return v(var.build<pLMNAreaBased_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<cellBased_t>());
+               case 2: return v(var.as<tABased_t>());
+               case 3: return v(var.as<tAIBased_t>());
+               case 4: return v(var.as<pLMNAreaBased_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<cellBased_t>(1);
+               v.template operator()<tABased_t>(2);
+               v.template operator()<tAIBased_t>(3);
+               v.template operator()<pLMNAreaBased_t>(4);
+
+       }
+       cellBased_t& select_cellBased() { if(get_index() != 1) { clear(); set_index(1); return var.build<cellBased_t>();} return var.as<cellBased_t>();}
+       cellBased_t const* get_cellBased() const { if(get_index() == 1) { return &var.as<cellBased_t>();} return nullptr; }
+       tABased_t& select_tABased() { if(get_index() != 2) { clear(); set_index(2); return var.build<tABased_t>();} return var.as<tABased_t>();}
+       tABased_t const* get_tABased() const { if(get_index() == 2) { return &var.as<tABased_t>();} return nullptr; }
+       tAIBased_t& select_tAIBased() { if(get_index() != 3) { clear(); set_index(3); return var.build<tAIBased_t>();} return var.as<tAIBased_t>();}
+       tAIBased_t const* get_tAIBased() const { if(get_index() == 3) { return &var.as<tAIBased_t>();} return nullptr; }
+       pLMNAreaBased_t& select_pLMNAreaBased() { if(get_index() != 4) { clear(); set_index(4); return var.build<pLMNAreaBased_t>();} return var.as<pLMNAreaBased_t>();}
+       pLMNAreaBased_t const* get_pLMNAreaBased() const { if(get_index() == 4) { return &var.as<pLMNAreaBased_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(cellBased_t)];
+               char dummy2[sizeof(tABased_t)];
+               char dummy3[sizeof(tAIBased_t)];
+               char dummy4[sizeof(pLMNAreaBased_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+FreqBandIndicator ::= INTEGER (1..256, ...)
+*/
+
+struct FreqBandIndicator : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 256>>;
+       static constexpr const char* name() {return "FreqBandIndicator";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+BandInfo-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct BandInfo_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+BandInfo       ::= SEQUENCE {
+       freqBandIndicator               FreqBandIndicator,
+       iE-Extensions                   ProtocolExtensionContainer { {BandInfo-ExtIEs} }        OPTIONAL,
+       ...
+}
+*/
+
+struct BandInfo : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "BandInfo";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct freqBandIndicator_t : FreqBandIndicator
+       {
+               static constexpr const char* name() {return "freqBandIndicator_t";}
+               using parent_t = FreqBandIndicator;
+
+       };
+       freqBandIndicator_t& ref_freqBandIndicator() {return freqBandIndicator;}
+       freqBandIndicator_t const& ref_freqBandIndicator() const {return freqBandIndicator;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<BandInfo_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<BandInfo_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(freqBandIndicator);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(freqBandIndicator);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               freqBandIndicator.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       freqBandIndicator_t     freqBandIndicator;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+BandwidthReducedSI::= ENUMERATED {
+       scheduled,
+       ...
+}
+*/
+
+struct BandwidthReducedSI : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "BandwidthReducedSI";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               scheduled
+       } index_t;
+
+};
+
+/*
+BearerType ::= ENUMERATED {
+       non-IP,
+       ...
+}
+*/
+
+struct BearerType : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "BearerType";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               non_IP
+       } index_t;
+
+};
+
+/*
+BenefitMetric ::= INTEGER (-101..100, ...)
+*/
+
+struct BenefitMetric : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<-101, 100>>;
+       static constexpr const char* name() {return "BenefitMetric";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+BitRate ::= INTEGER (0..10000000000)
+*/
+
+struct BitRate : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 10000000000>>;
+       static constexpr const char* name() {return "BitRate";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+BluetoothMeasConfig::= ENUMERATED {setup,...}
+*/
+
+struct BluetoothMeasConfig : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "BluetoothMeasConfig";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               setup
+       } index_t;
+
+};
+
+/*
+BluetoothName ::= OCTET STRING (SIZE (1..248))
+*/
+
+struct BluetoothName : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1, 248>>;
+       static constexpr const char* name() {return "BluetoothName";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+BluetoothMeasConfigNameList ::= SEQUENCE (SIZE(1..maxnoofBluetoothName)) OF BluetoothName
+*/
+
+struct BluetoothMeasConfigNameList_elm : BluetoothName
+{
+       static constexpr const char* name() {return "BluetoothMeasConfigNameList_elm";}
+       using parent_t = BluetoothName;
+
+};
+struct BluetoothMeasConfigNameList : asn::sequenceof<BluetoothMeasConfigNameList_elm>
+{
+       static constexpr const char* name() {return "BluetoothMeasConfigNameList";}
+       using parent_t = asn::sequenceof<BluetoothMeasConfigNameList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofBluetoothName >>;
+
+};
+/*
+BluetoothMeasurementConfiguration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct BluetoothMeasurementConfiguration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+BluetoothMeasurementConfiguration ::= SEQUENCE {
+       bluetoothMeasConfig                             BluetoothMeasConfig,
+       bluetoothMeasConfigNameList             BluetoothMeasConfigNameList                     OPTIONAL,
+       bt-rssi                                                 ENUMERATED {true, ...}                          OPTIONAL,
+       iE-Extensions           ProtocolExtensionContainer { {BluetoothMeasurementConfiguration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct BluetoothMeasurementConfiguration : asn::sequence<4, 0, true, 3>
+{
+       static constexpr const char* name() {return "BluetoothMeasurementConfiguration";}
+       using parent_t = asn::sequence<4, 0, true, 3>;
+       struct bluetoothMeasConfig_t : BluetoothMeasConfig
+       {
+               static constexpr const char* name() {return "bluetoothMeasConfig_t";}
+               using parent_t = BluetoothMeasConfig;
+
+       };
+       bluetoothMeasConfig_t& ref_bluetoothMeasConfig() {return bluetoothMeasConfig;}
+       bluetoothMeasConfig_t const& ref_bluetoothMeasConfig() const {return bluetoothMeasConfig;}
+       struct bluetoothMeasConfigNameList_t : BluetoothMeasConfigNameList
+       {
+               static constexpr const char* name() {return "bluetoothMeasConfigNameList_t";}
+               using parent_t = BluetoothMeasConfigNameList;
+               static constexpr bool optional = true;
+
+       };
+       bluetoothMeasConfigNameList_t& set_bluetoothMeasConfigNameList() { bluetoothMeasConfigNameList.setpresent(true); return bluetoothMeasConfigNameList;}
+       bluetoothMeasConfigNameList_t const* get_bluetoothMeasConfigNameList() const {return bluetoothMeasConfigNameList.is_valid() ? &bluetoothMeasConfigNameList : nullptr;}
+       struct bt_rssi_t : asn::enumerated<1, 0, true>
+       {
+               static constexpr const char* name() {return "bt_rssi_t";}
+               using parent_t = asn::enumerated<1, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       True
+               } index_t;
+
+       };
+
+       bt_rssi_t& set_bt_rssi() { bt_rssi.setpresent(true); return bt_rssi;}
+       bt_rssi_t const* get_bt_rssi() const {return bt_rssi.is_valid() ? &bt_rssi : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<BluetoothMeasurementConfiguration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<BluetoothMeasurementConfiguration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(bluetoothMeasConfig);
+               v(bluetoothMeasConfigNameList);
+               v(bt_rssi);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(bluetoothMeasConfig);
+               v(bluetoothMeasConfigNameList);
+               v(bt_rssi);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               bluetoothMeasConfig.clear();
+               bluetoothMeasConfigNameList.clear();
+               bt_rssi.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       bluetoothMeasConfig_t   bluetoothMeasConfig;
+       bluetoothMeasConfigNameList_t   bluetoothMeasConfigNameList;
+       bt_rssi_t       bt_rssi;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+BroadcastPLMNs-Item ::= SEQUENCE (SIZE(1..maxnoofBPLMNs)) OF PLMN-Identity
+*/
+
+struct BroadcastPLMNs_Item_elm : PLMN_Identity
+{
+       static constexpr const char* name() {return "BroadcastPLMNs_Item_elm";}
+       using parent_t = PLMN_Identity;
+
+};
+struct BroadcastPLMNs_Item : asn::sequenceof<BroadcastPLMNs_Item_elm>
+{
+       static constexpr const char* name() {return "BroadcastPLMNs-Item";}
+       using parent_t = asn::sequenceof<BroadcastPLMNs_Item_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofBPLMNs >>;
+
+};
+/*
+CNTypeRestrictionsItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CNTypeRestrictionsItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CNTypeRestrictionsItem ::= SEQUENCE {
+       plmn-Id                         PLMN-Identity,
+       cn-type                         ENUMERATED {fiveGC-forbidden, ...},
+       iE-Extensions           ProtocolExtensionContainer { {CNTypeRestrictionsItem-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CNTypeRestrictionsItem : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CNTypeRestrictionsItem";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct plmn_Id_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "plmn_Id_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       plmn_Id_t& ref_plmn_Id() {return plmn_Id;}
+       plmn_Id_t const& ref_plmn_Id() const {return plmn_Id;}
+       struct cn_type_t : asn::enumerated<1, 0, true>
+       {
+               static constexpr const char* name() {return "cn_type_t";}
+               using parent_t = asn::enumerated<1, 0, true>;
+               typedef enum {
+                       fiveGC_forbidden
+               } index_t;
+
+       };
+
+       cn_type_t& ref_cn_type() {return cn_type;}
+       cn_type_t const& ref_cn_type() const {return cn_type;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CNTypeRestrictionsItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CNTypeRestrictionsItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(plmn_Id);
+               v(cn_type);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(plmn_Id);
+               v(cn_type);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               plmn_Id.clear();
+               cn_type.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       plmn_Id_t       plmn_Id;
+       cn_type_t       cn_type;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CNTypeRestrictions ::= SEQUENCE (SIZE(1.. maxnoofEPLMNsPlusOne)) OF CNTypeRestrictionsItem
+*/
+
+struct CNTypeRestrictions_elm : CNTypeRestrictionsItem
+{
+       static constexpr const char* name() {return "CNTypeRestrictions_elm";}
+       using parent_t = CNTypeRestrictionsItem;
+
+};
+struct CNTypeRestrictions : asn::sequenceof<CNTypeRestrictions_elm>
+{
+       static constexpr const char* name() {return "CNTypeRestrictions";}
+       using parent_t = asn::sequenceof<CNTypeRestrictions_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofEPLMNsPlusOne >>;
+
+};
+/*
+PDCP-SNExtended ::= INTEGER (0..32767)
+*/
+
+struct PDCP_SNExtended : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 32767>>;
+       static constexpr const char* name() {return "PDCP-SNExtended";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+HFNModified ::= INTEGER (0..131071)
+*/
+
+struct HFNModified : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 131071>>;
+       static constexpr const char* name() {return "HFNModified";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+COUNTValueExtended-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct COUNTValueExtended_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+COUNTValueExtended ::= SEQUENCE {
+       pDCP-SNExtended                 PDCP-SNExtended,
+       hFNModified                             HFNModified,
+       iE-Extensions                   ProtocolExtensionContainer { {COUNTValueExtended-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct COUNTValueExtended : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "COUNTValueExtended";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pDCP_SNExtended_t : PDCP_SNExtended
+       {
+               static constexpr const char* name() {return "pDCP_SNExtended_t";}
+               using parent_t = PDCP_SNExtended;
+
+       };
+       pDCP_SNExtended_t& ref_pDCP_SNExtended() {return pDCP_SNExtended;}
+       pDCP_SNExtended_t const& ref_pDCP_SNExtended() const {return pDCP_SNExtended;}
+       struct hFNModified_t : HFNModified
+       {
+               static constexpr const char* name() {return "hFNModified_t";}
+               using parent_t = HFNModified;
+
+       };
+       hFNModified_t& ref_hFNModified() {return hFNModified;}
+       hFNModified_t const& ref_hFNModified() const {return hFNModified;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<COUNTValueExtended_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<COUNTValueExtended_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pDCP_SNExtended);
+               v(hFNModified);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pDCP_SNExtended);
+               v(hFNModified);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pDCP_SNExtended.clear();
+               hFNModified.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pDCP_SNExtended_t       pDCP_SNExtended;
+       hFNModified_t   hFNModified;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+PDCP-SN ::= INTEGER (0..4095)
+*/
+
+struct PDCP_SN : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 4095>>;
+       static constexpr const char* name() {return "PDCP-SN";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+HFN ::= INTEGER (0..1048575)
+*/
+
+struct HFN : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 1048575>>;
+       static constexpr const char* name() {return "HFN";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+COUNTvalue-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct COUNTvalue_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+COUNTvalue ::= SEQUENCE {
+       pDCP-SN                                 PDCP-SN,
+       hFN                                             HFN,
+       iE-Extensions                   ProtocolExtensionContainer { {COUNTvalue-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct COUNTvalue : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "COUNTvalue";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pDCP_SN_t : PDCP_SN
+       {
+               static constexpr const char* name() {return "pDCP_SN_t";}
+               using parent_t = PDCP_SN;
+
+       };
+       pDCP_SN_t& ref_pDCP_SN() {return pDCP_SN;}
+       pDCP_SN_t const& ref_pDCP_SN() const {return pDCP_SN;}
+       struct hFN_t : HFN
+       {
+               static constexpr const char* name() {return "hFN_t";}
+               using parent_t = HFN;
+
+       };
+       hFN_t& ref_hFN() {return hFN;}
+       hFN_t const& ref_hFN() const {return hFN;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<COUNTvalue_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<COUNTvalue_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pDCP_SN);
+               v(hFN);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pDCP_SN);
+               v(hFN);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pDCP_SN.clear();
+               hFN.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pDCP_SN_t       pDCP_SN;
+       hFN_t   hFN;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+PDCP-SNlength18 ::= INTEGER (0..262143)
+*/
+
+struct PDCP_SNlength18 : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 262143>>;
+       static constexpr const char* name() {return "PDCP-SNlength18";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+HFNforPDCP-SNlength18 ::= INTEGER (0..16383)
+*/
+
+struct HFNforPDCP_SNlength18 : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 16383>>;
+       static constexpr const char* name() {return "HFNforPDCP-SNlength18";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+COUNTvaluePDCP-SNlength18-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct COUNTvaluePDCP_SNlength18_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+COUNTvaluePDCP-SNlength18 ::= SEQUENCE {
+       pDCP-SNlength18                 PDCP-SNlength18,
+       hFNforPDCP-SNlength18   HFNforPDCP-SNlength18,
+       iE-Extensions                   ProtocolExtensionContainer { {COUNTvaluePDCP-SNlength18-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct COUNTvaluePDCP_SNlength18 : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "COUNTvaluePDCP-SNlength18";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pDCP_SNlength18_t : PDCP_SNlength18
+       {
+               static constexpr const char* name() {return "pDCP_SNlength18_t";}
+               using parent_t = PDCP_SNlength18;
+
+       };
+       pDCP_SNlength18_t& ref_pDCP_SNlength18() {return pDCP_SNlength18;}
+       pDCP_SNlength18_t const& ref_pDCP_SNlength18() const {return pDCP_SNlength18;}
+       struct hFNforPDCP_SNlength18_t : HFNforPDCP_SNlength18
+       {
+               static constexpr const char* name() {return "hFNforPDCP_SNlength18_t";}
+               using parent_t = HFNforPDCP_SNlength18;
+
+       };
+       hFNforPDCP_SNlength18_t& ref_hFNforPDCP_SNlength18() {return hFNforPDCP_SNlength18;}
+       hFNforPDCP_SNlength18_t const& ref_hFNforPDCP_SNlength18() const {return hFNforPDCP_SNlength18;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<COUNTvaluePDCP_SNlength18_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<COUNTvaluePDCP_SNlength18_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pDCP_SNlength18);
+               v(hFNforPDCP_SNlength18);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pDCP_SNlength18);
+               v(hFNforPDCP_SNlength18);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pDCP_SNlength18.clear();
+               hFNforPDCP_SNlength18.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pDCP_SNlength18_t       pDCP_SNlength18;
+       hFNforPDCP_SNlength18_t hFNforPDCP_SNlength18;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CRNTI ::= BIT STRING (SIZE (16))
+*/
+
+struct CRNTI : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<16>>;
+       static constexpr const char* name() {return "CRNTI";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+CSG-Id ::= BIT STRING (SIZE (27))
+*/
+
+struct CSG_Id : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<27>>;
+       static constexpr const char* name() {return "CSG-Id";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+CSGMembershipStatus ::= ENUMERATED {
+       member,
+       not-member
+}
+*/
+
+struct CSGMembershipStatus : asn::enumerated<2, 0, false>
+{
+       static constexpr const char* name() {return "CSGMembershipStatus";}
+       using parent_t = asn::enumerated<2, 0, false>;
+       typedef enum {
+               member
+               ,not_member
+       } index_t;
+
+};
+
+/*
+UEID ::= BIT STRING (SIZE (16))
+*/
+
+struct UEID : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<16>>;
+       static constexpr const char* name() {return "UEID";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+WidebandCQICodeword1::= CHOICE {
+       four-bitCQI                                                             INTEGER (0..15, ...),
+       three-bitSpatialDifferentialCQI                 INTEGER (0..7, ...),
+       ...
+}
+*/
+
+struct WidebandCQICodeword1 : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "WidebandCQICodeword1";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~WidebandCQICodeword1() {clear();}
+       struct four_bitCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 15>>;
+               static constexpr const char* name() {return "four_bitCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       struct three_bitSpatialDifferentialCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 7>>;
+               static constexpr const char* name() {return "three_bitSpatialDifferentialCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<four_bitCQI_t>(); break;
+               case 2: var.destroy<three_bitSpatialDifferentialCQI_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<four_bitCQI_t>());
+               case 2: set_index(2); return v(var.build<three_bitSpatialDifferentialCQI_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<four_bitCQI_t>());
+               case 2: return v(var.as<three_bitSpatialDifferentialCQI_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<four_bitCQI_t>(1);
+               v.template operator()<three_bitSpatialDifferentialCQI_t>(2);
+
+       }
+       four_bitCQI_t& select_four_bitCQI() { if(get_index() != 1) { clear(); set_index(1); return var.build<four_bitCQI_t>();} return var.as<four_bitCQI_t>();}
+       four_bitCQI_t const* get_four_bitCQI() const { if(get_index() == 1) { return &var.as<four_bitCQI_t>();} return nullptr; }
+       three_bitSpatialDifferentialCQI_t& select_three_bitSpatialDifferentialCQI() { if(get_index() != 2) { clear(); set_index(2); return var.build<three_bitSpatialDifferentialCQI_t>();} return var.as<three_bitSpatialDifferentialCQI_t>();}
+       three_bitSpatialDifferentialCQI_t const* get_three_bitSpatialDifferentialCQI() const { if(get_index() == 2) { return &var.as<three_bitSpatialDifferentialCQI_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(four_bitCQI_t)];
+               char dummy2[sizeof(three_bitSpatialDifferentialCQI_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+WidebandCQI-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct WidebandCQI_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+WidebandCQI ::= SEQUENCE {
+       widebandCQICodeword0            INTEGER (0..15, ...),
+       widebandCQICodeword1            WidebandCQICodeword1            OPTIONAL,
+       iE-Extensions                           ProtocolExtensionContainer { {WidebandCQI-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct WidebandCQI : asn::sequence<3, 0, true, 2>
+{
+       static constexpr const char* name() {return "WidebandCQI";}
+       using parent_t = asn::sequence<3, 0, true, 2>;
+       struct widebandCQICodeword0_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 15>>;
+               static constexpr const char* name() {return "widebandCQICodeword0_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       widebandCQICodeword0_t& ref_widebandCQICodeword0() {return widebandCQICodeword0;}
+       widebandCQICodeword0_t const& ref_widebandCQICodeword0() const {return widebandCQICodeword0;}
+       struct widebandCQICodeword1_t : WidebandCQICodeword1
+       {
+               static constexpr const char* name() {return "widebandCQICodeword1_t";}
+               using parent_t = WidebandCQICodeword1;
+               static constexpr bool optional = true;
+
+       };
+       widebandCQICodeword1_t& set_widebandCQICodeword1() { widebandCQICodeword1.setpresent(true); return widebandCQICodeword1;}
+       widebandCQICodeword1_t const* get_widebandCQICodeword1() const {return widebandCQICodeword1.is_valid() ? &widebandCQICodeword1 : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<WidebandCQI_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<WidebandCQI_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(widebandCQICodeword0);
+               v(widebandCQICodeword1);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(widebandCQICodeword0);
+               v(widebandCQICodeword1);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               widebandCQICodeword0.clear();
+               widebandCQICodeword1.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       widebandCQICodeword0_t  widebandCQICodeword0;
+       widebandCQICodeword1_t  widebandCQICodeword1;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SubbandSize ::= ENUMERATED {
+       size2,
+       size3,
+       size4,
+       size6,
+       size8,
+       ...
+}
+*/
+
+struct SubbandSize : asn::enumerated<5, 0, true>
+{
+       static constexpr const char* name() {return "SubbandSize";}
+       using parent_t = asn::enumerated<5, 0, true>;
+       typedef enum {
+               size2
+               ,size3
+               ,size4
+               ,size6
+               ,size8
+       } index_t;
+
+};
+
+/*
+SubbandCQICodeword0 ::= CHOICE {
+       four-bitCQI                                             INTEGER (0..15, ...),
+       two-bitSubbandDifferentialCQI   INTEGER (0..3, ...),
+       two-bitDifferentialCQI                  INTEGER (0..3, ...),
+       ...
+}
+*/
+
+struct SubbandCQICodeword0 : asn::choice<3, 0, true>
+{
+       static constexpr const char* name() {return "SubbandCQICodeword0";}
+       using parent_t = asn::choice<3, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 4;}
+       void set_unknown() { set_index(4);  }
+       ~SubbandCQICodeword0() {clear();}
+       struct four_bitCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 15>>;
+               static constexpr const char* name() {return "four_bitCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       struct two_bitSubbandDifferentialCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 3>>;
+               static constexpr const char* name() {return "two_bitSubbandDifferentialCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       struct two_bitDifferentialCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 3>>;
+               static constexpr const char* name() {return "two_bitDifferentialCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<four_bitCQI_t>(); break;
+               case 2: var.destroy<two_bitSubbandDifferentialCQI_t>(); break;
+               case 3: var.destroy<two_bitDifferentialCQI_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<four_bitCQI_t>());
+               case 2: set_index(2); return v(var.build<two_bitSubbandDifferentialCQI_t>());
+               case 3: set_index(3); return v(var.build<two_bitDifferentialCQI_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<four_bitCQI_t>());
+               case 2: return v(var.as<two_bitSubbandDifferentialCQI_t>());
+               case 3: return v(var.as<two_bitDifferentialCQI_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<four_bitCQI_t>(1);
+               v.template operator()<two_bitSubbandDifferentialCQI_t>(2);
+               v.template operator()<two_bitDifferentialCQI_t>(3);
+
+       }
+       four_bitCQI_t& select_four_bitCQI() { if(get_index() != 1) { clear(); set_index(1); return var.build<four_bitCQI_t>();} return var.as<four_bitCQI_t>();}
+       four_bitCQI_t const* get_four_bitCQI() const { if(get_index() == 1) { return &var.as<four_bitCQI_t>();} return nullptr; }
+       two_bitSubbandDifferentialCQI_t& select_two_bitSubbandDifferentialCQI() { if(get_index() != 2) { clear(); set_index(2); return var.build<two_bitSubbandDifferentialCQI_t>();} return var.as<two_bitSubbandDifferentialCQI_t>();}
+       two_bitSubbandDifferentialCQI_t const* get_two_bitSubbandDifferentialCQI() const { if(get_index() == 2) { return &var.as<two_bitSubbandDifferentialCQI_t>();} return nullptr; }
+       two_bitDifferentialCQI_t& select_two_bitDifferentialCQI() { if(get_index() != 3) { clear(); set_index(3); return var.build<two_bitDifferentialCQI_t>();} return var.as<two_bitDifferentialCQI_t>();}
+       two_bitDifferentialCQI_t const* get_two_bitDifferentialCQI() const { if(get_index() == 3) { return &var.as<two_bitDifferentialCQI_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(four_bitCQI_t)];
+               char dummy2[sizeof(two_bitSubbandDifferentialCQI_t)];
+               char dummy3[sizeof(two_bitDifferentialCQI_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+SubbandCQICodeword1 ::= CHOICE {
+       four-bitCQI                                                     INTEGER (0..15, ...),
+       three-bitSpatialDifferentialCQI         INTEGER (0..7, ...),
+       two-bitSubbandDifferentialCQI           INTEGER (0..3, ...),
+       two-bitDifferentialCQI                          INTEGER (0..3, ...),
+       ...
+}
+*/
+
+struct SubbandCQICodeword1 : asn::choice<4, 0, true>
+{
+       static constexpr const char* name() {return "SubbandCQICodeword1";}
+       using parent_t = asn::choice<4, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 5;}
+       void set_unknown() { set_index(5);  }
+       ~SubbandCQICodeword1() {clear();}
+       struct four_bitCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 15>>;
+               static constexpr const char* name() {return "four_bitCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       struct three_bitSpatialDifferentialCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 7>>;
+               static constexpr const char* name() {return "three_bitSpatialDifferentialCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       struct two_bitSubbandDifferentialCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 3>>;
+               static constexpr const char* name() {return "two_bitSubbandDifferentialCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       struct two_bitDifferentialCQI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 3>>;
+               static constexpr const char* name() {return "two_bitDifferentialCQI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<four_bitCQI_t>(); break;
+               case 2: var.destroy<three_bitSpatialDifferentialCQI_t>(); break;
+               case 3: var.destroy<two_bitSubbandDifferentialCQI_t>(); break;
+               case 4: var.destroy<two_bitDifferentialCQI_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<four_bitCQI_t>());
+               case 2: set_index(2); return v(var.build<three_bitSpatialDifferentialCQI_t>());
+               case 3: set_index(3); return v(var.build<two_bitSubbandDifferentialCQI_t>());
+               case 4: set_index(4); return v(var.build<two_bitDifferentialCQI_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<four_bitCQI_t>());
+               case 2: return v(var.as<three_bitSpatialDifferentialCQI_t>());
+               case 3: return v(var.as<two_bitSubbandDifferentialCQI_t>());
+               case 4: return v(var.as<two_bitDifferentialCQI_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<four_bitCQI_t>(1);
+               v.template operator()<three_bitSpatialDifferentialCQI_t>(2);
+               v.template operator()<two_bitSubbandDifferentialCQI_t>(3);
+               v.template operator()<two_bitDifferentialCQI_t>(4);
+
+       }
+       four_bitCQI_t& select_four_bitCQI() { if(get_index() != 1) { clear(); set_index(1); return var.build<four_bitCQI_t>();} return var.as<four_bitCQI_t>();}
+       four_bitCQI_t const* get_four_bitCQI() const { if(get_index() == 1) { return &var.as<four_bitCQI_t>();} return nullptr; }
+       three_bitSpatialDifferentialCQI_t& select_three_bitSpatialDifferentialCQI() { if(get_index() != 2) { clear(); set_index(2); return var.build<three_bitSpatialDifferentialCQI_t>();} return var.as<three_bitSpatialDifferentialCQI_t>();}
+       three_bitSpatialDifferentialCQI_t const* get_three_bitSpatialDifferentialCQI() const { if(get_index() == 2) { return &var.as<three_bitSpatialDifferentialCQI_t>();} return nullptr; }
+       two_bitSubbandDifferentialCQI_t& select_two_bitSubbandDifferentialCQI() { if(get_index() != 3) { clear(); set_index(3); return var.build<two_bitSubbandDifferentialCQI_t>();} return var.as<two_bitSubbandDifferentialCQI_t>();}
+       two_bitSubbandDifferentialCQI_t const* get_two_bitSubbandDifferentialCQI() const { if(get_index() == 3) { return &var.as<two_bitSubbandDifferentialCQI_t>();} return nullptr; }
+       two_bitDifferentialCQI_t& select_two_bitDifferentialCQI() { if(get_index() != 4) { clear(); set_index(4); return var.build<two_bitDifferentialCQI_t>();} return var.as<two_bitDifferentialCQI_t>();}
+       two_bitDifferentialCQI_t const* get_two_bitDifferentialCQI() const { if(get_index() == 4) { return &var.as<two_bitDifferentialCQI_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(four_bitCQI_t)];
+               char dummy2[sizeof(three_bitSpatialDifferentialCQI_t)];
+               char dummy3[sizeof(two_bitSubbandDifferentialCQI_t)];
+               char dummy4[sizeof(two_bitDifferentialCQI_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+SubbandCQI-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SubbandCQI_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SubbandCQI ::= SEQUENCE {
+       subbandCQICodeword0                     SubbandCQICodeword0,
+       subbandCQICodeword1                     SubbandCQICodeword1             OPTIONAL,
+       iE-Extensions                           ProtocolExtensionContainer { {SubbandCQI-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct SubbandCQI : asn::sequence<3, 0, true, 2>
+{
+       static constexpr const char* name() {return "SubbandCQI";}
+       using parent_t = asn::sequence<3, 0, true, 2>;
+       struct subbandCQICodeword0_t : SubbandCQICodeword0
+       {
+               static constexpr const char* name() {return "subbandCQICodeword0_t";}
+               using parent_t = SubbandCQICodeword0;
+
+       };
+       subbandCQICodeword0_t& ref_subbandCQICodeword0() {return subbandCQICodeword0;}
+       subbandCQICodeword0_t const& ref_subbandCQICodeword0() const {return subbandCQICodeword0;}
+       struct subbandCQICodeword1_t : SubbandCQICodeword1
+       {
+               static constexpr const char* name() {return "subbandCQICodeword1_t";}
+               using parent_t = SubbandCQICodeword1;
+               static constexpr bool optional = true;
+
+       };
+       subbandCQICodeword1_t& set_subbandCQICodeword1() { subbandCQICodeword1.setpresent(true); return subbandCQICodeword1;}
+       subbandCQICodeword1_t const* get_subbandCQICodeword1() const {return subbandCQICodeword1.is_valid() ? &subbandCQICodeword1 : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SubbandCQI_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SubbandCQI_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(subbandCQICodeword0);
+               v(subbandCQICodeword1);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(subbandCQICodeword0);
+               v(subbandCQICodeword1);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               subbandCQICodeword0.clear();
+               subbandCQICodeword1.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       subbandCQICodeword0_t   subbandCQICodeword0;
+       subbandCQICodeword1_t   subbandCQICodeword1;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SubbandCQIItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SubbandCQIItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SubbandCQIItem ::= SEQUENCE {
+       subbandCQI                      SubbandCQI,
+       subbandIndex            INTEGER (0..27,...),
+       iE-Extensions           ProtocolExtensionContainer { {SubbandCQIItem-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct SubbandCQIItem : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "SubbandCQIItem";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct subbandCQI_t : SubbandCQI
+       {
+               static constexpr const char* name() {return "subbandCQI_t";}
+               using parent_t = SubbandCQI;
+
+       };
+       subbandCQI_t& ref_subbandCQI() {return subbandCQI;}
+       subbandCQI_t const& ref_subbandCQI() const {return subbandCQI;}
+       struct subbandIndex_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 27>>;
+               static constexpr const char* name() {return "subbandIndex_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       subbandIndex_t& ref_subbandIndex() {return subbandIndex;}
+       subbandIndex_t const& ref_subbandIndex() const {return subbandIndex;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SubbandCQIItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SubbandCQIItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(subbandCQI);
+               v(subbandIndex);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(subbandCQI);
+               v(subbandIndex);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               subbandCQI.clear();
+               subbandIndex.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       subbandCQI_t    subbandCQI;
+       subbandIndex_t  subbandIndex;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SubbandCQIList ::= SEQUENCE (SIZE(1.. maxSubband)) OF SubbandCQIItem
+*/
+
+struct SubbandCQIList_elm : SubbandCQIItem
+{
+       static constexpr const char* name() {return "SubbandCQIList_elm";}
+       using parent_t = SubbandCQIItem;
+
+};
+struct SubbandCQIList : asn::sequenceof<SubbandCQIList_elm>
+{
+       static constexpr const char* name() {return "SubbandCQIList";}
+       using parent_t = asn::sequenceof<SubbandCQIList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxSubband >>;
+
+};
+/*
+CSIReportPerCSIProcessItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CSIReportPerCSIProcessItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CSIReportPerCSIProcessItem ::= SEQUENCE (SIZE(1.. maxCSIReport)) OF
+       SEQUENCE {
+               rI                                                              INTEGER (1..8, ...),
+               widebandCQI                                             WidebandCQI,
+               subbandSize                                             SubbandSize,
+               subbandCQIList                                  SubbandCQIList  OPTIONAL,
+               iE-Extensions                                   ProtocolExtensionContainer { {CSIReportPerCSIProcessItem-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct CSIReportPerCSIProcessItem_elm : asn::sequence<5, 0, true, 2>
+{
+       static constexpr const char* name() {return "CSIReportPerCSIProcessItem_elm";}
+       using parent_t = asn::sequence<5, 0, true, 2>;
+       struct rI_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 8>>;
+               static constexpr const char* name() {return "rI_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       rI_t& ref_rI() {return rI;}
+       rI_t const& ref_rI() const {return rI;}
+       struct widebandCQI_t : WidebandCQI
+       {
+               static constexpr const char* name() {return "widebandCQI_t";}
+               using parent_t = WidebandCQI;
+
+       };
+       widebandCQI_t& ref_widebandCQI() {return widebandCQI;}
+       widebandCQI_t const& ref_widebandCQI() const {return widebandCQI;}
+       struct subbandSize_t : SubbandSize
+       {
+               static constexpr const char* name() {return "subbandSize_t";}
+               using parent_t = SubbandSize;
+
+       };
+       subbandSize_t& ref_subbandSize() {return subbandSize;}
+       subbandSize_t const& ref_subbandSize() const {return subbandSize;}
+       struct subbandCQIList_t : SubbandCQIList
+       {
+               static constexpr const char* name() {return "subbandCQIList_t";}
+               using parent_t = SubbandCQIList;
+               static constexpr bool optional = true;
+
+       };
+       subbandCQIList_t& set_subbandCQIList() { subbandCQIList.setpresent(true); return subbandCQIList;}
+       subbandCQIList_t const* get_subbandCQIList() const {return subbandCQIList.is_valid() ? &subbandCQIList : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CSIReportPerCSIProcessItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CSIReportPerCSIProcessItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(rI);
+               v(widebandCQI);
+               v(subbandSize);
+               v(subbandCQIList);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(rI);
+               v(widebandCQI);
+               v(subbandSize);
+               v(subbandCQIList);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               rI.clear();
+               widebandCQI.clear();
+               subbandSize.clear();
+               subbandCQIList.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       rI_t    rI;
+       widebandCQI_t   widebandCQI;
+       subbandSize_t   subbandSize;
+       subbandCQIList_t        subbandCQIList;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct CSIReportPerCSIProcessItem : asn::sequenceof<CSIReportPerCSIProcessItem_elm>
+{
+       static constexpr const char* name() {return "CSIReportPerCSIProcessItem";}
+       using parent_t = asn::sequenceof<CSIReportPerCSIProcessItem_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCSIReport >>;
+
+};
+/*
+CSIReportPerCSIProcess-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CSIReportPerCSIProcess_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CSIReportPerCSIProcess ::= SEQUENCE (SIZE(1.. maxCSIProcess)) OF
+       SEQUENCE {
+               cSIProcessConfigurationIndex    INTEGER (1..7, ...),
+               cSIReportPerCSIProcessItem              CSIReportPerCSIProcessItem,
+               iE-Extensions                                   ProtocolExtensionContainer { {CSIReportPerCSIProcess-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct CSIReportPerCSIProcess_elm : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CSIReportPerCSIProcess_elm";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct cSIProcessConfigurationIndex_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 7>>;
+               static constexpr const char* name() {return "cSIProcessConfigurationIndex_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       cSIProcessConfigurationIndex_t& ref_cSIProcessConfigurationIndex() {return cSIProcessConfigurationIndex;}
+       cSIProcessConfigurationIndex_t const& ref_cSIProcessConfigurationIndex() const {return cSIProcessConfigurationIndex;}
+       struct cSIReportPerCSIProcessItem_t : CSIReportPerCSIProcessItem
+       {
+               static constexpr const char* name() {return "cSIReportPerCSIProcessItem_t";}
+               using parent_t = CSIReportPerCSIProcessItem;
+
+       };
+       cSIReportPerCSIProcessItem_t& ref_cSIReportPerCSIProcessItem() {return cSIReportPerCSIProcessItem;}
+       cSIReportPerCSIProcessItem_t const& ref_cSIReportPerCSIProcessItem() const {return cSIReportPerCSIProcessItem;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CSIReportPerCSIProcess_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CSIReportPerCSIProcess_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(cSIProcessConfigurationIndex);
+               v(cSIReportPerCSIProcessItem);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(cSIProcessConfigurationIndex);
+               v(cSIReportPerCSIProcessItem);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               cSIProcessConfigurationIndex.clear();
+               cSIReportPerCSIProcessItem.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       cSIProcessConfigurationIndex_t  cSIProcessConfigurationIndex;
+       cSIReportPerCSIProcessItem_t    cSIReportPerCSIProcessItem;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct CSIReportPerCSIProcess : asn::sequenceof<CSIReportPerCSIProcess_elm>
+{
+       static constexpr const char* name() {return "CSIReportPerCSIProcess";}
+       using parent_t = asn::sequenceof<CSIReportPerCSIProcess_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCSIProcess >>;
+
+};
+/*
+CSIReportList-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CSIReportList_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CSIReportList ::= SEQUENCE (SIZE(1..maxUEReport)) OF
+       SEQUENCE {
+               uEID                                                    UEID,
+               cSIReportPerCSIProcess                  CSIReportPerCSIProcess,
+               iE-Extensions                                   ProtocolExtensionContainer { {CSIReportList-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct CSIReportList_elm : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CSIReportList_elm";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct uEID_t : UEID
+       {
+               static constexpr const char* name() {return "uEID_t";}
+               using parent_t = UEID;
+
+       };
+       uEID_t& ref_uEID() {return uEID;}
+       uEID_t const& ref_uEID() const {return uEID;}
+       struct cSIReportPerCSIProcess_t : CSIReportPerCSIProcess
+       {
+               static constexpr const char* name() {return "cSIReportPerCSIProcess_t";}
+               using parent_t = CSIReportPerCSIProcess;
+
+       };
+       cSIReportPerCSIProcess_t& ref_cSIReportPerCSIProcess() {return cSIReportPerCSIProcess;}
+       cSIReportPerCSIProcess_t const& ref_cSIReportPerCSIProcess() const {return cSIReportPerCSIProcess;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CSIReportList_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CSIReportList_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uEID);
+               v(cSIReportPerCSIProcess);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uEID);
+               v(cSIReportPerCSIProcess);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uEID.clear();
+               cSIReportPerCSIProcess.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uEID_t  uEID;
+       cSIReportPerCSIProcess_t        cSIReportPerCSIProcess;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct CSIReportList : asn::sequenceof<CSIReportList_elm>
+{
+       static constexpr const char* name() {return "CSIReportList";}
+       using parent_t = asn::sequenceof<CSIReportList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxUEReport >>;
+
+};
+/*
+CapacityValue ::= INTEGER (0..100)
+*/
+
+struct CapacityValue : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "CapacityValue";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+CauseRadioNetwork ::= ENUMERATED {
+       handover-desirable-for-radio-reasons,
+       time-critical-handover,
+       resource-optimisation-handover,
+       reduce-load-in-serving-cell,
+       partial-handover,
+       unknown-new-eNB-UE-X2AP-ID,
+       unknown-old-eNB-UE-X2AP-ID,
+       unknown-pair-of-UE-X2AP-ID,
+       ho-target-not-allowed,
+       tx2relocoverall-expiry,
+       trelocprep-expiry,
+       cell-not-available,
+       no-radio-resources-available-in-target-cell,
+       invalid-MME-GroupID,
+       unknown-MME-Code,
+       encryption-and-or-integrity-protection-algorithms-not-supported,
+       reportCharacteristicsEmpty,
+       noReportPeriodicity,
+       existingMeasurementID,
+       unknown-eNB-Measurement-ID,
+       measurement-temporarily-not-available,
+       unspecified,
+       ...,
+       load-balancing,
+       handover-optimisation,
+       value-out-of-allowed-range,
+       multiple-E-RAB-ID-instances,
+       switch-off-ongoing,
+       not-supported-QCI-value,
+       measurement-not-supported-for-the-object,
+       tDCoverall-expiry,
+       tDCprep-expiry,
+       action-desirable-for-radio-reasons,
+       reduce-load,
+       resource-optimisation,
+       time-critical-action,
+       target-not-allowed,
+       no-radio-resources-available,
+       invalid-QoS-combination,
+       encryption-algorithms-not-aupported,
+       procedure-cancelled,
+       rRM-purpose,
+       improve-user-bit-rate,
+       user-inactivity,
+       radio-connection-with-UE-lost,
+       failure-in-the-radio-interface-procedure,
+       bearer-option-not-supported,
+       mCG-Mobility,
+       sCG-Mobility,
+       count-reaches-max-value,
+       unknown-old-en-gNB-UE-X2AP-ID,
+       pDCP-Overload
+
+}
+*/
+
+struct CauseRadioNetwork : asn::enumerated<51, 29, true>
+{
+       static constexpr const char* name() {return "CauseRadioNetwork";}
+       using parent_t = asn::enumerated<51, 29, true>;
+       typedef enum {
+               handover_desirable_for_radio_reasons
+               ,time_critical_handover
+               ,resource_optimisation_handover
+               ,reduce_load_in_serving_cell
+               ,partial_handover
+               ,unknown_new_eNB_UE_X2AP_ID
+               ,unknown_old_eNB_UE_X2AP_ID
+               ,unknown_pair_of_UE_X2AP_ID
+               ,ho_target_not_allowed
+               ,tx2relocoverall_expiry
+               ,trelocprep_expiry
+               ,cell_not_available
+               ,no_radio_resources_available_in_target_cell
+               ,invalid_MME_GroupID
+               ,unknown_MME_Code
+               ,encryption_and_or_integrity_protection_algorithms_not_supported
+               ,reportCharacteristicsEmpty
+               ,noReportPeriodicity
+               ,existingMeasurementID
+               ,unknown_eNB_Measurement_ID
+               ,measurement_temporarily_not_available
+               ,unspecified
+               ,load_balancing
+               ,handover_optimisation
+               ,value_out_of_allowed_range
+               ,multiple_E_RAB_ID_instances
+               ,switch_off_ongoing
+               ,not_supported_QCI_value
+               ,measurement_not_supported_for_the_object
+               ,tDCoverall_expiry
+               ,tDCprep_expiry
+               ,action_desirable_for_radio_reasons
+               ,reduce_load
+               ,resource_optimisation
+               ,time_critical_action
+               ,target_not_allowed
+               ,no_radio_resources_available
+               ,invalid_QoS_combination
+               ,encryption_algorithms_not_aupported
+               ,procedure_cancelled
+               ,rRM_purpose
+               ,improve_user_bit_rate
+               ,user_inactivity
+               ,radio_connection_with_UE_lost
+               ,failure_in_the_radio_interface_procedure
+               ,bearer_option_not_supported
+               ,mCG_Mobility
+               ,sCG_Mobility
+               ,count_reaches_max_value
+               ,unknown_old_en_gNB_UE_X2AP_ID
+               ,pDCP_Overload
+       } index_t;
+
+};
+
+/*
+CauseTransport ::= ENUMERATED {
+       transport-resource-unavailable,
+       unspecified,
+       ...
+}
+*/
+
+struct CauseTransport : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "CauseTransport";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               transport_resource_unavailable
+               ,unspecified
+       } index_t;
+
+};
+
+/*
+CauseProtocol ::= ENUMERATED {
+       transfer-syntax-error,
+       abstract-syntax-error-reject,
+       abstract-syntax-error-ignore-and-notify,
+       message-not-compatible-with-receiver-state,
+       semantic-error,
+       unspecified,
+       abstract-syntax-error-falsely-constructed-message,
+       ...
+}
+*/
+
+struct CauseProtocol : asn::enumerated<7, 0, true>
+{
+       static constexpr const char* name() {return "CauseProtocol";}
+       using parent_t = asn::enumerated<7, 0, true>;
+       typedef enum {
+               transfer_syntax_error
+               ,abstract_syntax_error_reject
+               ,abstract_syntax_error_ignore_and_notify
+               ,message_not_compatible_with_receiver_state
+               ,semantic_error
+               ,unspecified
+               ,abstract_syntax_error_falsely_constructed_message
+       } index_t;
+
+};
+
+/*
+CauseMisc ::= ENUMERATED {
+       control-processing-overload,
+       hardware-failure,
+       om-intervention,
+       not-enough-user-plane-processing-resources,
+       unspecified,
+       ...
+}
+*/
+
+struct CauseMisc : asn::enumerated<5, 0, true>
+{
+       static constexpr const char* name() {return "CauseMisc";}
+       using parent_t = asn::enumerated<5, 0, true>;
+       typedef enum {
+               control_processing_overload
+               ,hardware_failure
+               ,om_intervention
+               ,not_enough_user_plane_processing_resources
+               ,unspecified
+       } index_t;
+
+};
+
+/*
+Cause ::= CHOICE {
+       radioNetwork            CauseRadioNetwork,
+       transport                       CauseTransport,
+       protocol                        CauseProtocol,
+       misc                            CauseMisc,
+       ...
+}
+*/
+
+struct Cause : asn::choice<4, 0, true>
+{
+       static constexpr const char* name() {return "Cause";}
+       using parent_t = asn::choice<4, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 5;}
+       void set_unknown() { set_index(5);  }
+       ~Cause() {clear();}
+       struct radioNetwork_t : CauseRadioNetwork
+       {
+               static constexpr const char* name() {return "radioNetwork_t";}
+               using parent_t = CauseRadioNetwork;
+
+       };
+       struct transport_t : CauseTransport
+       {
+               static constexpr const char* name() {return "transport_t";}
+               using parent_t = CauseTransport;
+
+       };
+       struct protocol_t : CauseProtocol
+       {
+               static constexpr const char* name() {return "protocol_t";}
+               using parent_t = CauseProtocol;
+
+       };
+       struct misc_t : CauseMisc
+       {
+               static constexpr const char* name() {return "misc_t";}
+               using parent_t = CauseMisc;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<radioNetwork_t>(); break;
+               case 2: var.destroy<transport_t>(); break;
+               case 3: var.destroy<protocol_t>(); break;
+               case 4: var.destroy<misc_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<radioNetwork_t>());
+               case 2: set_index(2); return v(var.build<transport_t>());
+               case 3: set_index(3); return v(var.build<protocol_t>());
+               case 4: set_index(4); return v(var.build<misc_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<radioNetwork_t>());
+               case 2: return v(var.as<transport_t>());
+               case 3: return v(var.as<protocol_t>());
+               case 4: return v(var.as<misc_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<radioNetwork_t>(1);
+               v.template operator()<transport_t>(2);
+               v.template operator()<protocol_t>(3);
+               v.template operator()<misc_t>(4);
+
+       }
+       radioNetwork_t& select_radioNetwork() { if(get_index() != 1) { clear(); set_index(1); return var.build<radioNetwork_t>();} return var.as<radioNetwork_t>();}
+       radioNetwork_t const* get_radioNetwork() const { if(get_index() == 1) { return &var.as<radioNetwork_t>();} return nullptr; }
+       transport_t& select_transport() { if(get_index() != 2) { clear(); set_index(2); return var.build<transport_t>();} return var.as<transport_t>();}
+       transport_t const* get_transport() const { if(get_index() == 2) { return &var.as<transport_t>();} return nullptr; }
+       protocol_t& select_protocol() { if(get_index() != 3) { clear(); set_index(3); return var.build<protocol_t>();} return var.as<protocol_t>();}
+       protocol_t const* get_protocol() const { if(get_index() == 3) { return &var.as<protocol_t>();} return nullptr; }
+       misc_t& select_misc() { if(get_index() != 4) { clear(); set_index(4); return var.build<misc_t>();} return var.as<misc_t>();}
+       misc_t const* get_misc() const { if(get_index() == 4) { return &var.as<misc_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(radioNetwork_t)];
+               char dummy2[sizeof(transport_t)];
+               char dummy3[sizeof(protocol_t)];
+               char dummy4[sizeof(misc_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+Cell-Size ::= ENUMERATED {verysmall, small, medium, large, ... }
+*/
+
+struct Cell_Size : asn::enumerated<4, 0, true>
+{
+       static constexpr const char* name() {return "Cell-Size";}
+       using parent_t = asn::enumerated<4, 0, true>;
+       typedef enum {
+               verysmall
+               ,small
+               ,medium
+               ,large
+       } index_t;
+
+};
+
+/*
+CellCapacityClassValue ::= INTEGER (1..100, ...)
+*/
+
+struct CellCapacityClassValue : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 100>>;
+       static constexpr const char* name() {return "CellCapacityClassValue";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+CellDeploymentStatusIndicator ::= ENUMERATED {pre-change-notification, ...}
+*/
+
+struct CellDeploymentStatusIndicator : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "CellDeploymentStatusIndicator";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               pre_change_notification
+       } index_t;
+
+};
+
+/*
+ReplacingCellsList-Item ::= SEQUENCE {
+       eCGI                    ECGI,
+       ...
+}
+*/
+
+struct ReplacingCellsList_Item : asn::sequence<1, 0, true, 0>
+{
+       static constexpr const char* name() {return "ReplacingCellsList-Item";}
+       using parent_t = asn::sequence<1, 0, true, 0>;
+       struct eCGI_t : ECGI
+       {
+               static constexpr const char* name() {return "eCGI_t";}
+               using parent_t = ECGI;
+
+       };
+       eCGI_t& ref_eCGI() {return eCGI;}
+       eCGI_t const& ref_eCGI() const {return eCGI;}
+       template<typename V> void decode(V& v)
+       {
+               v(eCGI);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eCGI);
+
+       };
+       void clear()
+       {
+               eCGI.clear();
+
+       };
+       private:
+       eCGI_t  eCGI;
+
+};
+/*
+ReplacingCellsList ::= SEQUENCE (SIZE(0.. maxCellineNB)) OF ReplacingCellsList-Item
+*/
+
+struct ReplacingCellsList_elm : ReplacingCellsList_Item
+{
+       static constexpr const char* name() {return "ReplacingCellsList_elm";}
+       using parent_t = ReplacingCellsList_Item;
+
+};
+struct ReplacingCellsList : asn::sequenceof<ReplacingCellsList_elm>
+{
+       static constexpr const char* name() {return "ReplacingCellsList";}
+       using parent_t = asn::sequenceof<ReplacingCellsList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<0,  maxCellineNB >>;
+
+};
+/*
+CellReplacingInfo-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CellReplacingInfo_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CellReplacingInfo ::= SEQUENCE {
+       replacingCellsList                              ReplacingCellsList,
+       iE-Extensions                                   ProtocolExtensionContainer { {CellReplacingInfo-ExtIEs}}        OPTIONAL,
+       ...
+}
+*/
+
+struct CellReplacingInfo : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "CellReplacingInfo";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct replacingCellsList_t : ReplacingCellsList
+       {
+               static constexpr const char* name() {return "replacingCellsList_t";}
+               using parent_t = ReplacingCellsList;
+
+       };
+       replacingCellsList_t& ref_replacingCellsList() {return replacingCellsList;}
+       replacingCellsList_t const& ref_replacingCellsList() const {return replacingCellsList;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CellReplacingInfo_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CellReplacingInfo_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(replacingCellsList);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(replacingCellsList);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               replacingCellsList.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       replacingCellsList_t    replacingCellsList;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CellReportingIndicator ::= ENUMERATED {stop-request, ... }
+*/
+
+struct CellReportingIndicator : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "CellReportingIndicator";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               stop_request
+       } index_t;
+
+};
+
+/*
+CellType-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CellType_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CellType ::= SEQUENCE {
+       cell-Size                                               Cell-Size,
+       iE-Extensions                                   ProtocolExtensionContainer { {CellType-ExtIEs}} OPTIONAL,
+       ...
+}
+*/
+
+struct CellType : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "CellType";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct cell_Size_t : Cell_Size
+       {
+               static constexpr const char* name() {return "cell_Size_t";}
+               using parent_t = Cell_Size;
+
+       };
+       cell_Size_t& ref_cell_Size() {return cell_Size;}
+       cell_Size_t const& ref_cell_Size() const {return cell_Size;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CellType_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CellType_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(cell_Size);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(cell_Size);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               cell_Size.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       cell_Size_t     cell_Size;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CoMPHypothesisSetItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CoMPHypothesisSetItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CoMPHypothesisSetItem ::= SEQUENCE {
+       coMPCellID                                              ECGI,
+       coMPHypothesis                                  BIT STRING (SIZE(6..4400, ...)),
+       iE-Extensions                                   ProtocolExtensionContainer { {CoMPHypothesisSetItem-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CoMPHypothesisSetItem : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CoMPHypothesisSetItem";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct coMPCellID_t : ECGI
+       {
+               static constexpr const char* name() {return "coMPCellID_t";}
+               using parent_t = ECGI;
+
+       };
+       coMPCellID_t& ref_coMPCellID() {return coMPCellID;}
+       coMPCellID_t const& ref_coMPCellID() const {return coMPCellID;}
+       struct coMPHypothesis_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 4400>>;
+               static constexpr const char* name() {return "coMPHypothesis_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       coMPHypothesis_t& ref_coMPHypothesis() {return coMPHypothesis;}
+       coMPHypothesis_t const& ref_coMPHypothesis() const {return coMPHypothesis;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CoMPHypothesisSetItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CoMPHypothesisSetItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(coMPCellID);
+               v(coMPHypothesis);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(coMPCellID);
+               v(coMPHypothesis);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               coMPCellID.clear();
+               coMPHypothesis.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       coMPCellID_t    coMPCellID;
+       coMPHypothesis_t        coMPHypothesis;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CoMPHypothesisSet ::= SEQUENCE (SIZE(1..maxnoofCoMPCells)) OF CoMPHypothesisSetItem
+*/
+
+struct CoMPHypothesisSet_elm : CoMPHypothesisSetItem
+{
+       static constexpr const char* name() {return "CoMPHypothesisSet_elm";}
+       using parent_t = CoMPHypothesisSetItem;
+
+};
+struct CoMPHypothesisSet : asn::sequenceof<CoMPHypothesisSet_elm>
+{
+       static constexpr const char* name() {return "CoMPHypothesisSet";}
+       using parent_t = asn::sequenceof<CoMPHypothesisSet_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofCoMPCells >>;
+
+};
+/*
+CoMPInformationItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CoMPInformationItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CoMPInformationItem ::= SEQUENCE (SIZE(1..maxnoofCoMPHypothesisSet)) OF
+       SEQUENCE {
+               coMPHypothesisSet                                       CoMPHypothesisSet,
+               benefitMetric                                           BenefitMetric,
+               iE-Extensions                                           ProtocolExtensionContainer { {CoMPInformationItem-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct CoMPInformationItem_elm : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CoMPInformationItem_elm";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct coMPHypothesisSet_t : CoMPHypothesisSet
+       {
+               static constexpr const char* name() {return "coMPHypothesisSet_t";}
+               using parent_t = CoMPHypothesisSet;
+
+       };
+       coMPHypothesisSet_t& ref_coMPHypothesisSet() {return coMPHypothesisSet;}
+       coMPHypothesisSet_t const& ref_coMPHypothesisSet() const {return coMPHypothesisSet;}
+       struct benefitMetric_t : BenefitMetric
+       {
+               static constexpr const char* name() {return "benefitMetric_t";}
+               using parent_t = BenefitMetric;
+
+       };
+       benefitMetric_t& ref_benefitMetric() {return benefitMetric;}
+       benefitMetric_t const& ref_benefitMetric() const {return benefitMetric;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CoMPInformationItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CoMPInformationItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(coMPHypothesisSet);
+               v(benefitMetric);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(coMPHypothesisSet);
+               v(benefitMetric);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               coMPHypothesisSet.clear();
+               benefitMetric.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       coMPHypothesisSet_t     coMPHypothesisSet;
+       benefitMetric_t benefitMetric;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct CoMPInformationItem : asn::sequenceof<CoMPInformationItem_elm>
+{
+       static constexpr const char* name() {return "CoMPInformationItem";}
+       using parent_t = asn::sequenceof<CoMPInformationItem_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofCoMPHypothesisSet >>;
+
+};
+/*
+CoMPInformationStartTime-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CoMPInformationStartTime_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CoMPInformationStartTime ::= SEQUENCE (SIZE(0..1)) OF
+       SEQUENCE {
+               startSFN                                                        INTEGER (0..1023, ...),
+               startSubframeNumber                                     INTEGER (0..9, ...),
+               iE-Extensions                                           ProtocolExtensionContainer { {CoMPInformationStartTime-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct CoMPInformationStartTime_elm : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CoMPInformationStartTime_elm";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct startSFN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 1023>>;
+               static constexpr const char* name() {return "startSFN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       startSFN_t& ref_startSFN() {return startSFN;}
+       startSFN_t const& ref_startSFN() const {return startSFN;}
+       struct startSubframeNumber_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 9>>;
+               static constexpr const char* name() {return "startSubframeNumber_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       startSubframeNumber_t& ref_startSubframeNumber() {return startSubframeNumber;}
+       startSubframeNumber_t const& ref_startSubframeNumber() const {return startSubframeNumber;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CoMPInformationStartTime_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CoMPInformationStartTime_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(startSFN);
+               v(startSubframeNumber);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(startSFN);
+               v(startSubframeNumber);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               startSFN.clear();
+               startSubframeNumber.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       startSFN_t      startSFN;
+       startSubframeNumber_t   startSubframeNumber;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct CoMPInformationStartTime : asn::sequenceof<CoMPInformationStartTime_elm>
+{
+       static constexpr const char* name() {return "CoMPInformationStartTime";}
+       using parent_t = asn::sequenceof<CoMPInformationStartTime_elm>;
+       using constraint_t = asn::constraints<false,asn::span<0, 1>>;
+
+};
+/*
+CoMPInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CoMPInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CoMPInformation ::= SEQUENCE {
+       coMPInformationItem                                             CoMPInformationItem,
+       coMPInformationStartTime                                CoMPInformationStartTime,
+       iE-Extensions                                                   ProtocolExtensionContainer { {CoMPInformation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CoMPInformation : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CoMPInformation";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct coMPInformationItem_t : CoMPInformationItem
+       {
+               static constexpr const char* name() {return "coMPInformationItem_t";}
+               using parent_t = CoMPInformationItem;
+
+       };
+       coMPInformationItem_t& ref_coMPInformationItem() {return coMPInformationItem;}
+       coMPInformationItem_t const& ref_coMPInformationItem() const {return coMPInformationItem;}
+       struct coMPInformationStartTime_t : CoMPInformationStartTime
+       {
+               static constexpr const char* name() {return "coMPInformationStartTime_t";}
+               using parent_t = CoMPInformationStartTime;
+
+       };
+       coMPInformationStartTime_t& ref_coMPInformationStartTime() {return coMPInformationStartTime;}
+       coMPInformationStartTime_t const& ref_coMPInformationStartTime() const {return coMPInformationStartTime;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CoMPInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CoMPInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(coMPInformationItem);
+               v(coMPInformationStartTime);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(coMPInformationItem);
+               v(coMPInformationStartTime);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               coMPInformationItem.clear();
+               coMPInformationStartTime.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       coMPInformationItem_t   coMPInformationItem;
+       coMPInformationStartTime_t      coMPInformationStartTime;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CompositeAvailableCapacity-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CompositeAvailableCapacity_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CompositeAvailableCapacity ::= SEQUENCE {
+       cellCapacityClassValue                                                  CellCapacityClassValue                          OPTIONAL,
+       capacityValue                                                                   CapacityValue,
+       iE-Extensions                                                                   ProtocolExtensionContainer { {CompositeAvailableCapacity-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CompositeAvailableCapacity : asn::sequence<3, 0, true, 2>
+{
+       static constexpr const char* name() {return "CompositeAvailableCapacity";}
+       using parent_t = asn::sequence<3, 0, true, 2>;
+       struct cellCapacityClassValue_t : CellCapacityClassValue
+       {
+               static constexpr const char* name() {return "cellCapacityClassValue_t";}
+               using parent_t = CellCapacityClassValue;
+               static constexpr bool optional = true;
+
+       };
+       cellCapacityClassValue_t& set_cellCapacityClassValue() { cellCapacityClassValue.setpresent(true); return cellCapacityClassValue;}
+       cellCapacityClassValue_t const* get_cellCapacityClassValue() const {return cellCapacityClassValue.is_valid() ? &cellCapacityClassValue : nullptr;}
+       struct capacityValue_t : CapacityValue
+       {
+               static constexpr const char* name() {return "capacityValue_t";}
+               using parent_t = CapacityValue;
+
+       };
+       capacityValue_t& ref_capacityValue() {return capacityValue;}
+       capacityValue_t const& ref_capacityValue() const {return capacityValue;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CompositeAvailableCapacity_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CompositeAvailableCapacity_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(cellCapacityClassValue);
+               v(capacityValue);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(cellCapacityClassValue);
+               v(capacityValue);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               cellCapacityClassValue.clear();
+               capacityValue.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       cellCapacityClassValue_t        cellCapacityClassValue;
+       capacityValue_t capacityValue;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+CompositeAvailableCapacityGroup-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CompositeAvailableCapacityGroup_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CompositeAvailableCapacityGroup        ::= SEQUENCE {
+       dL-CompositeAvailableCapacity                                   CompositeAvailableCapacity,
+       uL-CompositeAvailableCapacity                                   CompositeAvailableCapacity,
+       iE-Extensions                                                                   ProtocolExtensionContainer { {CompositeAvailableCapacityGroup-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct CompositeAvailableCapacityGroup : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "CompositeAvailableCapacityGroup";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct dL_CompositeAvailableCapacity_t : CompositeAvailableCapacity
+       {
+               static constexpr const char* name() {return "dL_CompositeAvailableCapacity_t";}
+               using parent_t = CompositeAvailableCapacity;
+
+       };
+       dL_CompositeAvailableCapacity_t& ref_dL_CompositeAvailableCapacity() {return dL_CompositeAvailableCapacity;}
+       dL_CompositeAvailableCapacity_t const& ref_dL_CompositeAvailableCapacity() const {return dL_CompositeAvailableCapacity;}
+       struct uL_CompositeAvailableCapacity_t : CompositeAvailableCapacity
+       {
+               static constexpr const char* name() {return "uL_CompositeAvailableCapacity_t";}
+               using parent_t = CompositeAvailableCapacity;
+
+       };
+       uL_CompositeAvailableCapacity_t& ref_uL_CompositeAvailableCapacity() {return uL_CompositeAvailableCapacity;}
+       uL_CompositeAvailableCapacity_t const& ref_uL_CompositeAvailableCapacity() const {return uL_CompositeAvailableCapacity;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CompositeAvailableCapacityGroup_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CompositeAvailableCapacityGroup_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(dL_CompositeAvailableCapacity);
+               v(uL_CompositeAvailableCapacity);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(dL_CompositeAvailableCapacity);
+               v(uL_CompositeAvailableCapacity);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               dL_CompositeAvailableCapacity.clear();
+               uL_CompositeAvailableCapacity.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       dL_CompositeAvailableCapacity_t dL_CompositeAvailableCapacity;
+       uL_CompositeAvailableCapacity_t uL_CompositeAvailableCapacity;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+Correlation-ID ::= OCTET STRING (SIZE (4))
+*/
+
+struct Correlation_ID : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<4>>;
+       static constexpr const char* name() {return "Correlation-ID";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+CoverageModification-Item ::= SEQUENCE {
+       eCGI                                                    ECGI,
+       coverageState                                   INTEGER (0..15, ...),
+       cellDeploymentStatusIndicator   CellDeploymentStatusIndicator                   OPTIONAL,
+       cellReplacingInfo                               CellReplacingInfo                                               OPTIONAL,
+-- Included in case the Cell Deployment Status Indicator IE is present
+       ...
+}
+*/
+
+struct CoverageModification_Item : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "CoverageModification-Item";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct eCGI_t : ECGI
+       {
+               static constexpr const char* name() {return "eCGI_t";}
+               using parent_t = ECGI;
+
+       };
+       eCGI_t& ref_eCGI() {return eCGI;}
+       eCGI_t const& ref_eCGI() const {return eCGI;}
+       struct coverageState_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 15>>;
+               static constexpr const char* name() {return "coverageState_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       coverageState_t& ref_coverageState() {return coverageState;}
+       coverageState_t const& ref_coverageState() const {return coverageState;}
+       struct cellDeploymentStatusIndicator_t : CellDeploymentStatusIndicator
+       {
+               static constexpr const char* name() {return "cellDeploymentStatusIndicator_t";}
+               using parent_t = CellDeploymentStatusIndicator;
+               static constexpr bool optional = true;
+
+       };
+       cellDeploymentStatusIndicator_t& set_cellDeploymentStatusIndicator() { cellDeploymentStatusIndicator.setpresent(true); return cellDeploymentStatusIndicator;}
+       cellDeploymentStatusIndicator_t const* get_cellDeploymentStatusIndicator() const {return cellDeploymentStatusIndicator.is_valid() ? &cellDeploymentStatusIndicator : nullptr;}
+       struct cellReplacingInfo_t : CellReplacingInfo
+       {
+               static constexpr const char* name() {return "cellReplacingInfo_t";}
+               using parent_t = CellReplacingInfo;
+               static constexpr bool optional = true;
+
+       };
+       cellReplacingInfo_t& set_cellReplacingInfo() { cellReplacingInfo.setpresent(true); return cellReplacingInfo;}
+       cellReplacingInfo_t const* get_cellReplacingInfo() const {return cellReplacingInfo.is_valid() ? &cellReplacingInfo : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(eCGI);
+               v(coverageState);
+               v(cellDeploymentStatusIndicator);
+               v(cellReplacingInfo);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eCGI);
+               v(coverageState);
+               v(cellDeploymentStatusIndicator);
+               v(cellReplacingInfo);
+
+       };
+       void clear()
+       {
+               eCGI.clear();
+               coverageState.clear();
+               cellDeploymentStatusIndicator.clear();
+               cellReplacingInfo.clear();
+
+       };
+       private:
+       eCGI_t  eCGI;
+       coverageState_t coverageState;
+       cellDeploymentStatusIndicator_t cellDeploymentStatusIndicator;
+       cellReplacingInfo_t     cellReplacingInfo;
+
+};
+/*
+CoverageModificationList ::= SEQUENCE (SIZE (1..maxCellineNB)) OF CoverageModification-Item
+*/
+
+struct CoverageModificationList_elm : CoverageModification_Item
+{
+       static constexpr const char* name() {return "CoverageModificationList_elm";}
+       using parent_t = CoverageModification_Item;
+
+};
+struct CoverageModificationList : asn::sequenceof<CoverageModificationList_elm>
+{
+       static constexpr const char* name() {return "CoverageModificationList";}
+       using parent_t = asn::sequenceof<CoverageModificationList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCellineNB >>;
+
+};
+/*
+TypeOfError ::= ENUMERATED {
+       not-understood,
+       missing,
+       ...
+}
+*/
+
+struct TypeOfError : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "TypeOfError";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               not_understood
+               ,missing
+       } index_t;
+
+};
+
+/*
+CriticalityDiagnostics-IE-List-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CriticalityDiagnostics_IE_List_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CriticalityDiagnostics-IE-List ::= SEQUENCE (SIZE (1..maxNrOfErrors)) OF
+       SEQUENCE {
+               iECriticality                   Criticality,
+               iE-ID                                   ProtocolIE-ID,
+               typeOfError                             TypeOfError,
+               iE-Extensions                   ProtocolExtensionContainer { {CriticalityDiagnostics-IE-List-ExtIEs} } OPTIONAL,
+               ...
+}
+*/
+
+struct CriticalityDiagnostics_IE_List_elm : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "CriticalityDiagnostics_IE_List_elm";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct iECriticality_t : Criticality
+       {
+               static constexpr const char* name() {return "iECriticality_t";}
+               using parent_t = Criticality;
+
+       };
+       iECriticality_t& ref_iECriticality() {return iECriticality;}
+       iECriticality_t const& ref_iECriticality() const {return iECriticality;}
+       struct iE_ID_t : ProtocolIE_ID
+       {
+               static constexpr const char* name() {return "iE_ID_t";}
+               using parent_t = ProtocolIE_ID;
+
+       };
+       iE_ID_t& ref_iE_ID() {return iE_ID;}
+       iE_ID_t const& ref_iE_ID() const {return iE_ID;}
+       struct typeOfError_t : TypeOfError
+       {
+               static constexpr const char* name() {return "typeOfError_t";}
+               using parent_t = TypeOfError;
+
+       };
+       typeOfError_t& ref_typeOfError() {return typeOfError;}
+       typeOfError_t const& ref_typeOfError() const {return typeOfError;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CriticalityDiagnostics_IE_List_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CriticalityDiagnostics_IE_List_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(iECriticality);
+               v(iE_ID);
+               v(typeOfError);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(iECriticality);
+               v(iE_ID);
+               v(typeOfError);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               iECriticality.clear();
+               iE_ID.clear();
+               typeOfError.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       iECriticality_t iECriticality;
+       iE_ID_t iE_ID;
+       typeOfError_t   typeOfError;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct CriticalityDiagnostics_IE_List : asn::sequenceof<CriticalityDiagnostics_IE_List_elm>
+{
+       static constexpr const char* name() {return "CriticalityDiagnostics-IE-List";}
+       using parent_t = asn::sequenceof<CriticalityDiagnostics_IE_List_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxNrOfErrors >>;
+
+};
+/*
+CriticalityDiagnostics-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct CriticalityDiagnostics_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+CriticalityDiagnostics ::= SEQUENCE {
+       procedureCode                                   ProcedureCode                                   OPTIONAL,
+       triggeringMessage                               TriggeringMessage                               OPTIONAL,
+       procedureCriticality                    Criticality                                             OPTIONAL,
+       iEsCriticalityDiagnostics               CriticalityDiagnostics-IE-List  OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { {CriticalityDiagnostics-ExtIEs} }  OPTIONAL,
+       ...
+}
+*/
+
+struct CriticalityDiagnostics : asn::sequence<5, 0, true, 5>
+{
+       static constexpr const char* name() {return "CriticalityDiagnostics";}
+       using parent_t = asn::sequence<5, 0, true, 5>;
+       struct procedureCode_t : ProcedureCode
+       {
+               static constexpr const char* name() {return "procedureCode_t";}
+               using parent_t = ProcedureCode;
+               static constexpr bool optional = true;
+
+       };
+       procedureCode_t& set_procedureCode() { procedureCode.setpresent(true); return procedureCode;}
+       procedureCode_t const* get_procedureCode() const {return procedureCode.is_valid() ? &procedureCode : nullptr;}
+       struct triggeringMessage_t : TriggeringMessage
+       {
+               static constexpr const char* name() {return "triggeringMessage_t";}
+               using parent_t = TriggeringMessage;
+               static constexpr bool optional = true;
+
+       };
+       triggeringMessage_t& set_triggeringMessage() { triggeringMessage.setpresent(true); return triggeringMessage;}
+       triggeringMessage_t const* get_triggeringMessage() const {return triggeringMessage.is_valid() ? &triggeringMessage : nullptr;}
+       struct procedureCriticality_t : Criticality
+       {
+               static constexpr const char* name() {return "procedureCriticality_t";}
+               using parent_t = Criticality;
+               static constexpr bool optional = true;
+
+       };
+       procedureCriticality_t& set_procedureCriticality() { procedureCriticality.setpresent(true); return procedureCriticality;}
+       procedureCriticality_t const* get_procedureCriticality() const {return procedureCriticality.is_valid() ? &procedureCriticality : nullptr;}
+       struct iEsCriticalityDiagnostics_t : CriticalityDiagnostics_IE_List
+       {
+               static constexpr const char* name() {return "iEsCriticalityDiagnostics_t";}
+               using parent_t = CriticalityDiagnostics_IE_List;
+               static constexpr bool optional = true;
+
+       };
+       iEsCriticalityDiagnostics_t& set_iEsCriticalityDiagnostics() { iEsCriticalityDiagnostics.setpresent(true); return iEsCriticalityDiagnostics;}
+       iEsCriticalityDiagnostics_t const* get_iEsCriticalityDiagnostics() const {return iEsCriticalityDiagnostics.is_valid() ? &iEsCriticalityDiagnostics : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<CriticalityDiagnostics_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<CriticalityDiagnostics_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(procedureCode);
+               v(triggeringMessage);
+               v(procedureCriticality);
+               v(iEsCriticalityDiagnostics);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(procedureCode);
+               v(triggeringMessage);
+               v(procedureCriticality);
+               v(iEsCriticalityDiagnostics);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               procedureCode.clear();
+               triggeringMessage.clear();
+               procedureCriticality.clear();
+               iEsCriticalityDiagnostics.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       procedureCode_t procedureCode;
+       triggeringMessage_t     triggeringMessage;
+       procedureCriticality_t  procedureCriticality;
+       iEsCriticalityDiagnostics_t     iEsCriticalityDiagnostics;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+DL-Forwarding ::= ENUMERATED {
+       dL-forwardingProposed,
+       ...
+}
+*/
+
+struct DL_Forwarding : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "DL-Forwarding";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               dL_forwardingProposed
+       } index_t;
+
+};
+
+/*
+DL-GBR-PRB-usage::= INTEGER (0..100)
+*/
+
+struct DL_GBR_PRB_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "DL-GBR-PRB-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+DL-Total-PRB-usage::= INTEGER (0..100)
+*/
+
+struct DL_Total_PRB_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "DL-Total-PRB-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+DL-non-GBR-PRB-usage::= INTEGER (0..100)
+*/
+
+struct DL_non_GBR_PRB_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "DL-non-GBR-PRB-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+DL-scheduling-PDCCH-CCE-usage::= INTEGER (0..100)
+*/
+
+struct DL_scheduling_PDCCH_CCE_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "DL-scheduling-PDCCH-CCE-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+DataTrafficResources ::= BIT STRING (SIZE(6..17600))
+*/
+
+struct DataTrafficResources : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::span<6, 17600>>;
+       static constexpr const char* name() {return "DataTrafficResources";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+DLResourceBitmapULandDLSharing ::= DataTrafficResources
+*/
+
+struct DLResourceBitmapULandDLSharing : DataTrafficResources
+{
+       static constexpr const char* name() {return "DLResourceBitmapULandDLSharing";}
+       using parent_t = DataTrafficResources;
+
+};
+/*
+DLResourcesULandDLSharing ::= CHOICE {
+unchanged                      NULL,
+       changed                         DLResourceBitmapULandDLSharing,
+       ...
+}
+*/
+
+struct DLResourcesULandDLSharing : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "DLResourcesULandDLSharing";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~DLResourcesULandDLSharing() {clear();}
+       struct unchanged_t : asn::nulltype
+       {
+               static constexpr const char* name() {return "unchanged_t";}
+               using parent_t = asn::nulltype;
+
+       };
+       struct changed_t : DLResourceBitmapULandDLSharing
+       {
+               static constexpr const char* name() {return "changed_t";}
+               using parent_t = DLResourceBitmapULandDLSharing;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<unchanged_t>(); break;
+               case 2: var.destroy<changed_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<unchanged_t>());
+               case 2: set_index(2); return v(var.build<changed_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<unchanged_t>());
+               case 2: return v(var.as<changed_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<unchanged_t>(1);
+               v.template operator()<changed_t>(2);
+
+       }
+       unchanged_t& select_unchanged() { if(get_index() != 1) { clear(); set_index(1); return var.build<unchanged_t>();} return var.as<unchanged_t>();}
+       unchanged_t const* get_unchanged() const { if(get_index() == 1) { return &var.as<unchanged_t>();} return nullptr; }
+       changed_t& select_changed() { if(get_index() != 2) { clear(); set_index(2); return var.build<changed_t>();} return var.as<changed_t>();}
+       changed_t const* get_changed() const { if(get_index() == 2) { return &var.as<changed_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(unchanged_t)];
+               char dummy2[sizeof(changed_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+DRB-ID ::= INTEGER (1..32)
+*/
+
+struct DRB_ID : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1, 32>>;
+       static constexpr const char* name() {return "DRB-ID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+ULOnlySharing-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ULOnlySharing_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ULOnlySharing ::= SEQUENCE{
+       uLResourceBitmapULOnlySharing   DataTrafficResources,
+       iE-Extensions                                   ProtocolExtensionContainer { {ULOnlySharing-ExtIEs} }                           OPTIONAL,
+       ...
+}
+*/
+
+struct ULOnlySharing : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "ULOnlySharing";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct uLResourceBitmapULOnlySharing_t : DataTrafficResources
+       {
+               static constexpr const char* name() {return "uLResourceBitmapULOnlySharing_t";}
+               using parent_t = DataTrafficResources;
+
+       };
+       uLResourceBitmapULOnlySharing_t& ref_uLResourceBitmapULOnlySharing() {return uLResourceBitmapULOnlySharing;}
+       uLResourceBitmapULOnlySharing_t const& ref_uLResourceBitmapULOnlySharing() const {return uLResourceBitmapULOnlySharing;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ULOnlySharing_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ULOnlySharing_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uLResourceBitmapULOnlySharing);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uLResourceBitmapULOnlySharing);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uLResourceBitmapULOnlySharing.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uLResourceBitmapULOnlySharing_t uLResourceBitmapULOnlySharing;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ULResourceBitmapULandDLSharing ::= DataTrafficResources
+*/
+
+struct ULResourceBitmapULandDLSharing : DataTrafficResources
+{
+       static constexpr const char* name() {return "ULResourceBitmapULandDLSharing";}
+       using parent_t = DataTrafficResources;
+
+};
+/*
+ULResourcesULandDLSharing ::= CHOICE {
+       unchanged                       NULL,
+       changed                         ULResourceBitmapULandDLSharing,
+       ...
+}
+*/
+
+struct ULResourcesULandDLSharing : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "ULResourcesULandDLSharing";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~ULResourcesULandDLSharing() {clear();}
+       struct unchanged_t : asn::nulltype
+       {
+               static constexpr const char* name() {return "unchanged_t";}
+               using parent_t = asn::nulltype;
+
+       };
+       struct changed_t : ULResourceBitmapULandDLSharing
+       {
+               static constexpr const char* name() {return "changed_t";}
+               using parent_t = ULResourceBitmapULandDLSharing;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<unchanged_t>(); break;
+               case 2: var.destroy<changed_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<unchanged_t>());
+               case 2: set_index(2); return v(var.build<changed_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<unchanged_t>());
+               case 2: return v(var.as<changed_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<unchanged_t>(1);
+               v.template operator()<changed_t>(2);
+
+       }
+       unchanged_t& select_unchanged() { if(get_index() != 1) { clear(); set_index(1); return var.build<unchanged_t>();} return var.as<unchanged_t>();}
+       unchanged_t const* get_unchanged() const { if(get_index() == 1) { return &var.as<unchanged_t>();} return nullptr; }
+       changed_t& select_changed() { if(get_index() != 2) { clear(); set_index(2); return var.build<changed_t>();} return var.as<changed_t>();}
+       changed_t const* get_changed() const { if(get_index() == 2) { return &var.as<changed_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(unchanged_t)];
+               char dummy2[sizeof(changed_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+ULandDLSharing-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ULandDLSharing_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ULandDLSharing ::= SEQUENCE{
+       uLResourcesULandDLSharing                               ULResourcesULandDLSharing,
+       dLResourcesULandDLSharing                               DLResourcesULandDLSharing,
+       iE-Extensions                   ProtocolExtensionContainer { {ULandDLSharing-ExtIEs} }                          OPTIONAL,
+       ...
+}
+*/
+
+struct ULandDLSharing : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ULandDLSharing";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct uLResourcesULandDLSharing_t : ULResourcesULandDLSharing
+       {
+               static constexpr const char* name() {return "uLResourcesULandDLSharing_t";}
+               using parent_t = ULResourcesULandDLSharing;
+
+       };
+       uLResourcesULandDLSharing_t& ref_uLResourcesULandDLSharing() {return uLResourcesULandDLSharing;}
+       uLResourcesULandDLSharing_t const& ref_uLResourcesULandDLSharing() const {return uLResourcesULandDLSharing;}
+       struct dLResourcesULandDLSharing_t : DLResourcesULandDLSharing
+       {
+               static constexpr const char* name() {return "dLResourcesULandDLSharing_t";}
+               using parent_t = DLResourcesULandDLSharing;
+
+       };
+       dLResourcesULandDLSharing_t& ref_dLResourcesULandDLSharing() {return dLResourcesULandDLSharing;}
+       dLResourcesULandDLSharing_t const& ref_dLResourcesULandDLSharing() const {return dLResourcesULandDLSharing;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ULandDLSharing_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ULandDLSharing_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uLResourcesULandDLSharing);
+               v(dLResourcesULandDLSharing);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uLResourcesULandDLSharing);
+               v(dLResourcesULandDLSharing);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uLResourcesULandDLSharing.clear();
+               dLResourcesULandDLSharing.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uLResourcesULandDLSharing_t     uLResourcesULandDLSharing;
+       dLResourcesULandDLSharing_t     dLResourcesULandDLSharing;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SharedResourceType ::= CHOICE{
+       uLOnlySharing           ULOnlySharing,
+       uLandDLSharing          ULandDLSharing,
+       ...
+}
+*/
+
+struct SharedResourceType : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "SharedResourceType";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~SharedResourceType() {clear();}
+       struct uLOnlySharing_t : ULOnlySharing
+       {
+               static constexpr const char* name() {return "uLOnlySharing_t";}
+               using parent_t = ULOnlySharing;
+
+       };
+       struct uLandDLSharing_t : ULandDLSharing
+       {
+               static constexpr const char* name() {return "uLandDLSharing_t";}
+               using parent_t = ULandDLSharing;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<uLOnlySharing_t>(); break;
+               case 2: var.destroy<uLandDLSharing_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<uLOnlySharing_t>());
+               case 2: set_index(2); return v(var.build<uLandDLSharing_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<uLOnlySharing_t>());
+               case 2: return v(var.as<uLandDLSharing_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<uLOnlySharing_t>(1);
+               v.template operator()<uLandDLSharing_t>(2);
+
+       }
+       uLOnlySharing_t& select_uLOnlySharing() { if(get_index() != 1) { clear(); set_index(1); return var.build<uLOnlySharing_t>();} return var.as<uLOnlySharing_t>();}
+       uLOnlySharing_t const* get_uLOnlySharing() const { if(get_index() == 1) { return &var.as<uLOnlySharing_t>();} return nullptr; }
+       uLandDLSharing_t& select_uLandDLSharing() { if(get_index() != 2) { clear(); set_index(2); return var.build<uLandDLSharing_t>();} return var.as<uLandDLSharing_t>();}
+       uLandDLSharing_t const* get_uLandDLSharing() const { if(get_index() == 2) { return &var.as<uLandDLSharing_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(uLOnlySharing_t)];
+               char dummy2[sizeof(uLandDLSharing_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+SubframeType ::= ENUMERATED{mbsfn,nonmbsfn,...}
+*/
+
+struct SubframeType : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "SubframeType";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               mbsfn
+               ,nonmbsfn
+       } index_t;
+
+};
+
+/*
+ReservedSubframePattern-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ReservedSubframePattern_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ReservedSubframePattern ::= SEQUENCE{
+       subframeType                                    SubframeType,
+       reservedSubframePattern                 BIT STRING (SIZE(10..160)),
+       mBSFNControlRegionLength                INTEGER (0..3),
+       iE-Extensions                                   ProtocolExtensionContainer { {ReservedSubframePattern-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ReservedSubframePattern : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "ReservedSubframePattern";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct subframeType_t : SubframeType
+       {
+               static constexpr const char* name() {return "subframeType_t";}
+               using parent_t = SubframeType;
+
+       };
+       subframeType_t& ref_subframeType() {return subframeType;}
+       subframeType_t const& ref_subframeType() const {return subframeType;}
+       struct reservedSubframePattern_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<10, 160>>;
+               static constexpr const char* name() {return "reservedSubframePattern_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       reservedSubframePattern_t& ref_reservedSubframePattern() {return reservedSubframePattern;}
+       reservedSubframePattern_t const& ref_reservedSubframePattern() const {return reservedSubframePattern;}
+       struct mBSFNControlRegionLength_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 3>>;
+               static constexpr const char* name() {return "mBSFNControlRegionLength_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       mBSFNControlRegionLength_t& ref_mBSFNControlRegionLength() {return mBSFNControlRegionLength;}
+       mBSFNControlRegionLength_t const& ref_mBSFNControlRegionLength() const {return mBSFNControlRegionLength;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ReservedSubframePattern_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ReservedSubframePattern_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(subframeType);
+               v(reservedSubframePattern);
+               v(mBSFNControlRegionLength);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(subframeType);
+               v(reservedSubframePattern);
+               v(mBSFNControlRegionLength);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               subframeType.clear();
+               reservedSubframePattern.clear();
+               mBSFNControlRegionLength.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       subframeType_t  subframeType;
+       reservedSubframePattern_t       reservedSubframePattern;
+       mBSFNControlRegionLength_t      mBSFNControlRegionLength;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+DataTrafficResourceIndication-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct DataTrafficResourceIndication_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+DataTrafficResourceIndication ::= SEQUENCE {
+       activationSFN                                   INTEGER (0..1023),
+       sharedResourceType                              SharedResourceType,
+       reservedSubframePattern                 ReservedSubframePattern OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { {DataTrafficResourceIndication-ExtIEs} } OPTIONAL,
+...
+}
+*/
+
+struct DataTrafficResourceIndication : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "DataTrafficResourceIndication";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct activationSFN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 1023>>;
+               static constexpr const char* name() {return "activationSFN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       activationSFN_t& ref_activationSFN() {return activationSFN;}
+       activationSFN_t const& ref_activationSFN() const {return activationSFN;}
+       struct sharedResourceType_t : SharedResourceType
+       {
+               static constexpr const char* name() {return "sharedResourceType_t";}
+               using parent_t = SharedResourceType;
+
+       };
+       sharedResourceType_t& ref_sharedResourceType() {return sharedResourceType;}
+       sharedResourceType_t const& ref_sharedResourceType() const {return sharedResourceType;}
+       struct reservedSubframePattern_t : ReservedSubframePattern
+       {
+               static constexpr const char* name() {return "reservedSubframePattern_t";}
+               using parent_t = ReservedSubframePattern;
+               static constexpr bool optional = true;
+
+       };
+       reservedSubframePattern_t& set_reservedSubframePattern() { reservedSubframePattern.setpresent(true); return reservedSubframePattern;}
+       reservedSubframePattern_t const* get_reservedSubframePattern() const {return reservedSubframePattern.is_valid() ? &reservedSubframePattern : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<DataTrafficResourceIndication_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<DataTrafficResourceIndication_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(activationSFN);
+               v(sharedResourceType);
+               v(reservedSubframePattern);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(activationSFN);
+               v(sharedResourceType);
+               v(reservedSubframePattern);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               activationSFN.clear();
+               sharedResourceType.clear();
+               reservedSubframePattern.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       activationSFN_t activationSFN;
+       sharedResourceType_t    sharedResourceType;
+       reservedSubframePattern_t       reservedSubframePattern;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+DeactivationIndication::= ENUMERATED {
+       deactivated,
+       ...
+}
+*/
+
+struct DeactivationIndication : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "DeactivationIndication";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               deactivated
+       } index_t;
+
+};
+
+/*
+DeliveryStatus-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct DeliveryStatus_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+DeliveryStatus ::= SEQUENCE {
+       highestSuccessDeliveredPDCPSN           INTEGER (0..4095),
+       iE-Extensions           ProtocolExtensionContainer { {DeliveryStatus-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct DeliveryStatus : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "DeliveryStatus";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct highestSuccessDeliveredPDCPSN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 4095>>;
+               static constexpr const char* name() {return "highestSuccessDeliveredPDCPSN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       highestSuccessDeliveredPDCPSN_t& ref_highestSuccessDeliveredPDCPSN() {return highestSuccessDeliveredPDCPSN;}
+       highestSuccessDeliveredPDCPSN_t const& ref_highestSuccessDeliveredPDCPSN() const {return highestSuccessDeliveredPDCPSN;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<DeliveryStatus_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<DeliveryStatus_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(highestSuccessDeliveredPDCPSN);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(highestSuccessDeliveredPDCPSN);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               highestSuccessDeliveredPDCPSN.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       highestSuccessDeliveredPDCPSN_t highestSuccessDeliveredPDCPSN;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+DuplicationActivation::= ENUMERATED {active, inactive, ...}
+*/
+
+struct DuplicationActivation : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "DuplicationActivation";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               active
+               ,inactive
+       } index_t;
+
+};
+
+/*
+PA-Values ::= ENUMERATED {
+       dB-6,
+       dB-4dot77,
+       dB-3,
+       dB-1dot77,
+       dB0,
+       dB1,
+       dB2,
+       dB3,
+       ...
+}
+*/
+
+struct PA_Values : asn::enumerated<8, 0, true>
+{
+       static constexpr const char* name() {return "PA-Values";}
+       using parent_t = asn::enumerated<8, 0, true>;
+       typedef enum {
+               dB_6
+               ,dB_4dot77
+               ,dB_3
+               ,dB_1dot77
+               ,dB0
+               ,dB1
+               ,dB2
+               ,dB3
+       } index_t;
+
+};
+
+/*
+DynamicNAICSInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct DynamicNAICSInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+DynamicNAICSInformation ::= SEQUENCE {
+       transmissionModes                                       BIT STRING (SIZE(8))                                                                                            OPTIONAL,
+       pB-information                                          INTEGER(0..3)                                                                                                           OPTIONAL,
+       pA-list                                                         SEQUENCE (SIZE(0..maxnoofPA)) OF PA-Values,
+       iE-Extensions                                           ProtocolExtensionContainer { {DynamicNAICSInformation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct DynamicNAICSInformation : asn::sequence<4, 0, true, 3>
+{
+       static constexpr const char* name() {return "DynamicNAICSInformation";}
+       using parent_t = asn::sequence<4, 0, true, 3>;
+       struct transmissionModes_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<8>>;
+               static constexpr const char* name() {return "transmissionModes_t";}
+               using parent_t = asn::bstring<>;
+               static constexpr bool optional = true;
+
+       };
+
+       transmissionModes_t& set_transmissionModes() { transmissionModes.setpresent(true); return transmissionModes;}
+       transmissionModes_t const* get_transmissionModes() const {return transmissionModes.is_valid() ? &transmissionModes : nullptr;}
+       struct pB_information_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 3>>;
+               static constexpr const char* name() {return "pB_information_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       pB_information_t& set_pB_information() { pB_information.setpresent(true); return pB_information;}
+       pB_information_t const* get_pB_information() const {return pB_information.is_valid() ? &pB_information : nullptr;}
+       struct pA_list_t_elm : PA_Values
+       {
+               static constexpr const char* name() {return "pA_list_t_elm";}
+               using parent_t = PA_Values;
+
+       };
+       struct pA_list_t : asn::sequenceof<pA_list_t_elm>
+       {
+               static constexpr const char* name() {return "pA_list_t";}
+               using parent_t = asn::sequenceof<pA_list_t_elm>;
+               using constraint_t = asn::constraints<false,asn::span<0,  maxnoofPA >>;
+
+       };
+       pA_list_t& ref_pA_list() {return pA_list;}
+       pA_list_t const& ref_pA_list() const {return pA_list;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<DynamicNAICSInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<DynamicNAICSInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(transmissionModes);
+               v(pB_information);
+               v(pA_list);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(transmissionModes);
+               v(pB_information);
+               v(pA_list);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               transmissionModes.clear();
+               pB_information.clear();
+               pA_list.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       transmissionModes_t     transmissionModes;
+       pB_information_t        pB_information;
+       pA_list_t       pA_list;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+DynamicDLTransmissionInformation ::= CHOICE {
+       naics-active                    DynamicNAICSInformation,
+       naics-inactive                  NULL,
+       ...
+}
+*/
+
+struct DynamicDLTransmissionInformation : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "DynamicDLTransmissionInformation";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~DynamicDLTransmissionInformation() {clear();}
+       struct naics_active_t : DynamicNAICSInformation
+       {
+               static constexpr const char* name() {return "naics_active_t";}
+               using parent_t = DynamicNAICSInformation;
+
+       };
+       struct naics_inactive_t : asn::nulltype
+       {
+               static constexpr const char* name() {return "naics_inactive_t";}
+               using parent_t = asn::nulltype;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<naics_active_t>(); break;
+               case 2: var.destroy<naics_inactive_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<naics_active_t>());
+               case 2: set_index(2); return v(var.build<naics_inactive_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<naics_active_t>());
+               case 2: return v(var.as<naics_inactive_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<naics_active_t>(1);
+               v.template operator()<naics_inactive_t>(2);
+
+       }
+       naics_active_t& select_naics_active() { if(get_index() != 1) { clear(); set_index(1); return var.build<naics_active_t>();} return var.as<naics_active_t>();}
+       naics_active_t const* get_naics_active() const { if(get_index() == 1) { return &var.as<naics_active_t>();} return nullptr; }
+       naics_inactive_t& select_naics_inactive() { if(get_index() != 2) { clear(); set_index(2); return var.build<naics_inactive_t>();} return var.as<naics_inactive_t>();}
+       naics_inactive_t const* get_naics_inactive() const { if(get_index() == 2) { return &var.as<naics_inactive_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(naics_active_t)];
+               char dummy2[sizeof(naics_inactive_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+E-RAB-ID ::= INTEGER (0..15, ...)
+*/
+
+struct E_RAB_ID : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<0, 15>>;
+       static constexpr const char* name() {return "E-RAB-ID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+E-RAB-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct E_RAB_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+E-RAB-Item ::= SEQUENCE {
+       e-RAB-ID                                E-RAB-ID,
+       cause                                           Cause,
+       iE-Extensions                           ProtocolExtensionContainer { {E-RAB-Item-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct E_RAB_Item : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "E-RAB-Item";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct e_RAB_ID_t : E_RAB_ID
+       {
+               static constexpr const char* name() {return "e_RAB_ID_t";}
+               using parent_t = E_RAB_ID;
+
+       };
+       e_RAB_ID_t& ref_e_RAB_ID() {return e_RAB_ID;}
+       e_RAB_ID_t const& ref_e_RAB_ID() const {return e_RAB_ID;}
+       struct cause_t : Cause
+       {
+               static constexpr const char* name() {return "cause_t";}
+               using parent_t = Cause;
+
+       };
+       cause_t& ref_cause() {return cause;}
+       cause_t const& ref_cause() const {return cause;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<E_RAB_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<E_RAB_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(e_RAB_ID);
+               v(cause);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(e_RAB_ID);
+               v(cause);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               e_RAB_ID.clear();
+               cause.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       e_RAB_ID_t      e_RAB_ID;
+       cause_t cause;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+E-RAB-ItemIEs  X2AP-PROTOCOL-IES ::= {
+       { ID id-E-RAB-Item       CRITICALITY ignore     TYPE E-RAB-Item         PRESENCE mandatory },
+       ...
+}
+*/
+
+struct E_RAB_ItemIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_E_RAB_Item() { set(id_E_RAB_Item); type=1;}
+               X2AP_PROTOCOL_IES::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_E_RAB_Item)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_E_RAB_Item);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_E_RAB_Item() { set(ignore); type=1;}
+               X2AP_PROTOCOL_IES::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Value_t : asn::typefield<true>
+       {
+               ~Value_t()      {clear();}
+               size_t get_index() const {return type;}
+               E_RAB_Item& select_id_E_RAB_Item() { return set<E_RAB_Item>(1); }
+               E_RAB_Item const* get_id_E_RAB_Item() const { return get<E_RAB_Item>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<E_RAB_Item>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<E_RAB_Item>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_E_RAB_Item()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<E_RAB_Item>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(E_RAB_Item)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_E_RAB_Item() { set(mandatory); type=1;}
+               X2AP_PROTOCOL_IES::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(mandatory)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(mandatory);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+QCI ::= INTEGER (0..255)
+*/
+
+struct QCI : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 255>>;
+       static constexpr const char* name() {return "QCI";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+ExtendedBitRate        ::= INTEGER (10000000001..4000000000000,...)
+*/
+
+struct ExtendedBitRate : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<10000000001, 4000000000000>>;
+       static constexpr const char* name() {return "ExtendedBitRate";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+GBR-QosInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+-- Extension for maximum bitrate > 10Gbps --
+       { ID id-extended-e-RAB-MaximumBitrateDL         CRITICALITY ignore      EXTENSION ExtendedBitRate       PRESENCE optional}|
+       { ID id-extended-e-RAB-MaximumBitrateUL         CRITICALITY ignore      EXTENSION ExtendedBitRate       PRESENCE optional}|
+       { ID id-extended-e-RAB-GuaranteedBitrateDL      CRITICALITY ignore      EXTENSION ExtendedBitRate       PRESENCE optional}|
+       { ID id-extended-e-RAB-GuaranteedBitrateUL      CRITICALITY ignore      EXTENSION ExtendedBitRate       PRESENCE optional},
+       ...
+}
+*/
+
+struct GBR_QosInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 5; }
+               void clear() {type = 0;}
+               void select_id_extended_e_RAB_MaximumBitrateDL() { set(id_extended_e_RAB_MaximumBitrateDL); type=1;}
+               void select_id_extended_e_RAB_MaximumBitrateUL() { set(id_extended_e_RAB_MaximumBitrateUL); type=2;}
+               void select_id_extended_e_RAB_GuaranteedBitrateDL() { set(id_extended_e_RAB_GuaranteedBitrateDL); type=3;}
+               void select_id_extended_e_RAB_GuaranteedBitrateUL() { set(id_extended_e_RAB_GuaranteedBitrateUL); type=4;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_extended_e_RAB_MaximumBitrateDL)) { type = 1; return true; }
+                       else if(equal(id_extended_e_RAB_MaximumBitrateUL)) { type = 2; return true; }
+                       else if(equal(id_extended_e_RAB_GuaranteedBitrateDL)) { type = 3; return true; }
+                       else if(equal(id_extended_e_RAB_GuaranteedBitrateUL)) { type = 4; return true; }
+                       else { type = 5; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_extended_e_RAB_MaximumBitrateDL);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_extended_e_RAB_MaximumBitrateUL);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(id_extended_e_RAB_GuaranteedBitrateDL);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(id_extended_e_RAB_GuaranteedBitrateUL);} return false;
+                       case 5: type = 5; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 5; }
+               void clear() {type = 0;}
+               void select_id_extended_e_RAB_MaximumBitrateDL() { set(ignore); type=1;}
+               void select_id_extended_e_RAB_MaximumBitrateUL() { set(ignore); type=2;}
+               void select_id_extended_e_RAB_GuaranteedBitrateDL() { set(ignore); type=3;}
+               void select_id_extended_e_RAB_GuaranteedBitrateUL() { set(ignore); type=4;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else if(equal(ignore)) { type = 3; return true; }
+                       else if(equal(ignore)) { type = 4; return true; }
+                       else { type = 5; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 5: type = 5; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               ExtendedBitRate& select_id_extended_e_RAB_MaximumBitrateDL() { return set<ExtendedBitRate>(1); }
+               ExtendedBitRate const* get_id_extended_e_RAB_MaximumBitrateDL() const { return get<ExtendedBitRate>(1); }
+               ExtendedBitRate& select_id_extended_e_RAB_MaximumBitrateUL() { return set<ExtendedBitRate>(2); }
+               ExtendedBitRate const* get_id_extended_e_RAB_MaximumBitrateUL() const { return get<ExtendedBitRate>(2); }
+               ExtendedBitRate& select_id_extended_e_RAB_GuaranteedBitrateDL() { return set<ExtendedBitRate>(3); }
+               ExtendedBitRate const* get_id_extended_e_RAB_GuaranteedBitrateDL() const { return get<ExtendedBitRate>(3); }
+               ExtendedBitRate& select_id_extended_e_RAB_GuaranteedBitrateUL() { return set<ExtendedBitRate>(4); }
+               ExtendedBitRate const* get_id_extended_e_RAB_GuaranteedBitrateUL() const { return get<ExtendedBitRate>(4); }
+               bool is_unknown() const { return type == 5; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<ExtendedBitRate>(); break;
+                       case 2: var.destroy<ExtendedBitRate>(); break;
+                       case 3: var.destroy<ExtendedBitRate>(); break;
+                       case 4: var.destroy<ExtendedBitRate>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<ExtendedBitRate>(1);
+                       v.template operator()<ExtendedBitRate>(2);
+                       v.template operator()<ExtendedBitRate>(3);
+                       v.template operator()<ExtendedBitRate>(4);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_extended_e_RAB_MaximumBitrateDL()); return true;
+                       case 2: v(select_id_extended_e_RAB_MaximumBitrateUL()); return true;
+                       case 3: v(select_id_extended_e_RAB_GuaranteedBitrateDL()); return true;
+                       case 4: v(select_id_extended_e_RAB_GuaranteedBitrateUL()); return true;
+                       case 5: if(type != 5) {clear(); asn::base::set();} type = 5; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<ExtendedBitRate>()); return true;
+                       case 2: v(var.as<ExtendedBitRate>()); return true;
+                       case 3: v(var.as<ExtendedBitRate>()); return true;
+                       case 4: v(var.as<ExtendedBitRate>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(ExtendedBitRate)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 5; }
+               void clear() {type = 0;}
+               void select_id_extended_e_RAB_MaximumBitrateDL() { set(optional); type=1;}
+               void select_id_extended_e_RAB_MaximumBitrateUL() { set(optional); type=2;}
+               void select_id_extended_e_RAB_GuaranteedBitrateDL() { set(optional); type=3;}
+               void select_id_extended_e_RAB_GuaranteedBitrateUL() { set(optional); type=4;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else if(equal(optional)) { type = 3; return true; }
+                       else if(equal(optional)) { type = 4; return true; }
+                       else { type = 5; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 5: type = 5; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+GBR-QosInformation ::= SEQUENCE {
+       e-RAB-MaximumBitrateDL                  BitRate,
+       e-RAB-MaximumBitrateUL                  BitRate,
+       e-RAB-GuaranteedBitrateDL               BitRate,
+       e-RAB-GuaranteedBitrateUL               BitRate,
+       iE-Extensions                                   ProtocolExtensionContainer { {GBR-QosInformation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct GBR_QosInformation : asn::sequence<5, 0, true, 1>
+{
+       static constexpr const char* name() {return "GBR-QosInformation";}
+       using parent_t = asn::sequence<5, 0, true, 1>;
+       struct e_RAB_MaximumBitrateDL_t : BitRate
+       {
+               static constexpr const char* name() {return "e_RAB_MaximumBitrateDL_t";}
+               using parent_t = BitRate;
+
+       };
+       e_RAB_MaximumBitrateDL_t& ref_e_RAB_MaximumBitrateDL() {return e_RAB_MaximumBitrateDL;}
+       e_RAB_MaximumBitrateDL_t const& ref_e_RAB_MaximumBitrateDL() const {return e_RAB_MaximumBitrateDL;}
+       struct e_RAB_MaximumBitrateUL_t : BitRate
+       {
+               static constexpr const char* name() {return "e_RAB_MaximumBitrateUL_t";}
+               using parent_t = BitRate;
+
+       };
+       e_RAB_MaximumBitrateUL_t& ref_e_RAB_MaximumBitrateUL() {return e_RAB_MaximumBitrateUL;}
+       e_RAB_MaximumBitrateUL_t const& ref_e_RAB_MaximumBitrateUL() const {return e_RAB_MaximumBitrateUL;}
+       struct e_RAB_GuaranteedBitrateDL_t : BitRate
+       {
+               static constexpr const char* name() {return "e_RAB_GuaranteedBitrateDL_t";}
+               using parent_t = BitRate;
+
+       };
+       e_RAB_GuaranteedBitrateDL_t& ref_e_RAB_GuaranteedBitrateDL() {return e_RAB_GuaranteedBitrateDL;}
+       e_RAB_GuaranteedBitrateDL_t const& ref_e_RAB_GuaranteedBitrateDL() const {return e_RAB_GuaranteedBitrateDL;}
+       struct e_RAB_GuaranteedBitrateUL_t : BitRate
+       {
+               static constexpr const char* name() {return "e_RAB_GuaranteedBitrateUL_t";}
+               using parent_t = BitRate;
+
+       };
+       e_RAB_GuaranteedBitrateUL_t& ref_e_RAB_GuaranteedBitrateUL() {return e_RAB_GuaranteedBitrateUL;}
+       e_RAB_GuaranteedBitrateUL_t const& ref_e_RAB_GuaranteedBitrateUL() const {return e_RAB_GuaranteedBitrateUL;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<GBR_QosInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<GBR_QosInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(e_RAB_MaximumBitrateDL);
+               v(e_RAB_MaximumBitrateUL);
+               v(e_RAB_GuaranteedBitrateDL);
+               v(e_RAB_GuaranteedBitrateUL);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(e_RAB_MaximumBitrateDL);
+               v(e_RAB_MaximumBitrateUL);
+               v(e_RAB_GuaranteedBitrateDL);
+               v(e_RAB_GuaranteedBitrateUL);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               e_RAB_MaximumBitrateDL.clear();
+               e_RAB_MaximumBitrateUL.clear();
+               e_RAB_GuaranteedBitrateDL.clear();
+               e_RAB_GuaranteedBitrateUL.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       e_RAB_MaximumBitrateDL_t        e_RAB_MaximumBitrateDL;
+       e_RAB_MaximumBitrateUL_t        e_RAB_MaximumBitrateUL;
+       e_RAB_GuaranteedBitrateDL_t     e_RAB_GuaranteedBitrateDL;
+       e_RAB_GuaranteedBitrateUL_t     e_RAB_GuaranteedBitrateUL;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+Packet-LossRate        ::= INTEGER(0..1000)
+*/
+
+struct Packet_LossRate : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 1000>>;
+       static constexpr const char* name() {return "Packet-LossRate";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+E-RAB-Level-QoS-Parameters-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+-- Extended for introduction of downlink and uplink packet loss rate for enhanced Voice performance –
+       { ID id-DownlinkPacketLossRate                  CRITICALITY ignore      EXTENSION Packet-LossRate               PRESENCE optional}|
+       { ID id-UplinkPacketLossRate                    CRITICALITY ignore      EXTENSION Packet-LossRate               PRESENCE optional},
+       ...
+}
+*/
+
+struct E_RAB_Level_QoS_Parameters_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_DownlinkPacketLossRate() { set(id_DownlinkPacketLossRate); type=1;}
+               void select_id_UplinkPacketLossRate() { set(id_UplinkPacketLossRate); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_DownlinkPacketLossRate)) { type = 1; return true; }
+                       else if(equal(id_UplinkPacketLossRate)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_DownlinkPacketLossRate);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_UplinkPacketLossRate);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_DownlinkPacketLossRate() { set(ignore); type=1;}
+               void select_id_UplinkPacketLossRate() { set(ignore); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               Packet_LossRate& select_id_DownlinkPacketLossRate() { return set<Packet_LossRate>(1); }
+               Packet_LossRate const* get_id_DownlinkPacketLossRate() const { return get<Packet_LossRate>(1); }
+               Packet_LossRate& select_id_UplinkPacketLossRate() { return set<Packet_LossRate>(2); }
+               Packet_LossRate const* get_id_UplinkPacketLossRate() const { return get<Packet_LossRate>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<Packet_LossRate>(); break;
+                       case 2: var.destroy<Packet_LossRate>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<Packet_LossRate>(1);
+                       v.template operator()<Packet_LossRate>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_DownlinkPacketLossRate()); return true;
+                       case 2: v(select_id_UplinkPacketLossRate()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<Packet_LossRate>()); return true;
+                       case 2: v(var.as<Packet_LossRate>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(Packet_LossRate)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_DownlinkPacketLossRate() { set(optional); type=1;}
+               void select_id_UplinkPacketLossRate() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+E-RAB-Level-QoS-Parameters ::= SEQUENCE {
+       qCI                                                             QCI,
+       allocationAndRetentionPriority  AllocationAndRetentionPriority,
+       gbrQosInformation                               GBR-QosInformation                                                                                                      OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { {E-RAB-Level-QoS-Parameters-ExtIEs} }      OPTIONAL,
+       ...
+}
+*/
+
+struct E_RAB_Level_QoS_Parameters : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "E-RAB-Level-QoS-Parameters";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct qCI_t : QCI
+       {
+               static constexpr const char* name() {return "qCI_t";}
+               using parent_t = QCI;
+
+       };
+       qCI_t& ref_qCI() {return qCI;}
+       qCI_t const& ref_qCI() const {return qCI;}
+       struct allocationAndRetentionPriority_t : AllocationAndRetentionPriority
+       {
+               static constexpr const char* name() {return "allocationAndRetentionPriority_t";}
+               using parent_t = AllocationAndRetentionPriority;
+
+       };
+       allocationAndRetentionPriority_t& ref_allocationAndRetentionPriority() {return allocationAndRetentionPriority;}
+       allocationAndRetentionPriority_t const& ref_allocationAndRetentionPriority() const {return allocationAndRetentionPriority;}
+       struct gbrQosInformation_t : GBR_QosInformation
+       {
+               static constexpr const char* name() {return "gbrQosInformation_t";}
+               using parent_t = GBR_QosInformation;
+               static constexpr bool optional = true;
+
+       };
+       gbrQosInformation_t& set_gbrQosInformation() { gbrQosInformation.setpresent(true); return gbrQosInformation;}
+       gbrQosInformation_t const* get_gbrQosInformation() const {return gbrQosInformation.is_valid() ? &gbrQosInformation : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<E_RAB_Level_QoS_Parameters_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<E_RAB_Level_QoS_Parameters_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(qCI);
+               v(allocationAndRetentionPriority);
+               v(gbrQosInformation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(qCI);
+               v(allocationAndRetentionPriority);
+               v(gbrQosInformation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               qCI.clear();
+               allocationAndRetentionPriority.clear();
+               gbrQosInformation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       qCI_t   qCI;
+       allocationAndRetentionPriority_t        allocationAndRetentionPriority;
+       gbrQosInformation_t     gbrQosInformation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+E-RAB-List ::= SEQUENCE (SIZE(1.. maxnoofBearers)) OF ProtocolIE-Single-Container { {E-RAB-ItemIEs} }
+*/
+
+struct E_RAB_List_elm : ProtocolIE_Single_Container<E_RAB_ItemIEs>
+{
+       static constexpr const char* name() {return "E_RAB_List_elm";}
+       using parent_t = ProtocolIE_Single_Container<E_RAB_ItemIEs>;
+
+};
+struct E_RAB_List : asn::sequenceof<E_RAB_List_elm>
+{
+       static constexpr const char* name() {return "E-RAB-List";}
+       using parent_t = asn::sequenceof<E_RAB_List_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofBearers >>;
+
+};
+/*
+E-RABUsageReport-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct E_RABUsageReport_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+E-RABUsageReport-Item ::= SEQUENCE {
+       startTimeStamp                          OCTET STRING (SIZE(4)),
+       endTimeStamp                                    OCTET STRING (SIZE(4)),
+       usageCountUL                                    INTEGER (0..4294967295),
+       usageCountDL                                    INTEGER (0..4294967295),
+       iE-Extensions                           ProtocolExtensionContainer { {E-RABUsageReport-Item-ExtIEs} } OPTIONAL,
+...
+}
+*/
+
+struct E_RABUsageReport_Item : asn::sequence<5, 0, true, 1>
+{
+       static constexpr const char* name() {return "E-RABUsageReport-Item";}
+       using parent_t = asn::sequence<5, 0, true, 1>;
+       struct startTimeStamp_t : asn::ostring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<4>>;
+               static constexpr const char* name() {return "startTimeStamp_t";}
+               using parent_t = asn::ostring<>;
+
+       };
+
+       startTimeStamp_t& ref_startTimeStamp() {return startTimeStamp;}
+       startTimeStamp_t const& ref_startTimeStamp() const {return startTimeStamp;}
+       struct endTimeStamp_t : asn::ostring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<4>>;
+               static constexpr const char* name() {return "endTimeStamp_t";}
+               using parent_t = asn::ostring<>;
+
+       };
+
+       endTimeStamp_t& ref_endTimeStamp() {return endTimeStamp;}
+       endTimeStamp_t const& ref_endTimeStamp() const {return endTimeStamp;}
+       struct usageCountUL_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 4294967295>>;
+               static constexpr const char* name() {return "usageCountUL_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       usageCountUL_t& ref_usageCountUL() {return usageCountUL;}
+       usageCountUL_t const& ref_usageCountUL() const {return usageCountUL;}
+       struct usageCountDL_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 4294967295>>;
+               static constexpr const char* name() {return "usageCountDL_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       usageCountDL_t& ref_usageCountDL() {return usageCountDL;}
+       usageCountDL_t const& ref_usageCountDL() const {return usageCountDL;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<E_RABUsageReport_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<E_RABUsageReport_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(startTimeStamp);
+               v(endTimeStamp);
+               v(usageCountUL);
+               v(usageCountDL);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(startTimeStamp);
+               v(endTimeStamp);
+               v(usageCountUL);
+               v(usageCountDL);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               startTimeStamp.clear();
+               endTimeStamp.clear();
+               usageCountUL.clear();
+               usageCountDL.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       startTimeStamp_t        startTimeStamp;
+       endTimeStamp_t  endTimeStamp;
+       usageCountUL_t  usageCountUL;
+       usageCountDL_t  usageCountDL;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+E-RABUsageReport-ItemIEs X2AP-PROTOCOL-IES ::= {
+       { ID id-E-RABUsageReport-Item    CRITICALITY ignore     TYPE E-RABUsageReport-Item      PRESENCE mandatory },
+       ...
+}
+*/
+
+struct E_RABUsageReport_ItemIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_E_RABUsageReport_Item() { set(id_E_RABUsageReport_Item); type=1;}
+               X2AP_PROTOCOL_IES::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_E_RABUsageReport_Item)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_E_RABUsageReport_Item);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_E_RABUsageReport_Item() { set(ignore); type=1;}
+               X2AP_PROTOCOL_IES::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Value_t : asn::typefield<true>
+       {
+               ~Value_t()      {clear();}
+               size_t get_index() const {return type;}
+               E_RABUsageReport_Item& select_id_E_RABUsageReport_Item() { return set<E_RABUsageReport_Item>(1); }
+               E_RABUsageReport_Item const* get_id_E_RABUsageReport_Item() const { return get<E_RABUsageReport_Item>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<E_RABUsageReport_Item>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<E_RABUsageReport_Item>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_E_RABUsageReport_Item()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<E_RABUsageReport_Item>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(E_RABUsageReport_Item)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_E_RABUsageReport_Item() { set(mandatory); type=1;}
+               X2AP_PROTOCOL_IES::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(mandatory)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(mandatory);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+E-RABUsageReportList ::= SEQUENCE (SIZE(1..maxnooftimeperiods)) OF ProtocolIE-Single-Container { {E-RABUsageReport-ItemIEs} }
+*/
+
+struct E_RABUsageReportList_elm : ProtocolIE_Single_Container<E_RABUsageReport_ItemIEs>
+{
+       static constexpr const char* name() {return "E_RABUsageReportList_elm";}
+       using parent_t = ProtocolIE_Single_Container<E_RABUsageReport_ItemIEs>;
+
+};
+struct E_RABUsageReportList : asn::sequenceof<E_RABUsageReportList_elm>
+{
+       static constexpr const char* name() {return "E-RABUsageReportList";}
+       using parent_t = asn::sequenceof<E_RABUsageReportList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnooftimeperiods >>;
+
+};
+/*
+EARFCN ::= INTEGER (0..maxEARFCN)
+*/
+
+struct EARFCN : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0,  maxEARFCN >>;
+       static constexpr const char* name() {return "EARFCN";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+EARFCNExtension ::= INTEGER(maxEARFCNPlusOne..newmaxEARFCN, ...)
+*/
+
+struct EARFCNExtension : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span< maxEARFCNPlusOne ,  newmaxEARFCN >>;
+       static constexpr const char* name() {return "EARFCNExtension";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+EN-DC-ResourceConfigurationExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct EN_DC_ResourceConfigurationExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+EN-DC-ResourceConfiguration ::= SEQUENCE {
+       pDCPatSgNB              ENUMERATED {present, not-present, ...},
+       mCGresources    ENUMERATED {present, not-present, ...},
+       sCGresources    ENUMERATED {present, not-present, ...},
+       iE-Extensions                                   ProtocolExtensionContainer { {EN-DC-ResourceConfigurationExtIEs} }      OPTIONAL,
+       ...
+}
+*/
+
+struct EN_DC_ResourceConfiguration : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "EN-DC-ResourceConfiguration";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct pDCPatSgNB_t : asn::enumerated<2, 0, true>
+       {
+               static constexpr const char* name() {return "pDCPatSgNB_t";}
+               using parent_t = asn::enumerated<2, 0, true>;
+               typedef enum {
+                       present
+                       ,not_present
+               } index_t;
+
+       };
+
+       pDCPatSgNB_t& ref_pDCPatSgNB() {return pDCPatSgNB;}
+       pDCPatSgNB_t const& ref_pDCPatSgNB() const {return pDCPatSgNB;}
+       struct mCGresources_t : asn::enumerated<2, 0, true>
+       {
+               static constexpr const char* name() {return "mCGresources_t";}
+               using parent_t = asn::enumerated<2, 0, true>;
+               typedef enum {
+                       present
+                       ,not_present
+               } index_t;
+
+       };
+
+       mCGresources_t& ref_mCGresources() {return mCGresources;}
+       mCGresources_t const& ref_mCGresources() const {return mCGresources;}
+       struct sCGresources_t : asn::enumerated<2, 0, true>
+       {
+               static constexpr const char* name() {return "sCGresources_t";}
+               using parent_t = asn::enumerated<2, 0, true>;
+               typedef enum {
+                       present
+                       ,not_present
+               } index_t;
+
+       };
+
+       sCGresources_t& ref_sCGresources() {return sCGresources;}
+       sCGresources_t const& ref_sCGresources() const {return sCGresources;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<EN_DC_ResourceConfigurationExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<EN_DC_ResourceConfigurationExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pDCPatSgNB);
+               v(mCGresources);
+               v(sCGresources);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pDCPatSgNB);
+               v(mCGresources);
+               v(sCGresources);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pDCPatSgNB.clear();
+               mCGresources.clear();
+               sCGresources.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pDCPatSgNB_t    pDCPatSgNB;
+       mCGresources_t  mCGresources;
+       sCGresources_t  sCGresources;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ENB-ID ::= CHOICE {
+       macro-eNB-ID    BIT STRING (SIZE (20)),
+       home-eNB-ID             BIT STRING (SIZE (28)),
+       ... ,
+       short-Macro-eNB-ID              BIT STRING (SIZE(18)),
+       long-Macro-eNB-ID               BIT STRING (SIZE(21))
+}
+*/
+
+struct ENB_ID : asn::choice<4, 2, true>
+{
+       static constexpr const char* name() {return "ENB-ID";}
+       using parent_t = asn::choice<4, 2, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 5;}
+       void set_unknown() { set_index(5);  }
+       ~ENB_ID() {clear();}
+       struct macro_eNB_ID_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<20>>;
+               static constexpr const char* name() {return "macro_eNB_ID_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       struct home_eNB_ID_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<28>>;
+               static constexpr const char* name() {return "home_eNB_ID_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       struct short_Macro_eNB_ID_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<18>>;
+               static constexpr const char* name() {return "short_Macro_eNB_ID_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       struct long_Macro_eNB_ID_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<21>>;
+               static constexpr const char* name() {return "long_Macro_eNB_ID_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<macro_eNB_ID_t>(); break;
+               case 2: var.destroy<home_eNB_ID_t>(); break;
+               case 3: var.destroy<short_Macro_eNB_ID_t>(); break;
+               case 4: var.destroy<long_Macro_eNB_ID_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<macro_eNB_ID_t>());
+               case 2: set_index(2); return v(var.build<home_eNB_ID_t>());
+               case 3: set_index(3); return v(var.build<short_Macro_eNB_ID_t>());
+               case 4: set_index(4); return v(var.build<long_Macro_eNB_ID_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<macro_eNB_ID_t>());
+               case 2: return v(var.as<home_eNB_ID_t>());
+               case 3: return v(var.as<short_Macro_eNB_ID_t>());
+               case 4: return v(var.as<long_Macro_eNB_ID_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<macro_eNB_ID_t>(1);
+               v.template operator()<home_eNB_ID_t>(2);
+               v.template operator()<short_Macro_eNB_ID_t>(3);
+               v.template operator()<long_Macro_eNB_ID_t>(4);
+
+       }
+       macro_eNB_ID_t& select_macro_eNB_ID() { if(get_index() != 1) { clear(); set_index(1); return var.build<macro_eNB_ID_t>();} return var.as<macro_eNB_ID_t>();}
+       macro_eNB_ID_t const* get_macro_eNB_ID() const { if(get_index() == 1) { return &var.as<macro_eNB_ID_t>();} return nullptr; }
+       home_eNB_ID_t& select_home_eNB_ID() { if(get_index() != 2) { clear(); set_index(2); return var.build<home_eNB_ID_t>();} return var.as<home_eNB_ID_t>();}
+       home_eNB_ID_t const* get_home_eNB_ID() const { if(get_index() == 2) { return &var.as<home_eNB_ID_t>();} return nullptr; }
+       short_Macro_eNB_ID_t& select_short_Macro_eNB_ID() { if(get_index() != 3) { clear(); set_index(3); return var.build<short_Macro_eNB_ID_t>();} return var.as<short_Macro_eNB_ID_t>();}
+       short_Macro_eNB_ID_t const* get_short_Macro_eNB_ID() const { if(get_index() == 3) { return &var.as<short_Macro_eNB_ID_t>();} return nullptr; }
+       long_Macro_eNB_ID_t& select_long_Macro_eNB_ID() { if(get_index() != 4) { clear(); set_index(4); return var.build<long_Macro_eNB_ID_t>();} return var.as<long_Macro_eNB_ID_t>();}
+       long_Macro_eNB_ID_t const* get_long_Macro_eNB_ID() const { if(get_index() == 4) { return &var.as<long_Macro_eNB_ID_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(macro_eNB_ID_t)];
+               char dummy2[sizeof(home_eNB_ID_t)];
+               char dummy3[sizeof(short_Macro_eNB_ID_t)];
+               char dummy4[sizeof(long_Macro_eNB_ID_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+EPLMNs ::= SEQUENCE (SIZE(1..maxnoofEPLMNs)) OF PLMN-Identity
+*/
+
+struct EPLMNs_elm : PLMN_Identity
+{
+       static constexpr const char* name() {return "EPLMNs_elm";}
+       using parent_t = PLMN_Identity;
+
+};
+struct EPLMNs : asn::sequenceof<EPLMNs_elm>
+{
+       static constexpr const char* name() {return "EPLMNs";}
+       using parent_t = asn::sequenceof<EPLMNs_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofEPLMNs >>;
+
+};
+/*
+UserPlaneTrafficActivityReport ::= ENUMERATED {inactive, re-activated, ...}
+*/
+
+struct UserPlaneTrafficActivityReport : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "UserPlaneTrafficActivityReport";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               inactive
+               ,re_activated
+       } index_t;
+
+};
+
+/*
+ERABActivityNotifyItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ERABActivityNotifyItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ERABActivityNotifyItem ::= SEQUENCE {
+       e-RAB-ID                                                E-RAB-ID,
+       activityReport                                  UserPlaneTrafficActivityReport,
+       iE-Extensions                                   ProtocolExtensionContainer { {ERABActivityNotifyItem-ExtIEs} }  OPTIONAL,
+       ...
+}
+*/
+
+struct ERABActivityNotifyItem : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ERABActivityNotifyItem";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct e_RAB_ID_t : E_RAB_ID
+       {
+               static constexpr const char* name() {return "e_RAB_ID_t";}
+               using parent_t = E_RAB_ID;
+
+       };
+       e_RAB_ID_t& ref_e_RAB_ID() {return e_RAB_ID;}
+       e_RAB_ID_t const& ref_e_RAB_ID() const {return e_RAB_ID;}
+       struct activityReport_t : UserPlaneTrafficActivityReport
+       {
+               static constexpr const char* name() {return "activityReport_t";}
+               using parent_t = UserPlaneTrafficActivityReport;
+
+       };
+       activityReport_t& ref_activityReport() {return activityReport;}
+       activityReport_t const& ref_activityReport() const {return activityReport;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ERABActivityNotifyItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ERABActivityNotifyItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(e_RAB_ID);
+               v(activityReport);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(e_RAB_ID);
+               v(activityReport);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               e_RAB_ID.clear();
+               activityReport.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       e_RAB_ID_t      e_RAB_ID;
+       activityReport_t        activityReport;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ERABActivityNotifyItemList ::= SEQUENCE (SIZE (0..maxnoofBearers)) OF ERABActivityNotifyItem
+*/
+
+struct ERABActivityNotifyItemList_elm : ERABActivityNotifyItem
+{
+       static constexpr const char* name() {return "ERABActivityNotifyItemList_elm";}
+       using parent_t = ERABActivityNotifyItem;
+
+};
+struct ERABActivityNotifyItemList : asn::sequenceof<ERABActivityNotifyItemList_elm>
+{
+       static constexpr const char* name() {return "ERABActivityNotifyItemList";}
+       using parent_t = asn::sequenceof<ERABActivityNotifyItemList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<0,  maxnoofBearers >>;
+
+};
+/*
+Transmission-Bandwidth ::= ENUMERATED {
+               bw6,
+               bw15,
+               bw25,
+               bw50,
+               bw75,
+               bw100,
+               ...,
+               bw1
+}
+*/
+
+struct Transmission_Bandwidth : asn::enumerated<7, 1, true>
+{
+       static constexpr const char* name() {return "Transmission-Bandwidth";}
+       using parent_t = asn::enumerated<7, 1, true>;
+       typedef enum {
+               bw6
+               ,bw15
+               ,bw25
+               ,bw50
+               ,bw75
+               ,bw100
+               ,bw1
+       } index_t;
+
+};
+
+/*
+OffsetOfNbiotChannelNumberToEARFCN ::= ENUMERATED {
+               minusTen,
+               minusNine,
+               minusEight,
+               minusSeven,
+               minusSix,
+               minusFive,
+               minusFour,
+               minusThree,
+               minusTwo,
+               minusOne,
+               minusZeroDotFive,
+               zero,
+               one,
+               two,
+               three,
+               four,
+               five,
+               six,
+               seven,
+               eight,
+               nine,
+               ...
+}
+*/
+
+struct OffsetOfNbiotChannelNumberToEARFCN : asn::enumerated<21, 0, true>
+{
+       static constexpr const char* name() {return "OffsetOfNbiotChannelNumberToEARFCN";}
+       using parent_t = asn::enumerated<21, 0, true>;
+       typedef enum {
+               minusTen
+               ,minusNine
+               ,minusEight
+               ,minusSeven
+               ,minusSix
+               ,minusFive
+               ,minusFour
+               ,minusThree
+               ,minusTwo
+               ,minusOne
+               ,minusZeroDotFive
+               ,zero
+               ,one
+               ,two
+               ,three
+               ,four
+               ,five
+               ,six
+               ,seven
+               ,eight
+               ,nine
+       } index_t;
+
+};
+
+/*
+NRS-NSSS-PowerOffset ::= ENUMERATED { minusThree, zero, three, ...}
+*/
+
+struct NRS_NSSS_PowerOffset : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "NRS-NSSS-PowerOffset";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               minusThree
+               ,zero
+               ,three
+       } index_t;
+
+};
+
+/*
+NSSS-NumOccasionDifferentPrecoder ::= ENUMERATED { two, four, eight, ...}
+*/
+
+struct NSSS_NumOccasionDifferentPrecoder : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "NSSS-NumOccasionDifferentPrecoder";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               two
+               ,four
+               ,eight
+       } index_t;
+
+};
+
+/*
+FDD-Info-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-UL-EARFCNExtension                                              CRITICALITY reject      EXTENSION EARFCNExtension                                                                       PRESENCE optional}|
+       { ID id-DL-EARFCNExtension                                              CRITICALITY reject      EXTENSION EARFCNExtension                                                                       PRESENCE optional}|
+       { ID id-OffsetOfNbiotChannelNumberToDL-EARFCN   CRITICALITY reject      EXTENSION OffsetOfNbiotChannelNumberToEARFCN            PRESENCE optional}|
+       { ID id-OffsetOfNbiotChannelNumberToUL-EARFCN   CRITICALITY reject      EXTENSION OffsetOfNbiotChannelNumberToEARFCN            PRESENCE optional}|
+       { ID id-NRS-NSSS-PowerOffset                                    CRITICALITY ignore      EXTENSION NRS-NSSS-PowerOffset                                                  PRESENCE optional}|
+       { ID id-NSSS-NumOccasionDifferentPrecoder               CRITICALITY ignore      EXTENSION NSSS-NumOccasionDifferentPrecoder                     PRESENCE optional},
+       ...
+}
+*/
+
+struct FDD_Info_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 7; }
+               void clear() {type = 0;}
+               void select_id_UL_EARFCNExtension() { set(id_UL_EARFCNExtension); type=1;}
+               void select_id_DL_EARFCNExtension() { set(id_DL_EARFCNExtension); type=2;}
+               void select_id_OffsetOfNbiotChannelNumberToDL_EARFCN() { set(id_OffsetOfNbiotChannelNumberToDL_EARFCN); type=3;}
+               void select_id_OffsetOfNbiotChannelNumberToUL_EARFCN() { set(id_OffsetOfNbiotChannelNumberToUL_EARFCN); type=4;}
+               void select_id_NRS_NSSS_PowerOffset() { set(id_NRS_NSSS_PowerOffset); type=5;}
+               void select_id_NSSS_NumOccasionDifferentPrecoder() { set(id_NSSS_NumOccasionDifferentPrecoder); type=6;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_UL_EARFCNExtension)) { type = 1; return true; }
+                       else if(equal(id_DL_EARFCNExtension)) { type = 2; return true; }
+                       else if(equal(id_OffsetOfNbiotChannelNumberToDL_EARFCN)) { type = 3; return true; }
+                       else if(equal(id_OffsetOfNbiotChannelNumberToUL_EARFCN)) { type = 4; return true; }
+                       else if(equal(id_NRS_NSSS_PowerOffset)) { type = 5; return true; }
+                       else if(equal(id_NSSS_NumOccasionDifferentPrecoder)) { type = 6; return true; }
+                       else { type = 7; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_UL_EARFCNExtension);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_DL_EARFCNExtension);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(id_OffsetOfNbiotChannelNumberToDL_EARFCN);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(id_OffsetOfNbiotChannelNumberToUL_EARFCN);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(id_NRS_NSSS_PowerOffset);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(id_NSSS_NumOccasionDifferentPrecoder);} return false;
+                       case 7: type = 7; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 7; }
+               void clear() {type = 0;}
+               void select_id_UL_EARFCNExtension() { set(reject); type=1;}
+               void select_id_DL_EARFCNExtension() { set(reject); type=2;}
+               void select_id_OffsetOfNbiotChannelNumberToDL_EARFCN() { set(reject); type=3;}
+               void select_id_OffsetOfNbiotChannelNumberToUL_EARFCN() { set(reject); type=4;}
+               void select_id_NRS_NSSS_PowerOffset() { set(ignore); type=5;}
+               void select_id_NSSS_NumOccasionDifferentPrecoder() { set(ignore); type=6;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(reject)) { type = 1; return true; }
+                       else if(equal(reject)) { type = 2; return true; }
+                       else if(equal(reject)) { type = 3; return true; }
+                       else if(equal(reject)) { type = 4; return true; }
+                       else if(equal(ignore)) { type = 5; return true; }
+                       else if(equal(ignore)) { type = 6; return true; }
+                       else { type = 7; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 7: type = 7; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               EARFCNExtension& select_id_UL_EARFCNExtension() { return set<EARFCNExtension>(1); }
+               EARFCNExtension const* get_id_UL_EARFCNExtension() const { return get<EARFCNExtension>(1); }
+               EARFCNExtension& select_id_DL_EARFCNExtension() { return set<EARFCNExtension>(2); }
+               EARFCNExtension const* get_id_DL_EARFCNExtension() const { return get<EARFCNExtension>(2); }
+               OffsetOfNbiotChannelNumberToEARFCN& select_id_OffsetOfNbiotChannelNumberToDL_EARFCN() { return set<OffsetOfNbiotChannelNumberToEARFCN>(3); }
+               OffsetOfNbiotChannelNumberToEARFCN const* get_id_OffsetOfNbiotChannelNumberToDL_EARFCN() const { return get<OffsetOfNbiotChannelNumberToEARFCN>(3); }
+               OffsetOfNbiotChannelNumberToEARFCN& select_id_OffsetOfNbiotChannelNumberToUL_EARFCN() { return set<OffsetOfNbiotChannelNumberToEARFCN>(4); }
+               OffsetOfNbiotChannelNumberToEARFCN const* get_id_OffsetOfNbiotChannelNumberToUL_EARFCN() const { return get<OffsetOfNbiotChannelNumberToEARFCN>(4); }
+               NRS_NSSS_PowerOffset& select_id_NRS_NSSS_PowerOffset() { return set<NRS_NSSS_PowerOffset>(5); }
+               NRS_NSSS_PowerOffset const* get_id_NRS_NSSS_PowerOffset() const { return get<NRS_NSSS_PowerOffset>(5); }
+               NSSS_NumOccasionDifferentPrecoder& select_id_NSSS_NumOccasionDifferentPrecoder() { return set<NSSS_NumOccasionDifferentPrecoder>(6); }
+               NSSS_NumOccasionDifferentPrecoder const* get_id_NSSS_NumOccasionDifferentPrecoder() const { return get<NSSS_NumOccasionDifferentPrecoder>(6); }
+               bool is_unknown() const { return type == 7; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<EARFCNExtension>(); break;
+                       case 2: var.destroy<EARFCNExtension>(); break;
+                       case 3: var.destroy<OffsetOfNbiotChannelNumberToEARFCN>(); break;
+                       case 4: var.destroy<OffsetOfNbiotChannelNumberToEARFCN>(); break;
+                       case 5: var.destroy<NRS_NSSS_PowerOffset>(); break;
+                       case 6: var.destroy<NSSS_NumOccasionDifferentPrecoder>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<EARFCNExtension>(1);
+                       v.template operator()<EARFCNExtension>(2);
+                       v.template operator()<OffsetOfNbiotChannelNumberToEARFCN>(3);
+                       v.template operator()<OffsetOfNbiotChannelNumberToEARFCN>(4);
+                       v.template operator()<NRS_NSSS_PowerOffset>(5);
+                       v.template operator()<NSSS_NumOccasionDifferentPrecoder>(6);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_UL_EARFCNExtension()); return true;
+                       case 2: v(select_id_DL_EARFCNExtension()); return true;
+                       case 3: v(select_id_OffsetOfNbiotChannelNumberToDL_EARFCN()); return true;
+                       case 4: v(select_id_OffsetOfNbiotChannelNumberToUL_EARFCN()); return true;
+                       case 5: v(select_id_NRS_NSSS_PowerOffset()); return true;
+                       case 6: v(select_id_NSSS_NumOccasionDifferentPrecoder()); return true;
+                       case 7: if(type != 7) {clear(); asn::base::set();} type = 7; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<EARFCNExtension>()); return true;
+                       case 2: v(var.as<EARFCNExtension>()); return true;
+                       case 3: v(var.as<OffsetOfNbiotChannelNumberToEARFCN>()); return true;
+                       case 4: v(var.as<OffsetOfNbiotChannelNumberToEARFCN>()); return true;
+                       case 5: v(var.as<NRS_NSSS_PowerOffset>()); return true;
+                       case 6: v(var.as<NSSS_NumOccasionDifferentPrecoder>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(EARFCNExtension)];
+                       char dummy2[sizeof(NRS_NSSS_PowerOffset)];
+                       char dummy3[sizeof(NSSS_NumOccasionDifferentPrecoder)];
+                       char dummy4[sizeof(OffsetOfNbiotChannelNumberToEARFCN)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 7; }
+               void clear() {type = 0;}
+               void select_id_UL_EARFCNExtension() { set(optional); type=1;}
+               void select_id_DL_EARFCNExtension() { set(optional); type=2;}
+               void select_id_OffsetOfNbiotChannelNumberToDL_EARFCN() { set(optional); type=3;}
+               void select_id_OffsetOfNbiotChannelNumberToUL_EARFCN() { set(optional); type=4;}
+               void select_id_NRS_NSSS_PowerOffset() { set(optional); type=5;}
+               void select_id_NSSS_NumOccasionDifferentPrecoder() { set(optional); type=6;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else if(equal(optional)) { type = 3; return true; }
+                       else if(equal(optional)) { type = 4; return true; }
+                       else if(equal(optional)) { type = 5; return true; }
+                       else if(equal(optional)) { type = 6; return true; }
+                       else { type = 7; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 7: type = 7; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+FDD-Info ::= SEQUENCE {
+       uL-EARFCN                                               EARFCN,
+       dL-EARFCN                                               EARFCN,
+       uL-Transmission-Bandwidth               Transmission-Bandwidth,
+       dL-Transmission-Bandwidth               Transmission-Bandwidth,
+       iE-Extensions                           ProtocolExtensionContainer { {FDD-Info-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct FDD_Info : asn::sequence<5, 0, true, 1>
+{
+       static constexpr const char* name() {return "FDD-Info";}
+       using parent_t = asn::sequence<5, 0, true, 1>;
+       struct uL_EARFCN_t : EARFCN
+       {
+               static constexpr const char* name() {return "uL_EARFCN_t";}
+               using parent_t = EARFCN;
+
+       };
+       uL_EARFCN_t& ref_uL_EARFCN() {return uL_EARFCN;}
+       uL_EARFCN_t const& ref_uL_EARFCN() const {return uL_EARFCN;}
+       struct dL_EARFCN_t : EARFCN
+       {
+               static constexpr const char* name() {return "dL_EARFCN_t";}
+               using parent_t = EARFCN;
+
+       };
+       dL_EARFCN_t& ref_dL_EARFCN() {return dL_EARFCN;}
+       dL_EARFCN_t const& ref_dL_EARFCN() const {return dL_EARFCN;}
+       struct uL_Transmission_Bandwidth_t : Transmission_Bandwidth
+       {
+               static constexpr const char* name() {return "uL_Transmission_Bandwidth_t";}
+               using parent_t = Transmission_Bandwidth;
+
+       };
+       uL_Transmission_Bandwidth_t& ref_uL_Transmission_Bandwidth() {return uL_Transmission_Bandwidth;}
+       uL_Transmission_Bandwidth_t const& ref_uL_Transmission_Bandwidth() const {return uL_Transmission_Bandwidth;}
+       struct dL_Transmission_Bandwidth_t : Transmission_Bandwidth
+       {
+               static constexpr const char* name() {return "dL_Transmission_Bandwidth_t";}
+               using parent_t = Transmission_Bandwidth;
+
+       };
+       dL_Transmission_Bandwidth_t& ref_dL_Transmission_Bandwidth() {return dL_Transmission_Bandwidth;}
+       dL_Transmission_Bandwidth_t const& ref_dL_Transmission_Bandwidth() const {return dL_Transmission_Bandwidth;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<FDD_Info_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<FDD_Info_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uL_EARFCN);
+               v(dL_EARFCN);
+               v(uL_Transmission_Bandwidth);
+               v(dL_Transmission_Bandwidth);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uL_EARFCN);
+               v(dL_EARFCN);
+               v(uL_Transmission_Bandwidth);
+               v(dL_Transmission_Bandwidth);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uL_EARFCN.clear();
+               dL_EARFCN.clear();
+               uL_Transmission_Bandwidth.clear();
+               dL_Transmission_Bandwidth.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uL_EARFCN_t     uL_EARFCN;
+       dL_EARFCN_t     dL_EARFCN;
+       uL_Transmission_Bandwidth_t     uL_Transmission_Bandwidth;
+       dL_Transmission_Bandwidth_t     dL_Transmission_Bandwidth;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SubframeAssignment ::= ENUMERATED {
+       sa0,
+       sa1,
+       sa2,
+       sa3,
+       sa4,
+       sa5,
+       sa6,
+       ...
+}
+*/
+
+struct SubframeAssignment : asn::enumerated<7, 0, true>
+{
+       static constexpr const char* name() {return "SubframeAssignment";}
+       using parent_t = asn::enumerated<7, 0, true>;
+       typedef enum {
+               sa0
+               ,sa1
+               ,sa2
+               ,sa3
+               ,sa4
+               ,sa5
+               ,sa6
+       } index_t;
+
+};
+
+/*
+SpecialSubframePatterns ::= ENUMERATED {
+       ssp0,
+       ssp1,
+       ssp2,
+       ssp3,
+       ssp4,
+       ssp5,
+       ssp6,
+       ssp7,
+       ssp8,
+       ...
+}
+*/
+
+struct SpecialSubframePatterns : asn::enumerated<9, 0, true>
+{
+       static constexpr const char* name() {return "SpecialSubframePatterns";}
+       using parent_t = asn::enumerated<9, 0, true>;
+       typedef enum {
+               ssp0
+               ,ssp1
+               ,ssp2
+               ,ssp3
+               ,ssp4
+               ,ssp5
+               ,ssp6
+               ,ssp7
+               ,ssp8
+       } index_t;
+
+};
+
+/*
+SpecialSubframe-Info-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SpecialSubframe_Info_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SpecialSubframe-Info ::= SEQUENCE {
+       specialSubframePatterns         SpecialSubframePatterns,
+       cyclicPrefixDL                          CyclicPrefixDL,
+       cyclicPrefixUL                          CyclicPrefixUL,
+       iE-Extensions                           ProtocolExtensionContainer { {SpecialSubframe-Info-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct SpecialSubframe_Info : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "SpecialSubframe-Info";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct specialSubframePatterns_t : SpecialSubframePatterns
+       {
+               static constexpr const char* name() {return "specialSubframePatterns_t";}
+               using parent_t = SpecialSubframePatterns;
+
+       };
+       specialSubframePatterns_t& ref_specialSubframePatterns() {return specialSubframePatterns;}
+       specialSubframePatterns_t const& ref_specialSubframePatterns() const {return specialSubframePatterns;}
+       struct cyclicPrefixDL_t : CyclicPrefixDL
+       {
+               static constexpr const char* name() {return "cyclicPrefixDL_t";}
+               using parent_t = CyclicPrefixDL;
+
+       };
+       cyclicPrefixDL_t& ref_cyclicPrefixDL() {return cyclicPrefixDL;}
+       cyclicPrefixDL_t const& ref_cyclicPrefixDL() const {return cyclicPrefixDL;}
+       struct cyclicPrefixUL_t : CyclicPrefixUL
+       {
+               static constexpr const char* name() {return "cyclicPrefixUL_t";}
+               using parent_t = CyclicPrefixUL;
+
+       };
+       cyclicPrefixUL_t& ref_cyclicPrefixUL() {return cyclicPrefixUL;}
+       cyclicPrefixUL_t const& ref_cyclicPrefixUL() const {return cyclicPrefixUL;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SpecialSubframe_Info_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SpecialSubframe_Info_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(specialSubframePatterns);
+               v(cyclicPrefixDL);
+               v(cyclicPrefixUL);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(specialSubframePatterns);
+               v(cyclicPrefixDL);
+               v(cyclicPrefixUL);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               specialSubframePatterns.clear();
+               cyclicPrefixDL.clear();
+               cyclicPrefixUL.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       specialSubframePatterns_t       specialSubframePatterns;
+       cyclicPrefixDL_t        cyclicPrefixDL;
+       cyclicPrefixUL_t        cyclicPrefixUL;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TDD-Info-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-AdditionalSpecialSubframe-Info  CRITICALITY ignore      EXTENSION AdditionalSpecialSubframe-Info        PRESENCE optional}|
+       { ID id-eARFCNExtension                                 CRITICALITY reject      EXTENSION EARFCNExtension                                               PRESENCE optional}|
+       { ID id-AdditionalSpecialSubframeExtension-Info CRITICALITY ignore      EXTENSION AdditionalSpecialSubframeExtension-Info       PRESENCE optional},
+       ...
+}
+*/
+
+struct TDD_Info_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 4; }
+               void clear() {type = 0;}
+               void select_id_AdditionalSpecialSubframe_Info() { set(id_AdditionalSpecialSubframe_Info); type=1;}
+               void select_id_eARFCNExtension() { set(id_eARFCNExtension); type=2;}
+               void select_id_AdditionalSpecialSubframeExtension_Info() { set(id_AdditionalSpecialSubframeExtension_Info); type=3;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_AdditionalSpecialSubframe_Info)) { type = 1; return true; }
+                       else if(equal(id_eARFCNExtension)) { type = 2; return true; }
+                       else if(equal(id_AdditionalSpecialSubframeExtension_Info)) { type = 3; return true; }
+                       else { type = 4; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_AdditionalSpecialSubframe_Info);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_eARFCNExtension);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(id_AdditionalSpecialSubframeExtension_Info);} return false;
+                       case 4: type = 4; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 4; }
+               void clear() {type = 0;}
+               void select_id_AdditionalSpecialSubframe_Info() { set(ignore); type=1;}
+               void select_id_eARFCNExtension() { set(reject); type=2;}
+               void select_id_AdditionalSpecialSubframeExtension_Info() { set(ignore); type=3;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(reject)) { type = 2; return true; }
+                       else if(equal(ignore)) { type = 3; return true; }
+                       else { type = 4; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 4: type = 4; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               AdditionalSpecialSubframe_Info& select_id_AdditionalSpecialSubframe_Info() { return set<AdditionalSpecialSubframe_Info>(1); }
+               AdditionalSpecialSubframe_Info const* get_id_AdditionalSpecialSubframe_Info() const { return get<AdditionalSpecialSubframe_Info>(1); }
+               EARFCNExtension& select_id_eARFCNExtension() { return set<EARFCNExtension>(2); }
+               EARFCNExtension const* get_id_eARFCNExtension() const { return get<EARFCNExtension>(2); }
+               AdditionalSpecialSubframeExtension_Info& select_id_AdditionalSpecialSubframeExtension_Info() { return set<AdditionalSpecialSubframeExtension_Info>(3); }
+               AdditionalSpecialSubframeExtension_Info const* get_id_AdditionalSpecialSubframeExtension_Info() const { return get<AdditionalSpecialSubframeExtension_Info>(3); }
+               bool is_unknown() const { return type == 4; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<AdditionalSpecialSubframe_Info>(); break;
+                       case 2: var.destroy<EARFCNExtension>(); break;
+                       case 3: var.destroy<AdditionalSpecialSubframeExtension_Info>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<AdditionalSpecialSubframe_Info>(1);
+                       v.template operator()<EARFCNExtension>(2);
+                       v.template operator()<AdditionalSpecialSubframeExtension_Info>(3);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_AdditionalSpecialSubframe_Info()); return true;
+                       case 2: v(select_id_eARFCNExtension()); return true;
+                       case 3: v(select_id_AdditionalSpecialSubframeExtension_Info()); return true;
+                       case 4: if(type != 4) {clear(); asn::base::set();} type = 4; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<AdditionalSpecialSubframe_Info>()); return true;
+                       case 2: v(var.as<EARFCNExtension>()); return true;
+                       case 3: v(var.as<AdditionalSpecialSubframeExtension_Info>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(AdditionalSpecialSubframeExtension_Info)];
+                       char dummy2[sizeof(AdditionalSpecialSubframe_Info)];
+                       char dummy3[sizeof(EARFCNExtension)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 4; }
+               void clear() {type = 0;}
+               void select_id_AdditionalSpecialSubframe_Info() { set(optional); type=1;}
+               void select_id_eARFCNExtension() { set(optional); type=2;}
+               void select_id_AdditionalSpecialSubframeExtension_Info() { set(optional); type=3;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else if(equal(optional)) { type = 3; return true; }
+                       else { type = 4; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 4: type = 4; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TDD-Info ::= SEQUENCE {
+       eARFCN                                                  EARFCN,
+       transmission-Bandwidth                  Transmission-Bandwidth,
+       subframeAssignment                              SubframeAssignment,
+       specialSubframe-Info                    SpecialSubframe-Info,
+       iE-Extensions                                   ProtocolExtensionContainer { {TDD-Info-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TDD_Info : asn::sequence<5, 0, true, 1>
+{
+       static constexpr const char* name() {return "TDD-Info";}
+       using parent_t = asn::sequence<5, 0, true, 1>;
+       struct eARFCN_t : EARFCN
+       {
+               static constexpr const char* name() {return "eARFCN_t";}
+               using parent_t = EARFCN;
+
+       };
+       eARFCN_t& ref_eARFCN() {return eARFCN;}
+       eARFCN_t const& ref_eARFCN() const {return eARFCN;}
+       struct transmission_Bandwidth_t : Transmission_Bandwidth
+       {
+               static constexpr const char* name() {return "transmission_Bandwidth_t";}
+               using parent_t = Transmission_Bandwidth;
+
+       };
+       transmission_Bandwidth_t& ref_transmission_Bandwidth() {return transmission_Bandwidth;}
+       transmission_Bandwidth_t const& ref_transmission_Bandwidth() const {return transmission_Bandwidth;}
+       struct subframeAssignment_t : SubframeAssignment
+       {
+               static constexpr const char* name() {return "subframeAssignment_t";}
+               using parent_t = SubframeAssignment;
+
+       };
+       subframeAssignment_t& ref_subframeAssignment() {return subframeAssignment;}
+       subframeAssignment_t const& ref_subframeAssignment() const {return subframeAssignment;}
+       struct specialSubframe_Info_t : SpecialSubframe_Info
+       {
+               static constexpr const char* name() {return "specialSubframe_Info_t";}
+               using parent_t = SpecialSubframe_Info;
+
+       };
+       specialSubframe_Info_t& ref_specialSubframe_Info() {return specialSubframe_Info;}
+       specialSubframe_Info_t const& ref_specialSubframe_Info() const {return specialSubframe_Info;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TDD_Info_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TDD_Info_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(eARFCN);
+               v(transmission_Bandwidth);
+               v(subframeAssignment);
+               v(specialSubframe_Info);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eARFCN);
+               v(transmission_Bandwidth);
+               v(subframeAssignment);
+               v(specialSubframe_Info);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               eARFCN.clear();
+               transmission_Bandwidth.clear();
+               subframeAssignment.clear();
+               specialSubframe_Info.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       eARFCN_t        eARFCN;
+       transmission_Bandwidth_t        transmission_Bandwidth;
+       subframeAssignment_t    subframeAssignment;
+       specialSubframe_Info_t  specialSubframe_Info;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+EUTRA-Mode-Info ::= CHOICE {
+       fDD             FDD-Info,
+       tDD             TDD-Info,
+       ...
+}
+*/
+
+struct EUTRA_Mode_Info : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "EUTRA-Mode-Info";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~EUTRA_Mode_Info() {clear();}
+       struct fDD_t : FDD_Info
+       {
+               static constexpr const char* name() {return "fDD_t";}
+               using parent_t = FDD_Info;
+
+       };
+       struct tDD_t : TDD_Info
+       {
+               static constexpr const char* name() {return "tDD_t";}
+               using parent_t = TDD_Info;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<fDD_t>(); break;
+               case 2: var.destroy<tDD_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<fDD_t>());
+               case 2: set_index(2); return v(var.build<tDD_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<fDD_t>());
+               case 2: return v(var.as<tDD_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<fDD_t>(1);
+               v.template operator()<tDD_t>(2);
+
+       }
+       fDD_t& select_fDD() { if(get_index() != 1) { clear(); set_index(1); return var.build<fDD_t>();} return var.as<fDD_t>();}
+       fDD_t const* get_fDD() const { if(get_index() == 1) { return &var.as<fDD_t>();} return nullptr; }
+       tDD_t& select_tDD() { if(get_index() != 2) { clear(); set_index(2); return var.build<tDD_t>();} return var.as<tDD_t>();}
+       tDD_t const* get_tDD() const { if(get_index() == 2) { return &var.as<tDD_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(fDD_t)];
+               char dummy2[sizeof(tDD_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+EUTRANTraceID          ::= OCTET STRING (SIZE (8))
+*/
+
+struct EUTRANTraceID : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<8>>;
+       static constexpr const char* name() {return "EUTRANTraceID";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+EncryptionAlgorithms ::= BIT STRING (SIZE (16, ...))
+*/
+
+struct EncryptionAlgorithms : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::one<16>>;
+       static constexpr const char* name() {return "EncryptionAlgorithms";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+RNTP-Threshold ::= ENUMERATED {
+       minusInfinity,
+       minusEleven,
+       minusTen,
+       minusNine,
+       minusEight,
+       minusSeven,
+       minusSix,
+       minusFive,
+       minusFour,
+       minusThree,
+       minusTwo,
+       minusOne,
+       zero,
+       one,
+       two,
+       three,
+       ...
+}
+*/
+
+struct RNTP_Threshold : asn::enumerated<16, 0, true>
+{
+       static constexpr const char* name() {return "RNTP-Threshold";}
+       using parent_t = asn::enumerated<16, 0, true>;
+       typedef enum {
+               minusInfinity
+               ,minusEleven
+               ,minusTen
+               ,minusNine
+               ,minusEight
+               ,minusSeven
+               ,minusSix
+               ,minusFive
+               ,minusFour
+               ,minusThree
+               ,minusTwo
+               ,minusOne
+               ,zero
+               ,one
+               ,two
+               ,three
+       } index_t;
+
+};
+
+/*
+EnhancedRNTPStartTime-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct EnhancedRNTPStartTime_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+EnhancedRNTPStartTime ::= SEQUENCE {
+               startSFN                                INTEGER (0..1023, ...),
+               startSubframeNumber             INTEGER (0..9, ...),
+               iE-Extensions                   ProtocolExtensionContainer { {EnhancedRNTPStartTime-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct EnhancedRNTPStartTime : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "EnhancedRNTPStartTime";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct startSFN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 1023>>;
+               static constexpr const char* name() {return "startSFN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       startSFN_t& ref_startSFN() {return startSFN;}
+       startSFN_t const& ref_startSFN() const {return startSFN;}
+       struct startSubframeNumber_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 9>>;
+               static constexpr const char* name() {return "startSubframeNumber_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       startSubframeNumber_t& ref_startSubframeNumber() {return startSubframeNumber;}
+       startSubframeNumber_t const& ref_startSubframeNumber() const {return startSubframeNumber;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<EnhancedRNTPStartTime_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<EnhancedRNTPStartTime_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(startSFN);
+               v(startSubframeNumber);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(startSFN);
+               v(startSubframeNumber);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               startSFN.clear();
+               startSubframeNumber.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       startSFN_t      startSFN;
+       startSubframeNumber_t   startSubframeNumber;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+EnhancedRNTP-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct EnhancedRNTP_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+EnhancedRNTP ::= SEQUENCE {
+       enhancedRNTPBitmap                      BIT STRING (SIZE(12..8800, ...)),
+       rNTP-High-Power-Threshold       RNTP-Threshold,
+       enhancedRNTPStartTime           EnhancedRNTPStartTime OPTIONAL,
+       iE-Extensions                           ProtocolExtensionContainer { {EnhancedRNTP-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct EnhancedRNTP : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "EnhancedRNTP";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct enhancedRNTPBitmap_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<12, 8800>>;
+               static constexpr const char* name() {return "enhancedRNTPBitmap_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       enhancedRNTPBitmap_t& ref_enhancedRNTPBitmap() {return enhancedRNTPBitmap;}
+       enhancedRNTPBitmap_t const& ref_enhancedRNTPBitmap() const {return enhancedRNTPBitmap;}
+       struct rNTP_High_Power_Threshold_t : RNTP_Threshold
+       {
+               static constexpr const char* name() {return "rNTP_High_Power_Threshold_t";}
+               using parent_t = RNTP_Threshold;
+
+       };
+       rNTP_High_Power_Threshold_t& ref_rNTP_High_Power_Threshold() {return rNTP_High_Power_Threshold;}
+       rNTP_High_Power_Threshold_t const& ref_rNTP_High_Power_Threshold() const {return rNTP_High_Power_Threshold;}
+       struct enhancedRNTPStartTime_t : EnhancedRNTPStartTime
+       {
+               static constexpr const char* name() {return "enhancedRNTPStartTime_t";}
+               using parent_t = EnhancedRNTPStartTime;
+               static constexpr bool optional = true;
+
+       };
+       enhancedRNTPStartTime_t& set_enhancedRNTPStartTime() { enhancedRNTPStartTime.setpresent(true); return enhancedRNTPStartTime;}
+       enhancedRNTPStartTime_t const* get_enhancedRNTPStartTime() const {return enhancedRNTPStartTime.is_valid() ? &enhancedRNTPStartTime : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<EnhancedRNTP_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<EnhancedRNTP_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(enhancedRNTPBitmap);
+               v(rNTP_High_Power_Threshold);
+               v(enhancedRNTPStartTime);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(enhancedRNTPBitmap);
+               v(rNTP_High_Power_Threshold);
+               v(enhancedRNTPStartTime);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               enhancedRNTPBitmap.clear();
+               rNTP_High_Power_Threshold.clear();
+               enhancedRNTPStartTime.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       enhancedRNTPBitmap_t    enhancedRNTPBitmap;
+       rNTP_High_Power_Threshold_t     rNTP_High_Power_Threshold;
+       enhancedRNTPStartTime_t enhancedRNTPStartTime;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+EventType ::= ENUMERATED{
+       change-of-serving-cell,
+       ...
+}
+*/
+
+struct EventType : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "EventType";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               change_of_serving_cell
+       } index_t;
+
+};
+
+/*
+ExpectedActivityPeriod ::= INTEGER (1..30|40|50|60|80|100|120|150|180|181,...)
+*/
+
+struct ExpectedActivityPeriod : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 30>,asn::one<40>,asn::one<50>,asn::one<60>,asn::one<80>,asn::one<100>,asn::one<120>,asn::one<150>,asn::one<180>,asn::one<181>>;
+       static constexpr const char* name() {return "ExpectedActivityPeriod";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+ExpectedHOInterval ::= ENUMERATED {
+       sec15, sec30, sec60, sec90, sec120, sec180, long-time,
+       ...
+}
+*/
+
+struct ExpectedHOInterval : asn::enumerated<7, 0, true>
+{
+       static constexpr const char* name() {return "ExpectedHOInterval";}
+       using parent_t = asn::enumerated<7, 0, true>;
+       typedef enum {
+               sec15
+               ,sec30
+               ,sec60
+               ,sec90
+               ,sec120
+               ,sec180
+               ,long_time
+       } index_t;
+
+};
+
+/*
+ExpectedIdlePeriod ::= INTEGER (1..30|40|50|60|80|100|120|150|180|181,...)
+*/
+
+struct ExpectedIdlePeriod : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 30>,asn::one<40>,asn::one<50>,asn::one<60>,asn::one<80>,asn::one<100>,asn::one<120>,asn::one<150>,asn::one<180>,asn::one<181>>;
+       static constexpr const char* name() {return "ExpectedIdlePeriod";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+SourceOfUEActivityBehaviourInformation ::= ENUMERATED {
+       subscription-information,
+       statistics,
+       ...
+}
+*/
+
+struct SourceOfUEActivityBehaviourInformation : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "SourceOfUEActivityBehaviourInformation";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               subscription_information
+               ,statistics
+       } index_t;
+
+};
+
+/*
+ExpectedUEActivityBehaviour-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ExpectedUEActivityBehaviour_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ExpectedUEActivityBehaviour ::= SEQUENCE {
+       expectedActivityPeriod                                  ExpectedActivityPeriod                                  OPTIONAL,
+       expectedIdlePeriod                                              ExpectedIdlePeriod                                              OPTIONAL,
+       sourceofUEActivityBehaviourInformation  SourceOfUEActivityBehaviourInformation  OPTIONAL,
+       iE-Extensions           ProtocolExtensionContainer { {ExpectedUEActivityBehaviour-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ExpectedUEActivityBehaviour : asn::sequence<4, 0, true, 4>
+{
+       static constexpr const char* name() {return "ExpectedUEActivityBehaviour";}
+       using parent_t = asn::sequence<4, 0, true, 4>;
+       struct expectedActivityPeriod_t : ExpectedActivityPeriod
+       {
+               static constexpr const char* name() {return "expectedActivityPeriod_t";}
+               using parent_t = ExpectedActivityPeriod;
+               static constexpr bool optional = true;
+
+       };
+       expectedActivityPeriod_t& set_expectedActivityPeriod() { expectedActivityPeriod.setpresent(true); return expectedActivityPeriod;}
+       expectedActivityPeriod_t const* get_expectedActivityPeriod() const {return expectedActivityPeriod.is_valid() ? &expectedActivityPeriod : nullptr;}
+       struct expectedIdlePeriod_t : ExpectedIdlePeriod
+       {
+               static constexpr const char* name() {return "expectedIdlePeriod_t";}
+               using parent_t = ExpectedIdlePeriod;
+               static constexpr bool optional = true;
+
+       };
+       expectedIdlePeriod_t& set_expectedIdlePeriod() { expectedIdlePeriod.setpresent(true); return expectedIdlePeriod;}
+       expectedIdlePeriod_t const* get_expectedIdlePeriod() const {return expectedIdlePeriod.is_valid() ? &expectedIdlePeriod : nullptr;}
+       struct sourceofUEActivityBehaviourInformation_t : SourceOfUEActivityBehaviourInformation
+       {
+               static constexpr const char* name() {return "sourceofUEActivityBehaviourInformation_t";}
+               using parent_t = SourceOfUEActivityBehaviourInformation;
+               static constexpr bool optional = true;
+
+       };
+       sourceofUEActivityBehaviourInformation_t& set_sourceofUEActivityBehaviourInformation() { sourceofUEActivityBehaviourInformation.setpresent(true); return sourceofUEActivityBehaviourInformation;}
+       sourceofUEActivityBehaviourInformation_t const* get_sourceofUEActivityBehaviourInformation() const {return sourceofUEActivityBehaviourInformation.is_valid() ? &sourceofUEActivityBehaviourInformation : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ExpectedUEActivityBehaviour_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ExpectedUEActivityBehaviour_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(expectedActivityPeriod);
+               v(expectedIdlePeriod);
+               v(sourceofUEActivityBehaviourInformation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(expectedActivityPeriod);
+               v(expectedIdlePeriod);
+               v(sourceofUEActivityBehaviourInformation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               expectedActivityPeriod.clear();
+               expectedIdlePeriod.clear();
+               sourceofUEActivityBehaviourInformation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       expectedActivityPeriod_t        expectedActivityPeriod;
+       expectedIdlePeriod_t    expectedIdlePeriod;
+       sourceofUEActivityBehaviourInformation_t        sourceofUEActivityBehaviourInformation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ExpectedUEBehaviour-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ExpectedUEBehaviour_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ExpectedUEBehaviour ::= SEQUENCE {
+       expectedActivity                ExpectedUEActivityBehaviour OPTIONAL,
+       expectedHOInterval              ExpectedHOInterval                      OPTIONAL,
+       iE-Extensions                   ProtocolExtensionContainer { {ExpectedUEBehaviour-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ExpectedUEBehaviour : asn::sequence<3, 0, true, 3>
+{
+       static constexpr const char* name() {return "ExpectedUEBehaviour";}
+       using parent_t = asn::sequence<3, 0, true, 3>;
+       struct expectedActivity_t : ExpectedUEActivityBehaviour
+       {
+               static constexpr const char* name() {return "expectedActivity_t";}
+               using parent_t = ExpectedUEActivityBehaviour;
+               static constexpr bool optional = true;
+
+       };
+       expectedActivity_t& set_expectedActivity() { expectedActivity.setpresent(true); return expectedActivity;}
+       expectedActivity_t const* get_expectedActivity() const {return expectedActivity.is_valid() ? &expectedActivity : nullptr;}
+       struct expectedHOInterval_t : ExpectedHOInterval
+       {
+               static constexpr const char* name() {return "expectedHOInterval_t";}
+               using parent_t = ExpectedHOInterval;
+               static constexpr bool optional = true;
+
+       };
+       expectedHOInterval_t& set_expectedHOInterval() { expectedHOInterval.setpresent(true); return expectedHOInterval;}
+       expectedHOInterval_t const* get_expectedHOInterval() const {return expectedHOInterval.is_valid() ? &expectedHOInterval : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ExpectedUEBehaviour_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ExpectedUEBehaviour_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(expectedActivity);
+               v(expectedHOInterval);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(expectedActivity);
+               v(expectedHOInterval);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               expectedActivity.clear();
+               expectedHOInterval.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       expectedActivity_t      expectedActivity;
+       expectedHOInterval_t    expectedHOInterval;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UL-InterferenceOverloadIndication-Item ::= ENUMERATED {
+       high-interference,
+       medium-interference,
+       low-interference,
+       ...
+}
+*/
+
+struct UL_InterferenceOverloadIndication_Item : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "UL-InterferenceOverloadIndication-Item";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               high_interference
+               ,medium_interference
+               ,low_interference
+       } index_t;
+
+};
+
+/*
+UL-InterferenceOverloadIndication ::= SEQUENCE (SIZE(1..maxnoofPRBs)) OF UL-InterferenceOverloadIndication-Item
+*/
+
+struct UL_InterferenceOverloadIndication_elm : UL_InterferenceOverloadIndication_Item
+{
+       static constexpr const char* name() {return "UL_InterferenceOverloadIndication_elm";}
+       using parent_t = UL_InterferenceOverloadIndication_Item;
+
+};
+struct UL_InterferenceOverloadIndication : asn::sequenceof<UL_InterferenceOverloadIndication_elm>
+{
+       static constexpr const char* name() {return "UL-InterferenceOverloadIndication";}
+       using parent_t = asn::sequenceof<UL_InterferenceOverloadIndication_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofPRBs >>;
+
+};
+/*
+ExtendedULInterferenceOverloadInfo-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ExtendedULInterferenceOverloadInfo_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ExtendedULInterferenceOverloadInfo ::= SEQUENCE {
+       associatedSubframes                                                     BIT STRING (SIZE (5)),
+       extended-ul-InterferenceOverloadIndication      UL-InterferenceOverloadIndication,
+       iE-Extensions                                                           ProtocolExtensionContainer { {ExtendedULInterferenceOverloadInfo-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ExtendedULInterferenceOverloadInfo : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ExtendedULInterferenceOverloadInfo";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct associatedSubframes_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<5>>;
+               static constexpr const char* name() {return "associatedSubframes_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       associatedSubframes_t& ref_associatedSubframes() {return associatedSubframes;}
+       associatedSubframes_t const& ref_associatedSubframes() const {return associatedSubframes;}
+       struct extended_ul_InterferenceOverloadIndication_t : UL_InterferenceOverloadIndication
+       {
+               static constexpr const char* name() {return "extended_ul_InterferenceOverloadIndication_t";}
+               using parent_t = UL_InterferenceOverloadIndication;
+
+       };
+       extended_ul_InterferenceOverloadIndication_t& ref_extended_ul_InterferenceOverloadIndication() {return extended_ul_InterferenceOverloadIndication;}
+       extended_ul_InterferenceOverloadIndication_t const& ref_extended_ul_InterferenceOverloadIndication() const {return extended_ul_InterferenceOverloadIndication;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ExtendedULInterferenceOverloadInfo_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ExtendedULInterferenceOverloadInfo_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(associatedSubframes);
+               v(extended_ul_InterferenceOverloadIndication);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(associatedSubframes);
+               v(extended_ul_InterferenceOverloadIndication);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               associatedSubframes.clear();
+               extended_ul_InterferenceOverloadIndication.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       associatedSubframes_t   associatedSubframes;
+       extended_ul_InterferenceOverloadIndication_t    extended_ul_InterferenceOverloadIndication;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+FiveGS-TAC ::= OCTET STRING (SIZE (3))
+*/
+
+struct FiveGS_TAC : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<3>>;
+       static constexpr const char* name() {return "FiveGS-TAC";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+ForbiddenInterRATs ::= ENUMERATED {
+       all,
+       geran,
+       utran,
+       cdma2000,
+       ...,
+       geranandutran,
+       cdma2000andutran
+
+}
+*/
+
+struct ForbiddenInterRATs : asn::enumerated<6, 2, true>
+{
+       static constexpr const char* name() {return "ForbiddenInterRATs";}
+       using parent_t = asn::enumerated<6, 2, true>;
+       typedef enum {
+               all
+               ,geran
+               ,utran
+               ,cdma2000
+               ,geranandutran
+               ,cdma2000andutran
+       } index_t;
+
+};
+
+/*
+LAC                                    ::= OCTET STRING (SIZE (2)) --(EXCEPT ('0000'H|'FFFE'H))
+*/
+
+struct LAC : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<2>>;
+       static constexpr const char* name() {return "LAC";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+ForbiddenLACs ::= SEQUENCE (SIZE(1..maxnoofForbLACs)) OF LAC
+*/
+
+struct ForbiddenLACs_elm : LAC
+{
+       static constexpr const char* name() {return "ForbiddenLACs_elm";}
+       using parent_t = LAC;
+
+};
+struct ForbiddenLACs : asn::sequenceof<ForbiddenLACs_elm>
+{
+       static constexpr const char* name() {return "ForbiddenLACs";}
+       using parent_t = asn::sequenceof<ForbiddenLACs_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofForbLACs >>;
+
+};
+/*
+ForbiddenLAs-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ForbiddenLAs_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ForbiddenLAs-Item ::= SEQUENCE {
+       pLMN-Identity           PLMN-Identity,
+       forbiddenLACs           ForbiddenLACs,
+       iE-Extensions           ProtocolExtensionContainer { {ForbiddenLAs-Item-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ForbiddenLAs_Item : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ForbiddenLAs-Item";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct forbiddenLACs_t : ForbiddenLACs
+       {
+               static constexpr const char* name() {return "forbiddenLACs_t";}
+               using parent_t = ForbiddenLACs;
+
+       };
+       forbiddenLACs_t& ref_forbiddenLACs() {return forbiddenLACs;}
+       forbiddenLACs_t const& ref_forbiddenLACs() const {return forbiddenLACs;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ForbiddenLAs_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ForbiddenLAs_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(forbiddenLACs);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(forbiddenLACs);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               forbiddenLACs.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       forbiddenLACs_t forbiddenLACs;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ForbiddenLAs ::= SEQUENCE (SIZE(1..maxnoofEPLMNsPlusOne)) OF ForbiddenLAs-Item
+*/
+
+struct ForbiddenLAs_elm : ForbiddenLAs_Item
+{
+       static constexpr const char* name() {return "ForbiddenLAs_elm";}
+       using parent_t = ForbiddenLAs_Item;
+
+};
+struct ForbiddenLAs : asn::sequenceof<ForbiddenLAs_elm>
+{
+       static constexpr const char* name() {return "ForbiddenLAs";}
+       using parent_t = asn::sequenceof<ForbiddenLAs_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofEPLMNsPlusOne >>;
+
+};
+/*
+ForbiddenTACs ::= SEQUENCE (SIZE(1..maxnoofForbTACs)) OF TAC
+*/
+
+struct ForbiddenTACs_elm : TAC
+{
+       static constexpr const char* name() {return "ForbiddenTACs_elm";}
+       using parent_t = TAC;
+
+};
+struct ForbiddenTACs : asn::sequenceof<ForbiddenTACs_elm>
+{
+       static constexpr const char* name() {return "ForbiddenTACs";}
+       using parent_t = asn::sequenceof<ForbiddenTACs_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofForbTACs >>;
+
+};
+/*
+ForbiddenTAs-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ForbiddenTAs_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ForbiddenTAs-Item ::= SEQUENCE {
+       pLMN-Identity           PLMN-Identity,
+       forbiddenTACs           ForbiddenTACs,
+       iE-Extensions           ProtocolExtensionContainer { {ForbiddenTAs-Item-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ForbiddenTAs_Item : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ForbiddenTAs-Item";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct forbiddenTACs_t : ForbiddenTACs
+       {
+               static constexpr const char* name() {return "forbiddenTACs_t";}
+               using parent_t = ForbiddenTACs;
+
+       };
+       forbiddenTACs_t& ref_forbiddenTACs() {return forbiddenTACs;}
+       forbiddenTACs_t const& ref_forbiddenTACs() const {return forbiddenTACs;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ForbiddenTAs_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ForbiddenTAs_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(forbiddenTACs);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(forbiddenTACs);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               forbiddenTACs.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       forbiddenTACs_t forbiddenTACs;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ForbiddenTAs ::= SEQUENCE (SIZE(1.. maxnoofEPLMNsPlusOne)) OF ForbiddenTAs-Item
+*/
+
+struct ForbiddenTAs_elm : ForbiddenTAs_Item
+{
+       static constexpr const char* name() {return "ForbiddenTAs_elm";}
+       using parent_t = ForbiddenTAs_Item;
+
+};
+struct ForbiddenTAs : asn::sequenceof<ForbiddenTAs_elm>
+{
+       static constexpr const char* name() {return "ForbiddenTAs";}
+       using parent_t = asn::sequenceof<ForbiddenTAs_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofEPLMNsPlusOne >>;
+
+};
+/*
+Fourframes ::= BIT STRING (SIZE (24))
+*/
+
+struct Fourframes : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<24>>;
+       static constexpr const char* name() {return "Fourframes";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+FreqBandIndicatorPriority ::= ENUMERATED {
+       not-broadcasted,
+       broadcasted,
+       ...
+}
+*/
+
+struct FreqBandIndicatorPriority : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "FreqBandIndicatorPriority";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               not_broadcasted
+               ,broadcasted
+       } index_t;
+
+};
+
+/*
+SupportedSULFreqBandItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SupportedSULFreqBandItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SupportedSULFreqBandItem ::= SEQUENCE {
+       freqBandIndicatorNr                     INTEGER (1..1024,...),
+       iE-Extensions                   ProtocolExtensionContainer { {SupportedSULFreqBandItem-ExtIEs} }                OPTIONAL,
+       ...
+}
+*/
+
+struct SupportedSULFreqBandItem : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "SupportedSULFreqBandItem";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct freqBandIndicatorNr_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 1024>>;
+               static constexpr const char* name() {return "freqBandIndicatorNr_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       freqBandIndicatorNr_t& ref_freqBandIndicatorNr() {return freqBandIndicatorNr;}
+       freqBandIndicatorNr_t const& ref_freqBandIndicatorNr() const {return freqBandIndicatorNr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SupportedSULFreqBandItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SupportedSULFreqBandItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(freqBandIndicatorNr);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(freqBandIndicatorNr);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               freqBandIndicatorNr.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       freqBandIndicatorNr_t   freqBandIndicatorNr;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+FreqBandNrItem-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct FreqBandNrItem_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+FreqBandNrItem ::= SEQUENCE {
+       freqBandIndicatorNr                     INTEGER (1..1024,...),
+       supportedSULBandList    SEQUENCE (SIZE(0..maxnoofNrCellBands)) OF SupportedSULFreqBandItem,
+       iE-Extensions                           ProtocolExtensionContainer { {FreqBandNrItem-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct FreqBandNrItem : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "FreqBandNrItem";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct freqBandIndicatorNr_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 1024>>;
+               static constexpr const char* name() {return "freqBandIndicatorNr_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       freqBandIndicatorNr_t& ref_freqBandIndicatorNr() {return freqBandIndicatorNr;}
+       freqBandIndicatorNr_t const& ref_freqBandIndicatorNr() const {return freqBandIndicatorNr;}
+       struct supportedSULBandList_t_elm : SupportedSULFreqBandItem
+       {
+               static constexpr const char* name() {return "supportedSULBandList_t_elm";}
+               using parent_t = SupportedSULFreqBandItem;
+
+       };
+       struct supportedSULBandList_t : asn::sequenceof<supportedSULBandList_t_elm>
+       {
+               static constexpr const char* name() {return "supportedSULBandList_t";}
+               using parent_t = asn::sequenceof<supportedSULBandList_t_elm>;
+               using constraint_t = asn::constraints<false,asn::span<0,  maxnoofNrCellBands >>;
+
+       };
+       supportedSULBandList_t& ref_supportedSULBandList() {return supportedSULBandList;}
+       supportedSULBandList_t const& ref_supportedSULBandList() const {return supportedSULBandList;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<FreqBandNrItem_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<FreqBandNrItem_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(freqBandIndicatorNr);
+               v(supportedSULBandList);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(freqBandIndicatorNr);
+               v(supportedSULBandList);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               freqBandIndicatorNr.clear();
+               supportedSULBandList.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       freqBandIndicatorNr_t   freqBandIndicatorNr;
+       supportedSULBandList_t  supportedSULBandList;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+GNB-ID ::= CHOICE {
+       gNB-ID  BIT STRING (SIZE (22..32)),
+       ...
+}
+*/
+
+struct GNB_ID : asn::choice<1, 0, true>
+{
+       static constexpr const char* name() {return "GNB-ID";}
+       using parent_t = asn::choice<1, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 2;}
+       void set_unknown() { set_index(2);  }
+       ~GNB_ID() {clear();}
+       struct gNB_ID_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<22, 32>>;
+               static constexpr const char* name() {return "gNB_ID_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<gNB_ID_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<gNB_ID_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<gNB_ID_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<gNB_ID_t>(1);
+
+       }
+       gNB_ID_t& select_gNB_ID() { if(get_index() != 1) { clear(); set_index(1); return var.build<gNB_ID_t>();} return var.as<gNB_ID_t>();}
+       gNB_ID_t const* get_gNB_ID() const { if(get_index() == 1) { return &var.as<gNB_ID_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(gNB_ID_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+GNBOverloadInformation ::= ENUMERATED {overloaded, not-overloaded, ...}
+*/
+
+struct GNBOverloadInformation : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "GNBOverloadInformation";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               overloaded
+               ,not_overloaded
+       } index_t;
+
+};
+
+/*
+GTP-TEI                                        ::= OCTET STRING (SIZE (4))
+*/
+
+struct GTP_TEI : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<4>>;
+       static constexpr const char* name() {return "GTP-TEI";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+TransportLayerAddress                  ::= BIT STRING (SIZE(1..160, ...))
+*/
+
+struct TransportLayerAddress : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 160>>;
+       static constexpr const char* name() {return "TransportLayerAddress";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+GTPtunnelEndpoint-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct GTPtunnelEndpoint_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+GTPtunnelEndpoint ::= SEQUENCE {
+       transportLayerAddress                   TransportLayerAddress,
+       gTP-TEID                                                GTP-TEI,
+       iE-Extensions                                   ProtocolExtensionContainer { {GTPtunnelEndpoint-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct GTPtunnelEndpoint : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "GTPtunnelEndpoint";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct transportLayerAddress_t : TransportLayerAddress
+       {
+               static constexpr const char* name() {return "transportLayerAddress_t";}
+               using parent_t = TransportLayerAddress;
+
+       };
+       transportLayerAddress_t& ref_transportLayerAddress() {return transportLayerAddress;}
+       transportLayerAddress_t const& ref_transportLayerAddress() const {return transportLayerAddress;}
+       struct gTP_TEID_t : GTP_TEI
+       {
+               static constexpr const char* name() {return "gTP_TEID_t";}
+               using parent_t = GTP_TEI;
+
+       };
+       gTP_TEID_t& ref_gTP_TEID() {return gTP_TEID;}
+       gTP_TEID_t const& ref_gTP_TEID() const {return gTP_TEID;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<GTPtunnelEndpoint_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<GTPtunnelEndpoint_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(transportLayerAddress);
+               v(gTP_TEID);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(transportLayerAddress);
+               v(gTP_TEID);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               transportLayerAddress.clear();
+               gTP_TEID.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       transportLayerAddress_t transportLayerAddress;
+       gTP_TEID_t      gTP_TEID;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MME-Group-ID   ::= OCTET STRING (SIZE (2))
+*/
+
+struct MME_Group_ID : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<2>>;
+       static constexpr const char* name() {return "MME-Group-ID";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+GU-Group-ID-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct GU_Group_ID_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+GU-Group-ID                    ::= SEQUENCE {
+       pLMN-Identity           PLMN-Identity,
+       mME-Group-ID            MME-Group-ID,
+       iE-Extensions           ProtocolExtensionContainer { {GU-Group-ID-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct GU_Group_ID : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "GU-Group-ID";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct mME_Group_ID_t : MME_Group_ID
+       {
+               static constexpr const char* name() {return "mME_Group_ID_t";}
+               using parent_t = MME_Group_ID;
+
+       };
+       mME_Group_ID_t& ref_mME_Group_ID() {return mME_Group_ID;}
+       mME_Group_ID_t const& ref_mME_Group_ID() const {return mME_Group_ID;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<GU_Group_ID_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<GU_Group_ID_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(mME_Group_ID);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(mME_Group_ID);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               mME_Group_ID.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       mME_Group_ID_t  mME_Group_ID;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+GUGroupIDList          ::= SEQUENCE (SIZE (1..maxPools)) OF GU-Group-ID
+*/
+
+struct GUGroupIDList_elm : GU_Group_ID
+{
+       static constexpr const char* name() {return "GUGroupIDList_elm";}
+       using parent_t = GU_Group_ID;
+
+};
+struct GUGroupIDList : asn::sequenceof<GUGroupIDList_elm>
+{
+       static constexpr const char* name() {return "GUGroupIDList";}
+       using parent_t = asn::sequenceof<GUGroupIDList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxPools >>;
+
+};
+/*
+MME-Code               ::= OCTET STRING (SIZE (1))
+*/
+
+struct MME_Code : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<1>>;
+       static constexpr const char* name() {return "MME-Code";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+GUMMEI-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct GUMMEI_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+GUMMEI                 ::= SEQUENCE {
+
+       gU-Group-ID             GU-Group-ID,
+       mME-Code                        MME-Code,
+       iE-Extensions                                   ProtocolExtensionContainer { {GUMMEI-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct GUMMEI : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "GUMMEI";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct gU_Group_ID_t : GU_Group_ID
+       {
+               static constexpr const char* name() {return "gU_Group_ID_t";}
+               using parent_t = GU_Group_ID;
+
+       };
+       gU_Group_ID_t& ref_gU_Group_ID() {return gU_Group_ID;}
+       gU_Group_ID_t const& ref_gU_Group_ID() const {return gU_Group_ID;}
+       struct mME_Code_t : MME_Code
+       {
+               static constexpr const char* name() {return "mME_Code_t";}
+               using parent_t = MME_Code;
+
+       };
+       mME_Code_t& ref_mME_Code() {return mME_Code;}
+       mME_Code_t const& ref_mME_Code() const {return mME_Code;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<GUMMEI_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<GUMMEI_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(gU_Group_ID);
+               v(mME_Code);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(gU_Group_ID);
+               v(mME_Code);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               gU_Group_ID.clear();
+               mME_Code.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       gU_Group_ID_t   gU_Group_ID;
+       mME_Code_t      mME_Code;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+GlobalENB-ID-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct GlobalENB_ID_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+GlobalENB-ID ::= SEQUENCE {
+       pLMN-Identity                   PLMN-Identity,
+       eNB-ID                                  ENB-ID,
+       iE-Extensions                   ProtocolExtensionContainer { {GlobalENB-ID-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct GlobalENB_ID : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "GlobalENB-ID";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct eNB_ID_t : ENB_ID
+       {
+               static constexpr const char* name() {return "eNB_ID_t";}
+               using parent_t = ENB_ID;
+
+       };
+       eNB_ID_t& ref_eNB_ID() {return eNB_ID;}
+       eNB_ID_t const& ref_eNB_ID() const {return eNB_ID;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<GlobalENB_ID_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<GlobalENB_ID_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(eNB_ID);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(eNB_ID);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               eNB_ID.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       eNB_ID_t        eNB_ID;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+GlobalGNB-ID-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct GlobalGNB_ID_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+GlobalGNB-ID ::= SEQUENCE {
+       pLMN-Identity                   PLMN-Identity,
+       gNB-ID                                  GNB-ID,
+       iE-Extensions                   ProtocolExtensionContainer { {GlobalGNB-ID-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct GlobalGNB_ID : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "GlobalGNB-ID";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct gNB_ID_t : GNB_ID
+       {
+               static constexpr const char* name() {return "gNB_ID_t";}
+               using parent_t = GNB_ID;
+
+       };
+       gNB_ID_t& ref_gNB_ID() {return gNB_ID;}
+       gNB_ID_t const& ref_gNB_ID() const {return gNB_ID;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<GlobalGNB_ID_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<GlobalGNB_ID_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(gNB_ID);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(gNB_ID);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               gNB_ID.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       gNB_ID_t        gNB_ID;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+LoadIndicator ::= ENUMERATED {
+       lowLoad,
+       mediumLoad,
+       highLoad,
+       overLoad,
+       ...
+}
+*/
+
+struct LoadIndicator : asn::enumerated<4, 0, true>
+{
+       static constexpr const char* name() {return "LoadIndicator";}
+       using parent_t = asn::enumerated<4, 0, true>;
+       typedef enum {
+               lowLoad
+               ,mediumLoad
+               ,highLoad
+               ,overLoad
+       } index_t;
+
+};
+
+/*
+HWLoadIndicator-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct HWLoadIndicator_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+HWLoadIndicator ::= SEQUENCE {
+       dLHWLoadIndicator                       LoadIndicator,
+       uLHWLoadIndicator                       LoadIndicator,
+       iE-Extensions                           ProtocolExtensionContainer { {HWLoadIndicator-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct HWLoadIndicator : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "HWLoadIndicator";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct dLHWLoadIndicator_t : LoadIndicator
+       {
+               static constexpr const char* name() {return "dLHWLoadIndicator_t";}
+               using parent_t = LoadIndicator;
+
+       };
+       dLHWLoadIndicator_t& ref_dLHWLoadIndicator() {return dLHWLoadIndicator;}
+       dLHWLoadIndicator_t const& ref_dLHWLoadIndicator() const {return dLHWLoadIndicator;}
+       struct uLHWLoadIndicator_t : LoadIndicator
+       {
+               static constexpr const char* name() {return "uLHWLoadIndicator_t";}
+               using parent_t = LoadIndicator;
+
+       };
+       uLHWLoadIndicator_t& ref_uLHWLoadIndicator() {return uLHWLoadIndicator;}
+       uLHWLoadIndicator_t const& ref_uLHWLoadIndicator() const {return uLHWLoadIndicator;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<HWLoadIndicator_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<HWLoadIndicator_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(dLHWLoadIndicator);
+               v(uLHWLoadIndicator);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(dLHWLoadIndicator);
+               v(uLHWLoadIndicator);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               dLHWLoadIndicator.clear();
+               uLHWLoadIndicator.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       dLHWLoadIndicator_t     dLHWLoadIndicator;
+       uLHWLoadIndicator_t     uLHWLoadIndicator;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+HandoverReportType ::= ENUMERATED {
+       hoTooEarly,
+       hoToWrongCell,
+       ...,
+       interRATpingpong
+}
+*/
+
+struct HandoverReportType : asn::enumerated<3, 1, true>
+{
+       static constexpr const char* name() {return "HandoverReportType";}
+       using parent_t = asn::enumerated<3, 1, true>;
+       typedef enum {
+               hoTooEarly
+               ,hoToWrongCell
+               ,interRATpingpong
+       } index_t;
+
+};
+
+/*
+NRrestrictioninEPSasSecondaryRAT ::= ENUMERATED {
+       nRrestrictedinEPSasSecondaryRAT,
+       ...
+}
+*/
+
+struct NRrestrictioninEPSasSecondaryRAT : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "NRrestrictioninEPSasSecondaryRAT";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               nRrestrictedinEPSasSecondaryRAT
+       } index_t;
+
+};
+
+/*
+NRrestrictionin5GS ::= ENUMERATED {
+       nRrestrictedin5GS,
+       ...
+}
+*/
+
+struct NRrestrictionin5GS : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "NRrestrictionin5GS";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               nRrestrictedin5GS
+       } index_t;
+
+};
+
+/*
+HandoverRestrictionList-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-NRrestrictioninEPSasSecondaryRAT                        CRITICALITY ignore      EXTENSION NRrestrictioninEPSasSecondaryRAT                      PRESENCE optional}|
+       { ID id-CNTypeRestrictions                                              CRITICALITY ignore      EXTENSION CNTypeRestrictions                                                            PRESENCE optional}|
+       { ID id-NRrestrictionin5GS                                              CRITICALITY ignore      EXTENSION NRrestrictionin5GS                                                            PRESENCE optional},
+       ...
+}
+*/
+
+struct HandoverRestrictionList_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 4; }
+               void clear() {type = 0;}
+               void select_id_NRrestrictioninEPSasSecondaryRAT() { set(id_NRrestrictioninEPSasSecondaryRAT); type=1;}
+               void select_id_CNTypeRestrictions() { set(id_CNTypeRestrictions); type=2;}
+               void select_id_NRrestrictionin5GS() { set(id_NRrestrictionin5GS); type=3;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_NRrestrictioninEPSasSecondaryRAT)) { type = 1; return true; }
+                       else if(equal(id_CNTypeRestrictions)) { type = 2; return true; }
+                       else if(equal(id_NRrestrictionin5GS)) { type = 3; return true; }
+                       else { type = 4; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_NRrestrictioninEPSasSecondaryRAT);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_CNTypeRestrictions);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(id_NRrestrictionin5GS);} return false;
+                       case 4: type = 4; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 4; }
+               void clear() {type = 0;}
+               void select_id_NRrestrictioninEPSasSecondaryRAT() { set(ignore); type=1;}
+               void select_id_CNTypeRestrictions() { set(ignore); type=2;}
+               void select_id_NRrestrictionin5GS() { set(ignore); type=3;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else if(equal(ignore)) { type = 3; return true; }
+                       else { type = 4; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 4: type = 4; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               NRrestrictioninEPSasSecondaryRAT& select_id_NRrestrictioninEPSasSecondaryRAT() { return set<NRrestrictioninEPSasSecondaryRAT>(1); }
+               NRrestrictioninEPSasSecondaryRAT const* get_id_NRrestrictioninEPSasSecondaryRAT() const { return get<NRrestrictioninEPSasSecondaryRAT>(1); }
+               CNTypeRestrictions& select_id_CNTypeRestrictions() { return set<CNTypeRestrictions>(2); }
+               CNTypeRestrictions const* get_id_CNTypeRestrictions() const { return get<CNTypeRestrictions>(2); }
+               NRrestrictionin5GS& select_id_NRrestrictionin5GS() { return set<NRrestrictionin5GS>(3); }
+               NRrestrictionin5GS const* get_id_NRrestrictionin5GS() const { return get<NRrestrictionin5GS>(3); }
+               bool is_unknown() const { return type == 4; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<NRrestrictioninEPSasSecondaryRAT>(); break;
+                       case 2: var.destroy<CNTypeRestrictions>(); break;
+                       case 3: var.destroy<NRrestrictionin5GS>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<NRrestrictioninEPSasSecondaryRAT>(1);
+                       v.template operator()<CNTypeRestrictions>(2);
+                       v.template operator()<NRrestrictionin5GS>(3);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_NRrestrictioninEPSasSecondaryRAT()); return true;
+                       case 2: v(select_id_CNTypeRestrictions()); return true;
+                       case 3: v(select_id_NRrestrictionin5GS()); return true;
+                       case 4: if(type != 4) {clear(); asn::base::set();} type = 4; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<NRrestrictioninEPSasSecondaryRAT>()); return true;
+                       case 2: v(var.as<CNTypeRestrictions>()); return true;
+                       case 3: v(var.as<NRrestrictionin5GS>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(CNTypeRestrictions)];
+                       char dummy2[sizeof(NRrestrictionin5GS)];
+                       char dummy3[sizeof(NRrestrictioninEPSasSecondaryRAT)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 4; }
+               void clear() {type = 0;}
+               void select_id_NRrestrictioninEPSasSecondaryRAT() { set(optional); type=1;}
+               void select_id_CNTypeRestrictions() { set(optional); type=2;}
+               void select_id_NRrestrictionin5GS() { set(optional); type=3;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else if(equal(optional)) { type = 3; return true; }
+                       else { type = 4; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 4: type = 4; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+HandoverRestrictionList ::= SEQUENCE {
+       servingPLMN                                     PLMN-Identity,
+       equivalentPLMNs                         EPLMNs                                  OPTIONAL,
+       forbiddenTAs                            ForbiddenTAs                    OPTIONAL,
+       forbiddenLAs                            ForbiddenLAs                    OPTIONAL,
+       forbiddenInterRATs                      ForbiddenInterRATs              OPTIONAL,
+       iE-Extensions                           ProtocolExtensionContainer { {HandoverRestrictionList-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct HandoverRestrictionList : asn::sequence<6, 0, true, 5>
+{
+       static constexpr const char* name() {return "HandoverRestrictionList";}
+       using parent_t = asn::sequence<6, 0, true, 5>;
+       struct servingPLMN_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "servingPLMN_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       servingPLMN_t& ref_servingPLMN() {return servingPLMN;}
+       servingPLMN_t const& ref_servingPLMN() const {return servingPLMN;}
+       struct equivalentPLMNs_t : EPLMNs
+       {
+               static constexpr const char* name() {return "equivalentPLMNs_t";}
+               using parent_t = EPLMNs;
+               static constexpr bool optional = true;
+
+       };
+       equivalentPLMNs_t& set_equivalentPLMNs() { equivalentPLMNs.setpresent(true); return equivalentPLMNs;}
+       equivalentPLMNs_t const* get_equivalentPLMNs() const {return equivalentPLMNs.is_valid() ? &equivalentPLMNs : nullptr;}
+       struct forbiddenTAs_t : ForbiddenTAs
+       {
+               static constexpr const char* name() {return "forbiddenTAs_t";}
+               using parent_t = ForbiddenTAs;
+               static constexpr bool optional = true;
+
+       };
+       forbiddenTAs_t& set_forbiddenTAs() { forbiddenTAs.setpresent(true); return forbiddenTAs;}
+       forbiddenTAs_t const* get_forbiddenTAs() const {return forbiddenTAs.is_valid() ? &forbiddenTAs : nullptr;}
+       struct forbiddenLAs_t : ForbiddenLAs
+       {
+               static constexpr const char* name() {return "forbiddenLAs_t";}
+               using parent_t = ForbiddenLAs;
+               static constexpr bool optional = true;
+
+       };
+       forbiddenLAs_t& set_forbiddenLAs() { forbiddenLAs.setpresent(true); return forbiddenLAs;}
+       forbiddenLAs_t const* get_forbiddenLAs() const {return forbiddenLAs.is_valid() ? &forbiddenLAs : nullptr;}
+       struct forbiddenInterRATs_t : ForbiddenInterRATs
+       {
+               static constexpr const char* name() {return "forbiddenInterRATs_t";}
+               using parent_t = ForbiddenInterRATs;
+               static constexpr bool optional = true;
+
+       };
+       forbiddenInterRATs_t& set_forbiddenInterRATs() { forbiddenInterRATs.setpresent(true); return forbiddenInterRATs;}
+       forbiddenInterRATs_t const* get_forbiddenInterRATs() const {return forbiddenInterRATs.is_valid() ? &forbiddenInterRATs : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<HandoverRestrictionList_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<HandoverRestrictionList_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(servingPLMN);
+               v(equivalentPLMNs);
+               v(forbiddenTAs);
+               v(forbiddenLAs);
+               v(forbiddenInterRATs);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(servingPLMN);
+               v(equivalentPLMNs);
+               v(forbiddenTAs);
+               v(forbiddenLAs);
+               v(forbiddenInterRATs);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               servingPLMN.clear();
+               equivalentPLMNs.clear();
+               forbiddenTAs.clear();
+               forbiddenLAs.clear();
+               forbiddenInterRATs.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       servingPLMN_t   servingPLMN;
+       equivalentPLMNs_t       equivalentPLMNs;
+       forbiddenTAs_t  forbiddenTAs;
+       forbiddenLAs_t  forbiddenLAs;
+       forbiddenInterRATs_t    forbiddenInterRATs;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+IntegrityProtectionAlgorithms ::= BIT STRING (SIZE (16, ...))
+*/
+
+struct IntegrityProtectionAlgorithms : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::one<16>>;
+       static constexpr const char* name() {return "IntegrityProtectionAlgorithms";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+InterfacesToTrace ::= BIT STRING (SIZE (8))
+*/
+
+struct InterfacesToTrace : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<8>>;
+       static constexpr const char* name() {return "InterfacesToTrace";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+InvokeIndication ::= ENUMERATED{
+       abs-information,
+       ...,
+       naics-information-start,
+       naics-information-stop
+}
+*/
+
+struct InvokeIndication : asn::enumerated<3, 2, true>
+{
+       static constexpr const char* name() {return "InvokeIndication";}
+       using parent_t = asn::enumerated<3, 2, true>;
+       typedef enum {
+               abs_information
+               ,naics_information_start
+               ,naics_information_stop
+       } index_t;
+
+};
+
+/*
+LCID ::= INTEGER(1..32, ...)
+*/
+
+struct LCID : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 32>>;
+       static constexpr const char* name() {return "LCID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+LHN-ID ::= OCTET STRING(SIZE (32..256))
+*/
+
+struct LHN_ID : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::span<32, 256>>;
+       static constexpr const char* name() {return "LHN-ID";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+Time-UE-StayedInCell ::= INTEGER (0..4095)
+*/
+
+struct Time_UE_StayedInCell : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 4095>>;
+       static constexpr const char* name() {return "Time-UE-StayedInCell";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+Time-UE-StayedInCell-EnhancedGranularity ::= INTEGER (0..40950)
+*/
+
+struct Time_UE_StayedInCell_EnhancedGranularity : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 40950>>;
+       static constexpr const char* name() {return "Time-UE-StayedInCell-EnhancedGranularity";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+LastVisitedEUTRANCellInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+-- Extension for Rel-11 to support enhanced granularity for time UE stayed in cell --
+       { ID id-Time-UE-StayedInCell-EnhancedGranularity        CRITICALITY ignore      EXTENSION Time-UE-StayedInCell-EnhancedGranularity      PRESENCE optional}|
+       { ID id-HO-cause                                                                        CRITICALITY ignore      EXTENSION Cause                                                                                                 PRESENCE optional},
+       ...
+}
+*/
+
+struct LastVisitedEUTRANCellInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_Time_UE_StayedInCell_EnhancedGranularity() { set(id_Time_UE_StayedInCell_EnhancedGranularity); type=1;}
+               void select_id_HO_cause() { set(id_HO_cause); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_Time_UE_StayedInCell_EnhancedGranularity)) { type = 1; return true; }
+                       else if(equal(id_HO_cause)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_Time_UE_StayedInCell_EnhancedGranularity);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_HO_cause);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_Time_UE_StayedInCell_EnhancedGranularity() { set(ignore); type=1;}
+               void select_id_HO_cause() { set(ignore); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               Time_UE_StayedInCell_EnhancedGranularity& select_id_Time_UE_StayedInCell_EnhancedGranularity() { return set<Time_UE_StayedInCell_EnhancedGranularity>(1); }
+               Time_UE_StayedInCell_EnhancedGranularity const* get_id_Time_UE_StayedInCell_EnhancedGranularity() const { return get<Time_UE_StayedInCell_EnhancedGranularity>(1); }
+               Cause& select_id_HO_cause() { return set<Cause>(2); }
+               Cause const* get_id_HO_cause() const { return get<Cause>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<Time_UE_StayedInCell_EnhancedGranularity>(); break;
+                       case 2: var.destroy<Cause>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<Time_UE_StayedInCell_EnhancedGranularity>(1);
+                       v.template operator()<Cause>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_Time_UE_StayedInCell_EnhancedGranularity()); return true;
+                       case 2: v(select_id_HO_cause()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<Time_UE_StayedInCell_EnhancedGranularity>()); return true;
+                       case 2: v(var.as<Cause>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(Cause)];
+                       char dummy2[sizeof(Time_UE_StayedInCell_EnhancedGranularity)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_Time_UE_StayedInCell_EnhancedGranularity() { set(optional); type=1;}
+               void select_id_HO_cause() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+LastVisitedEUTRANCellInformation ::= SEQUENCE {
+       global-Cell-ID                                  ECGI,
+       cellType                                                CellType,
+       time-UE-StayedInCell                    Time-UE-StayedInCell,
+       iE-Extensions                                   ProtocolExtensionContainer { {LastVisitedEUTRANCellInformation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct LastVisitedEUTRANCellInformation : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "LastVisitedEUTRANCellInformation";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct global_Cell_ID_t : ECGI
+       {
+               static constexpr const char* name() {return "global_Cell_ID_t";}
+               using parent_t = ECGI;
+
+       };
+       global_Cell_ID_t& ref_global_Cell_ID() {return global_Cell_ID;}
+       global_Cell_ID_t const& ref_global_Cell_ID() const {return global_Cell_ID;}
+       struct cellType_t : CellType
+       {
+               static constexpr const char* name() {return "cellType_t";}
+               using parent_t = CellType;
+
+       };
+       cellType_t& ref_cellType() {return cellType;}
+       cellType_t const& ref_cellType() const {return cellType;}
+       struct time_UE_StayedInCell_t : Time_UE_StayedInCell
+       {
+               static constexpr const char* name() {return "time_UE_StayedInCell_t";}
+               using parent_t = Time_UE_StayedInCell;
+
+       };
+       time_UE_StayedInCell_t& ref_time_UE_StayedInCell() {return time_UE_StayedInCell;}
+       time_UE_StayedInCell_t const& ref_time_UE_StayedInCell() const {return time_UE_StayedInCell;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<LastVisitedEUTRANCellInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<LastVisitedEUTRANCellInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(global_Cell_ID);
+               v(cellType);
+               v(time_UE_StayedInCell);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(global_Cell_ID);
+               v(cellType);
+               v(time_UE_StayedInCell);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               global_Cell_ID.clear();
+               cellType.clear();
+               time_UE_StayedInCell.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       global_Cell_ID_t        global_Cell_ID;
+       cellType_t      cellType;
+       time_UE_StayedInCell_t  time_UE_StayedInCell;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+LastVisitedUTRANCellInformation        ::= OCTET STRING
+*/
+
+struct LastVisitedUTRANCellInformation : asn::ostring<>
+{
+       static constexpr const char* name() {return "LastVisitedUTRANCellInformation";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+LastVisitedGERANCellInformation ::= CHOICE {
+       undefined                                               NULL,
+       ...
+}
+*/
+
+struct LastVisitedGERANCellInformation : asn::choice<1, 0, true>
+{
+       static constexpr const char* name() {return "LastVisitedGERANCellInformation";}
+       using parent_t = asn::choice<1, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 2;}
+       void set_unknown() { set_index(2);  }
+       ~LastVisitedGERANCellInformation() {clear();}
+       struct undefined_t : asn::nulltype
+       {
+               static constexpr const char* name() {return "undefined_t";}
+               using parent_t = asn::nulltype;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<undefined_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<undefined_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<undefined_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<undefined_t>(1);
+
+       }
+       undefined_t& select_undefined() { if(get_index() != 1) { clear(); set_index(1); return var.build<undefined_t>();} return var.as<undefined_t>();}
+       undefined_t const* get_undefined() const { if(get_index() == 1) { return &var.as<undefined_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(undefined_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+LastVisitedNGRANCellInformation        ::= OCTET STRING
+*/
+
+struct LastVisitedNGRANCellInformation : asn::ostring<>
+{
+       static constexpr const char* name() {return "LastVisitedNGRANCellInformation";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+LastVisitedCell-Item ::= CHOICE {
+       e-UTRAN-Cell                                    LastVisitedEUTRANCellInformation,
+       uTRAN-Cell                                              LastVisitedUTRANCellInformation,
+       gERAN-Cell                                              LastVisitedGERANCellInformation,
+       ...,
+       nG-RAN-Cell                                             LastVisitedNGRANCellInformation
+}
+*/
+
+struct LastVisitedCell_Item : asn::choice<4, 1, true>
+{
+       static constexpr const char* name() {return "LastVisitedCell-Item";}
+       using parent_t = asn::choice<4, 1, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 5;}
+       void set_unknown() { set_index(5);  }
+       ~LastVisitedCell_Item() {clear();}
+       struct e_UTRAN_Cell_t : LastVisitedEUTRANCellInformation
+       {
+               static constexpr const char* name() {return "e_UTRAN_Cell_t";}
+               using parent_t = LastVisitedEUTRANCellInformation;
+
+       };
+       struct uTRAN_Cell_t : LastVisitedUTRANCellInformation
+       {
+               static constexpr const char* name() {return "uTRAN_Cell_t";}
+               using parent_t = LastVisitedUTRANCellInformation;
+
+       };
+       struct gERAN_Cell_t : LastVisitedGERANCellInformation
+       {
+               static constexpr const char* name() {return "gERAN_Cell_t";}
+               using parent_t = LastVisitedGERANCellInformation;
+
+       };
+       struct nG_RAN_Cell_t : LastVisitedNGRANCellInformation
+       {
+               static constexpr const char* name() {return "nG_RAN_Cell_t";}
+               using parent_t = LastVisitedNGRANCellInformation;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<e_UTRAN_Cell_t>(); break;
+               case 2: var.destroy<uTRAN_Cell_t>(); break;
+               case 3: var.destroy<gERAN_Cell_t>(); break;
+               case 4: var.destroy<nG_RAN_Cell_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<e_UTRAN_Cell_t>());
+               case 2: set_index(2); return v(var.build<uTRAN_Cell_t>());
+               case 3: set_index(3); return v(var.build<gERAN_Cell_t>());
+               case 4: set_index(4); return v(var.build<nG_RAN_Cell_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<e_UTRAN_Cell_t>());
+               case 2: return v(var.as<uTRAN_Cell_t>());
+               case 3: return v(var.as<gERAN_Cell_t>());
+               case 4: return v(var.as<nG_RAN_Cell_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<e_UTRAN_Cell_t>(1);
+               v.template operator()<uTRAN_Cell_t>(2);
+               v.template operator()<gERAN_Cell_t>(3);
+               v.template operator()<nG_RAN_Cell_t>(4);
+
+       }
+       e_UTRAN_Cell_t& select_e_UTRAN_Cell() { if(get_index() != 1) { clear(); set_index(1); return var.build<e_UTRAN_Cell_t>();} return var.as<e_UTRAN_Cell_t>();}
+       e_UTRAN_Cell_t const* get_e_UTRAN_Cell() const { if(get_index() == 1) { return &var.as<e_UTRAN_Cell_t>();} return nullptr; }
+       uTRAN_Cell_t& select_uTRAN_Cell() { if(get_index() != 2) { clear(); set_index(2); return var.build<uTRAN_Cell_t>();} return var.as<uTRAN_Cell_t>();}
+       uTRAN_Cell_t const* get_uTRAN_Cell() const { if(get_index() == 2) { return &var.as<uTRAN_Cell_t>();} return nullptr; }
+       gERAN_Cell_t& select_gERAN_Cell() { if(get_index() != 3) { clear(); set_index(3); return var.build<gERAN_Cell_t>();} return var.as<gERAN_Cell_t>();}
+       gERAN_Cell_t const* get_gERAN_Cell() const { if(get_index() == 3) { return &var.as<gERAN_Cell_t>();} return nullptr; }
+       nG_RAN_Cell_t& select_nG_RAN_Cell() { if(get_index() != 4) { clear(); set_index(4); return var.build<nG_RAN_Cell_t>();} return var.as<nG_RAN_Cell_t>();}
+       nG_RAN_Cell_t const* get_nG_RAN_Cell() const { if(get_index() == 4) { return &var.as<nG_RAN_Cell_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(e_UTRAN_Cell_t)];
+               char dummy2[sizeof(uTRAN_Cell_t)];
+               char dummy3[sizeof(gERAN_Cell_t)];
+               char dummy4[sizeof(nG_RAN_Cell_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+Links-to-log ::= ENUMERATED {uplink, downlink, both-uplink-and-downlink, ...}
+*/
+
+struct Links_to_log : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "Links-to-log";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               uplink
+               ,downlink
+               ,both_uplink_and_downlink
+       } index_t;
+
+};
+
+/*
+ReportArea ::= ENUMERATED{
+       ecgi,
+       ...
+}
+*/
+
+struct ReportArea : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "ReportArea";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               ecgi
+       } index_t;
+
+};
+
+/*
+LocationReportingInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::={
+       ...
+}
+*/
+
+struct LocationReportingInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+LocationReportingInformation ::= SEQUENCE {
+       eventType               EventType,
+       reportArea              ReportArea,
+       iE-Extensions           ProtocolExtensionContainer { {LocationReportingInformation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct LocationReportingInformation : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "LocationReportingInformation";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct eventType_t : EventType
+       {
+               static constexpr const char* name() {return "eventType_t";}
+               using parent_t = EventType;
+
+       };
+       eventType_t& ref_eventType() {return eventType;}
+       eventType_t const& ref_eventType() const {return eventType;}
+       struct reportArea_t : ReportArea
+       {
+               static constexpr const char* name() {return "reportArea_t";}
+               using parent_t = ReportArea;
+
+       };
+       reportArea_t& ref_reportArea() {return reportArea;}
+       reportArea_t const& ref_reportArea() const {return reportArea;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<LocationReportingInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<LocationReportingInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(eventType);
+               v(reportArea);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eventType);
+               v(reportArea);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               eventType.clear();
+               reportArea.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       eventType_t     eventType;
+       reportArea_t    reportArea;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ReportIntervalMDT ::= ENUMERATED {ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, min1, min6, min12, min30, min60}
+*/
+
+struct ReportIntervalMDT : asn::enumerated<13, 0, false>
+{
+       static constexpr const char* name() {return "ReportIntervalMDT";}
+       using parent_t = asn::enumerated<13, 0, false>;
+       typedef enum {
+               ms120
+               ,ms240
+               ,ms480
+               ,ms640
+               ,ms1024
+               ,ms2048
+               ,ms5120
+               ,ms10240
+               ,min1
+               ,min6
+               ,min12
+               ,min30
+               ,min60
+       } index_t;
+
+};
+
+/*
+ReportAmountMDT ::= ENUMERATED{r1, r2, r4, r8, r16, r32, r64, rinfinity}
+*/
+
+struct ReportAmountMDT : asn::enumerated<8, 0, false>
+{
+       static constexpr const char* name() {return "ReportAmountMDT";}
+       using parent_t = asn::enumerated<8, 0, false>;
+       typedef enum {
+               r1
+               ,r2
+               ,r4
+               ,r8
+               ,r16
+               ,r32
+               ,r64
+               ,rinfinity
+       } index_t;
+
+};
+
+/*
+M1PeriodicReporting-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M1PeriodicReporting_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M1PeriodicReporting ::= SEQUENCE {
+       reportInterval                          ReportIntervalMDT,
+       reportAmount                            ReportAmountMDT,
+       iE-Extensions                           ProtocolExtensionContainer { {M1PeriodicReporting-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M1PeriodicReporting : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "M1PeriodicReporting";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct reportInterval_t : ReportIntervalMDT
+       {
+               static constexpr const char* name() {return "reportInterval_t";}
+               using parent_t = ReportIntervalMDT;
+
+       };
+       reportInterval_t& ref_reportInterval() {return reportInterval;}
+       reportInterval_t const& ref_reportInterval() const {return reportInterval;}
+       struct reportAmount_t : ReportAmountMDT
+       {
+               static constexpr const char* name() {return "reportAmount_t";}
+               using parent_t = ReportAmountMDT;
+
+       };
+       reportAmount_t& ref_reportAmount() {return reportAmount;}
+       reportAmount_t const& ref_reportAmount() const {return reportAmount;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M1PeriodicReporting_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M1PeriodicReporting_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(reportInterval);
+               v(reportAmount);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(reportInterval);
+               v(reportAmount);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               reportInterval.clear();
+               reportAmount.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       reportInterval_t        reportInterval;
+       reportAmount_t  reportAmount;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+M1ReportingTrigger::= ENUMERATED{
+       periodic,
+       a2eventtriggered,
+       ...,
+       a2eventtriggered-periodic
+}
+*/
+
+struct M1ReportingTrigger : asn::enumerated<3, 1, true>
+{
+       static constexpr const char* name() {return "M1ReportingTrigger";}
+       using parent_t = asn::enumerated<3, 1, true>;
+       typedef enum {
+               periodic
+               ,a2eventtriggered
+               ,a2eventtriggered_periodic
+       } index_t;
+
+};
+
+/*
+Threshold-RSRP ::= INTEGER(0..97)
+*/
+
+struct Threshold_RSRP : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 97>>;
+       static constexpr const char* name() {return "Threshold-RSRP";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+Threshold-RSRQ ::= INTEGER(0..34)
+*/
+
+struct Threshold_RSRQ : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 34>>;
+       static constexpr const char* name() {return "Threshold-RSRQ";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+MeasurementThresholdA2 ::= CHOICE {
+       threshold-RSRP                          Threshold-RSRP,
+       threshold-RSRQ                          Threshold-RSRQ,
+       ...
+}
+*/
+
+struct MeasurementThresholdA2 : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "MeasurementThresholdA2";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~MeasurementThresholdA2() {clear();}
+       struct threshold_RSRP_t : Threshold_RSRP
+       {
+               static constexpr const char* name() {return "threshold_RSRP_t";}
+               using parent_t = Threshold_RSRP;
+
+       };
+       struct threshold_RSRQ_t : Threshold_RSRQ
+       {
+               static constexpr const char* name() {return "threshold_RSRQ_t";}
+               using parent_t = Threshold_RSRQ;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<threshold_RSRP_t>(); break;
+               case 2: var.destroy<threshold_RSRQ_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<threshold_RSRP_t>());
+               case 2: set_index(2); return v(var.build<threshold_RSRQ_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<threshold_RSRP_t>());
+               case 2: return v(var.as<threshold_RSRQ_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<threshold_RSRP_t>(1);
+               v.template operator()<threshold_RSRQ_t>(2);
+
+       }
+       threshold_RSRP_t& select_threshold_RSRP() { if(get_index() != 1) { clear(); set_index(1); return var.build<threshold_RSRP_t>();} return var.as<threshold_RSRP_t>();}
+       threshold_RSRP_t const* get_threshold_RSRP() const { if(get_index() == 1) { return &var.as<threshold_RSRP_t>();} return nullptr; }
+       threshold_RSRQ_t& select_threshold_RSRQ() { if(get_index() != 2) { clear(); set_index(2); return var.build<threshold_RSRQ_t>();} return var.as<threshold_RSRQ_t>();}
+       threshold_RSRQ_t const* get_threshold_RSRQ() const { if(get_index() == 2) { return &var.as<threshold_RSRQ_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(threshold_RSRP_t)];
+               char dummy2[sizeof(threshold_RSRQ_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+M1ThresholdEventA2-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M1ThresholdEventA2_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M1ThresholdEventA2 ::= SEQUENCE {
+       measurementThreshold            MeasurementThresholdA2,
+       iE-Extensions                           ProtocolExtensionContainer { {M1ThresholdEventA2-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M1ThresholdEventA2 : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "M1ThresholdEventA2";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct measurementThreshold_t : MeasurementThresholdA2
+       {
+               static constexpr const char* name() {return "measurementThreshold_t";}
+               using parent_t = MeasurementThresholdA2;
+
+       };
+       measurementThreshold_t& ref_measurementThreshold() {return measurementThreshold;}
+       measurementThreshold_t const& ref_measurementThreshold() const {return measurementThreshold;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M1ThresholdEventA2_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M1ThresholdEventA2_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(measurementThreshold);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(measurementThreshold);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               measurementThreshold.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       measurementThreshold_t  measurementThreshold;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+M3period ::= ENUMERATED {ms100, ms1000, ms10000, ... }
+*/
+
+struct M3period : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "M3period";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               ms100
+               ,ms1000
+               ,ms10000
+       } index_t;
+
+};
+
+/*
+M3Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M3Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M3Configuration ::= SEQUENCE {
+       m3period                        M3period,
+       iE-Extensions           ProtocolExtensionContainer { {M3Configuration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M3Configuration : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "M3Configuration";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct m3period_t : M3period
+       {
+               static constexpr const char* name() {return "m3period_t";}
+               using parent_t = M3period;
+
+       };
+       m3period_t& ref_m3period() {return m3period;}
+       m3period_t const& ref_m3period() const {return m3period;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M3Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M3Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(m3period);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(m3period);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               m3period.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       m3period_t      m3period;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+M4period ::= ENUMERATED {ms1024, ms2048, ms5120, ms10240, min1, ... }
+*/
+
+struct M4period : asn::enumerated<5, 0, true>
+{
+       static constexpr const char* name() {return "M4period";}
+       using parent_t = asn::enumerated<5, 0, true>;
+       typedef enum {
+               ms1024
+               ,ms2048
+               ,ms5120
+               ,ms10240
+               ,min1
+       } index_t;
+
+};
+
+/*
+M4Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M4Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M4Configuration ::= SEQUENCE {
+       m4period                        M4period,
+       m4-links-to-log         Links-to-log,
+       iE-Extensions           ProtocolExtensionContainer { {M4Configuration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M4Configuration : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "M4Configuration";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct m4period_t : M4period
+       {
+               static constexpr const char* name() {return "m4period_t";}
+               using parent_t = M4period;
+
+       };
+       m4period_t& ref_m4period() {return m4period;}
+       m4period_t const& ref_m4period() const {return m4period;}
+       struct m4_links_to_log_t : Links_to_log
+       {
+               static constexpr const char* name() {return "m4_links_to_log_t";}
+               using parent_t = Links_to_log;
+
+       };
+       m4_links_to_log_t& ref_m4_links_to_log() {return m4_links_to_log;}
+       m4_links_to_log_t const& ref_m4_links_to_log() const {return m4_links_to_log;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M4Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M4Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(m4period);
+               v(m4_links_to_log);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(m4period);
+               v(m4_links_to_log);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               m4period.clear();
+               m4_links_to_log.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       m4period_t      m4period;
+       m4_links_to_log_t       m4_links_to_log;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+M5period ::= ENUMERATED {ms1024, ms2048, ms5120, ms10240, min1, ... }
+*/
+
+struct M5period : asn::enumerated<5, 0, true>
+{
+       static constexpr const char* name() {return "M5period";}
+       using parent_t = asn::enumerated<5, 0, true>;
+       typedef enum {
+               ms1024
+               ,ms2048
+               ,ms5120
+               ,ms10240
+               ,min1
+       } index_t;
+
+};
+
+/*
+M5Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M5Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M5Configuration ::= SEQUENCE {
+       m5period                        M5period,
+       m5-links-to-log         Links-to-log,
+       iE-Extensions           ProtocolExtensionContainer { {M5Configuration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M5Configuration : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "M5Configuration";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct m5period_t : M5period
+       {
+               static constexpr const char* name() {return "m5period_t";}
+               using parent_t = M5period;
+
+       };
+       m5period_t& ref_m5period() {return m5period;}
+       m5period_t const& ref_m5period() const {return m5period;}
+       struct m5_links_to_log_t : Links_to_log
+       {
+               static constexpr const char* name() {return "m5_links_to_log_t";}
+               using parent_t = Links_to_log;
+
+       };
+       m5_links_to_log_t& ref_m5_links_to_log() {return m5_links_to_log;}
+       m5_links_to_log_t const& ref_m5_links_to_log() const {return m5_links_to_log;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M5Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M5Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(m5period);
+               v(m5_links_to_log);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(m5period);
+               v(m5_links_to_log);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               m5period.clear();
+               m5_links_to_log.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       m5period_t      m5period;
+       m5_links_to_log_t       m5_links_to_log;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+M6report-interval ::= ENUMERATED { ms1024, ms2048, ms5120, ms10240, ... }
+*/
+
+struct M6report_interval : asn::enumerated<4, 0, true>
+{
+       static constexpr const char* name() {return "M6report-interval";}
+       using parent_t = asn::enumerated<4, 0, true>;
+       typedef enum {
+               ms1024
+               ,ms2048
+               ,ms5120
+               ,ms10240
+       } index_t;
+
+};
+
+/*
+M6delay-threshold ::= ENUMERATED { ms30, ms40, ms50, ms60, ms70, ms80, ms90, ms100, ms150, ms300, ms500, ms750, ... }
+*/
+
+struct M6delay_threshold : asn::enumerated<12, 0, true>
+{
+       static constexpr const char* name() {return "M6delay-threshold";}
+       using parent_t = asn::enumerated<12, 0, true>;
+       typedef enum {
+               ms30
+               ,ms40
+               ,ms50
+               ,ms60
+               ,ms70
+               ,ms80
+               ,ms90
+               ,ms100
+               ,ms150
+               ,ms300
+               ,ms500
+               ,ms750
+       } index_t;
+
+};
+
+/*
+M6Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M6Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M6Configuration ::= SEQUENCE {
+       m6report-interval       M6report-interval,
+       m6delay-threshold       M6delay-threshold       OPTIONAL,
+-- This IE shall be present if the M6 Links to log IE is set to “uplink” or to “both-uplink-and-downlink” --
+       m6-links-to-log         Links-to-log,
+       iE-Extensions           ProtocolExtensionContainer { {M6Configuration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M6Configuration : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "M6Configuration";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct m6report_interval_t : M6report_interval
+       {
+               static constexpr const char* name() {return "m6report_interval_t";}
+               using parent_t = M6report_interval;
+
+       };
+       m6report_interval_t& ref_m6report_interval() {return m6report_interval;}
+       m6report_interval_t const& ref_m6report_interval() const {return m6report_interval;}
+       struct m6delay_threshold_t : M6delay_threshold
+       {
+               static constexpr const char* name() {return "m6delay_threshold_t";}
+               using parent_t = M6delay_threshold;
+               static constexpr bool optional = true;
+
+       };
+       m6delay_threshold_t& set_m6delay_threshold() { m6delay_threshold.setpresent(true); return m6delay_threshold;}
+       m6delay_threshold_t const* get_m6delay_threshold() const {return m6delay_threshold.is_valid() ? &m6delay_threshold : nullptr;}
+       struct m6_links_to_log_t : Links_to_log
+       {
+               static constexpr const char* name() {return "m6_links_to_log_t";}
+               using parent_t = Links_to_log;
+
+       };
+       m6_links_to_log_t& ref_m6_links_to_log() {return m6_links_to_log;}
+       m6_links_to_log_t const& ref_m6_links_to_log() const {return m6_links_to_log;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M6Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M6Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(m6report_interval);
+               v(m6delay_threshold);
+               v(m6_links_to_log);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(m6report_interval);
+               v(m6delay_threshold);
+               v(m6_links_to_log);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               m6report_interval.clear();
+               m6delay_threshold.clear();
+               m6_links_to_log.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       m6report_interval_t     m6report_interval;
+       m6delay_threshold_t     m6delay_threshold;
+       m6_links_to_log_t       m6_links_to_log;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+M7period ::= INTEGER(1..60, ...)
+*/
+
+struct M7period : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 60>>;
+       static constexpr const char* name() {return "M7period";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+M7Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct M7Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+M7Configuration ::= SEQUENCE {
+       m7period                        M7period,
+       m7-links-to-log         Links-to-log,
+       iE-Extensions           ProtocolExtensionContainer { {M7Configuration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct M7Configuration : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "M7Configuration";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct m7period_t : M7period
+       {
+               static constexpr const char* name() {return "m7period_t";}
+               using parent_t = M7period;
+
+       };
+       m7period_t& ref_m7period() {return m7period;}
+       m7period_t const& ref_m7period() const {return m7period;}
+       struct m7_links_to_log_t : Links_to_log
+       {
+               static constexpr const char* name() {return "m7_links_to_log_t";}
+               using parent_t = Links_to_log;
+
+       };
+       m7_links_to_log_t& ref_m7_links_to_log() {return m7_links_to_log;}
+       m7_links_to_log_t const& ref_m7_links_to_log() const {return m7_links_to_log;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<M7Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<M7Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(m7period);
+               v(m7_links_to_log);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(m7period);
+               v(m7_links_to_log);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               m7period.clear();
+               m7_links_to_log.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       m7period_t      m7period;
+       m7_links_to_log_t       m7_links_to_log;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MBMS-Service-Area-Identity ::= OCTET STRING (SIZE (2))
+*/
+
+struct MBMS_Service_Area_Identity : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<2>>;
+       static constexpr const char* name() {return "MBMS-Service-Area-Identity";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+MBMS-Service-Area-Identity-List ::= SEQUENCE (SIZE(1.. maxnoofMBMSServiceAreaIdentities)) OF MBMS-Service-Area-Identity
+*/
+
+struct MBMS_Service_Area_Identity_List_elm : MBMS_Service_Area_Identity
+{
+       static constexpr const char* name() {return "MBMS_Service_Area_Identity_List_elm";}
+       using parent_t = MBMS_Service_Area_Identity;
+
+};
+struct MBMS_Service_Area_Identity_List : asn::sequenceof<MBMS_Service_Area_Identity_List_elm>
+{
+       static constexpr const char* name() {return "MBMS-Service-Area-Identity-List";}
+       using parent_t = asn::sequenceof<MBMS_Service_Area_Identity_List_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofMBMSServiceAreaIdentities >>;
+
+};
+/*
+RadioframeAllocationPeriod ::= ENUMERATED{
+       n1,
+       n2,
+       n4,
+       n8,
+       n16,
+       n32,
+       ...
+}
+*/
+
+struct RadioframeAllocationPeriod : asn::enumerated<6, 0, true>
+{
+       static constexpr const char* name() {return "RadioframeAllocationPeriod";}
+       using parent_t = asn::enumerated<6, 0, true>;
+       typedef enum {
+               n1
+               ,n2
+               ,n4
+               ,n8
+               ,n16
+               ,n32
+       } index_t;
+
+};
+
+/*
+RadioframeAllocationOffset ::= INTEGER (0..7, ...)
+*/
+
+struct RadioframeAllocationOffset : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<0, 7>>;
+       static constexpr const char* name() {return "RadioframeAllocationOffset";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+Oneframe ::= BIT STRING (SIZE (6))
+*/
+
+struct Oneframe : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<6>>;
+       static constexpr const char* name() {return "Oneframe";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+SubframeAllocation ::= CHOICE {
+       oneframe                                                Oneframe,
+       fourframes                                              Fourframes,
+       ...
+}
+*/
+
+struct SubframeAllocation : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "SubframeAllocation";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~SubframeAllocation() {clear();}
+       struct oneframe_t : Oneframe
+       {
+               static constexpr const char* name() {return "oneframe_t";}
+               using parent_t = Oneframe;
+
+       };
+       struct fourframes_t : Fourframes
+       {
+               static constexpr const char* name() {return "fourframes_t";}
+               using parent_t = Fourframes;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<oneframe_t>(); break;
+               case 2: var.destroy<fourframes_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<oneframe_t>());
+               case 2: set_index(2); return v(var.build<fourframes_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<oneframe_t>());
+               case 2: return v(var.as<fourframes_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<oneframe_t>(1);
+               v.template operator()<fourframes_t>(2);
+
+       }
+       oneframe_t& select_oneframe() { if(get_index() != 1) { clear(); set_index(1); return var.build<oneframe_t>();} return var.as<oneframe_t>();}
+       oneframe_t const* get_oneframe() const { if(get_index() == 1) { return &var.as<oneframe_t>();} return nullptr; }
+       fourframes_t& select_fourframes() { if(get_index() != 2) { clear(); set_index(2); return var.build<fourframes_t>();} return var.as<fourframes_t>();}
+       fourframes_t const* get_fourframes() const { if(get_index() == 2) { return &var.as<fourframes_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(oneframe_t)];
+               char dummy2[sizeof(fourframes_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+MBSFN-Subframe-Info-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct MBSFN_Subframe_Info_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+MBSFN-Subframe-Info    ::= SEQUENCE {
+       radioframeAllocationPeriod              RadioframeAllocationPeriod,
+       radioframeAllocationOffset              RadioframeAllocationOffset,
+       subframeAllocation                              SubframeAllocation,
+       iE-Extensions                                   ProtocolExtensionContainer { {MBSFN-Subframe-Info-ExtIEs} }     OPTIONAL,
+       ...
+}
+*/
+
+struct MBSFN_Subframe_Info : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "MBSFN-Subframe-Info";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct radioframeAllocationPeriod_t : RadioframeAllocationPeriod
+       {
+               static constexpr const char* name() {return "radioframeAllocationPeriod_t";}
+               using parent_t = RadioframeAllocationPeriod;
+
+       };
+       radioframeAllocationPeriod_t& ref_radioframeAllocationPeriod() {return radioframeAllocationPeriod;}
+       radioframeAllocationPeriod_t const& ref_radioframeAllocationPeriod() const {return radioframeAllocationPeriod;}
+       struct radioframeAllocationOffset_t : RadioframeAllocationOffset
+       {
+               static constexpr const char* name() {return "radioframeAllocationOffset_t";}
+               using parent_t = RadioframeAllocationOffset;
+
+       };
+       radioframeAllocationOffset_t& ref_radioframeAllocationOffset() {return radioframeAllocationOffset;}
+       radioframeAllocationOffset_t const& ref_radioframeAllocationOffset() const {return radioframeAllocationOffset;}
+       struct subframeAllocation_t : SubframeAllocation
+       {
+               static constexpr const char* name() {return "subframeAllocation_t";}
+               using parent_t = SubframeAllocation;
+
+       };
+       subframeAllocation_t& ref_subframeAllocation() {return subframeAllocation;}
+       subframeAllocation_t const& ref_subframeAllocation() const {return subframeAllocation;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<MBSFN_Subframe_Info_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<MBSFN_Subframe_Info_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(radioframeAllocationPeriod);
+               v(radioframeAllocationOffset);
+               v(subframeAllocation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(radioframeAllocationPeriod);
+               v(radioframeAllocationOffset);
+               v(subframeAllocation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               radioframeAllocationPeriod.clear();
+               radioframeAllocationOffset.clear();
+               subframeAllocation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       radioframeAllocationPeriod_t    radioframeAllocationPeriod;
+       radioframeAllocationOffset_t    radioframeAllocationOffset;
+       subframeAllocation_t    subframeAllocation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MBSFN-Subframe-Infolist::= SEQUENCE (SIZE(1.. maxnoofMBSFN)) OF MBSFN-Subframe-Info
+*/
+
+struct MBSFN_Subframe_Infolist_elm : MBSFN_Subframe_Info
+{
+       static constexpr const char* name() {return "MBSFN_Subframe_Infolist_elm";}
+       using parent_t = MBSFN_Subframe_Info;
+
+};
+struct MBSFN_Subframe_Infolist : asn::sequenceof<MBSFN_Subframe_Infolist_elm>
+{
+       static constexpr const char* name() {return "MBSFN-Subframe-Infolist";}
+       using parent_t = asn::sequenceof<MBSFN_Subframe_Infolist_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofMBSFN >>;
+
+};
+/*
+MDT-Activation         ::= ENUMERATED {
+       immediate-MDT-only,
+       immediate-MDT-and-Trace,
+       ...
+}
+*/
+
+struct MDT_Activation : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "MDT-Activation";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               immediate_MDT_only
+               ,immediate_MDT_and_Trace
+       } index_t;
+
+};
+
+/*
+MeasurementsToActivate::= BIT STRING (SIZE (8))
+*/
+
+struct MeasurementsToActivate : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<8>>;
+       static constexpr const char* name() {return "MeasurementsToActivate";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+MDT-Location-Info ::= BIT STRING (SIZE (8))
+*/
+
+struct MDT_Location_Info : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<8>>;
+       static constexpr const char* name() {return "MDT-Location-Info";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+MDTPLMNList ::= SEQUENCE (SIZE(1..maxnoofMDTPLMNs)) OF PLMN-Identity
+*/
+
+struct MDTPLMNList_elm : PLMN_Identity
+{
+       static constexpr const char* name() {return "MDTPLMNList_elm";}
+       using parent_t = PLMN_Identity;
+
+};
+struct MDTPLMNList : asn::sequenceof<MDTPLMNList_elm>
+{
+       static constexpr const char* name() {return "MDTPLMNList";}
+       using parent_t = asn::sequenceof<MDTPLMNList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofMDTPLMNs >>;
+
+};
+/*
+WLANMeasConfig::= ENUMERATED {setup,...}
+*/
+
+struct WLANMeasConfig : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "WLANMeasConfig";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               setup
+       } index_t;
+
+};
+
+/*
+WLANName ::= OCTET STRING (SIZE (1..32))
+*/
+
+struct WLANName : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1, 32>>;
+       static constexpr const char* name() {return "WLANName";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+WLANMeasConfigNameList ::= SEQUENCE (SIZE(1..maxnoofWLANName)) OF WLANName
+*/
+
+struct WLANMeasConfigNameList_elm : WLANName
+{
+       static constexpr const char* name() {return "WLANMeasConfigNameList_elm";}
+       using parent_t = WLANName;
+
+};
+struct WLANMeasConfigNameList : asn::sequenceof<WLANMeasConfigNameList_elm>
+{
+       static constexpr const char* name() {return "WLANMeasConfigNameList";}
+       using parent_t = asn::sequenceof<WLANMeasConfigNameList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofWLANName >>;
+
+};
+/*
+WLANMeasurementConfiguration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct WLANMeasurementConfiguration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+WLANMeasurementConfiguration ::= SEQUENCE {
+       wlanMeasConfig                          WLANMeasConfig,
+       wlanMeasConfigNameList          WLANMeasConfigNameList                          OPTIONAL,
+       wlan-rssi                                       ENUMERATED {true, ...}                          OPTIONAL,
+       wlan-rtt                                        ENUMERATED {true, ...}                          OPTIONAL,
+       iE-Extensions           ProtocolExtensionContainer { {WLANMeasurementConfiguration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct WLANMeasurementConfiguration : asn::sequence<5, 0, true, 4>
+{
+       static constexpr const char* name() {return "WLANMeasurementConfiguration";}
+       using parent_t = asn::sequence<5, 0, true, 4>;
+       struct wlanMeasConfig_t : WLANMeasConfig
+       {
+               static constexpr const char* name() {return "wlanMeasConfig_t";}
+               using parent_t = WLANMeasConfig;
+
+       };
+       wlanMeasConfig_t& ref_wlanMeasConfig() {return wlanMeasConfig;}
+       wlanMeasConfig_t const& ref_wlanMeasConfig() const {return wlanMeasConfig;}
+       struct wlanMeasConfigNameList_t : WLANMeasConfigNameList
+       {
+               static constexpr const char* name() {return "wlanMeasConfigNameList_t";}
+               using parent_t = WLANMeasConfigNameList;
+               static constexpr bool optional = true;
+
+       };
+       wlanMeasConfigNameList_t& set_wlanMeasConfigNameList() { wlanMeasConfigNameList.setpresent(true); return wlanMeasConfigNameList;}
+       wlanMeasConfigNameList_t const* get_wlanMeasConfigNameList() const {return wlanMeasConfigNameList.is_valid() ? &wlanMeasConfigNameList : nullptr;}
+       struct wlan_rssi_t : asn::enumerated<1, 0, true>
+       {
+               static constexpr const char* name() {return "wlan_rssi_t";}
+               using parent_t = asn::enumerated<1, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       True
+               } index_t;
+
+       };
+
+       wlan_rssi_t& set_wlan_rssi() { wlan_rssi.setpresent(true); return wlan_rssi;}
+       wlan_rssi_t const* get_wlan_rssi() const {return wlan_rssi.is_valid() ? &wlan_rssi : nullptr;}
+       struct wlan_rtt_t : asn::enumerated<1, 0, true>
+       {
+               static constexpr const char* name() {return "wlan_rtt_t";}
+               using parent_t = asn::enumerated<1, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       True
+               } index_t;
+
+       };
+
+       wlan_rtt_t& set_wlan_rtt() { wlan_rtt.setpresent(true); return wlan_rtt;}
+       wlan_rtt_t const* get_wlan_rtt() const {return wlan_rtt.is_valid() ? &wlan_rtt : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<WLANMeasurementConfiguration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<WLANMeasurementConfiguration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(wlanMeasConfig);
+               v(wlanMeasConfigNameList);
+               v(wlan_rssi);
+               v(wlan_rtt);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(wlanMeasConfig);
+               v(wlanMeasConfigNameList);
+               v(wlan_rssi);
+               v(wlan_rtt);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               wlanMeasConfig.clear();
+               wlanMeasConfigNameList.clear();
+               wlan_rssi.clear();
+               wlan_rtt.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       wlanMeasConfig_t        wlanMeasConfig;
+       wlanMeasConfigNameList_t        wlanMeasConfigNameList;
+       wlan_rssi_t     wlan_rssi;
+       wlan_rtt_t      wlan_rtt;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MDT-Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       {ID id-M3Configuration                                                  CRITICALITY ignore      EXTENSION M3Configuration                                                               PRESENCE conditional}|
+       {ID id-M4Configuration                                                  CRITICALITY ignore      EXTENSION M4Configuration                                                               PRESENCE conditional}|
+       {ID id-M5Configuration                                                  CRITICALITY ignore      EXTENSION M5Configuration                                                               PRESENCE conditional}|
+       {ID id-MDT-Location-Info                                                CRITICALITY ignore      EXTENSION MDT-Location-Info                                                     PRESENCE optional}|
+       {ID id-SignallingBasedMDTPLMNList                               CRITICALITY ignore      EXTENSION MDTPLMNList                                                                   PRESENCE optional}|
+       {ID id-M6Configuration                                                  CRITICALITY ignore      EXTENSION M6Configuration                                                               PRESENCE conditional}|
+       {ID id-M7Configuration                                                  CRITICALITY ignore      EXTENSION M7Configuration                                                               PRESENCE conditional}|
+       { ID id-BluetoothMeasurementConfiguration               CRITICALITY ignore      EXTENSION BluetoothMeasurementConfiguration             PRESENCE optional}|
+       { ID id-WLANMeasurementConfiguration                    CRITICALITY ignore      EXTENSION WLANMeasurementConfiguration                  PRESENCE optional},
+       ...
+}
+*/
+
+struct MDT_Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 10; }
+               void clear() {type = 0;}
+               void select_id_M3Configuration() { set(id_M3Configuration); type=1;}
+               void select_id_M4Configuration() { set(id_M4Configuration); type=2;}
+               void select_id_M5Configuration() { set(id_M5Configuration); type=3;}
+               void select_id_MDT_Location_Info() { set(id_MDT_Location_Info); type=4;}
+               void select_id_SignallingBasedMDTPLMNList() { set(id_SignallingBasedMDTPLMNList); type=5;}
+               void select_id_M6Configuration() { set(id_M6Configuration); type=6;}
+               void select_id_M7Configuration() { set(id_M7Configuration); type=7;}
+               void select_id_BluetoothMeasurementConfiguration() { set(id_BluetoothMeasurementConfiguration); type=8;}
+               void select_id_WLANMeasurementConfiguration() { set(id_WLANMeasurementConfiguration); type=9;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_M3Configuration)) { type = 1; return true; }
+                       else if(equal(id_M4Configuration)) { type = 2; return true; }
+                       else if(equal(id_M5Configuration)) { type = 3; return true; }
+                       else if(equal(id_MDT_Location_Info)) { type = 4; return true; }
+                       else if(equal(id_SignallingBasedMDTPLMNList)) { type = 5; return true; }
+                       else if(equal(id_M6Configuration)) { type = 6; return true; }
+                       else if(equal(id_M7Configuration)) { type = 7; return true; }
+                       else if(equal(id_BluetoothMeasurementConfiguration)) { type = 8; return true; }
+                       else if(equal(id_WLANMeasurementConfiguration)) { type = 9; return true; }
+                       else { type = 10; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_M3Configuration);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_M4Configuration);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(id_M5Configuration);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(id_MDT_Location_Info);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(id_SignallingBasedMDTPLMNList);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(id_M6Configuration);} return false;
+                       case 7: type = 7; if(v(ref_nested())) { return equal(id_M7Configuration);} return false;
+                       case 8: type = 8; if(v(ref_nested())) { return equal(id_BluetoothMeasurementConfiguration);} return false;
+                       case 9: type = 9; if(v(ref_nested())) { return equal(id_WLANMeasurementConfiguration);} return false;
+                       case 10: type = 10; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 10; }
+               void clear() {type = 0;}
+               void select_id_M3Configuration() { set(ignore); type=1;}
+               void select_id_M4Configuration() { set(ignore); type=2;}
+               void select_id_M5Configuration() { set(ignore); type=3;}
+               void select_id_MDT_Location_Info() { set(ignore); type=4;}
+               void select_id_SignallingBasedMDTPLMNList() { set(ignore); type=5;}
+               void select_id_M6Configuration() { set(ignore); type=6;}
+               void select_id_M7Configuration() { set(ignore); type=7;}
+               void select_id_BluetoothMeasurementConfiguration() { set(ignore); type=8;}
+               void select_id_WLANMeasurementConfiguration() { set(ignore); type=9;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else if(equal(ignore)) { type = 3; return true; }
+                       else if(equal(ignore)) { type = 4; return true; }
+                       else if(equal(ignore)) { type = 5; return true; }
+                       else if(equal(ignore)) { type = 6; return true; }
+                       else if(equal(ignore)) { type = 7; return true; }
+                       else if(equal(ignore)) { type = 8; return true; }
+                       else if(equal(ignore)) { type = 9; return true; }
+                       else { type = 10; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 7: type = 7; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 8: type = 8; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 9: type = 9; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 10: type = 10; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               M3Configuration& select_id_M3Configuration() { return set<M3Configuration>(1); }
+               M3Configuration const* get_id_M3Configuration() const { return get<M3Configuration>(1); }
+               M4Configuration& select_id_M4Configuration() { return set<M4Configuration>(2); }
+               M4Configuration const* get_id_M4Configuration() const { return get<M4Configuration>(2); }
+               M5Configuration& select_id_M5Configuration() { return set<M5Configuration>(3); }
+               M5Configuration const* get_id_M5Configuration() const { return get<M5Configuration>(3); }
+               MDT_Location_Info& select_id_MDT_Location_Info() { return set<MDT_Location_Info>(4); }
+               MDT_Location_Info const* get_id_MDT_Location_Info() const { return get<MDT_Location_Info>(4); }
+               MDTPLMNList& select_id_SignallingBasedMDTPLMNList() { return set<MDTPLMNList>(5); }
+               MDTPLMNList const* get_id_SignallingBasedMDTPLMNList() const { return get<MDTPLMNList>(5); }
+               M6Configuration& select_id_M6Configuration() { return set<M6Configuration>(6); }
+               M6Configuration const* get_id_M6Configuration() const { return get<M6Configuration>(6); }
+               M7Configuration& select_id_M7Configuration() { return set<M7Configuration>(7); }
+               M7Configuration const* get_id_M7Configuration() const { return get<M7Configuration>(7); }
+               BluetoothMeasurementConfiguration& select_id_BluetoothMeasurementConfiguration() { return set<BluetoothMeasurementConfiguration>(8); }
+               BluetoothMeasurementConfiguration const* get_id_BluetoothMeasurementConfiguration() const { return get<BluetoothMeasurementConfiguration>(8); }
+               WLANMeasurementConfiguration& select_id_WLANMeasurementConfiguration() { return set<WLANMeasurementConfiguration>(9); }
+               WLANMeasurementConfiguration const* get_id_WLANMeasurementConfiguration() const { return get<WLANMeasurementConfiguration>(9); }
+               bool is_unknown() const { return type == 10; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<M3Configuration>(); break;
+                       case 2: var.destroy<M4Configuration>(); break;
+                       case 3: var.destroy<M5Configuration>(); break;
+                       case 4: var.destroy<MDT_Location_Info>(); break;
+                       case 5: var.destroy<MDTPLMNList>(); break;
+                       case 6: var.destroy<M6Configuration>(); break;
+                       case 7: var.destroy<M7Configuration>(); break;
+                       case 8: var.destroy<BluetoothMeasurementConfiguration>(); break;
+                       case 9: var.destroy<WLANMeasurementConfiguration>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<M3Configuration>(1);
+                       v.template operator()<M4Configuration>(2);
+                       v.template operator()<M5Configuration>(3);
+                       v.template operator()<MDT_Location_Info>(4);
+                       v.template operator()<MDTPLMNList>(5);
+                       v.template operator()<M6Configuration>(6);
+                       v.template operator()<M7Configuration>(7);
+                       v.template operator()<BluetoothMeasurementConfiguration>(8);
+                       v.template operator()<WLANMeasurementConfiguration>(9);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_M3Configuration()); return true;
+                       case 2: v(select_id_M4Configuration()); return true;
+                       case 3: v(select_id_M5Configuration()); return true;
+                       case 4: v(select_id_MDT_Location_Info()); return true;
+                       case 5: v(select_id_SignallingBasedMDTPLMNList()); return true;
+                       case 6: v(select_id_M6Configuration()); return true;
+                       case 7: v(select_id_M7Configuration()); return true;
+                       case 8: v(select_id_BluetoothMeasurementConfiguration()); return true;
+                       case 9: v(select_id_WLANMeasurementConfiguration()); return true;
+                       case 10: if(type != 10) {clear(); asn::base::set();} type = 10; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<M3Configuration>()); return true;
+                       case 2: v(var.as<M4Configuration>()); return true;
+                       case 3: v(var.as<M5Configuration>()); return true;
+                       case 4: v(var.as<MDT_Location_Info>()); return true;
+                       case 5: v(var.as<MDTPLMNList>()); return true;
+                       case 6: v(var.as<M6Configuration>()); return true;
+                       case 7: v(var.as<M7Configuration>()); return true;
+                       case 8: v(var.as<BluetoothMeasurementConfiguration>()); return true;
+                       case 9: v(var.as<WLANMeasurementConfiguration>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(BluetoothMeasurementConfiguration)];
+                       char dummy2[sizeof(M3Configuration)];
+                       char dummy3[sizeof(M4Configuration)];
+                       char dummy4[sizeof(M5Configuration)];
+                       char dummy5[sizeof(M6Configuration)];
+                       char dummy6[sizeof(M7Configuration)];
+                       char dummy7[sizeof(MDTPLMNList)];
+                       char dummy8[sizeof(MDT_Location_Info)];
+                       char dummy9[sizeof(WLANMeasurementConfiguration)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 10; }
+               void clear() {type = 0;}
+               void select_id_M3Configuration() { set(conditional); type=1;}
+               void select_id_M4Configuration() { set(conditional); type=2;}
+               void select_id_M5Configuration() { set(conditional); type=3;}
+               void select_id_MDT_Location_Info() { set(optional); type=4;}
+               void select_id_SignallingBasedMDTPLMNList() { set(optional); type=5;}
+               void select_id_M6Configuration() { set(conditional); type=6;}
+               void select_id_M7Configuration() { set(conditional); type=7;}
+               void select_id_BluetoothMeasurementConfiguration() { set(optional); type=8;}
+               void select_id_WLANMeasurementConfiguration() { set(optional); type=9;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(conditional)) { type = 1; return true; }
+                       else if(equal(conditional)) { type = 2; return true; }
+                       else if(equal(conditional)) { type = 3; return true; }
+                       else if(equal(optional)) { type = 4; return true; }
+                       else if(equal(optional)) { type = 5; return true; }
+                       else if(equal(conditional)) { type = 6; return true; }
+                       else if(equal(conditional)) { type = 7; return true; }
+                       else if(equal(optional)) { type = 8; return true; }
+                       else if(equal(optional)) { type = 9; return true; }
+                       else { type = 10; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(conditional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(conditional);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(conditional);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(conditional);} return false;
+                       case 7: type = 7; if(v(ref_nested())) { return equal(conditional);} return false;
+                       case 8: type = 8; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 9: type = 9; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 10: type = 10; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+MDT-Configuration ::= SEQUENCE {
+       mdt-Activation                          MDT-Activation,
+       areaScopeOfMDT                          AreaScopeOfMDT,
+       measurementsToActivate          MeasurementsToActivate,
+       m1reportingTrigger                      M1ReportingTrigger,
+       m1thresholdeventA2                      M1ThresholdEventA2                      OPTIONAL,
+-- Included in case of event-triggered, or event-triggered periodic reporting for measurement M1
+       m1periodicReporting                     M1PeriodicReporting                     OPTIONAL,
+-- Included in case of periodic, or event-triggered periodic reporting for measurement M1
+       iE-Extensions                           ProtocolExtensionContainer { {MDT-Configuration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct MDT_Configuration : asn::sequence<7, 0, true, 3>
+{
+       static constexpr const char* name() {return "MDT-Configuration";}
+       using parent_t = asn::sequence<7, 0, true, 3>;
+       struct mdt_Activation_t : MDT_Activation
+       {
+               static constexpr const char* name() {return "mdt_Activation_t";}
+               using parent_t = MDT_Activation;
+
+       };
+       mdt_Activation_t& ref_mdt_Activation() {return mdt_Activation;}
+       mdt_Activation_t const& ref_mdt_Activation() const {return mdt_Activation;}
+       struct areaScopeOfMDT_t : AreaScopeOfMDT
+       {
+               static constexpr const char* name() {return "areaScopeOfMDT_t";}
+               using parent_t = AreaScopeOfMDT;
+
+       };
+       areaScopeOfMDT_t& ref_areaScopeOfMDT() {return areaScopeOfMDT;}
+       areaScopeOfMDT_t const& ref_areaScopeOfMDT() const {return areaScopeOfMDT;}
+       struct measurementsToActivate_t : MeasurementsToActivate
+       {
+               static constexpr const char* name() {return "measurementsToActivate_t";}
+               using parent_t = MeasurementsToActivate;
+
+       };
+       measurementsToActivate_t& ref_measurementsToActivate() {return measurementsToActivate;}
+       measurementsToActivate_t const& ref_measurementsToActivate() const {return measurementsToActivate;}
+       struct m1reportingTrigger_t : M1ReportingTrigger
+       {
+               static constexpr const char* name() {return "m1reportingTrigger_t";}
+               using parent_t = M1ReportingTrigger;
+
+       };
+       m1reportingTrigger_t& ref_m1reportingTrigger() {return m1reportingTrigger;}
+       m1reportingTrigger_t const& ref_m1reportingTrigger() const {return m1reportingTrigger;}
+       struct m1thresholdeventA2_t : M1ThresholdEventA2
+       {
+               static constexpr const char* name() {return "m1thresholdeventA2_t";}
+               using parent_t = M1ThresholdEventA2;
+               static constexpr bool optional = true;
+
+       };
+       m1thresholdeventA2_t& set_m1thresholdeventA2() { m1thresholdeventA2.setpresent(true); return m1thresholdeventA2;}
+       m1thresholdeventA2_t const* get_m1thresholdeventA2() const {return m1thresholdeventA2.is_valid() ? &m1thresholdeventA2 : nullptr;}
+       struct m1periodicReporting_t : M1PeriodicReporting
+       {
+               static constexpr const char* name() {return "m1periodicReporting_t";}
+               using parent_t = M1PeriodicReporting;
+               static constexpr bool optional = true;
+
+       };
+       m1periodicReporting_t& set_m1periodicReporting() { m1periodicReporting.setpresent(true); return m1periodicReporting;}
+       m1periodicReporting_t const* get_m1periodicReporting() const {return m1periodicReporting.is_valid() ? &m1periodicReporting : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<MDT_Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<MDT_Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(mdt_Activation);
+               v(areaScopeOfMDT);
+               v(measurementsToActivate);
+               v(m1reportingTrigger);
+               v(m1thresholdeventA2);
+               v(m1periodicReporting);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(mdt_Activation);
+               v(areaScopeOfMDT);
+               v(measurementsToActivate);
+               v(m1reportingTrigger);
+               v(m1thresholdeventA2);
+               v(m1periodicReporting);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               mdt_Activation.clear();
+               areaScopeOfMDT.clear();
+               measurementsToActivate.clear();
+               m1reportingTrigger.clear();
+               m1thresholdeventA2.clear();
+               m1periodicReporting.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       mdt_Activation_t        mdt_Activation;
+       areaScopeOfMDT_t        areaScopeOfMDT;
+       measurementsToActivate_t        measurementsToActivate;
+       m1reportingTrigger_t    m1reportingTrigger;
+       m1thresholdeventA2_t    m1thresholdeventA2;
+       m1periodicReporting_t   m1periodicReporting;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MakeBeforeBreakIndicator::= ENUMERATED {true, ...}
+*/
+
+struct MakeBeforeBreakIndicator : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "MakeBeforeBreakIndicator";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               True
+       } index_t;
+
+};
+
+/*
+ManagementBasedMDTallowed ::= ENUMERATED {allowed, ...}
+*/
+
+struct ManagementBasedMDTallowed : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "ManagementBasedMDTallowed";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               allowed
+       } index_t;
+
+};
+
+/*
+Masked-IMEISV ::= BIT STRING (SIZE (64))
+*/
+
+struct Masked_IMEISV : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<64>>;
+       static constexpr const char* name() {return "Masked-IMEISV";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+MeNBCoordinationAssistanceInformation ::= ENUMERATED{
+       coordination-not-required,
+       ...
+}
+*/
+
+struct MeNBCoordinationAssistanceInformation : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "MeNBCoordinationAssistanceInformation";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               coordination_not_required
+       } index_t;
+
+};
+
+/*
+NRCellIdentifier ::= BIT STRING (SIZE (36))
+*/
+
+struct NRCellIdentifier : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<36>>;
+       static constexpr const char* name() {return "NRCellIdentifier";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+NRCGI-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct NRCGI_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+NRCGI ::= SEQUENCE {
+       pLMN-Identity                           PLMN-Identity,
+       nRcellIdentifier                                NRCellIdentifier,
+       iE-Extensions                           ProtocolExtensionContainer { {NRCGI-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct NRCGI : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "NRCGI";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct nRcellIdentifier_t : NRCellIdentifier
+       {
+               static constexpr const char* name() {return "nRcellIdentifier_t";}
+               using parent_t = NRCellIdentifier;
+
+       };
+       nRcellIdentifier_t& ref_nRcellIdentifier() {return nRcellIdentifier;}
+       nRcellIdentifier_t const& ref_nRcellIdentifier() const {return nRcellIdentifier;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<NRCGI_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<NRCGI_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(nRcellIdentifier);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(nRcellIdentifier);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               nRcellIdentifier.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       nRcellIdentifier_t      nRcellIdentifier;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MeNBResourceCoordinationInformationExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-NRCGI                                                                   CRITICALITY ignore      EXTENSION NRCGI                                                                                         PRESENCE optional}|
+       { ID id-MeNBCoordinationAssistanceInformation           CRITICALITY reject      EXTENSION MeNBCoordinationAssistanceInformation PRESENCE optional},
+       ...
+}
+*/
+
+struct MeNBResourceCoordinationInformationExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_NRCGI() { set(id_NRCGI); type=1;}
+               void select_id_MeNBCoordinationAssistanceInformation() { set(id_MeNBCoordinationAssistanceInformation); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_NRCGI)) { type = 1; return true; }
+                       else if(equal(id_MeNBCoordinationAssistanceInformation)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_NRCGI);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_MeNBCoordinationAssistanceInformation);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_NRCGI() { set(ignore); type=1;}
+               void select_id_MeNBCoordinationAssistanceInformation() { set(reject); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(reject)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               NRCGI& select_id_NRCGI() { return set<NRCGI>(1); }
+               NRCGI const* get_id_NRCGI() const { return get<NRCGI>(1); }
+               MeNBCoordinationAssistanceInformation& select_id_MeNBCoordinationAssistanceInformation() { return set<MeNBCoordinationAssistanceInformation>(2); }
+               MeNBCoordinationAssistanceInformation const* get_id_MeNBCoordinationAssistanceInformation() const { return get<MeNBCoordinationAssistanceInformation>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<NRCGI>(); break;
+                       case 2: var.destroy<MeNBCoordinationAssistanceInformation>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<NRCGI>(1);
+                       v.template operator()<MeNBCoordinationAssistanceInformation>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_NRCGI()); return true;
+                       case 2: v(select_id_MeNBCoordinationAssistanceInformation()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<NRCGI>()); return true;
+                       case 2: v(var.as<MeNBCoordinationAssistanceInformation>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(MeNBCoordinationAssistanceInformation)];
+                       char dummy2[sizeof(NRCGI)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_NRCGI() { set(optional); type=1;}
+               void select_id_MeNBCoordinationAssistanceInformation() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+MeNBResourceCoordinationInformation ::= SEQUENCE {
+       eUTRA-Cell-ID                                   ECGI,
+       uLCoordinationInformation               BIT STRING (SIZE(6..4400, ...)),
+       dLCoordinationInformation               BIT STRING (SIZE(6..4400, ...))         OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { {MeNBResourceCoordinationInformationExtIEs} }               OPTIONAL,
+       ...
+}
+*/
+
+struct MeNBResourceCoordinationInformation : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "MeNBResourceCoordinationInformation";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct eUTRA_Cell_ID_t : ECGI
+       {
+               static constexpr const char* name() {return "eUTRA_Cell_ID_t";}
+               using parent_t = ECGI;
+
+       };
+       eUTRA_Cell_ID_t& ref_eUTRA_Cell_ID() {return eUTRA_Cell_ID;}
+       eUTRA_Cell_ID_t const& ref_eUTRA_Cell_ID() const {return eUTRA_Cell_ID;}
+       struct uLCoordinationInformation_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 4400>>;
+               static constexpr const char* name() {return "uLCoordinationInformation_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       uLCoordinationInformation_t& ref_uLCoordinationInformation() {return uLCoordinationInformation;}
+       uLCoordinationInformation_t const& ref_uLCoordinationInformation() const {return uLCoordinationInformation;}
+       struct dLCoordinationInformation_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 4400>>;
+               static constexpr const char* name() {return "dLCoordinationInformation_t";}
+               using parent_t = asn::bstring<>;
+               static constexpr bool optional = true;
+
+       };
+
+       dLCoordinationInformation_t& set_dLCoordinationInformation() { dLCoordinationInformation.setpresent(true); return dLCoordinationInformation;}
+       dLCoordinationInformation_t const* get_dLCoordinationInformation() const {return dLCoordinationInformation.is_valid() ? &dLCoordinationInformation : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<MeNBResourceCoordinationInformationExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<MeNBResourceCoordinationInformationExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(eUTRA_Cell_ID);
+               v(uLCoordinationInformation);
+               v(dLCoordinationInformation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eUTRA_Cell_ID);
+               v(uLCoordinationInformation);
+               v(dLCoordinationInformation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               eUTRA_Cell_ID.clear();
+               uLCoordinationInformation.clear();
+               dLCoordinationInformation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       eUTRA_Cell_ID_t eUTRA_Cell_ID;
+       uLCoordinationInformation_t     uLCoordinationInformation;
+       dLCoordinationInformation_t     dLCoordinationInformation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+MeNBtoSeNBContainer ::= OCTET STRING
+*/
+
+struct MeNBtoSeNBContainer : asn::ostring<>
+{
+       static constexpr const char* name() {return "MeNBtoSeNBContainer";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+MeNBtoSgNBContainer ::= OCTET STRING
+*/
+
+struct MeNBtoSgNBContainer : asn::ostring<>
+{
+       static constexpr const char* name() {return "MeNBtoSgNBContainer";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+Measurement-ID ::= INTEGER (1..4095, ...)
+*/
+
+struct Measurement_ID : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 4095>>;
+       static constexpr const char* name() {return "Measurement-ID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+MobilityParametersInformation ::= SEQUENCE {
+       handoverTriggerChange                   INTEGER (-20..20),
+       ...
+}
+*/
+
+struct MobilityParametersInformation : asn::sequence<1, 0, true, 0>
+{
+       static constexpr const char* name() {return "MobilityParametersInformation";}
+       using parent_t = asn::sequence<1, 0, true, 0>;
+       struct handoverTriggerChange_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<-20, 20>>;
+               static constexpr const char* name() {return "handoverTriggerChange_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       handoverTriggerChange_t& ref_handoverTriggerChange() {return handoverTriggerChange;}
+       handoverTriggerChange_t const& ref_handoverTriggerChange() const {return handoverTriggerChange;}
+       template<typename V> void decode(V& v)
+       {
+               v(handoverTriggerChange);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(handoverTriggerChange);
+
+       };
+       void clear()
+       {
+               handoverTriggerChange.clear();
+
+       };
+       private:
+       handoverTriggerChange_t handoverTriggerChange;
+
+};
+/*
+MobilityParametersModificationRange ::= SEQUENCE {
+       handoverTriggerChangeLowerLimit         INTEGER (-20..20),
+       handoverTriggerChangeUpperLimit         INTEGER (-20..20),
+       ...
+}
+*/
+
+struct MobilityParametersModificationRange : asn::sequence<2, 0, true, 0>
+{
+       static constexpr const char* name() {return "MobilityParametersModificationRange";}
+       using parent_t = asn::sequence<2, 0, true, 0>;
+       struct handoverTriggerChangeLowerLimit_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<-20, 20>>;
+               static constexpr const char* name() {return "handoverTriggerChangeLowerLimit_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       handoverTriggerChangeLowerLimit_t& ref_handoverTriggerChangeLowerLimit() {return handoverTriggerChangeLowerLimit;}
+       handoverTriggerChangeLowerLimit_t const& ref_handoverTriggerChangeLowerLimit() const {return handoverTriggerChangeLowerLimit;}
+       struct handoverTriggerChangeUpperLimit_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<-20, 20>>;
+               static constexpr const char* name() {return "handoverTriggerChangeUpperLimit_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       handoverTriggerChangeUpperLimit_t& ref_handoverTriggerChangeUpperLimit() {return handoverTriggerChangeUpperLimit;}
+       handoverTriggerChangeUpperLimit_t const& ref_handoverTriggerChangeUpperLimit() const {return handoverTriggerChangeUpperLimit;}
+       template<typename V> void decode(V& v)
+       {
+               v(handoverTriggerChangeLowerLimit);
+               v(handoverTriggerChangeUpperLimit);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(handoverTriggerChangeLowerLimit);
+               v(handoverTriggerChangeUpperLimit);
+
+       };
+       void clear()
+       {
+               handoverTriggerChangeLowerLimit.clear();
+               handoverTriggerChangeUpperLimit.clear();
+
+       };
+       private:
+       handoverTriggerChangeLowerLimit_t       handoverTriggerChangeLowerLimit;
+       handoverTriggerChangeUpperLimit_t       handoverTriggerChangeUpperLimit;
+
+};
+/*
+MultibandInfoList ::= SEQUENCE (SIZE(1..maxnoofBands)) OF BandInfo
+*/
+
+struct MultibandInfoList_elm : BandInfo
+{
+       static constexpr const char* name() {return "MultibandInfoList_elm";}
+       using parent_t = BandInfo;
+
+};
+struct MultibandInfoList : asn::sequenceof<MultibandInfoList_elm>
+{
+       static constexpr const char* name() {return "MultibandInfoList";}
+       using parent_t = asn::sequenceof<MultibandInfoList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofBands >>;
+
+};
+/*
+NRSCS ::= ENUMERATED { scs15, scs30, scs60, scs120, ...}
+*/
+
+struct NRSCS : asn::enumerated<4, 0, true>
+{
+       static constexpr const char* name() {return "NRSCS";}
+       using parent_t = asn::enumerated<4, 0, true>;
+       typedef enum {
+               scs15
+               ,scs30
+               ,scs60
+               ,scs120
+       } index_t;
+
+};
+
+/*
+NRNRB ::= ENUMERATED { nrb11, nrb18, nrb24, nrb25, nrb31, nrb32, nrb38, nrb51, nrb52, nrb65, nrb66, nrb78, nrb79, nrb93, nrb106, nrb107, nrb121, nrb132, nrb133, nrb135, nrb160, nrb162, nrb189, nrb216, nrb217, nrb245, nrb264, nrb270, nrb273, ...}
+*/
+
+struct NRNRB : asn::enumerated<29, 0, true>
+{
+       static constexpr const char* name() {return "NRNRB";}
+       using parent_t = asn::enumerated<29, 0, true>;
+       typedef enum {
+               nrb11
+               ,nrb18
+               ,nrb24
+               ,nrb25
+               ,nrb31
+               ,nrb32
+               ,nrb38
+               ,nrb51
+               ,nrb52
+               ,nrb65
+               ,nrb66
+               ,nrb78
+               ,nrb79
+               ,nrb93
+               ,nrb106
+               ,nrb107
+               ,nrb121
+               ,nrb132
+               ,nrb133
+               ,nrb135
+               ,nrb160
+               ,nrb162
+               ,nrb189
+               ,nrb216
+               ,nrb217
+               ,nrb245
+               ,nrb264
+               ,nrb270
+               ,nrb273
+       } index_t;
+
+};
+
+/*
+NR-TxBW-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct NR_TxBW_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+NR-TxBW        ::= SEQUENCE {
+       nRSCS   NRSCS,
+       nRNRB   NRNRB,
+       iE-Extensions                           ProtocolExtensionContainer { {NR-TxBW-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct NR_TxBW : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "NR-TxBW";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct nRSCS_t : NRSCS
+       {
+               static constexpr const char* name() {return "nRSCS_t";}
+               using parent_t = NRSCS;
+
+       };
+       nRSCS_t& ref_nRSCS() {return nRSCS;}
+       nRSCS_t const& ref_nRSCS() const {return nRSCS;}
+       struct nRNRB_t : NRNRB
+       {
+               static constexpr const char* name() {return "nRNRB_t";}
+               using parent_t = NRNRB;
+
+       };
+       nRNRB_t& ref_nRNRB() {return nRNRB;}
+       nRNRB_t const& ref_nRNRB() const {return nRNRB;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<NR_TxBW_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<NR_TxBW_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(nRSCS);
+               v(nRNRB);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(nRSCS);
+               v(nRNRB);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               nRSCS.clear();
+               nRNRB.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       nRSCS_t nRSCS;
+       nRNRB_t nRNRB;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SULInformation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SULInformation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SULInformation ::= SEQUENCE {
+       sUL-ARFCN                               INTEGER (0.. 3279165),
+       sUL-TxBW                                NR-TxBW,
+       iE-Extensions                   ProtocolExtensionContainer { {SULInformation-ExtIEs} }          OPTIONAL,
+       ...
+}
+*/
+
+struct SULInformation : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "SULInformation";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct sUL_ARFCN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 3279165>>;
+               static constexpr const char* name() {return "sUL_ARFCN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       sUL_ARFCN_t& ref_sUL_ARFCN() {return sUL_ARFCN;}
+       sUL_ARFCN_t const& ref_sUL_ARFCN() const {return sUL_ARFCN;}
+       struct sUL_TxBW_t : NR_TxBW
+       {
+               static constexpr const char* name() {return "sUL_TxBW_t";}
+               using parent_t = NR_TxBW;
+
+       };
+       sUL_TxBW_t& ref_sUL_TxBW() {return sUL_TxBW;}
+       sUL_TxBW_t const& ref_sUL_TxBW() const {return sUL_TxBW;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SULInformation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SULInformation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(sUL_ARFCN);
+               v(sUL_TxBW);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(sUL_ARFCN);
+               v(sUL_TxBW);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               sUL_ARFCN.clear();
+               sUL_TxBW.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       sUL_ARFCN_t     sUL_ARFCN;
+       sUL_TxBW_t      sUL_TxBW;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+NRFreqInfo-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct NRFreqInfo_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+NRFreqInfo ::= SEQUENCE{
+       nRARFCN                 INTEGER (0.. 3279165),
+       freqBandListNr  SEQUENCE (SIZE(1..maxnoofNrCellBands)) OF FreqBandNrItem,
+       sULInformation  SULInformation          OPTIONAL,
+       iE-Extensions   ProtocolExtensionContainer { {NRFreqInfo-ExtIEs} } OPTIONAL,
+
+       ...
+}
+*/
+
+struct NRFreqInfo : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "NRFreqInfo";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct nRARFCN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 3279165>>;
+               static constexpr const char* name() {return "nRARFCN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       nRARFCN_t& ref_nRARFCN() {return nRARFCN;}
+       nRARFCN_t const& ref_nRARFCN() const {return nRARFCN;}
+       struct freqBandListNr_t_elm : FreqBandNrItem
+       {
+               static constexpr const char* name() {return "freqBandListNr_t_elm";}
+               using parent_t = FreqBandNrItem;
+
+       };
+       struct freqBandListNr_t : asn::sequenceof<freqBandListNr_t_elm>
+       {
+               static constexpr const char* name() {return "freqBandListNr_t";}
+               using parent_t = asn::sequenceof<freqBandListNr_t_elm>;
+               using constraint_t = asn::constraints<false,asn::span<1,  maxnoofNrCellBands >>;
+
+       };
+       freqBandListNr_t& ref_freqBandListNr() {return freqBandListNr;}
+       freqBandListNr_t const& ref_freqBandListNr() const {return freqBandListNr;}
+       struct sULInformation_t : SULInformation
+       {
+               static constexpr const char* name() {return "sULInformation_t";}
+               using parent_t = SULInformation;
+               static constexpr bool optional = true;
+
+       };
+       sULInformation_t& set_sULInformation() { sULInformation.setpresent(true); return sULInformation;}
+       sULInformation_t const* get_sULInformation() const {return sULInformation.is_valid() ? &sULInformation : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<NRFreqInfo_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<NRFreqInfo_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(nRARFCN);
+               v(freqBandListNr);
+               v(sULInformation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(nRARFCN);
+               v(freqBandListNr);
+               v(sULInformation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               nRARFCN.clear();
+               freqBandListNr.clear();
+               sULInformation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       nRARFCN_t       nRARFCN;
+       freqBandListNr_t        freqBandListNr;
+       sULInformation_t        sULInformation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+NRPCI ::= INTEGER (0..1007)
+*/
+
+struct NRPCI : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 1007>>;
+       static constexpr const char* name() {return "NRPCI";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+NRencryptionAlgorithms ::= BIT STRING (SIZE (16,...))
+*/
+
+struct NRencryptionAlgorithms : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::one<16>>;
+       static constexpr const char* name() {return "NRencryptionAlgorithms";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+NRintegrityProtectionAlgorithms ::= BIT STRING (SIZE (16,...))
+*/
+
+struct NRintegrityProtectionAlgorithms : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::one<16>>;
+       static constexpr const char* name() {return "NRintegrityProtectionAlgorithms";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+NRUESecurityCapabilities-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct NRUESecurityCapabilities_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+NRUESecurityCapabilities ::= SEQUENCE {
+       nRencryptionAlgorithms                          NRencryptionAlgorithms,
+       nRintegrityProtectionAlgorithms         NRintegrityProtectionAlgorithms,
+       iE-Extensions                                           ProtocolExtensionContainer { {NRUESecurityCapabilities-ExtIEs} }        OPTIONAL,
+...
+}
+*/
+
+struct NRUESecurityCapabilities : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "NRUESecurityCapabilities";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct nRencryptionAlgorithms_t : NRencryptionAlgorithms
+       {
+               static constexpr const char* name() {return "nRencryptionAlgorithms_t";}
+               using parent_t = NRencryptionAlgorithms;
+
+       };
+       nRencryptionAlgorithms_t& ref_nRencryptionAlgorithms() {return nRencryptionAlgorithms;}
+       nRencryptionAlgorithms_t const& ref_nRencryptionAlgorithms() const {return nRencryptionAlgorithms;}
+       struct nRintegrityProtectionAlgorithms_t : NRintegrityProtectionAlgorithms
+       {
+               static constexpr const char* name() {return "nRintegrityProtectionAlgorithms_t";}
+               using parent_t = NRintegrityProtectionAlgorithms;
+
+       };
+       nRintegrityProtectionAlgorithms_t& ref_nRintegrityProtectionAlgorithms() {return nRintegrityProtectionAlgorithms;}
+       nRintegrityProtectionAlgorithms_t const& ref_nRintegrityProtectionAlgorithms() const {return nRintegrityProtectionAlgorithms;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<NRUESecurityCapabilities_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<NRUESecurityCapabilities_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(nRencryptionAlgorithms);
+               v(nRintegrityProtectionAlgorithms);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(nRencryptionAlgorithms);
+               v(nRintegrityProtectionAlgorithms);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               nRencryptionAlgorithms.clear();
+               nRintegrityProtectionAlgorithms.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       nRencryptionAlgorithms_t        nRencryptionAlgorithms;
+       nRintegrityProtectionAlgorithms_t       nRintegrityProtectionAlgorithms;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+PCI ::= INTEGER (0..503, ...)
+*/
+
+struct PCI : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<0, 503>>;
+       static constexpr const char* name() {return "PCI";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+Neighbour-Information-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-NeighbourTAC            CRITICALITY ignore      EXTENSION TAC                           PRESENCE optional}|
+       { ID id-eARFCNExtension         CRITICALITY reject      EXTENSION EARFCNExtension       PRESENCE optional},
+       ...
+}
+*/
+
+struct Neighbour_Information_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_NeighbourTAC() { set(id_NeighbourTAC); type=1;}
+               void select_id_eARFCNExtension() { set(id_eARFCNExtension); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_NeighbourTAC)) { type = 1; return true; }
+                       else if(equal(id_eARFCNExtension)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_NeighbourTAC);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_eARFCNExtension);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_NeighbourTAC() { set(ignore); type=1;}
+               void select_id_eARFCNExtension() { set(reject); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(reject)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               TAC& select_id_NeighbourTAC() { return set<TAC>(1); }
+               TAC const* get_id_NeighbourTAC() const { return get<TAC>(1); }
+               EARFCNExtension& select_id_eARFCNExtension() { return set<EARFCNExtension>(2); }
+               EARFCNExtension const* get_id_eARFCNExtension() const { return get<EARFCNExtension>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<TAC>(); break;
+                       case 2: var.destroy<EARFCNExtension>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<TAC>(1);
+                       v.template operator()<EARFCNExtension>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_NeighbourTAC()); return true;
+                       case 2: v(select_id_eARFCNExtension()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<TAC>()); return true;
+                       case 2: v(var.as<EARFCNExtension>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(EARFCNExtension)];
+                       char dummy2[sizeof(TAC)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_NeighbourTAC() { set(optional); type=1;}
+               void select_id_eARFCNExtension() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+Neighbour-Information ::= SEQUENCE (SIZE (0..maxnoofNeighbours)) OF SEQUENCE {
+       eCGI                                            ECGI,
+       pCI                                                     PCI,
+       eARFCN                                          EARFCN,
+       iE-Extensions                           ProtocolExtensionContainer { {Neighbour-Information-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct Neighbour_Information_elm : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "Neighbour_Information_elm";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct eCGI_t : ECGI
+       {
+               static constexpr const char* name() {return "eCGI_t";}
+               using parent_t = ECGI;
+
+       };
+       eCGI_t& ref_eCGI() {return eCGI;}
+       eCGI_t const& ref_eCGI() const {return eCGI;}
+       struct pCI_t : PCI
+       {
+               static constexpr const char* name() {return "pCI_t";}
+               using parent_t = PCI;
+
+       };
+       pCI_t& ref_pCI() {return pCI;}
+       pCI_t const& ref_pCI() const {return pCI;}
+       struct eARFCN_t : EARFCN
+       {
+               static constexpr const char* name() {return "eARFCN_t";}
+               using parent_t = EARFCN;
+
+       };
+       eARFCN_t& ref_eARFCN() {return eARFCN;}
+       eARFCN_t const& ref_eARFCN() const {return eARFCN;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<Neighbour_Information_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<Neighbour_Information_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(eCGI);
+               v(pCI);
+               v(eARFCN);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eCGI);
+               v(pCI);
+               v(eARFCN);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               eCGI.clear();
+               pCI.clear();
+               eARFCN.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       eCGI_t  eCGI;
+       pCI_t   pCI;
+       eARFCN_t        eARFCN;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct Neighbour_Information : asn::sequenceof<Neighbour_Information_elm>
+{
+       static constexpr const char* name() {return "Neighbour-Information";}
+       using parent_t = asn::sequenceof<Neighbour_Information_elm>;
+       using constraint_t = asn::constraints<false,asn::span<0,  maxnoofNeighbours >>;
+
+};
+/*
+NewDRBIDrequest::= ENUMERATED {true, ...}
+*/
+
+struct NewDRBIDrequest : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "NewDRBIDrequest";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               True
+       } index_t;
+
+};
+
+/*
+Number-of-Antennaports ::= ENUMERATED {
+               an1,
+               an2,
+               an4,
+               ...
+}
+*/
+
+struct Number_of_Antennaports : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "Number-of-Antennaports";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               an1
+               ,an2
+               ,an4
+       } index_t;
+
+};
+
+/*
+PDCPChangeIndication ::= ENUMERATED {s-KgNB-update-required, pDCP-data-recovery-required,...}
+*/
+
+struct PDCPChangeIndication : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "PDCPChangeIndication";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               s_KgNB_update_required
+               ,pDCP_data_recovery_required
+       } index_t;
+
+};
+
+/*
+PDCPSnLength   ::=     ENUMERATED {twelve-bits,eighteen-bits,...}
+*/
+
+struct PDCPSnLength : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "PDCPSnLength";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               twelve_bits
+               ,eighteen_bits
+       } index_t;
+
+};
+
+/*
+PRACH-Configuration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct PRACH_Configuration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+PRACH-Configuration ::= SEQUENCE {
+       rootSequenceIndex                                               INTEGER (0..837),
+       zeroCorrelationIndex                                    INTEGER (0..15),
+       highSpeedFlag                                                   BOOLEAN,
+       prach-FreqOffset                                                INTEGER (0..94),
+       prach-ConfigIndex                                               INTEGER (0..63)         OPTIONAL, -- present for TDD --
+       iE-Extensions                                                   ProtocolExtensionContainer { {PRACH-Configuration-ExtIEs} }     OPTIONAL,
+       ...
+}
+*/
+
+struct PRACH_Configuration : asn::sequence<6, 0, true, 2>
+{
+       static constexpr const char* name() {return "PRACH-Configuration";}
+       using parent_t = asn::sequence<6, 0, true, 2>;
+       struct rootSequenceIndex_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 837>>;
+               static constexpr const char* name() {return "rootSequenceIndex_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       rootSequenceIndex_t& ref_rootSequenceIndex() {return rootSequenceIndex;}
+       rootSequenceIndex_t const& ref_rootSequenceIndex() const {return rootSequenceIndex;}
+       struct zeroCorrelationIndex_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 15>>;
+               static constexpr const char* name() {return "zeroCorrelationIndex_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       zeroCorrelationIndex_t& ref_zeroCorrelationIndex() {return zeroCorrelationIndex;}
+       zeroCorrelationIndex_t const& ref_zeroCorrelationIndex() const {return zeroCorrelationIndex;}
+       struct highSpeedFlag_t : asn::boolean
+       {
+               static constexpr const char* name() {return "highSpeedFlag_t";}
+               using parent_t = asn::boolean;
+
+       };
+       highSpeedFlag_t& ref_highSpeedFlag() {return highSpeedFlag;}
+       highSpeedFlag_t const& ref_highSpeedFlag() const {return highSpeedFlag;}
+       struct prach_FreqOffset_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 94>>;
+               static constexpr const char* name() {return "prach_FreqOffset_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       prach_FreqOffset_t& ref_prach_FreqOffset() {return prach_FreqOffset;}
+       prach_FreqOffset_t const& ref_prach_FreqOffset() const {return prach_FreqOffset;}
+       struct prach_ConfigIndex_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 63>>;
+               static constexpr const char* name() {return "prach_ConfigIndex_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       prach_ConfigIndex_t& set_prach_ConfigIndex() { prach_ConfigIndex.setpresent(true); return prach_ConfigIndex;}
+       prach_ConfigIndex_t const* get_prach_ConfigIndex() const {return prach_ConfigIndex.is_valid() ? &prach_ConfigIndex : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<PRACH_Configuration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<PRACH_Configuration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(rootSequenceIndex);
+               v(zeroCorrelationIndex);
+               v(highSpeedFlag);
+               v(prach_FreqOffset);
+               v(prach_ConfigIndex);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(rootSequenceIndex);
+               v(zeroCorrelationIndex);
+               v(highSpeedFlag);
+               v(prach_FreqOffset);
+               v(prach_ConfigIndex);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               rootSequenceIndex.clear();
+               zeroCorrelationIndex.clear();
+               highSpeedFlag.clear();
+               prach_FreqOffset.clear();
+               prach_ConfigIndex.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       rootSequenceIndex_t     rootSequenceIndex;
+       zeroCorrelationIndex_t  zeroCorrelationIndex;
+       highSpeedFlag_t highSpeedFlag;
+       prach_FreqOffset_t      prach_FreqOffset;
+       prach_ConfigIndex_t     prach_ConfigIndex;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+PedestrianUE ::= ENUMERATED {
+       authorized,
+       not-authorized,
+       ...
+}
+*/
+
+struct PedestrianUE : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "PedestrianUE";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               authorized
+               ,not_authorized
+       } index_t;
+
+};
+
+/*
+Port-Number ::= OCTET STRING (SIZE (2))
+*/
+
+struct Port_Number : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<2>>;
+       static constexpr const char* name() {return "Port-Number";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+ProSeDirectDiscovery ::= ENUMERATED {
+       authorized,
+       not-authorized,
+       ...
+}
+*/
+
+struct ProSeDirectDiscovery : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "ProSeDirectDiscovery";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               authorized
+               ,not_authorized
+       } index_t;
+
+};
+
+/*
+ProSeDirectCommunication ::= ENUMERATED {
+       authorized,
+       not-authorized,
+       ...
+}
+*/
+
+struct ProSeDirectCommunication : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "ProSeDirectCommunication";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               authorized
+               ,not_authorized
+       } index_t;
+
+};
+
+/*
+ProSeUEtoNetworkRelaying ::= ENUMERATED {
+       authorized,
+       not-authorized,
+       ...
+}
+*/
+
+struct ProSeUEtoNetworkRelaying : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "ProSeUEtoNetworkRelaying";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               authorized
+               ,not_authorized
+       } index_t;
+
+};
+
+/*
+ProSeAuthorized-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-ProSeUEtoNetworkRelaying        CRITICALITY ignore      EXTENSION ProSeUEtoNetworkRelaying              PRESENCE optional},
+       ...
+}
+*/
+
+struct ProSeAuthorized_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_ProSeUEtoNetworkRelaying() { set(id_ProSeUEtoNetworkRelaying); type=1;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_ProSeUEtoNetworkRelaying)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_ProSeUEtoNetworkRelaying);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_ProSeUEtoNetworkRelaying() { set(ignore); type=1;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               ProSeUEtoNetworkRelaying& select_id_ProSeUEtoNetworkRelaying() { return set<ProSeUEtoNetworkRelaying>(1); }
+               ProSeUEtoNetworkRelaying const* get_id_ProSeUEtoNetworkRelaying() const { return get<ProSeUEtoNetworkRelaying>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<ProSeUEtoNetworkRelaying>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<ProSeUEtoNetworkRelaying>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_ProSeUEtoNetworkRelaying()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<ProSeUEtoNetworkRelaying>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(ProSeUEtoNetworkRelaying)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_ProSeUEtoNetworkRelaying() { set(optional); type=1;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ProSeAuthorized ::= SEQUENCE {
+       proSeDirectDiscovery            ProSeDirectDiscovery                    OPTIONAL,
+       proSeDirectCommunication        ProSeDirectCommunication                OPTIONAL,
+       iE-Extensions                           ProtocolExtensionContainer { {ProSeAuthorized-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ProSeAuthorized : asn::sequence<3, 0, true, 3>
+{
+       static constexpr const char* name() {return "ProSeAuthorized";}
+       using parent_t = asn::sequence<3, 0, true, 3>;
+       struct proSeDirectDiscovery_t : ProSeDirectDiscovery
+       {
+               static constexpr const char* name() {return "proSeDirectDiscovery_t";}
+               using parent_t = ProSeDirectDiscovery;
+               static constexpr bool optional = true;
+
+       };
+       proSeDirectDiscovery_t& set_proSeDirectDiscovery() { proSeDirectDiscovery.setpresent(true); return proSeDirectDiscovery;}
+       proSeDirectDiscovery_t const* get_proSeDirectDiscovery() const {return proSeDirectDiscovery.is_valid() ? &proSeDirectDiscovery : nullptr;}
+       struct proSeDirectCommunication_t : ProSeDirectCommunication
+       {
+               static constexpr const char* name() {return "proSeDirectCommunication_t";}
+               using parent_t = ProSeDirectCommunication;
+               static constexpr bool optional = true;
+
+       };
+       proSeDirectCommunication_t& set_proSeDirectCommunication() { proSeDirectCommunication.setpresent(true); return proSeDirectCommunication;}
+       proSeDirectCommunication_t const* get_proSeDirectCommunication() const {return proSeDirectCommunication.is_valid() ? &proSeDirectCommunication : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ProSeAuthorized_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ProSeAuthorized_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(proSeDirectDiscovery);
+               v(proSeDirectCommunication);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(proSeDirectDiscovery);
+               v(proSeDirectCommunication);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               proSeDirectDiscovery.clear();
+               proSeDirectCommunication.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       proSeDirectDiscovery_t  proSeDirectDiscovery;
+       proSeDirectCommunication_t      proSeDirectCommunication;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ResourceType ::= ENUMERATED {
+       downlinknonCRS,
+       cRS,
+       uplink,
+       ...
+}
+*/
+
+struct ResourceType : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "ResourceType";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               downlinknonCRS
+               ,cRS
+               ,uplink
+       } index_t;
+
+};
+
+/*
+ProtectedFootprintTimePattern-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ProtectedFootprintTimePattern_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ProtectedFootprintTimePattern ::= SEQUENCE {
+       protectedFootprintTimePeriodicity                               INTEGER (1..320, ...),
+       protectedFootprintStartTime                                             INTEGER (1..20, ...),
+       iE-Extensions                                                                   ProtocolExtensionContainer { {ProtectedFootprintTimePattern-ExtIEs} }   OPTIONAL,
+       ...
+}
+*/
+
+struct ProtectedFootprintTimePattern : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "ProtectedFootprintTimePattern";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct protectedFootprintTimePeriodicity_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 320>>;
+               static constexpr const char* name() {return "protectedFootprintTimePeriodicity_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       protectedFootprintTimePeriodicity_t& ref_protectedFootprintTimePeriodicity() {return protectedFootprintTimePeriodicity;}
+       protectedFootprintTimePeriodicity_t const& ref_protectedFootprintTimePeriodicity() const {return protectedFootprintTimePeriodicity;}
+       struct protectedFootprintStartTime_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 20>>;
+               static constexpr const char* name() {return "protectedFootprintStartTime_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       protectedFootprintStartTime_t& ref_protectedFootprintStartTime() {return protectedFootprintStartTime;}
+       protectedFootprintStartTime_t const& ref_protectedFootprintStartTime() const {return protectedFootprintStartTime;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ProtectedFootprintTimePattern_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ProtectedFootprintTimePattern_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(protectedFootprintTimePeriodicity);
+               v(protectedFootprintStartTime);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(protectedFootprintTimePeriodicity);
+               v(protectedFootprintStartTime);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               protectedFootprintTimePeriodicity.clear();
+               protectedFootprintStartTime.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       protectedFootprintTimePeriodicity_t     protectedFootprintTimePeriodicity;
+       protectedFootprintStartTime_t   protectedFootprintStartTime;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ProtectedResourceList-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ProtectedResourceList_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ProtectedResourceList-Item ::= SEQUENCE {
+       resourceType                                    ResourceType,
+       intraPRBProtectedResourceFootprint              BIT STRING (SIZE(84, ...)),
+       protectedFootprintFrequencyPattern              BIT STRING (SIZE(6..110, ...)),
+       protectedFootprintTimePattern                   ProtectedFootprintTimePattern,
+       iE-Extensions                                                   ProtocolExtensionContainer { {ProtectedResourceList-Item-ExtIEs} }      OPTIONAL,
+       ...
+}
+*/
+
+struct ProtectedResourceList_Item : asn::sequence<5, 0, true, 1>
+{
+       static constexpr const char* name() {return "ProtectedResourceList-Item";}
+       using parent_t = asn::sequence<5, 0, true, 1>;
+       struct resourceType_t : ResourceType
+       {
+               static constexpr const char* name() {return "resourceType_t";}
+               using parent_t = ResourceType;
+
+       };
+       resourceType_t& ref_resourceType() {return resourceType;}
+       resourceType_t const& ref_resourceType() const {return resourceType;}
+       struct intraPRBProtectedResourceFootprint_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::one<84>>;
+               static constexpr const char* name() {return "intraPRBProtectedResourceFootprint_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       intraPRBProtectedResourceFootprint_t& ref_intraPRBProtectedResourceFootprint() {return intraPRBProtectedResourceFootprint;}
+       intraPRBProtectedResourceFootprint_t const& ref_intraPRBProtectedResourceFootprint() const {return intraPRBProtectedResourceFootprint;}
+       struct protectedFootprintFrequencyPattern_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 110>>;
+               static constexpr const char* name() {return "protectedFootprintFrequencyPattern_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       protectedFootprintFrequencyPattern_t& ref_protectedFootprintFrequencyPattern() {return protectedFootprintFrequencyPattern;}
+       protectedFootprintFrequencyPattern_t const& ref_protectedFootprintFrequencyPattern() const {return protectedFootprintFrequencyPattern;}
+       struct protectedFootprintTimePattern_t : ProtectedFootprintTimePattern
+       {
+               static constexpr const char* name() {return "protectedFootprintTimePattern_t";}
+               using parent_t = ProtectedFootprintTimePattern;
+
+       };
+       protectedFootprintTimePattern_t& ref_protectedFootprintTimePattern() {return protectedFootprintTimePattern;}
+       protectedFootprintTimePattern_t const& ref_protectedFootprintTimePattern() const {return protectedFootprintTimePattern;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ProtectedResourceList_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ProtectedResourceList_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(resourceType);
+               v(intraPRBProtectedResourceFootprint);
+               v(protectedFootprintFrequencyPattern);
+               v(protectedFootprintTimePattern);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(resourceType);
+               v(intraPRBProtectedResourceFootprint);
+               v(protectedFootprintFrequencyPattern);
+               v(protectedFootprintTimePattern);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               resourceType.clear();
+               intraPRBProtectedResourceFootprint.clear();
+               protectedFootprintFrequencyPattern.clear();
+               protectedFootprintTimePattern.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       resourceType_t  resourceType;
+       intraPRBProtectedResourceFootprint_t    intraPRBProtectedResourceFootprint;
+       protectedFootprintFrequencyPattern_t    protectedFootprintFrequencyPattern;
+       protectedFootprintTimePattern_t protectedFootprintTimePattern;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ProtectedResourceList ::= SEQUENCE (SIZE(1.. maxnoofProtectedResourcePatterns)) OF ProtectedResourceList-Item
+*/
+
+struct ProtectedResourceList_elm : ProtectedResourceList_Item
+{
+       static constexpr const char* name() {return "ProtectedResourceList_elm";}
+       using parent_t = ProtectedResourceList_Item;
+
+};
+struct ProtectedResourceList : asn::sequenceof<ProtectedResourceList_elm>
+{
+       static constexpr const char* name() {return "ProtectedResourceList";}
+       using parent_t = asn::sequenceof<ProtectedResourceList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofProtectedResourcePatterns >>;
+
+};
+/*
+ProtectedEUTRAResourceIndication-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+} -- Rapporteur: missing extension --
+*/
+
+struct ProtectedEUTRAResourceIndication_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ProtectedEUTRAResourceIndication::= SEQUENCE {
+       activationSFN                                                   INTEGER (0..1023),
+       protectedResourceList                                   ProtectedResourceList,
+       mBSFNControlRegionLength                                INTEGER (0..3) OPTIONAL,
+       pDCCHRegionLength                                               INTEGER (1..3) OPTIONAL,
+       iE-Extensions                                                   ProtocolExtensionContainer { {ProtectedEUTRAResourceIndication-ExtIEs} }        OPTIONAL,
+       ...
+}
+*/
+
+struct ProtectedEUTRAResourceIndication : asn::sequence<5, 0, true, 3>
+{
+       static constexpr const char* name() {return "ProtectedEUTRAResourceIndication";}
+       using parent_t = asn::sequence<5, 0, true, 3>;
+       struct activationSFN_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 1023>>;
+               static constexpr const char* name() {return "activationSFN_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       activationSFN_t& ref_activationSFN() {return activationSFN;}
+       activationSFN_t const& ref_activationSFN() const {return activationSFN;}
+       struct protectedResourceList_t : ProtectedResourceList
+       {
+               static constexpr const char* name() {return "protectedResourceList_t";}
+               using parent_t = ProtectedResourceList;
+
+       };
+       protectedResourceList_t& ref_protectedResourceList() {return protectedResourceList;}
+       protectedResourceList_t const& ref_protectedResourceList() const {return protectedResourceList;}
+       struct mBSFNControlRegionLength_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<0, 3>>;
+               static constexpr const char* name() {return "mBSFNControlRegionLength_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       mBSFNControlRegionLength_t& set_mBSFNControlRegionLength() { mBSFNControlRegionLength.setpresent(true); return mBSFNControlRegionLength;}
+       mBSFNControlRegionLength_t const* get_mBSFNControlRegionLength() const {return mBSFNControlRegionLength.is_valid() ? &mBSFNControlRegionLength : nullptr;}
+       struct pDCCHRegionLength_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<1, 3>>;
+               static constexpr const char* name() {return "pDCCHRegionLength_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       pDCCHRegionLength_t& set_pDCCHRegionLength() { pDCCHRegionLength.setpresent(true); return pDCCHRegionLength;}
+       pDCCHRegionLength_t const* get_pDCCHRegionLength() const {return pDCCHRegionLength.is_valid() ? &pDCCHRegionLength : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ProtectedEUTRAResourceIndication_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ProtectedEUTRAResourceIndication_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(activationSFN);
+               v(protectedResourceList);
+               v(mBSFNControlRegionLength);
+               v(pDCCHRegionLength);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(activationSFN);
+               v(protectedResourceList);
+               v(mBSFNControlRegionLength);
+               v(pDCCHRegionLength);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               activationSFN.clear();
+               protectedResourceList.clear();
+               mBSFNControlRegionLength.clear();
+               pDCCHRegionLength.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       activationSFN_t activationSFN;
+       protectedResourceList_t protectedResourceList;
+       mBSFNControlRegionLength_t      mBSFNControlRegionLength;
+       pDCCHRegionLength_t     pDCCHRegionLength;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+Reestablishment-Indication ::= ENUMERATED {
+       reestablished,
+       ...
+}
+*/
+
+struct Reestablishment_Indication : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "Reestablishment-Indication";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               reestablished
+       } index_t;
+
+};
+
+/*
+RLC-Status-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct RLC_Status_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+RLC-Status ::= SEQUENCE {
+       reestablishment-Indication      Reestablishment-Indication,
+       iE-Extensions                           ProtocolExtensionContainer { {RLC-Status-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct RLC_Status : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "RLC-Status";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct reestablishment_Indication_t : Reestablishment_Indication
+       {
+               static constexpr const char* name() {return "reestablishment_Indication_t";}
+               using parent_t = Reestablishment_Indication;
+
+       };
+       reestablishment_Indication_t& ref_reestablishment_Indication() {return reestablishment_Indication;}
+       reestablishment_Indication_t const& ref_reestablishment_Indication() const {return reestablishment_Indication;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<RLC_Status_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<RLC_Status_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(reestablishment_Indication);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(reestablishment_Indication);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               reestablishment_Indication.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       reestablishment_Indication_t    reestablishment_Indication;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+RLCMode ::= ENUMERATED {
+       rlc-am,
+       rlc-um-bidirectional,
+       rlc-um-unidirectional-ul,
+       rlc-um-unidirectional-dl,
+       ...
+}
+*/
+
+struct RLCMode : asn::enumerated<4, 0, true>
+{
+       static constexpr const char* name() {return "RLCMode";}
+       using parent_t = asn::enumerated<4, 0, true>;
+       typedef enum {
+               rlc_am
+               ,rlc_um_bidirectional
+               ,rlc_um_unidirectional_ul
+               ,rlc_um_unidirectional_dl
+       } index_t;
+
+};
+
+/*
+RRC-Config-Ind ::= ENUMERATED {
+       full-config,
+       delta-config,
+       ...
+}
+*/
+
+struct RRC_Config_Ind : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "RRC-Config-Ind";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               full_config
+               ,delta_config
+       } index_t;
+
+};
+
+/*
+RRC-Context ::= OCTET STRING
+*/
+
+struct RRC_Context : asn::ostring<>
+{
+       static constexpr const char* name() {return "RRC-Context";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+RRCConnReestabIndicator ::= ENUMERATED {
+       reconfigurationFailure, handoverFailure, otherFailure, ...
+}
+*/
+
+struct RRCConnReestabIndicator : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "RRCConnReestabIndicator";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               reconfigurationFailure
+               ,handoverFailure
+               ,otherFailure
+       } index_t;
+
+};
+
+/*
+RRCConnSetupIndicator::= ENUMERATED {
+       rrcConnSetup,
+       ...
+}
+*/
+
+struct RRCConnSetupIndicator : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "RRCConnSetupIndicator";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               rrcConnSetup
+       } index_t;
+
+};
+
+/*
+RRCContainer ::= OCTET STRING
+*/
+
+struct RRCContainer : asn::ostring<>
+{
+       static constexpr const char* name() {return "RRCContainer";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+RSRPMeasurementResult-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct RSRPMeasurementResult_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+RSRPMeasurementResult ::= SEQUENCE (SIZE(1..maxCellReport)) OF
+       SEQUENCE {
+               rSRPCellID                                              ECGI,
+               rSRPMeasured                                    INTEGER (0..97, ...),
+               iE-Extensions                                   ProtocolExtensionContainer { {RSRPMeasurementResult-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct RSRPMeasurementResult_elm : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "RSRPMeasurementResult_elm";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct rSRPCellID_t : ECGI
+       {
+               static constexpr const char* name() {return "rSRPCellID_t";}
+               using parent_t = ECGI;
+
+       };
+       rSRPCellID_t& ref_rSRPCellID() {return rSRPCellID;}
+       rSRPCellID_t const& ref_rSRPCellID() const {return rSRPCellID;}
+       struct rSRPMeasured_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 97>>;
+               static constexpr const char* name() {return "rSRPMeasured_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       rSRPMeasured_t& ref_rSRPMeasured() {return rSRPMeasured;}
+       rSRPMeasured_t const& ref_rSRPMeasured() const {return rSRPMeasured;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<RSRPMeasurementResult_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<RSRPMeasurementResult_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(rSRPCellID);
+               v(rSRPMeasured);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(rSRPCellID);
+               v(rSRPMeasured);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               rSRPCellID.clear();
+               rSRPMeasured.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       rSRPCellID_t    rSRPCellID;
+       rSRPMeasured_t  rSRPMeasured;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct RSRPMeasurementResult : asn::sequenceof<RSRPMeasurementResult_elm>
+{
+       static constexpr const char* name() {return "RSRPMeasurementResult";}
+       using parent_t = asn::sequenceof<RSRPMeasurementResult_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCellReport >>;
+
+};
+/*
+RSRPMRList-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-UEID    CRITICALITY ignore      EXTENSION UEID          PRESENCE optional},
+       ...
+}
+*/
+
+struct RSRPMRList_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_UEID() { set(id_UEID); type=1;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_UEID)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_UEID);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_UEID() { set(ignore); type=1;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               UEID& select_id_UEID() { return set<UEID>(1); }
+               UEID const* get_id_UEID() const { return get<UEID>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<UEID>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<UEID>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_UEID()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<UEID>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(UEID)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_UEID() { set(optional); type=1;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+RSRPMRList ::= SEQUENCE (SIZE(1..maxUEReport)) OF
+       SEQUENCE {
+               rSRPMeasurementResult                   RSRPMeasurementResult,
+               iE-Extensions                                   ProtocolExtensionContainer { {RSRPMRList-ExtIEs} } OPTIONAL,
+               ...
+       }
+*/
+
+struct RSRPMRList_elm : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "RSRPMRList_elm";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct rSRPMeasurementResult_t : RSRPMeasurementResult
+       {
+               static constexpr const char* name() {return "rSRPMeasurementResult_t";}
+               using parent_t = RSRPMeasurementResult;
+
+       };
+       rSRPMeasurementResult_t& ref_rSRPMeasurementResult() {return rSRPMeasurementResult;}
+       rSRPMeasurementResult_t const& ref_rSRPMeasurementResult() const {return rSRPMeasurementResult;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<RSRPMRList_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<RSRPMRList_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(rSRPMeasurementResult);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(rSRPMeasurementResult);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               rSRPMeasurementResult.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       rSRPMeasurementResult_t rSRPMeasurementResult;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct RSRPMRList : asn::sequenceof<RSRPMRList_elm>
+{
+       static constexpr const char* name() {return "RSRPMRList";}
+       using parent_t = asn::sequenceof<RSRPMRList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxUEReport >>;
+
+};
+/*
+UL-GBR-PRB-usage::= INTEGER (0..100)
+*/
+
+struct UL_GBR_PRB_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "UL-GBR-PRB-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UL-non-GBR-PRB-usage::= INTEGER (0..100)
+*/
+
+struct UL_non_GBR_PRB_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "UL-non-GBR-PRB-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UL-Total-PRB-usage::= INTEGER (0..100)
+*/
+
+struct UL_Total_PRB_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "UL-Total-PRB-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UL-scheduling-PDCCH-CCE-usage::= INTEGER (0..100)
+*/
+
+struct UL_scheduling_PDCCH_CCE_usage : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 100>>;
+       static constexpr const char* name() {return "UL-scheduling-PDCCH-CCE-usage";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+RadioResourceStatus-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       {ID id-DL-scheduling-PDCCH-CCE-usage            CRITICALITY ignore      EXTENSION DL-scheduling-PDCCH-CCE-usage         PRESENCE optional}|
+
+       {ID id-UL-scheduling-PDCCH-CCE-usage            CRITICALITY ignore      EXTENSION UL-scheduling-PDCCH-CCE-usage         PRESENCE optional},
+       ...
+}
+*/
+
+struct RadioResourceStatus_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_DL_scheduling_PDCCH_CCE_usage() { set(id_DL_scheduling_PDCCH_CCE_usage); type=1;}
+               void select_id_UL_scheduling_PDCCH_CCE_usage() { set(id_UL_scheduling_PDCCH_CCE_usage); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_DL_scheduling_PDCCH_CCE_usage)) { type = 1; return true; }
+                       else if(equal(id_UL_scheduling_PDCCH_CCE_usage)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_DL_scheduling_PDCCH_CCE_usage);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_UL_scheduling_PDCCH_CCE_usage);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_DL_scheduling_PDCCH_CCE_usage() { set(ignore); type=1;}
+               void select_id_UL_scheduling_PDCCH_CCE_usage() { set(ignore); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               DL_scheduling_PDCCH_CCE_usage& select_id_DL_scheduling_PDCCH_CCE_usage() { return set<DL_scheduling_PDCCH_CCE_usage>(1); }
+               DL_scheduling_PDCCH_CCE_usage const* get_id_DL_scheduling_PDCCH_CCE_usage() const { return get<DL_scheduling_PDCCH_CCE_usage>(1); }
+               UL_scheduling_PDCCH_CCE_usage& select_id_UL_scheduling_PDCCH_CCE_usage() { return set<UL_scheduling_PDCCH_CCE_usage>(2); }
+               UL_scheduling_PDCCH_CCE_usage const* get_id_UL_scheduling_PDCCH_CCE_usage() const { return get<UL_scheduling_PDCCH_CCE_usage>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<DL_scheduling_PDCCH_CCE_usage>(); break;
+                       case 2: var.destroy<UL_scheduling_PDCCH_CCE_usage>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<DL_scheduling_PDCCH_CCE_usage>(1);
+                       v.template operator()<UL_scheduling_PDCCH_CCE_usage>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_DL_scheduling_PDCCH_CCE_usage()); return true;
+                       case 2: v(select_id_UL_scheduling_PDCCH_CCE_usage()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<DL_scheduling_PDCCH_CCE_usage>()); return true;
+                       case 2: v(var.as<UL_scheduling_PDCCH_CCE_usage>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(DL_scheduling_PDCCH_CCE_usage)];
+                       char dummy2[sizeof(UL_scheduling_PDCCH_CCE_usage)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_DL_scheduling_PDCCH_CCE_usage() { set(optional); type=1;}
+               void select_id_UL_scheduling_PDCCH_CCE_usage() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+RadioResourceStatus    ::= SEQUENCE {
+       dL-GBR-PRB-usage                                                        DL-GBR-PRB-usage,
+       uL-GBR-PRB-usage                                                        UL-GBR-PRB-usage,
+       dL-non-GBR-PRB-usage                                            DL-non-GBR-PRB-usage,
+       uL-non-GBR-PRB-usage                                            UL-non-GBR-PRB-usage,
+       dL-Total-PRB-usage                                                      DL-Total-PRB-usage,
+       uL-Total-PRB-usage                                                      UL-Total-PRB-usage,
+       iE-Extensions                                                           ProtocolExtensionContainer { {RadioResourceStatus-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct RadioResourceStatus : asn::sequence<7, 0, true, 1>
+{
+       static constexpr const char* name() {return "RadioResourceStatus";}
+       using parent_t = asn::sequence<7, 0, true, 1>;
+       struct dL_GBR_PRB_usage_t : DL_GBR_PRB_usage
+       {
+               static constexpr const char* name() {return "dL_GBR_PRB_usage_t";}
+               using parent_t = DL_GBR_PRB_usage;
+
+       };
+       dL_GBR_PRB_usage_t& ref_dL_GBR_PRB_usage() {return dL_GBR_PRB_usage;}
+       dL_GBR_PRB_usage_t const& ref_dL_GBR_PRB_usage() const {return dL_GBR_PRB_usage;}
+       struct uL_GBR_PRB_usage_t : UL_GBR_PRB_usage
+       {
+               static constexpr const char* name() {return "uL_GBR_PRB_usage_t";}
+               using parent_t = UL_GBR_PRB_usage;
+
+       };
+       uL_GBR_PRB_usage_t& ref_uL_GBR_PRB_usage() {return uL_GBR_PRB_usage;}
+       uL_GBR_PRB_usage_t const& ref_uL_GBR_PRB_usage() const {return uL_GBR_PRB_usage;}
+       struct dL_non_GBR_PRB_usage_t : DL_non_GBR_PRB_usage
+       {
+               static constexpr const char* name() {return "dL_non_GBR_PRB_usage_t";}
+               using parent_t = DL_non_GBR_PRB_usage;
+
+       };
+       dL_non_GBR_PRB_usage_t& ref_dL_non_GBR_PRB_usage() {return dL_non_GBR_PRB_usage;}
+       dL_non_GBR_PRB_usage_t const& ref_dL_non_GBR_PRB_usage() const {return dL_non_GBR_PRB_usage;}
+       struct uL_non_GBR_PRB_usage_t : UL_non_GBR_PRB_usage
+       {
+               static constexpr const char* name() {return "uL_non_GBR_PRB_usage_t";}
+               using parent_t = UL_non_GBR_PRB_usage;
+
+       };
+       uL_non_GBR_PRB_usage_t& ref_uL_non_GBR_PRB_usage() {return uL_non_GBR_PRB_usage;}
+       uL_non_GBR_PRB_usage_t const& ref_uL_non_GBR_PRB_usage() const {return uL_non_GBR_PRB_usage;}
+       struct dL_Total_PRB_usage_t : DL_Total_PRB_usage
+       {
+               static constexpr const char* name() {return "dL_Total_PRB_usage_t";}
+               using parent_t = DL_Total_PRB_usage;
+
+       };
+       dL_Total_PRB_usage_t& ref_dL_Total_PRB_usage() {return dL_Total_PRB_usage;}
+       dL_Total_PRB_usage_t const& ref_dL_Total_PRB_usage() const {return dL_Total_PRB_usage;}
+       struct uL_Total_PRB_usage_t : UL_Total_PRB_usage
+       {
+               static constexpr const char* name() {return "uL_Total_PRB_usage_t";}
+               using parent_t = UL_Total_PRB_usage;
+
+       };
+       uL_Total_PRB_usage_t& ref_uL_Total_PRB_usage() {return uL_Total_PRB_usage;}
+       uL_Total_PRB_usage_t const& ref_uL_Total_PRB_usage() const {return uL_Total_PRB_usage;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<RadioResourceStatus_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<RadioResourceStatus_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(dL_GBR_PRB_usage);
+               v(uL_GBR_PRB_usage);
+               v(dL_non_GBR_PRB_usage);
+               v(uL_non_GBR_PRB_usage);
+               v(dL_Total_PRB_usage);
+               v(uL_Total_PRB_usage);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(dL_GBR_PRB_usage);
+               v(uL_GBR_PRB_usage);
+               v(dL_non_GBR_PRB_usage);
+               v(uL_non_GBR_PRB_usage);
+               v(dL_Total_PRB_usage);
+               v(uL_Total_PRB_usage);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               dL_GBR_PRB_usage.clear();
+               uL_GBR_PRB_usage.clear();
+               dL_non_GBR_PRB_usage.clear();
+               uL_non_GBR_PRB_usage.clear();
+               dL_Total_PRB_usage.clear();
+               uL_Total_PRB_usage.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       dL_GBR_PRB_usage_t      dL_GBR_PRB_usage;
+       uL_GBR_PRB_usage_t      uL_GBR_PRB_usage;
+       dL_non_GBR_PRB_usage_t  dL_non_GBR_PRB_usage;
+       uL_non_GBR_PRB_usage_t  uL_non_GBR_PRB_usage;
+       dL_Total_PRB_usage_t    dL_Total_PRB_usage;
+       uL_Total_PRB_usage_t    uL_Total_PRB_usage;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ReceiveStatusOfULPDCPSDUsExtended ::= BIT STRING (SIZE(1..16384))
+*/
+
+struct ReceiveStatusOfULPDCPSDUsExtended : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1, 16384>>;
+       static constexpr const char* name() {return "ReceiveStatusOfULPDCPSDUsExtended";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+ReceiveStatusOfULPDCPSDUsPDCP-SNlength18 ::= BIT STRING (SIZE(1..131072))
+*/
+
+struct ReceiveStatusOfULPDCPSDUsPDCP_SNlength18 : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1, 131072>>;
+       static constexpr const char* name() {return "ReceiveStatusOfULPDCPSDUsPDCP-SNlength18";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+ReceiveStatusofULPDCPSDUs ::= BIT STRING (SIZE(4096))
+*/
+
+struct ReceiveStatusofULPDCPSDUs : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<4096>>;
+       static constexpr const char* name() {return "ReceiveStatusofULPDCPSDUs";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+Registration-Request   ::= ENUMERATED {
+       start,
+       stop,
+       ...,
+       partial-stop,
+       add
+}
+*/
+
+struct Registration_Request : asn::enumerated<4, 2, true>
+{
+       static constexpr const char* name() {return "Registration-Request";}
+       using parent_t = asn::enumerated<4, 2, true>;
+       typedef enum {
+               start
+               ,stop
+               ,partial_stop
+               ,add
+       } index_t;
+
+};
+
+/*
+RelativeNarrowbandTxPower-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-enhancedRNTP    CRITICALITY ignore      EXTENSION EnhancedRNTP          PRESENCE optional },
+       ...
+}
+*/
+
+struct RelativeNarrowbandTxPower_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_enhancedRNTP() { set(id_enhancedRNTP); type=1;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_enhancedRNTP)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_enhancedRNTP);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_enhancedRNTP() { set(ignore); type=1;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               EnhancedRNTP& select_id_enhancedRNTP() { return set<EnhancedRNTP>(1); }
+               EnhancedRNTP const* get_id_enhancedRNTP() const { return get<EnhancedRNTP>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<EnhancedRNTP>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<EnhancedRNTP>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_enhancedRNTP()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<EnhancedRNTP>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(EnhancedRNTP)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_enhancedRNTP() { set(optional); type=1;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+RelativeNarrowbandTxPower ::= SEQUENCE {
+
+       rNTP-PerPRB                                                     BIT STRING (SIZE(6..110, ...)),
+       rNTP-Threshold                                          RNTP-Threshold,
+       numberOfCellSpecificAntennaPorts        ENUMERATED {one, two, four, ...},
+       p-B                                                                     INTEGER (0..3,...),
+       pDCCH-InterferenceImpact                        INTEGER (0..4,...),
+       iE-Extensions                                           ProtocolExtensionContainer { {RelativeNarrowbandTxPower-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct RelativeNarrowbandTxPower : asn::sequence<6, 0, true, 1>
+{
+       static constexpr const char* name() {return "RelativeNarrowbandTxPower";}
+       using parent_t = asn::sequence<6, 0, true, 1>;
+       struct rNTP_PerPRB_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 110>>;
+               static constexpr const char* name() {return "rNTP_PerPRB_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       rNTP_PerPRB_t& ref_rNTP_PerPRB() {return rNTP_PerPRB;}
+       rNTP_PerPRB_t const& ref_rNTP_PerPRB() const {return rNTP_PerPRB;}
+       struct rNTP_Threshold_t : RNTP_Threshold
+       {
+               static constexpr const char* name() {return "rNTP_Threshold_t";}
+               using parent_t = RNTP_Threshold;
+
+       };
+       rNTP_Threshold_t& ref_rNTP_Threshold() {return rNTP_Threshold;}
+       rNTP_Threshold_t const& ref_rNTP_Threshold() const {return rNTP_Threshold;}
+       struct numberOfCellSpecificAntennaPorts_t : asn::enumerated<3, 0, true>
+       {
+               static constexpr const char* name() {return "numberOfCellSpecificAntennaPorts_t";}
+               using parent_t = asn::enumerated<3, 0, true>;
+               typedef enum {
+                       one
+                       ,two
+                       ,four
+               } index_t;
+
+       };
+
+       numberOfCellSpecificAntennaPorts_t& ref_numberOfCellSpecificAntennaPorts() {return numberOfCellSpecificAntennaPorts;}
+       numberOfCellSpecificAntennaPorts_t const& ref_numberOfCellSpecificAntennaPorts() const {return numberOfCellSpecificAntennaPorts;}
+       struct p_B_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 3>>;
+               static constexpr const char* name() {return "p_B_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       p_B_t& ref_p_B() {return p_B;}
+       p_B_t const& ref_p_B() const {return p_B;}
+       struct pDCCH_InterferenceImpact_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 4>>;
+               static constexpr const char* name() {return "pDCCH_InterferenceImpact_t";}
+               using parent_t = asn::integer<>;
+
+       };
+
+       pDCCH_InterferenceImpact_t& ref_pDCCH_InterferenceImpact() {return pDCCH_InterferenceImpact;}
+       pDCCH_InterferenceImpact_t const& ref_pDCCH_InterferenceImpact() const {return pDCCH_InterferenceImpact;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<RelativeNarrowbandTxPower_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<RelativeNarrowbandTxPower_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(rNTP_PerPRB);
+               v(rNTP_Threshold);
+               v(numberOfCellSpecificAntennaPorts);
+               v(p_B);
+               v(pDCCH_InterferenceImpact);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(rNTP_PerPRB);
+               v(rNTP_Threshold);
+               v(numberOfCellSpecificAntennaPorts);
+               v(p_B);
+               v(pDCCH_InterferenceImpact);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               rNTP_PerPRB.clear();
+               rNTP_Threshold.clear();
+               numberOfCellSpecificAntennaPorts.clear();
+               p_B.clear();
+               pDCCH_InterferenceImpact.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       rNTP_PerPRB_t   rNTP_PerPRB;
+       rNTP_Threshold_t        rNTP_Threshold;
+       numberOfCellSpecificAntennaPorts_t      numberOfCellSpecificAntennaPorts;
+       p_B_t   p_B;
+       pDCCH_InterferenceImpact_t      pDCCH_InterferenceImpact;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ReportCharacteristics  ::= BIT STRING (SIZE (32))
+*/
+
+struct ReportCharacteristics : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<32>>;
+       static constexpr const char* name() {return "ReportCharacteristics";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+ReportingPeriodicityCSIR ::= ENUMERATED {
+       ms5,
+       ms10,
+       ms20,
+       ms40,
+       ms80,
+...
+}
+*/
+
+struct ReportingPeriodicityCSIR : asn::enumerated<5, 0, true>
+{
+       static constexpr const char* name() {return "ReportingPeriodicityCSIR";}
+       using parent_t = asn::enumerated<5, 0, true>;
+       typedef enum {
+               ms5
+               ,ms10
+               ,ms20
+               ,ms40
+               ,ms80
+       } index_t;
+
+};
+
+/*
+ReportingPeriodicityRSRPMR ::= ENUMERATED {
+       one-hundred-20-ms,
+       two-hundred-40-ms,
+       four-hundred-80-ms,
+       six-hundred-40-ms,
+...
+}
+*/
+
+struct ReportingPeriodicityRSRPMR : asn::enumerated<4, 0, true>
+{
+       static constexpr const char* name() {return "ReportingPeriodicityRSRPMR";}
+       using parent_t = asn::enumerated<4, 0, true>;
+       typedef enum {
+               one_hundred_20_ms
+               ,two_hundred_40_ms
+               ,four_hundred_80_ms
+               ,six_hundred_40_ms
+       } index_t;
+
+};
+
+/*
+ResumeID       ::= CHOICE {
+       non-truncated   BIT STRING(SIZE(40)),
+       truncated               BIT STRING(SIZE(24)),
+       ...
+}
+*/
+
+struct ResumeID : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "ResumeID";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~ResumeID() {clear();}
+       struct non_truncated_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<40>>;
+               static constexpr const char* name() {return "non_truncated_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       struct truncated_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<24>>;
+               static constexpr const char* name() {return "truncated_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<non_truncated_t>(); break;
+               case 2: var.destroy<truncated_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<non_truncated_t>());
+               case 2: set_index(2); return v(var.build<truncated_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<non_truncated_t>());
+               case 2: return v(var.as<truncated_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<non_truncated_t>(1);
+               v.template operator()<truncated_t>(2);
+
+       }
+       non_truncated_t& select_non_truncated() { if(get_index() != 1) { clear(); set_index(1); return var.build<non_truncated_t>();} return var.as<non_truncated_t>();}
+       non_truncated_t const* get_non_truncated() const { if(get_index() == 1) { return &var.as<non_truncated_t>();} return nullptr; }
+       truncated_t& select_truncated() { if(get_index() != 2) { clear(); set_index(2); return var.build<truncated_t>();} return var.as<truncated_t>();}
+       truncated_t const* get_truncated() const { if(get_index() == 2) { return &var.as<truncated_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(non_truncated_t)];
+               char dummy2[sizeof(truncated_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+S1TNLLoadIndicator-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct S1TNLLoadIndicator_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+S1TNLLoadIndicator ::= SEQUENCE {
+       dLS1TNLLoadIndicator                    LoadIndicator,
+       uLS1TNLLoadIndicator                    LoadIndicator,
+       iE-Extensions                                   ProtocolExtensionContainer { {S1TNLLoadIndicator-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct S1TNLLoadIndicator : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "S1TNLLoadIndicator";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct dLS1TNLLoadIndicator_t : LoadIndicator
+       {
+               static constexpr const char* name() {return "dLS1TNLLoadIndicator_t";}
+               using parent_t = LoadIndicator;
+
+       };
+       dLS1TNLLoadIndicator_t& ref_dLS1TNLLoadIndicator() {return dLS1TNLLoadIndicator;}
+       dLS1TNLLoadIndicator_t const& ref_dLS1TNLLoadIndicator() const {return dLS1TNLLoadIndicator;}
+       struct uLS1TNLLoadIndicator_t : LoadIndicator
+       {
+               static constexpr const char* name() {return "uLS1TNLLoadIndicator_t";}
+               using parent_t = LoadIndicator;
+
+       };
+       uLS1TNLLoadIndicator_t& ref_uLS1TNLLoadIndicator() {return uLS1TNLLoadIndicator;}
+       uLS1TNLLoadIndicator_t const& ref_uLS1TNLLoadIndicator() const {return uLS1TNLLoadIndicator;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<S1TNLLoadIndicator_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<S1TNLLoadIndicator_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(dLS1TNLLoadIndicator);
+               v(uLS1TNLLoadIndicator);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(dLS1TNLLoadIndicator);
+               v(uLS1TNLLoadIndicator);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               dLS1TNLLoadIndicator.clear();
+               uLS1TNLLoadIndicator.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       dLS1TNLLoadIndicator_t  dLS1TNLLoadIndicator;
+       uLS1TNLLoadIndicator_t  uLS1TNLLoadIndicator;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SCGChangeIndication ::= ENUMERATED {pDCPCountWrapAround, pSCellChange, other, ...}
+*/
+
+struct SCGChangeIndication : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "SCGChangeIndication";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               pDCPCountWrapAround
+               ,pSCellChange
+               ,other
+       } index_t;
+
+};
+
+/*
+SCGConfigurationQuery ::= ENUMERATED {true,...}
+*/
+
+struct SCGConfigurationQuery : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "SCGConfigurationQuery";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               True
+       } index_t;
+
+};
+
+/*
+SGNB-Addition-Trigger-Ind       ::= ENUMERATED {
+       sn-change,
+       inter-eNB-HO,
+       intra-eNB-HO,
+       ...
+}
+*/
+
+struct SGNB_Addition_Trigger_Ind : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "SGNB-Addition-Trigger-Ind";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               sn_change
+               ,inter_eNB_HO
+               ,intra_eNB_HO
+       } index_t;
+
+};
+
+/*
+SIPTOBearerDeactivationIndication ::= ENUMERATED {
+       true,
+       ...
+}
+*/
+
+struct SIPTOBearerDeactivationIndication : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "SIPTOBearerDeactivationIndication";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               True
+       } index_t;
+
+};
+
+/*
+SRBType ::= ENUMERATED {srb1, srb2, ...}
+*/
+
+struct SRBType : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "SRBType";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               srb1
+               ,srb2
+       } index_t;
+
+};
+
+/*
+SRVCCOperationPossible ::= ENUMERATED {
+       possible,
+       ...
+}
+*/
+
+struct SRVCCOperationPossible : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "SRVCCOperationPossible";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               possible
+       } index_t;
+
+};
+
+/*
+ScheduledCommunicationTime-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ScheduledCommunicationTime_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ScheduledCommunicationTime ::= SEQUENCE {
+       dayofWeek                               BIT STRING (SIZE(7))                                                                    OPTIONAL,
+       timeofDayStart                  INTEGER (0..86399, ...)                                                                 OPTIONAL,
+       timeofDayEnd                            INTEGER (0..86399, ...)                                                                 OPTIONAL,
+       iE-Extensions                   ProtocolExtensionContainer { { ScheduledCommunicationTime-ExtIEs}}      OPTIONAL,
+       ...
+}
+*/
+
+struct ScheduledCommunicationTime : asn::sequence<4, 0, true, 4>
+{
+       static constexpr const char* name() {return "ScheduledCommunicationTime";}
+       using parent_t = asn::sequence<4, 0, true, 4>;
+       struct dayofWeek_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<7>>;
+               static constexpr const char* name() {return "dayofWeek_t";}
+               using parent_t = asn::bstring<>;
+               static constexpr bool optional = true;
+
+       };
+
+       dayofWeek_t& set_dayofWeek() { dayofWeek.setpresent(true); return dayofWeek;}
+       dayofWeek_t const* get_dayofWeek() const {return dayofWeek.is_valid() ? &dayofWeek : nullptr;}
+       struct timeofDayStart_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 86399>>;
+               static constexpr const char* name() {return "timeofDayStart_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       timeofDayStart_t& set_timeofDayStart() { timeofDayStart.setpresent(true); return timeofDayStart;}
+       timeofDayStart_t const* get_timeofDayStart() const {return timeofDayStart.is_valid() ? &timeofDayStart : nullptr;}
+       struct timeofDayEnd_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<0, 86399>>;
+               static constexpr const char* name() {return "timeofDayEnd_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       timeofDayEnd_t& set_timeofDayEnd() { timeofDayEnd.setpresent(true); return timeofDayEnd;}
+       timeofDayEnd_t const* get_timeofDayEnd() const {return timeofDayEnd.is_valid() ? &timeofDayEnd : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ScheduledCommunicationTime_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ScheduledCommunicationTime_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(dayofWeek);
+               v(timeofDayStart);
+               v(timeofDayEnd);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(dayofWeek);
+               v(timeofDayStart);
+               v(timeofDayEnd);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               dayofWeek.clear();
+               timeofDayStart.clear();
+               timeofDayEnd.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       dayofWeek_t     dayofWeek;
+       timeofDayStart_t        timeofDayStart;
+       timeofDayEnd_t  timeofDayEnd;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SeNBSecurityKey ::= BIT STRING (SIZE(256))
+*/
+
+struct SeNBSecurityKey : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<256>>;
+       static constexpr const char* name() {return "SeNBSecurityKey";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+SeNBtoMeNBContainer ::= OCTET STRING
+*/
+
+struct SeNBtoMeNBContainer : asn::ostring<>
+{
+       static constexpr const char* name() {return "SeNBtoMeNBContainer";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+SecondaryRATUsageReport-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SecondaryRATUsageReport_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SecondaryRATUsageReport-Item ::= SEQUENCE {
+       e-RAB-ID                                                E-RAB-ID,
+       secondaryRATType                                ENUMERATED {nr, ...},
+       e-RABUsageReportList                    E-RABUsageReportList,
+       iE-Extensions                           ProtocolExtensionContainer { {SecondaryRATUsageReport-Item-ExtIEs} } OPTIONAL,
+...
+}
+*/
+
+struct SecondaryRATUsageReport_Item : asn::sequence<4, 0, true, 1>
+{
+       static constexpr const char* name() {return "SecondaryRATUsageReport-Item";}
+       using parent_t = asn::sequence<4, 0, true, 1>;
+       struct e_RAB_ID_t : E_RAB_ID
+       {
+               static constexpr const char* name() {return "e_RAB_ID_t";}
+               using parent_t = E_RAB_ID;
+
+       };
+       e_RAB_ID_t& ref_e_RAB_ID() {return e_RAB_ID;}
+       e_RAB_ID_t const& ref_e_RAB_ID() const {return e_RAB_ID;}
+       struct secondaryRATType_t : asn::enumerated<1, 0, true>
+       {
+               static constexpr const char* name() {return "secondaryRATType_t";}
+               using parent_t = asn::enumerated<1, 0, true>;
+               typedef enum {
+                       nr
+               } index_t;
+
+       };
+
+       secondaryRATType_t& ref_secondaryRATType() {return secondaryRATType;}
+       secondaryRATType_t const& ref_secondaryRATType() const {return secondaryRATType;}
+       struct e_RABUsageReportList_t : E_RABUsageReportList
+       {
+               static constexpr const char* name() {return "e_RABUsageReportList_t";}
+               using parent_t = E_RABUsageReportList;
+
+       };
+       e_RABUsageReportList_t& ref_e_RABUsageReportList() {return e_RABUsageReportList;}
+       e_RABUsageReportList_t const& ref_e_RABUsageReportList() const {return e_RABUsageReportList;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SecondaryRATUsageReport_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SecondaryRATUsageReport_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(e_RAB_ID);
+               v(secondaryRATType);
+               v(e_RABUsageReportList);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(e_RAB_ID);
+               v(secondaryRATType);
+               v(e_RABUsageReportList);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               e_RAB_ID.clear();
+               secondaryRATType.clear();
+               e_RABUsageReportList.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       e_RAB_ID_t      e_RAB_ID;
+       secondaryRATType_t      secondaryRATType;
+       e_RABUsageReportList_t  e_RABUsageReportList;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SecondaryRATUsageReport-ItemIEs        X2AP-PROTOCOL-IES ::= {
+       { ID id-SecondaryRATUsageReport-Item            CRITICALITY reject      TYPE SecondaryRATUsageReport-Item               PRESENCE mandatory},
+       ...
+}
+*/
+
+struct SecondaryRATUsageReport_ItemIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_SecondaryRATUsageReport_Item() { set(id_SecondaryRATUsageReport_Item); type=1;}
+               X2AP_PROTOCOL_IES::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_SecondaryRATUsageReport_Item)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_SecondaryRATUsageReport_Item);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_SecondaryRATUsageReport_Item() { set(reject); type=1;}
+               X2AP_PROTOCOL_IES::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(reject)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Value_t : asn::typefield<true>
+       {
+               ~Value_t()      {clear();}
+               size_t get_index() const {return type;}
+               SecondaryRATUsageReport_Item& select_id_SecondaryRATUsageReport_Item() { return set<SecondaryRATUsageReport_Item>(1); }
+               SecondaryRATUsageReport_Item const* get_id_SecondaryRATUsageReport_Item() const { return get<SecondaryRATUsageReport_Item>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<SecondaryRATUsageReport_Item>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<SecondaryRATUsageReport_Item>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_SecondaryRATUsageReport_Item()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<SecondaryRATUsageReport_Item>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(SecondaryRATUsageReport_Item)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_IES::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_SecondaryRATUsageReport_Item() { set(mandatory); type=1;}
+               X2AP_PROTOCOL_IES::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(mandatory)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(mandatory);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SecondaryRATUsageReportList ::= SEQUENCE (SIZE(1..maxnoofBearers)) OF ProtocolIE-Single-Container {{SecondaryRATUsageReport-ItemIEs}}
+*/
+
+struct SecondaryRATUsageReportList_elm : ProtocolIE_Single_Container<SecondaryRATUsageReport_ItemIEs>
+{
+       static constexpr const char* name() {return "SecondaryRATUsageReportList_elm";}
+       using parent_t = ProtocolIE_Single_Container<SecondaryRATUsageReport_ItemIEs>;
+
+};
+struct SecondaryRATUsageReportList : asn::sequenceof<SecondaryRATUsageReportList_elm>
+{
+       static constexpr const char* name() {return "SecondaryRATUsageReportList";}
+       using parent_t = asn::sequenceof<SecondaryRATUsageReportList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofBearers >>;
+
+};
+/*
+ServedCell-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ServedCell_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ServedCell-Information-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-Number-of-Antennaports                          CRITICALITY ignore      EXTENSION Number-of-Antennaports                                        PRESENCE optional}|
+       { ID id-PRACH-Configuration                                     CRITICALITY ignore      EXTENSION PRACH-Configuration                                           PRESENCE optional}|
+       { ID id-MBSFN-Subframe-Info                                     CRITICALITY ignore      EXTENSION MBSFN-Subframe-Infolist                               PRESENCE optional}|
+       { ID id-CSG-Id                                                          CRITICALITY ignore      EXTENSION CSG-Id                                                                        PRESENCE optional}|
+       { ID id-MBMS-Service-Area-List                          CRITICALITY ignore      EXTENSION MBMS-Service-Area-Identity-List               PRESENCE optional}|
+       { ID id-MultibandInfoList                                       CRITICALITY ignore      EXTENSION MultibandInfoList                                                     PRESENCE optional}|
+       { ID id-FreqBandIndicatorPriority                       CRITICALITY ignore      EXTENSION FreqBandIndicatorPriority                             PRESENCE optional}|
+       { ID id-BandwidthReducedSI                                      CRITICALITY ignore      EXTENSION BandwidthReducedSI                                            PRESENCE optional}|
+       { ID id-ProtectedEUTRAResourceIndication        CRITICALITY ignore      EXTENSION ProtectedEUTRAResourceIndication      PRESENCE optional},
+       ...
+}
+*/
+
+struct ServedCell_Information_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 10; }
+               void clear() {type = 0;}
+               void select_id_Number_of_Antennaports() { set(id_Number_of_Antennaports); type=1;}
+               void select_id_PRACH_Configuration() { set(id_PRACH_Configuration); type=2;}
+               void select_id_MBSFN_Subframe_Info() { set(id_MBSFN_Subframe_Info); type=3;}
+               void select_id_CSG_Id() { set(id_CSG_Id); type=4;}
+               void select_id_MBMS_Service_Area_List() { set(id_MBMS_Service_Area_List); type=5;}
+               void select_id_MultibandInfoList() { set(id_MultibandInfoList); type=6;}
+               void select_id_FreqBandIndicatorPriority() { set(id_FreqBandIndicatorPriority); type=7;}
+               void select_id_BandwidthReducedSI() { set(id_BandwidthReducedSI); type=8;}
+               void select_id_ProtectedEUTRAResourceIndication() { set(id_ProtectedEUTRAResourceIndication); type=9;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_Number_of_Antennaports)) { type = 1; return true; }
+                       else if(equal(id_PRACH_Configuration)) { type = 2; return true; }
+                       else if(equal(id_MBSFN_Subframe_Info)) { type = 3; return true; }
+                       else if(equal(id_CSG_Id)) { type = 4; return true; }
+                       else if(equal(id_MBMS_Service_Area_List)) { type = 5; return true; }
+                       else if(equal(id_MultibandInfoList)) { type = 6; return true; }
+                       else if(equal(id_FreqBandIndicatorPriority)) { type = 7; return true; }
+                       else if(equal(id_BandwidthReducedSI)) { type = 8; return true; }
+                       else if(equal(id_ProtectedEUTRAResourceIndication)) { type = 9; return true; }
+                       else { type = 10; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_Number_of_Antennaports);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_PRACH_Configuration);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(id_MBSFN_Subframe_Info);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(id_CSG_Id);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(id_MBMS_Service_Area_List);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(id_MultibandInfoList);} return false;
+                       case 7: type = 7; if(v(ref_nested())) { return equal(id_FreqBandIndicatorPriority);} return false;
+                       case 8: type = 8; if(v(ref_nested())) { return equal(id_BandwidthReducedSI);} return false;
+                       case 9: type = 9; if(v(ref_nested())) { return equal(id_ProtectedEUTRAResourceIndication);} return false;
+                       case 10: type = 10; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 10; }
+               void clear() {type = 0;}
+               void select_id_Number_of_Antennaports() { set(ignore); type=1;}
+               void select_id_PRACH_Configuration() { set(ignore); type=2;}
+               void select_id_MBSFN_Subframe_Info() { set(ignore); type=3;}
+               void select_id_CSG_Id() { set(ignore); type=4;}
+               void select_id_MBMS_Service_Area_List() { set(ignore); type=5;}
+               void select_id_MultibandInfoList() { set(ignore); type=6;}
+               void select_id_FreqBandIndicatorPriority() { set(ignore); type=7;}
+               void select_id_BandwidthReducedSI() { set(ignore); type=8;}
+               void select_id_ProtectedEUTRAResourceIndication() { set(ignore); type=9;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else if(equal(ignore)) { type = 3; return true; }
+                       else if(equal(ignore)) { type = 4; return true; }
+                       else if(equal(ignore)) { type = 5; return true; }
+                       else if(equal(ignore)) { type = 6; return true; }
+                       else if(equal(ignore)) { type = 7; return true; }
+                       else if(equal(ignore)) { type = 8; return true; }
+                       else if(equal(ignore)) { type = 9; return true; }
+                       else { type = 10; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 7: type = 7; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 8: type = 8; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 9: type = 9; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 10: type = 10; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               Number_of_Antennaports& select_id_Number_of_Antennaports() { return set<Number_of_Antennaports>(1); }
+               Number_of_Antennaports const* get_id_Number_of_Antennaports() const { return get<Number_of_Antennaports>(1); }
+               PRACH_Configuration& select_id_PRACH_Configuration() { return set<PRACH_Configuration>(2); }
+               PRACH_Configuration const* get_id_PRACH_Configuration() const { return get<PRACH_Configuration>(2); }
+               MBSFN_Subframe_Infolist& select_id_MBSFN_Subframe_Info() { return set<MBSFN_Subframe_Infolist>(3); }
+               MBSFN_Subframe_Infolist const* get_id_MBSFN_Subframe_Info() const { return get<MBSFN_Subframe_Infolist>(3); }
+               CSG_Id& select_id_CSG_Id() { return set<CSG_Id>(4); }
+               CSG_Id const* get_id_CSG_Id() const { return get<CSG_Id>(4); }
+               MBMS_Service_Area_Identity_List& select_id_MBMS_Service_Area_List() { return set<MBMS_Service_Area_Identity_List>(5); }
+               MBMS_Service_Area_Identity_List const* get_id_MBMS_Service_Area_List() const { return get<MBMS_Service_Area_Identity_List>(5); }
+               MultibandInfoList& select_id_MultibandInfoList() { return set<MultibandInfoList>(6); }
+               MultibandInfoList const* get_id_MultibandInfoList() const { return get<MultibandInfoList>(6); }
+               FreqBandIndicatorPriority& select_id_FreqBandIndicatorPriority() { return set<FreqBandIndicatorPriority>(7); }
+               FreqBandIndicatorPriority const* get_id_FreqBandIndicatorPriority() const { return get<FreqBandIndicatorPriority>(7); }
+               BandwidthReducedSI& select_id_BandwidthReducedSI() { return set<BandwidthReducedSI>(8); }
+               BandwidthReducedSI const* get_id_BandwidthReducedSI() const { return get<BandwidthReducedSI>(8); }
+               ProtectedEUTRAResourceIndication& select_id_ProtectedEUTRAResourceIndication() { return set<ProtectedEUTRAResourceIndication>(9); }
+               ProtectedEUTRAResourceIndication const* get_id_ProtectedEUTRAResourceIndication() const { return get<ProtectedEUTRAResourceIndication>(9); }
+               bool is_unknown() const { return type == 10; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<Number_of_Antennaports>(); break;
+                       case 2: var.destroy<PRACH_Configuration>(); break;
+                       case 3: var.destroy<MBSFN_Subframe_Infolist>(); break;
+                       case 4: var.destroy<CSG_Id>(); break;
+                       case 5: var.destroy<MBMS_Service_Area_Identity_List>(); break;
+                       case 6: var.destroy<MultibandInfoList>(); break;
+                       case 7: var.destroy<FreqBandIndicatorPriority>(); break;
+                       case 8: var.destroy<BandwidthReducedSI>(); break;
+                       case 9: var.destroy<ProtectedEUTRAResourceIndication>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<Number_of_Antennaports>(1);
+                       v.template operator()<PRACH_Configuration>(2);
+                       v.template operator()<MBSFN_Subframe_Infolist>(3);
+                       v.template operator()<CSG_Id>(4);
+                       v.template operator()<MBMS_Service_Area_Identity_List>(5);
+                       v.template operator()<MultibandInfoList>(6);
+                       v.template operator()<FreqBandIndicatorPriority>(7);
+                       v.template operator()<BandwidthReducedSI>(8);
+                       v.template operator()<ProtectedEUTRAResourceIndication>(9);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_Number_of_Antennaports()); return true;
+                       case 2: v(select_id_PRACH_Configuration()); return true;
+                       case 3: v(select_id_MBSFN_Subframe_Info()); return true;
+                       case 4: v(select_id_CSG_Id()); return true;
+                       case 5: v(select_id_MBMS_Service_Area_List()); return true;
+                       case 6: v(select_id_MultibandInfoList()); return true;
+                       case 7: v(select_id_FreqBandIndicatorPriority()); return true;
+                       case 8: v(select_id_BandwidthReducedSI()); return true;
+                       case 9: v(select_id_ProtectedEUTRAResourceIndication()); return true;
+                       case 10: if(type != 10) {clear(); asn::base::set();} type = 10; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<Number_of_Antennaports>()); return true;
+                       case 2: v(var.as<PRACH_Configuration>()); return true;
+                       case 3: v(var.as<MBSFN_Subframe_Infolist>()); return true;
+                       case 4: v(var.as<CSG_Id>()); return true;
+                       case 5: v(var.as<MBMS_Service_Area_Identity_List>()); return true;
+                       case 6: v(var.as<MultibandInfoList>()); return true;
+                       case 7: v(var.as<FreqBandIndicatorPriority>()); return true;
+                       case 8: v(var.as<BandwidthReducedSI>()); return true;
+                       case 9: v(var.as<ProtectedEUTRAResourceIndication>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(BandwidthReducedSI)];
+                       char dummy2[sizeof(CSG_Id)];
+                       char dummy3[sizeof(FreqBandIndicatorPriority)];
+                       char dummy4[sizeof(MBMS_Service_Area_Identity_List)];
+                       char dummy5[sizeof(MBSFN_Subframe_Infolist)];
+                       char dummy6[sizeof(MultibandInfoList)];
+                       char dummy7[sizeof(Number_of_Antennaports)];
+                       char dummy8[sizeof(PRACH_Configuration)];
+                       char dummy9[sizeof(ProtectedEUTRAResourceIndication)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 10; }
+               void clear() {type = 0;}
+               void select_id_Number_of_Antennaports() { set(optional); type=1;}
+               void select_id_PRACH_Configuration() { set(optional); type=2;}
+               void select_id_MBSFN_Subframe_Info() { set(optional); type=3;}
+               void select_id_CSG_Id() { set(optional); type=4;}
+               void select_id_MBMS_Service_Area_List() { set(optional); type=5;}
+               void select_id_MultibandInfoList() { set(optional); type=6;}
+               void select_id_FreqBandIndicatorPriority() { set(optional); type=7;}
+               void select_id_BandwidthReducedSI() { set(optional); type=8;}
+               void select_id_ProtectedEUTRAResourceIndication() { set(optional); type=9;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else if(equal(optional)) { type = 3; return true; }
+                       else if(equal(optional)) { type = 4; return true; }
+                       else if(equal(optional)) { type = 5; return true; }
+                       else if(equal(optional)) { type = 6; return true; }
+                       else if(equal(optional)) { type = 7; return true; }
+                       else if(equal(optional)) { type = 8; return true; }
+                       else if(equal(optional)) { type = 9; return true; }
+                       else { type = 10; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 4: type = 4; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 5: type = 5; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 6: type = 6; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 7: type = 7; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 8: type = 8; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 9: type = 9; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 10: type = 10; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ServedCell-Information ::= SEQUENCE {
+       pCI                                     PCI,
+       cellId                          ECGI,
+       tAC                                     TAC,
+       broadcastPLMNs          BroadcastPLMNs-Item,
+       eUTRA-Mode-Info         EUTRA-Mode-Info,
+       iE-Extensions           ProtocolExtensionContainer { {ServedCell-Information-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ServedCell_Information : asn::sequence<6, 0, true, 1>
+{
+       static constexpr const char* name() {return "ServedCell-Information";}
+       using parent_t = asn::sequence<6, 0, true, 1>;
+       struct pCI_t : PCI
+       {
+               static constexpr const char* name() {return "pCI_t";}
+               using parent_t = PCI;
+
+       };
+       pCI_t& ref_pCI() {return pCI;}
+       pCI_t const& ref_pCI() const {return pCI;}
+       struct cellId_t : ECGI
+       {
+               static constexpr const char* name() {return "cellId_t";}
+               using parent_t = ECGI;
+
+       };
+       cellId_t& ref_cellId() {return cellId;}
+       cellId_t const& ref_cellId() const {return cellId;}
+       struct tAC_t : TAC
+       {
+               static constexpr const char* name() {return "tAC_t";}
+               using parent_t = TAC;
+
+       };
+       tAC_t& ref_tAC() {return tAC;}
+       tAC_t const& ref_tAC() const {return tAC;}
+       struct broadcastPLMNs_t : BroadcastPLMNs_Item
+       {
+               static constexpr const char* name() {return "broadcastPLMNs_t";}
+               using parent_t = BroadcastPLMNs_Item;
+
+       };
+       broadcastPLMNs_t& ref_broadcastPLMNs() {return broadcastPLMNs;}
+       broadcastPLMNs_t const& ref_broadcastPLMNs() const {return broadcastPLMNs;}
+       struct eUTRA_Mode_Info_t : EUTRA_Mode_Info
+       {
+               static constexpr const char* name() {return "eUTRA_Mode_Info_t";}
+               using parent_t = EUTRA_Mode_Info;
+
+       };
+       eUTRA_Mode_Info_t& ref_eUTRA_Mode_Info() {return eUTRA_Mode_Info;}
+       eUTRA_Mode_Info_t const& ref_eUTRA_Mode_Info() const {return eUTRA_Mode_Info;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ServedCell_Information_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ServedCell_Information_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(pCI);
+               v(cellId);
+               v(tAC);
+               v(broadcastPLMNs);
+               v(eUTRA_Mode_Info);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pCI);
+               v(cellId);
+               v(tAC);
+               v(broadcastPLMNs);
+               v(eUTRA_Mode_Info);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               pCI.clear();
+               cellId.clear();
+               tAC.clear();
+               broadcastPLMNs.clear();
+               eUTRA_Mode_Info.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       pCI_t   pCI;
+       cellId_t        cellId;
+       tAC_t   tAC;
+       broadcastPLMNs_t        broadcastPLMNs;
+       eUTRA_Mode_Info_t       eUTRA_Mode_Info;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+ServedCells ::= SEQUENCE (SIZE (1.. maxCellineNB)) OF SEQUENCE {
+       servedCellInfo                                  ServedCell-Information,
+       neighbour-Info                                  Neighbour-Information                   OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { {ServedCell-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ServedCells_elm : asn::sequence<3, 0, true, 2>
+{
+       static constexpr const char* name() {return "ServedCells_elm";}
+       using parent_t = asn::sequence<3, 0, true, 2>;
+       struct servedCellInfo_t : ServedCell_Information
+       {
+               static constexpr const char* name() {return "servedCellInfo_t";}
+               using parent_t = ServedCell_Information;
+
+       };
+       servedCellInfo_t& ref_servedCellInfo() {return servedCellInfo;}
+       servedCellInfo_t const& ref_servedCellInfo() const {return servedCellInfo;}
+       struct neighbour_Info_t : Neighbour_Information
+       {
+               static constexpr const char* name() {return "neighbour_Info_t";}
+               using parent_t = Neighbour_Information;
+               static constexpr bool optional = true;
+
+       };
+       neighbour_Info_t& set_neighbour_Info() { neighbour_Info.setpresent(true); return neighbour_Info;}
+       neighbour_Info_t const* get_neighbour_Info() const {return neighbour_Info.is_valid() ? &neighbour_Info : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ServedCell_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ServedCell_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(servedCellInfo);
+               v(neighbour_Info);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(servedCellInfo);
+               v(neighbour_Info);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               servedCellInfo.clear();
+               neighbour_Info.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       servedCellInfo_t        servedCellInfo;
+       neighbour_Info_t        neighbour_Info;
+       iE_Extensions_t iE_Extensions;
+
+};
+struct ServedCells : asn::sequenceof<ServedCells_elm>
+{
+       static constexpr const char* name() {return "ServedCells";}
+       using parent_t = asn::sequenceof<ServedCells_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCellineNB >>;
+
+};
+/*
+ServiceType ::= ENUMERATED{
+       qMC-for-streaming-service,
+       qMC-for-MTSI-service,
+       ...
+}
+*/
+
+struct ServiceType : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "ServiceType";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               qMC_for_streaming_service
+               ,qMC_for_MTSI_service
+       } index_t;
+
+};
+
+/*
+SgNB-UE-X2AP-ID ::= INTEGER (0..4294967295)
+*/
+
+struct SgNB_UE_X2AP_ID : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 4294967295>>;
+       static constexpr const char* name() {return "SgNB-UE-X2AP-ID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+SgNBCoordinationAssistanceInformation ::= ENUMERATED{
+       coordination-not-required,
+       ...
+}
+*/
+
+struct SgNBCoordinationAssistanceInformation : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "SgNBCoordinationAssistanceInformation";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               coordination_not_required
+       } index_t;
+
+};
+
+/*
+SgNBResourceCoordinationInformationExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-ECGI                                                                            CRITICALITY ignore      EXTENSION ECGI                                                                                          PRESENCE optional}|
+       { ID id-SgNBCoordinationAssistanceInformation           CRITICALITY reject      EXTENSION SgNBCoordinationAssistanceInformation PRESENCE optional},
+       ...
+}
+*/
+
+struct SgNBResourceCoordinationInformationExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_ECGI() { set(id_ECGI); type=1;}
+               void select_id_SgNBCoordinationAssistanceInformation() { set(id_SgNBCoordinationAssistanceInformation); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_ECGI)) { type = 1; return true; }
+                       else if(equal(id_SgNBCoordinationAssistanceInformation)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_ECGI);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_SgNBCoordinationAssistanceInformation);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_ECGI() { set(ignore); type=1;}
+               void select_id_SgNBCoordinationAssistanceInformation() { set(reject); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(reject)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(reject);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               ECGI& select_id_ECGI() { return set<ECGI>(1); }
+               ECGI const* get_id_ECGI() const { return get<ECGI>(1); }
+               SgNBCoordinationAssistanceInformation& select_id_SgNBCoordinationAssistanceInformation() { return set<SgNBCoordinationAssistanceInformation>(2); }
+               SgNBCoordinationAssistanceInformation const* get_id_SgNBCoordinationAssistanceInformation() const { return get<SgNBCoordinationAssistanceInformation>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<ECGI>(); break;
+                       case 2: var.destroy<SgNBCoordinationAssistanceInformation>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<ECGI>(1);
+                       v.template operator()<SgNBCoordinationAssistanceInformation>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_ECGI()); return true;
+                       case 2: v(select_id_SgNBCoordinationAssistanceInformation()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<ECGI>()); return true;
+                       case 2: v(var.as<SgNBCoordinationAssistanceInformation>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(ECGI)];
+                       char dummy2[sizeof(SgNBCoordinationAssistanceInformation)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_ECGI() { set(optional); type=1;}
+               void select_id_SgNBCoordinationAssistanceInformation() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SgNBResourceCoordinationInformation ::= SEQUENCE {
+       nR-CGI                                                  NRCGI,
+       uLCoordinationInformation               BIT STRING (SIZE(6..4400, ...)),
+       dLCoordinationInformation               BIT STRING (SIZE(6..4400, ...)) OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { {SgNBResourceCoordinationInformationExtIEs} }               OPTIONAL,
+       ...
+}
+*/
+
+struct SgNBResourceCoordinationInformation : asn::sequence<4, 0, true, 2>
+{
+       static constexpr const char* name() {return "SgNBResourceCoordinationInformation";}
+       using parent_t = asn::sequence<4, 0, true, 2>;
+       struct nR_CGI_t : NRCGI
+       {
+               static constexpr const char* name() {return "nR_CGI_t";}
+               using parent_t = NRCGI;
+
+       };
+       nR_CGI_t& ref_nR_CGI() {return nR_CGI;}
+       nR_CGI_t const& ref_nR_CGI() const {return nR_CGI;}
+       struct uLCoordinationInformation_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 4400>>;
+               static constexpr const char* name() {return "uLCoordinationInformation_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       uLCoordinationInformation_t& ref_uLCoordinationInformation() {return uLCoordinationInformation;}
+       uLCoordinationInformation_t const& ref_uLCoordinationInformation() const {return uLCoordinationInformation;}
+       struct dLCoordinationInformation_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<6, 4400>>;
+               static constexpr const char* name() {return "dLCoordinationInformation_t";}
+               using parent_t = asn::bstring<>;
+               static constexpr bool optional = true;
+
+       };
+
+       dLCoordinationInformation_t& set_dLCoordinationInformation() { dLCoordinationInformation.setpresent(true); return dLCoordinationInformation;}
+       dLCoordinationInformation_t const* get_dLCoordinationInformation() const {return dLCoordinationInformation.is_valid() ? &dLCoordinationInformation : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SgNBResourceCoordinationInformationExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SgNBResourceCoordinationInformationExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(nR_CGI);
+               v(uLCoordinationInformation);
+               v(dLCoordinationInformation);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(nR_CGI);
+               v(uLCoordinationInformation);
+               v(dLCoordinationInformation);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               nR_CGI.clear();
+               uLCoordinationInformation.clear();
+               dLCoordinationInformation.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       nR_CGI_t        nR_CGI;
+       uLCoordinationInformation_t     uLCoordinationInformation;
+       dLCoordinationInformation_t     dLCoordinationInformation;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SgNBSecurityKey ::= BIT STRING (SIZE(256))
+*/
+
+struct SgNBSecurityKey : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<256>>;
+       static constexpr const char* name() {return "SgNBSecurityKey";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+SgNBtoMeNBContainer ::= OCTET STRING
+*/
+
+struct SgNBtoMeNBContainer : asn::ostring<>
+{
+       static constexpr const char* name() {return "SgNBtoMeNBContainer";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+ShortMAC-I ::= BIT STRING (SIZE(16))
+*/
+
+struct ShortMAC_I : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<16>>;
+       static constexpr const char* name() {return "ShortMAC-I";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+SpectrumSharingGroupID ::= INTEGER (1..maxCellineNB)
+*/
+
+struct SpectrumSharingGroupID : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCellineNB >>;
+       static constexpr const char* name() {return "SpectrumSharingGroupID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+SplitSRB-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct SplitSRB_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+SplitSRB ::= SEQUENCE {
+       rrcContainer                            RRCContainer                    OPTIONAL,
+       srbType                                         SRBType,
+       deliveryStatus                          DeliveryStatus                  OPTIONAL,
+       iE-Extensions                           ProtocolExtensionContainer { {SplitSRB-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct SplitSRB : asn::sequence<4, 0, true, 3>
+{
+       static constexpr const char* name() {return "SplitSRB";}
+       using parent_t = asn::sequence<4, 0, true, 3>;
+       struct rrcContainer_t : RRCContainer
+       {
+               static constexpr const char* name() {return "rrcContainer_t";}
+               using parent_t = RRCContainer;
+               static constexpr bool optional = true;
+
+       };
+       rrcContainer_t& set_rrcContainer() { rrcContainer.setpresent(true); return rrcContainer;}
+       rrcContainer_t const* get_rrcContainer() const {return rrcContainer.is_valid() ? &rrcContainer : nullptr;}
+       struct srbType_t : SRBType
+       {
+               static constexpr const char* name() {return "srbType_t";}
+               using parent_t = SRBType;
+
+       };
+       srbType_t& ref_srbType() {return srbType;}
+       srbType_t const& ref_srbType() const {return srbType;}
+       struct deliveryStatus_t : DeliveryStatus
+       {
+               static constexpr const char* name() {return "deliveryStatus_t";}
+               using parent_t = DeliveryStatus;
+               static constexpr bool optional = true;
+
+       };
+       deliveryStatus_t& set_deliveryStatus() { deliveryStatus.setpresent(true); return deliveryStatus;}
+       deliveryStatus_t const* get_deliveryStatus() const {return deliveryStatus.is_valid() ? &deliveryStatus : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<SplitSRB_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<SplitSRB_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(rrcContainer);
+               v(srbType);
+               v(deliveryStatus);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(rrcContainer);
+               v(srbType);
+               v(deliveryStatus);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               rrcContainer.clear();
+               srbType.clear();
+               deliveryStatus.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       rrcContainer_t  rrcContainer;
+       srbType_t       srbType;
+       deliveryStatus_t        deliveryStatus;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+SplitSRBs ::= ENUMERATED {srb1, srb2, srb1and2, ...}
+*/
+
+struct SplitSRBs : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "SplitSRBs";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               srb1
+               ,srb2
+               ,srb1and2
+       } index_t;
+
+};
+
+/*
+SubscriberProfileIDforRFP ::= INTEGER (1..256)
+*/
+
+struct SubscriberProfileIDforRFP : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<1, 256>>;
+       static constexpr const char* name() {return "SubscriberProfileIDforRFP";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+Subscription-Based-UE-DifferentiationInfo-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct Subscription_Based_UE_DifferentiationInfo_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+Subscription-Based-UE-DifferentiationInfo ::= SEQUENCE {
+       periodicCommunicationIndicator  ENUMERATED {periodically, ondemand, ...}                OPTIONAL,
+       periodicTime                                    INTEGER (1..3600, ...)                                                  OPTIONAL,
+       scheduledCommunicationTime              ScheduledCommunicationTime                                              OPTIONAL,
+       stationaryIndication                    ENUMERATED {stationary, mobile, ...}                    OPTIONAL,
+       trafficProfile                                  ENUMERATED {single-packet, dual-packets, multiple-packets, ...}                         OPTIONAL,
+       batteryIndication                               ENUMERATED {battery-powered, battery-powered-not-rechargeable-or-replaceable, not-battery-powered, ...}         OPTIONAL,
+       iE-Extensions                                   ProtocolExtensionContainer { { Subscription-Based-UE-DifferentiationInfo-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct Subscription_Based_UE_DifferentiationInfo : asn::sequence<7, 0, true, 7>
+{
+       static constexpr const char* name() {return "Subscription-Based-UE-DifferentiationInfo";}
+       using parent_t = asn::sequence<7, 0, true, 7>;
+       struct periodicCommunicationIndicator_t : asn::enumerated<2, 0, true>
+       {
+               static constexpr const char* name() {return "periodicCommunicationIndicator_t";}
+               using parent_t = asn::enumerated<2, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       periodically
+                       ,ondemand
+               } index_t;
+
+       };
+
+       periodicCommunicationIndicator_t& set_periodicCommunicationIndicator() { periodicCommunicationIndicator.setpresent(true); return periodicCommunicationIndicator;}
+       periodicCommunicationIndicator_t const* get_periodicCommunicationIndicator() const {return periodicCommunicationIndicator.is_valid() ? &periodicCommunicationIndicator : nullptr;}
+       struct periodicTime_t : asn::integer<>
+       {
+               using constraint_t = asn::constraints<true,asn::span<1, 3600>>;
+               static constexpr const char* name() {return "periodicTime_t";}
+               using parent_t = asn::integer<>;
+               static constexpr bool optional = true;
+
+       };
+
+       periodicTime_t& set_periodicTime() { periodicTime.setpresent(true); return periodicTime;}
+       periodicTime_t const* get_periodicTime() const {return periodicTime.is_valid() ? &periodicTime : nullptr;}
+       struct scheduledCommunicationTime_t : ScheduledCommunicationTime
+       {
+               static constexpr const char* name() {return "scheduledCommunicationTime_t";}
+               using parent_t = ScheduledCommunicationTime;
+               static constexpr bool optional = true;
+
+       };
+       scheduledCommunicationTime_t& set_scheduledCommunicationTime() { scheduledCommunicationTime.setpresent(true); return scheduledCommunicationTime;}
+       scheduledCommunicationTime_t const* get_scheduledCommunicationTime() const {return scheduledCommunicationTime.is_valid() ? &scheduledCommunicationTime : nullptr;}
+       struct stationaryIndication_t : asn::enumerated<2, 0, true>
+       {
+               static constexpr const char* name() {return "stationaryIndication_t";}
+               using parent_t = asn::enumerated<2, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       stationary
+                       ,mobile
+               } index_t;
+
+       };
+
+       stationaryIndication_t& set_stationaryIndication() { stationaryIndication.setpresent(true); return stationaryIndication;}
+       stationaryIndication_t const* get_stationaryIndication() const {return stationaryIndication.is_valid() ? &stationaryIndication : nullptr;}
+       struct trafficProfile_t : asn::enumerated<3, 0, true>
+       {
+               static constexpr const char* name() {return "trafficProfile_t";}
+               using parent_t = asn::enumerated<3, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       single_packet
+                       ,dual_packets
+                       ,multiple_packets
+               } index_t;
+
+       };
+
+       trafficProfile_t& set_trafficProfile() { trafficProfile.setpresent(true); return trafficProfile;}
+       trafficProfile_t const* get_trafficProfile() const {return trafficProfile.is_valid() ? &trafficProfile : nullptr;}
+       struct batteryIndication_t : asn::enumerated<3, 0, true>
+       {
+               static constexpr const char* name() {return "batteryIndication_t";}
+               using parent_t = asn::enumerated<3, 0, true>;
+               static constexpr bool optional = true;
+               typedef enum {
+                       battery_powered
+                       ,battery_powered_not_rechargeable_or_replaceable
+                       ,not_battery_powered
+               } index_t;
+
+       };
+
+       batteryIndication_t& set_batteryIndication() { batteryIndication.setpresent(true); return batteryIndication;}
+       batteryIndication_t const* get_batteryIndication() const {return batteryIndication.is_valid() ? &batteryIndication : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<Subscription_Based_UE_DifferentiationInfo_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<Subscription_Based_UE_DifferentiationInfo_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(periodicCommunicationIndicator);
+               v(periodicTime);
+               v(scheduledCommunicationTime);
+               v(stationaryIndication);
+               v(trafficProfile);
+               v(batteryIndication);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(periodicCommunicationIndicator);
+               v(periodicTime);
+               v(scheduledCommunicationTime);
+               v(stationaryIndication);
+               v(trafficProfile);
+               v(batteryIndication);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               periodicCommunicationIndicator.clear();
+               periodicTime.clear();
+               scheduledCommunicationTime.clear();
+               stationaryIndication.clear();
+               trafficProfile.clear();
+               batteryIndication.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       periodicCommunicationIndicator_t        periodicCommunicationIndicator;
+       periodicTime_t  periodicTime;
+       scheduledCommunicationTime_t    scheduledCommunicationTime;
+       stationaryIndication_t  stationaryIndication;
+       trafficProfile_t        trafficProfile;
+       batteryIndication_t     batteryIndication;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TargetCellInUTRAN ::= OCTET STRING -- This IE is to be encoded according to the UTRAN Cell ID in the Last Visited UTRAN Cell Information IE in TS 25.413 [24]
+*/
+
+struct TargetCellInUTRAN : asn::ostring<>
+{
+       static constexpr const char* name() {return "TargetCellInUTRAN";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+TargeteNBtoSource-eNBTransparentContainer      ::= OCTET STRING
+*/
+
+struct TargeteNBtoSource_eNBTransparentContainer : asn::ostring<>
+{
+       static constexpr const char* name() {return "TargeteNBtoSource-eNBTransparentContainer";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+TimeToWait ::= ENUMERATED {
+       v1s,
+       v2s,
+       v5s,
+       v10s,
+       v20s,
+       v60s,
+       ...
+}
+*/
+
+struct TimeToWait : asn::enumerated<6, 0, true>
+{
+       static constexpr const char* name() {return "TimeToWait";}
+       using parent_t = asn::enumerated<6, 0, true>;
+       typedef enum {
+               v1s
+               ,v2s
+               ,v5s
+               ,v10s
+               ,v20s
+               ,v60s
+       } index_t;
+
+};
+
+/*
+TraceDepth             ::= ENUMERATED {
+       minimum,
+       medium,
+       maximum,
+       minimumWithoutVendorSpecificExtension,
+       mediumWithoutVendorSpecificExtension,
+       maximumWithoutVendorSpecificExtension,
+       ...
+}
+*/
+
+struct TraceDepth : asn::enumerated<6, 0, true>
+{
+       static constexpr const char* name() {return "TraceDepth";}
+       using parent_t = asn::enumerated<6, 0, true>;
+       typedef enum {
+               minimum
+               ,medium
+               ,maximum
+               ,minimumWithoutVendorSpecificExtension
+               ,mediumWithoutVendorSpecificExtension
+               ,maximumWithoutVendorSpecificExtension
+       } index_t;
+
+};
+
+/*
+TraceCollectionEntityIPAddress ::= BIT STRING (SIZE(1..160, ...))
+*/
+
+struct TraceCollectionEntityIPAddress : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 160>>;
+       static constexpr const char* name() {return "TraceCollectionEntityIPAddress";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+UEAppLayerMeasConfig-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       {ID id-serviceType      CRITICALITY ignore      EXTENSION ServiceType   PRESENCE optional},
+       ...
+}
+*/
+
+struct UEAppLayerMeasConfig_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_serviceType() { set(id_serviceType); type=1;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_serviceType)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_serviceType);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_serviceType() { set(ignore); type=1;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               ServiceType& select_id_serviceType() { return set<ServiceType>(1); }
+               ServiceType const* get_id_serviceType() const { return get<ServiceType>(1); }
+               bool is_unknown() const { return type == 2; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<ServiceType>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<ServiceType>(1);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_serviceType()); return true;
+                       case 2: if(type != 2) {clear(); asn::base::set();} type = 2; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<ServiceType>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(ServiceType)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 2; }
+               void clear() {type = 0;}
+               void select_id_serviceType() { set(optional); type=1;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else { type = 2; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UEAppLayerMeasConfig ::= SEQUENCE {
+       containerForAppLayerMeasConfig                  OCTET STRING (SIZE(1..1000)),
+       areaScopeOfQMC          AreaScopeOfQMC,
+       iE-Extensions           ProtocolExtensionContainer { {UEAppLayerMeasConfig-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UEAppLayerMeasConfig : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "UEAppLayerMeasConfig";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct containerForAppLayerMeasConfig_t : asn::ostring<>
+       {
+               using constraint_t = asn::constraints<false,asn::span<1, 1000>>;
+               static constexpr const char* name() {return "containerForAppLayerMeasConfig_t";}
+               using parent_t = asn::ostring<>;
+
+       };
+
+       containerForAppLayerMeasConfig_t& ref_containerForAppLayerMeasConfig() {return containerForAppLayerMeasConfig;}
+       containerForAppLayerMeasConfig_t const& ref_containerForAppLayerMeasConfig() const {return containerForAppLayerMeasConfig;}
+       struct areaScopeOfQMC_t : AreaScopeOfQMC
+       {
+               static constexpr const char* name() {return "areaScopeOfQMC_t";}
+               using parent_t = AreaScopeOfQMC;
+
+       };
+       areaScopeOfQMC_t& ref_areaScopeOfQMC() {return areaScopeOfQMC;}
+       areaScopeOfQMC_t const& ref_areaScopeOfQMC() const {return areaScopeOfQMC;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UEAppLayerMeasConfig_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UEAppLayerMeasConfig_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(containerForAppLayerMeasConfig);
+               v(areaScopeOfQMC);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(containerForAppLayerMeasConfig);
+               v(areaScopeOfQMC);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               containerForAppLayerMeasConfig.clear();
+               areaScopeOfQMC.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       containerForAppLayerMeasConfig_t        containerForAppLayerMeasConfig;
+       areaScopeOfQMC_t        areaScopeOfQMC;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+TraceActivation-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-MDTConfiguration                        CRITICALITY ignore      EXTENSION MDT-Configuration                     PRESENCE optional}|
+       { ID id-UEAppLayerMeasConfig            CRITICALITY ignore      EXTENSION UEAppLayerMeasConfig          PRESENCE optional},
+       ...
+}
+*/
+
+struct TraceActivation_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_MDTConfiguration() { set(id_MDTConfiguration); type=1;}
+               void select_id_UEAppLayerMeasConfig() { set(id_UEAppLayerMeasConfig); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_MDTConfiguration)) { type = 1; return true; }
+                       else if(equal(id_UEAppLayerMeasConfig)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_MDTConfiguration);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_UEAppLayerMeasConfig);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_MDTConfiguration() { set(ignore); type=1;}
+               void select_id_UEAppLayerMeasConfig() { set(ignore); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               MDT_Configuration& select_id_MDTConfiguration() { return set<MDT_Configuration>(1); }
+               MDT_Configuration const* get_id_MDTConfiguration() const { return get<MDT_Configuration>(1); }
+               UEAppLayerMeasConfig& select_id_UEAppLayerMeasConfig() { return set<UEAppLayerMeasConfig>(2); }
+               UEAppLayerMeasConfig const* get_id_UEAppLayerMeasConfig() const { return get<UEAppLayerMeasConfig>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<MDT_Configuration>(); break;
+                       case 2: var.destroy<UEAppLayerMeasConfig>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<MDT_Configuration>(1);
+                       v.template operator()<UEAppLayerMeasConfig>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_MDTConfiguration()); return true;
+                       case 2: v(select_id_UEAppLayerMeasConfig()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<MDT_Configuration>()); return true;
+                       case 2: v(var.as<UEAppLayerMeasConfig>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(MDT_Configuration)];
+                       char dummy2[sizeof(UEAppLayerMeasConfig)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_MDTConfiguration() { set(optional); type=1;}
+               void select_id_UEAppLayerMeasConfig() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TraceActivation ::= SEQUENCE {
+       eUTRANTraceID                                   EUTRANTraceID,
+       interfacesToTrace                               InterfacesToTrace,
+traceDepth                                                     TraceDepth,
+traceCollectionEntityIPAddress         TraceCollectionEntityIPAddress,
+       iE-Extensions                                   ProtocolExtensionContainer { {TraceActivation-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TraceActivation : asn::sequence<5, 0, true, 1>
+{
+       static constexpr const char* name() {return "TraceActivation";}
+       using parent_t = asn::sequence<5, 0, true, 1>;
+       struct eUTRANTraceID_t : EUTRANTraceID
+       {
+               static constexpr const char* name() {return "eUTRANTraceID_t";}
+               using parent_t = EUTRANTraceID;
+
+       };
+       eUTRANTraceID_t& ref_eUTRANTraceID() {return eUTRANTraceID;}
+       eUTRANTraceID_t const& ref_eUTRANTraceID() const {return eUTRANTraceID;}
+       struct interfacesToTrace_t : InterfacesToTrace
+       {
+               static constexpr const char* name() {return "interfacesToTrace_t";}
+               using parent_t = InterfacesToTrace;
+
+       };
+       interfacesToTrace_t& ref_interfacesToTrace() {return interfacesToTrace;}
+       interfacesToTrace_t const& ref_interfacesToTrace() const {return interfacesToTrace;}
+       struct traceDepth_t : TraceDepth
+       {
+               static constexpr const char* name() {return "traceDepth_t";}
+               using parent_t = TraceDepth;
+
+       };
+       traceDepth_t& ref_traceDepth() {return traceDepth;}
+       traceDepth_t const& ref_traceDepth() const {return traceDepth;}
+       struct traceCollectionEntityIPAddress_t : TraceCollectionEntityIPAddress
+       {
+               static constexpr const char* name() {return "traceCollectionEntityIPAddress_t";}
+               using parent_t = TraceCollectionEntityIPAddress;
+
+       };
+       traceCollectionEntityIPAddress_t& ref_traceCollectionEntityIPAddress() {return traceCollectionEntityIPAddress;}
+       traceCollectionEntityIPAddress_t const& ref_traceCollectionEntityIPAddress() const {return traceCollectionEntityIPAddress;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<TraceActivation_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<TraceActivation_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(eUTRANTraceID);
+               v(interfacesToTrace);
+               v(traceDepth);
+               v(traceCollectionEntityIPAddress);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(eUTRANTraceID);
+               v(interfacesToTrace);
+               v(traceDepth);
+               v(traceCollectionEntityIPAddress);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               eUTRANTraceID.clear();
+               interfacesToTrace.clear();
+               traceDepth.clear();
+               traceCollectionEntityIPAddress.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       eUTRANTraceID_t eUTRANTraceID;
+       interfacesToTrace_t     interfacesToTrace;
+       traceDepth_t    traceDepth;
+       traceCollectionEntityIPAddress_t        traceCollectionEntityIPAddress;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+Tunnel-Information-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct Tunnel_Information_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+TunnelInformation ::= SEQUENCE {
+       transportLayerAddress   TransportLayerAddress,
+       uDP-Port-Number                 Port-Number                     OPTIONAL,
+       iE-Extensions                   ProtocolExtensionContainer { {Tunnel-Information-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct TunnelInformation : asn::sequence<3, 0, true, 2>
+{
+       static constexpr const char* name() {return "TunnelInformation";}
+       using parent_t = asn::sequence<3, 0, true, 2>;
+       struct transportLayerAddress_t : TransportLayerAddress
+       {
+               static constexpr const char* name() {return "transportLayerAddress_t";}
+               using parent_t = TransportLayerAddress;
+
+       };
+       transportLayerAddress_t& ref_transportLayerAddress() {return transportLayerAddress;}
+       transportLayerAddress_t const& ref_transportLayerAddress() const {return transportLayerAddress;}
+       struct uDP_Port_Number_t : Port_Number
+       {
+               static constexpr const char* name() {return "uDP_Port_Number_t";}
+               using parent_t = Port_Number;
+               static constexpr bool optional = true;
+
+       };
+       uDP_Port_Number_t& set_uDP_Port_Number() { uDP_Port_Number.setpresent(true); return uDP_Port_Number;}
+       uDP_Port_Number_t const* get_uDP_Port_Number() const {return uDP_Port_Number.is_valid() ? &uDP_Port_Number : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<Tunnel_Information_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<Tunnel_Information_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(transportLayerAddress);
+               v(uDP_Port_Number);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(transportLayerAddress);
+               v(uDP_Port_Number);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               transportLayerAddress.clear();
+               uDP_Port_Number.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       transportLayerAddress_t transportLayerAddress;
+       uDP_Port_Number_t       uDP_Port_Number;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UE-ContextKeptIndicator ::= ENUMERATED {
+       true,
+       ...
+}
+*/
+
+struct UE_ContextKeptIndicator : asn::enumerated<1, 0, true>
+{
+       static constexpr const char* name() {return "UE-ContextKeptIndicator";}
+       using parent_t = asn::enumerated<1, 0, true>;
+       typedef enum {
+               True
+       } index_t;
+
+};
+
+/*
+UE-HistoryInformation ::= SEQUENCE (SIZE(1..maxnoofCells)) OF LastVisitedCell-Item
+*/
+
+struct UE_HistoryInformation_elm : LastVisitedCell_Item
+{
+       static constexpr const char* name() {return "UE_HistoryInformation_elm";}
+       using parent_t = LastVisitedCell_Item;
+
+};
+struct UE_HistoryInformation : asn::sequenceof<UE_HistoryInformation_elm>
+{
+       static constexpr const char* name() {return "UE-HistoryInformation";}
+       using parent_t = asn::sequenceof<UE_HistoryInformation_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxnoofCells >>;
+
+};
+/*
+UE-HistoryInformationFromTheUE ::= OCTET STRING
+*/
+
+struct UE_HistoryInformationFromTheUE : asn::ostring<>
+{
+       static constexpr const char* name() {return "UE-HistoryInformationFromTheUE";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+UE-RLF-Report-Container::= OCTET STRING
+*/
+
+struct UE_RLF_Report_Container : asn::ostring<>
+{
+       static constexpr const char* name() {return "UE-RLF-Report-Container";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+UE-RLF-Report-Container-for-extended-bands ::= OCTET STRING
+*/
+
+struct UE_RLF_Report_Container_for_extended_bands : asn::ostring<>
+{
+       static constexpr const char* name() {return "UE-RLF-Report-Container-for-extended-bands";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+UE-S1AP-ID ::= INTEGER (0.. 4294967295)
+*/
+
+struct UE_S1AP_ID : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 4294967295>>;
+       static constexpr const char* name() {return "UE-S1AP-ID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UE-Sidelink-Aggregate-MaximumBitRate-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UE_Sidelink_Aggregate_MaximumBitRate_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UE-X2AP-ID ::= INTEGER (0..4095)
+*/
+
+struct UE_X2AP_ID : asn::integer<>
+{
+       using constraint_t = asn::constraints<false,asn::span<0, 4095>>;
+       static constexpr const char* name() {return "UE-X2AP-ID";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UE-X2AP-ID-Extension ::= INTEGER (0..4095, ...)
+*/
+
+struct UE_X2AP_ID_Extension : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<0, 4095>>;
+       static constexpr const char* name() {return "UE-X2AP-ID-Extension";}
+       using parent_t = asn::integer<>;
+
+};
+
+/*
+UEAggregate-MaximumBitrate-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       { ID id-extended-uEaggregateMaximumBitRateDownlink      CRITICALITY ignore      EXTENSION ExtendedBitRate       PRESENCE optional}|
+       { ID id-extended-uEaggregateMaximumBitRateUplink        CRITICALITY ignore      EXTENSION ExtendedBitRate       PRESENCE optional},
+       ...
+}
+*/
+
+struct UEAggregate_MaximumBitrate_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_extended_uEaggregateMaximumBitRateDownlink() { set(id_extended_uEaggregateMaximumBitRateDownlink); type=1;}
+               void select_id_extended_uEaggregateMaximumBitRateUplink() { set(id_extended_uEaggregateMaximumBitRateUplink); type=2;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(id_extended_uEaggregateMaximumBitRateDownlink)) { type = 1; return true; }
+                       else if(equal(id_extended_uEaggregateMaximumBitRateUplink)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(id_extended_uEaggregateMaximumBitRateDownlink);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(id_extended_uEaggregateMaximumBitRateUplink);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_extended_uEaggregateMaximumBitRateDownlink() { set(ignore); type=1;}
+               void select_id_extended_uEaggregateMaximumBitRateUplink() { set(ignore); type=2;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(ignore)) { type = 1; return true; }
+                       else if(equal(ignore)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(ignore);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               ExtendedBitRate& select_id_extended_uEaggregateMaximumBitRateDownlink() { return set<ExtendedBitRate>(1); }
+               ExtendedBitRate const* get_id_extended_uEaggregateMaximumBitRateDownlink() const { return get<ExtendedBitRate>(1); }
+               ExtendedBitRate& select_id_extended_uEaggregateMaximumBitRateUplink() { return set<ExtendedBitRate>(2); }
+               ExtendedBitRate const* get_id_extended_uEaggregateMaximumBitRateUplink() const { return get<ExtendedBitRate>(2); }
+               bool is_unknown() const { return type == 3; }
+               void clear()
+               {
+                       switch(type)
+                       {
+                       case 1: var.destroy<ExtendedBitRate>(); break;
+                       case 2: var.destroy<ExtendedBitRate>(); break;
+                       }
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+                       v.template operator()<ExtendedBitRate>(1);
+                       v.template operator()<ExtendedBitRate>(2);
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: v(select_id_extended_uEaggregateMaximumBitRateDownlink()); return true;
+                       case 2: v(select_id_extended_uEaggregateMaximumBitRateUplink()); return true;
+                       case 3: if(type != 3) {clear(); asn::base::set();} type = 3; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       switch(type)
+                       {
+                       case 1: v(var.as<ExtendedBitRate>()); return true;
+                       case 2: v(var.as<ExtendedBitRate>()); return true;
+                       }
+                       return false;
+
+               }
+               private:
+               template<class T> T& set(size_t index) {if(type != index) {clear(); type = index; return var.build<T>();} return var.as<T>();}
+               template<class T> T const* get(size_t index) const {if(type == index) {return &var.as<T>();} return nullptr;}
+               union union_type
+               {
+                       char dummy1[sizeof(ExtendedBitRate)];
+
+               };
+               asn::variant<sizeof(union_type)> var;
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 3; }
+               void clear() {type = 0;}
+               void select_id_extended_uEaggregateMaximumBitRateDownlink() { set(optional); type=1;}
+               void select_id_extended_uEaggregateMaximumBitRateUplink() { set(optional); type=2;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       if(equal(optional)) { type = 1; return true; }
+                       else if(equal(optional)) { type = 2; return true; }
+                       else { type = 3; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 2: type = 2; if(v(ref_nested())) { return equal(optional);} return false;
+                       case 3: type = 3; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UEAggregateMaximumBitRate ::= SEQUENCE {
+       uEaggregateMaximumBitRateDownlink       BitRate,
+       uEaggregateMaximumBitRateUplink         BitRate,
+       iE-Extensions                                           ProtocolExtensionContainer { {UEAggregate-MaximumBitrate-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UEAggregateMaximumBitRate : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "UEAggregateMaximumBitRate";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct uEaggregateMaximumBitRateDownlink_t : BitRate
+       {
+               static constexpr const char* name() {return "uEaggregateMaximumBitRateDownlink_t";}
+               using parent_t = BitRate;
+
+       };
+       uEaggregateMaximumBitRateDownlink_t& ref_uEaggregateMaximumBitRateDownlink() {return uEaggregateMaximumBitRateDownlink;}
+       uEaggregateMaximumBitRateDownlink_t const& ref_uEaggregateMaximumBitRateDownlink() const {return uEaggregateMaximumBitRateDownlink;}
+       struct uEaggregateMaximumBitRateUplink_t : BitRate
+       {
+               static constexpr const char* name() {return "uEaggregateMaximumBitRateUplink_t";}
+               using parent_t = BitRate;
+
+       };
+       uEaggregateMaximumBitRateUplink_t& ref_uEaggregateMaximumBitRateUplink() {return uEaggregateMaximumBitRateUplink;}
+       uEaggregateMaximumBitRateUplink_t const& ref_uEaggregateMaximumBitRateUplink() const {return uEaggregateMaximumBitRateUplink;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UEAggregate_MaximumBitrate_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UEAggregate_MaximumBitrate_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uEaggregateMaximumBitRateDownlink);
+               v(uEaggregateMaximumBitRateUplink);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uEaggregateMaximumBitRateDownlink);
+               v(uEaggregateMaximumBitRateUplink);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uEaggregateMaximumBitRateDownlink.clear();
+               uEaggregateMaximumBitRateUplink.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uEaggregateMaximumBitRateDownlink_t     uEaggregateMaximumBitRateDownlink;
+       uEaggregateMaximumBitRateUplink_t       uEaggregateMaximumBitRateUplink;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UENRMeasurement-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UENRMeasurement_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UENRMeasurement ::= SEQUENCE {
+       uENRMeasurements                        RRCContainer,
+       iE-Extensions                   ProtocolExtensionContainer { {UENRMeasurement-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UENRMeasurement : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "UENRMeasurement";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct uENRMeasurements_t : RRCContainer
+       {
+               static constexpr const char* name() {return "uENRMeasurements_t";}
+               using parent_t = RRCContainer;
+
+       };
+       uENRMeasurements_t& ref_uENRMeasurements() {return uENRMeasurements;}
+       uENRMeasurements_t const& ref_uENRMeasurements() const {return uENRMeasurements;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UENRMeasurement_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UENRMeasurement_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uENRMeasurements);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uENRMeasurements);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uENRMeasurements.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uENRMeasurements_t      uENRMeasurements;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UESecurityCapabilities-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UESecurityCapabilities_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UESecurityCapabilities ::= SEQUENCE {
+       encryptionAlgorithms                            EncryptionAlgorithms,
+       integrityProtectionAlgorithms           IntegrityProtectionAlgorithms,
+       iE-Extensions                                           ProtocolExtensionContainer { {UESecurityCapabilities-ExtIEs} }          OPTIONAL,
+...
+}
+*/
+
+struct UESecurityCapabilities : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "UESecurityCapabilities";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct encryptionAlgorithms_t : EncryptionAlgorithms
+       {
+               static constexpr const char* name() {return "encryptionAlgorithms_t";}
+               using parent_t = EncryptionAlgorithms;
+
+       };
+       encryptionAlgorithms_t& ref_encryptionAlgorithms() {return encryptionAlgorithms;}
+       encryptionAlgorithms_t const& ref_encryptionAlgorithms() const {return encryptionAlgorithms;}
+       struct integrityProtectionAlgorithms_t : IntegrityProtectionAlgorithms
+       {
+               static constexpr const char* name() {return "integrityProtectionAlgorithms_t";}
+               using parent_t = IntegrityProtectionAlgorithms;
+
+       };
+       integrityProtectionAlgorithms_t& ref_integrityProtectionAlgorithms() {return integrityProtectionAlgorithms;}
+       integrityProtectionAlgorithms_t const& ref_integrityProtectionAlgorithms() const {return integrityProtectionAlgorithms;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UESecurityCapabilities_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UESecurityCapabilities_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(encryptionAlgorithms);
+               v(integrityProtectionAlgorithms);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(encryptionAlgorithms);
+               v(integrityProtectionAlgorithms);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               encryptionAlgorithms.clear();
+               integrityProtectionAlgorithms.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       encryptionAlgorithms_t  encryptionAlgorithms;
+       integrityProtectionAlgorithms_t integrityProtectionAlgorithms;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UESidelinkAggregateMaximumBitRate ::= SEQUENCE {
+       uESidelinkAggregateMaximumBitRate               BitRate,
+       iE-Extensions                                   ProtocolExtensionContainer { {UE-Sidelink-Aggregate-MaximumBitRate-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UESidelinkAggregateMaximumBitRate : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "UESidelinkAggregateMaximumBitRate";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct uESidelinkAggregateMaximumBitRate_t : BitRate
+       {
+               static constexpr const char* name() {return "uESidelinkAggregateMaximumBitRate_t";}
+               using parent_t = BitRate;
+
+       };
+       uESidelinkAggregateMaximumBitRate_t& ref_uESidelinkAggregateMaximumBitRate() {return uESidelinkAggregateMaximumBitRate;}
+       uESidelinkAggregateMaximumBitRate_t const& ref_uESidelinkAggregateMaximumBitRate() const {return uESidelinkAggregateMaximumBitRate;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UE_Sidelink_Aggregate_MaximumBitRate_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UE_Sidelink_Aggregate_MaximumBitRate_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uESidelinkAggregateMaximumBitRate);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uESidelinkAggregateMaximumBitRate);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uESidelinkAggregateMaximumBitRate.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uESidelinkAggregateMaximumBitRate_t     uESidelinkAggregateMaximumBitRate;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UEsToBeResetList-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UEsToBeResetList_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UEsToBeResetList-Item::= SEQUENCE {
+       meNB-ID                                 UE-X2AP-ID,
+       meNB-ID-ext                             UE-X2AP-ID-Extension                                                                                                            OPTIONAL,
+       sgNB-ID                                 SgNB-UE-X2AP-ID                                                                                                                         OPTIONAL,
+       iE-Extensions                   ProtocolExtensionContainer { {UEsToBeResetList-Item-ExtIEs} }                           OPTIONAL,
+       ...
+}
+*/
+
+struct UEsToBeResetList_Item : asn::sequence<4, 0, true, 3>
+{
+       static constexpr const char* name() {return "UEsToBeResetList-Item";}
+       using parent_t = asn::sequence<4, 0, true, 3>;
+       struct meNB_ID_t : UE_X2AP_ID
+       {
+               static constexpr const char* name() {return "meNB_ID_t";}
+               using parent_t = UE_X2AP_ID;
+
+       };
+       meNB_ID_t& ref_meNB_ID() {return meNB_ID;}
+       meNB_ID_t const& ref_meNB_ID() const {return meNB_ID;}
+       struct meNB_ID_ext_t : UE_X2AP_ID_Extension
+       {
+               static constexpr const char* name() {return "meNB_ID_ext_t";}
+               using parent_t = UE_X2AP_ID_Extension;
+               static constexpr bool optional = true;
+
+       };
+       meNB_ID_ext_t& set_meNB_ID_ext() { meNB_ID_ext.setpresent(true); return meNB_ID_ext;}
+       meNB_ID_ext_t const* get_meNB_ID_ext() const {return meNB_ID_ext.is_valid() ? &meNB_ID_ext : nullptr;}
+       struct sgNB_ID_t : SgNB_UE_X2AP_ID
+       {
+               static constexpr const char* name() {return "sgNB_ID_t";}
+               using parent_t = SgNB_UE_X2AP_ID;
+               static constexpr bool optional = true;
+
+       };
+       sgNB_ID_t& set_sgNB_ID() { sgNB_ID.setpresent(true); return sgNB_ID;}
+       sgNB_ID_t const* get_sgNB_ID() const {return sgNB_ID.is_valid() ? &sgNB_ID : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UEsToBeResetList_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UEsToBeResetList_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(meNB_ID);
+               v(meNB_ID_ext);
+               v(sgNB_ID);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(meNB_ID);
+               v(meNB_ID_ext);
+               v(sgNB_ID);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               meNB_ID.clear();
+               meNB_ID_ext.clear();
+               sgNB_ID.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       meNB_ID_t       meNB_ID;
+       meNB_ID_ext_t   meNB_ID_ext;
+       sgNB_ID_t       sgNB_ID;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UEsToBeResetList ::= SEQUENCE (SIZE (1.. maxUEsinengNBDU)) OF UEsToBeResetList-Item
+*/
+
+struct UEsToBeResetList_elm : UEsToBeResetList_Item
+{
+       static constexpr const char* name() {return "UEsToBeResetList_elm";}
+       using parent_t = UEsToBeResetList_Item;
+
+};
+struct UEsToBeResetList : asn::sequenceof<UEsToBeResetList_elm>
+{
+       static constexpr const char* name() {return "UEsToBeResetList";}
+       using parent_t = asn::sequenceof<UEsToBeResetList_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxUEsinengNBDU >>;
+
+};
+/*
+UL-HighInterferenceIndication ::= BIT STRING (SIZE(1..110, ...))
+*/
+
+struct UL_HighInterferenceIndication : asn::bstring<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 110>>;
+       static constexpr const char* name() {return "UL-HighInterferenceIndication";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+UL-HighInterferenceIndicationInfo-Item-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct UL_HighInterferenceIndicationInfo_Item_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+UL-HighInterferenceIndicationInfo-Item ::= SEQUENCE {
+       target-Cell-ID                                  ECGI,
+       ul-interferenceindication               UL-HighInterferenceIndication,
+       iE-Extensions                                   ProtocolExtensionContainer { {UL-HighInterferenceIndicationInfo-Item-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct UL_HighInterferenceIndicationInfo_Item : asn::sequence<3, 0, true, 1>
+{
+       static constexpr const char* name() {return "UL-HighInterferenceIndicationInfo-Item";}
+       using parent_t = asn::sequence<3, 0, true, 1>;
+       struct target_Cell_ID_t : ECGI
+       {
+               static constexpr const char* name() {return "target_Cell_ID_t";}
+               using parent_t = ECGI;
+
+       };
+       target_Cell_ID_t& ref_target_Cell_ID() {return target_Cell_ID;}
+       target_Cell_ID_t const& ref_target_Cell_ID() const {return target_Cell_ID;}
+       struct ul_interferenceindication_t : UL_HighInterferenceIndication
+       {
+               static constexpr const char* name() {return "ul_interferenceindication_t";}
+               using parent_t = UL_HighInterferenceIndication;
+
+       };
+       ul_interferenceindication_t& ref_ul_interferenceindication() {return ul_interferenceindication;}
+       ul_interferenceindication_t const& ref_ul_interferenceindication() const {return ul_interferenceindication;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<UL_HighInterferenceIndicationInfo_Item_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<UL_HighInterferenceIndicationInfo_Item_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(target_Cell_ID);
+               v(ul_interferenceindication);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(target_Cell_ID);
+               v(ul_interferenceindication);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               target_Cell_ID.clear();
+               ul_interferenceindication.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       target_Cell_ID_t        target_Cell_ID;
+       ul_interferenceindication_t     ul_interferenceindication;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+UL-HighInterferenceIndicationInfo ::= SEQUENCE (SIZE(1..maxCellineNB)) OF UL-HighInterferenceIndicationInfo-Item
+*/
+
+struct UL_HighInterferenceIndicationInfo_elm : UL_HighInterferenceIndicationInfo_Item
+{
+       static constexpr const char* name() {return "UL_HighInterferenceIndicationInfo_elm";}
+       using parent_t = UL_HighInterferenceIndicationInfo_Item;
+
+};
+struct UL_HighInterferenceIndicationInfo : asn::sequenceof<UL_HighInterferenceIndicationInfo_elm>
+{
+       static constexpr const char* name() {return "UL-HighInterferenceIndicationInfo";}
+       using parent_t = asn::sequenceof<UL_HighInterferenceIndicationInfo_elm>;
+       using constraint_t = asn::constraints<false,asn::span<1,  maxCellineNB >>;
+
+};
+/*
+UL-UE-Configuration::= ENUMERATED { no-data, shared, only, ... }
+*/
+
+struct UL_UE_Configuration : asn::enumerated<3, 0, true>
+{
+       static constexpr const char* name() {return "UL-UE-Configuration";}
+       using parent_t = asn::enumerated<3, 0, true>;
+       typedef enum {
+               no_data
+               ,shared
+               ,only
+       } index_t;
+
+};
+
+/*
+ULConfiguration-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct ULConfiguration_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+ULConfiguration::= SEQUENCE {
+       uL-PDCP                 UL-UE-Configuration,
+       iE-Extensions                                   ProtocolExtensionContainer { {ULConfiguration-ExtIEs} } OPTIONAL,
+       ...
+}
+*/
+
+struct ULConfiguration : asn::sequence<2, 0, true, 1>
+{
+       static constexpr const char* name() {return "ULConfiguration";}
+       using parent_t = asn::sequence<2, 0, true, 1>;
+       struct uL_PDCP_t : UL_UE_Configuration
+       {
+               static constexpr const char* name() {return "uL_PDCP_t";}
+               using parent_t = UL_UE_Configuration;
+
+       };
+       uL_PDCP_t& ref_uL_PDCP() {return uL_PDCP;}
+       uL_PDCP_t const& ref_uL_PDCP() const {return uL_PDCP;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<ULConfiguration_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<ULConfiguration_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(uL_PDCP);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(uL_PDCP);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               uL_PDCP.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       uL_PDCP_t       uL_PDCP;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+VehicleUE ::= ENUMERATED {
+       authorized,
+       not-authorized,
+       ...
+}
+*/
+
+struct VehicleUE : asn::enumerated<2, 0, true>
+{
+       static constexpr const char* name() {return "VehicleUE";}
+       using parent_t = asn::enumerated<2, 0, true>;
+       typedef enum {
+               authorized
+               ,not_authorized
+       } index_t;
+
+};
+
+/*
+V2XServicesAuthorized-ExtIEs X2AP-PROTOCOL-EXTENSION ::= {
+       ...
+}
+*/
+
+struct V2XServicesAuthorized_ExtIEs
+{
+       struct id_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::id_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::id_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct criticality_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::criticality_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::criticality_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct Extension_t : asn::typefield<true>
+       {
+               ~Extension_t()  {clear();}
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear()
+               {
+                       type = 0; ref_nested().clear();
+               }
+               template<typename V> static inline void enumerate(V& v)
+               {
+
+               }
+               protected:
+               template<typename V> bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: if(type != 1) {clear(); asn::base::set();} type = 1; return true;
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) return false;
+                       return false;
+
+               }
+               private:
+               size_t type {0};
+
+       };
+       struct presence_t : asn::fixedtypefield<X2AP_PROTOCOL_EXTENSION::presence_t, true>
+       {
+               size_t get_index() const {return type;}
+               bool is_unknown() const { return type == 1; }
+               void clear() {type = 0;}
+               X2AP_PROTOCOL_EXTENSION::presence_t const& ref_value() const {return ref_nested();}
+               template<typename V>  bool decode(V& v)
+               {
+                       clear();
+                       if(!v(ref_nested())) return false;
+                       { type = 1; return true;}
+                       return false;
+
+               }
+               template<typename V> bool encode(V& v) const
+               {
+                       return v(ref_nested());
+
+               }
+               protected:
+               template<typename V>  bool decode(size_t index, V& v)
+               {
+                       clear();
+                       switch(index)
+                       {
+                       case 1: type = 1; return v(ref_nested());
+                       ref_nested().clear();
+                       }
+                       return false;
+
+               }
+               template<typename V> bool encode(size_t index, V& v) const
+               {
+                       if(index != type) {return false;} return v(ref_nested());
+
+               }
+               private:
+               size_t type {0};
+
+       };
+
+};
+/*
+V2XServicesAuthorized ::= SEQUENCE {
+       vehicleUE                       VehicleUE                                                                                                               OPTIONAL,
+pedestrianUE                   PedestrianUE                                                                                                    OPTIONAL,
+       iE-Extensions           ProtocolExtensionContainer { {V2XServicesAuthorized-ExtIEs} }   OPTIONAL,
+       ...
+}
+*/
+
+struct V2XServicesAuthorized : asn::sequence<3, 0, true, 3>
+{
+       static constexpr const char* name() {return "V2XServicesAuthorized";}
+       using parent_t = asn::sequence<3, 0, true, 3>;
+       struct vehicleUE_t : VehicleUE
+       {
+               static constexpr const char* name() {return "vehicleUE_t";}
+               using parent_t = VehicleUE;
+               static constexpr bool optional = true;
+
+       };
+       vehicleUE_t& set_vehicleUE() { vehicleUE.setpresent(true); return vehicleUE;}
+       vehicleUE_t const* get_vehicleUE() const {return vehicleUE.is_valid() ? &vehicleUE : nullptr;}
+       struct pedestrianUE_t : PedestrianUE
+       {
+               static constexpr const char* name() {return "pedestrianUE_t";}
+               using parent_t = PedestrianUE;
+               static constexpr bool optional = true;
+
+       };
+       pedestrianUE_t& set_pedestrianUE() { pedestrianUE.setpresent(true); return pedestrianUE;}
+       pedestrianUE_t const* get_pedestrianUE() const {return pedestrianUE.is_valid() ? &pedestrianUE : nullptr;}
+       struct iE_Extensions_t : ProtocolExtensionContainer<V2XServicesAuthorized_ExtIEs>
+       {
+               static constexpr const char* name() {return "iE_Extensions_t";}
+               using parent_t = ProtocolExtensionContainer<V2XServicesAuthorized_ExtIEs>;
+               static constexpr bool optional = true;
+
+       };
+       iE_Extensions_t& set_iE_Extensions() { iE_Extensions.setpresent(true); return iE_Extensions;}
+       iE_Extensions_t const* get_iE_Extensions() const {return iE_Extensions.is_valid() ? &iE_Extensions : nullptr;}
+       template<typename V> void decode(V& v)
+       {
+               v(vehicleUE);
+               v(pedestrianUE);
+               v(iE_Extensions);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(vehicleUE);
+               v(pedestrianUE);
+               v(iE_Extensions);
+
+       };
+       void clear()
+       {
+               vehicleUE.clear();
+               pedestrianUE.clear();
+               iE_Extensions.clear();
+
+       };
+       private:
+       vehicleUE_t     vehicleUE;
+       pedestrianUE_t  pedestrianUE;
+       iE_Extensions_t iE_Extensions;
+
+};
+/*
+WT-UE-XwAP-ID ::= OCTET STRING (SIZE (3))
+*/
+
+struct WT_UE_XwAP_ID : asn::ostring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<3>>;
+       static constexpr const char* name() {return "WT-UE-XwAP-ID";}
+       using parent_t = asn::ostring<>;
+
+};
+
+/*
+WTID-Type1 ::= SEQUENCE {
+       pLMN-Identity                                   PLMN-Identity,
+       shortWTID                                               BIT STRING (SIZE(24)),
+       ...
+}
+*/
+
+struct WTID_Type1 : asn::sequence<2, 0, true, 0>
+{
+       static constexpr const char* name() {return "WTID-Type1";}
+       using parent_t = asn::sequence<2, 0, true, 0>;
+       struct pLMN_Identity_t : PLMN_Identity
+       {
+               static constexpr const char* name() {return "pLMN_Identity_t";}
+               using parent_t = PLMN_Identity;
+
+       };
+       pLMN_Identity_t& ref_pLMN_Identity() {return pLMN_Identity;}
+       pLMN_Identity_t const& ref_pLMN_Identity() const {return pLMN_Identity;}
+       struct shortWTID_t : asn::bstring<>
+       {
+               using constraint_t = asn::constraints<false,asn::one<24>>;
+               static constexpr const char* name() {return "shortWTID_t";}
+               using parent_t = asn::bstring<>;
+
+       };
+
+       shortWTID_t& ref_shortWTID() {return shortWTID;}
+       shortWTID_t const& ref_shortWTID() const {return shortWTID;}
+       template<typename V> void decode(V& v)
+       {
+               v(pLMN_Identity);
+               v(shortWTID);
+
+       };
+       template<typename V> void encode(V& v) const
+       {
+               v(pLMN_Identity);
+               v(shortWTID);
+
+       };
+       void clear()
+       {
+               pLMN_Identity.clear();
+               shortWTID.clear();
+
+       };
+       private:
+       pLMN_Identity_t pLMN_Identity;
+       shortWTID_t     shortWTID;
+
+};
+/*
+WTID-Long-Type2 ::= BIT STRING (SIZE(48))
+*/
+
+struct WTID_Long_Type2 : asn::bstring<>
+{
+       using constraint_t = asn::constraints<false,asn::one<48>>;
+       static constexpr const char* name() {return "WTID-Long-Type2";}
+       using parent_t = asn::bstring<>;
+
+};
+
+/*
+WTID ::= CHOICE {
+       wTID-Type1                      WTID-Type1,
+       wTID-Type2                      WTID-Long-Type2,
+       ...
+}
+*/
+
+struct WTID : asn::choice<2, 0, true>
+{
+       static constexpr const char* name() {return "WTID";}
+       using parent_t = asn::choice<2, 0, true>;
+       index_type get_index() const {return index;}
+       bool is_unknown() const {return index == 3;}
+       void set_unknown() { set_index(3);  }
+       ~WTID() {clear();}
+       struct wTID_Type1_t : WTID_Type1
+       {
+               static constexpr const char* name() {return "wTID_Type1_t";}
+               using parent_t = WTID_Type1;
+
+       };
+       struct wTID_Type2_t : WTID_Long_Type2
+       {
+               static constexpr const char* name() {return "wTID_Type2_t";}
+               using parent_t = WTID_Long_Type2;
+
+       };
+       void clear()
+       {
+               switch(get_index())
+               {
+               case 1: var.destroy<wTID_Type1_t>(); break;
+               case 2: var.destroy<wTID_Type2_t>(); break;
+               }
+               index = 0;
+               base::clear();
+       }
+       template<typename V> bool decode(size_t idx, V& v)
+       {
+               clear();
+               switch(idx)
+               {
+               case 1: set_index(1); return v(var.build<wTID_Type1_t>());
+               case 2: set_index(2); return v(var.build<wTID_Type2_t>());
+               }
+               return false;
+
+       }
+       template<typename V> bool encode(V& v) const
+       {
+               switch(get_index())
+               {
+               case 1: return v(var.as<wTID_Type1_t>());
+               case 2: return v(var.as<wTID_Type2_t>());
+               }
+               return false;
+       }
+       template<typename V> static inline void enumerate(V& v)
+       {
+               v.template operator()<wTID_Type1_t>(1);
+               v.template operator()<wTID_Type2_t>(2);
+
+       }
+       wTID_Type1_t& select_wTID_Type1() { if(get_index() != 1) { clear(); set_index(1); return var.build<wTID_Type1_t>();} return var.as<wTID_Type1_t>();}
+       wTID_Type1_t const* get_wTID_Type1() const { if(get_index() == 1) { return &var.as<wTID_Type1_t>();} return nullptr; }
+       wTID_Type2_t& select_wTID_Type2() { if(get_index() != 2) { clear(); set_index(2); return var.build<wTID_Type2_t>();} return var.as<wTID_Type2_t>();}
+       wTID_Type2_t const* get_wTID_Type2() const { if(get_index() == 2) { return &var.as<wTID_Type2_t>();} return nullptr; }
+       private:
+       void set_index(index_type i) {index = i; base::set();}
+       union union_type
+       {
+               char dummy1[sizeof(wTID_Type1_t)];
+               char dummy2[sizeof(wTID_Type2_t)];
+
+       };
+       asn::variant<sizeof(union_type)>        var;
+       index_type      index {0};
+};
+/*
+X2BenefitValue ::= INTEGER (1..8, ...)
+*/
+
+struct X2BenefitValue : asn::integer<>
+{
+       using constraint_t = asn::constraints<true,asn::span<1, 8>>;
+       static constexpr const char* name() {return "X2BenefitValue";}
+       using parent_t = asn::integer<>;
+
+};