From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107040 invoked by alias); 11 Jul 2017 14:24:51 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 67048 invoked by uid 89); 11 Jul 2017 14:24:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-9.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_1,GIT_PATCH_2,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=sk:paul.ri, paul.richard.thomas@gmail.com, sk:paulri, paulrichardthomasgmailcom X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-yb0-f177.google.com Received: from mail-yb0-f177.google.com (HELO mail-yb0-f177.google.com) (209.85.213.177) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 11 Jul 2017 14:23:51 +0000 Received: by mail-yb0-f177.google.com with SMTP id 84so440574ybe.0; Tue, 11 Jul 2017 07:23:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=kWQZTQNzjZuCkKFv4h6hZ7GYqTPW9MUPtmWl59oZ1R4=; b=MIYnAKwImVpjj4VhUudvPwj3FLkhtokZ7bMyOzXfTJz3HCOgqUvYxdRugC7tzDXHke Yq1edcstmmb7T228eQAoNn7DaD+P+/BzqDR5fYGBP3Jtmo5RIEK42Z84qEtsFVyI/BY0 6kTl58V54eG2J+TWERxHZ5HRa/9LAtiVIyIch3DjoEMo0Ifvgd8mxW0NV8u0zRwkzy1L osFgJNhMzQ0aRX1eZ25ev+JPsKz8ScTSGqrYAF+gaLQ2EKJYesWYop/2H1PEjCdc9F8l W951m3YTTu+yVnqFyGGk+p36Krg5qL7FAuU6u4GtJyQZ1770KGINy8sYnMx+X5Cyn7cP O1Lg== X-Gm-Message-State: AIVw1109Haw6udIVXddQA6I7AVZTtP/1fC9PnCVLjMSsnY4tBJ85ir1f qKtk5BxQsVE87UagpjDxVgKJ/vYf5A== X-Received: by 10.37.6.66 with SMTP id 63mr7566ybg.106.1499783027511; Tue, 11 Jul 2017 07:23:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.13.203.200 with HTTP; Tue, 11 Jul 2017 07:23:46 -0700 (PDT) In-Reply-To: References: <36a479a8-e22b-f675-7f3d-b7324f872357@netcologne.de> From: Paul Richard Thomas Date: Tue, 11 Jul 2017 14:24:00 -0000 Message-ID: Subject: Re: [Patch, fortran] PR34640 - ICE when assigning item of a derived-component to a pointer To: Thomas Koenig Cc: "fortran@gcc.gnu.org" , gcc-patches , Damian Rouson , "Bader, Reinhold" Content-Type: multipart/mixed; boundary="001a113c3e0e98809e05540b725b" X-SW-Source: 2017-07/txt/msg00527.txt.bz2 --001a113c3e0e98809e05540b725b Content-Type: text/plain; charset="UTF-8" Content-length: 71469 Well, a bit earlier than anticipated, here is the final version that puts right all the wrinkles that I know about. Bootstraps and regtests - OK for trunk? Paul Index: gcc/fortran/expr.c =================================================================== *** gcc/fortran/expr.c (revision 250082) --- gcc/fortran/expr.c (working copy) *************** is_subref_array (gfc_expr * e) *** 984,989 **** --- 984,994 ---- if (e->symtree->n.sym->attr.subref_array_pointer) return true; + if (e->symtree->n.sym->ts.type == BT_CLASS + && e->symtree->n.sym->attr.dummy + && CLASS_DATA (e->symtree->n.sym)->attr.class_pointer) + return true; + seen_array = false; for (ref = e->ref; ref; ref = ref->next) { Index: gcc/fortran/trans-array.c =================================================================== *** gcc/fortran/trans-array.c (revision 250082) --- gcc/fortran/trans-array.c (working copy) *************** gfc_array_dataptr_type (tree desc) *** 125,132 **** #define DATA_FIELD 0 #define OFFSET_FIELD 1 #define DTYPE_FIELD 2 ! #define DIMENSION_FIELD 3 ! #define CAF_TOKEN_FIELD 4 #define STRIDE_SUBFIELD 0 #define LBOUND_SUBFIELD 1 --- 125,133 ---- #define DATA_FIELD 0 #define OFFSET_FIELD 1 #define DTYPE_FIELD 2 ! #define SPAN_FIELD 3 ! #define DIMENSION_FIELD 4 ! #define CAF_TOKEN_FIELD 5 #define STRIDE_SUBFIELD 0 #define LBOUND_SUBFIELD 1 *************** gfc_conv_descriptor_dtype (tree desc) *** 244,249 **** --- 245,280 ---- desc, field, NULL_TREE); } + static tree + gfc_conv_descriptor_span (tree desc) + { + tree type; + tree field; + + type = TREE_TYPE (desc); + gcc_assert (GFC_DESCRIPTOR_TYPE_P (type)); + + field = gfc_advance_chain (TYPE_FIELDS (type), SPAN_FIELD); + gcc_assert (field != NULL_TREE && TREE_TYPE (field) == gfc_array_index_type); + + return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field), + desc, field, NULL_TREE); + } + + tree + gfc_conv_descriptor_span_get (tree desc) + { + return gfc_conv_descriptor_span (desc); + } + + void + gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, + tree value) + { + tree t = gfc_conv_descriptor_span (desc); + gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); + } + tree gfc_conv_descriptor_rank (tree desc) *************** gfc_conv_shift_descriptor_lbound (stmtbl *** 466,476 **** --- 497,537 ---- } + /* Obtain offsets for trans-types.c(gfc_get_array_descr_info). */ + + void + gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, + tree *dtype_off, tree *dim_off, + tree *dim_size, tree *stride_suboff, + tree *lower_suboff, tree *upper_suboff) + { + tree field; + tree type; + + type = TYPE_MAIN_VARIANT (desc_type); + field = gfc_advance_chain (TYPE_FIELDS (type), OFFSET_FIELD); + *data_off = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), DTYPE_FIELD); + *dtype_off = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), DIMENSION_FIELD); + *dim_off = byte_position (field); + type = TREE_TYPE (TREE_TYPE (field)); + *dim_size = TYPE_SIZE_UNIT (type); + field = gfc_advance_chain (TYPE_FIELDS (type), STRIDE_SUBFIELD); + *stride_suboff = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), LBOUND_SUBFIELD); + *lower_suboff = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), UBOUND_SUBFIELD); + *upper_suboff = byte_position (field); + } + + /* Cleanup those #defines. */ #undef DATA_FIELD #undef OFFSET_FIELD #undef DTYPE_FIELD + #undef SPAN_FIELD #undef DIMENSION_FIELD #undef CAF_TOKEN_FIELD #undef STRIDE_SUBFIELD *************** gfc_add_ss_to_loop (gfc_loopinfo * loop, *** 720,725 **** --- 781,864 ---- } + /* Returns true if the expression is an array pointer. */ + + static bool + is_pointer_array (tree expr) + { + if (flag_openmp) + return false; + + if (expr == NULL_TREE + || !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (expr)) + || GFC_CLASS_TYPE_P (TREE_TYPE (expr))) + return false; + + if (TREE_CODE (expr) == VAR_DECL + && GFC_DECL_PTR_ARRAY_P (expr)) + return true; + + if (TREE_CODE (expr) == PARM_DECL + && GFC_DECL_PTR_ARRAY_P (expr)) + return true; + + if (TREE_CODE (expr) == INDIRECT_REF + && GFC_DECL_PTR_ARRAY_P (TREE_OPERAND (expr, 0))) + return true; + + /* The field declaration is marked as an pointer array. */ + if (TREE_CODE (expr) == COMPONENT_REF + && GFC_DECL_PTR_ARRAY_P (TREE_OPERAND (expr, 1)) + && !GFC_CLASS_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1)))) + return true; + + return false; + } + + + /* Return the span of an array. */ + + static tree + get_array_span (tree desc, gfc_expr *expr) + { + tree tmp; + + if (is_pointer_array (desc)) + /* This will have the span field set. */ + tmp = gfc_conv_descriptor_span_get (desc); + else if (TREE_CODE (desc) == COMPONENT_REF + && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)) + && GFC_CLASS_TYPE_P (TREE_TYPE (TREE_OPERAND (desc, 0)))) + { + /* The descriptor is a class _data field and so use the vtable + size for the receiving span field. */ + tmp = gfc_get_vptr_from_expr (desc); + tmp = gfc_vptr_size_get (tmp); + } + else if (expr && expr->expr_type == EXPR_VARIABLE + && expr->symtree->n.sym->ts.type == BT_CLASS + && expr->ref->type == REF_COMPONENT + && expr->ref->next->type == REF_ARRAY + && expr->ref->next->next == NULL + && CLASS_DATA (expr->symtree->n.sym)->attr.dimension) + { + /* Dummys come in sometimes with the descriptor detached from + the class field or declaration. */ + tmp = gfc_class_vptr_get (expr->symtree->n.sym->backend_decl); + tmp = gfc_vptr_size_get (tmp); + } + else + { + /* If none of the fancy stuff works, the span is the element + size of the array. */ + tmp = gfc_get_element_type (TREE_TYPE (desc)); + tmp = fold_convert (gfc_array_index_type, + size_in_bytes (tmp)); + } + return tmp; + } + + /* Generate an initializer for a static pointer or allocatable array. */ void *************** gfc_conv_scalarized_array_ref (gfc_se * *** 3239,3249 **** index = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, index, info->offset); ! if (expr && (is_subref_array (expr) || (expr->ts.deferred && (expr->expr_type == EXPR_VARIABLE || expr->expr_type == EXPR_FUNCTION)))) decl = expr->symtree->n.sym->backend_decl; tmp = build_fold_indirect_ref_loc (input_location, info->data); /* Use the vptr 'size' field to access a class the element of a class --- 3378,3407 ---- index = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, index, info->offset); ! if (expr && ((is_subref_array (expr) ! && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (info->descriptor))) || (expr->ts.deferred && (expr->expr_type == EXPR_VARIABLE || expr->expr_type == EXPR_FUNCTION)))) decl = expr->symtree->n.sym->backend_decl; + /* A pointer array component can be detected from its field decl. Fix + the descriptor, mark the resulting variable decl and pass it to + gfc_build_array_ref. */ + if (is_pointer_array (info->descriptor)) + { + if (TREE_CODE (info->descriptor) == COMPONENT_REF) + { + decl = gfc_evaluate_now (info->descriptor, &se->pre); + GFC_DECL_PTR_ARRAY_P (decl) = 1; + TREE_USED (decl) = 1; + } + else if (TREE_CODE (info->descriptor) == INDIRECT_REF) + decl = TREE_OPERAND (info->descriptor, 0); + + if (decl == NULL_TREE) + decl = info->descriptor; + } + tmp = build_fold_indirect_ref_loc (input_location, info->data); /* Use the vptr 'size' field to access a class the element of a class *************** build_array_ref (tree desc, tree offset, *** 3288,3332 **** { tree tmp; tree type; ! tree cdecl; ! bool classarray = false; /* For class arrays the class declaration is stored in the saved descriptor. */ if (INDIRECT_REF_P (desc) && DECL_LANG_SPECIFIC (TREE_OPERAND (desc, 0)) && GFC_DECL_SAVED_DESCRIPTOR (TREE_OPERAND (desc, 0))) ! cdecl = gfc_class_data_get (GFC_DECL_SAVED_DESCRIPTOR ( TREE_OPERAND (desc, 0))); else ! cdecl = desc; /* Class container types do not always have the GFC_CLASS_TYPE_P but the canonical type does. */ ! if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (cdecl)) ! && TREE_CODE (cdecl) == COMPONENT_REF) { ! type = TREE_TYPE (TREE_OPERAND (cdecl, 0)); if (TYPE_CANONICAL (type) && GFC_CLASS_TYPE_P (TYPE_CANONICAL (type))) ! { ! type = TREE_TYPE (desc); ! classarray = true; ! } ! } ! else ! type = NULL; ! ! /* Class array references need special treatment because the assigned ! type size needs to be used to point to the element. */ ! if (classarray) ! { ! type = gfc_get_element_type (type); ! tmp = TREE_OPERAND (cdecl, 0); ! tmp = gfc_get_class_array_ref (offset, tmp, NULL_TREE); ! tmp = fold_convert (build_pointer_type (type), tmp); ! tmp = build_fold_indirect_ref_loc (input_location, tmp); ! return tmp; } tmp = gfc_conv_array_data (desc); --- 3446,3472 ---- { tree tmp; tree type; ! tree cdesc; /* For class arrays the class declaration is stored in the saved descriptor. */ if (INDIRECT_REF_P (desc) && DECL_LANG_SPECIFIC (TREE_OPERAND (desc, 0)) && GFC_DECL_SAVED_DESCRIPTOR (TREE_OPERAND (desc, 0))) ! cdesc = gfc_class_data_get (GFC_DECL_SAVED_DESCRIPTOR ( TREE_OPERAND (desc, 0))); else ! cdesc = desc; /* Class container types do not always have the GFC_CLASS_TYPE_P but the canonical type does. */ ! if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (cdesc)) ! && TREE_CODE (cdesc) == COMPONENT_REF) { ! type = TREE_TYPE (TREE_OPERAND (cdesc, 0)); if (TYPE_CANONICAL (type) && GFC_CLASS_TYPE_P (TYPE_CANONICAL (type))) ! vptr = gfc_class_vptr_get (TREE_OPERAND (cdesc, 0)); } tmp = gfc_conv_array_data (desc); *************** gfc_conv_array_ref (gfc_se * se, gfc_arr *** 3350,3355 **** --- 3490,3496 ---- tree offset, cst_offset; tree tmp; tree stride; + tree decl = NULL_TREE; gfc_se indexse; gfc_se tmpse; gfc_symbol * sym = expr->symtree->n.sym; *************** gfc_conv_array_ref (gfc_se * se, gfc_arr *** 3494,3501 **** offset = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, offset, cst_offset); ! se->expr = build_array_ref (se->expr, offset, sym->ts.type == BT_CLASS ? ! NULL_TREE : sym->backend_decl, se->class_vptr); } --- 3635,3665 ---- offset = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, offset, cst_offset); ! /* A pointer array component can be detected from its field decl. Fix ! the descriptor, mark the resulting variable decl and pass it to ! build_array_ref. */ ! if (!expr->ts.deferred && !sym->attr.codimension ! && is_pointer_array (se->expr)) ! { ! if (TREE_CODE (se->expr) == COMPONENT_REF) ! { ! decl = gfc_evaluate_now (se->expr, &se->pre); ! GFC_DECL_PTR_ARRAY_P (decl) = 1; ! TREE_USED (decl) = 1; ! } ! else if (TREE_CODE (se->expr) == INDIRECT_REF) ! decl = TREE_OPERAND (se->expr, 0); ! else ! decl = se->expr; ! } ! else if (expr->ts.deferred ! || (sym->ts.type == BT_CHARACTER ! && sym->attr.select_type_temporary)) ! decl = sym->backend_decl; ! else if (sym->ts.type == BT_CLASS) ! decl = NULL_TREE; ! ! se->expr = build_array_ref (se->expr, offset, decl, se->class_vptr); } *************** gfc_array_allocate (gfc_se * se, gfc_exp *** 5648,5653 **** --- 5812,5830 ---- if (dimension) gfc_conv_descriptor_offset_set (&set_descriptor_block, se->expr, offset); + /* Pointer arrays need the span field to be set. */ + if (is_pointer_array (se->expr) + || (expr->ts.type == BT_CLASS + && CLASS_DATA (expr)->attr.class_pointer)) + { + if (expr3 && expr3_elem_size != NULL_TREE) + tmp = expr3_elem_size; + else + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (se->expr))); + tmp = fold_convert (gfc_array_index_type, tmp); + gfc_conv_descriptor_span_set (&set_descriptor_block, se->expr, tmp); + } + set_descriptor = gfc_finish_block (&set_descriptor_block); if (status != NULL_TREE) { *************** gfc_conv_expr_descriptor (gfc_se *se, gf *** 6851,6856 **** --- 7028,7037 ---- /* Add any offsets from subreferences. */ gfc_get_dataptr_offset (&se->pre, se->expr, desc, NULL_TREE, subref_array_target, expr); + + /* ....and set the span field. */ + tmp = get_array_span (desc, expr); + gfc_conv_descriptor_span_set (&se->pre, se->expr, tmp); } else if (se->want_pointer) { *************** gfc_conv_expr_descriptor (gfc_se *se, gf *** 6886,6893 **** --- 7067,7084 ---- se->ss = ss; else gcc_assert (se->ss == ss); + + if (!is_pointer_array (se->expr)) + { + tmp = gfc_get_element_type (TREE_TYPE (se->expr)); + tmp = fold_convert (gfc_array_index_type, + size_in_bytes (tmp)); + gfc_conv_descriptor_span_set (&se->pre, se->expr, tmp); + } + se->expr = gfc_build_addr_expr (NULL_TREE, se->expr); gfc_conv_expr (se, expr); + gfc_free_ss_chain (ss); return; } *************** gfc_conv_expr_descriptor (gfc_se *se, gf *** 7107,7115 **** desc = info->descriptor; if (se->direct_byref && !se->byref_noassign) { ! /* For pointer assignments we fill in the destination. */ parm = se->expr; parmtype = TREE_TYPE (parm); } else { --- 7298,7310 ---- desc = info->descriptor; if (se->direct_byref && !se->byref_noassign) { ! /* For pointer assignments we fill in the destination.... */ parm = se->expr; parmtype = TREE_TYPE (parm); + + /* ....and set the span field. */ + tmp = get_array_span (desc, expr); + gfc_conv_descriptor_span_set (&loop.pre, parm, tmp); } else { *************** gfc_conv_array_parameter (gfc_se * se, g *** 7582,7587 **** --- 7777,7783 ---- /* Every other type of array. */ se->want_pointer = 1; gfc_conv_expr_descriptor (se, expr); + if (size) array_parameter_size (build_fold_indirect_ref_loc (input_location, se->expr), Index: gcc/fortran/trans-array.h =================================================================== *** gcc/fortran/trans-array.h (revision 250082) --- gcc/fortran/trans-array.h (working copy) *************** tree gfc_conv_array_ubound (tree, int); *** 152,160 **** --- 152,164 ---- void gfc_trans_array_cobounds (tree, stmtblock_t *, const gfc_symbol *); /* Build expressions for accessing components of an array descriptor. */ + void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, tree *, + tree *, tree *, tree *); + tree gfc_conv_descriptor_data_get (tree); tree gfc_conv_descriptor_data_addr (tree); tree gfc_conv_descriptor_offset_get (tree); + tree gfc_conv_descriptor_span_get (tree); tree gfc_conv_descriptor_dtype (tree); tree gfc_conv_descriptor_rank (tree); tree gfc_get_descriptor_dimension (tree); *************** tree gfc_conv_descriptor_token (tree); *** 165,170 **** --- 169,175 ---- void gfc_conv_descriptor_data_set (stmtblock_t *, tree, tree); void gfc_conv_descriptor_offset_set (stmtblock_t *, tree, tree); + void gfc_conv_descriptor_span_set (stmtblock_t *, tree, tree); void gfc_conv_descriptor_stride_set (stmtblock_t *, tree, tree, tree); void gfc_conv_descriptor_lbound_set (stmtblock_t *, tree, tree, tree); void gfc_conv_descriptor_ubound_set (stmtblock_t *, tree, tree, tree); Index: gcc/fortran/trans-decl.c =================================================================== *** gcc/fortran/trans-decl.c (revision 250082) --- gcc/fortran/trans-decl.c (working copy) *************** gfc_get_symbol_decl (gfc_symbol * sym) *** 1517,1522 **** --- 1517,1525 ---- /* Dummy variables should already have been created. */ gcc_assert (sym->backend_decl); + if (sym->attr.pointer && sym->attr.dimension && sym->ts.type != BT_CLASS) + GFC_DECL_PTR_ARRAY_P (sym->backend_decl) = 1; + /* Create a character length variable. */ if (sym->ts.type == BT_CHARACTER) { *************** gfc_get_symbol_decl (gfc_symbol * sym) *** 1751,1777 **** if (sym->ts.type == BT_CHARACTER) /* Character variables need special handling. */ gfc_allocate_lang_decl (decl); - else if (sym->attr.subref_array_pointer) - /* We need the span for these beasts. */ - gfc_allocate_lang_decl (decl); ! if (sym->attr.subref_array_pointer) ! { ! tree span; ! GFC_DECL_SUBREF_ARRAY_P (decl) = 1; ! span = build_decl (input_location, ! VAR_DECL, create_tmp_var_name ("span"), ! gfc_array_index_type); ! gfc_finish_var_decl (span, sym); ! TREE_STATIC (span) = TREE_STATIC (decl); ! DECL_ARTIFICIAL (span) = 1; ! GFC_DECL_SPAN (decl) = span; ! GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span; ! } if (sym->ts.type == BT_CLASS) ! GFC_DECL_CLASS(decl) = 1; sym->backend_decl = decl; --- 1754,1771 ---- if (sym->ts.type == BT_CHARACTER) /* Character variables need special handling. */ gfc_allocate_lang_decl (decl); ! if (sym->assoc && sym->attr.subref_array_pointer) ! sym->attr.pointer = 1; ! if (sym->attr.pointer && sym->attr.dimension ! && !sym->ts.deferred ! && !(sym->attr.select_type_temporary ! && !sym->attr.subref_array_pointer)) ! GFC_DECL_PTR_ARRAY_P (decl) = 1; if (sym->ts.type == BT_CLASS) ! GFC_DECL_CLASS(decl) = 1; sym->backend_decl = decl; *************** gfc_trans_deferred_vars (gfc_symbol * pr *** 4269,4281 **** if (sym->assoc) continue; ! if (sym->attr.subref_array_pointer ! && GFC_DECL_SPAN (sym->backend_decl) ! && !TREE_STATIC (GFC_DECL_SPAN (sym->backend_decl))) { gfc_init_block (&tmpblock); ! gfc_add_modify (&tmpblock, GFC_DECL_SPAN (sym->backend_decl), ! build_int_cst (gfc_array_index_type, 0)); gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE); } --- 4263,4277 ---- if (sym->assoc) continue; ! if (sym->attr.pointer && sym->attr.dimension ! && !sym->attr.use_assoc ! && !sym->attr.host_assoc ! && !sym->attr.dummy ! && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (sym->backend_decl))) { gfc_init_block (&tmpblock); ! gfc_conv_descriptor_span_set (&tmpblock, sym->backend_decl, ! build_int_cst (gfc_array_index_type, 0)); gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE); } Index: gcc/fortran/trans-expr.c =================================================================== *** gcc/fortran/trans-expr.c (revision 250082) --- gcc/fortran/trans-expr.c (working copy) *************** gfc_conv_procedure_call (gfc_se * se, gf *** 5413,5419 **** } if (e->expr_type == EXPR_VARIABLE ! && is_subref_array (e)) /* The actual argument is a component reference to an array of derived types. In this case, the argument is converted to a temporary, which is passed and then --- 5413,5420 ---- } if (e->expr_type == EXPR_VARIABLE ! && is_subref_array (e) ! && !(fsym && fsym->attr.pointer)) /* The actual argument is a component reference to an array of derived types. In this case, the argument is converted to a temporary, which is passed and then *************** gfc_trans_pointer_assignment (gfc_expr * *** 8223,8229 **** stmtblock_t block; tree desc; tree tmp; - tree decl; bool scalar, non_proc_pointer_assign; gfc_ss *ss; --- 8224,8229 ---- *************** gfc_trans_pointer_assignment (gfc_expr * *** 8412,8441 **** gfc_conv_expr_descriptor (&lse, expr2); strlen_rhs = lse.string_length; ! /* If this is a subreference array pointer assignment, use the rhs ! descriptor element size for the lhs span. */ ! if (expr1->symtree->n.sym->attr.subref_array_pointer) ! { ! decl = expr1->symtree->n.sym->backend_decl; ! gfc_init_se (&rse, NULL); ! rse.descriptor_only = 1; ! gfc_conv_expr (&rse, expr2); ! if (expr1->ts.type == BT_CLASS) ! trans_class_vptr_len_assignment (&block, expr1, expr2, &rse, ! NULL, NULL); ! tmp = gfc_get_element_type (TREE_TYPE (rse.expr)); ! tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp)); ! if (!INTEGER_CST_P (tmp)) ! gfc_add_block_to_block (&lse.post, &rse.pre); ! gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp); ! } ! else if (expr1->ts.type == BT_CLASS) { rse.expr = NULL_TREE; rse.string_length = NULL_TREE; trans_class_vptr_len_assignment (&block, expr1, expr2, &rse, NULL, NULL); } } else if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS) { --- 8412,8435 ---- gfc_conv_expr_descriptor (&lse, expr2); strlen_rhs = lse.string_length; ! if (expr1->ts.type == BT_CLASS) { rse.expr = NULL_TREE; rse.string_length = NULL_TREE; trans_class_vptr_len_assignment (&block, expr1, expr2, &rse, NULL, NULL); } + + if (remap == NULL) + { + /* Is the target a whole array? If not, remap will + be non-null. */ + for (remap = expr2->ref; remap; remap = remap->next) + if (remap->type == REF_ARRAY + && remap->u.ar.type == AR_FULL + && remap->next) + break; + } } else if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS) { *************** gfc_trans_pointer_assignment (gfc_expr * *** 8446,8452 **** { rse.expr = gfc_class_data_get (rse.expr); gfc_add_modify (&lse.pre, desc, rse.expr); ! } else { expr1_vptr = trans_class_vptr_len_assignment (&block, expr1, --- 8440,8451 ---- { rse.expr = gfc_class_data_get (rse.expr); gfc_add_modify (&lse.pre, desc, rse.expr); ! /* Set the lhs span. */ ! tmp = TREE_TYPE (rse.expr); ! tmp = TYPE_SIZE_UNIT (gfc_get_element_type (tmp)); ! tmp = fold_convert (gfc_array_index_type, tmp); ! gfc_conv_descriptor_span_set (&lse.pre, desc, tmp); ! } else { expr1_vptr = trans_class_vptr_len_assignment (&block, expr1, *************** gfc_trans_pointer_assignment (gfc_expr * *** 8492,8498 **** converted in rse and now have to build the correct LHS descriptor for it. */ ! tree dtype, data; tree offs, stride; tree lbound, ubound; --- 8491,8497 ---- converted in rse and now have to build the correct LHS descriptor for it. */ ! tree dtype, data, span; tree offs, stride; tree lbound, ubound; *************** gfc_trans_pointer_assignment (gfc_expr * *** 8505,8510 **** --- 8504,8521 ---- data = gfc_conv_descriptor_data_get (rse.expr); gfc_conv_descriptor_data_set (&block, desc, data); + /* Copy the span. */ + if (TREE_CODE (rse.expr) == VAR_DECL + && GFC_DECL_PTR_ARRAY_P (rse.expr)) + span = gfc_conv_descriptor_span_get (rse.expr); + else + { + tmp = TREE_TYPE (rse.expr); + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (tmp)); + span = fold_convert (gfc_array_index_type, tmp); + } + gfc_conv_descriptor_span_set (&block, desc, span); + /* Copy offset but adjust it such that it would correspond to a lbound of zero. */ offs = gfc_conv_descriptor_offset_get (rse.expr); *************** gfc_trans_pointer_assignment (gfc_expr * *** 8586,8597 **** { gfc_se lbound_se; - gcc_assert (remap->u.ar.start[dim]); gcc_assert (!remap->u.ar.end[dim]); gfc_init_se (&lbound_se, NULL); ! gfc_conv_expr (&lbound_se, remap->u.ar.start[dim]); ! ! gfc_add_block_to_block (&block, &lbound_se.pre); gfc_conv_shift_descriptor_lbound (&block, desc, dim, lbound_se.expr); gfc_add_block_to_block (&block, &lbound_se.post); --- 8597,8611 ---- { gfc_se lbound_se; gcc_assert (!remap->u.ar.end[dim]); gfc_init_se (&lbound_se, NULL); ! if (remap->u.ar.start[dim]) ! { ! gfc_conv_expr (&lbound_se, remap->u.ar.start[dim]); ! gfc_add_block_to_block (&block, &lbound_se.pre); ! } ! else ! lbound_se.expr = gfc_index_one_node; gfc_conv_shift_descriptor_lbound (&block, desc, dim, lbound_se.expr); gfc_add_block_to_block (&block, &lbound_se.post); Index: gcc/fortran/trans-intrinsic.c =================================================================== *** gcc/fortran/trans-intrinsic.c (revision 250082) --- gcc/fortran/trans-intrinsic.c (working copy) *************** conv_expr_ref_to_caf_ref (stmtblock_t *b *** 1225,1234 **** && ref->u.c.component->attr.dimension) { tree arr_desc_token_offset; ! /* Get the token from the descriptor. */ ! arr_desc_token_offset = gfc_advance_chain ( ! TYPE_FIELDS (TREE_TYPE (ref->u.c.component->backend_decl)), ! 4 /* CAF_TOKEN_FIELD */); arr_desc_token_offset = compute_component_offset (arr_desc_token_offset, TREE_TYPE (tmp)); --- 1225,1233 ---- && ref->u.c.component->attr.dimension) { tree arr_desc_token_offset; ! /* Get the token field from the descriptor. */ ! arr_desc_token_offset = TREE_OPERAND ( ! gfc_conv_descriptor_token (ref->u.c.component->backend_decl), 1); arr_desc_token_offset = compute_component_offset (arr_desc_token_offset, TREE_TYPE (tmp)); *************** conv_isocbinding_subroutine (gfc_code *c *** 8129,8134 **** --- 8128,8138 ---- gfc_add_block_to_block (&block, &fptrse.pre); desc = fptrse.expr; + /* Set the span field. */ + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc))); + tmp = fold_convert (gfc_array_index_type, tmp); + gfc_conv_descriptor_span_set (&block, desc, tmp); + /* Set data value, dtype, and offset. */ tmp = GFC_TYPE_ARRAY_DATAPTR_TYPE (TREE_TYPE (desc)); gfc_conv_descriptor_data_set (&block, desc, fold_convert (tmp, cptrse.expr)); Index: gcc/fortran/trans-io.c =================================================================== *** gcc/fortran/trans-io.c (revision 250082) --- gcc/fortran/trans-io.c (working copy) *************** gfc_trans_transfer (gfc_code * code) *** 2563,2568 **** --- 2563,2574 ---- gcc_assert (ref && ref->type == REF_ARRAY); } + if (expr->ts.type != BT_CLASS + && expr->expr_type == EXPR_VARIABLE + && gfc_expr_attr (expr).pointer) + goto scalarize; + + if (!(gfc_bt_struct (expr->ts.type) || expr->ts.type == BT_CLASS) && ref && ref->next == NULL *************** gfc_trans_transfer (gfc_code * code) *** 2597,2602 **** --- 2603,2609 ---- goto finish_block_label; } + scalarize: /* Initialize the scalarizer. */ ss = gfc_walk_expr (expr); gfc_init_loopinfo (&loop); *************** gfc_trans_transfer (gfc_code * code) *** 2612,2618 **** --- 2619,2627 ---- gfc_copy_loopinfo_to_se (&se, &loop); se.ss = ss; + gfc_conv_expr_reference (&se, expr); + if (expr->ts.type == BT_CLASS) vptr = gfc_get_vptr_from_expr (ss->info->data.array.descriptor); else Index: gcc/fortran/trans-stmt.c =================================================================== *** gcc/fortran/trans-stmt.c (revision 250082) --- gcc/fortran/trans-stmt.c (working copy) *************** trans_associate_var (gfc_symbol *sym, gf *** 1606,1612 **** : e->symtree->n.sym->backend_decl; tmp = gfc_get_element_type (TREE_TYPE (tmp)); tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp)); ! gfc_add_modify (&se.pre, GFC_DECL_SPAN(desc), tmp); } /* Done, register stuff as init / cleanup code. */ --- 1606,1612 ---- : e->symtree->n.sym->backend_decl; tmp = gfc_get_element_type (TREE_TYPE (tmp)); tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp)); ! gfc_conv_descriptor_span_set (&se.pre, desc, tmp); } /* Done, register stuff as init / cleanup code. */ Index: gcc/fortran/trans-types.c =================================================================== *** gcc/fortran/trans-types.c (revision 250082) --- gcc/fortran/trans-types.c (working copy) *************** along with GCC; see the file COPYING3. *** 35,40 **** --- 35,41 ---- #include "toplev.h" /* For rest_of_decl_compilation. */ #include "trans-types.h" #include "trans-const.h" + #include "trans-array.h" #include "dwarf2out.h" /* For struct array_descr_info. */ *************** gfc_get_array_descriptor_base (int dimen *** 1782,1787 **** --- 1783,1794 ---- gfc_array_index_type, &chain); TREE_NO_WARNING (decl) = 1; + /* Add the span component. */ + decl = gfc_add_field_to_struct_1 (fat_type, + get_identifier ("span"), + gfc_array_index_type, &chain); + TREE_NO_WARNING (decl) = 1; + /* Build the array type for the stride and bound components. */ if (dimen + codimen > 0) { *************** gfc_get_derived_type (gfc_symbol * deriv *** 2708,2713 **** --- 2715,2725 ---- if (!c->backend_decl) c->backend_decl = field; + if (c->attr.pointer && c->attr.dimension + && !(c->ts.type == BT_DERIVED + && strcmp (c->name, "_data") == 0)) + GFC_DECL_PTR_ARRAY_P (c->backend_decl) = 1; + /* Do not add a caf_token field for classes' data components. */ if (codimen && !c->attr.dimension && !c->attr.codimension && (c->attr.allocatable || c->attr.pointer) *************** gfc_get_array_descr_info (const_tree typ *** 3146,3152 **** { int rank, dim; bool indirect = false; ! tree etype, ptype, field, t, base_decl; tree data_off, dim_off, dtype_off, dim_size, elem_size; tree lower_suboff, upper_suboff, stride_suboff; --- 3158,3164 ---- { int rank, dim; bool indirect = false; ! tree etype, ptype, t, base_decl; tree data_off, dim_off, dtype_off, dim_size, elem_size; tree lower_suboff, upper_suboff, stride_suboff; *************** gfc_get_array_descr_info (const_tree typ *** 3203,3226 **** if (indirect) base_decl = build1 (INDIRECT_REF, ptype, base_decl); ! if (GFC_TYPE_ARRAY_SPAN (type)) ! elem_size = GFC_TYPE_ARRAY_SPAN (type); ! else ! elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); ! field = TYPE_FIELDS (TYPE_MAIN_VARIANT (type)); ! data_off = byte_position (field); ! field = DECL_CHAIN (field); ! field = DECL_CHAIN (field); ! dtype_off = byte_position (field); ! field = DECL_CHAIN (field); ! dim_off = byte_position (field); ! dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (field))); ! field = TYPE_FIELDS (TREE_TYPE (TREE_TYPE (field))); ! stride_suboff = byte_position (field); ! field = DECL_CHAIN (field); ! lower_suboff = byte_position (field); ! field = DECL_CHAIN (field); ! upper_suboff = byte_position (field); t = base_decl; if (!integer_zerop (data_off)) --- 3215,3225 ---- if (indirect) base_decl = build1 (INDIRECT_REF, ptype, base_decl); ! elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); ! ! gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &dim_off, ! &dim_size, &stride_suboff, ! &lower_suboff, &upper_suboff); t = base_decl; if (!integer_zerop (data_off)) Index: gcc/fortran/trans.c =================================================================== *** gcc/fortran/trans.c (revision 250082) --- gcc/fortran/trans.c (working copy) *************** gfc_build_addr_expr (tree type, tree t) *** 305,310 **** --- 305,371 ---- } + static tree + get_array_span (tree type, tree decl) + { + tree span; + + /* Return the span for deferred character length array references. */ + if (type && TREE_CODE (type) == ARRAY_TYPE + && TYPE_MAXVAL (TYPE_DOMAIN (type)) != NULL_TREE + && (VAR_P (TYPE_MAXVAL (TYPE_DOMAIN (type))) + || TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == INDIRECT_REF) + && (TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == INDIRECT_REF + || TREE_CODE (decl) == FUNCTION_DECL + || DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (type))) + == DECL_CONTEXT (decl))) + { + span = TYPE_MAXVAL (TYPE_DOMAIN (type)); + span = fold_convert (gfc_array_index_type, span); + } + /* Likewise for class array or pointer array references. */ + else if (TREE_CODE (decl) == FIELD_DECL + || VAR_OR_FUNCTION_DECL_P (decl) + || TREE_CODE (decl) == PARM_DECL) + { + if (GFC_DECL_CLASS (decl)) + { + /* When a temporary is in place for the class array, then the + original class' declaration is stored in the saved + descriptor. */ + if (DECL_LANG_SPECIFIC (decl) && GFC_DECL_SAVED_DESCRIPTOR (decl)) + decl = GFC_DECL_SAVED_DESCRIPTOR (decl); + else + { + /* Allow for dummy arguments and other good things. */ + if (POINTER_TYPE_P (TREE_TYPE (decl))) + decl = build_fold_indirect_ref_loc (input_location, decl); + + /* Check if '_data' is an array descriptor. If it is not, + the array must be one of the components of the class + object, so return a null span. */ + if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE ( + gfc_class_data_get (decl)))) + return NULL_TREE; + } + span = gfc_class_vtab_size_get (decl); + } + else if (GFC_DECL_PTR_ARRAY_P (decl)) + { + if (TREE_CODE (decl) == PARM_DECL) + decl = build_fold_indirect_ref_loc (input_location, decl); + span = gfc_conv_descriptor_span_get (decl); + } + else + span = NULL_TREE; + } + else + span = NULL_TREE; + + return span; + } + + /* Build an ARRAY_REF with its natural type. */ tree *************** gfc_build_array_ref (tree base, tree off *** 312,318 **** { tree type = TREE_TYPE (base); tree tmp; ! tree span; if (GFC_ARRAY_TYPE_P (type) && GFC_TYPE_ARRAY_RANK (type) == 0) { --- 373,379 ---- { tree type = TREE_TYPE (base); tree tmp; ! tree span = NULL_TREE; if (GFC_ARRAY_TYPE_P (type) && GFC_TYPE_ARRAY_RANK (type) == 0) { *************** gfc_build_array_ref (tree base, tree off *** 331,407 **** type = TREE_TYPE (type); - /* Use pointer arithmetic for deferred character length array - references. */ - if (type && TREE_CODE (type) == ARRAY_TYPE - && TYPE_MAXVAL (TYPE_DOMAIN (type)) != NULL_TREE - && (VAR_P (TYPE_MAXVAL (TYPE_DOMAIN (type))) - || TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == INDIRECT_REF) - && decl - && (TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == INDIRECT_REF - || TREE_CODE (decl) == FUNCTION_DECL - || DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (type))) - == DECL_CONTEXT (decl))) - span = TYPE_MAXVAL (TYPE_DOMAIN (type)); - else - span = NULL_TREE; - if (DECL_P (base)) TREE_ADDRESSABLE (base) = 1; /* Strip NON_LVALUE_EXPR nodes. */ STRIP_TYPE_NOPS (offset); ! /* If the array reference is to a pointer, whose target contains a ! subreference, use the span that is stored with the backend decl ! and reference the element with pointer arithmetic. */ ! if ((decl && (TREE_CODE (decl) == FIELD_DECL ! || VAR_OR_FUNCTION_DECL_P (decl) ! || TREE_CODE (decl) == PARM_DECL) ! && ((GFC_DECL_SUBREF_ARRAY_P (decl) ! && !integer_zerop (GFC_DECL_SPAN (decl))) ! || GFC_DECL_CLASS (decl) ! || span != NULL_TREE)) ! || vptr != NULL_TREE) { - if (decl) - { - if (GFC_DECL_CLASS (decl)) - { - /* When a temporary is in place for the class array, then the - original class' declaration is stored in the saved - descriptor. */ - if (DECL_LANG_SPECIFIC (decl) && GFC_DECL_SAVED_DESCRIPTOR (decl)) - decl = GFC_DECL_SAVED_DESCRIPTOR (decl); - else - { - /* Allow for dummy arguments and other good things. */ - if (POINTER_TYPE_P (TREE_TYPE (decl))) - decl = build_fold_indirect_ref_loc (input_location, decl); - - /* Check if '_data' is an array descriptor. If it is not, - the array must be one of the components of the class - object, so return a normal array reference. */ - if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE ( - gfc_class_data_get (decl)))) - return build4_loc (input_location, ARRAY_REF, type, base, - offset, NULL_TREE, NULL_TREE); - } - - span = gfc_class_vtab_size_get (decl); - } - else if (GFC_DECL_SUBREF_ARRAY_P (decl)) - span = GFC_DECL_SPAN (decl); - else if (span) - span = fold_convert (gfc_array_index_type, span); - else - gcc_unreachable (); - } - else if (vptr) - span = gfc_vptr_size_get (vptr); - else - gcc_unreachable (); - offset = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, offset, span); --- 392,414 ---- type = TREE_TYPE (type); if (DECL_P (base)) TREE_ADDRESSABLE (base) = 1; /* Strip NON_LVALUE_EXPR nodes. */ STRIP_TYPE_NOPS (offset); ! /* If decl or vptr are non-null, pointer arithmetic for the array reference ! is likely. Generate the 'span' for the array reference. */ ! if (vptr) ! span = gfc_vptr_size_get (vptr); ! else if (decl) ! span = get_array_span (type, decl); ! ! /* If a non-null span has been generated reference the element with ! pointer arithmetic. */ ! if (span != NULL_TREE) { offset = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, offset, span); *************** gfc_build_array_ref (tree base, tree off *** 412,419 **** tmp = build_fold_indirect_ref_loc (input_location, tmp); return tmp; } else - /* Otherwise use a straightforward array reference. */ return build4_loc (input_location, ARRAY_REF, type, base, offset, NULL_TREE, NULL_TREE); } --- 419,426 ---- tmp = build_fold_indirect_ref_loc (input_location, tmp); return tmp; } + /* Otherwise use a straightforward array reference. */ else return build4_loc (input_location, ARRAY_REF, type, base, offset, NULL_TREE, NULL_TREE); } Index: gcc/fortran/trans.h =================================================================== *** gcc/fortran/trans.h (revision 250082) --- gcc/fortran/trans.h (working copy) *************** struct GTY(()) lang_decl { *** 982,988 **** #define GFC_DECL_COMMON_OR_EQUIV(node) DECL_LANG_FLAG_3(node) #define GFC_DECL_CRAY_POINTEE(node) DECL_LANG_FLAG_4(node) #define GFC_DECL_RESULT(node) DECL_LANG_FLAG_5(node) ! #define GFC_DECL_SUBREF_ARRAY_P(node) DECL_LANG_FLAG_6(node) #define GFC_DECL_ASSOCIATE_VAR_P(node) DECL_LANG_FLAG_7(node) #define GFC_DECL_CLASS(node) DECL_LANG_FLAG_8(node) --- 982,988 ---- #define GFC_DECL_COMMON_OR_EQUIV(node) DECL_LANG_FLAG_3(node) #define GFC_DECL_CRAY_POINTEE(node) DECL_LANG_FLAG_4(node) #define GFC_DECL_RESULT(node) DECL_LANG_FLAG_5(node) ! #define GFC_DECL_PTR_ARRAY_P(node) DECL_LANG_FLAG_6(node) #define GFC_DECL_ASSOCIATE_VAR_P(node) DECL_LANG_FLAG_7(node) #define GFC_DECL_CLASS(node) DECL_LANG_FLAG_8(node) Index: gcc/testsuite/gfortran.dg/assumed_type_2.f90 =================================================================== *** gcc/testsuite/gfortran.dg/assumed_type_2.f90 (revision 250082) --- gcc/testsuite/gfortran.dg/assumed_type_2.f90 (working copy) *************** end *** 151,159 **** ! { dg-final { scan-tree-dump-times "sub_scalar .&scalar_t1," 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(real.kind=4..0:. . restrict\\) array_real_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(character.kind=1..0:..1:1. .\\) array_char_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(struct t2.0:. . restrict\\) array_t2_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(struct t3.0:. .\\) array_t3_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) array_class_t1_alloc._data.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) \\(array_class_t1_ptr._data.dat" 1 "original" } } --- 151,159 ---- ! { dg-final { scan-tree-dump-times "sub_scalar .&scalar_t1," 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(real.kind=4..0:. . restrict\\) array_real_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .\\(character.kind=1..1:1. .\\) .array_char_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(struct t2.0:. . restrict\\) array_t2_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t3 .\\) .array_t3_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) array_class_t1_alloc._data.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) \\(array_class_t1_ptr._data.dat" 1 "original" } } Index: gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95 =================================================================== *** gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95 (revision 250082) --- gcc/testsuite/gfortran.dg/goacc/kernels-alias-4.f95 (working copy) *************** program main *** 16,20 **** end program main ! Only the omp_data_i related loads should be annotated with cliques. ! ! { dg-final { scan-tree-dump-times "clique 1 base 1" 3 "ealias" } } ! ! { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 4 "ealias" } } --- 16,20 ---- end program main ! Only the omp_data_i related loads should be annotated with cliques. ! ! { dg-final { scan-tree-dump-times "clique 1 base 1" 4 "ealias" } } ! ! { dg-final { scan-tree-dump-times "(?n)clique 1 base 0" 5 "ealias" } } Index: gcc/testsuite/gfortran.dg/no_arg_check_2.f90 =================================================================== *** gcc/testsuite/gfortran.dg/no_arg_check_2.f90 (revision 250082) --- gcc/testsuite/gfortran.dg/no_arg_check_2.f90 (working copy) *************** end *** 133,141 **** ! { dg-final { scan-tree-dump-times "sub_scalar .&scalar_t1," 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(real.kind=4..0:. . restrict\\) array_real_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(character.kind=1..0:..1:1. .\\) array_char_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(struct t2.0:. . restrict\\) array_t2_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(struct t3.0:. .\\) array_t3_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) array_class_t1_alloc._data.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) \\(array_class_t1_ptr._data.dat" 1 "original" } } --- 133,141 ---- ! { dg-final { scan-tree-dump-times "sub_scalar .&scalar_t1," 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(real.kind=4..0:. . restrict\\) array_real_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .\\(character.kind=1..1:1. .\\) .array_char_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .&\\(.\\(struct t2.0:. . restrict\\) array_t2_alloc.data" 1 "original" } } ! ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t3 .\\) .array_t3_ptr.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) array_class_t1_alloc._data.data" 1 "original" } } ! { dg-final { scan-tree-dump-times "sub_scalar .\\(struct t1 .\\) \\(array_class_t1_ptr._data.dat" 1 "original" } } Index: gcc/testsuite/gfortran.dg/pointer_array_1.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_1.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_1.f90 (working copy) *************** *** 0 **** --- 1,60 ---- + ! { dg-do run } + ! + ! Check the fix for PR34640 comments 1 and 3. + ! + ! This involves passing and returning pointer array components that + ! point to components of arrays of derived types. + ! + MODULE test + IMPLICIT NONE + TYPE :: my_type + INTEGER :: value + integer :: tag + END TYPE + CONTAINS + SUBROUTINE get_values(values, switch) + INTEGER, POINTER :: values(:) + integer :: switch + TYPE(my_type), POINTER :: d(:) + allocate (d, source = [my_type(1,101), my_type(2,102)]) + if (switch .eq. 1) then + values => d(:)%value + if (any (values .ne. [1,2])) print *, values(2) + else + values => d(:)%tag + if (any (values .ne. [101,102])) call abort + end if + END SUBROUTINE + + function return_values(switch) result (values) + INTEGER, POINTER :: values(:) + integer :: switch + TYPE(my_type), POINTER :: d(:) + allocate (d, source = [my_type(1,101), my_type(2,102)]) + if (switch .eq. 1) then + values => d(:)%value + if (any (values .ne. [1,2])) call abort + else + values => d(:)%tag + if (any (values([2,1]) .ne. [102,101])) call abort + end if + END function + END MODULE + + use test + integer, pointer :: x(:) + type :: your_type + integer, pointer :: x(:) + end type + type(your_type) :: y + + call get_values (x, 1) + if (any (x .ne. [1,2])) call abort + call get_values (y%x, 2) + if (any (y%x .ne. [101,102])) call abort + + x => return_values (2) + if (any (x .ne. [101,102])) call abort + y%x => return_values (1) + if (any (y%x .ne. [1,2])) call abort + end Index: gcc/testsuite/gfortran.dg/pointer_array_2.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_2.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_2.f90 (working copy) *************** *** 0 **** --- 1,143 ---- + ! { dg-do compile } + ! + ! Test the fix for PR40737 as part of the overall fix for PR34640. + ! + ! Contributed by David Hough + ! + module testmod + + integer, parameter :: standard_integer = 1 + integer, parameter :: int = KIND( standard_integer) + + integer, parameter :: i8 = selected_int_kind(12) + integer, parameter :: i4 = selected_int_kind(8) + integer, parameter :: i2 = selected_int_kind(4) + + integer, parameter :: standard_real = 1. + integer, parameter :: std_real = KIND( standard_real) + + integer, parameter :: r8 = selected_real_kind(12) + integer, parameter :: r4 = selected_real_kind(6) + integer, parameter :: double = selected_real_kind(20) + + integer, parameter :: name_string_length = 40 + integer, parameter :: file_name_length = 60 + integer, parameter :: text_string_length = 80 + integer, parameter :: max_kwd_lgth = file_name_length + + integer(int) :: bytes_per_int = 4 + integer(int) :: bytes_per_real = 8 + integer(int) :: workcomm, spincomm + + integer(int), parameter :: nb_directions = 3, & + direction_x = 1, & + direction_y = 2, & + direction_z = 3, & + nb_ghost_cells = 5 ! might be different for the lagrange step? + + integer(int), parameter :: ends = 4, & + lower_ghost = 1, & + lower_interior = 2, & + upper_interior = 3, & + upper_ghost = 4 + + ! Neighbors + integer(int), parameter :: side = 2, & + lower_end = 1, & + upper_end = 2 + + + integer(int), parameter :: nb_variables = 5, & + ro_var = 1, & + ets_var = 2, & + u_var = 3, & + up1_var = 4, & + up2_var = 5, & + eis_var = 6, & + ecs_var = 7, & + p_var = 8, & + c_var = 9, & + nb_var_sortie = 9 + + type :: VARIABLES_LIGNE + sequence + real, pointer, dimension( :, :) :: l + end type VARIABLES_LIGNE + + type VARIABLES_MAILLE + sequence + real(r8), dimension( nb_variables) :: cell_var + end type VARIABLES_MAILLE + + integer(int), dimension( nb_directions) :: & + first_real_cell, & ! without ghost cells + last_real_cell, & ! + nb_real_cells, & ! + first_work_cell, & ! including ghost cells + last_work_cell, & ! + nb_work_cells, & ! + global_nb_cells ! number of real cells, for the entire grid + + integer(int) :: dim_probleme ! dimension du probleme (1, 2 ou 3) + + integer(int) :: largest_local_size ! the largest of the 3 dimensions of the local grid + + ! Hydro variables of the actual domain + ! There are 3 copies of these, for use according to current work direction + type (VARIABLES_MAILLE), allocatable, target, dimension( :, :, :) :: & + Hydro_vars_XYZ, & + Hydro_vars_YZX, & + Hydro_vars_ZXY + + ! Pointers to current and next Hydro var arrays + type (VARIABLES_MAILLE), pointer, dimension( :, :, :) :: Hydro_vars, & + Hydro_vars_next + + ! Which of these 3 copies of the 3D arrays has been updated last + integer(int) :: last_updated_3D_array = 0 + + real(r8), pointer, dimension( :) :: & + ! Variables "permanentes" (entrant dans la projection) + Ro, & ! densite + Ets, & ! energie totale specifique + Um, & ! vitesse aux mailles, dans la direction de travail + Xn, & ! abscisse en fin de pas de temps + ! Variables en lecture seulement + Um_p1, & ! vitesse aux mailles, dans les directions + Um_p2, & ! orthogonales + Xa, & ! abscisses des noeuds en debut de pas de temps + Dxa, & ! longueur des mailles en debut de pas de temps + U_dxa ! inverses des longueurs des mailles + + end module testmod + + + subroutine TF_AD_SPLITTING_DRIVER_PLANE + + use testmod + + implicit none + save + + real(r8), allocatable, dimension( :) :: & + ! Variables maille recalculees a chaque pas de temps + Eis, & ! energie interne specifique (seulement pour calculer la pression) + Vit_son, & ! comme son nom l'indique + C_f_l, & ! nombre de Courant + Pm, & ! pression aux mailles + ! Variables aux noeuds + Un, & ! vitesse des noeuds + Pn ! pression aux noeuds + + + integer(int) :: i, j, k + integer(int) :: first_cell, last_cell + + Ro => Hydro_vars( first_cell:last_cell, j, k)%cell_var( ro_var) + Ets => Hydro_vars( first_cell:last_cell, j, k)%cell_var( ets_var) + Um => Hydro_vars( first_cell:last_cell, j, k)%cell_var( u_var) + Um_p1 => Hydro_vars( first_cell:last_cell, j, k)%cell_var( up1_var) + Um_p2 => Hydro_vars( first_cell:last_cell, j, k)%cell_var( up2_var) + + end subroutine TF_AD_SPLITTING_DRIVER_PLANE + Index: gcc/testsuite/gfortran.dg/pointer_array_3.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_3.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_3.f90 (working copy) *************** *** 0 **** --- 1,51 ---- + ! { dg-do run } + ! + ! Test the fix for PR40737 comment 17 as part of the overall fix for PR34640. + ! + ! Contributed by Josh Hykes + ! + module test_mod + ! + type t1 + character(8) :: string + end type t1 + ! + type t2 + integer :: tab + type(t1), pointer :: fp(:) + end type t2 + ! + type t3 + integer :: tab + type(t2), pointer :: as + end type t3 + ! + type(t3), pointer :: as_typ(:) => null() + ! + character(8), pointer, public :: p(:) + ! + contains + ! + subroutine as_set_alias (i) + ! + implicit none + ! + integer, intent(in) :: i + ! + allocate (as_typ(2)) + allocate (as_typ(1)%as) + allocate (as_typ(1)%as%fp(2), source = [t1("abcdefgh"),t1("ijklmnop")]) + p => as_typ(i)%as%fp(:)%string + ! + end subroutine as_set_alias + ! + end module test_mod + + program test_prog + use test_mod + call as_set_alias(1) + if (any (p .ne. ["abcdefgh","ijklmnop"])) call abort + deallocate (as_typ(1)%as%fp) + deallocate (as_typ(1)%as) + deallocate (as_typ) + end program test_prog Index: gcc/testsuite/gfortran.dg/pointer_array_4.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_4.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_4.f90 (working copy) *************** *** 0 **** --- 1,75 ---- + ! { dg-do run } + ! + ! Test the fix for PR57116 as part of the overall fix for PR34640. + ! + ! Contributed by Reinhold Bader + ! + module mod_rtti_ptr + implicit none + type :: foo + real :: v + integer :: i + end type foo + contains + subroutine extract(this, v, ic) + class(*), target :: this(:) + real, pointer :: v(:) + integer :: ic + select type (this) + type is (real) + v => this(ic:) + class is (foo) + v => this(ic:)%v + end select + end subroutine extract + end module + + program prog_rtti_ptr + use mod_rtti_ptr + class(*), allocatable, target :: o(:) + real, pointer :: v(:) + + allocate(o(3), source=[1.0, 2.0, 3.0]) + call extract(o, v, 2) + if (size(v) == 2 .and. all (v == [2.0, 3.0])) then + deallocate(o) + else + call abort + end if + + allocate(o(3), source=[foo(1.0, 1), foo(4.0, 4), foo(5.0, 5)]) + call extract(o, v, 2) + if (size(v) == 2 .and. all (v == [4.0, 5.0])) then + deallocate(o) + else + call abort + end if + + ! The rest tests the case in comment 2 + + call extract1 (v, 1) + if (any (v /= [1.0, 2.0])) call abort + call extract1 (v, 2) ! Call to deallocate pointer. + + contains + subroutine extract1(v, flag) + type :: foo + real :: v + character(4) :: str + end type + class(foo), pointer, save :: this(:) + real, pointer :: v(:) + integer :: flag + + if (flag == 1) then + allocate (this(2), source = [foo (1.0, "one "), foo (2.0, "two ")]) + select type (this) + class is (foo) + v => this(1:2)%v + end select + else + deallocate (this) + end if + end subroutine + + end program prog_rtti_ptr Index: gcc/testsuite/gfortran.dg/pointer_array_5.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_5.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_5.f90 (working copy) *************** *** 0 **** --- 1,65 ---- + ! { dg-do run } + ! + ! Test the fix for PR55763 comment 9 as part of the overall fix for PR34640. + ! + ! Contributed by Tobias Burnus + ! + program change_field_type + use, intrinsic :: iso_c_binding + implicit none + REAL(kind=c_float), POINTER :: vector_comp(:) + TYPE, BIND(C) :: scalar_vector + REAL(kind=c_float) :: scalar + REAL(kind=c_float) :: vec(3) + END TYPE + TYPE, BIND(C) :: scalar_vector_matrix + REAL(kind=c_float) :: scalar + REAL(kind=c_float) :: vec(3) + REAL(kind=c_float) :: mat(3,3) + END TYPE + CLASS(*), ALLOCATABLE, TARGET :: one_d_field(:) + real, pointer :: v1(:) + + allocate(one_d_field(3), & + source = (/ scalar_vector( 1.0, (/ -1.0, 0.0, 1.0 /) ), & + scalar_vector( 1.1, (/ -1.2, 0.2, 0.9 /) ), & + scalar_vector( 1.2, (/ -1.4, 0.4, 0.8 /) ) /) ) + + call extract_vec(one_d_field, 1, 2) + if (any (abs (vector_comp - [0.0,0.2,0.4]) .gt. 1e-4)) call abort + deallocate(one_d_field) ! v1 becomes undefined + + allocate(one_d_field(1), & + source = (/ scalar_vector_matrix( 1.0, (/ -1.0, 0.0, 1.0 /), & + reshape( (/ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 /), & + (/3, 3/) ) ) /) ) + + call extract_vec(one_d_field, 2, 1) + if (abs (vector_comp(1) + 1.0) > 1e-4) call abort + call extract_vec(one_d_field, 2, 3) + if (abs (vector_comp(1) - 1.0) > 1e-4) call abort + deallocate(one_d_field) ! v1 becomes undefined + contains + subroutine extract_vec(field, tag, ic) + use, intrinsic :: iso_c_binding + CLASS(*), TARGET :: field(:) + INTEGER(kind=c_int), value :: tag, ic + + type(scalar_vector), pointer :: sv(:) + type(scalar_vector_matrix), pointer :: svm(:) + + select type (field) + type is (real(c_float)) + vector_comp => field + class default + select case (tag) + case (1) + sv => field + vector_comp => sv(:)%vec(ic) + case (2) + svm => field + vector_comp => svm(:)%vec(ic) + end select + end select + end subroutine + end program Index: gcc/testsuite/gfortran.dg/pointer_array_6.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_6.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_6.f90 (working copy) *************** *** 0 **** --- 1,28 ---- + ! { dg-do run } + ! + ! Test the fix for PR57019 comment 4 as part of the overall fix for PR34640. + ! + ! Contributed by + ! + type cParticle + real(4) :: v(3) + endtype cParticle + + type pCItem + type(cParticle) :: Ele + end type pCItem + + type(pCItem), target, dimension(1:1,1:1) :: pCellArray + type(cParticle), pointer, dimension(:,:) :: pArray + real(4), pointer, dimension(:) :: v_pointer + real(4), dimension(3) :: v_real = 99. + + pArray => pCellArray%Ele + v_pointer => pArray(1,1)%v; + v_pointer = v_real !OK %%%%%%%%%%%% + if (any (int (pArray(1,1)%v) .ne. 99)) call abort + + v_real = 88 + pArray(1,1)%v = v_real !SEGFAULT %%%%%%%%%%%%%%%%%%%%%%%% + if (any (int (v_pointer) .ne. 88)) call abort + end Index: gcc/testsuite/gfortran.dg/pointer_array_7.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_7.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_7.f90 (working copy) *************** *** 0 **** --- 1,46 ---- + ! { dg-do run } + ! + ! Test for the fix for PR34640. In this case, final testing of the + ! patch revealed that in some cases the actual descriptor was not + ! being passed to procedure dummy pointers. + ! + ! Contributed by Thomas Koenig + ! + module x + use iso_c_binding + implicit none + type foo + complex :: c + integer :: i + end type foo + contains + subroutine printit(c, a) + complex, pointer, dimension(:) :: c + integer :: i + integer(kind=c_intptr_t) :: a + a = transfer(c_loc(c(2)),a) + end subroutine printit + end module x + + program main + use x + use iso_c_binding + implicit none + type(foo), dimension(5), target :: a + integer :: i + complex, dimension(:), pointer :: pc + integer(kind=c_intptr_t) :: s1, s2, s3 + a%i = 0 + do i=1,5 + a(i)%c = cmplx(i**2,i) + end do + pc => a%c + call printit(pc, s3) + + s1 = transfer(c_loc(a(2)%c),s1) + if (s1 /= s3) call abort + + s2 = transfer(c_loc(pc(2)),s2) + if (s2 /= s3) call abort + + end program main Index: gcc/testsuite/gfortran.dg/pointer_array_8.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_8.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_8.f90 (working copy) *************** *** 0 **** --- 1,81 ---- + ! { dg-do run } + ! + ! Make sure that the fix for pr34640 works with class pointers. + ! + type :: mytype + real :: r + integer :: i + end type + + type :: thytype + real :: r + integer :: i + type(mytype) :: der + end type + + type(thytype), dimension(0:2), target :: tgt + class(*), dimension(:), pointer :: cptr + class(mytype), dimension(:), pointer :: cptr1 + integer :: i + integer(8) :: s1, s2 + + tgt = [(thytype(int(i), i, mytype(int(2*i), 2*i)), i= 1,3)] + + cptr => tgt%i + if (lbound (cptr, 1) .ne. 1) Call abort ! Not a whole array target! + + s1 = loc(cptr) + call foo (cptr, s2) ! Check bounds not changed... + if (s1 .ne. s2) Call abort ! ...and that the descriptor is passed. + + select type (cptr) + type is (integer) + if (any (cptr .ne. [1,2,3])) call abort ! Check the the scalarizer works. + if (cptr(2) .ne. 2) call abort ! Check ordinary array indexing. + end select + + cptr(1:3) => tgt%der%r ! Something a tad more complicated! + + select type (cptr) + type is (real) + if (any (int(cptr) .ne. [2,4,6])) call abort + if (any (int(cptr([2,3,1])) .ne. [4,6,2])) call abort + if (int(cptr(3)) .ne. 6) call abort + end select + + cptr1(1:3) => tgt%der + + s1 = loc(cptr1) + call bar(cptr1, s2) + if (s1 .ne. s2) Call abort ! Check that the descriptor is passed. + + select type (cptr1) + type is (mytype) + if (any (cptr1%i .ne. [2,4,6])) call abort + if (cptr1(2)%i .ne. 4) call abort + end select + + contains + + subroutine foo (arg, addr) + class(*), dimension(:), pointer :: arg + integer(8) :: addr + addr = loc(arg) + select type (arg) + type is (integer) + if (any (arg .ne. [1,2,3])) call abort ! Check the the scalarizer works. + if (arg(2) .ne. 2) call abort ! Check ordinary array indexing. + end select + end subroutine + + subroutine bar (arg, addr) + class(mytype), dimension(:), pointer :: arg + integer(8) :: addr + addr = loc(arg) + select type (arg) + type is (mytype) + if (any (arg%i .ne. [2,4,6])) call abort + if (arg(2)%i .ne. 4) call abort + end select + end subroutine + end Index: gcc/testsuite/gfortran.dg/pointer_array_component_1.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_component_1.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_component_1.f90 (working copy) *************** *** 0 **** --- 1,47 ---- + ! { dg-do run } + ! + ! Check the fix for PR34640 comment 28. + ! + ! This involves pointer array components that point to components of arrays + ! of derived types. + ! + type var_tables + real, pointer :: rvar(:) + end type + + type real_vars + real r + real :: index + end type + + type(var_tables) :: vtab_r + type(real_vars), target :: x(2) + real, pointer :: z(:) + real :: y(2) + + x = [real_vars (11.0, 1.0), real_vars (42.0, 2.0)] + vtab_r%rvar => x%r + if (any (abs (vtab_r%rvar - [11.0, 42.0]) > 1.0e-5)) call abort ! Check skipping 'index; is OK. + + y = vtab_r%rvar + if (any (abs (y - [11.0, 42.0]) > 1.0e-5)) call abort ! Check that the component is usable in assignment. + + call foobar (vtab_r, [11.0, 42.0]) + + vtab_r = barfoo () + + call foobar (vtab_r, [111.0, 142.0]) + + contains + subroutine foobar (vtab, array) + type(var_tables) :: vtab + real :: array (:) + if (any (abs (vtab%rvar - array) > 1.0e-5)) call abort ! Check passing as a dummy. + if (abs (vtab%rvar(2) - array(2)) > 1.0e-5) call abort ! Check component reference. + end subroutine + + function barfoo () result(res) + type(var_tables) :: res + allocate (res%rvar(2), source = [111.0, 142.0]) ! Check allocation + end function + end Index: gcc/testsuite/gfortran.dg/pointer_array_component_2.f90 =================================================================== *** gcc/testsuite/gfortran.dg/pointer_array_component_2.f90 (nonexistent) --- gcc/testsuite/gfortran.dg/pointer_array_component_2.f90 (working copy) *************** *** 0 **** --- 1,43 ---- + ! { dg-do run } + ! + ! Test the fix for PR34640. In the first version of the fix, the first + ! testcase in PR51218 failed with a segfault. This test extracts the + ! failing part and checks that all is well. + ! + type t_info_block + integer :: n = 0 ! number of elements + end type t_info_block + ! + type t_dec_info + integer :: n = 0 ! number of elements + integer :: n_b = 0 ! number of blocks + type (t_info_block) ,pointer :: b (:) => NULL() ! info blocks + end type t_dec_info + ! + type t_vector_segm + integer :: n = 0 ! number of elements + real ,pointer :: x(:) => NULL() ! coefficients + end type t_vector_segm + ! + type t_vector + type (t_dec_info) ,pointer :: info => NULL() ! decomposition info + integer :: n = 0 ! number of elements + integer :: n_s = 0 ! number of segments + integer :: alloc_l = 0 ! allocation level + type (t_vector_segm) ,pointer :: s (:) => NULL() ! vector blocks + end type t_vector + + + type(t_vector) :: z + type(t_vector_segm), pointer :: ss + + allocate (z%s(2)) + do i = 1, 2 + ss => z%s(i) + allocate (ss%x(2), source = [1.0, 2.0]*real(i)) + end do + + ! These lines would segfault. + if (int (sum (z%s(1)%x)) .ne. 3) call abort + if (int (sum (z%s(1)%x * z%s(2)%x)) .ne. 10) call abort + end Index: libgfortran/libgfortran.h =================================================================== *** libgfortran/libgfortran.h (revision 250082) --- libgfortran/libgfortran.h (working copy) *************** struct {\ *** 339,344 **** --- 339,345 ---- type *base_addr;\ size_t offset;\ index_type dtype;\ + index_type span;\ descriptor_dimension dim[r];\ } On 11 July 2017 at 07:16, Paul Richard Thomas wrote: > Dear All, > > We are not quite there yet. Thanks to the posters to the thread on > clf, I have now been convinced that ptr => der_type_array%comp must > return an lbound=1 based descriptor, since the target is not a WHOLE > ARRAY as defined in the standard. In addition, Dominique picked up a > failing testcase with -m32 for which he provided a fix. > > I should re-re-re-submit tonight :-) > > Paul > > > On 9 July 2017 at 22:27, Thomas Koenig wrote: >> Hi Paul, >> >>> Please find attached what I believe is the final version of the patch. >> >> >> This is looking very good, this does work as advertised and has >> all the corner cases coverd. >> >> I also regtested this on powerpc64-unknown-linux-gnu. >> >>> I took the opportunity of the delay, while the bounds issue was being >>> discussed on clf, to fix class pointer arrays. They now function >>> correctly, as evidenced by pointer_array_8.f90. >> >> >> Excellent! >> >>> A possible final tweak - as asked before, should I bump up the module >>> version number? My inclination is to say that we should. >> >> >> Because we are changing the array descriptor (and thus binary >> compatibility), we have to change the library version in >> libtool-version. Bumping the module version should be done, >> too. >> >>> Bootstrapped and regtested on FC23/x86_64 - OK for trunk? >> >> >> So, OK from my side, with a bump in library and module version. >> >> Maybe you could wait a couple of days before committing to give >> others a chance to also test the patch. >> >> Thanks a lot for finally making gfortran F95-compliant! >> >> Regards >> >> Thomas >> > > > > -- > "If you can't explain it simply, you don't understand it well enough" > - Albert Einstein -- "If you can't explain it simply, you don't understand it well enough" - Albert Einstein --001a113c3e0e98809e05540b725b Content-Type: text/plain; charset="US-ASCII"; name="submit.diff" Content-Disposition: attachment; filename="submit.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j4zo356c0 Content-length: 91793 SW5kZXg6IGdjYy9mb3J0cmFuL2V4cHIuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09CioqKiBnY2MvZm9ydHJhbi9leHByLmMJKHJldmlzaW9uIDI1MDA4MikK LS0tIGdjYy9mb3J0cmFuL2V4cHIuYwkod29ya2luZyBjb3B5KQoqKioqKioq KioqKioqKiogaXNfc3VicmVmX2FycmF5IChnZmNfZXhwciAqIGUpCioqKiA5 ODQsOTg5ICoqKioKLS0tIDk4NCw5OTQgLS0tLQogICAgaWYgKGUtPnN5bXRy ZWUtPm4uc3ltLT5hdHRyLnN1YnJlZl9hcnJheV9wb2ludGVyKQogICAgICBy ZXR1cm4gdHJ1ZTsKICAKKyAgIGlmIChlLT5zeW10cmVlLT5uLnN5bS0+dHMu dHlwZSA9PSBCVF9DTEFTUworICAgICAgICYmIGUtPnN5bXRyZWUtPm4uc3lt LT5hdHRyLmR1bW15CisgICAgICAgJiYgQ0xBU1NfREFUQSAoZS0+c3ltdHJl ZS0+bi5zeW0pLT5hdHRyLmNsYXNzX3BvaW50ZXIpCisgICAgIHJldHVybiB0 cnVlOworIAogICAgc2Vlbl9hcnJheSA9IGZhbHNlOwogICAgZm9yIChyZWYg PSBlLT5yZWY7IHJlZjsgcmVmID0gcmVmLT5uZXh0KQogICAgICB7CkluZGV4 OiBnY2MvZm9ydHJhbi90cmFucy1hcnJheS5jCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKioqIGdjYy9mb3J0cmFuL3RyYW5zLWFycmF5LmMJKHJldmlzaW9u IDI1MDA4MikKLS0tIGdjYy9mb3J0cmFuL3RyYW5zLWFycmF5LmMJKHdvcmtp bmcgY29weSkKKioqKioqKioqKioqKioqIGdmY19hcnJheV9kYXRhcHRyX3R5 cGUgKHRyZWUgZGVzYykKKioqIDEyNSwxMzIgKioqKgogICNkZWZpbmUgREFU QV9GSUVMRCAwCiAgI2RlZmluZSBPRkZTRVRfRklFTEQgMQogICNkZWZpbmUg RFRZUEVfRklFTEQgMgohICNkZWZpbmUgRElNRU5TSU9OX0ZJRUxEIDMKISAj ZGVmaW5lIENBRl9UT0tFTl9GSUVMRCA0CiAgCiAgI2RlZmluZSBTVFJJREVf U1VCRklFTEQgMAogICNkZWZpbmUgTEJPVU5EX1NVQkZJRUxEIDEKLS0tIDEy NSwxMzMgLS0tLQogICNkZWZpbmUgREFUQV9GSUVMRCAwCiAgI2RlZmluZSBP RkZTRVRfRklFTEQgMQogICNkZWZpbmUgRFRZUEVfRklFTEQgMgohICNkZWZp bmUgU1BBTl9GSUVMRCAzCiEgI2RlZmluZSBESU1FTlNJT05fRklFTEQgNAoh ICNkZWZpbmUgQ0FGX1RPS0VOX0ZJRUxEIDUKICAKICAjZGVmaW5lIFNUUklE RV9TVUJGSUVMRCAwCiAgI2RlZmluZSBMQk9VTkRfU1VCRklFTEQgMQoqKioq KioqKioqKioqKiogZ2ZjX2NvbnZfZGVzY3JpcHRvcl9kdHlwZSAodHJlZSBk ZXNjKQoqKiogMjQ0LDI0OSAqKioqCi0tLSAyNDUsMjgwIC0tLS0KICAJCQkg IGRlc2MsIGZpZWxkLCBOVUxMX1RSRUUpOwogIH0KICAKKyBzdGF0aWMgdHJl ZQorIGdmY19jb252X2Rlc2NyaXB0b3Jfc3BhbiAodHJlZSBkZXNjKQorIHsK KyAgIHRyZWUgdHlwZTsKKyAgIHRyZWUgZmllbGQ7CisgCisgICB0eXBlID0g VFJFRV9UWVBFIChkZXNjKTsKKyAgIGdjY19hc3NlcnQgKEdGQ19ERVNDUklQ VE9SX1RZUEVfUCAodHlwZSkpOworIAorICAgZmllbGQgPSBnZmNfYWR2YW5j ZV9jaGFpbiAoVFlQRV9GSUVMRFMgKHR5cGUpLCBTUEFOX0ZJRUxEKTsKKyAg IGdjY19hc3NlcnQgKGZpZWxkICE9IE5VTExfVFJFRSAmJiBUUkVFX1RZUEUg KGZpZWxkKSA9PSBnZmNfYXJyYXlfaW5kZXhfdHlwZSk7CisgCisgICByZXR1 cm4gZm9sZF9idWlsZDNfbG9jIChpbnB1dF9sb2NhdGlvbiwgQ09NUE9ORU5U X1JFRiwgVFJFRV9UWVBFIChmaWVsZCksCisgCQkJICBkZXNjLCBmaWVsZCwg TlVMTF9UUkVFKTsKKyB9CisgCisgdHJlZQorIGdmY19jb252X2Rlc2NyaXB0 b3Jfc3Bhbl9nZXQgKHRyZWUgZGVzYykKKyB7CisgICByZXR1cm4gZ2ZjX2Nv bnZfZGVzY3JpcHRvcl9zcGFuIChkZXNjKTsKKyB9CisgCisgdm9pZAorIGdm Y19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9zZXQgKHN0bXRibG9ja190ICpibG9j aywgdHJlZSBkZXNjLAorIAkJCQl0cmVlIHZhbHVlKQorIHsKKyAgIHRyZWUg dCA9IGdmY19jb252X2Rlc2NyaXB0b3Jfc3BhbiAoZGVzYyk7CisgICBnZmNf YWRkX21vZGlmeSAoYmxvY2ssIHQsIGZvbGRfY29udmVydCAoVFJFRV9UWVBF ICh0KSwgdmFsdWUpKTsKKyB9CisgCiAgCiAgdHJlZQogIGdmY19jb252X2Rl c2NyaXB0b3JfcmFuayAodHJlZSBkZXNjKQoqKioqKioqKioqKioqKiogZ2Zj X2NvbnZfc2hpZnRfZGVzY3JpcHRvcl9sYm91bmQgKHN0bXRibAoqKiogNDY2 LDQ3NiAqKioqCi0tLSA0OTcsNTM3IC0tLS0KICB9CiAgCiAgCisgLyogT2J0 YWluIG9mZnNldHMgZm9yIHRyYW5zLXR5cGVzLmMoZ2ZjX2dldF9hcnJheV9k ZXNjcl9pbmZvKS4gICovCisgCisgdm9pZAorIGdmY19nZXRfZGVzY3JpcHRv cl9vZmZzZXRzX2Zvcl9pbmZvIChjb25zdF90cmVlIGRlc2NfdHlwZSwgdHJl ZSAqZGF0YV9vZmYsCisgCQkJCSAgICAgdHJlZSAqZHR5cGVfb2ZmLCB0cmVl ICpkaW1fb2ZmLAorIAkJCQkgICAgIHRyZWUgKmRpbV9zaXplLCB0cmVlICpz dHJpZGVfc3Vib2ZmLAorIAkJCQkgICAgIHRyZWUgKmxvd2VyX3N1Ym9mZiwg dHJlZSAqdXBwZXJfc3Vib2ZmKQorIHsKKyAgIHRyZWUgZmllbGQ7CisgICB0 cmVlIHR5cGU7CisgCisgICB0eXBlID0gVFlQRV9NQUlOX1ZBUklBTlQgKGRl c2NfdHlwZSk7CisgICBmaWVsZCA9IGdmY19hZHZhbmNlX2NoYWluIChUWVBF X0ZJRUxEUyAodHlwZSksIE9GRlNFVF9GSUVMRCk7CisgICAqZGF0YV9vZmYg PSBieXRlX3Bvc2l0aW9uIChmaWVsZCk7CisgICBmaWVsZCA9IGdmY19hZHZh bmNlX2NoYWluIChUWVBFX0ZJRUxEUyAodHlwZSksIERUWVBFX0ZJRUxEKTsK KyAgICpkdHlwZV9vZmYgPSBieXRlX3Bvc2l0aW9uIChmaWVsZCk7CisgICBm aWVsZCA9IGdmY19hZHZhbmNlX2NoYWluIChUWVBFX0ZJRUxEUyAodHlwZSks IERJTUVOU0lPTl9GSUVMRCk7CisgICAqZGltX29mZiA9IGJ5dGVfcG9zaXRp b24gKGZpZWxkKTsKKyAgIHR5cGUgPSBUUkVFX1RZUEUgKFRSRUVfVFlQRSAo ZmllbGQpKTsKKyAgICpkaW1fc2l6ZSA9IFRZUEVfU0laRV9VTklUICh0eXBl KTsKKyAgIGZpZWxkID0gZ2ZjX2FkdmFuY2VfY2hhaW4gKFRZUEVfRklFTERT ICh0eXBlKSwgU1RSSURFX1NVQkZJRUxEKTsKKyAgICpzdHJpZGVfc3Vib2Zm ID0gYnl0ZV9wb3NpdGlvbiAoZmllbGQpOworICAgZmllbGQgPSBnZmNfYWR2 YW5jZV9jaGFpbiAoVFlQRV9GSUVMRFMgKHR5cGUpLCBMQk9VTkRfU1VCRklF TEQpOworICAgKmxvd2VyX3N1Ym9mZiA9IGJ5dGVfcG9zaXRpb24gKGZpZWxk KTsKKyAgIGZpZWxkID0gZ2ZjX2FkdmFuY2VfY2hhaW4gKFRZUEVfRklFTERT ICh0eXBlKSwgVUJPVU5EX1NVQkZJRUxEKTsKKyAgICp1cHBlcl9zdWJvZmYg PSBieXRlX3Bvc2l0aW9uIChmaWVsZCk7CisgfQorIAorIAogIC8qIENsZWFu dXAgdGhvc2UgI2RlZmluZXMuICAqLwogIAogICN1bmRlZiBEQVRBX0ZJRUxE CiAgI3VuZGVmIE9GRlNFVF9GSUVMRAogICN1bmRlZiBEVFlQRV9GSUVMRAor ICN1bmRlZiBTUEFOX0ZJRUxECiAgI3VuZGVmIERJTUVOU0lPTl9GSUVMRAog ICN1bmRlZiBDQUZfVE9LRU5fRklFTEQKICAjdW5kZWYgU1RSSURFX1NVQkZJ RUxECioqKioqKioqKioqKioqKiBnZmNfYWRkX3NzX3RvX2xvb3AgKGdmY19s b29waW5mbyAqIGxvb3AsCioqKiA3MjAsNzI1ICoqKioKLS0tIDc4MSw4NjQg LS0tLQogIH0KICAKICAKKyAvKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV4cHJl c3Npb24gaXMgYW4gYXJyYXkgcG9pbnRlci4gICovCisgCisgc3RhdGljIGJv b2wKKyBpc19wb2ludGVyX2FycmF5ICh0cmVlIGV4cHIpCisgeworICAgaWYg KGZsYWdfb3Blbm1wKQorICAgICByZXR1cm4gZmFsc2U7CisgCisgICBpZiAo ZXhwciA9PSBOVUxMX1RSRUUKKyAgICAgICB8fCAhR0ZDX0RFU0NSSVBUT1Jf VFlQRV9QIChUUkVFX1RZUEUgKGV4cHIpKQorICAgICAgIHx8IEdGQ19DTEFT U19UWVBFX1AgKFRSRUVfVFlQRSAoZXhwcikpKQorICAgICByZXR1cm4gZmFs c2U7CisgCisgICBpZiAoVFJFRV9DT0RFIChleHByKSA9PSBWQVJfREVDTAor ICAgICAgICYmIEdGQ19ERUNMX1BUUl9BUlJBWV9QIChleHByKSkKKyAgICAg cmV0dXJuIHRydWU7CisgCisgICBpZiAoVFJFRV9DT0RFIChleHByKSA9PSBQ QVJNX0RFQ0wKKyAgICAgICAmJiBHRkNfREVDTF9QVFJfQVJSQVlfUCAoZXhw cikpCisgICAgIHJldHVybiB0cnVlOworIAorICAgaWYgKFRSRUVfQ09ERSAo ZXhwcikgPT0gSU5ESVJFQ1RfUkVGCisgICAgICAgJiYgR0ZDX0RFQ0xfUFRS X0FSUkFZX1AgKFRSRUVfT1BFUkFORCAoZXhwciwgMCkpKQorICAgICByZXR1 cm4gdHJ1ZTsKKyAKKyAgIC8qIFRoZSBmaWVsZCBkZWNsYXJhdGlvbiBpcyBt YXJrZWQgYXMgYW4gcG9pbnRlciBhcnJheS4gICovCisgICBpZiAoVFJFRV9D T0RFIChleHByKSA9PSBDT01QT05FTlRfUkVGCisgICAgICAgJiYgR0ZDX0RF Q0xfUFRSX0FSUkFZX1AgKFRSRUVfT1BFUkFORCAoZXhwciwgMSkpCisgICAg ICAgJiYgIUdGQ19DTEFTU19UWVBFX1AgKFRSRUVfVFlQRSAoVFJFRV9PUEVS QU5EIChleHByLCAxKSkpKQorICAgICByZXR1cm4gdHJ1ZTsKKyAKKyAgIHJl dHVybiBmYWxzZTsKKyB9CisgCisgCisgLyogUmV0dXJuIHRoZSBzcGFuIG9m IGFuIGFycmF5LiAgKi8KKyAKKyBzdGF0aWMgdHJlZQorIGdldF9hcnJheV9z cGFuICh0cmVlIGRlc2MsIGdmY19leHByICpleHByKQorIHsKKyAgIHRyZWUg dG1wOworIAorICAgaWYgKGlzX3BvaW50ZXJfYXJyYXkgKGRlc2MpKQorICAg ICAvKiBUaGlzIHdpbGwgaGF2ZSB0aGUgc3BhbiBmaWVsZCBzZXQuICAqLwor ICAgICB0bXAgPSBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fZ2V0IChkZXNj KTsKKyAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoZGVzYykgPT0gQ09NUE9ORU5U X1JFRgorIAkgICAmJiBHRkNfREVTQ1JJUFRPUl9UWVBFX1AgKFRSRUVfVFlQ RSAoZGVzYykpCisgCSAgICYmIEdGQ19DTEFTU19UWVBFX1AgKFRSRUVfVFlQ RSAoVFJFRV9PUEVSQU5EIChkZXNjLCAwKSkpKQorICAgICB7CisgICAgICAg LyogVGhlIGRlc2NyaXB0b3IgaXMgYSBjbGFzcyBfZGF0YSBmaWVsZCBhbmQg c28gdXNlIHRoZSB2dGFibGUKKyAJIHNpemUgZm9yIHRoZSByZWNlaXZpbmcg c3BhbiBmaWVsZC4gICovCisgICAgICAgdG1wID0gZ2ZjX2dldF92cHRyX2Zy b21fZXhwciAoZGVzYyk7CisgICAgICAgdG1wID0gZ2ZjX3ZwdHJfc2l6ZV9n ZXQgKHRtcCk7CisgICAgIH0KKyAgIGVsc2UgaWYgKGV4cHIgJiYgZXhwci0+ ZXhwcl90eXBlID09IEVYUFJfVkFSSUFCTEUKKyAJICAgJiYgZXhwci0+c3lt dHJlZS0+bi5zeW0tPnRzLnR5cGUgPT0gQlRfQ0xBU1MKKyAJICAgJiYgZXhw ci0+cmVmLT50eXBlID09IFJFRl9DT01QT05FTlQKKyAJICAgJiYgZXhwci0+ cmVmLT5uZXh0LT50eXBlID09IFJFRl9BUlJBWQorIAkgICAmJiBleHByLT5y ZWYtPm5leHQtPm5leHQgPT0gTlVMTAorIAkgICAmJiBDTEFTU19EQVRBIChl eHByLT5zeW10cmVlLT5uLnN5bSktPmF0dHIuZGltZW5zaW9uKQorICAgICB7 CisgICAgICAgLyogRHVtbXlzIGNvbWUgaW4gc29tZXRpbWVzIHdpdGggdGhl IGRlc2NyaXB0b3IgZGV0YWNoZWQgZnJvbQorIAkgdGhlIGNsYXNzIGZpZWxk IG9yIGRlY2xhcmF0aW9uLiAgKi8KKyAgICAgICB0bXAgPSBnZmNfY2xhc3Nf dnB0cl9nZXQgKGV4cHItPnN5bXRyZWUtPm4uc3ltLT5iYWNrZW5kX2RlY2wp OworICAgICAgIHRtcCA9IGdmY192cHRyX3NpemVfZ2V0ICh0bXApOworICAg ICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICAvKiBJZiBub25lIG9mIHRo ZSBmYW5jeSBzdHVmZiB3b3JrcywgdGhlIHNwYW4gaXMgdGhlIGVsZW1lbnQK KyAJIHNpemUgb2YgdGhlIGFycmF5LiAgKi8KKyAgICAgICB0bXAgPSBnZmNf Z2V0X2VsZW1lbnRfdHlwZSAoVFJFRV9UWVBFIChkZXNjKSk7CisgICAgICAg dG1wID0gZm9sZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwKKyAJ CQkgIHNpemVfaW5fYnl0ZXMgKHRtcCkpOworICAgICB9CisgICByZXR1cm4g dG1wOworIH0KKyAKKyAKICAvKiBHZW5lcmF0ZSBhbiBpbml0aWFsaXplciBm b3IgYSBzdGF0aWMgcG9pbnRlciBvciBhbGxvY2F0YWJsZSBhcnJheS4gICov CiAgCiAgdm9pZAoqKioqKioqKioqKioqKiogZ2ZjX2NvbnZfc2NhbGFyaXpl ZF9hcnJheV9yZWYgKGdmY19zZSAqCioqKiAzMjM5LDMyNDkgKioqKgogICAg ICBpbmRleCA9IGZvbGRfYnVpbGQyX2xvYyAoaW5wdXRfbG9jYXRpb24sIFBM VVNfRVhQUiwgZ2ZjX2FycmF5X2luZGV4X3R5cGUsCiAgCQkJICAgICBpbmRl eCwgaW5mby0+b2Zmc2V0KTsKICAKISAgIGlmIChleHByICYmIChpc19zdWJy ZWZfYXJyYXkgKGV4cHIpCiAgCSAgICAgICB8fCAoZXhwci0+dHMuZGVmZXJy ZWQgJiYgKGV4cHItPmV4cHJfdHlwZSA9PSBFWFBSX1ZBUklBQkxFCiAgCQkJ CQkgfHwgZXhwci0+ZXhwcl90eXBlID09IEVYUFJfRlVOQ1RJT04pKSkpCiAg ICAgIGRlY2wgPSBleHByLT5zeW10cmVlLT5uLnN5bS0+YmFja2VuZF9kZWNs OwogIAogICAgdG1wID0gYnVpbGRfZm9sZF9pbmRpcmVjdF9yZWZfbG9jIChp bnB1dF9sb2NhdGlvbiwgaW5mby0+ZGF0YSk7CiAgCiAgICAvKiBVc2UgdGhl IHZwdHIgJ3NpemUnIGZpZWxkIHRvIGFjY2VzcyBhIGNsYXNzIHRoZSBlbGVt ZW50IG9mIGEgY2xhc3MKLS0tIDMzNzgsMzQwNyAtLS0tCiAgICAgIGluZGV4 ID0gZm9sZF9idWlsZDJfbG9jIChpbnB1dF9sb2NhdGlvbiwgUExVU19FWFBS LCBnZmNfYXJyYXlfaW5kZXhfdHlwZSwKICAJCQkgICAgIGluZGV4LCBpbmZv LT5vZmZzZXQpOwogIAohICAgaWYgKGV4cHIgJiYgKChpc19zdWJyZWZfYXJy YXkgKGV4cHIpCiEgCQkmJiBHRkNfREVTQ1JJUFRPUl9UWVBFX1AgKFRSRUVf VFlQRSAoaW5mby0+ZGVzY3JpcHRvcikpKQogIAkgICAgICAgfHwgKGV4cHIt PnRzLmRlZmVycmVkICYmIChleHByLT5leHByX3R5cGUgPT0gRVhQUl9WQVJJ QUJMRQogIAkJCQkJIHx8IGV4cHItPmV4cHJfdHlwZSA9PSBFWFBSX0ZVTkNU SU9OKSkpKQogICAgICBkZWNsID0gZXhwci0+c3ltdHJlZS0+bi5zeW0tPmJh Y2tlbmRfZGVjbDsKICAKKyAgIC8qIEEgcG9pbnRlciBhcnJheSBjb21wb25l bnQgY2FuIGJlIGRldGVjdGVkIGZyb20gaXRzIGZpZWxkIGRlY2wuIEZpeAor ICAgICAgdGhlIGRlc2NyaXB0b3IsIG1hcmsgdGhlIHJlc3VsdGluZyB2YXJp YWJsZSBkZWNsIGFuZCBwYXNzIGl0IHRvCisgICAgICBnZmNfYnVpbGRfYXJy YXlfcmVmLiAgKi8KKyAgIGlmIChpc19wb2ludGVyX2FycmF5IChpbmZvLT5k ZXNjcmlwdG9yKSkKKyAgICAgeworICAgICAgIGlmIChUUkVFX0NPREUgKGlu Zm8tPmRlc2NyaXB0b3IpID09IENPTVBPTkVOVF9SRUYpCisgCXsKKyAJICBk ZWNsID0gZ2ZjX2V2YWx1YXRlX25vdyAoaW5mby0+ZGVzY3JpcHRvciwgJnNl LT5wcmUpOworIAkgIEdGQ19ERUNMX1BUUl9BUlJBWV9QIChkZWNsKSA9IDE7 CisgCSAgVFJFRV9VU0VEIChkZWNsKSA9IDE7CisgCX0KKyAgICAgICBlbHNl IGlmIChUUkVFX0NPREUgKGluZm8tPmRlc2NyaXB0b3IpID09IElORElSRUNU X1JFRikKKyAJZGVjbCA9IFRSRUVfT1BFUkFORCAoaW5mby0+ZGVzY3JpcHRv ciwgMCk7CisgCisgICAgICAgaWYgKGRlY2wgPT0gTlVMTF9UUkVFKQorIAlk ZWNsID0gaW5mby0+ZGVzY3JpcHRvcjsKKyAgICAgfQorIAogICAgdG1wID0g YnVpbGRfZm9sZF9pbmRpcmVjdF9yZWZfbG9jIChpbnB1dF9sb2NhdGlvbiwg aW5mby0+ZGF0YSk7CiAgCiAgICAvKiBVc2UgdGhlIHZwdHIgJ3NpemUnIGZp ZWxkIHRvIGFjY2VzcyBhIGNsYXNzIHRoZSBlbGVtZW50IG9mIGEgY2xhc3MK KioqKioqKioqKioqKioqIGJ1aWxkX2FycmF5X3JlZiAodHJlZSBkZXNjLCB0 cmVlIG9mZnNldCwKKioqIDMyODgsMzMzMiAqKioqCiAgewogICAgdHJlZSB0 bXA7CiAgICB0cmVlIHR5cGU7CiEgICB0cmVlIGNkZWNsOwohICAgYm9vbCBj bGFzc2FycmF5ID0gZmFsc2U7CiAgCiAgICAvKiBGb3IgY2xhc3MgYXJyYXlz IHRoZSBjbGFzcyBkZWNsYXJhdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHNhdmVk CiAgICAgICBkZXNjcmlwdG9yLiAgKi8KICAgIGlmIChJTkRJUkVDVF9SRUZf UCAoZGVzYykKICAgICAgICAmJiBERUNMX0xBTkdfU1BFQ0lGSUMgKFRSRUVf T1BFUkFORCAoZGVzYywgMCkpCiAgICAgICAgJiYgR0ZDX0RFQ0xfU0FWRURf REVTQ1JJUFRPUiAoVFJFRV9PUEVSQU5EIChkZXNjLCAwKSkpCiEgICAgIGNk ZWNsID0gZ2ZjX2NsYXNzX2RhdGFfZ2V0IChHRkNfREVDTF9TQVZFRF9ERVND UklQVE9SICgKICAJCQkJICBUUkVFX09QRVJBTkQgKGRlc2MsIDApKSk7CiAg ICBlbHNlCiEgICAgIGNkZWNsID0gZGVzYzsKICAKICAgIC8qIENsYXNzIGNv bnRhaW5lciB0eXBlcyBkbyBub3QgYWx3YXlzIGhhdmUgdGhlIEdGQ19DTEFT U19UWVBFX1AKICAgICAgIGJ1dCB0aGUgY2Fub25pY2FsIHR5cGUgZG9lcy4g ICovCiEgICBpZiAoR0ZDX0RFU0NSSVBUT1JfVFlQRV9QIChUUkVFX1RZUEUg KGNkZWNsKSkKISAgICAgICAmJiBUUkVFX0NPREUgKGNkZWNsKSA9PSBDT01Q T05FTlRfUkVGKQogICAgICB7CiEgICAgICAgdHlwZSA9IFRSRUVfVFlQRSAo VFJFRV9PUEVSQU5EIChjZGVjbCwgMCkpOwogICAgICAgIGlmIChUWVBFX0NB Tk9OSUNBTCAodHlwZSkKICAJICAmJiBHRkNfQ0xBU1NfVFlQRV9QIChUWVBF X0NBTk9OSUNBTCAodHlwZSkpKQohIAl7CiEgCSAgdHlwZSA9IFRSRUVfVFlQ RSAoZGVzYyk7CiEgCSAgY2xhc3NhcnJheSA9IHRydWU7CiEgCX0KISAgICAg fQohICAgZWxzZQohICAgICB0eXBlID0gTlVMTDsKISAKISAgIC8qIENsYXNz IGFycmF5IHJlZmVyZW5jZXMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBiZWNh dXNlIHRoZSBhc3NpZ25lZAohICAgICAgdHlwZSBzaXplIG5lZWRzIHRvIGJl IHVzZWQgdG8gcG9pbnQgdG8gdGhlIGVsZW1lbnQuICAqLwohICAgaWYgKGNs YXNzYXJyYXkpCiEgICAgIHsKISAgICAgICB0eXBlID0gZ2ZjX2dldF9lbGVt ZW50X3R5cGUgKHR5cGUpOwohICAgICAgIHRtcCA9IFRSRUVfT1BFUkFORCAo Y2RlY2wsIDApOwohICAgICAgIHRtcCA9IGdmY19nZXRfY2xhc3NfYXJyYXlf cmVmIChvZmZzZXQsIHRtcCwgTlVMTF9UUkVFKTsKISAgICAgICB0bXAgPSBm b2xkX2NvbnZlcnQgKGJ1aWxkX3BvaW50ZXJfdHlwZSAodHlwZSksIHRtcCk7 CiEgICAgICAgdG1wID0gYnVpbGRfZm9sZF9pbmRpcmVjdF9yZWZfbG9jIChp bnB1dF9sb2NhdGlvbiwgdG1wKTsKISAgICAgICByZXR1cm4gdG1wOwogICAg ICB9CiAgCiAgICB0bXAgPSBnZmNfY29udl9hcnJheV9kYXRhIChkZXNjKTsK LS0tIDM0NDYsMzQ3MiAtLS0tCiAgewogICAgdHJlZSB0bXA7CiAgICB0cmVl IHR5cGU7CiEgICB0cmVlIGNkZXNjOwogIAogICAgLyogRm9yIGNsYXNzIGFy cmF5cyB0aGUgY2xhc3MgZGVjbGFyYXRpb24gaXMgc3RvcmVkIGluIHRoZSBz YXZlZAogICAgICAgZGVzY3JpcHRvci4gICovCiAgICBpZiAoSU5ESVJFQ1Rf UkVGX1AgKGRlc2MpCiAgICAgICAgJiYgREVDTF9MQU5HX1NQRUNJRklDIChU UkVFX09QRVJBTkQgKGRlc2MsIDApKQogICAgICAgICYmIEdGQ19ERUNMX1NB VkVEX0RFU0NSSVBUT1IgKFRSRUVfT1BFUkFORCAoZGVzYywgMCkpKQohICAg ICBjZGVzYyA9IGdmY19jbGFzc19kYXRhX2dldCAoR0ZDX0RFQ0xfU0FWRURf REVTQ1JJUFRPUiAoCiAgCQkJCSAgVFJFRV9PUEVSQU5EIChkZXNjLCAwKSkp OwogICAgZWxzZQohICAgICBjZGVzYyA9IGRlc2M7CiAgCiAgICAvKiBDbGFz cyBjb250YWluZXIgdHlwZXMgZG8gbm90IGFsd2F5cyBoYXZlIHRoZSBHRkNf Q0xBU1NfVFlQRV9QCiAgICAgICBidXQgdGhlIGNhbm9uaWNhbCB0eXBlIGRv ZXMuICAqLwohICAgaWYgKEdGQ19ERVNDUklQVE9SX1RZUEVfUCAoVFJFRV9U WVBFIChjZGVzYykpCiEgICAgICAgJiYgVFJFRV9DT0RFIChjZGVzYykgPT0g Q09NUE9ORU5UX1JFRikKICAgICAgewohICAgICAgIHR5cGUgPSBUUkVFX1RZ UEUgKFRSRUVfT1BFUkFORCAoY2Rlc2MsIDApKTsKICAgICAgICBpZiAoVFlQ RV9DQU5PTklDQUwgKHR5cGUpCiAgCSAgJiYgR0ZDX0NMQVNTX1RZUEVfUCAo VFlQRV9DQU5PTklDQUwgKHR5cGUpKSkKISAJdnB0ciA9IGdmY19jbGFzc192 cHRyX2dldCAoVFJFRV9PUEVSQU5EIChjZGVzYywgMCkpOwogICAgICB9CiAg CiAgICB0bXAgPSBnZmNfY29udl9hcnJheV9kYXRhIChkZXNjKTsKKioqKioq KioqKioqKioqIGdmY19jb252X2FycmF5X3JlZiAoZ2ZjX3NlICogc2UsIGdm Y19hcnIKKioqIDMzNTAsMzM1NSAqKioqCi0tLSAzNDkwLDM0OTYgLS0tLQog ICAgdHJlZSBvZmZzZXQsIGNzdF9vZmZzZXQ7CiAgICB0cmVlIHRtcDsKICAg IHRyZWUgc3RyaWRlOworICAgdHJlZSBkZWNsID0gTlVMTF9UUkVFOwogICAg Z2ZjX3NlIGluZGV4c2U7CiAgICBnZmNfc2UgdG1wc2U7CiAgICBnZmNfc3lt Ym9sICogc3ltID0gZXhwci0+c3ltdHJlZS0+bi5zeW07CioqKioqKioqKioq KioqKiBnZmNfY29udl9hcnJheV9yZWYgKGdmY19zZSAqIHNlLCBnZmNfYXJy CioqKiAzNDk0LDM1MDEgKioqKgogICAgICBvZmZzZXQgPSBmb2xkX2J1aWxk Ml9sb2MgKGlucHV0X2xvY2F0aW9uLCBQTFVTX0VYUFIsCiAgCQkJICAgICAg Z2ZjX2FycmF5X2luZGV4X3R5cGUsIG9mZnNldCwgY3N0X29mZnNldCk7CiAg CiEgICBzZS0+ZXhwciA9IGJ1aWxkX2FycmF5X3JlZiAoc2UtPmV4cHIsIG9m ZnNldCwgc3ltLT50cy50eXBlID09IEJUX0NMQVNTID8KISAJCQkJTlVMTF9U UkVFIDogc3ltLT5iYWNrZW5kX2RlY2wsIHNlLT5jbGFzc192cHRyKTsKICB9 CiAgCiAgCi0tLSAzNjM1LDM2NjUgLS0tLQogICAgICBvZmZzZXQgPSBmb2xk X2J1aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9uLCBQTFVTX0VYUFIsCiAgCQkJ ICAgICAgZ2ZjX2FycmF5X2luZGV4X3R5cGUsIG9mZnNldCwgY3N0X29mZnNl dCk7CiAgCiEgICAvKiBBIHBvaW50ZXIgYXJyYXkgY29tcG9uZW50IGNhbiBi ZSBkZXRlY3RlZCBmcm9tIGl0cyBmaWVsZCBkZWNsLiBGaXgKISAgICAgIHRo ZSBkZXNjcmlwdG9yLCBtYXJrIHRoZSByZXN1bHRpbmcgdmFyaWFibGUgZGVj bCBhbmQgcGFzcyBpdCB0bwohICAgICAgYnVpbGRfYXJyYXlfcmVmLiAgKi8K ISAgIGlmICghZXhwci0+dHMuZGVmZXJyZWQgJiYgIXN5bS0+YXR0ci5jb2Rp bWVuc2lvbgohICAgICAgICYmIGlzX3BvaW50ZXJfYXJyYXkgKHNlLT5leHBy KSkKISAgICAgewohICAgICAgIGlmIChUUkVFX0NPREUgKHNlLT5leHByKSA9 PSBDT01QT05FTlRfUkVGKQohIAl7CiEgCSAgZGVjbCA9IGdmY19ldmFsdWF0 ZV9ub3cgKHNlLT5leHByLCAmc2UtPnByZSk7CiEgCSAgR0ZDX0RFQ0xfUFRS X0FSUkFZX1AgKGRlY2wpID0gMTsKISAJICBUUkVFX1VTRUQgKGRlY2wpID0g MTsKISAJfQohICAgICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoc2UtPmV4cHIp ID09IElORElSRUNUX1JFRikKISAJZGVjbCA9IFRSRUVfT1BFUkFORCAoc2Ut PmV4cHIsIDApOwohICAgICAgIGVsc2UKISAJZGVjbCA9IHNlLT5leHByOwoh ICAgICB9CiEgICBlbHNlIGlmIChleHByLT50cy5kZWZlcnJlZAohIAkgICB8 fCAoc3ltLT50cy50eXBlID09IEJUX0NIQVJBQ1RFUgohIAkgICAgICAgJiYg c3ltLT5hdHRyLnNlbGVjdF90eXBlX3RlbXBvcmFyeSkpCiEgICAgIGRlY2wg PSBzeW0tPmJhY2tlbmRfZGVjbDsKISAgIGVsc2UgaWYgKHN5bS0+dHMudHlw ZSA9PSBCVF9DTEFTUykKISAgICAgZGVjbCA9IE5VTExfVFJFRTsKISAKISAg IHNlLT5leHByID0gYnVpbGRfYXJyYXlfcmVmIChzZS0+ZXhwciwgb2Zmc2V0 LCBkZWNsLCBzZS0+Y2xhc3NfdnB0cik7CiAgfQogIAogIAoqKioqKioqKioq KioqKiogZ2ZjX2FycmF5X2FsbG9jYXRlIChnZmNfc2UgKiBzZSwgZ2ZjX2V4 cAoqKiogNTY0OCw1NjUzICoqKioKLS0tIDU4MTIsNTgzMCAtLS0tCiAgICBp ZiAoZGltZW5zaW9uKQogICAgICBnZmNfY29udl9kZXNjcmlwdG9yX29mZnNl dF9zZXQgKCZzZXRfZGVzY3JpcHRvcl9ibG9jaywgc2UtPmV4cHIsIG9mZnNl dCk7CiAgCisgICAvKiBQb2ludGVyIGFycmF5cyBuZWVkIHRoZSBzcGFuIGZp ZWxkIHRvIGJlIHNldC4gICovCisgICBpZiAoaXNfcG9pbnRlcl9hcnJheSAo c2UtPmV4cHIpCisgICAgICAgfHwgKGV4cHItPnRzLnR5cGUgPT0gQlRfQ0xB U1MKKyAJICAmJiBDTEFTU19EQVRBIChleHByKS0+YXR0ci5jbGFzc19wb2lu dGVyKSkKKyAgICAgeworICAgICAgIGlmIChleHByMyAmJiBleHByM19lbGVt X3NpemUgIT0gTlVMTF9UUkVFKQorIAl0bXAgPSBleHByM19lbGVtX3NpemU7 CisgICAgICAgZWxzZQorIAl0bXAgPSBUWVBFX1NJWkVfVU5JVCAoZ2ZjX2dl dF9lbGVtZW50X3R5cGUgKFRSRUVfVFlQRSAoc2UtPmV4cHIpKSk7CisgICAg ICAgdG1wID0gZm9sZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwg dG1wKTsKKyAgICAgICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fc2V0ICgm c2V0X2Rlc2NyaXB0b3JfYmxvY2ssIHNlLT5leHByLCB0bXApOworICAgICB9 CisgCiAgICBzZXRfZGVzY3JpcHRvciA9IGdmY19maW5pc2hfYmxvY2sgKCZz ZXRfZGVzY3JpcHRvcl9ibG9jayk7CiAgICBpZiAoc3RhdHVzICE9IE5VTExf VFJFRSkKICAgICAgewoqKioqKioqKioqKioqKiogZ2ZjX2NvbnZfZXhwcl9k ZXNjcmlwdG9yIChnZmNfc2UgKnNlLCBnZgoqKiogNjg1MSw2ODU2ICoqKioK LS0tIDcwMjgsNzAzNyAtLS0tCiAgCSAgICAgIC8qIEFkZCBhbnkgb2Zmc2V0 cyBmcm9tIHN1YnJlZmVyZW5jZXMuICAqLwogIAkgICAgICBnZmNfZ2V0X2Rh dGFwdHJfb2Zmc2V0ICgmc2UtPnByZSwgc2UtPmV4cHIsIGRlc2MsIE5VTExf VFJFRSwKICAJCQkJICAgICAgc3VicmVmX2FycmF5X3RhcmdldCwgZXhwcik7 CisgCisgCSAgICAgIC8qIC4uLi5hbmQgc2V0IHRoZSBzcGFuIGZpZWxkLiAg Ki8KKyAJICAgICAgdG1wID0gZ2V0X2FycmF5X3NwYW4gKGRlc2MsIGV4cHIp OworIAkgICAgICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fc2V0ICgmc2Ut PnByZSwgc2UtPmV4cHIsIHRtcCk7CiAgCSAgICB9CiAgCSAgZWxzZSBpZiAo c2UtPndhbnRfcG9pbnRlcikKICAJICAgIHsKKioqKioqKioqKioqKioqIGdm Y19jb252X2V4cHJfZGVzY3JpcHRvciAoZ2ZjX3NlICpzZSwgZ2YKKioqIDY4 ODYsNjg5MyAqKioqCi0tLSA3MDY3LDcwODQgLS0tLQogIAkgICAgc2UtPnNz ID0gc3M7CiAgCSAgZWxzZQogIAkgICAgZ2NjX2Fzc2VydCAoc2UtPnNzID09 IHNzKTsKKyAKKyAJICBpZiAoIWlzX3BvaW50ZXJfYXJyYXkgKHNlLT5leHBy KSkKKyAJICAgIHsKKyAJICAgICAgdG1wID0gZ2ZjX2dldF9lbGVtZW50X3R5 cGUgKFRSRUVfVFlQRSAoc2UtPmV4cHIpKTsKKyAJICAgICAgdG1wID0gZm9s ZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwKKyAJCQkJICBzaXpl X2luX2J5dGVzICh0bXApKTsKKyAJICAgICAgZ2ZjX2NvbnZfZGVzY3JpcHRv cl9zcGFuX3NldCAoJnNlLT5wcmUsIHNlLT5leHByLCB0bXApOworIAkgICAg fQorIAogIAkgIHNlLT5leHByID0gZ2ZjX2J1aWxkX2FkZHJfZXhwciAoTlVM TF9UUkVFLCBzZS0+ZXhwcik7CiAgCSAgZ2ZjX2NvbnZfZXhwciAoc2UsIGV4 cHIpOworIAogIAkgIGdmY19mcmVlX3NzX2NoYWluIChzcyk7CiAgCSAgcmV0 dXJuOwogIAl9CioqKioqKioqKioqKioqKiBnZmNfY29udl9leHByX2Rlc2Ny aXB0b3IgKGdmY19zZSAqc2UsIGdmCioqKiA3MTA3LDcxMTUgKioqKgogICAg ICAgIGRlc2MgPSBpbmZvLT5kZXNjcmlwdG9yOwogICAgICAgIGlmIChzZS0+ ZGlyZWN0X2J5cmVmICYmICFzZS0+YnlyZWZfbm9hc3NpZ24pCiAgCXsKISAJ ICAvKiBGb3IgcG9pbnRlciBhc3NpZ25tZW50cyB3ZSBmaWxsIGluIHRoZSBk ZXN0aW5hdGlvbi4gICovCiAgCSAgcGFybSA9IHNlLT5leHByOwogIAkgIHBh cm10eXBlID0gVFJFRV9UWVBFIChwYXJtKTsKICAJfQogICAgICAgIGVsc2UK ICAJewotLS0gNzI5OCw3MzEwIC0tLS0KICAgICAgICBkZXNjID0gaW5mby0+ ZGVzY3JpcHRvcjsKICAgICAgICBpZiAoc2UtPmRpcmVjdF9ieXJlZiAmJiAh c2UtPmJ5cmVmX25vYXNzaWduKQogIAl7CiEgCSAgLyogRm9yIHBvaW50ZXIg YXNzaWdubWVudHMgd2UgZmlsbCBpbiB0aGUgZGVzdGluYXRpb24uLi4uICAq LwogIAkgIHBhcm0gPSBzZS0+ZXhwcjsKICAJICBwYXJtdHlwZSA9IFRSRUVf VFlQRSAocGFybSk7CisgCisgCSAgLyogLi4uLmFuZCBzZXQgdGhlIHNwYW4g ZmllbGQuICAqLworIAkgIHRtcCA9IGdldF9hcnJheV9zcGFuIChkZXNjLCBl eHByKTsKKyAJICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fc2V0ICgmbG9v cC5wcmUsIHBhcm0sIHRtcCk7CiAgCX0KICAgICAgICBlbHNlCiAgCXsKKioq KioqKioqKioqKioqIGdmY19jb252X2FycmF5X3BhcmFtZXRlciAoZ2ZjX3Nl ICogc2UsIGcKKioqIDc1ODIsNzU4NyAqKioqCi0tLSA3Nzc3LDc3ODMgLS0t LQogICAgICAgIC8qIEV2ZXJ5IG90aGVyIHR5cGUgb2YgYXJyYXkuICAqLwog ICAgICAgIHNlLT53YW50X3BvaW50ZXIgPSAxOwogICAgICAgIGdmY19jb252 X2V4cHJfZGVzY3JpcHRvciAoc2UsIGV4cHIpOworIAogICAgICAgIGlmIChz aXplKQogIAlhcnJheV9wYXJhbWV0ZXJfc2l6ZSAoYnVpbGRfZm9sZF9pbmRp cmVjdF9yZWZfbG9jIChpbnB1dF9sb2NhdGlvbiwKICAJCQkJCQkgICAgICAg c2UtPmV4cHIpLApJbmRleDogZ2NjL2ZvcnRyYW4vdHJhbnMtYXJyYXkuaAo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2MvZm9ydHJhbi90cmFucy1h cnJheS5oCShyZXZpc2lvbiAyNTAwODIpCi0tLSBnY2MvZm9ydHJhbi90cmFu cy1hcnJheS5oCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKiB0cmVl IGdmY19jb252X2FycmF5X3Vib3VuZCAodHJlZSwgaW50KTsKKioqIDE1Miwx NjAgKioqKgotLS0gMTUyLDE2NCAtLS0tCiAgdm9pZCBnZmNfdHJhbnNfYXJy YXlfY29ib3VuZHMgKHRyZWUsIHN0bXRibG9ja190ICosIGNvbnN0IGdmY19z eW1ib2wgKik7CiAgCiAgLyogQnVpbGQgZXhwcmVzc2lvbnMgZm9yIGFjY2Vz c2luZyBjb21wb25lbnRzIG9mIGFuIGFycmF5IGRlc2NyaXB0b3IuICAqLwor IHZvaWQgZ2ZjX2dldF9kZXNjcmlwdG9yX29mZnNldHNfZm9yX2luZm8gKGNv bnN0X3RyZWUsIHRyZWUgKiwgdHJlZSAqLCB0cmVlICosIHRyZWUgKiwKKyAJ CQkJCSAgdHJlZSAqLCB0cmVlICosIHRyZWUgKik7CisgCiAgdHJlZSBnZmNf Y29udl9kZXNjcmlwdG9yX2RhdGFfZ2V0ICh0cmVlKTsKICB0cmVlIGdmY19j b252X2Rlc2NyaXB0b3JfZGF0YV9hZGRyICh0cmVlKTsKICB0cmVlIGdmY19j b252X2Rlc2NyaXB0b3Jfb2Zmc2V0X2dldCAodHJlZSk7CisgdHJlZSBnZmNf Y29udl9kZXNjcmlwdG9yX3NwYW5fZ2V0ICh0cmVlKTsKICB0cmVlIGdmY19j b252X2Rlc2NyaXB0b3JfZHR5cGUgKHRyZWUpOwogIHRyZWUgZ2ZjX2NvbnZf ZGVzY3JpcHRvcl9yYW5rICh0cmVlKTsKICB0cmVlIGdmY19nZXRfZGVzY3Jp cHRvcl9kaW1lbnNpb24gKHRyZWUpOwoqKioqKioqKioqKioqKiogdHJlZSBn ZmNfY29udl9kZXNjcmlwdG9yX3Rva2VuICh0cmVlKTsKKioqIDE2NSwxNzAg KioqKgotLS0gMTY5LDE3NSAtLS0tCiAgCiAgdm9pZCBnZmNfY29udl9kZXNj cmlwdG9yX2RhdGFfc2V0IChzdG10YmxvY2tfdCAqLCB0cmVlLCB0cmVlKTsK ICB2b2lkIGdmY19jb252X2Rlc2NyaXB0b3Jfb2Zmc2V0X3NldCAoc3RtdGJs b2NrX3QgKiwgdHJlZSwgdHJlZSk7Cisgdm9pZCBnZmNfY29udl9kZXNjcmlw dG9yX3NwYW5fc2V0IChzdG10YmxvY2tfdCAqLCB0cmVlLCB0cmVlKTsKICB2 b2lkIGdmY19jb252X2Rlc2NyaXB0b3Jfc3RyaWRlX3NldCAoc3RtdGJsb2Nr X3QgKiwgdHJlZSwgdHJlZSwgdHJlZSk7CiAgdm9pZCBnZmNfY29udl9kZXNj cmlwdG9yX2xib3VuZF9zZXQgKHN0bXRibG9ja190ICosIHRyZWUsIHRyZWUs IHRyZWUpOwogIHZvaWQgZ2ZjX2NvbnZfZGVzY3JpcHRvcl91Ym91bmRfc2V0 IChzdG10YmxvY2tfdCAqLCB0cmVlLCB0cmVlLCB0cmVlKTsKSW5kZXg6IGdj Yy9mb3J0cmFuL3RyYW5zLWRlY2wuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiBnY2MvZm9ydHJhbi90cmFucy1kZWNsLmMJKHJldmlzaW9uIDI1MDA4 MikKLS0tIGdjYy9mb3J0cmFuL3RyYW5zLWRlY2wuYwkod29ya2luZyBjb3B5 KQoqKioqKioqKioqKioqKiogZ2ZjX2dldF9zeW1ib2xfZGVjbCAoZ2ZjX3N5 bWJvbCAqIHN5bSkKKioqIDE1MTcsMTUyMiAqKioqCi0tLSAxNTE3LDE1MjUg LS0tLQogICAgICAgIC8qIER1bW15IHZhcmlhYmxlcyBzaG91bGQgYWxyZWFk eSBoYXZlIGJlZW4gY3JlYXRlZC4gICovCiAgICAgICAgZ2NjX2Fzc2VydCAo c3ltLT5iYWNrZW5kX2RlY2wpOwogIAorICAgICAgIGlmIChzeW0tPmF0dHIu cG9pbnRlciAmJiBzeW0tPmF0dHIuZGltZW5zaW9uICYmIHN5bS0+dHMudHlw ZSAhPSBCVF9DTEFTUykKKyAJR0ZDX0RFQ0xfUFRSX0FSUkFZX1AgKHN5bS0+ YmFja2VuZF9kZWNsKSA9IDE7CisgCiAgICAgICAgLyogQ3JlYXRlIGEgY2hh cmFjdGVyIGxlbmd0aCB2YXJpYWJsZS4gICovCiAgICAgICAgaWYgKHN5bS0+ dHMudHlwZSA9PSBCVF9DSEFSQUNURVIpCiAgCXsKKioqKioqKioqKioqKioq IGdmY19nZXRfc3ltYm9sX2RlY2wgKGdmY19zeW1ib2wgKiBzeW0pCioqKiAx NzUxLDE3NzcgKioqKgogICAgaWYgKHN5bS0+dHMudHlwZSA9PSBCVF9DSEFS QUNURVIpCiAgICAgIC8qIENoYXJhY3RlciB2YXJpYWJsZXMgbmVlZCBzcGVj aWFsIGhhbmRsaW5nLiAgKi8KICAgICAgZ2ZjX2FsbG9jYXRlX2xhbmdfZGVj bCAoZGVjbCk7Ci0gICBlbHNlIGlmIChzeW0tPmF0dHIuc3VicmVmX2FycmF5 X3BvaW50ZXIpCi0gICAgIC8qIFdlIG5lZWQgdGhlIHNwYW4gZm9yIHRoZXNl IGJlYXN0cy4gICovCi0gICAgIGdmY19hbGxvY2F0ZV9sYW5nX2RlY2wgKGRl Y2wpOwogIAohICAgaWYgKHN5bS0+YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRl cikKISAgICAgewohICAgICAgIHRyZWUgc3BhbjsKISAgICAgICBHRkNfREVD TF9TVUJSRUZfQVJSQVlfUCAoZGVjbCkgPSAxOwohICAgICAgIHNwYW4gPSBi dWlsZF9kZWNsIChpbnB1dF9sb2NhdGlvbiwKISAJCQkgVkFSX0RFQ0wsIGNy ZWF0ZV90bXBfdmFyX25hbWUgKCJzcGFuIiksCiEgCQkJIGdmY19hcnJheV9p bmRleF90eXBlKTsKISAgICAgICBnZmNfZmluaXNoX3Zhcl9kZWNsIChzcGFu LCBzeW0pOwohICAgICAgIFRSRUVfU1RBVElDIChzcGFuKSA9IFRSRUVfU1RB VElDIChkZWNsKTsKISAgICAgICBERUNMX0FSVElGSUNJQUwgKHNwYW4pID0g MTsKICAKISAgICAgICBHRkNfREVDTF9TUEFOIChkZWNsKSA9IHNwYW47CiEg ICAgICAgR0ZDX1RZUEVfQVJSQVlfU1BBTiAoVFJFRV9UWVBFIChkZWNsKSkg PSBzcGFuOwohICAgICB9CiAgCiAgICBpZiAoc3ltLT50cy50eXBlID09IEJU X0NMQVNTKQohIAlHRkNfREVDTF9DTEFTUyhkZWNsKSA9IDE7CiAgCiAgICBz eW0tPmJhY2tlbmRfZGVjbCA9IGRlY2w7CiAgCi0tLSAxNzU0LDE3NzEgLS0t LQogICAgaWYgKHN5bS0+dHMudHlwZSA9PSBCVF9DSEFSQUNURVIpCiAgICAg IC8qIENoYXJhY3RlciB2YXJpYWJsZXMgbmVlZCBzcGVjaWFsIGhhbmRsaW5n LiAgKi8KICAgICAgZ2ZjX2FsbG9jYXRlX2xhbmdfZGVjbCAoZGVjbCk7CiAg CiEgICBpZiAoc3ltLT5hc3NvYyAmJiBzeW0tPmF0dHIuc3VicmVmX2FycmF5 X3BvaW50ZXIpCiEgICAgIHN5bS0+YXR0ci5wb2ludGVyID0gMTsKICAKISAg IGlmIChzeW0tPmF0dHIucG9pbnRlciAmJiBzeW0tPmF0dHIuZGltZW5zaW9u CiEgICAgICAgJiYgIXN5bS0+dHMuZGVmZXJyZWQKISAgICAgICAmJiAhKHN5 bS0+YXR0ci5zZWxlY3RfdHlwZV90ZW1wb3JhcnkKISAJICAgJiYgIXN5bS0+ YXR0ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikpCiEgICAgIEdGQ19ERUNMX1BU Ul9BUlJBWV9QIChkZWNsKSA9IDE7CiAgCiAgICBpZiAoc3ltLT50cy50eXBl ID09IEJUX0NMQVNTKQohICAgICBHRkNfREVDTF9DTEFTUyhkZWNsKSA9IDE7 CiAgCiAgICBzeW0tPmJhY2tlbmRfZGVjbCA9IGRlY2w7CiAgCioqKioqKioq KioqKioqKiBnZmNfdHJhbnNfZGVmZXJyZWRfdmFycyAoZ2ZjX3N5bWJvbCAq IHByCioqKiA0MjY5LDQyODEgKioqKgogICAgICAgIGlmIChzeW0tPmFzc29j KQogIAljb250aW51ZTsKICAKISAgICAgICBpZiAoc3ltLT5hdHRyLnN1YnJl Zl9hcnJheV9wb2ludGVyCiEgCSAgJiYgR0ZDX0RFQ0xfU1BBTiAoc3ltLT5i YWNrZW5kX2RlY2wpCiEgCSAgJiYgIVRSRUVfU1RBVElDIChHRkNfREVDTF9T UEFOIChzeW0tPmJhY2tlbmRfZGVjbCkpKQogIAl7CiAgCSAgZ2ZjX2luaXRf YmxvY2sgKCZ0bXBibG9jayk7CiEgCSAgZ2ZjX2FkZF9tb2RpZnkgKCZ0bXBi bG9jaywgR0ZDX0RFQ0xfU1BBTiAoc3ltLT5iYWNrZW5kX2RlY2wpLAohIAkJ CSAgYnVpbGRfaW50X2NzdCAoZ2ZjX2FycmF5X2luZGV4X3R5cGUsIDApKTsK ICAJICBnZmNfYWRkX2luaXRfY2xlYW51cCAoYmxvY2ssIGdmY19maW5pc2hf YmxvY2sgKCZ0bXBibG9jayksCiAgCQkJCU5VTExfVFJFRSk7CiAgCX0KLS0t IDQyNjMsNDI3NyAtLS0tCiAgICAgICAgaWYgKHN5bS0+YXNzb2MpCiAgCWNv bnRpbnVlOwogIAohICAgICAgIGlmIChzeW0tPmF0dHIucG9pbnRlciAmJiBz eW0tPmF0dHIuZGltZW5zaW9uCiEgCSAgJiYgIXN5bS0+YXR0ci51c2VfYXNz b2MKISAJICAmJiAhc3ltLT5hdHRyLmhvc3RfYXNzb2MKISAJICAmJiAhc3lt LT5hdHRyLmR1bW15CiEgCSAgJiYgR0ZDX0RFU0NSSVBUT1JfVFlQRV9QIChU UkVFX1RZUEUgKHN5bS0+YmFja2VuZF9kZWNsKSkpCiAgCXsKICAJICBnZmNf aW5pdF9ibG9jayAoJnRtcGJsb2NrKTsKISAJICBnZmNfY29udl9kZXNjcmlw dG9yX3NwYW5fc2V0ICgmdG1wYmxvY2ssIHN5bS0+YmFja2VuZF9kZWNsLAoh IAkJCQlidWlsZF9pbnRfY3N0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwgMCkp OwogIAkgIGdmY19hZGRfaW5pdF9jbGVhbnVwIChibG9jaywgZ2ZjX2Zpbmlz aF9ibG9jayAoJnRtcGJsb2NrKSwKICAJCQkJTlVMTF9UUkVFKTsKICAJfQpJ bmRleDogZ2NjL2ZvcnRyYW4vdHJhbnMtZXhwci5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL3RyYW5zLWV4cHIuYwkocmV2aXNp b24gMjUwMDgyKQotLS0gZ2NjL2ZvcnRyYW4vdHJhbnMtZXhwci5jCSh3b3Jr aW5nIGNvcHkpCioqKioqKioqKioqKioqKiBnZmNfY29udl9wcm9jZWR1cmVf Y2FsbCAoZ2ZjX3NlICogc2UsIGdmCioqKiA1NDEzLDU0MTkgKioqKgogIAkJ fQogIAogIAkgICAgICBpZiAoZS0+ZXhwcl90eXBlID09IEVYUFJfVkFSSUFC TEUKISAJCSAgICAmJiBpc19zdWJyZWZfYXJyYXkgKGUpKQogIAkJLyogVGhl IGFjdHVhbCBhcmd1bWVudCBpcyBhIGNvbXBvbmVudCByZWZlcmVuY2UgdG8g YW4KICAJCSAgIGFycmF5IG9mIGRlcml2ZWQgdHlwZXMuICBJbiB0aGlzIGNh c2UsIHRoZSBhcmd1bWVudAogIAkJICAgaXMgY29udmVydGVkIHRvIGEgdGVt cG9yYXJ5LCB3aGljaCBpcyBwYXNzZWQgYW5kIHRoZW4KLS0tIDU0MTMsNTQy MCAtLS0tCiAgCQl9CiAgCiAgCSAgICAgIGlmIChlLT5leHByX3R5cGUgPT0g RVhQUl9WQVJJQUJMRQohIAkJICAgICYmIGlzX3N1YnJlZl9hcnJheSAoZSkK ISAJCSAgICAmJiAhKGZzeW0gJiYgZnN5bS0+YXR0ci5wb2ludGVyKSkKICAJ CS8qIFRoZSBhY3R1YWwgYXJndW1lbnQgaXMgYSBjb21wb25lbnQgcmVmZXJl bmNlIHRvIGFuCiAgCQkgICBhcnJheSBvZiBkZXJpdmVkIHR5cGVzLiAgSW4g dGhpcyBjYXNlLCB0aGUgYXJndW1lbnQKICAJCSAgIGlzIGNvbnZlcnRlZCB0 byBhIHRlbXBvcmFyeSwgd2hpY2ggaXMgcGFzc2VkIGFuZCB0aGVuCioqKioq KioqKioqKioqKiBnZmNfdHJhbnNfcG9pbnRlcl9hc3NpZ25tZW50IChnZmNf ZXhwciAqCioqKiA4MjIzLDgyMjkgKioqKgogICAgc3RtdGJsb2NrX3QgYmxv Y2s7CiAgICB0cmVlIGRlc2M7CiAgICB0cmVlIHRtcDsKLSAgIHRyZWUgZGVj bDsKICAgIGJvb2wgc2NhbGFyLCBub25fcHJvY19wb2ludGVyX2Fzc2lnbjsK ICAgIGdmY19zcyAqc3M7CiAgCi0tLSA4MjI0LDgyMjkgLS0tLQoqKioqKioq KioqKioqKiogZ2ZjX3RyYW5zX3BvaW50ZXJfYXNzaWdubWVudCAoZ2ZjX2V4 cHIgKgoqKiogODQxMiw4NDQxICoqKioKICAJICBnZmNfY29udl9leHByX2Rl c2NyaXB0b3IgKCZsc2UsIGV4cHIyKTsKICAJICBzdHJsZW5fcmhzID0gbHNl LnN0cmluZ19sZW5ndGg7CiAgCiEgCSAgLyogSWYgdGhpcyBpcyBhIHN1YnJl ZmVyZW5jZSBhcnJheSBwb2ludGVyIGFzc2lnbm1lbnQsIHVzZSB0aGUgcmhz CiEgCSAgICAgZGVzY3JpcHRvciBlbGVtZW50IHNpemUgZm9yIHRoZSBsaHMg c3Bhbi4gICovCiEgCSAgaWYgKGV4cHIxLT5zeW10cmVlLT5uLnN5bS0+YXR0 ci5zdWJyZWZfYXJyYXlfcG9pbnRlcikKISAJICAgIHsKISAJICAgICAgZGVj bCA9IGV4cHIxLT5zeW10cmVlLT5uLnN5bS0+YmFja2VuZF9kZWNsOwohIAkg ICAgICBnZmNfaW5pdF9zZSAoJnJzZSwgTlVMTCk7CiEgCSAgICAgIHJzZS5k ZXNjcmlwdG9yX29ubHkgPSAxOwohIAkgICAgICBnZmNfY29udl9leHByICgm cnNlLCBleHByMik7CiEgCSAgICAgIGlmIChleHByMS0+dHMudHlwZSA9PSBC VF9DTEFTUykKISAJCXRyYW5zX2NsYXNzX3ZwdHJfbGVuX2Fzc2lnbm1lbnQg KCZibG9jaywgZXhwcjEsIGV4cHIyLCAmcnNlLAohIAkJCQkJCSBOVUxMLCBO VUxMKTsKISAJICAgICAgdG1wID0gZ2ZjX2dldF9lbGVtZW50X3R5cGUgKFRS RUVfVFlQRSAocnNlLmV4cHIpKTsKISAJICAgICAgdG1wID0gZm9sZF9jb252 ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwgc2l6ZV9pbl9ieXRlcyAodG1w KSk7CiEgCSAgICAgIGlmICghSU5URUdFUl9DU1RfUCAodG1wKSkKISAJCWdm Y19hZGRfYmxvY2tfdG9fYmxvY2sgKCZsc2UucG9zdCwgJnJzZS5wcmUpOwoh IAkgICAgICBnZmNfYWRkX21vZGlmeSAoJmxzZS5wb3N0LCBHRkNfREVDTF9T UEFOKGRlY2wpLCB0bXApOwohIAkgICAgfQohIAkgIGVsc2UgaWYgKGV4cHIx LT50cy50eXBlID09IEJUX0NMQVNTKQogIAkgICAgewogIAkgICAgICByc2Uu ZXhwciA9IE5VTExfVFJFRTsKICAJICAgICAgcnNlLnN0cmluZ19sZW5ndGgg PSBOVUxMX1RSRUU7CiAgCSAgICAgIHRyYW5zX2NsYXNzX3ZwdHJfbGVuX2Fz c2lnbm1lbnQgKCZibG9jaywgZXhwcjEsIGV4cHIyLCAmcnNlLAogIAkJCQkJ ICAgICAgIE5VTEwsIE5VTEwpOwogIAkgICAgfQogIAl9CiAgICAgICAgZWxz ZSBpZiAoZXhwcjItPmV4cHJfdHlwZSA9PSBFWFBSX0ZVTkNUSU9OICYmIGV4 cHIyLT50cy50eXBlID09IEJUX0NMQVNTKQogIAl7Ci0tLSA4NDEyLDg0MzUg LS0tLQogIAkgIGdmY19jb252X2V4cHJfZGVzY3JpcHRvciAoJmxzZSwgZXhw cjIpOwogIAkgIHN0cmxlbl9yaHMgPSBsc2Uuc3RyaW5nX2xlbmd0aDsKICAK ISAJICBpZiAoZXhwcjEtPnRzLnR5cGUgPT0gQlRfQ0xBU1MpCiAgCSAgICB7 CiAgCSAgICAgIHJzZS5leHByID0gTlVMTF9UUkVFOwogIAkgICAgICByc2Uu c3RyaW5nX2xlbmd0aCA9IE5VTExfVFJFRTsKICAJICAgICAgdHJhbnNfY2xh c3NfdnB0cl9sZW5fYXNzaWdubWVudCAoJmJsb2NrLCBleHByMSwgZXhwcjIs ICZyc2UsCiAgCQkJCQkgICAgICAgTlVMTCwgTlVMTCk7CiAgCSAgICB9Cisg CisgCSAgaWYgKHJlbWFwID09IE5VTEwpCisgCSAgICB7CisgCSAgICAgIC8q IElzIHRoZSB0YXJnZXQgYSB3aG9sZSBhcnJheT8gIElmIG5vdCwgcmVtYXAg d2lsbAorIAkJIGJlIG5vbi1udWxsLiAgKi8KKyAJICAgICAgZm9yIChyZW1h cCA9IGV4cHIyLT5yZWY7IHJlbWFwOyByZW1hcCA9IHJlbWFwLT5uZXh0KQor IAkJaWYgKHJlbWFwLT50eXBlID09IFJFRl9BUlJBWQorIAkJICAgICYmIHJl bWFwLT51LmFyLnR5cGUgPT0gQVJfRlVMTAorIAkJICAgICYmIHJlbWFwLT5u ZXh0KQorIAkJICBicmVhazsKKyAJICAgIH0KICAJfQogICAgICAgIGVsc2Ug aWYgKGV4cHIyLT5leHByX3R5cGUgPT0gRVhQUl9GVU5DVElPTiAmJiBleHBy Mi0+dHMudHlwZSA9PSBCVF9DTEFTUykKICAJewoqKioqKioqKioqKioqKiog Z2ZjX3RyYW5zX3BvaW50ZXJfYXNzaWdubWVudCAoZ2ZjX2V4cHIgKgoqKiog ODQ0Niw4NDUyICoqKioKICAJICAgIHsKICAJICAgICAgcnNlLmV4cHIgPSBn ZmNfY2xhc3NfZGF0YV9nZXQgKHJzZS5leHByKTsKICAJICAgICAgZ2ZjX2Fk ZF9tb2RpZnkgKCZsc2UucHJlLCBkZXNjLCByc2UuZXhwcik7CiEgCSAgICB9 CiAgCSAgZWxzZQogIAkgICAgewogIAkgICAgICBleHByMV92cHRyID0gdHJh bnNfY2xhc3NfdnB0cl9sZW5fYXNzaWdubWVudCAoJmJsb2NrLCBleHByMSwK LS0tIDg0NDAsODQ1MSAtLS0tCiAgCSAgICB7CiAgCSAgICAgIHJzZS5leHBy ID0gZ2ZjX2NsYXNzX2RhdGFfZ2V0IChyc2UuZXhwcik7CiAgCSAgICAgIGdm Y19hZGRfbW9kaWZ5ICgmbHNlLnByZSwgZGVzYywgcnNlLmV4cHIpOwohIAkg ICAgICAvKiBTZXQgdGhlIGxocyBzcGFuLiAgKi8KISAJICAgICAgdG1wID0g VFJFRV9UWVBFIChyc2UuZXhwcik7CiEgCSAgICAgIHRtcCA9IFRZUEVfU0la RV9VTklUIChnZmNfZ2V0X2VsZW1lbnRfdHlwZSAodG1wKSk7CiEgCSAgICAg IHRtcCA9IGZvbGRfY29udmVydCAoZ2ZjX2FycmF5X2luZGV4X3R5cGUsIHRt cCk7CiEgCSAgICAgIGdmY19jb252X2Rlc2NyaXB0b3Jfc3Bhbl9zZXQgKCZs c2UucHJlLCBkZXNjLCB0bXApOwohICAJICAgIH0KICAJICBlbHNlCiAgCSAg ICB7CiAgCSAgICAgIGV4cHIxX3ZwdHIgPSB0cmFuc19jbGFzc192cHRyX2xl bl9hc3NpZ25tZW50ICgmYmxvY2ssIGV4cHIxLAoqKioqKioqKioqKioqKiog Z2ZjX3RyYW5zX3BvaW50ZXJfYXNzaWdubWVudCAoZ2ZjX2V4cHIgKgoqKiog ODQ5Miw4NDk4ICoqKioKICAJCSBjb252ZXJ0ZWQgaW4gcnNlIGFuZCBub3cg aGF2ZSB0byBidWlsZCB0aGUgY29ycmVjdCBMSFMKICAJCSBkZXNjcmlwdG9y IGZvciBpdC4gICovCiAgCiEgCSAgICAgIHRyZWUgZHR5cGUsIGRhdGE7CiAg CSAgICAgIHRyZWUgb2Zmcywgc3RyaWRlOwogIAkgICAgICB0cmVlIGxib3Vu ZCwgdWJvdW5kOwogIAotLS0gODQ5MSw4NDk3IC0tLS0KICAJCSBjb252ZXJ0 ZWQgaW4gcnNlIGFuZCBub3cgaGF2ZSB0byBidWlsZCB0aGUgY29ycmVjdCBM SFMKICAJCSBkZXNjcmlwdG9yIGZvciBpdC4gICovCiAgCiEgCSAgICAgIHRy ZWUgZHR5cGUsIGRhdGEsIHNwYW47CiAgCSAgICAgIHRyZWUgb2Zmcywgc3Ry aWRlOwogIAkgICAgICB0cmVlIGxib3VuZCwgdWJvdW5kOwogIAoqKioqKioq KioqKioqKiogZ2ZjX3RyYW5zX3BvaW50ZXJfYXNzaWdubWVudCAoZ2ZjX2V4 cHIgKgoqKiogODUwNSw4NTEwICoqKioKLS0tIDg1MDQsODUyMSAtLS0tCiAg CSAgICAgIGRhdGEgPSBnZmNfY29udl9kZXNjcmlwdG9yX2RhdGFfZ2V0IChy c2UuZXhwcik7CiAgCSAgICAgIGdmY19jb252X2Rlc2NyaXB0b3JfZGF0YV9z ZXQgKCZibG9jaywgZGVzYywgZGF0YSk7CiAgCisgCSAgICAgIC8qIENvcHkg dGhlIHNwYW4uICAqLworIAkgICAgICBpZiAoVFJFRV9DT0RFIChyc2UuZXhw cikgPT0gVkFSX0RFQ0wKKyAJCSAgJiYgR0ZDX0RFQ0xfUFRSX0FSUkFZX1Ag KHJzZS5leHByKSkKKyAJCXNwYW4gPSBnZmNfY29udl9kZXNjcmlwdG9yX3Nw YW5fZ2V0IChyc2UuZXhwcik7CisgCSAgICAgIGVsc2UKKyAJCXsKKyAJCSAg dG1wID0gVFJFRV9UWVBFIChyc2UuZXhwcik7CisgCQkgIHRtcCA9IFRZUEVf U0laRV9VTklUIChnZmNfZ2V0X2VsZW1lbnRfdHlwZSAodG1wKSk7CisgCQkg IHNwYW4gPSBmb2xkX2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBlLCB0 bXApOworIAkJfQorIAkgICAgICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5f c2V0ICgmYmxvY2ssIGRlc2MsIHNwYW4pOworIAogIAkgICAgICAvKiBDb3B5 IG9mZnNldCBidXQgYWRqdXN0IGl0IHN1Y2ggdGhhdCBpdCB3b3VsZCBjb3Jy ZXNwb25kCiAgCQkgdG8gYSBsYm91bmQgb2YgemVyby4gICovCiAgCSAgICAg IG9mZnMgPSBnZmNfY29udl9kZXNjcmlwdG9yX29mZnNldF9nZXQgKHJzZS5l eHByKTsKKioqKioqKioqKioqKioqIGdmY190cmFuc19wb2ludGVyX2Fzc2ln bm1lbnQgKGdmY19leHByICoKKioqIDg1ODYsODU5NyAqKioqCiAgCQl7CiAg CQkgIGdmY19zZSBsYm91bmRfc2U7CiAgCi0gCQkgIGdjY19hc3NlcnQgKHJl bWFwLT51LmFyLnN0YXJ0W2RpbV0pOwogIAkJICBnY2NfYXNzZXJ0ICghcmVt YXAtPnUuYXIuZW5kW2RpbV0pOwogIAkJICBnZmNfaW5pdF9zZSAoJmxib3Vu ZF9zZSwgTlVMTCk7CiEgCQkgIGdmY19jb252X2V4cHIgKCZsYm91bmRfc2Us IHJlbWFwLT51LmFyLnN0YXJ0W2RpbV0pOwohIAohIAkJICBnZmNfYWRkX2Js b2NrX3RvX2Jsb2NrICgmYmxvY2ssICZsYm91bmRfc2UucHJlKTsKICAJCSAg Z2ZjX2NvbnZfc2hpZnRfZGVzY3JpcHRvcl9sYm91bmQgKCZibG9jaywgZGVz YywKICAJCQkJCQkgICAgZGltLCBsYm91bmRfc2UuZXhwcik7CiAgCQkgIGdm Y19hZGRfYmxvY2tfdG9fYmxvY2sgKCZibG9jaywgJmxib3VuZF9zZS5wb3N0 KTsKLS0tIDg1OTcsODYxMSAtLS0tCiAgCQl7CiAgCQkgIGdmY19zZSBsYm91 bmRfc2U7CiAgCiAgCQkgIGdjY19hc3NlcnQgKCFyZW1hcC0+dS5hci5lbmRb ZGltXSk7CiAgCQkgIGdmY19pbml0X3NlICgmbGJvdW5kX3NlLCBOVUxMKTsK ISAJCSAgaWYgKHJlbWFwLT51LmFyLnN0YXJ0W2RpbV0pCiEgCQkgICAgewoh IAkJICAgICAgZ2ZjX2NvbnZfZXhwciAoJmxib3VuZF9zZSwgcmVtYXAtPnUu YXIuc3RhcnRbZGltXSk7CiEgCQkgICAgICBnZmNfYWRkX2Jsb2NrX3RvX2Js b2NrICgmYmxvY2ssICZsYm91bmRfc2UucHJlKTsKISAJCSAgICB9CiEgCQkg IGVsc2UKISAJCSAgICBsYm91bmRfc2UuZXhwciA9IGdmY19pbmRleF9vbmVf bm9kZTsKICAJCSAgZ2ZjX2NvbnZfc2hpZnRfZGVzY3JpcHRvcl9sYm91bmQg KCZibG9jaywgZGVzYywKICAJCQkJCQkgICAgZGltLCBsYm91bmRfc2UuZXhw cik7CiAgCQkgIGdmY19hZGRfYmxvY2tfdG9fYmxvY2sgKCZibG9jaywgJmxi b3VuZF9zZS5wb3N0KTsKSW5kZXg6IGdjYy9mb3J0cmFuL3RyYW5zLWludHJp bnNpYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFu L3RyYW5zLWludHJpbnNpYy5jCShyZXZpc2lvbiAyNTAwODIpCi0tLSBnY2Mv Zm9ydHJhbi90cmFucy1pbnRyaW5zaWMuYwkod29ya2luZyBjb3B5KQoqKioq KioqKioqKioqKiogY29udl9leHByX3JlZl90b19jYWZfcmVmIChzdG10Ymxv Y2tfdCAqYgoqKiogMTIyNSwxMjM0ICoqKioKICAJICAgICAgJiYgcmVmLT51 LmMuY29tcG9uZW50LT5hdHRyLmRpbWVuc2lvbikKICAJICAgIHsKICAJICAg ICAgdHJlZSBhcnJfZGVzY190b2tlbl9vZmZzZXQ7CiEgCSAgICAgIC8qIEdl dCB0aGUgdG9rZW4gZnJvbSB0aGUgZGVzY3JpcHRvci4gICovCiEgCSAgICAg IGFycl9kZXNjX3Rva2VuX29mZnNldCA9IGdmY19hZHZhbmNlX2NoYWluICgK ISAJCSAgICBUWVBFX0ZJRUxEUyAoVFJFRV9UWVBFIChyZWYtPnUuYy5jb21w b25lbnQtPmJhY2tlbmRfZGVjbCkpLAohIAkJICAgIDQgLyogQ0FGX1RPS0VO X0ZJRUxEICAqLyk7CiAgCSAgICAgIGFycl9kZXNjX3Rva2VuX29mZnNldAog IAkJICA9IGNvbXB1dGVfY29tcG9uZW50X29mZnNldCAoYXJyX2Rlc2NfdG9r ZW5fb2Zmc2V0LAogIAkJCQkJICAgICAgVFJFRV9UWVBFICh0bXApKTsKLS0t IDEyMjUsMTIzMyAtLS0tCiAgCSAgICAgICYmIHJlZi0+dS5jLmNvbXBvbmVu dC0+YXR0ci5kaW1lbnNpb24pCiAgCSAgICB7CiAgCSAgICAgIHRyZWUgYXJy X2Rlc2NfdG9rZW5fb2Zmc2V0OwohIAkgICAgICAvKiBHZXQgdGhlIHRva2Vu IGZpZWxkIGZyb20gdGhlIGRlc2NyaXB0b3IuICAqLwohIAkgICAgICBhcnJf ZGVzY190b2tlbl9vZmZzZXQgPSBUUkVFX09QRVJBTkQgKAohIAkJICAgIGdm Y19jb252X2Rlc2NyaXB0b3JfdG9rZW4gKHJlZi0+dS5jLmNvbXBvbmVudC0+ YmFja2VuZF9kZWNsKSwgMSk7CiAgCSAgICAgIGFycl9kZXNjX3Rva2VuX29m ZnNldAogIAkJICA9IGNvbXB1dGVfY29tcG9uZW50X29mZnNldCAoYXJyX2Rl c2NfdG9rZW5fb2Zmc2V0LAogIAkJCQkJICAgICAgVFJFRV9UWVBFICh0bXAp KTsKKioqKioqKioqKioqKioqIGNvbnZfaXNvY2JpbmRpbmdfc3Vicm91dGlu ZSAoZ2ZjX2NvZGUgKmMKKioqIDgxMjksODEzNCAqKioqCi0tLSA4MTI4LDgx MzggLS0tLQogICAgZ2ZjX2FkZF9ibG9ja190b19ibG9jayAoJmJsb2NrLCAm ZnB0cnNlLnByZSk7CiAgICBkZXNjID0gZnB0cnNlLmV4cHI7CiAgCisgICAv KiBTZXQgdGhlIHNwYW4gZmllbGQuICAqLworICAgdG1wID0gVFlQRV9TSVpF X1VOSVQgKGdmY19nZXRfZWxlbWVudF90eXBlIChUUkVFX1RZUEUgKGRlc2Mp KSk7CisgICB0bXAgPSBmb2xkX2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90 eXBlLCB0bXApOworICAgZ2ZjX2NvbnZfZGVzY3JpcHRvcl9zcGFuX3NldCAo JmJsb2NrLCBkZXNjLCB0bXApOworIAogICAgLyogU2V0IGRhdGEgdmFsdWUs IGR0eXBlLCBhbmQgb2Zmc2V0LiAgKi8KICAgIHRtcCA9IEdGQ19UWVBFX0FS UkFZX0RBVEFQVFJfVFlQRSAoVFJFRV9UWVBFIChkZXNjKSk7CiAgICBnZmNf Y29udl9kZXNjcmlwdG9yX2RhdGFfc2V0ICgmYmxvY2ssIGRlc2MsIGZvbGRf Y29udmVydCAodG1wLCBjcHRyc2UuZXhwcikpOwpJbmRleDogZ2NjL2ZvcnRy YW4vdHJhbnMtaW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2Mv Zm9ydHJhbi90cmFucy1pby5jCShyZXZpc2lvbiAyNTAwODIpCi0tLSBnY2Mv Zm9ydHJhbi90cmFucy1pby5jCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioq KioqKiBnZmNfdHJhbnNfdHJhbnNmZXIgKGdmY19jb2RlICogY29kZSkKKioq IDI1NjMsMjU2OCAqKioqCi0tLSAyNTYzLDI1NzQgLS0tLQogIAkgIGdjY19h c3NlcnQgKHJlZiAmJiByZWYtPnR5cGUgPT0gUkVGX0FSUkFZKTsKICAJfQog IAorICAgICAgIGlmIChleHByLT50cy50eXBlICE9IEJUX0NMQVNTCisgCSAm JiBleHByLT5leHByX3R5cGUgPT0gRVhQUl9WQVJJQUJMRQorIAkgJiYgZ2Zj X2V4cHJfYXR0ciAoZXhwcikucG9pbnRlcikKKyAJZ290byBzY2FsYXJpemU7 CisgCisgCiAgICAgICAgaWYgKCEoZ2ZjX2J0X3N0cnVjdCAoZXhwci0+dHMu dHlwZSkKICAJICAgICAgfHwgZXhwci0+dHMudHlwZSA9PSBCVF9DTEFTUykK ICAJICAgICYmIHJlZiAmJiByZWYtPm5leHQgPT0gTlVMTAoqKioqKioqKioq KioqKiogZ2ZjX3RyYW5zX3RyYW5zZmVyIChnZmNfY29kZSAqIGNvZGUpCioq KiAyNTk3LDI2MDIgKioqKgotLS0gMjYwMywyNjA5IC0tLS0KICAJICBnb3Rv IGZpbmlzaF9ibG9ja19sYWJlbDsKICAJfQogIAorIHNjYWxhcml6ZToKICAg ICAgICAvKiBJbml0aWFsaXplIHRoZSBzY2FsYXJpemVyLiAgKi8KICAgICAg ICBzcyA9IGdmY193YWxrX2V4cHIgKGV4cHIpOwogICAgICAgIGdmY19pbml0 X2xvb3BpbmZvICgmbG9vcCk7CioqKioqKioqKioqKioqKiBnZmNfdHJhbnNf dHJhbnNmZXIgKGdmY19jb2RlICogY29kZSkKKioqIDI2MTIsMjYxOCAqKioq Ci0tLSAyNjE5LDI2MjcgLS0tLQogIAogICAgICAgIGdmY19jb3B5X2xvb3Bp bmZvX3RvX3NlICgmc2UsICZsb29wKTsKICAgICAgICBzZS5zcyA9IHNzOwor IAogICAgICAgIGdmY19jb252X2V4cHJfcmVmZXJlbmNlICgmc2UsIGV4cHIp OworIAogICAgICAgIGlmIChleHByLT50cy50eXBlID09IEJUX0NMQVNTKQog IAl2cHRyID0gZ2ZjX2dldF92cHRyX2Zyb21fZXhwciAoc3MtPmluZm8tPmRh dGEuYXJyYXkuZGVzY3JpcHRvcik7CiAgICAgICAgZWxzZQpJbmRleDogZ2Nj L2ZvcnRyYW4vdHJhbnMtc3RtdC5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K KioqIGdjYy9mb3J0cmFuL3RyYW5zLXN0bXQuYwkocmV2aXNpb24gMjUwMDgy KQotLS0gZ2NjL2ZvcnRyYW4vdHJhbnMtc3RtdC5jCSh3b3JraW5nIGNvcHkp CioqKioqKioqKioqKioqKiB0cmFuc19hc3NvY2lhdGVfdmFyIChnZmNfc3lt Ym9sICpzeW0sIGdmCioqKiAxNjA2LDE2MTIgKioqKgogIAkgICAgICA6IGUt PnN5bXRyZWUtPm4uc3ltLT5iYWNrZW5kX2RlY2w7CiAgCSAgdG1wID0gZ2Zj X2dldF9lbGVtZW50X3R5cGUgKFRSRUVfVFlQRSAodG1wKSk7CiAgCSAgdG1w ID0gZm9sZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwgc2l6ZV9p bl9ieXRlcyAodG1wKSk7CiEgCSAgZ2ZjX2FkZF9tb2RpZnkgKCZzZS5wcmUs IEdGQ19ERUNMX1NQQU4oZGVzYyksIHRtcCk7CiAgCX0KICAKICAgICAgICAv KiBEb25lLCByZWdpc3RlciBzdHVmZiBhcyBpbml0IC8gY2xlYW51cCBjb2Rl LiAgKi8KLS0tIDE2MDYsMTYxMiAtLS0tCiAgCSAgICAgIDogZS0+c3ltdHJl ZS0+bi5zeW0tPmJhY2tlbmRfZGVjbDsKICAJICB0bXAgPSBnZmNfZ2V0X2Vs ZW1lbnRfdHlwZSAoVFJFRV9UWVBFICh0bXApKTsKICAJICB0bXAgPSBmb2xk X2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBlLCBzaXplX2luX2J5dGVz ICh0bXApKTsKISAJICBnZmNfY29udl9kZXNjcmlwdG9yX3NwYW5fc2V0ICgm c2UucHJlLCBkZXNjLCB0bXApOwogIAl9CiAgCiAgICAgICAgLyogRG9uZSwg cmVnaXN0ZXIgc3R1ZmYgYXMgaW5pdCAvIGNsZWFudXAgY29kZS4gICovCklu ZGV4OiBnY2MvZm9ydHJhbi90cmFucy10eXBlcy5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmMJKHJldmlz aW9uIDI1MDA4MikKLS0tIGdjYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmMJKHdv cmtpbmcgY29weSkKKioqKioqKioqKioqKioqIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuCioqKiAzNSw0MCAqKioqCi0tLSAzNSw0 MSAtLS0tCiAgI2luY2x1ZGUgInRvcGxldi5oIgkvKiBGb3IgcmVzdF9vZl9k ZWNsX2NvbXBpbGF0aW9uLiAgKi8KICAjaW5jbHVkZSAidHJhbnMtdHlwZXMu aCIKICAjaW5jbHVkZSAidHJhbnMtY29uc3QuaCIKKyAjaW5jbHVkZSAidHJh bnMtYXJyYXkuaCIKICAjaW5jbHVkZSAiZHdhcmYyb3V0LmgiCS8qIEZvciBz dHJ1Y3QgYXJyYXlfZGVzY3JfaW5mby4gICovCiAgDAogIAoqKioqKioqKioq KioqKiogZ2ZjX2dldF9hcnJheV9kZXNjcmlwdG9yX2Jhc2UgKGludCBkaW1l bgoqKiogMTc4MiwxNzg3ICoqKioKLS0tIDE3ODMsMTc5NCAtLS0tCiAgCQkJ CSAgICBnZmNfYXJyYXlfaW5kZXhfdHlwZSwgJmNoYWluKTsKICAgIFRSRUVf Tk9fV0FSTklORyAoZGVjbCkgPSAxOwogIAorICAgLyogQWRkIHRoZSBzcGFu IGNvbXBvbmVudC4gICovCisgICBkZWNsID0gZ2ZjX2FkZF9maWVsZF90b19z dHJ1Y3RfMSAoZmF0X3R5cGUsCisgCQkJCSAgICBnZXRfaWRlbnRpZmllciAo InNwYW4iKSwKKyAJCQkJICAgIGdmY19hcnJheV9pbmRleF90eXBlLCAmY2hh aW4pOworICAgVFJFRV9OT19XQVJOSU5HIChkZWNsKSA9IDE7CisgCiAgICAv KiBCdWlsZCB0aGUgYXJyYXkgdHlwZSBmb3IgdGhlIHN0cmlkZSBhbmQgYm91 bmQgY29tcG9uZW50cy4gICovCiAgICBpZiAoZGltZW4gKyBjb2RpbWVuID4g MCkKICAgICAgewoqKioqKioqKioqKioqKiogZ2ZjX2dldF9kZXJpdmVkX3R5 cGUgKGdmY19zeW1ib2wgKiBkZXJpdgoqKiogMjcwOCwyNzEzICoqKioKLS0t IDI3MTUsMjcyNSAtLS0tCiAgICAgICAgaWYgKCFjLT5iYWNrZW5kX2RlY2wp CiAgCWMtPmJhY2tlbmRfZGVjbCA9IGZpZWxkOwogIAorICAgICAgIGlmIChj LT5hdHRyLnBvaW50ZXIgJiYgYy0+YXR0ci5kaW1lbnNpb24KKyAJICAmJiAh KGMtPnRzLnR5cGUgPT0gQlRfREVSSVZFRAorIAkgICAgICAgJiYgc3RyY21w IChjLT5uYW1lLCAiX2RhdGEiKSA9PSAwKSkKKyAJR0ZDX0RFQ0xfUFRSX0FS UkFZX1AgKGMtPmJhY2tlbmRfZGVjbCkgPSAxOworIAogICAgICAgIC8qIERv IG5vdCBhZGQgYSBjYWZfdG9rZW4gZmllbGQgZm9yIGNsYXNzZXMnIGRhdGEg Y29tcG9uZW50cy4gICovCiAgICAgICAgaWYgKGNvZGltZW4gJiYgIWMtPmF0 dHIuZGltZW5zaW9uICYmICFjLT5hdHRyLmNvZGltZW5zaW9uCiAgCSAgJiYg KGMtPmF0dHIuYWxsb2NhdGFibGUgfHwgYy0+YXR0ci5wb2ludGVyKQoqKioq KioqKioqKioqKiogZ2ZjX2dldF9hcnJheV9kZXNjcl9pbmZvIChjb25zdF90 cmVlIHR5cAoqKiogMzE0NiwzMTUyICoqKioKICB7CiAgICBpbnQgcmFuaywg ZGltOwogICAgYm9vbCBpbmRpcmVjdCA9IGZhbHNlOwohICAgdHJlZSBldHlw ZSwgcHR5cGUsIGZpZWxkLCB0LCBiYXNlX2RlY2w7CiAgICB0cmVlIGRhdGFf b2ZmLCBkaW1fb2ZmLCBkdHlwZV9vZmYsIGRpbV9zaXplLCBlbGVtX3NpemU7 CiAgICB0cmVlIGxvd2VyX3N1Ym9mZiwgdXBwZXJfc3Vib2ZmLCBzdHJpZGVf c3Vib2ZmOwogIAotLS0gMzE1OCwzMTY0IC0tLS0KICB7CiAgICBpbnQgcmFu aywgZGltOwogICAgYm9vbCBpbmRpcmVjdCA9IGZhbHNlOwohICAgdHJlZSBl dHlwZSwgcHR5cGUsIHQsIGJhc2VfZGVjbDsKICAgIHRyZWUgZGF0YV9vZmYs IGRpbV9vZmYsIGR0eXBlX29mZiwgZGltX3NpemUsIGVsZW1fc2l6ZTsKICAg IHRyZWUgbG93ZXJfc3Vib2ZmLCB1cHBlcl9zdWJvZmYsIHN0cmlkZV9zdWJv ZmY7CiAgCioqKioqKioqKioqKioqKiBnZmNfZ2V0X2FycmF5X2Rlc2NyX2lu Zm8gKGNvbnN0X3RyZWUgdHlwCioqKiAzMjAzLDMyMjYgKioqKgogICAgaWYg KGluZGlyZWN0KQogICAgICBiYXNlX2RlY2wgPSBidWlsZDEgKElORElSRUNU X1JFRiwgcHR5cGUsIGJhc2VfZGVjbCk7CiAgCiEgICBpZiAoR0ZDX1RZUEVf QVJSQVlfU1BBTiAodHlwZSkpCiEgICAgIGVsZW1fc2l6ZSA9IEdGQ19UWVBF X0FSUkFZX1NQQU4gKHR5cGUpOwohICAgZWxzZQohICAgICBlbGVtX3NpemUg PSBmb2xkX2NvbnZlcnQgKGdmY19hcnJheV9pbmRleF90eXBlLCBUWVBFX1NJ WkVfVU5JVCAoZXR5cGUpKTsKISAgIGZpZWxkID0gVFlQRV9GSUVMRFMgKFRZ UEVfTUFJTl9WQVJJQU5UICh0eXBlKSk7CiEgICBkYXRhX29mZiA9IGJ5dGVf cG9zaXRpb24gKGZpZWxkKTsKISAgIGZpZWxkID0gREVDTF9DSEFJTiAoZmll bGQpOwohICAgZmllbGQgPSBERUNMX0NIQUlOIChmaWVsZCk7CiEgICBkdHlw ZV9vZmYgPSBieXRlX3Bvc2l0aW9uIChmaWVsZCk7CiEgICBmaWVsZCA9IERF Q0xfQ0hBSU4gKGZpZWxkKTsKISAgIGRpbV9vZmYgPSBieXRlX3Bvc2l0aW9u IChmaWVsZCk7CiEgICBkaW1fc2l6ZSA9IFRZUEVfU0laRV9VTklUIChUUkVF X1RZUEUgKFRSRUVfVFlQRSAoZmllbGQpKSk7CiEgICBmaWVsZCA9IFRZUEVf RklFTERTIChUUkVFX1RZUEUgKFRSRUVfVFlQRSAoZmllbGQpKSk7CiEgICBz dHJpZGVfc3Vib2ZmID0gYnl0ZV9wb3NpdGlvbiAoZmllbGQpOwohICAgZmll bGQgPSBERUNMX0NIQUlOIChmaWVsZCk7CiEgICBsb3dlcl9zdWJvZmYgPSBi eXRlX3Bvc2l0aW9uIChmaWVsZCk7CiEgICBmaWVsZCA9IERFQ0xfQ0hBSU4g KGZpZWxkKTsKISAgIHVwcGVyX3N1Ym9mZiA9IGJ5dGVfcG9zaXRpb24gKGZp ZWxkKTsKICAKICAgIHQgPSBiYXNlX2RlY2w7CiAgICBpZiAoIWludGVnZXJf emVyb3AgKGRhdGFfb2ZmKSkKLS0tIDMyMTUsMzIyNSAtLS0tCiAgICBpZiAo aW5kaXJlY3QpCiAgICAgIGJhc2VfZGVjbCA9IGJ1aWxkMSAoSU5ESVJFQ1Rf UkVGLCBwdHlwZSwgYmFzZV9kZWNsKTsKICAKISAgIGVsZW1fc2l6ZSA9IGZv bGRfY29udmVydCAoZ2ZjX2FycmF5X2luZGV4X3R5cGUsIFRZUEVfU0laRV9V TklUIChldHlwZSkpOwohIAohICAgZ2ZjX2dldF9kZXNjcmlwdG9yX29mZnNl dHNfZm9yX2luZm8gKHR5cGUsICZkYXRhX29mZiwgJmR0eXBlX29mZiwgJmRp bV9vZmYsCiEgCQkJCSAgICAgICAmZGltX3NpemUsICZzdHJpZGVfc3Vib2Zm LAohIAkJCQkgICAgICAgJmxvd2VyX3N1Ym9mZiwgJnVwcGVyX3N1Ym9mZik7 CiAgCiAgICB0ID0gYmFzZV9kZWNsOwogICAgaWYgKCFpbnRlZ2VyX3plcm9w IChkYXRhX29mZikpCkluZGV4OiBnY2MvZm9ydHJhbi90cmFucy5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KKioqIGdjYy9mb3J0cmFuL3RyYW5zLmMJKHJl dmlzaW9uIDI1MDA4MikKLS0tIGdjYy9mb3J0cmFuL3RyYW5zLmMJKHdvcmtp bmcgY29weSkKKioqKioqKioqKioqKioqIGdmY19idWlsZF9hZGRyX2V4cHIg KHRyZWUgdHlwZSwgdHJlZSB0KQoqKiogMzA1LDMxMCAqKioqCi0tLSAzMDUs MzcxIC0tLS0KICB9CiAgCiAgCisgc3RhdGljIHRyZWUKKyBnZXRfYXJyYXlf c3BhbiAodHJlZSB0eXBlLCB0cmVlIGRlY2wpCisgeworICAgdHJlZSBzcGFu OworIAorICAgLyogUmV0dXJuIHRoZSBzcGFuIGZvciBkZWZlcnJlZCBjaGFy YWN0ZXIgbGVuZ3RoIGFycmF5IHJlZmVyZW5jZXMuICAqLworICAgaWYgKHR5 cGUgJiYgVFJFRV9DT0RFICh0eXBlKSA9PSBBUlJBWV9UWVBFCisgICAgICAg JiYgVFlQRV9NQVhWQUwgKFRZUEVfRE9NQUlOICh0eXBlKSkgIT0gTlVMTF9U UkVFCisgICAgICAgJiYgKFZBUl9QIChUWVBFX01BWFZBTCAoVFlQRV9ET01B SU4gKHR5cGUpKSkKKyAJICB8fCBUUkVFX0NPREUgKFRZUEVfTUFYVkFMIChU WVBFX0RPTUFJTiAodHlwZSkpKSA9PSBJTkRJUkVDVF9SRUYpCisgICAgICAg JiYgKFRSRUVfQ09ERSAoVFlQRV9NQVhWQUwgKFRZUEVfRE9NQUlOICh0eXBl KSkpID09IElORElSRUNUX1JFRgorIAkgIHx8IFRSRUVfQ09ERSAoZGVjbCkg PT0gRlVOQ1RJT05fREVDTAorIAkgIHx8IERFQ0xfQ09OVEVYVCAoVFlQRV9N QVhWQUwgKFRZUEVfRE9NQUlOICh0eXBlKSkpCisgCQkJCQk9PSBERUNMX0NP TlRFWFQgKGRlY2wpKSkKKyAgICAgeworICAgICAgIHNwYW4gPSBUWVBFX01B WFZBTCAoVFlQRV9ET01BSU4gKHR5cGUpKTsKKyAgICAgICBzcGFuID0gZm9s ZF9jb252ZXJ0IChnZmNfYXJyYXlfaW5kZXhfdHlwZSwgc3Bhbik7CisgICAg IH0KKyAgIC8qIExpa2V3aXNlIGZvciBjbGFzcyBhcnJheSBvciBwb2ludGVy IGFycmF5IHJlZmVyZW5jZXMuICAqLworICAgZWxzZSBpZiAoVFJFRV9DT0RF IChkZWNsKSA9PSBGSUVMRF9ERUNMCisgCSAgIHx8IFZBUl9PUl9GVU5DVElP Tl9ERUNMX1AgKGRlY2wpCisgCSAgIHx8IFRSRUVfQ09ERSAoZGVjbCkgPT0g UEFSTV9ERUNMKQorICAgICB7CisgICAgICAgaWYgKEdGQ19ERUNMX0NMQVNT IChkZWNsKSkKKyAJeworIAkgIC8qIFdoZW4gYSB0ZW1wb3JhcnkgaXMgaW4g cGxhY2UgZm9yIHRoZSBjbGFzcyBhcnJheSwgdGhlbiB0aGUKKyAJICAgICBv cmlnaW5hbCBjbGFzcycgZGVjbGFyYXRpb24gaXMgc3RvcmVkIGluIHRoZSBz YXZlZAorIAkgICAgIGRlc2NyaXB0b3IuICAqLworIAkgIGlmIChERUNMX0xB TkdfU1BFQ0lGSUMgKGRlY2wpICYmIEdGQ19ERUNMX1NBVkVEX0RFU0NSSVBU T1IgKGRlY2wpKQorIAkgICAgZGVjbCA9IEdGQ19ERUNMX1NBVkVEX0RFU0NS SVBUT1IgKGRlY2wpOworIAkgIGVsc2UKKyAJICAgIHsKKyAJICAgICAgLyog QWxsb3cgZm9yIGR1bW15IGFyZ3VtZW50cyBhbmQgb3RoZXIgZ29vZCB0aGlu Z3MuICAqLworIAkgICAgICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQ RSAoZGVjbCkpKQorIAkJZGVjbCA9IGJ1aWxkX2ZvbGRfaW5kaXJlY3RfcmVm X2xvYyAoaW5wdXRfbG9jYXRpb24sIGRlY2wpOworIAorIAkgICAgICAvKiBD aGVjayBpZiAnX2RhdGEnIGlzIGFuIGFycmF5IGRlc2NyaXB0b3IuICBJZiBp dCBpcyBub3QsCisgCQkgdGhlIGFycmF5IG11c3QgYmUgb25lIG9mIHRoZSBj b21wb25lbnRzIG9mIHRoZSBjbGFzcworIAkJIG9iamVjdCwgc28gcmV0dXJu IGEgbnVsbCBzcGFuLiAgKi8KKyAJICAgICAgaWYgKCFHRkNfREVTQ1JJUFRP Ul9UWVBFX1AgKFRSRUVfVFlQRSAoCisgCQkJCQkgIGdmY19jbGFzc19kYXRh X2dldCAoZGVjbCkpKSkKKyAJCXJldHVybiBOVUxMX1RSRUU7CisgCSAgICB9 CisgCSAgc3BhbiA9IGdmY19jbGFzc192dGFiX3NpemVfZ2V0IChkZWNsKTsK KyAJfQorICAgICAgIGVsc2UgaWYgKEdGQ19ERUNMX1BUUl9BUlJBWV9QIChk ZWNsKSkKKyAJeworIAkgIGlmIChUUkVFX0NPREUgKGRlY2wpID09IFBBUk1f REVDTCkKKyAJICAgIGRlY2wgPSBidWlsZF9mb2xkX2luZGlyZWN0X3JlZl9s b2MgKGlucHV0X2xvY2F0aW9uLCBkZWNsKTsKKyAJICBzcGFuID0gZ2ZjX2Nv bnZfZGVzY3JpcHRvcl9zcGFuX2dldCAoZGVjbCk7CisgCX0KKyAgICAgICBl bHNlCisgCXNwYW4gPSBOVUxMX1RSRUU7CisgICAgIH0KKyAgIGVsc2UKKyAg ICAgc3BhbiA9IE5VTExfVFJFRTsKKyAKKyAgIHJldHVybiBzcGFuOworIH0K KyAKKyAKICAvKiBCdWlsZCBhbiBBUlJBWV9SRUYgd2l0aCBpdHMgbmF0dXJh bCB0eXBlLiAgKi8KICAKICB0cmVlCioqKioqKioqKioqKioqKiBnZmNfYnVp bGRfYXJyYXlfcmVmICh0cmVlIGJhc2UsIHRyZWUgb2ZmCioqKiAzMTIsMzE4 ICoqKioKICB7CiAgICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGJhc2UpOwog ICAgdHJlZSB0bXA7CiEgICB0cmVlIHNwYW47CiAgCiAgICBpZiAoR0ZDX0FS UkFZX1RZUEVfUCAodHlwZSkgJiYgR0ZDX1RZUEVfQVJSQVlfUkFOSyAodHlw ZSkgPT0gMCkKICAgICAgewotLS0gMzczLDM3OSAtLS0tCiAgewogICAgdHJl ZSB0eXBlID0gVFJFRV9UWVBFIChiYXNlKTsKICAgIHRyZWUgdG1wOwohICAg dHJlZSBzcGFuID0gTlVMTF9UUkVFOwogIAogICAgaWYgKEdGQ19BUlJBWV9U WVBFX1AgKHR5cGUpICYmIEdGQ19UWVBFX0FSUkFZX1JBTksgKHR5cGUpID09 IDApCiAgICAgIHsKKioqKioqKioqKioqKioqIGdmY19idWlsZF9hcnJheV9y ZWYgKHRyZWUgYmFzZSwgdHJlZSBvZmYKKioqIDMzMSw0MDcgKioqKgogIAog ICAgdHlwZSA9IFRSRUVfVFlQRSAodHlwZSk7CiAgCi0gICAvKiBVc2UgcG9p bnRlciBhcml0aG1ldGljIGZvciBkZWZlcnJlZCBjaGFyYWN0ZXIgbGVuZ3Ro IGFycmF5Ci0gICAgICByZWZlcmVuY2VzLiAgKi8KLSAgIGlmICh0eXBlICYm IFRSRUVfQ09ERSAodHlwZSkgPT0gQVJSQVlfVFlQRQotICAgICAgICYmIFRZ UEVfTUFYVkFMIChUWVBFX0RPTUFJTiAodHlwZSkpICE9IE5VTExfVFJFRQot ICAgICAgICYmIChWQVJfUCAoVFlQRV9NQVhWQUwgKFRZUEVfRE9NQUlOICh0 eXBlKSkpCi0gCSAgfHwgVFJFRV9DT0RFIChUWVBFX01BWFZBTCAoVFlQRV9E T01BSU4gKHR5cGUpKSkgPT0gSU5ESVJFQ1RfUkVGKQotICAgICAgICYmIGRl Y2wKLSAgICAgICAmJiAoVFJFRV9DT0RFIChUWVBFX01BWFZBTCAoVFlQRV9E T01BSU4gKHR5cGUpKSkgPT0gSU5ESVJFQ1RfUkVGCi0gCSAgfHwgVFJFRV9D T0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCi0gCSAgfHwgREVDTF9DT05U RVhUIChUWVBFX01BWFZBTCAoVFlQRV9ET01BSU4gKHR5cGUpKSkKLSAJCQkJ CT09IERFQ0xfQ09OVEVYVCAoZGVjbCkpKQotICAgICBzcGFuID0gVFlQRV9N QVhWQUwgKFRZUEVfRE9NQUlOICh0eXBlKSk7Ci0gICBlbHNlCi0gICAgIHNw YW4gPSBOVUxMX1RSRUU7Ci0gCiAgICBpZiAoREVDTF9QIChiYXNlKSkKICAg ICAgVFJFRV9BRERSRVNTQUJMRSAoYmFzZSkgPSAxOwogIAogICAgLyogU3Ry aXAgTk9OX0xWQUxVRV9FWFBSIG5vZGVzLiAgKi8KICAgIFNUUklQX1RZUEVf Tk9QUyAob2Zmc2V0KTsKICAKISAgIC8qIElmIHRoZSBhcnJheSByZWZlcmVu Y2UgaXMgdG8gYSBwb2ludGVyLCB3aG9zZSB0YXJnZXQgY29udGFpbnMgYQoh ICAgICAgc3VicmVmZXJlbmNlLCB1c2UgdGhlIHNwYW4gdGhhdCBpcyBzdG9y ZWQgd2l0aCB0aGUgYmFja2VuZCBkZWNsCiEgICAgICBhbmQgcmVmZXJlbmNl IHRoZSBlbGVtZW50IHdpdGggcG9pbnRlciBhcml0aG1ldGljLiAgKi8KISAg IGlmICgoZGVjbCAmJiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGSUVMRF9ERUNM CiEgCQl8fCBWQVJfT1JfRlVOQ1RJT05fREVDTF9QIChkZWNsKQohIAkJfHwg VFJFRV9DT0RFIChkZWNsKSA9PSBQQVJNX0RFQ0wpCiEgICAgICAgICYmICgo R0ZDX0RFQ0xfU1VCUkVGX0FSUkFZX1AgKGRlY2wpCiEgCSAgICAmJiAhaW50 ZWdlcl96ZXJvcCAoR0ZDX0RFQ0xfU1BBTiAoZGVjbCkpKQohIAkgICB8fCBH RkNfREVDTF9DTEFTUyAoZGVjbCkKISAJICAgfHwgc3BhbiAhPSBOVUxMX1RS RUUpKQohICAgICAgIHx8IHZwdHIgIT0gTlVMTF9UUkVFKQogICAgICB7Ci0g ICAgICAgaWYgKGRlY2wpCi0gCXsKLSAJICBpZiAoR0ZDX0RFQ0xfQ0xBU1Mg KGRlY2wpKQotIAkgICAgewotIAkgICAgICAvKiBXaGVuIGEgdGVtcG9yYXJ5 IGlzIGluIHBsYWNlIGZvciB0aGUgY2xhc3MgYXJyYXksIHRoZW4gdGhlCi0g CQkgb3JpZ2luYWwgY2xhc3MnIGRlY2xhcmF0aW9uIGlzIHN0b3JlZCBpbiB0 aGUgc2F2ZWQKLSAJCSBkZXNjcmlwdG9yLiAgKi8KLSAJICAgICAgaWYgKERF Q0xfTEFOR19TUEVDSUZJQyAoZGVjbCkgJiYgR0ZDX0RFQ0xfU0FWRURfREVT Q1JJUFRPUiAoZGVjbCkpCi0gCQlkZWNsID0gR0ZDX0RFQ0xfU0FWRURfREVT Q1JJUFRPUiAoZGVjbCk7Ci0gCSAgICAgIGVsc2UKLSAJCXsKLSAJCSAgLyog QWxsb3cgZm9yIGR1bW15IGFyZ3VtZW50cyBhbmQgb3RoZXIgZ29vZCB0aGlu Z3MuICAqLwotIAkJICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAo ZGVjbCkpKQotIAkJICAgIGRlY2wgPSBidWlsZF9mb2xkX2luZGlyZWN0X3Jl Zl9sb2MgKGlucHV0X2xvY2F0aW9uLCBkZWNsKTsKLSAKLSAJCSAgLyogQ2hl Y2sgaWYgJ19kYXRhJyBpcyBhbiBhcnJheSBkZXNjcmlwdG9yLiAgSWYgaXQg aXMgbm90LAotIAkJICAgICB0aGUgYXJyYXkgbXVzdCBiZSBvbmUgb2YgdGhl IGNvbXBvbmVudHMgb2YgdGhlIGNsYXNzCi0gCQkgICAgIG9iamVjdCwgc28g cmV0dXJuIGEgbm9ybWFsIGFycmF5IHJlZmVyZW5jZS4gICovCi0gCQkgIGlm ICghR0ZDX0RFU0NSSVBUT1JfVFlQRV9QIChUUkVFX1RZUEUgKAotIAkJCQkJ CWdmY19jbGFzc19kYXRhX2dldCAoZGVjbCkpKSkKLSAJCSAgICByZXR1cm4g YnVpbGQ0X2xvYyAoaW5wdXRfbG9jYXRpb24sIEFSUkFZX1JFRiwgdHlwZSwg YmFzZSwKLSAJCQkJICAgICAgIG9mZnNldCwgTlVMTF9UUkVFLCBOVUxMX1RS RUUpOwotIAkJfQotIAotIAkgICAgICBzcGFuID0gZ2ZjX2NsYXNzX3Z0YWJf c2l6ZV9nZXQgKGRlY2wpOwotIAkgICAgfQotIAkgIGVsc2UgaWYgKEdGQ19E RUNMX1NVQlJFRl9BUlJBWV9QIChkZWNsKSkKLSAJICAgIHNwYW4gPSBHRkNf REVDTF9TUEFOIChkZWNsKTsKLSAJICBlbHNlIGlmIChzcGFuKQotIAkgICAg c3BhbiA9IGZvbGRfY29udmVydCAoZ2ZjX2FycmF5X2luZGV4X3R5cGUsIHNw YW4pOwotIAkgIGVsc2UKLSAJICAgIGdjY191bnJlYWNoYWJsZSAoKTsKLSAJ fQotICAgICAgIGVsc2UgaWYgKHZwdHIpCi0gCXNwYW4gPSBnZmNfdnB0cl9z aXplX2dldCAodnB0cik7Ci0gICAgICAgZWxzZQotIAlnY2NfdW5yZWFjaGFi bGUgKCk7Ci0gCiAgICAgICAgb2Zmc2V0ID0gZm9sZF9idWlsZDJfbG9jIChp bnB1dF9sb2NhdGlvbiwgTVVMVF9FWFBSLAogIAkJCQlnZmNfYXJyYXlfaW5k ZXhfdHlwZSwKICAJCQkJb2Zmc2V0LCBzcGFuKTsKLS0tIDM5Miw0MTQgLS0t LQogIAogICAgdHlwZSA9IFRSRUVfVFlQRSAodHlwZSk7CiAgCiAgICBpZiAo REVDTF9QIChiYXNlKSkKICAgICAgVFJFRV9BRERSRVNTQUJMRSAoYmFzZSkg PSAxOwogIAogICAgLyogU3RyaXAgTk9OX0xWQUxVRV9FWFBSIG5vZGVzLiAg Ki8KICAgIFNUUklQX1RZUEVfTk9QUyAob2Zmc2V0KTsKICAKISAgIC8qIElm IGRlY2wgb3IgdnB0ciBhcmUgbm9uLW51bGwsIHBvaW50ZXIgYXJpdGhtZXRp YyBmb3IgdGhlIGFycmF5IHJlZmVyZW5jZQohICAgICAgaXMgbGlrZWx5LiBH ZW5lcmF0ZSB0aGUgJ3NwYW4nIGZvciB0aGUgYXJyYXkgcmVmZXJlbmNlLiAg Ki8KISAgIGlmICh2cHRyKQohICAgICBzcGFuID0gZ2ZjX3ZwdHJfc2l6ZV9n ZXQgKHZwdHIpOwohICAgZWxzZSBpZiAoZGVjbCkKISAgICAgc3BhbiA9IGdl dF9hcnJheV9zcGFuICh0eXBlLCBkZWNsKTsKISAKISAgIC8qIElmIGEgbm9u LW51bGwgc3BhbiBoYXMgYmVlbiBnZW5lcmF0ZWQgcmVmZXJlbmNlIHRoZSBl bGVtZW50IHdpdGgKISAgICAgIHBvaW50ZXIgYXJpdGhtZXRpYy4gICovCiEg ICBpZiAoc3BhbiAhPSBOVUxMX1RSRUUpCiAgICAgIHsKICAgICAgICBvZmZz ZXQgPSBmb2xkX2J1aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9uLCBNVUxUX0VY UFIsCiAgCQkJCWdmY19hcnJheV9pbmRleF90eXBlLAogIAkJCQlvZmZzZXQs IHNwYW4pOwoqKioqKioqKioqKioqKiogZ2ZjX2J1aWxkX2FycmF5X3JlZiAo dHJlZSBiYXNlLCB0cmVlIG9mZgoqKiogNDEyLDQxOSAqKioqCiAgCXRtcCA9 IGJ1aWxkX2ZvbGRfaW5kaXJlY3RfcmVmX2xvYyAoaW5wdXRfbG9jYXRpb24s IHRtcCk7CiAgICAgICAgcmV0dXJuIHRtcDsKICAgICAgfQogICAgZWxzZQot ICAgICAvKiBPdGhlcndpc2UgdXNlIGEgc3RyYWlnaHRmb3J3YXJkIGFycmF5 IHJlZmVyZW5jZS4gICovCiAgICAgIHJldHVybiBidWlsZDRfbG9jIChpbnB1 dF9sb2NhdGlvbiwgQVJSQVlfUkVGLCB0eXBlLCBiYXNlLCBvZmZzZXQsCiAg CQkgICAgICAgTlVMTF9UUkVFLCBOVUxMX1RSRUUpOwogIH0KLS0tIDQxOSw0 MjYgLS0tLQogIAl0bXAgPSBidWlsZF9mb2xkX2luZGlyZWN0X3JlZl9sb2Mg KGlucHV0X2xvY2F0aW9uLCB0bXApOwogICAgICAgIHJldHVybiB0bXA7CiAg ICAgIH0KKyAgIC8qIE90aGVyd2lzZSB1c2UgYSBzdHJhaWdodGZvcndhcmQg YXJyYXkgcmVmZXJlbmNlLiAgKi8KICAgIGVsc2UKICAgICAgcmV0dXJuIGJ1 aWxkNF9sb2MgKGlucHV0X2xvY2F0aW9uLCBBUlJBWV9SRUYsIHR5cGUsIGJh c2UsIG9mZnNldCwKICAJCSAgICAgICBOVUxMX1RSRUUsIE5VTExfVFJFRSk7 CiAgfQpJbmRleDogZ2NjL2ZvcnRyYW4vdHJhbnMuaAo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09CioqKiBnY2MvZm9ydHJhbi90cmFucy5oCShyZXZpc2lvbiAy NTAwODIpCi0tLSBnY2MvZm9ydHJhbi90cmFucy5oCSh3b3JraW5nIGNvcHkp CioqKioqKioqKioqKioqKiBzdHJ1Y3QgR1RZKCgpKSBsYW5nX2RlY2wgewoq KiogOTgyLDk4OCAqKioqCiAgI2RlZmluZSBHRkNfREVDTF9DT01NT05fT1Jf RVFVSVYobm9kZSkgREVDTF9MQU5HX0ZMQUdfMyhub2RlKQogICNkZWZpbmUg R0ZDX0RFQ0xfQ1JBWV9QT0lOVEVFKG5vZGUpIERFQ0xfTEFOR19GTEFHXzQo bm9kZSkKICAjZGVmaW5lIEdGQ19ERUNMX1JFU1VMVChub2RlKSBERUNMX0xB TkdfRkxBR181KG5vZGUpCiEgI2RlZmluZSBHRkNfREVDTF9TVUJSRUZfQVJS QVlfUChub2RlKSBERUNMX0xBTkdfRkxBR182KG5vZGUpCiAgI2RlZmluZSBH RkNfREVDTF9BU1NPQ0lBVEVfVkFSX1Aobm9kZSkgREVDTF9MQU5HX0ZMQUdf Nyhub2RlKQogICNkZWZpbmUgR0ZDX0RFQ0xfQ0xBU1Mobm9kZSkgREVDTF9M QU5HX0ZMQUdfOChub2RlKQogIAotLS0gOTgyLDk4OCAtLS0tCiAgI2RlZmlu ZSBHRkNfREVDTF9DT01NT05fT1JfRVFVSVYobm9kZSkgREVDTF9MQU5HX0ZM QUdfMyhub2RlKQogICNkZWZpbmUgR0ZDX0RFQ0xfQ1JBWV9QT0lOVEVFKG5v ZGUpIERFQ0xfTEFOR19GTEFHXzQobm9kZSkKICAjZGVmaW5lIEdGQ19ERUNM X1JFU1VMVChub2RlKSBERUNMX0xBTkdfRkxBR181KG5vZGUpCiEgI2RlZmlu ZSBHRkNfREVDTF9QVFJfQVJSQVlfUChub2RlKSBERUNMX0xBTkdfRkxBR182 KG5vZGUpCiAgI2RlZmluZSBHRkNfREVDTF9BU1NPQ0lBVEVfVkFSX1Aobm9k ZSkgREVDTF9MQU5HX0ZMQUdfNyhub2RlKQogICNkZWZpbmUgR0ZDX0RFQ0xf Q0xBU1Mobm9kZSkgREVDTF9MQU5HX0ZMQUdfOChub2RlKQogIApJbmRleDog Z2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9hc3N1bWVkX3R5cGVfMi5mOTAK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9nZm9y dHJhbi5kZy9hc3N1bWVkX3R5cGVfMi5mOTAJKHJldmlzaW9uIDI1MDA4MikK LS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvYXNzdW1lZF90eXBlXzIu ZjkwCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKiBlbmQKKioqIDE1 MSwxNTkgKioqKgogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRp bWVzICJzdWJfc2NhbGFyIC4mc2NhbGFyX3QxLCIgMSAib3JpZ2luYWwiIH0g fQogIAogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJz dWJfc2NhbGFyIC4mXFwoLlxcKHJlYWwua2luZD00Li4wOi4gLiByZXN0cmlj dFxcKSBhcnJheV9yZWFsX2FsbG9jLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0K ISAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3Nj YWxhciAuJlxcKC5cXChjaGFyYWN0ZXIua2luZD0xLi4wOi4uMToxLiAuXFwp IGFycmF5X2NoYXJfcHRyLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0KICAhIHsg ZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAu JlxcKC5cXChzdHJ1Y3QgdDIuMDouIC4gcmVzdHJpY3RcXCkgYXJyYXlfdDJf YWxsb2MuZGF0YSIgMSAib3JpZ2luYWwiIH0gfQohICEgeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFyIC4mXFwoLlxcKHN0 cnVjdCB0My4wOi4gLlxcKSBhcnJheV90M19wdHIuZGF0YSIgMSAib3JpZ2lu YWwiIH0gfQogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVz ICJzdWJfc2NhbGFyIC5cXChzdHJ1Y3QgdDEgLlxcKSBhcnJheV9jbGFzc190 MV9hbGxvYy5fZGF0YS5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiAgISB7IGRn LWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLlxc KHN0cnVjdCB0MSAuXFwpIFxcKGFycmF5X2NsYXNzX3QxX3B0ci5fZGF0YS5k YXQiIDEgIm9yaWdpbmFsIiB9IH0KICAKLS0tIDE1MSwxNTkgLS0tLQogICEg eyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFy IC4mc2NhbGFyX3QxLCIgMSAib3JpZ2luYWwiIH0gfQogIAogICEgeyBkZy1m aW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFyIC4mXFwo LlxcKHJlYWwua2luZD00Li4wOi4gLiByZXN0cmljdFxcKSBhcnJheV9yZWFs X2FsbG9jLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0KISAhIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAuXFwoY2hhcmFj dGVyLmtpbmQ9MS4uMToxLiAuXFwpIC5hcnJheV9jaGFyX3B0ci5kYXRhIiAx ICJvcmlnaW5hbCIgfSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAtdGltZXMgInN1Yl9zY2FsYXIgLiZcXCguXFwoc3RydWN0IHQyLjA6LiAu IHJlc3RyaWN0XFwpIGFycmF5X3QyX2FsbG9jLmRhdGEiIDEgIm9yaWdpbmFs IiB9IH0KISAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAi c3ViX3NjYWxhciAuXFwoc3RydWN0IHQzIC5cXCkgLmFycmF5X3QzX3B0ci5k YXRhIiAxICJvcmlnaW5hbCIgfSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10 cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLlxcKHN0cnVjdCB0MSAuXFwp IGFycmF5X2NsYXNzX3QxX2FsbG9jLl9kYXRhLmRhdGEiIDEgIm9yaWdpbmFs IiB9IH0KICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAi c3ViX3NjYWxhciAuXFwoc3RydWN0IHQxIC5cXCkgXFwoYXJyYXlfY2xhc3Nf dDFfcHRyLl9kYXRhLmRhdCIgMSAib3JpZ2luYWwiIH0gfQogIApJbmRleDog Z2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9nb2FjYy9rZXJuZWxzLWFsaWFz LTQuZjk1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3Vp dGUvZ2ZvcnRyYW4uZGcvZ29hY2Mva2VybmVscy1hbGlhcy00LmY5NQkocmV2 aXNpb24gMjUwMDgyKQotLS0gZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9n b2FjYy9rZXJuZWxzLWFsaWFzLTQuZjk1CSh3b3JraW5nIGNvcHkpCioqKioq KioqKioqKioqKiBwcm9ncmFtIG1haW4KKioqIDE2LDIwICoqKioKICBlbmQg cHJvZ3JhbSBtYWluCiAgCiAgISBPbmx5IHRoZSBvbXBfZGF0YV9pIHJlbGF0 ZWQgbG9hZHMgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIGNsaXF1ZXMuCiEg ISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgImNsaXF1ZSAx IGJhc2UgMSIgMyAiZWFsaWFzIiB9IH0KISAhIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcC10aW1lcyAiKD9uKWNsaXF1ZSAxIGJhc2UgMCIgNCAiZWFs aWFzIiB9IH0KLS0tIDE2LDIwIC0tLS0KICBlbmQgcHJvZ3JhbSBtYWluCiAg CiAgISBPbmx5IHRoZSBvbXBfZGF0YV9pIHJlbGF0ZWQgbG9hZHMgc2hvdWxk IGJlIGFubm90YXRlZCB3aXRoIGNsaXF1ZXMuCiEgISB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtdGltZXMgImNsaXF1ZSAxIGJhc2UgMSIgNCAiZWFs aWFzIiB9IH0KISAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1l cyAiKD9uKWNsaXF1ZSAxIGJhc2UgMCIgNSAiZWFsaWFzIiB9IH0KSW5kZXg6 IGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvbm9fYXJnX2NoZWNrXzIuZjkw Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3VpdGUvZ2Zv cnRyYW4uZGcvbm9fYXJnX2NoZWNrXzIuZjkwCShyZXZpc2lvbiAyNTAwODIp Ci0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL25vX2FyZ19jaGVja18y LmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogZW5kCioqKiAx MzMsMTQxICoqKioKICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10 aW1lcyAic3ViX3NjYWxhciAuJnNjYWxhcl90MSwiIDEgIm9yaWdpbmFsIiB9 IH0KICAKICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAi c3ViX3NjYWxhciAuJlxcKC5cXChyZWFsLmtpbmQ9NC4uMDouIC4gcmVzdHJp Y3RcXCkgYXJyYXlfcmVhbF9hbGxvYy5kYXRhIiAxICJvcmlnaW5hbCIgfSB9 CiEgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9z Y2FsYXIgLiZcXCguXFwoY2hhcmFjdGVyLmtpbmQ9MS4uMDouLjE6MS4gLlxc KSBhcnJheV9jaGFyX3B0ci5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiAgISB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIg LiZcXCguXFwoc3RydWN0IHQyLjA6LiAuIHJlc3RyaWN0XFwpIGFycmF5X3Qy X2FsbG9jLmRhdGEiIDEgIm9yaWdpbmFsIiB9IH0KISAhIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAuJlxcKC5cXChz dHJ1Y3QgdDMuMDouIC5cXCkgYXJyYXlfdDNfcHRyLmRhdGEiIDEgIm9yaWdp bmFsIiB9IH0KICAhIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1l cyAic3ViX3NjYWxhciAuXFwoc3RydWN0IHQxIC5cXCkgYXJyYXlfY2xhc3Nf dDFfYWxsb2MuX2RhdGEuZGF0YSIgMSAib3JpZ2luYWwiIH0gfQogICEgeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFyIC5c XChzdHJ1Y3QgdDEgLlxcKSBcXChhcnJheV9jbGFzc190MV9wdHIuX2RhdGEu ZGF0IiAxICJvcmlnaW5hbCIgfSB9CiAgCi0tLSAxMzMsMTQxIC0tLS0KICAh IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxh ciAuJnNjYWxhcl90MSwiIDEgIm9yaWdpbmFsIiB9IH0KICAKICAhIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAic3ViX3NjYWxhciAuJlxc KC5cXChyZWFsLmtpbmQ9NC4uMDouIC4gcmVzdHJpY3RcXCkgYXJyYXlfcmVh bF9hbGxvYy5kYXRhIiAxICJvcmlnaW5hbCIgfSB9CiEgISB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInN1Yl9zY2FsYXIgLlxcKGNoYXJh Y3Rlci5raW5kPTEuLjE6MS4gLlxcKSAuYXJyYXlfY2hhcl9wdHIuZGF0YSIg MSAib3JpZ2luYWwiIH0gfQogICEgeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1k dW1wLXRpbWVzICJzdWJfc2NhbGFyIC4mXFwoLlxcKHN0cnVjdCB0Mi4wOi4g LiByZXN0cmljdFxcKSBhcnJheV90Ml9hbGxvYy5kYXRhIiAxICJvcmlnaW5h bCIgfSB9CiEgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg InN1Yl9zY2FsYXIgLlxcKHN0cnVjdCB0MyAuXFwpIC5hcnJheV90M19wdHIu ZGF0YSIgMSAib3JpZ2luYWwiIH0gfQogICEgeyBkZy1maW5hbCB7IHNjYW4t dHJlZS1kdW1wLXRpbWVzICJzdWJfc2NhbGFyIC5cXChzdHJ1Y3QgdDEgLlxc KSBhcnJheV9jbGFzc190MV9hbGxvYy5fZGF0YS5kYXRhIiAxICJvcmlnaW5h bCIgfSB9CiAgISB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg InN1Yl9zY2FsYXIgLlxcKHN0cnVjdCB0MSAuXFwpIFxcKGFycmF5X2NsYXNz X3QxX3B0ci5fZGF0YS5kYXQiIDEgIm9yaWdpbmFsIiB9IH0KICAKSW5kZXg6 IGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV8xLmY5 MAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CioqKiBnY2MvdGVzdHN1aXRlL2dm b3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfMS5mOTAJKG5vbmV4aXN0ZW50KQot LS0gZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzEu ZjkwCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKgoqKiogMCAqKioq Ci0tLSAxLDYwIC0tLS0KKyAhIHsgZGctZG8gcnVuIH0KKyAhCisgISBDaGVj ayB0aGUgZml4IGZvciBQUjM0NjQwIGNvbW1lbnRzIDEgYW5kIDMuCisgIQor ICEgVGhpcyBpbnZvbHZlcyBwYXNzaW5nIGFuZCByZXR1cm5pbmcgcG9pbnRl ciBhcnJheSBjb21wb25lbnRzIHRoYXQKKyAhIHBvaW50IHRvIGNvbXBvbmVu dHMgb2YgYXJyYXlzIG9mIGRlcml2ZWQgdHlwZXMuCisgIQorIE1PRFVMRSB0 ZXN0CisgICBJTVBMSUNJVCBOT05FCisgICBUWVBFIDo6IG15X3R5cGUKKyAg ICAgSU5URUdFUiA6OiB2YWx1ZQorICAgICBpbnRlZ2VyIDo6IHRhZworICAg RU5EIFRZUEUKKyBDT05UQUlOUworICAgU1VCUk9VVElORSBnZXRfdmFsdWVz KHZhbHVlcywgc3dpdGNoKQorICAgICBJTlRFR0VSLCBQT0lOVEVSIDo6IHZh bHVlcyg6KQorICAgICBpbnRlZ2VyIDo6IHN3aXRjaAorICAgICBUWVBFKG15 X3R5cGUpLCBQT0lOVEVSIDo6IGQoOikKKyAgICAgYWxsb2NhdGUgKGQsIHNv dXJjZSA9IFtteV90eXBlKDEsMTAxKSwgbXlfdHlwZSgyLDEwMildKQorICAg ICBpZiAoc3dpdGNoIC5lcS4gMSkgdGhlbgorICAgICAgIHZhbHVlcyA9PiBk KDopJXZhbHVlCisgICAgICAgaWYgKGFueSAodmFsdWVzIC5uZS4gWzEsMl0p KSBwcmludCAqLCB2YWx1ZXMoMikKKyAgICAgZWxzZQorICAgICAgIHZhbHVl cyA9PiBkKDopJXRhZworICAgICAgIGlmIChhbnkgKHZhbHVlcyAubmUuIFsx MDEsMTAyXSkpIGNhbGwgYWJvcnQKKyAgICAgZW5kIGlmCisgICBFTkQgU1VC Uk9VVElORQorIAorICAgZnVuY3Rpb24gcmV0dXJuX3ZhbHVlcyhzd2l0Y2gp IHJlc3VsdCAodmFsdWVzKQorICAgICBJTlRFR0VSLCBQT0lOVEVSIDo6IHZh bHVlcyg6KQorICAgICBpbnRlZ2VyIDo6IHN3aXRjaAorICAgICBUWVBFKG15 X3R5cGUpLCBQT0lOVEVSIDo6IGQoOikKKyAgICAgYWxsb2NhdGUgKGQsIHNv dXJjZSA9IFtteV90eXBlKDEsMTAxKSwgbXlfdHlwZSgyLDEwMildKQorICAg ICBpZiAoc3dpdGNoIC5lcS4gMSkgdGhlbgorICAgICAgIHZhbHVlcyA9PiBk KDopJXZhbHVlCisgICAgICAgaWYgKGFueSAodmFsdWVzIC5uZS4gWzEsMl0p KSBjYWxsIGFib3J0CisgICAgIGVsc2UKKyAgICAgICB2YWx1ZXMgPT4gZCg6 KSV0YWcKKyAgICAgICBpZiAoYW55ICh2YWx1ZXMoWzIsMV0pIC5uZS4gWzEw MiwxMDFdKSkgY2FsbCBhYm9ydAorICAgICBlbmQgaWYKKyAgIEVORCBmdW5j dGlvbgorIEVORCBNT0RVTEUKKyAKKyAgIHVzZSB0ZXN0CisgICBpbnRlZ2Vy LCBwb2ludGVyIDo6IHgoOikKKyAgIHR5cGUgOjogeW91cl90eXBlCisgICAg IGludGVnZXIsIHBvaW50ZXIgOjogeCg6KQorICAgZW5kIHR5cGUKKyAgIHR5 cGUoeW91cl90eXBlKSA6OiB5CisgCisgICBjYWxsIGdldF92YWx1ZXMgKHgs IDEpCisgICBpZiAoYW55ICh4IC5uZS4gWzEsMl0pKSBjYWxsIGFib3J0Cisg ICBjYWxsIGdldF92YWx1ZXMgKHkleCwgMikKKyAgIGlmIChhbnkgKHkleCAu bmUuIFsxMDEsMTAyXSkpIGNhbGwgYWJvcnQKKyAKKyAgIHggPT4gcmV0dXJu X3ZhbHVlcyAoMikKKyAgIGlmIChhbnkgKHggLm5lLiBbMTAxLDEwMl0pKSBj YWxsIGFib3J0CisgICB5JXggPT4gcmV0dXJuX3ZhbHVlcyAoMSkKKyAgIGlm IChhbnkgKHkleCAubmUuIFsxLDJdKSkgY2FsbCBhYm9ydAorIGVuZApJbmRl eDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzIu ZjkwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3VpdGUv Z2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV8yLmY5MAkobm9uZXhpc3RlbnQp Ci0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlf Mi5mOTAJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqCioqKiAwICoq KioKLS0tIDEsMTQzIC0tLS0KKyAhIHsgZGctZG8gY29tcGlsZSB9CisgIQor ICEgVGVzdCB0aGUgZml4IGZvciBQUjQwNzM3IGFzIHBhcnQgb2YgdGhlIG92 ZXJhbGwgZml4IGZvciBQUjM0NjQwLgorICEKKyAhIENvbnRyaWJ1dGVkIGJ5 IERhdmlkIEhvdWdoICA8ZGg0NThAb2FrYXBwbGUubmV0PgorICEKKyBtb2R1 bGUgdGVzdG1vZAorIAorIGludGVnZXIsIHBhcmFtZXRlciA6OiBzdGFuZGFy ZF9pbnRlZ2VyID0gMQorIGludGVnZXIsIHBhcmFtZXRlciA6OiBpbnQgPSBL SU5EKCBzdGFuZGFyZF9pbnRlZ2VyKQorIAorIGludGVnZXIsIHBhcmFtZXRl ciA6OiBpOCAgPSBzZWxlY3RlZF9pbnRfa2luZCgxMikKKyBpbnRlZ2VyLCBw YXJhbWV0ZXIgOjogaTQgID0gc2VsZWN0ZWRfaW50X2tpbmQoOCkKKyBpbnRl Z2VyLCBwYXJhbWV0ZXIgOjogaTIgID0gc2VsZWN0ZWRfaW50X2tpbmQoNCkK KyAKKyBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogc3RhbmRhcmRfcmVhbCA9IDEu CisgaW50ZWdlciwgcGFyYW1ldGVyIDo6IHN0ZF9yZWFsID0gS0lORCggc3Rh bmRhcmRfcmVhbCkKKyAKKyBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogcjggID0g c2VsZWN0ZWRfcmVhbF9raW5kKDEyKQorIGludGVnZXIsIHBhcmFtZXRlciA6 OiByNCAgPSBzZWxlY3RlZF9yZWFsX2tpbmQoNikKKyBpbnRlZ2VyLCBwYXJh bWV0ZXIgOjogZG91YmxlICA9IHNlbGVjdGVkX3JlYWxfa2luZCgyMCkKKyAK KyBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogbmFtZV9zdHJpbmdfbGVuZ3RoID0g NDAKKyBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogZmlsZV9uYW1lX2xlbmd0aCA9 IDYwCisgaW50ZWdlciwgcGFyYW1ldGVyIDo6IHRleHRfc3RyaW5nX2xlbmd0 aCA9IDgwCisgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG1heF9rd2RfbGd0aCA9 IGZpbGVfbmFtZV9sZW5ndGgKKyAKKyBpbnRlZ2VyKGludCkgOjogYnl0ZXNf cGVyX2ludCAgPSA0CisgaW50ZWdlcihpbnQpIDo6IGJ5dGVzX3Blcl9yZWFs ID0gOAorIGludGVnZXIoaW50KSA6OiB3b3JrY29tbSwgc3BpbmNvbW0KKyAK KyAgICBpbnRlZ2VyKGludCksIHBhcmFtZXRlciA6OiBuYl9kaXJlY3Rpb25z ID0gMywgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJl Y3Rpb25feCA9IDEsICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBkaXJlY3Rpb25feSA9IDIsICAgICYKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBkaXJlY3Rpb25feiA9IDMsICAgICYKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBuYl9naG9zdF9jZWxscyA9IDUgICAg ICEgbWlnaHQgYmUgZGlmZmVyZW50IGZvciB0aGUgbGFncmFuZ2Ugc3RlcD8K KyAKKyAgICBpbnRlZ2VyKGludCksIHBhcmFtZXRlciA6OiBlbmRzID0gNCwg ICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bG93ZXJfZ2hvc3QgPSAxLCAgICAgJgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxvd2VyX2ludGVyaW9yID0gMiwgICYKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1cHBlcl9pbnRlcmlvciA9IDMsICAmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfZ2hvc3QgPSA0 CisgCisgICAgISBOZWlnaGJvcnMKKyAgICBpbnRlZ2VyKGludCksIHBhcmFt ZXRlciA6OiBzaWRlID0gMiwgICAgICAgJgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxvd2VyX2VuZCA9IDEsICAmCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdXBwZXJfZW5kID0gMgorIAorIAorICAgIGlu dGVnZXIoaW50KSwgcGFyYW1ldGVyIDo6IG5iX3ZhcmlhYmxlcyA9IDUsICAg ICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb192YXIgPSAx LCAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZXRzX3ZhciA9IDIsICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVfdmFyID0gMywgICAgICAgICAgICYKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1cDFfdmFyID0gNCwgICAgICAgICAmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAyX3ZhciA9IDUsICAg ICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpc192 YXIgPSA2LCAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBlY3NfdmFyID0gNywgICAgICAgICAmCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcF92YXIgPSA4LCAgICAgICAgICAgJgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNfdmFyID0gOSwgICAgICAgICAg ICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl92YXJfc29y dGllID0gOQorIAorICAgIHR5cGUgOjogVkFSSUFCTEVTX0xJR05FCisgICAg ICAgc2VxdWVuY2UKKyAgICAgICByZWFsLCBwb2ludGVyLCBkaW1lbnNpb24o IDosIDopIDo6IGwKKyAgICBlbmQgdHlwZSBWQVJJQUJMRVNfTElHTkUKKyAK KyAgICB0eXBlIFZBUklBQkxFU19NQUlMTEUKKyAgICAgICBzZXF1ZW5jZQor ICAgICAgIHJlYWwocjgpLCBkaW1lbnNpb24oIG5iX3ZhcmlhYmxlcykgOjog Y2VsbF92YXIKKyAgICBlbmQgdHlwZSBWQVJJQUJMRVNfTUFJTExFCisgCisg ICAgaW50ZWdlcihpbnQpLCBkaW1lbnNpb24oIG5iX2RpcmVjdGlvbnMpIDo6 ICYKKyAgICAgICAgICBmaXJzdF9yZWFsX2NlbGwsICAgICYgICEgd2l0aG91 dCBnaG9zdCBjZWxscworICAgICAgICAgIGxhc3RfcmVhbF9jZWxsLCAgICAg JiAgIQorICAgICAgICAgIG5iX3JlYWxfY2VsbHMsICAgICAgJiAgIQorICAg ICAgICAgIGZpcnN0X3dvcmtfY2VsbCwgICAgJiAgISBpbmNsdWRpbmcgZ2hv c3QgY2VsbHMKKyAgICAgICAgICBsYXN0X3dvcmtfY2VsbCwgICAgICYgICEK KyAgICAgICAgICBuYl93b3JrX2NlbGxzLCAgICAgICYgICEKKyAgICAgICAg ICBnbG9iYWxfbmJfY2VsbHMgICAgICAgICEgbnVtYmVyIG9mIHJlYWwgY2Vs bHMsIGZvciB0aGUgZW50aXJlIGdyaWQKKyAKKyAgICBpbnRlZ2VyKGludCkg OjogZGltX3Byb2JsZW1lICAhIGRpbWVuc2lvbiBkdSBwcm9ibGVtZSAoMSwg MiBvdSAzKQorIAorICAgIGludGVnZXIoaW50KSA6OiBsYXJnZXN0X2xvY2Fs X3NpemUgICAhIHRoZSBsYXJnZXN0IG9mIHRoZSAzIGRpbWVuc2lvbnMgb2Yg dGhlIGxvY2FsIGdyaWQKKyAKKyAgICAhIEh5ZHJvIHZhcmlhYmxlcyBvZiB0 aGUgYWN0dWFsIGRvbWFpbgorICAgICEgVGhlcmUgYXJlIDMgY29waWVzIG9m IHRoZXNlLCBmb3IgdXNlIGFjY29yZGluZyB0byBjdXJyZW50IHdvcmsgZGly ZWN0aW9uCisgICAgdHlwZSAoVkFSSUFCTEVTX01BSUxMRSksIGFsbG9jYXRh YmxlLCB0YXJnZXQsIGRpbWVuc2lvbiggOiwgOiwgOikgOjogICYKKyAgICAg ICAgICAgICBIeWRyb192YXJzX1hZWiwgICYKKyAgICAgICAgICAgICBIeWRy b192YXJzX1laWCwgICYKKyAgICAgICAgICAgICBIeWRyb192YXJzX1pYWQor IAorICAgICEgUG9pbnRlcnMgdG8gY3VycmVudCBhbmQgbmV4dCBIeWRybyB2 YXIgYXJyYXlzCisgICAgdHlwZSAoVkFSSUFCTEVTX01BSUxMRSksIHBvaW50 ZXIsIGRpbWVuc2lvbiggOiwgOiwgOikgOjogSHlkcm9fdmFycywgICAgICAm CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgSHlkcm9fdmFyc19uZXh0CisgCisgICAgISBX aGljaCBvZiB0aGVzZSAzIGNvcGllcyBvZiB0aGUgM0QgYXJyYXlzIGhhcyBi ZWVuIHVwZGF0ZWQgbGFzdAorICAgIGludGVnZXIoaW50KSA6OiBsYXN0X3Vw ZGF0ZWRfM0RfYXJyYXkgPSAwCisgCisgICAgcmVhbChyOCksIHBvaW50ZXIs IGRpbWVuc2lvbiggOikgOjogICAgICAgICYKKyAgICAgICAgICAhIFZhcmlh YmxlcyAicGVybWFuZW50ZXMiIChlbnRyYW50IGRhbnMgbGEgcHJvamVjdGlv bikKKyAgICAgICAgICBSbywgICAgICAmICEgZGVuc2l0ZQorICAgICAgICAg IEV0cywgICAgICYgISBlbmVyZ2llIHRvdGFsZSBzcGVjaWZpcXVlCisgICAg ICAgICAgVW0sICAgICAgJiAhIHZpdGVzc2UgYXV4IG1haWxsZXMsIGRhbnMg bGEgZGlyZWN0aW9uIGRlIHRyYXZhaWwKKyAgICAgICAgICBYbiwgICAgICAm ICEgYWJzY2lzc2UgZW4gZmluIGRlIHBhcyBkZSB0ZW1wcworICAgICAgICAg ICEgVmFyaWFibGVzIGVuIGxlY3R1cmUgc2V1bGVtZW50CisgICAgICAgICAg VW1fcDEsICAgJiAhIHZpdGVzc2UgYXV4IG1haWxsZXMsIGRhbnMgbGVzIGRp cmVjdGlvbnMKKyAgICAgICAgICBVbV9wMiwgICAmICEgICAgICAgICAgICAg ICAgICAgICAgb3J0aG9nb25hbGVzCisgICAgICAgICAgWGEsICAgICAgJiAh IGFic2Npc3NlcyBkZXMgbm9ldWRzIGVuIGRlYnV0IGRlIHBhcyBkZSB0ZW1w cworICAgICAgICAgIER4YSwgICAgICYgISBsb25ndWV1ciBkZXMgbWFpbGxl cyBlbiBkZWJ1dCBkZSBwYXMgZGUgdGVtcHMKKyAgICAgICAgICBVX2R4YSAg ICAgICEgaW52ZXJzZXMgZGVzIGxvbmd1ZXVycyBkZXMgbWFpbGxlcworIAor IGVuZCBtb2R1bGUgdGVzdG1vZAorIAorIAorIHN1YnJvdXRpbmUgVEZfQURf U1BMSVRUSU5HX0RSSVZFUl9QTEFORQorIAorIHVzZSB0ZXN0bW9kCisgCisg aW1wbGljaXQgbm9uZQorIHNhdmUKKyAKKyAgICByZWFsKHI4KSwgYWxsb2Nh dGFibGUsIGRpbWVuc2lvbiggOikgOjogICYKKyAgICAgICAgICAhIFZhcmlh YmxlcyBtYWlsbGUgcmVjYWxjdWxlZXMgYSBjaGFxdWUgcGFzIGRlIHRlbXBz CisgICAgICAgICAgRWlzLCAgICAgJiAhIGVuZXJnaWUgaW50ZXJuZSBzcGVj aWZpcXVlIChzZXVsZW1lbnQgcG91ciBjYWxjdWxlciBsYSBwcmVzc2lvbikK KyAgICAgICAgICBWaXRfc29uLCAmICEgY29tbWUgc29uIG5vbSBsJ2luZGlx dWUKKyAgICAgICAgICBDX2ZfbCwgICAmICEgbm9tYnJlIGRlIENvdXJhbnQK KyAgICAgICAgICBQbSwgICAgICAmICEgcHJlc3Npb24gYXV4IG1haWxsZXMK KyAgICAgICAgICAhIFZhcmlhYmxlcyBhdXggbm9ldWRzCisgICAgICAgICAg VW4sICAgICAgJiAhIHZpdGVzc2UgZGVzIG5vZXVkcworICAgICAgICAgIFBu ICAgICAgICAgISBwcmVzc2lvbiBhdXggbm9ldWRzCisgCisgCisgaW50ZWdl cihpbnQpIDo6IGksIGosIGsKKyBpbnRlZ2VyKGludCkgOjogZmlyc3RfY2Vs bCwgbGFzdF9jZWxsCisgCisgICAgICAgICAgUm8gPT4gSHlkcm9fdmFycygg Zmlyc3RfY2VsbDpsYXN0X2NlbGwsIGosIGspJWNlbGxfdmFyKCByb192YXIp CisgICAgICAgICAgRXRzID0+IEh5ZHJvX3ZhcnMoIGZpcnN0X2NlbGw6bGFz dF9jZWxsLCBqLCBrKSVjZWxsX3ZhciggZXRzX3ZhcikKKyAgICAgICAgICBV bSA9PiBIeWRyb192YXJzKCBmaXJzdF9jZWxsOmxhc3RfY2VsbCwgaiwgaykl Y2VsbF92YXIoIHVfdmFyKQorICAgICAgICAgIFVtX3AxID0+IEh5ZHJvX3Zh cnMoIGZpcnN0X2NlbGw6bGFzdF9jZWxsLCBqLCBrKSVjZWxsX3ZhciggdXAx X3ZhcikKKyAgICAgICAgICBVbV9wMiA9PiBIeWRyb192YXJzKCBmaXJzdF9j ZWxsOmxhc3RfY2VsbCwgaiwgayklY2VsbF92YXIoIHVwMl92YXIpCisgCisg ZW5kIHN1YnJvdXRpbmUgVEZfQURfU1BMSVRUSU5HX0RSSVZFUl9QTEFORQor IApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2Fy cmF5XzMuZjkwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0 c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV8zLmY5MAkobm9uZXhp c3RlbnQpCi0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJf YXJyYXlfMy5mOTAJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqCioq KiAwICoqKioKLS0tIDEsNTEgLS0tLQorICEgeyBkZy1kbyBydW4gfQorICEK KyAhIFRlc3QgdGhlIGZpeCBmb3IgUFI0MDczNyBjb21tZW50IDE3IGFzIHBh cnQgb2YgdGhlIG92ZXJhbGwgZml4IGZvciBQUjM0NjQwLgorICEKKyAhIENv bnRyaWJ1dGVkIGJ5IEpvc2ggSHlrZXMgIDxqb3NodWFoeWtlc0B5YWhvby5j b20+CisgIQorICAgIG1vZHVsZSB0ZXN0X21vZAorICEKKyAgICB0eXBlIHQx CisgICAgICAgY2hhcmFjdGVyKDgpICA6OiBzdHJpbmcKKyAgICBlbmQgdHlw ZSB0MQorICEKKyAgICB0eXBlIHQyCisgICAgICBpbnRlZ2VyIDo6IHRhYgor ICAgICAgdHlwZSh0MSksIHBvaW50ZXIgOjogZnAoOikKKyAgICBlbmQgdHlw ZSB0MgorICEKKyAgICB0eXBlIHQzCisgICAgICAgaW50ZWdlciA6OiB0YWIK KyAgICAgICB0eXBlKHQyKSwgcG9pbnRlciA6OiBhcworICAgIGVuZCB0eXBl IHQzCisgIQorICAgIHR5cGUodDMpLCBwb2ludGVyIDo6IGFzX3R5cCg6KSA9 PiBudWxsKCkKKyAhCisgICAgY2hhcmFjdGVyKDgpLCAgcG9pbnRlciwgcHVi bGljIDo6IHAoOikKKyAhCisgICAgY29udGFpbnMKKyAhCisgICAgc3Vicm91 dGluZSBhc19zZXRfYWxpYXMgKGkpCisgIQorICAgIGltcGxpY2l0IG5vbmUK KyAhCisgICAgaW50ZWdlciwgaW50ZW50KGluKSAgICA6OiBpCisgIQorICAg ICAgYWxsb2NhdGUgKGFzX3R5cCgyKSkKKyAgICAgIGFsbG9jYXRlIChhc190 eXAoMSklYXMpCisgICAgICBhbGxvY2F0ZSAoYXNfdHlwKDEpJWFzJWZwKDIp LCBzb3VyY2UgPSBbdDEoImFiY2RlZmdoIiksdDEoImlqa2xtbm9wIildKQor ICAgICAgcCA9PiBhc190eXAoaSklYXMlZnAoOiklc3RyaW5nCisgIQorICAg IGVuZCBzdWJyb3V0aW5lIGFzX3NldF9hbGlhcworICEKKyAgICBlbmQgbW9k dWxlIHRlc3RfbW9kCisgCisgICAgcHJvZ3JhbSB0ZXN0X3Byb2cKKyAgICB1 c2UgdGVzdF9tb2QKKyAgICBjYWxsIGFzX3NldF9hbGlhcygxKQorICAgIGlm IChhbnkgKHAgLm5lLiBbImFiY2RlZmdoIiwiaWprbG1ub3AiXSkpIGNhbGwg YWJvcnQKKyAgICBkZWFsbG9jYXRlIChhc190eXAoMSklYXMlZnApCisgICAg ZGVhbGxvY2F0ZSAoYXNfdHlwKDEpJWFzKQorICAgIGRlYWxsb2NhdGUgKGFz X3R5cCkKKyAgICBlbmQgcHJvZ3JhbSB0ZXN0X3Byb2cKSW5kZXg6IGdjYy90 ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV80LmY5MAo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09CioqKiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFu LmRnL3BvaW50ZXJfYXJyYXlfNC5mOTAJKG5vbmV4aXN0ZW50KQotLS0gZ2Nj L3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzQuZjkwCSh3 b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAx LDc1IC0tLS0KKyAhIHsgZGctZG8gcnVuIH0KKyAhCisgISBUZXN0IHRoZSBm aXggZm9yIFBSNTcxMTYgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBmaXggZm9y IFBSMzQ2NDAuCisgIQorICEgQ29udHJpYnV0ZWQgYnkgUmVpbmhvbGQgQmFk ZXIgIDxCYWRlckBscnouZGU+CisgIQorIG1vZHVsZSBtb2RfcnR0aV9wdHIK KyAgIGltcGxpY2l0IG5vbmUKKyAgIHR5cGUgOjogZm9vCisgICAgICByZWFs IDo6IHYKKyAgICAgIGludGVnZXIgOjogaQorICAgZW5kIHR5cGUgZm9vCisg Y29udGFpbnMKKyAgIHN1YnJvdXRpbmUgZXh0cmFjdCh0aGlzLCB2LCBpYykK KyAgICAgY2xhc3MoKiksIHRhcmdldCA6OiB0aGlzKDopCisgICAgIHJlYWws IHBvaW50ZXIgOjogdig6KQorICAgICBpbnRlZ2VyIDo6IGljCisgICAgIHNl bGVjdCB0eXBlICh0aGlzKQorICAgICB0eXBlIGlzIChyZWFsKQorICAgICAg ICB2ID0+IHRoaXMoaWM6KQorICAgICBjbGFzcyBpcyAoZm9vKQorICAgICAg ICB2ID0+IHRoaXMoaWM6KSV2CisgICAgIGVuZCBzZWxlY3QKKyAgIGVuZCBz dWJyb3V0aW5lIGV4dHJhY3QKKyBlbmQgbW9kdWxlCisgCisgcHJvZ3JhbSBw cm9nX3J0dGlfcHRyCisgICB1c2UgbW9kX3J0dGlfcHRyCisgICBjbGFzcygq KSwgYWxsb2NhdGFibGUsIHRhcmdldCA6OiBvKDopCisgICByZWFsLCBwb2lu dGVyIDo6IHYoOikKKyAKKyAgIGFsbG9jYXRlKG8oMyksIHNvdXJjZT1bMS4w LCAyLjAsIDMuMF0pCisgICBjYWxsIGV4dHJhY3QobywgdiwgMikKKyAgIGlm IChzaXplKHYpID09IDIgLmFuZC4gYWxsICh2ID09IFsyLjAsIDMuMF0pKSB0 aGVuCisgICAgICBkZWFsbG9jYXRlKG8pCisgICBlbHNlCisgICAgICBjYWxs IGFib3J0CisgICBlbmQgaWYKKyAKKyAgIGFsbG9jYXRlKG8oMyksIHNvdXJj ZT1bZm9vKDEuMCwgMSksIGZvbyg0LjAsIDQpLCBmb28oNS4wLCA1KV0pCisg ICBjYWxsIGV4dHJhY3QobywgdiwgMikKKyAgIGlmIChzaXplKHYpID09IDIg LmFuZC4gYWxsICh2ID09IFs0LjAsIDUuMF0pKSB0aGVuCisgICAgICBkZWFs bG9jYXRlKG8pCisgICBlbHNlCisgICAgICBjYWxsIGFib3J0CisgICBlbmQg aWYKKyAKKyAhIFRoZSByZXN0IHRlc3RzIHRoZSBjYXNlIGluIGNvbW1lbnQg MiA8amFudXNAZ2NjLmdudS5vcmc+CisgCisgICBjYWxsIGV4dHJhY3QxICh2 LCAxKQorICAgaWYgKGFueSAodiAvPSBbMS4wLCAyLjBdKSkgY2FsbCBhYm9y dAorICAgY2FsbCBleHRyYWN0MSAodiwgMikgICEgQ2FsbCB0byBkZWFsbG9j YXRlIHBvaW50ZXIuCisgCisgY29udGFpbnMKKyAgIHN1YnJvdXRpbmUgZXh0 cmFjdDEodiwgZmxhZykKKyAgICAgdHlwZSA6OiBmb28KKyAgICAgICAgcmVh bCA6OiB2CisgICAgICAgIGNoYXJhY3Rlcig0KSA6OiBzdHIKKyAgICAgZW5k IHR5cGUKKyAgICAgY2xhc3MoZm9vKSwgcG9pbnRlciwgc2F2ZSA6OiB0aGlz KDopCisgICAgIHJlYWwsIHBvaW50ZXIgOjogdig6KQorICAgICBpbnRlZ2Vy IDo6IGZsYWcKKyAKKyAgICAgaWYgKGZsYWcgPT0gMSkgdGhlbgorICAgICAg IGFsbG9jYXRlICh0aGlzKDIpLCBzb3VyY2UgPSBbZm9vICgxLjAsICJvbmUg IiksIGZvbyAoMi4wLCAidHdvICIpXSkKKyAgICAgICBzZWxlY3QgdHlwZSAo dGhpcykKKyAgICAgICAgIGNsYXNzIGlzIChmb28pCisgICAgICAgICAgIHYg PT4gdGhpcygxOjIpJXYKKyAgICAgICBlbmQgc2VsZWN0CisgICAgIGVsc2UK KyAgICAgICBkZWFsbG9jYXRlICh0aGlzKQorICAgICBlbmQgaWYKKyAgIGVu ZCBzdWJyb3V0aW5lCisgCisgZW5kIHByb2dyYW0gcHJvZ19ydHRpX3B0cgpJ bmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5 XzUuZjkwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3Vp dGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV81LmY5MAkobm9uZXhpc3Rl bnQpCi0tLSBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJy YXlfNS5mOTAJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqCioqKiAw ICoqKioKLS0tIDEsNjUgLS0tLQorICEgeyBkZy1kbyBydW4gfQorICEKKyAh IFRlc3QgdGhlIGZpeCBmb3IgUFI1NTc2MyBjb21tZW50IDkgYXMgcGFydCBv ZiB0aGUgb3ZlcmFsbCBmaXggZm9yIFBSMzQ2NDAuCisgIQorICEgQ29udHJp YnV0ZWQgYnkgVG9iaWFzIEJ1cm51cyAgPGJ1cm51c0BnY2MuZ251Lm9yZz4K KyAhCisgICBwcm9ncmFtIGNoYW5nZV9maWVsZF90eXBlCisgICAgIHVzZSwg aW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgaW1wbGljaXQgbm9u ZQorICAgICBSRUFMKGtpbmQ9Y19mbG9hdCksIFBPSU5URVIgOjogdmVjdG9y X2NvbXAoOikKKyAgICAgVFlQRSwgQklORChDKSA6OiBzY2FsYXJfdmVjdG9y CisgICAgICAgIFJFQUwoa2luZD1jX2Zsb2F0KSA6OiBzY2FsYXIKKyAgICAg ICAgUkVBTChraW5kPWNfZmxvYXQpIDo6IHZlYygzKQorICAgICBFTkQgVFlQ RQorICAgICBUWVBFLCBCSU5EKEMpIDo6IHNjYWxhcl92ZWN0b3JfbWF0cml4 CisgICAgICAgIFJFQUwoa2luZD1jX2Zsb2F0KSA6OiBzY2FsYXIKKyAgICAg ICAgUkVBTChraW5kPWNfZmxvYXQpIDo6IHZlYygzKQorICAgICAgICBSRUFM KGtpbmQ9Y19mbG9hdCkgOjogbWF0KDMsMykKKyAgICAgRU5EIFRZUEUKKyAg ICAgQ0xBU1MoKiksIEFMTE9DQVRBQkxFLCBUQVJHRVQgOjogb25lX2RfZmll bGQoOikKKyAgICAgcmVhbCwgcG9pbnRlciA6OiB2MSg6KQorIAorICAgICBh bGxvY2F0ZShvbmVfZF9maWVsZCgzKSwgJgorICAgICAgICAgICAgICBzb3Vy Y2UgPSAoLyBzY2FsYXJfdmVjdG9yKCAxLjAsICgvIC0xLjAsIDAuMCwgMS4w IC8pICksICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFyX3Zl Y3RvciggMS4xLCAoLyAtMS4yLCAwLjIsIDAuOSAvKSApLCAmCisgICAgICAg ICAgICAgICAgICAgICAgICAgIHNjYWxhcl92ZWN0b3IoIDEuMiwgKC8gLTEu NCwgMC40LCAwLjggLykgKSAgLykgKQorIAorICAgICBjYWxsIGV4dHJhY3Rf dmVjKG9uZV9kX2ZpZWxkLCAxLCAyKQorICAgICBpZiAoYW55IChhYnMgKHZl Y3Rvcl9jb21wIC0gWzAuMCwwLjIsMC40XSkgLmd0LiAxZS00KSkgY2FsbCBh Ym9ydAorICAgICBkZWFsbG9jYXRlKG9uZV9kX2ZpZWxkKSAgICEgdjEgYmVj b21lcyB1bmRlZmluZWQKKyAKKyAgICAgYWxsb2NhdGUob25lX2RfZmllbGQo MSksICYKKyAgICAgICAgICBzb3VyY2UgPSAoLyBzY2FsYXJfdmVjdG9yX21h dHJpeCggMS4wLCAoLyAtMS4wLCAwLjAsIDEuMCAvKSwgJgorICAgICAgICAg IHJlc2hhcGUoICgvIDEuMCwgMC4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAu MCwgMC4wLCAxLjAgLyksICYKKyAgICAgICAgICAgICAgICAgICgvMywgMy8p ICkgKSAvKSApCisgCisgICAgIGNhbGwgZXh0cmFjdF92ZWMob25lX2RfZmll bGQsIDIsIDEpCisgICAgIGlmIChhYnMgKHZlY3Rvcl9jb21wKDEpICsgMS4w KSA+IDFlLTQpIGNhbGwgYWJvcnQKKyAgICAgY2FsbCBleHRyYWN0X3ZlYyhv bmVfZF9maWVsZCwgMiwgMykKKyAgICAgaWYgKGFicyAodmVjdG9yX2NvbXAo MSkgLSAxLjApID4gMWUtNCkgY2FsbCBhYm9ydAorICAgICBkZWFsbG9jYXRl KG9uZV9kX2ZpZWxkKSAgICEgdjEgYmVjb21lcyB1bmRlZmluZWQKKyAgIGNv bnRhaW5zCisgICAgIHN1YnJvdXRpbmUgZXh0cmFjdF92ZWMoZmllbGQsIHRh ZywgaWMpCisgICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5k aW5nCisgICAgICAgICBDTEFTUygqKSwgVEFSR0VUIDo6IGZpZWxkKDopCisg ICAgICAgICBJTlRFR0VSKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YWcsIGlj CisgCisgICAgICAgICB0eXBlKHNjYWxhcl92ZWN0b3IpLCBwb2ludGVyIDo6 IHN2KDopCisgICAgICAgICB0eXBlKHNjYWxhcl92ZWN0b3JfbWF0cml4KSwg cG9pbnRlciA6OiBzdm0oOikKKyAKKyAgICAgICAgIHNlbGVjdCB0eXBlIChm aWVsZCkKKyAgICAgICAgIHR5cGUgaXMgKHJlYWwoY19mbG9hdCkpCisgICAg ICAgICAgIHZlY3Rvcl9jb21wID0+IGZpZWxkCisgICAgICAgICBjbGFzcyBk ZWZhdWx0CisgICAgICAgICAgIHNlbGVjdCBjYXNlICh0YWcpCisgICAgICAg ICAgIGNhc2UgKDEpCisgICAgICAgICAgICAgIHN2ID0+IGZpZWxkCisgICAg ICAgICAgICAgIHZlY3Rvcl9jb21wID0+IHN2KDopJXZlYyhpYykKKyAgICAg ICAgICAgY2FzZSAoMikKKyAgICAgICAgICAgICAgc3ZtID0+IGZpZWxkCisg ICAgICAgICAgICAgIHZlY3Rvcl9jb21wID0+IHN2bSg6KSV2ZWMoaWMpCisg ICAgICAgICAgIGVuZCBzZWxlY3QKKyAgICAgICAgIGVuZCBzZWxlY3QKKyAg ICAgZW5kIHN1YnJvdXRpbmUKKyAgIGVuZCBwcm9ncmFtCkluZGV4OiBnY2Mv dGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfNi5mOTAKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJh bi5kZy9wb2ludGVyX2FycmF5XzYuZjkwCShub25leGlzdGVudCkKLS0tIGdj Yy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV82LmY5MAko d29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0g MSwyOCAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQorICEgVGVzdCB0aGUg Zml4IGZvciBQUjU3MDE5IGNvbW1lbnQgNCBhcyBwYXJ0IG9mIHRoZSBvdmVy YWxsIGZpeCBmb3IgUFIzNDY0MC4KKyAhCisgISBDb250cmlidXRlZCBieSAg PHRoYW1ic3VwQGdtYWlsLmNvbT4KKyAhCisgICB0eXBlIGNQYXJ0aWNsZQor ICAgICByZWFsKDQpIDo6IHYoMykKKyAgIGVuZHR5cGUgY1BhcnRpY2xlCisg CisgICB0eXBlIHBDSXRlbQorICAgICB0eXBlKGNQYXJ0aWNsZSkgOjogRWxl CisgICBlbmQgdHlwZSBwQ0l0ZW0KKyAKKyAgIHR5cGUocENJdGVtKSwgdGFy Z2V0LCBkaW1lbnNpb24oMToxLDE6MSkgOjogcENlbGxBcnJheQorICAgdHlw ZShjUGFydGljbGUpLCBwb2ludGVyLCBkaW1lbnNpb24oOiw6KSA6OiBwQXJy YXkKKyAgIHJlYWwoNCksIHBvaW50ZXIsIGRpbWVuc2lvbig6KSA6OiB2X3Bv aW50ZXIKKyAgIHJlYWwoNCksIGRpbWVuc2lvbigzKSA6OiB2X3JlYWwgPSA5 OS4KKyAKKyAgIHBBcnJheSA9PiBwQ2VsbEFycmF5JUVsZQorICAgdl9wb2lu dGVyID0+IHBBcnJheSgxLDEpJXY7CisgICB2X3BvaW50ZXIgPSB2X3JlYWwg IU9LICUlJSUlJSUlJSUlJQorICAgaWYgKGFueSAoaW50IChwQXJyYXkoMSwx KSV2KSAubmUuIDk5KSkgY2FsbCBhYm9ydAorIAorICAgdl9yZWFsID0gODgK KyAgIHBBcnJheSgxLDEpJXYgPSB2X3JlYWwgIVNFR0ZBVUxUICUlJSUlJSUl JSUlJSUlJSUlJSUlJSUlJQorICAgaWYgKGFueSAoaW50ICh2X3BvaW50ZXIp IC5uZS4gODgpKSBjYWxsIGFib3J0CisgZW5kCkluZGV4OiBnY2MvdGVzdHN1 aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfNy5mOTAKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9w b2ludGVyX2FycmF5XzcuZjkwCShub25leGlzdGVudCkKLS0tIGdjYy90ZXN0 c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV83LmY5MAkod29ya2lu ZyBjb3B5KQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw0NiAt LS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQorICEgVGVzdCBmb3IgdGhlIGZp eCBmb3IgUFIzNDY0MC4gSW4gdGhpcyBjYXNlLCBmaW5hbCB0ZXN0aW5nIG9m IHRoZQorICEgcGF0Y2ggcmV2ZWFsZWQgdGhhdCBpbiBzb21lIGNhc2VzIHRo ZSBhY3R1YWwgZGVzY3JpcHRvciB3YXMgbm90CisgISBiZWluZyBwYXNzZWQg dG8gcHJvY2VkdXJlIGR1bW15IHBvaW50ZXJzLgorICEKKyAhIENvbnRyaWJ1 dGVkIGJ5IFRob21hcyBLb2VuaWcgIDx0a29lbmlnQG5ldGNvbG9nbmUuZGU+ CisgIQorIG1vZHVsZSB4CisgICB1c2UgaXNvX2NfYmluZGluZworICAgaW1w bGljaXQgbm9uZQorICAgdHlwZSBmb28KKyAgICAgIGNvbXBsZXggOjogYwor ICAgICAgaW50ZWdlciA6OiBpCisgICBlbmQgdHlwZSBmb28KKyBjb250YWlu cworICAgc3Vicm91dGluZSBwcmludGl0KGMsIGEpCisgICAgIGNvbXBsZXgs IHBvaW50ZXIsIGRpbWVuc2lvbig6KSA6OiBjCisgICAgIGludGVnZXIgOjog aQorICAgICBpbnRlZ2VyKGtpbmQ9Y19pbnRwdHJfdCkgOjogYQorICAgICBh ID0gdHJhbnNmZXIoY19sb2MoYygyKSksYSkKKyAgIGVuZCBzdWJyb3V0aW5l IHByaW50aXQKKyBlbmQgbW9kdWxlIHgKKyAKKyBwcm9ncmFtIG1haW4KKyAg IHVzZSB4CisgICB1c2UgaXNvX2NfYmluZGluZworICAgaW1wbGljaXQgbm9u ZQorICAgdHlwZShmb28pLCBkaW1lbnNpb24oNSksIHRhcmdldCA6OiBhCisg ICBpbnRlZ2VyIDo6IGkKKyAgIGNvbXBsZXgsIGRpbWVuc2lvbig6KSwgcG9p bnRlciA6OiBwYworICAgaW50ZWdlcihraW5kPWNfaW50cHRyX3QpIDo6IHMx LCBzMiwgczMKKyAgIGElaSA9IDAKKyAgIGRvIGk9MSw1CisgICAgICBhKGkp JWMgPSBjbXBseChpKioyLGkpCisgICBlbmQgZG8KKyAgIHBjID0+IGElYwor ICAgY2FsbCBwcmludGl0KHBjLCBzMykKKyAKKyAgIHMxID0gdHJhbnNmZXIo Y19sb2MoYSgyKSVjKSxzMSkKKyAgIGlmIChzMSAvPSBzMykgY2FsbCBhYm9y dAorIAorICAgczIgPSB0cmFuc2ZlcihjX2xvYyhwYygyKSksczIpCisgICBp ZiAoczIgLz0gczMpIGNhbGwgYWJvcnQKKyAKKyBlbmQgcHJvZ3JhbSBtYWlu CkluZGV4OiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJy YXlfOC5mOTAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogZ2NjL3Rlc3Rz dWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVyX2FycmF5XzguZjkwCShub25leGlz dGVudCkKLS0tIGdjYy90ZXN0c3VpdGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9h cnJheV84LmY5MAkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKioKKioq IDAgKioqKgotLS0gMSw4MSAtLS0tCisgISB7IGRnLWRvIHJ1biB9CisgIQor ICEgTWFrZSBzdXJlIHRoYXQgdGhlIGZpeCBmb3IgcHIzNDY0MCB3b3JrcyB3 aXRoIGNsYXNzIHBvaW50ZXJzLgorICEKKyAgIHR5cGUgOjogbXl0eXBlCisg ICAgIHJlYWwgOjogcgorICAgICBpbnRlZ2VyIDo6IGkKKyAgIGVuZCB0eXBl CisgCisgICB0eXBlIDo6IHRoeXR5cGUKKyAgICAgcmVhbCA6OiByCisgICAg IGludGVnZXIgOjogaQorICAgICB0eXBlKG15dHlwZSkgOjogZGVyCisgICBl bmQgdHlwZQorIAorICAgdHlwZSh0aHl0eXBlKSwgZGltZW5zaW9uKDA6Miks IHRhcmdldCA6OiB0Z3QKKyAgIGNsYXNzKCopLCBkaW1lbnNpb24oOiksIHBv aW50ZXIgOjogY3B0cgorICAgY2xhc3MobXl0eXBlKSwgZGltZW5zaW9uKDop LCBwb2ludGVyIDo6IGNwdHIxCisgICBpbnRlZ2VyIDo6IGkKKyAgIGludGVn ZXIoOCkgOjogczEsIHMyCisgCisgICB0Z3QgPSBbKHRoeXR5cGUoaW50KGkp LCBpLCBteXR5cGUoaW50KDIqaSksIDIqaSkpLCBpPSAxLDMpXQorIAorICAg Y3B0ciA9PiB0Z3QlaQorICAgaWYgKGxib3VuZCAoY3B0ciwgMSkgLm5lLiAx KSAgQ2FsbCBhYm9ydCAgICAgISBOb3QgYSB3aG9sZSBhcnJheSB0YXJnZXQh CisgCisgICBzMSA9IGxvYyhjcHRyKQorICAgY2FsbCBmb28gKGNwdHIsIHMy KSAgICAgICAgICAgICAgICAgICAgICAgICAgISBDaGVjayBib3VuZHMgbm90 IGNoYW5nZWQuLi4KKyAgIGlmIChzMSAubmUuIHMyKSBDYWxsIGFib3J0ICAg ICAgICAgICAgICAgICAgICEgLi4uYW5kIHRoYXQgdGhlIGRlc2NyaXB0b3Ig aXMgcGFzc2VkLgorIAorICAgc2VsZWN0IHR5cGUgKGNwdHIpCisgICAgIHR5 cGUgaXMgKGludGVnZXIpCisgICAgICAgaWYgKGFueSAoY3B0ciAubmUuIFsx LDIsM10pKSBjYWxsIGFib3J0ICAhIENoZWNrIHRoZSB0aGUgc2NhbGFyaXpl ciB3b3Jrcy4KKyAgICAgICBpZiAoY3B0cigyKSAubmUuIDIpIGNhbGwgYWJv cnQgICAgICAgICAgICEgQ2hlY2sgb3JkaW5hcnkgYXJyYXkgaW5kZXhpbmcu CisgICBlbmQgc2VsZWN0CisgCisgICBjcHRyKDE6MykgPT4gdGd0JWRlciVy ICAgICAgICAgICAgICAgICAgICAgICAhIFNvbWV0aGluZyBhIHRhZCBtb3Jl IGNvbXBsaWNhdGVkIQorIAorICAgc2VsZWN0IHR5cGUgKGNwdHIpCisgICAg IHR5cGUgaXMgKHJlYWwpCisgICAgICAgaWYgKGFueSAoaW50KGNwdHIpIC5u ZS4gWzIsNCw2XSkpIGNhbGwgYWJvcnQKKyAgICAgICBpZiAoYW55IChpbnQo Y3B0cihbMiwzLDFdKSkgLm5lLiBbNCw2LDJdKSkgY2FsbCBhYm9ydAorICAg ICAgIGlmIChpbnQoY3B0cigzKSkgLm5lLiA2KSBjYWxsIGFib3J0CisgICBl bmQgc2VsZWN0CisgCisgICBjcHRyMSgxOjMpID0+IHRndCVkZXIKKyAKKyAg IHMxID0gbG9jKGNwdHIxKQorICAgY2FsbCBiYXIoY3B0cjEsIHMyKQorICAg aWYgKHMxIC5uZS4gczIpIENhbGwgYWJvcnQgICAgICAgICAgICAgICAgICAg ISBDaGVjayB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzIHBhc3NlZC4KKyAKKyAg IHNlbGVjdCB0eXBlIChjcHRyMSkKKyAgICAgdHlwZSBpcyAobXl0eXBlKQor ICAgICAgIGlmIChhbnkgKGNwdHIxJWkgLm5lLiBbMiw0LDZdKSkgY2FsbCBh Ym9ydAorICAgICAgIGlmIChjcHRyMSgyKSVpIC5uZS4gNCkgY2FsbCBhYm9y dAorICAgZW5kIHNlbGVjdAorIAorIGNvbnRhaW5zCisgCisgICBzdWJyb3V0 aW5lIGZvbyAoYXJnLCBhZGRyKQorICAgICBjbGFzcygqKSwgZGltZW5zaW9u KDopLCBwb2ludGVyIDo6IGFyZworICAgICBpbnRlZ2VyKDgpIDo6IGFkZHIK KyAgICAgYWRkciA9IGxvYyhhcmcpCisgICAgIHNlbGVjdCB0eXBlIChhcmcp CisgICAgICAgdHlwZSBpcyAoaW50ZWdlcikKKyAgICAgICAgIGlmIChhbnkg KGFyZyAubmUuIFsxLDIsM10pKSBjYWxsIGFib3J0ICAhIENoZWNrIHRoZSB0 aGUgc2NhbGFyaXplciB3b3Jrcy4KKyAgICAgICAgIGlmIChhcmcoMikgLm5l LiAyKSBjYWxsIGFib3J0ICAgICAgICAgICAhIENoZWNrIG9yZGluYXJ5IGFy cmF5IGluZGV4aW5nLgorICAgICBlbmQgc2VsZWN0CisgICBlbmQgc3Vicm91 dGluZQorIAorICAgc3Vicm91dGluZSBiYXIgKGFyZywgYWRkcikKKyAgICAg Y2xhc3MobXl0eXBlKSwgZGltZW5zaW9uKDopLCBwb2ludGVyIDo6IGFyZwor ICAgICBpbnRlZ2VyKDgpIDo6IGFkZHIKKyAgICAgYWRkciA9IGxvYyhhcmcp CisgICAgIHNlbGVjdCB0eXBlIChhcmcpCisgICAgICAgdHlwZSBpcyAobXl0 eXBlKQorICAgICAgICAgaWYgKGFueSAoYXJnJWkgLm5lLiBbMiw0LDZdKSkg Y2FsbCBhYm9ydAorICAgICAgICAgaWYgKGFyZygyKSVpIC5uZS4gNCkgY2Fs bCBhYm9ydAorICAgICBlbmQgc2VsZWN0CisgICBlbmQgc3Vicm91dGluZQor IGVuZApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVy X2FycmF5X2NvbXBvbmVudF8xLmY5MAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiBnY2MvdGVzdHN1aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlf Y29tcG9uZW50XzEuZjkwCShub25leGlzdGVudCkKLS0tIGdjYy90ZXN0c3Vp dGUvZ2ZvcnRyYW4uZGcvcG9pbnRlcl9hcnJheV9jb21wb25lbnRfMS5mOTAJ KHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0t IDEsNDcgLS0tLQorICEgeyBkZy1kbyBydW4gfQorICEKKyAhIENoZWNrIHRo ZSBmaXggZm9yIFBSMzQ2NDAgY29tbWVudCAyOC4KKyAhCisgISBUaGlzIGlu dm9sdmVzIHBvaW50ZXIgYXJyYXkgY29tcG9uZW50cyB0aGF0IHBvaW50IHRv IGNvbXBvbmVudHMgb2YgYXJyYXlzCisgISBvZiBkZXJpdmVkIHR5cGVzLgor ICEKKyAgIHR5cGUgdmFyX3RhYmxlcworICAgICAgcmVhbCwgcG9pbnRlciA6 OiBydmFyKDopCisgICBlbmQgdHlwZQorIAorICAgdHlwZSByZWFsX3ZhcnMK KyAgICAgIHJlYWwgcgorICAgICAgcmVhbCA6OiBpbmRleAorICAgZW5kIHR5 cGUKKyAKKyAgIHR5cGUodmFyX3RhYmxlcykgOjogIHZ0YWJfcgorICAgdHlw ZShyZWFsX3ZhcnMpLCAgdGFyZ2V0IDo6IHgoMikKKyAgIHJlYWwsIHBvaW50 ZXIgOjogeig6KQorICAgcmVhbCA6OiB5KDIpCisgCisgICB4ID0gW3JlYWxf dmFycyAoMTEuMCwgMS4wKSwgcmVhbF92YXJzICg0Mi4wLCAyLjApXQorICAg dnRhYl9yJXJ2YXIgPT4geCVyCisgICBpZiAoYW55IChhYnMgKHZ0YWJfciVy dmFyIC0gWzExLjAsIDQyLjBdKSA+IDEuMGUtNSkpIGNhbGwgYWJvcnQgICEg Q2hlY2sgc2tpcHBpbmcgJ2luZGV4OyBpcyBPSy4KKyAKKyAgIHkgPSB2dGFi X3IlcnZhcgorICAgaWYgKGFueSAoYWJzICh5IC0gWzExLjAsIDQyLjBdKSA+ IDEuMGUtNSkpIGNhbGwgYWJvcnQgICEgQ2hlY2sgdGhhdCB0aGUgY29tcG9u ZW50IGlzIHVzYWJsZSBpbiBhc3NpZ25tZW50LgorIAorICAgY2FsbCBmb29i YXIgKHZ0YWJfciwgWzExLjAsIDQyLjBdKQorIAorICAgdnRhYl9yID0gYmFy Zm9vICgpCisgCisgICBjYWxsIGZvb2JhciAodnRhYl9yLCBbMTExLjAsIDE0 Mi4wXSkKKyAKKyBjb250YWlucworICAgc3Vicm91dGluZSBmb29iYXIgKHZ0 YWIsIGFycmF5KQorICAgICB0eXBlKHZhcl90YWJsZXMpIDo6ICB2dGFiCisg ICAgIHJlYWwgOjogYXJyYXkgKDopCisgICAgIGlmIChhbnkgKGFicyAodnRh YiVydmFyIC0gYXJyYXkpID4gMS4wZS01KSkgY2FsbCBhYm9ydCAgISBDaGVj ayBwYXNzaW5nIGFzIGEgZHVtbXkuCisgICAgIGlmIChhYnMgKHZ0YWIlcnZh cigyKSAtIGFycmF5KDIpKSA+IDEuMGUtNSkgY2FsbCBhYm9ydCAgISBDaGVj ayBjb21wb25lbnQgcmVmZXJlbmNlLgorICAgZW5kIHN1YnJvdXRpbmUKKyAK KyAgIGZ1bmN0aW9uIGJhcmZvbyAoKSByZXN1bHQocmVzKQorICAgICB0eXBl KHZhcl90YWJsZXMpIDo6ICByZXMKKyAgICAgYWxsb2NhdGUgKHJlcyVydmFy KDIpLCBzb3VyY2UgPSBbMTExLjAsIDE0Mi4wXSkgICEgQ2hlY2sgYWxsb2Nh dGlvbgorICAgZW5kIGZ1bmN0aW9uCisgZW5kCkluZGV4OiBnY2MvdGVzdHN1 aXRlL2dmb3J0cmFuLmRnL3BvaW50ZXJfYXJyYXlfY29tcG9uZW50XzIuZjkw Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGdjYy90ZXN0c3VpdGUvZ2Zv cnRyYW4uZGcvcG9pbnRlcl9hcnJheV9jb21wb25lbnRfMi5mOTAJKG5vbmV4 aXN0ZW50KQotLS0gZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJhbi5kZy9wb2ludGVy X2FycmF5X2NvbXBvbmVudF8yLmY5MAkod29ya2luZyBjb3B5KQoqKioqKioq KioqKioqKioKKioqIDAgKioqKgotLS0gMSw0MyAtLS0tCisgISB7IGRnLWRv IHJ1biB9CisgIQorICEgVGVzdCB0aGUgZml4IGZvciBQUjM0NjQwLiBJbiB0 aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUgZml4LCB0aGUgZmlyc3QKKyAhIHRl c3RjYXNlIGluIFBSNTEyMTggZmFpbGVkIHdpdGggYSBzZWdmYXVsdC4gVGhp cyB0ZXN0IGV4dHJhY3RzIHRoZQorICEgZmFpbGluZyBwYXJ0IGFuZCBjaGVj a3MgdGhhdCBhbGwgaXMgd2VsbC4KKyAhCisgICB0eXBlIHRfaW5mb19ibG9j aworICAgICBpbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgIDo6IG4gICAg ID0gIDAgICAgICAhIG51bWJlciBvZiBlbGVtZW50cworICAgZW5kIHR5cGUg dF9pbmZvX2Jsb2NrCisgICAhCisgICB0eXBlIHRfZGVjX2luZm8KKyAgICAg aW50ZWdlciAgICAgICAgICAgICAgICAgICAgICA6OiBuICAgICA9ICAwICAg ICAgISBudW1iZXIgb2YgZWxlbWVudHMKKyAgICAgaW50ZWdlciAgICAgICAg ICAgICAgICAgICAgICA6OiBuX2IgICA9ICAwICAgICAgISBudW1iZXIgb2Yg YmxvY2tzCisgICAgIHR5cGUgKHRfaW5mb19ibG9jaykgLHBvaW50ZXIgOjog YiAoOikgPT4gTlVMTCgpICEgaW5mbyBibG9ja3MKKyAgIGVuZCB0eXBlIHRf ZGVjX2luZm8KKyAgICEKKyAgIHR5cGUgdF92ZWN0b3Jfc2VnbQorICAgICBp bnRlZ2VyICAgICAgICAgICA6OiBuICAgID0gIDAgICAgICAhIG51bWJlciBv ZiBlbGVtZW50cworICAgICByZWFsICxwb2ludGVyIDo6IHgoOikgPT4gTlVM TCgpICEgY29lZmZpY2llbnRzCisgICBlbmQgdHlwZSB0X3ZlY3Rvcl9zZWdt CisgICAhCisgICB0eXBlIHRfdmVjdG9yCisgICAgIHR5cGUgKHRfZGVjX2lu Zm8pICAgICxwb2ludGVyIDo6IGluZm8gICAgPT4gTlVMTCgpICAhIGRlY29t cG9zaXRpb24gaW5mbworICAgICBpbnRlZ2VyICAgICAgICAgICAgICAgICAg ICAgICA6OiBuICAgICAgID0gIDAgICAgICAgISBudW1iZXIgb2YgZWxlbWVu dHMKKyAgICAgaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgOjogbl9z ICAgICA9ICAwICAgICAgICEgbnVtYmVyIG9mIHNlZ21lbnRzCisgICAgIGlu dGVnZXIgICAgICAgICAgICAgICAgICAgICAgIDo6IGFsbG9jX2wgPSAgMCAg ICAgICAhIGFsbG9jYXRpb24gbGV2ZWwKKyAgICAgdHlwZSAodF92ZWN0b3Jf c2VnbSkgLHBvaW50ZXIgOjogcyAoOikgICA9PiBOVUxMKCkgICEgdmVjdG9y IGJsb2NrcworICAgZW5kIHR5cGUgdF92ZWN0b3IKKyAKKyAKKyAgIHR5cGUo dF92ZWN0b3IpIDo6IHoKKyAgIHR5cGUodF92ZWN0b3Jfc2VnbSksIHBvaW50 ZXIgOjogc3MKKyAKKyAgIGFsbG9jYXRlICh6JXMoMikpCisgICBkbyBpID0g MSwgMgorICAgICBzcyA9PiB6JXMoaSkKKyAgICAgYWxsb2NhdGUgKHNzJXgo MiksIHNvdXJjZSA9IFsxLjAsIDIuMF0qcmVhbChpKSkKKyAgIGVuZCBkbwor IAorICEgVGhlc2UgbGluZXMgd291bGQgc2VnZmF1bHQuCisgICBpZiAoaW50 IChzdW0gKHolcygxKSV4KSkgLm5lLiAzKSBjYWxsIGFib3J0CisgICBpZiAo aW50IChzdW0gKHolcygxKSV4ICogeiVzKDIpJXgpKSAubmUuIDEwKSBjYWxs IGFib3J0CisgZW5kCkluZGV4OiBsaWJnZm9ydHJhbi9saWJnZm9ydHJhbi5o Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKioqIGxpYmdmb3J0cmFuL2xpYmdm b3J0cmFuLmgJKHJldmlzaW9uIDI1MDA4MikKLS0tIGxpYmdmb3J0cmFuL2xp Ymdmb3J0cmFuLmgJKHdvcmtpbmcgY29weSkKKioqKioqKioqKioqKioqIHN0 cnVjdCB7XAoqKiogMzM5LDM0NCAqKioqCi0tLSAzMzksMzQ1IC0tLS0KICAg IHR5cGUgKmJhc2VfYWRkcjtcCiAgICBzaXplX3Qgb2Zmc2V0O1wKICAgIGlu ZGV4X3R5cGUgZHR5cGU7XAorICAgaW5kZXhfdHlwZSBzcGFuO1wKICAgIGRl c2NyaXB0b3JfZGltZW5zaW9uIGRpbVtyXTtcCiAgfQogIAo= --001a113c3e0e98809e05540b725b--