fix after UPER round-trip fuzz
diff --git a/skeletons/constr_SEQUENCE_oer.c b/skeletons/constr_SEQUENCE_oer.c
index 6138f1a..733a5f6 100644
--- a/skeletons/constr_SEQUENCE_oer.c
+++ b/skeletons/constr_SEQUENCE_oer.c
@@ -37,9 +37,15 @@
 /*
  * Check whether we are inside the extensions group.
  */
-#define IN_EXTENSION_GROUP(specs, memb_idx)     \
-        ( (((ssize_t)(memb_idx)) > (specs)->ext_after)     \
-        &&(((ssize_t)(memb_idx)) < (specs)->ext_before))
+#define IN_EXTENSION_GROUP(specs, memb_idx) \
+    ((specs)->first_extension >= 0          \
+     && (unsigned)(specs)->first_extension <= (memb_idx))
+
+#define IN_ROOT_GROUP_PRED(edx)                            \
+    edx < (specs->first_extension < 0 ? td->elements_count \
+                                      : (size_t)specs->first_extension)
+
+#define FOR_IN_ROOT_GROUP(edx) for(edx = 0; IN_ROOT_GROUP_PRED(edx); edx++)
 
 /*
  * Return a standardized complex structure.
@@ -117,7 +123,7 @@
          * Fetch preamble.
          */
         asn_bit_data_t *preamble;
-        int has_extensions_bit = (specs->ext_before >= 0);
+        int has_extensions_bit = (specs->first_extension >= 0);
         size_t preamble_bits = (has_extensions_bit + specs->roms_count);
         size_t preamble_bytes = ((7 + preamble_bits) >> 3);
 
@@ -146,26 +152,23 @@
         asn_bit_data_t *preamble = ctx->ptr;
         size_t edx;
 
-        ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 1", td->name);
+        ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 1 (Root)", td->name);
 
         assert(preamble);
 
-        for(edx = (ctx->step >> 1); edx < td->elements_count;
+        for(edx = (ctx->step >> 1); IN_ROOT_GROUP_PRED(edx);
             edx++, ctx->step = (ctx->step & ~1) + 2) {
             asn_TYPE_member_t *elm = &td->elements[edx];
 
             ASN_DEBUG("Decoding %s->%s", td->name, elm->name);
 
+            assert(!IN_EXTENSION_GROUP(specs, edx));
+
             if(ctx->step & 1) {
                 goto microphase2_decode_continues;
             }
 
 
-            if(IN_EXTENSION_GROUP(specs, edx)) {
-                /* Ignore non-root components in PHASE 1 */
-                break;
-            }
-
             if(elm->optional) {
                 int32_t present = asn_get_few_bits(preamble, 1);
                 if(present < 0) {
@@ -229,7 +232,7 @@
         /* Cleanup preamble. */
         asn_bit_data_t *preamble = ctx->ptr;
         asn_bit_data_t *extadds;
-        int has_extensions_bit = (specs->ext_before >= 0);
+        int has_extensions_bit = (specs->first_extension >= 0);
         int extensions_present =
             has_extensions_bit
             && (preamble->buffer == NULL
@@ -286,11 +289,13 @@
         ADVANCE(len);
     }
         NEXT_PHASE(ctx);
-        ctx->step = (specs->ext_after + 1);
+        ctx->step =
+            (specs->first_extension < 0 ? td->elements_count
+                                        : (size_t)specs->first_extension);
         /* Fall through */
     case 3:
-        ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 3", td->name);
-        for(; ctx->step < specs->ext_before - 1; ctx->step++) {
+        ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 3 (Extensions)", td->name);
+        for(; ctx->step < (signed)td->elements_count; ctx->step++) {
             asn_bit_data_t *extadds = ctx->ptr;
             size_t edx = ctx->step;
             asn_TYPE_member_t *elm = &td->elements[edx];
@@ -378,7 +383,7 @@
                     asn_app_consume_bytes_f *cb, void *app_key) {
     const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics;
     size_t computed_size = 0;
-    int has_extensions_bit = (specs->ext_before >= 0);
+    int has_extensions_bit = (specs->first_extension >= 0);
     size_t preamble_bits = (has_extensions_bit + specs->roms_count);
     uint32_t has_extensions = 0;
     size_t edx;
@@ -394,8 +399,7 @@
         preamble.op_key = app_key;
 
         if(has_extensions_bit) {
-            for(edx = specs->ext_after + 1;
-                (ssize_t)edx < specs->ext_before - 1; edx++) {
+            for(edx = specs->first_extension; edx < td->elements_count; edx++) {
                 asn_TYPE_member_t *elm = &td->elements[edx];
                 const void *memb_ptr = element_ptr(sptr, elm);
                 if(memb_ptr) {
@@ -419,7 +423,7 @@
          * Encode optional components bitmap.
          */
         if(specs->roms_count) {
-            for(edx = 0; edx < td->elements_count; edx++) {
+            FOR_IN_ROOT_GROUP(edx) {
                 asn_TYPE_member_t *elm = &td->elements[edx];
 
                 if(IN_EXTENSION_GROUP(specs, edx)) break;
@@ -507,8 +511,7 @@
         if(ret < 0) ASN__ENCODE_FAILED;
 
         /* Encode presence bitmap #16.4.3 */
-        for(edx = specs->ext_after + 1; (ssize_t)edx < specs->ext_before - 1;
-            edx++) {
+        for(edx = specs->first_extension; edx < td->elements_count; edx++) {
             asn_TYPE_member_t *elm = &td->elements[edx];
             const void *memb_ptr = element_ptr(sptr, elm);
             if(memb_ptr && elm->default_value_cmp
@@ -523,8 +526,7 @@
         computed_size += extadds.flushed_bytes;
 
         /* Now, encode extensions */
-        for(edx = specs->ext_after + 1; (ssize_t)edx < specs->ext_before - 1;
-            edx++) {
+        for(edx = specs->first_extension; edx < td->elements_count; edx++) {
             asn_TYPE_member_t *elm = &td->elements[edx];
             const void *memb_ptr = element_ptr(sptr, elm);