From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12789 invoked by alias); 12 Aug 2007 15:02:24 -0000 Received: (qmail 10012 invoked by uid 22791); 12 Aug 2007 15:02:02 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate3.de.ibm.com (HELO mtagate3.de.ibm.com) (195.212.29.152) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 12 Aug 2007 15:01:21 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate3.de.ibm.com (8.13.8/8.13.8) with ESMTP id l7CF1G19086502 for ; Sun, 12 Aug 2007 15:01:16 GMT Received: from d12av04.megacenter.de.ibm.com (d12av04.megacenter.de.ibm.com [9.149.165.229]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.4) with ESMTP id l7CF1G2T1917036 for ; Sun, 12 Aug 2007 17:01:16 +0200 Received: from d12av04.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av04.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l7CF1GgC004093 for ; Sun, 12 Aug 2007 17:01:16 +0200 Received: from d12mc102.megacenter.de.ibm.com (d12mc102.megacenter.de.ibm.com [9.149.167.114]) by d12av04.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id l7CF1Gci004090 for ; Sun, 12 Aug 2007 17:01:16 +0200 In-Reply-To: Subject: Re: [patch] [4.3 projects] outer-loop vectorization patch 1/n To: gcc-patches@gcc.gnu.org X-Mailer: Lotus Notes Release 7.0 HF277 June 21, 2006 Message-ID: From: Dorit Nuzman Date: Sun, 12 Aug 2007 15:02:00 -0000 MIME-Version: 1.0 Content-type: multipart/mixed; Boundary="0__=4DBBF9A6DFD8BE328f9e8a93df938690918c4DBBF9A6DFD8BE32" Content-Disposition: inline X-IsSubscribed: yes 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 X-SW-Source: 2007-08/txt/msg00780.txt.bz2 --0__=4DBBF9A6DFD8BE328f9e8a93df938690918c4DBBF9A6DFD8BE32 Content-type: text/plain; charset=US-ASCII Content-length: 11498 Attached below is the updated patch (part 1, updated to a more recent snapshot) Bootstrpped on powerpc64-linux, bootstrapped with vectorization enabled on i386-linux, and tested on the vectorizer testcases. dorit (See attached file: updated-outerloop-patch1.txt) > Hi, > This patch is the first part of > http://gcc.gnu.org/ml/gcc-patches/2007-08/msg00461.html. It adds initial > support for outer-loop vectorization. It basicaly brings over this patch: > http://gcc.gnu.org/ml/gcc-patches/2007-04/msg00044.html, along with some > fixes that went in later. > This patch can vectorize outer-loops only if there are no memory-references > in the inner-loop. > The patch includes the following changes to the vectorizer: > 1) So far we supported single-BB loops (+empty latch), so the order by > which we traversed the loop BBs did not matter. Now, it does - we sort in > BBs in dfs order (since we don't allow if's in the loop, this should > guarantee visiting defs before their uses). > 2) vect_analyze_loop_form was extend to allow a restricted form of > outer-loops. We currently support doubly-nested loops that consist of a > header, a single inner(most)-loop, a tail, and an empty latch (5 BBs all > together). > 3) vect_analyze_loop_form calls a new function - vect_analyze_loop_1 - to > do a few analyses on the inner-loop (currently only one analysis: > analyze_loop_form), and to build a loop_info for the inner-loop. It is > destroyed soon after, but w/o destroying the stmt_info's that were set up > for the inner-loop stmts. Maybe later we'll keep the inner-loop_info > around, if needed. > 4) Support for outer-loops breaks the assumption that phi nodes are only in > the loop-header, and represent a scalar-cycle (induction or reduction). In > outer-loops we also have phi-nodes inside the loop - these are the > loop-closed phis after the inner-loop. This required a way to distinguish > between these two kinds of phis (we use 'is_loop_header_bb_p' for that), > and a few small changes in several places: > o new_stmt_vec_info: different def-type initialization for the two kinds of > phis > o vect_is_simple_reduction: the uses that are not the reduction-variable > can now be defined by a phi, though not a loop-header phi. > o vect_recog_dot_prod_pattern: a vect_loop_def might be a phi, and not > necessarily a gimple_modify_stmt. > o vect_get_vec_def_for_oprnd: a vect_loop_def can be a phi node, and not > necessarily a gimple_modify_stmt. > 5) the enum "relevant" has two new values - > vect_used_in_outer[_by_reduction], which are propagated during the > mark_relevant pass. > 6) since we don't yet support multiple-data-types in the inner-loop, we > check in all relevant places, that this is not the case. > The more significant changes are to vectorization of reduction and > induction. In both cases we need to be aware of whether the > induction/reduction-phi that we are vectorizing is in the same nest that is > being vectorized, or is 'nested_in_vect_loop' (is inside the inner-loop > while vectorizing the outer-loop): > 7) vectorization of induction: In get_initial_def_for_induction, if this is > a 'nested_in_vect_loop' case, then: > o the initialization vector can be obtained using > vect_get_vec_def_for_operand (does not need to be built from scratch). > o the vector that holds the step of the vectorized induction is {S,S,S,S} > rather than {VF*S,VF*S,VF*S,VF*S} (where S is the step of the induction), > because in the vectorized inner-loop we are advancing sequentially (though > in parallel for VF outer-loop iterations). > o the final vector for inductions is recorded in the corresponding > loop-exit phi (of the inner-loop) so that we can easily obtain it when we > vectorize stmts in the outer-loop that use it. > 8) vectorization of reduction: The main thing here is that we don't need to > reduce the reduction to a single result; the final vector of partial > results will feed the vector operations that may use it in the outer-loop. > So: > o In get_initial_def_for_reduction, we may return a vector for the epilog > adjustment, rather than a scalar. > o epilog_for_reduction - skip the part that computes the final scalar > result in case this is a 'nested_in_vect_loop' case. > o and in vectorizable_reduction, we don't check that the reduction is > LIVE_P anymore (used out of the loop), cause it may be not used outside the > (outer) loop, but used inside the outer-loop (so as far as the inner-loop > reduction is concerned, it is used_in_outer_loop, but not live). > Bootstrpped on powerpc64-linux, > bootstrapped with vectorization enabled on i386-linux, > passed full regression testing on both platforms. > I will wait at least a week to give people a chance to review and comment. > thanks, > dorit > ChangeLog: > * tree-vectorizer.h (vect_is_simple_reduction): Takes a > loop_vec_info > as argument instead of struct loop. > (nested_in_vect_loop_p): New function. > (vect_relevant): Add enum values vect_used_in_outer_by_reduction > and > vect_used_in_outer. > (is_loop_header_bb_p): New. Used to differentiate loop-header phis > from other phis in the loop. > (destroy_loop_vec_info): Add additional argument to declaration. > > * tree-vectorizer.c (supportable_widening_operation): Also check if > nested_in_vect_loop_p (don't allow changing the order in this > case). > (vect_is_simple_reduction): Takes a loop_vec_info as argument > instead > of struct loop. Call nested_in_vect_loop_p and don't require > flag_unsafe_math_optimizations if it returns true. > * tree-vectorizer.c (new_stmt_vec_info): When setting def_type for > phis differentiate loop-header phis from other phis. > (bb_in_loop_p): New function. > (new_loop_vec_info): Inner-loop phis already have a stmt_vinfo, so > just > update their loop_vinfo. Order of BB traversal now matters - call > dfs_enumerate_from with bb_in_loop_p. > (destroy_loop_vec_info): Takes additional argument to control > whether > stmt_vinfo of the loop stmts should be destroyed as well. > (vect_is_simple_reduction): Allow the "non-reduction" use of a > reduction stmt to be defines by a non loop-header phi. > (vectorize_loops): Call destroy_loop_vec_info with additional > argument. > * tree-vect-transform.c (vectorizable_reduction): Call > nested_in_vect_loop_p. Check for multitypes in the inner-loop. > (vectorizable_call): Likewise. > (vectorizable_conversion): Likewise. > (vectorizable_operation): Likewise. > (vectorizable_type_promotion): Likewise. > (vectorizable_type_demotion): Likewise. > (vectorizable_store): Likewise. > (vectorizable_live_operation): Likewise. > (vectorizable_reduction): Likewise. Also pass loop_info to > vect_is_simple_reduction instead of loop. > (vect_init_vector): Call nested_in_vect_loop_p. > (get_initial_def_for_reduction): Likewise. > (vect_create_epilog_for_reduction): Likewise. > (vect_init_vector): Check which loop to work with, in case there's > an > inner-loop. > (get_initial_def_for_inducion): Extend to handle outer-loop > vectorization. Fix indentation. > (vect_get_vec_def_for_operand): Support phis in the case > vect_loop_def. > In the case vect_induction_def get the vector def from the > induction > phi node, instead of calling get_initial_def_for_inducion. > (get_initial_def_for_reduction): Extend to handle outer-loop > vectorization. > (vect_create_epilog_for_reduction): Extend to handle outer-loop > vectorization. > (vect_transform_loop): Change assert to just skip this case. Add a > dump printout. > (vect_finish_stmt_generation): Add a couple asserts. > > (vect_estimate_min_profitable_iters): Multiply > cost of inner-loop stmts (in outer-loop vectorization) by estimated > inner-loop bound. > (vect_model_reduction_cost): Don't add reduction epilogue cost in > case > this is an inner-loop reduction in outer-loop vectorization. > > * tree-vect-analyze.c (vect_analyze_scalar_cycles_1): New function. > Same code as what used to be vect_analyze_scalar_cycles, only with > additional argument loop, and loop_info passed to > vect_is_simple_reduction instead of loop. > (vect_analyze_scalar_cycles): Code factored out into > vect_analyze_scalar_cycles_1. Call it for each relevant loop-nest. > Updated documentation. > (analyze_operations): Check for inner-loop loop-closed exit-phis > during > outer-loop vectorization that are live or not used in the > outerloop, > cause this requires special handling. > (vect_enhance_data_refs_alignment): Don't consider versioning for > nested-loops. > (vect_analyze_data_refs): Check that there are no datarefs in the > inner-loop. > (vect_mark_stmts_to_be_vectorized): Also consider > vect_used_in_outer > and vect_used_in_outer_by_reduction cases. > (process_use): Also consider the case of outer-loop stmt defining > an > inner-loop stmt and vice versa. > (vect_analyze_loop_1): New function. > (vect_analyze_loop_form): Extend, to allow a restricted form of > nested > loops. Call vect_analyze_loop_1. > (vect_analyze_loop): Skip (inner-)loops within outer-loops that > have > been vectorized. Call destroy_loop_vec_info with additional > argument. > * tree-vect-patterns.c (vect_recog_widen_sum_pattern): Don't allow > in the inner-loop when doing outer-loop vectorization. Add > documentation and printout. > (vect_recog_dot_prod_pattern): Likewise. Also add check for > GIMPLE_MODIFY_STMT (in case we encounter a phi in the loop). > > testsuite/ChangeLog: > * gcc.dg/vect/vect.exp: Compile tests with -fno-tree-scev-cprop > and -fno-tree-reassoc. > * gcc.dg/vect/no-tree-scev-cprop-vect-iv-1.c: Moved to... > * gcc.dg/vect/no-scevccp-vect-iv-1.c: New test. > * gcc.dg/vect/no-tree-scev-cprop-vect-iv-2.c: Moved to... > * gcc.dg/vect/no-scevccp-vect-iv-2.c: New test. > * gcc.dg/vect/no-scevccp-noreassoc-outer-1.c: New test. > * gcc.dg/vect/no-scevccp-noreassoc-outer-2.c: New test. > * gcc.dg/vect/no-scevccp-noreassoc-outer-3.c: New test. > * gcc.dg/vect/no-scevccp-noreassoc-outer-4.c: New test. > * gcc.dg/vect/no-scevccp-noreassoc-outer-5.c: New test. > * gcc.dg/vect/no-scevccp-outer-1.c: New test. > * gcc.dg/vect/no-scevccp-outer-2.c: New test. > * gcc.dg/vect/no-scevccp-outer-3.c: New test. > * gcc.dg/vect/no-scevccp-outer-4.c: New test. > * gcc.dg/vect/no-scevccp-outer-5.c: New test. > * gcc.dg/vect/no-scevccp-outer-6.c: New test. > * gcc.dg/vect/no-scevccp-outer-7.c: New test. > * gcc.dg/vect/no-scevccp-outer-8.c: New test. > * gcc.dg/vect/no-scevccp-outer-9.c: New test. > * gcc.dg/vect/no-scevccp-outer-9a.c: New test. > * gcc.dg/vect/no-scevccp-outer-9b.c: New test. > * gcc.dg/vect/no-scevccp-outer-10.c: New test. > * gcc.dg/vect/no-scevccp-outer-10a.c: New test. > * gcc.dg/vect/no-scevccp-outer-10b.c: New test. > * gcc.dg/vect/no-scevccp-outer-11.c: New test. > * gcc.dg/vect/no-scevccp-outer-12.c: New test. > * gcc.dg/vect/no-scevccp-outer-13.c: New test. > * gcc.dg/vect/no-scevccp-outer-14.c: New test. > * gcc.dg/vect/no-scevccp-outer-15.c: New test. > * gcc.dg/vect/no-scevccp-outer-16.c: New test. > * gcc.dg/vect/no-scevccp-outer-17.c: New test. > * gcc.dg/vect/no-scevccp-outer-18.c: New test. > * gcc.dg/vect/no-scevccp-outer-19.c: New test. > * gcc.dg/vect/no-scevccp-outer-20.c: New test. > * gcc.dg/vect/no-scevccp-outer-21.c: New test. > * gcc.dg/vect/no-scevccp-outer-22.c: New test. > > (See attached file: mainlineouterloopdiff1t.txt) > > #### mainlineouterloopdiff1t.txt has been deleted (was already in > repository MyAttachments Repository ->) from this note on 11 August > 2007 by Dorit Nuzman --0__=4DBBF9A6DFD8BE328f9e8a93df938690918c4DBBF9A6DFD8BE32 Content-type: text/plain; name="updated-outerloop-patch1.txt" Content-Disposition: attachment; filename="updated-outerloop-patch1.txt" Content-transfer-encoding: base64 Content-length: 186571 SW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LXdpZGVuLW11bHQt c3VtLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogdGVzdHN1aXRlL2dj Yy5kZy92ZWN0L3ZlY3Qtd2lkZW4tbXVsdC1zdW0uYwkocmV2aXNpb24gMTI3 MzcxKQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3Qtd2lkZW4tbXVs dC1zdW0uYwkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogaW50IG1h aW4gKHZvaWQpCioqKiA0Miw0NSAqKioqCi0tLSA0Miw0NiAtLS0tCiAgCiAg CiAgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2ZWN0 b3JpemVkIDEgbG9vcHMiIDEgInZlY3QiIHsgdGFyZ2V0IHZlY3Rfd2lkZW5f bXVsdF9oaV90b19zaSB9IH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcC10aW1lcyAidmVjdF9yZWNvZ193aWRlbl9tdWx0X3BhdHRl cm46IGRldGVjdGVkIiAxICJ2ZWN0IiB9IH0gKi8KICAvKiB7IGRnLWZpbmFs IHsgY2xlYW51cC10cmVlLWR1bXAgInZlY3QiIH0gfSAqLwpJbmRleDogdGVz dHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItNy5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9u by1zY2V2Y2NwLW91dGVyLTcuYwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0 ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTcuYwkocmV2aXNpb24g MCkKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsNzUgLS0tLQor IC8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0g Ki8KKyAKKyAjaW5jbHVkZSA8c3RkYXJnLmg+CisgI2luY2x1ZGUgInRyZWUt dmVjdC5oIgorIAorICNkZWZpbmUgTiAxNgorIAorIHVuc2lnbmVkIHNob3J0 IGluW05dOworIHVuc2lnbmVkIHNob3J0IGNvZWZbTl07CisgdW5zaWduZWQg c2hvcnQgYVtOXTsKKyAKKyB1bnNpZ25lZCBpbnQKKyBmb28gKHNob3J0IHNj YWxlKXsKKyAgIGludCBpOworICAgdW5zaWduZWQgc2hvcnQgajsKKyAgIHVu c2lnbmVkIGludCBzdW0gPSAwOworICAgdW5zaWduZWQgc2hvcnQgc3VtX2o7 CisgCisgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgIHN1bV9q ID0gMDsKKyAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAg IHN1bV9qICs9IGo7CisgICAgIH0KKyAgICAgYVtpXSA9IHN1bV9qOworICAg ICBzdW0gKz0gKCh1bnNpZ25lZCBpbnQpIGluW2ldICogKHVuc2lnbmVkIGlu dCkgY29lZltpXSkgPj4gc2NhbGU7CisgICB9CisgICByZXR1cm4gc3VtOwor IH0KKyAKKyB1bnNpZ25lZCBzaG9ydAorIGJhciAodm9pZCkKKyB7CisgICB1 bnNpZ25lZCBzaG9ydCBqOworICAgdW5zaWduZWQgc2hvcnQgc3VtX2o7Cisg CisgICBzdW1faiA9IDA7CisgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7 CisgICAgIHN1bV9qICs9IGo7CisgICB9CisgCisgICByZXR1cm4gc3VtX2o7 CisgfQorIAorIGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpOworICAg dW5zaWduZWQgc2hvcnQgaiwgc3VtX2o7CisgICB1bnNpZ25lZCBpbnQgc3Vt ID0gMDsKKyAgIHVuc2lnbmVkIGludCByZXM7CisgCisgICBjaGVja192ZWN0 ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKXsKKyAgICAgaW5baV0g PSAyKmk7CisgICAgIGNvZWZbaV0gPSBpOworICAgfQorICAKKyAgIHJlcyA9 IGZvbyAoMik7CisgCisgICAvKiBjaGVjayByZXN1bHRzOiAgKi8KKyAgIGZv ciAoaT0wOyBpPE47IGkrKykKKyAgICAgeworICAgICAgIGlmIChhW2ldICE9 IGJhciAoKSkKKyAJYWJvcnQgKCk7CisgICAgICAgc3VtICs9ICgodW5zaWdu ZWQgaW50KSBpbltpXSAqICh1bnNpZ25lZCBpbnQpIGNvZWZbaV0pID4+IDI7 CisgICAgIH0KKyAgIGlmIChyZXMgIT0gc3VtKQorICAgICBhYm9ydCAoKTsK KyAKKyAgIHJldHVybiAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEg InZlY3QiIHsgdGFyZ2V0IHZlY3Rfd2lkZW5fbXVsdF9oaV90b19zaSB9IH0g fSAqLworIC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAi dmVjdF9yZWNvZ193aWRlbl9tdWx0X3BhdHRlcm46IGRldGVjdGVkIiAxICJ2 ZWN0IiB9IH0gKi8KKyAvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10cmVlLWR1 bXAgInZlY3QiIH0gfSAqLwpJbmRleDogdGVzdHN1aXRlL2djYy5kZy92ZWN0 L25vLXNjZXZjY3Atb3V0ZXItMTAuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0x MC5jCShyZXZpc2lvbiAwKQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L25v LXNjZXZjY3Atb3V0ZXItMTAuYwkocmV2aXNpb24gMCkKKioqKioqKioqKioq KioqCioqKiAwICoqKioKLS0tIDEsNTQgLS0tLQorIC8qIHsgZGctcmVxdWly ZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0gKi8KKyAKKyAjaW5jbHVk ZSA8c3RkYXJnLmg+CisgI2luY2x1ZGUgInRyZWUtdmVjdC5oIgorIAorICNk ZWZpbmUgTiA0MAorIAorIGludCBhW05dOworIGludCBiW05dOworIAorIGlu dAorIGZvbyAoaW50IG4peworICAgaW50IGksajsKKyAgIGludCBzdW0seCx5 OworIAorICAgZm9yIChpID0gMDsgaSA8IE4vMjsgaSsrKSB7CisgICAgIHN1 bSA9IDA7CisgICAgIHggPSBiWzIqaV07CisgICAgIHkgPSBiWzIqaSsxXTsK KyAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgIHN1bSAr PSBqOworICAgICB9CisgICAgIGFbMippXSA9IHN1bSArIHg7CisgICAgIGFb MippKzFdID0gc3VtICsgeTsKKyAgIH0KKyB9CisgCisgaW50IG1haW4gKHZv aWQpCisgeworICAgaW50IGksajsKKyAgIGludCBzdW07CisgCisgICBjaGVj a192ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAgICBi W2ldID0gaTsKKyAgCisgICBmb28gKE4tMSk7CisgCisgICAgIC8qIGNoZWNr IHJlc3VsdHM6ICAqLworICAgZm9yIChpPTA7IGk8Ti8yOyBpKyspCisgICAg IHsKKyAgICAgICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBO LTE7IGorKykKKyAgICAgICAgIHN1bSArPSBqOworICAgICAgIGlmIChhWzIq aV0gIT0gc3VtICsgYlsyKmldIHx8IGFbMippKzFdICE9IHN1bSArIGJbMipp KzFdKQorICAgICAgICAgYWJvcnQoKTsKKyAgICAgfQorIAorICAgcmV0dXJu IDA7CisgfQorIAorIC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10 aW1lcyAiT1VURVIgTE9PUCBWRUNUT1JJWkVELiIgMSAidmVjdCIgeyB4ZmFp bCAqLSotKiB9IH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRy ZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRn L3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0xMGEuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CioqKiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1v dXRlci0xMGEuYwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0ZS9nY2MuZGcv dmVjdC9uby1zY2V2Y2NwLW91dGVyLTEwYS5jCShyZXZpc2lvbiAwKQoqKioq KioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw1OCAtLS0tCisgLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAor ICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0Lmgi CisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgaW50IGJbTl07 CisgCisgaW50CisgZm9vIChpbnQgbil7CisgICBpbnQgaSxqOworICAgaW50 IHN1bSx4LHk7CisgCisgICBpZiAobjw9MCkKKyAgICAgcmV0dXJuIDA7Cisg CisgICBmb3IgKGkgPSAwOyBpIDwgTi8yOyBpKyspIHsKKyAgICAgc3VtID0g MDsKKyAgICAgeCA9IGJbMippXTsKKyAgICAgeSA9IGJbMippKzFdOworICAg ICBqID0gMDsKKyAgICAgZG8geworICAgICAgIHN1bSArPSBqOworICAgICB9 IHdoaWxlICgrK2ogPCBuKTsKKyAgICAgYVsyKmldID0gc3VtICsgeDsKKyAg ICAgYVsyKmkrMV0gPSBzdW0gKyB5OworICAgfQorIH0KKyAKKyBpbnQgbWFp biAodm9pZCkKKyB7CisgICBpbnQgaSxqOworICAgaW50IHN1bTsKKyAKKyAg IGNoZWNrX3ZlY3QgKCk7CisgCisgICBmb3IgKGk9MDsgaTxOOyBpKyspCisg ICAgIGJbaV0gPSBpOworICAKKyAgIGZvbyAoTi0xKTsKKyAKKyAgICAgLyog Y2hlY2sgcmVzdWx0czogICovCisgICBmb3IgKGk9MDsgaTxOLzI7IGkrKykK KyAgICAgeworICAgICAgIHN1bSA9IDA7CisgICAgICAgZm9yIChqID0gMDsg aiA8IE4tMTsgaisrKQorICAgICAgICAgc3VtICs9IGo7CisgICAgICAgaWYg KGFbMippXSAhPSBzdW0gKyBiWzIqaV0gfHwgYVsyKmkrMV0gIT0gc3VtICsg YlsyKmkrMV0pCisgICAgICAgICBhYm9ydCgpOworICAgICB9CisgCisgICBy ZXR1cm4gMDsKKyB9CisgCisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1k dW1wLXRpbWVzICJPVVRFUiBMT09QIFZFQ1RPUklaRUQuIiAxICJ2ZWN0IiB7 IHRhcmdldCB7IHZlY3RfaW50ZXJsZWF2ZSAmJiB2ZWN0X2V4dHJhY3RfZXZl bl9vZGQgfSB9IH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRy ZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRn L3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0xOC5jCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91 dGVyLTE4LmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3Zl Y3Qvbm8tc2NldmNjcC1vdXRlci0xOC5jCShyZXZpc2lvbiAwKQoqKioqKioq KioqKioqKioKKioqIDAgKioqKgotLS0gMSw1MSAtLS0tCisgLyogeyBkZy1y ZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNp bmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisg CisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgCisgaW50CisgZm9v ICgpeworICAgaW50IGksajsKKyAgIGludCBzdW07CisgCisgICBmb3IgKGkg PSAwOyBpIDwgTi8yOyBpKyspIHsKKyAgICAgc3VtID0gMDsKKyAgICAgZm9y IChqID0gMDsgaiA8IE47IGorKykgeworICAgICAgIHN1bSArPSBqOworICAg ICB9CisgICAgIGFbMippXSA9IHN1bTsKKyAgICAgYVsyKmkrMV0gPSAyKnN1 bTsKKyAgIH0KKyB9CisgCisgaW50IG1haW4gKHZvaWQpCisgeworICAgaW50 IGksajsKKyAgIGludCBzdW07CisgCisgICBjaGVja192ZWN0ICgpOworIAor ICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAgICBhW2ldID0gaTsKKyAgCisg ICBmb28gKCk7CisgCisgICAgIC8qIGNoZWNrIHJlc3VsdHM6ICAqLworICAg Zm9yIChpPTA7IGk8Ti8yOyBpKyspCisgICAgIHsKKyAgICAgICBzdW0gPSAw OworICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspCisgICAgICAgICBz dW0gKz0gajsKKyAgICAgICBpZiAoYVsyKmldICE9IHN1bSB8fCBhWzIqaSsx XSAhPSAyKnN1bSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAg IHJldHVybiAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3Qi IH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAi dmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8t c2NldmNjcC1vdXRlci04LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiog dGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItOC5jCShy ZXZpc2lvbiAwKQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZj Y3Atb3V0ZXItOC5jCShyZXZpc2lvbiAwKQoqKioqKioqKioqKioqKioKKioq IDAgKioqKgotLS0gMSw1MCAtLS0tCisgLyogeyBkZy1yZXF1aXJlLWVmZmVj dGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNsdWRlIDxzdGRh cmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisgI2RlZmluZSBO IDQwCisgCisgCisgaW50CisgZm9vIChpbnQgKmEpeworICAgaW50IGksajsK KyAgIGludCBzdW07CisgCisgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7 CisgICAgIHN1bSA9IDA7CisgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKysp IHsKKyAgICAgICBzdW0gKz0gajsKKyAgICAgfQorICAgICBhW2ldID0gc3Vt OworICAgfQorIH0KKyAKKyBpbnQgbWFpbiAodm9pZCkKKyB7CisgICBpbnQg aSxqOworICAgaW50IHN1bTsKKyAgIGludCBhW05dOworIAorICAgY2hlY2tf dmVjdCAoKTsKKyAKKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgYVtp XSA9IGk7CisgIAorICAgZm9vIChhKTsKKyAKKyAgICAgLyogY2hlY2sgcmVz dWx0czogICovCisgICBmb3IgKGk9MDsgaTxOOyBpKyspCisgICAgIHsKKyAg ICAgICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKysp CisgICAgICAgICBzdW0gKz0gajsKKyAgICAgICBpZiAoYVtpXSAhPSBzdW0p CisgICAgICAgICBhYm9ydCgpOworICAgICB9CisgCisgICByZXR1cm4gMDsK KyB9CisgCisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVz ICJPVVRFUiBMT09QIFZFQ1RPUklaRUQuIiAxICJ2ZWN0IiB7IHhmYWlsICot Ki0qIH0gfSB9ICovCisgLyogeyBkZy1maW5hbCB7IGNsZWFudXAtdHJlZS1k dW1wICJ2ZWN0IiB9IH0gKi8KSW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVj dC9uby1zY2V2Y2NwLW91dGVyLTExLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQoqKiogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXIt MTEuYwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9u by1zY2V2Y2NwLW91dGVyLTExLmMJKHJldmlzaW9uIDApCioqKioqKioqKioq KioqKgoqKiogMCAqKioqCi0tLSAxLDUwIC0tLS0KKyAvKiB7IGRnLXJlcXVp cmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCisgCisgI2luY2x1 ZGUgPHN0ZGFyZy5oPgorICNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKKyAKKyAj ZGVmaW5lIE4gNDAKKyAKKyBpbnQgYVtOXTsKKyAKKyBpbnQKKyBmb28gKGlu dCBuKXsKKyAgIGludCBpLGo7CisgICBpbnQgc3VtOworIAorICAgZm9yIChp ID0gMDsgaSA8IG47IGkrKykgeworICAgICBzdW0gPSAwOworICAgICBmb3Ig KGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgc3VtICs9IGo7CisgICAg IH0KKyAgICAgYVtpXSA9IHN1bTsKKyAgIH0KKyB9CisgCisgaW50IG1haW4g KHZvaWQpCisgeworICAgaW50IGksajsKKyAgIGludCBzdW07CisgCisgICBj aGVja192ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAg ICBhW2ldID0gaTsKKyAgCisgICBmb28gKE4pOworIAorICAgICAvKiBjaGVj ayByZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAg eworICAgICAgIHN1bSA9IDA7CisgICAgICAgZm9yIChqID0gMDsgaiA8IE47 IGorKykKKyAgICAgICAgIHN1bSArPSBqOworICAgICAgIGlmIChhW2ldICE9 IHN1bSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAgIHJldHVy biAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt dGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIHsgeGZh aWwgKi0qLSogfSB9IH0gKi8KKyAvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10 cmVlLWR1bXAgInZlY3QiIH0gfSAqLwpJbmRleDogdGVzdHN1aXRlL2djYy5k Zy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItMTBiLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQoqKiogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3At b3V0ZXItMTBiLmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRn L3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0xMGIuYwkocmV2aXNpb24gMCkKKioq KioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsNTcgLS0tLQorIC8qIHsg ZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0gKi8KKyAK KyAjaW5jbHVkZSA8c3RkYXJnLmg+CisgI2luY2x1ZGUgInRyZWUtdmVjdC5o IgorIAorICNkZWZpbmUgTiA0MAorIAorIGludCBhW05dOworIGludCBiW05d OworIAorIGludAorIGZvbyAoaW50IG4peworICAgaW50IGksajsKKyAgIGlu dCBzdW0seCx5OworIAorICAgaWYgKG48PTApCisgICAgIHJldHVybiAwOwor IAorICAgZm9yIChpID0gMDsgaSA8IE4vMjsgaSsrKSB7CisgICAgIHN1bSA9 IDA7CisgICAgIHggPSBiWzIqaV07CisgICAgIHkgPSBiWzIqaSsxXTsKKyAg ICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgIHN1bSArPSBq OworICAgICB9CisgICAgIGFbMippXSA9IHN1bSArIHg7CisgICAgIGFbMipp KzFdID0gc3VtICsgeTsKKyAgIH0KKyB9CisgCisgaW50IG1haW4gKHZvaWQp CisgeworICAgaW50IGksajsKKyAgIGludCBzdW07CisgCisgICBjaGVja192 ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAgICBiW2ld ID0gaTsKKyAgCisgICBmb28gKE4tMSk7CisgCisgICAgIC8qIGNoZWNrIHJl c3VsdHM6ICAqLworICAgZm9yIChpPTA7IGk8Ti8yOyBpKyspCisgICAgIHsK KyAgICAgICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBOLTE7 IGorKykKKyAgICAgICAgIHN1bSArPSBqOworICAgICAgIGlmIChhWzIqaV0g IT0gc3VtICsgYlsyKmldIHx8IGFbMippKzFdICE9IHN1bSArIGJbMippKzFd KQorICAgICAgICAgYWJvcnQoKTsKKyAgICAgfQorIAorICAgcmV0dXJuIDA7 CisgfQorIAorIC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1l cyAiT1VURVIgTE9PUCBWRUNUT1JJWkVELiIgMSAidmVjdCIgeyB0YXJnZXQg eyB2ZWN0X2ludGVybGVhdmUgJiYgdmVjdF9leHRyYWN0X2V2ZW5fb2RkIH0g fSB9IH0gKi8KKyAvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10cmVlLWR1bXAg InZlY3QiIH0gfSAqLwpJbmRleDogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25v LXNjZXZjY3Atb3V0ZXItMTkuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cioq KiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0xOS5j CShyZXZpc2lvbiAwKQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNj ZXZjY3Atb3V0ZXItMTkuYwkocmV2aXNpb24gMCkKKioqKioqKioqKioqKioq CioqKiAwICoqKioKLS0tIDEsNTIgLS0tLQorIC8qIHsgZGctcmVxdWlyZS1l ZmZlY3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0gKi8KKyAKKyAjaW5jbHVkZSA8 c3RkYXJnLmg+CisgI2luY2x1ZGUgInRyZWUtdmVjdC5oIgorIAorICNkZWZp bmUgTiA2NAorIAorIHVuc2lnbmVkIHNob3J0IGFbTl07CisgdW5zaWduZWQg aW50IGJbTl07CisgCisgaW50CisgZm9vICgpeworICAgdW5zaWduZWQgc2hv cnQgaSxqOworICAgdW5zaWduZWQgc2hvcnQgc3VtOworIAorICAgZm9yIChp ID0gMDsgaSA8IE47IGkrKykgeworICAgICBzdW0gPSAwOworICAgICBmb3Ig KGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgc3VtICs9IGo7CisgICAg IH0KKyAgICAgYVtpXSA9IHN1bTsKKyAgICAgYltpXSA9ICh1bnNpZ25lZCBp bnQpc3VtOworICAgfQorIH0KKyAKKyBpbnQgbWFpbiAodm9pZCkKKyB7Cisg ICBpbnQgaSxqOworICAgc2hvcnQgc3VtOworIAorICAgY2hlY2tfdmVjdCAo KTsKKyAKKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgYVtpXSA9IGk7 CisgIAorICAgZm9vICgpOworIAorICAgICAvKiBjaGVjayByZXN1bHRzOiAg Ki8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgeworICAgICAgIHN1 bSA9IDA7CisgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykKKyAgICAg ICAgIHN1bSArPSBqOworICAgICAgIGlmIChhW2ldICE9IHN1bSAgfHwgYltp XSAhPSAodW5zaWduZWQgaW50KXN1bSkKKyAgICAgICAgIGFib3J0KCk7Cisg ICAgIH0KKyAKKyAgIHJldHVybiAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpF RC4iIDEgInZlY3QiIH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVw LXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2Nj LmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0yMC5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2Nw LW91dGVyLTIwLmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRn L3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0yMC5jCShyZXZpc2lvbiAwKQoqKioq KioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw1NCAtLS0tCisgLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAor ICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0Lmgi CisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgaW50IGJbTl07 CisgCisgaW50CisgZm9vICgpeworICAgaW50IGksajsKKyAgIGludCBzdW0s eCx5OworIAorICAgZm9yIChpID0gMDsgaSA8IE4vMjsgaSsrKSB7CisgICAg IHN1bSA9IDA7CisgICAgIHggPSBiWzIqaV07CisgICAgIHkgPSBiWzIqaSsx XTsKKyAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAgIHN1 bSArPSBqOworICAgICB9CisgICAgIGFbMippXSA9IHN1bSArIHg7CisgICAg IGFbMippKzFdID0gc3VtICsgeTsKKyAgIH0KKyB9CisgCisgaW50IG1haW4g KHZvaWQpCisgeworICAgaW50IGksajsKKyAgIGludCBzdW07CisgCisgICBj aGVja192ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAg ICBiW2ldID0gaTsKKyAgCisgICBmb28gKCk7CisgCisgICAgIC8qIGNoZWNr IHJlc3VsdHM6ICAqLworICAgZm9yIChpPTA7IGk8Ti8yOyBpKyspCisgICAg IHsKKyAgICAgICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBO OyBqKyspCisgICAgICAgICBzdW0gKz0gajsKKyAgICAgICBpZiAoYVsyKmld ICE9IHN1bSArIGJbMippXSB8fCBhWzIqaSsxXSAhPSBzdW0gKyBiWzIqaSsx XSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAgIHJldHVybiAw OworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGlt ZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIHsgdGFyZ2V0 IHsgdmVjdF9pbnRlcmxlYXZlICYmIHZlY3RfZXh0cmFjdF9ldmVuX29kZCB9 IH0gfSB9ICovCisgLyogeyBkZy1maW5hbCB7IGNsZWFudXAtdHJlZS1kdW1w ICJ2ZWN0IiB9IH0gKi8KSW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9u by1zY2V2Y2NwLW91dGVyLTEuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cioq KiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0xLmMJ KHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2Nl dmNjcC1vdXRlci0xLmMJKHJldmlzaW9uIDApCioqKioqKioqKioqKioqKgoq KiogMCAqKioqCi0tLSAxLDIzIC0tLS0KKyAvKiB7IGRnLWRvIGNvbXBpbGUg fSAqLworIAorICNkZWZpbmUgTiA0MAorIHNpZ25lZCBzaG9ydCBpbWFnZVtO XVtOXTsKKyBzaWduZWQgc2hvcnQgYmxvY2tbTl1bTl07CisgCisgLyogbWVt b3J5IHJlZmVyZW5jZXMgaW4gdGhlIGlubmVyLWxvb3AgKi8KKyAKKyB1bnNp Z25lZCBpbnQKKyBmb28gKCl7CisgICBpbnQgaSxqOworICAgdW5zaWduZWQg aW50IGRpZmYgPSAwOworIAorICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykg eworICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgZGlm ZiArPSAoaW1hZ2VbaV1bal0gLSBibG9ja1tpXVtqXSk7CisgICAgIH0KKyAg IH0KKyAgIHJldHVybiBkaWZmOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRCIg MSAidmVjdCIgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLworIC8qIHsgZGctZmlu YWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0 ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci05LmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQoqKiogdGVzdHN1aXRlL2djYy5kZy92ZWN0 L25vLXNjZXZjY3Atb3V0ZXItOS5jCShyZXZpc2lvbiAwKQotLS0gdGVzdHN1 aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItOS5jCShyZXZpc2lv biAwKQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw1MCAtLS0t CisgLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQg fSAqLworIAorICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJl ZS12ZWN0LmgiCisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07Cisg CisgaW50CisgZm9vIChpbnQgbil7CisgICBpbnQgaSxqOworICAgaW50IHN1 bTsKKyAKKyAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgc3Vt ID0gMDsKKyAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAg IHN1bSArPSBqOworICAgICB9CisgICAgIGFbaV0gPSBzdW07CisgICB9Cisg fQorIAorIGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpLGo7CisgICBp bnQgc3VtOworIAorICAgY2hlY2tfdmVjdCAoKTsKKyAKKyAgIGZvciAoaT0w OyBpPE47IGkrKykKKyAgICAgYVtpXSA9IGk7CisgIAorICAgZm9vIChOKTsK KyAKKyAgICAgLyogY2hlY2sgcmVzdWx0czogICovCisgICBmb3IgKGk9MDsg aTxOOyBpKyspCisgICAgIHsKKyAgICAgICBzdW0gPSAwOworICAgICAgIGZv ciAoaiA9IDA7IGogPCBOOyBqKyspCisgICAgICAgICBzdW0gKz0gajsKKyAg ICAgICBpZiAoYVtpXSAhPSBzdW0pCisgICAgICAgICBhYm9ydCgpOworICAg ICB9CisgCisgICByZXR1cm4gMDsKKyB9CisgCisgLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJPVVRFUiBMT09QIFZFQ1RPUklaRUQu IiAxICJ2ZWN0IiB7IHhmYWlsICotKi0qIH0gfSB9ICovCisgLyogeyBkZy1m aW5hbCB7IGNsZWFudXAtdHJlZS1kdW1wICJ2ZWN0IiB9IH0gKi8KSW5kZXg6 IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTEyLmMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQoqKiogdGVzdHN1aXRlL2djYy5kZy92 ZWN0L25vLXNjZXZjY3Atb3V0ZXItMTIuYwkocmV2aXNpb24gMCkKLS0tIHRl c3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTEyLmMJKHJl dmlzaW9uIDApCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDUw IC0tLS0KKyAvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0 X2ludCB9ICovCisgCisgI2luY2x1ZGUgPHN0ZGFyZy5oPgorICNpbmNsdWRl ICJ0cmVlLXZlY3QuaCIKKyAKKyAjZGVmaW5lIE4gNjQKKyAKKyBpbnQgYVtO XTsKKyBzaG9ydCBiW05dOworIAorIGludAorIGZvbyAoKXsKKyAgIGludCBp LGo7CisgICBpbnQgc3VtOworIAorICAgZm9yIChpID0gMDsgaSA8IE47IGkr KykgeworICAgICBzdW0gPSAwOworICAgICBmb3IgKGogPSAwOyBqIDwgTjsg aisrKSB7CisgICAgICAgc3VtICs9IGo7CisgICAgIH0KKyAgICAgYVtpXSA9 IHN1bTsKKyAgICAgYltpXSA9IChzaG9ydClzdW07CisgICB9CisgfQorIAor IGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpLGo7CisgICBpbnQgc3Vt OworIAorICAgY2hlY2tfdmVjdCAoKTsKKyAKKyAgIGZvbyAoKTsKKyAKKyAg ICAgLyogY2hlY2sgcmVzdWx0czogICovCisgICBmb3IgKGk9MDsgaTxOOyBp KyspCisgICAgIHsKKyAgICAgICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9 IDA7IGogPCBOOyBqKyspCisgICAgICAgICBzdW0gKz0gajsKKyAgICAgICBp ZiAoYVtpXSAhPSBzdW0gIHx8IGJbaV0gIT0gKHNob3J0KXN1bSkKKyAgICAg ICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAgIHJldHVybiAwOworIH0KKyAK KyAvKiBVbnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHR5cGVzIGluIHRoZSBp bm5lciBsb29wICAqLworIC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cC10aW1lcyAiT1VURVIgTE9PUCBWRUNUT1JJWkVELiIgMSAidmVjdCIgeyB4 ZmFpbCAqLSotKiB9IH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVw LXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2Nj LmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0yMS5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2Nw LW91dGVyLTIxLmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRn L3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0yMS5jCShyZXZpc2lvbiAwKQoqKioq KioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw2MiAtLS0tCisgLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAor ICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0Lmgi CisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgCisgaW50Cisg Zm9vICgpeworICAgaW50IGk7CisgICB1bnNpZ25lZCBzaG9ydCBqOworICAg aW50IHN1bSA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBzdW1fajsKKyAKKyAg IGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgc3VtICs9IGk7Cisg CisgICAgIHN1bV9qID0gaTsKKyAgICAgZm9yIChqID0gMDsgaiA8IE47IGor KykgeworICAgICAgIHN1bV9qICs9IGo7CisgICAgIH0KKyAgICAgYVtpXSA9 IHN1bV9qICsgNTsKKyAgIH0KKyAgIHJldHVybiBzdW07CisgfQorIAorIGlu dCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpOworICAgdW5zaWduZWQgc2hv cnQgaiwgc3VtX2o7CisgICBpbnQgc3VtID0gMDsKKyAgIGludCByZXM7Cisg CisgICBjaGVja192ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsr KQorICAgICBhW2ldID0gaTsKKyAgCisgICByZXMgPSBmb28gKCk7CisgCisg ICAvKiBjaGVjayByZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkr KykKKyAgICAgeworICAgICAgIHN1bSArPSBpOworIAorICAgICAgIHN1bV9q ID0gaTsKKyAgICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKXsKKyAgICAg ICAgIHN1bV9qICs9IGo7CisgICAgICAgfQorICAgICAgIGlmIChhW2ldICE9 IHN1bV9qICsgNSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAgIGlm IChyZXMgIT0gc3VtKQorICAgICBhYm9ydCAoKTsKKyAKKyAgIHJldHVybiAw OworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGlt ZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIH0gfSAqLwor IC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9 ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1v dXRlci0yLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogdGVzdHN1aXRl L2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItMi5jCShyZXZpc2lvbiAw KQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXIt Mi5jCShyZXZpc2lvbiAwKQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgot LS0gMSwxOCAtLS0tCisgLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKyAjZGVm aW5lIE4gNDAKKyAKKyBpbnQKKyBmb28gKCl7CisgICBpbnQgaSxqOworICAg aW50IGRpZmYgPSAwOworIAorICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykg eworICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgZGlm ZiArPSBqOworICAgICB9CisgICB9CisgICByZXR1cm4gZGlmZjsKKyB9Cisg CisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJPVVRF UiBMT09QIFZFQ1RPUklaRUQiIDEgInZlY3QiIHsgeGZhaWwgKi0qLSogfSB9 IH0gKi8KKyAvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10cmVlLWR1bXAgInZl Y3QiIH0gfSAqLwpJbmRleDogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNj ZXZjY3Atb3V0ZXItMTMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CioqKiB0 ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci0xMy5jCShy ZXZpc2lvbiAwKQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZj Y3Atb3V0ZXItMTMuYwkocmV2aXNpb24gMCkKKioqKioqKioqKioqKioqCioq KiAwICoqKioKLS0tIDEsNjcgLS0tLQorIC8qIHsgZGctcmVxdWlyZS1lZmZl Y3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0gKi8KKyAKKyAjaW5jbHVkZSA8c3Rk YXJnLmg+CisgI2luY2x1ZGUgInRyZWUtdmVjdC5oIgorIAorICNkZWZpbmUg TiAxNgorIAorIHVuc2lnbmVkIHNob3J0IGluW05dOworIAorIHVuc2lnbmVk IGludAorIGZvbyAoc2hvcnQgc2NhbGUpeworICAgaW50IGk7CisgICB1bnNp Z25lZCBzaG9ydCBqOworICAgdW5zaWduZWQgaW50IHN1bSA9IDA7CisgICB1 bnNpZ25lZCBzaG9ydCBzdW1fajsKKyAKKyAgIGZvciAoaSA9IDA7IGkgPCBO OyBpKyspIHsKKyAgICAgc3VtX2ogPSAwOworICAgICBmb3IgKGogPSAwOyBq IDwgTjsgaisrKSB7CisgICAgICAgc3VtX2ogKz0gajsKKyAgICAgfQorICAg ICBzdW0gKz0gKCh1bnNpZ25lZCBpbnQpIGluW2ldICogKHVuc2lnbmVkIGlu dCkgc3VtX2opID4+IHNjYWxlOworICAgfQorICAgcmV0dXJuIHN1bTsKKyB9 CisgCisgdW5zaWduZWQgc2hvcnQKKyBiYXIgKHZvaWQpCisgeworICAgdW5z aWduZWQgc2hvcnQgajsKKyAgIHVuc2lnbmVkIHNob3J0IHN1bV9qOworICAg ICBzdW1faiA9IDA7CisgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspIHsK KyAgICAgICBzdW1faiArPSBqOworICAgICB9CisgICByZXR1cm4gc3VtX2o7 CisgfQorIAorIGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpOworICAg dW5zaWduZWQgc2hvcnQgaiwgc3VtX2o7CisgICB1bnNpZ25lZCBpbnQgc3Vt ID0gMDsKKyAgIHVuc2lnbmVkIGludCByZXM7CisgCisgICBjaGVja192ZWN0 ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKXsKKyAgICAgaW5baV0g PSBpOworICAgfQorICAKKyAgIHJlcyA9IGZvbyAoMik7CisgCisgICAvKiBj aGVjayByZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAg ICAgeworICAgICAgIHN1bV9qID0gYmFyICgpOworICAgICAgIHN1bSArPSAo KHVuc2lnbmVkIGludCkgaW5baV0gKiAodW5zaWduZWQgaW50KSBzdW1faikg Pj4gMjsKKyAgICAgfQorICAgaWYgKHJlcyAhPSBzdW0pCisgICAgIGFib3J0 ICgpOworIAorICAgcmV0dXJuIDA7CisgfQorIAorIC8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiT1VURVIgTE9PUCBWRUNUT1JJWkVE LiIgMSAidmVjdCIgeyB0YXJnZXQgdmVjdF93aWRlbl9tdWx0X2hpX3RvX3Np IH0gfSB9ICovCisgLyogeyBkZy1maW5hbCB7IGNsZWFudXAtdHJlZS1kdW1w ICJ2ZWN0IiB9IH0gKi8KSW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9u by1zY2V2Y2NwLW5vcmVhc3NvYy1vdXRlci0xLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQoqKiogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3At bm9yZWFzc29jLW91dGVyLTEuYwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0 ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW5vcmVhc3NvYy1vdXRlci0xLmMJ KHJldmlzaW9uIDApCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAx LDUwIC0tLS0KKyAvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2 ZWN0X2ludCB9ICovCisgCisgI2luY2x1ZGUgPHN0ZGFyZy5oPgorICNpbmNs dWRlICJ0cmVlLXZlY3QuaCIKKyAKKyAjZGVmaW5lIE4gNDAKKyAKKyBpbnQg YVtOXTsKKyAKKyBpbnQKKyBmb28gKCl7CisgICBpbnQgaSxqLGs9MDsKKyAg IGludCBzdW0seDsKKyAKKyAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsK KyAgICAgc3VtID0gMDsKKyAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykg eworICAgICAgIHN1bSArPSAoaSArIGopOworICAgICAgIGkrKzsKKyAgICAg fQorICAgICBhW2srK10gPSBzdW07CisgICB9CisgfQorIAorIGludCBtYWlu ICh2b2lkKQorIHsKKyAgIGludCBpLGosaz0wOworICAgaW50IHN1bTsKKyAK KyAgIGNoZWNrX3ZlY3QgKCk7CisgCisgICBmb28gKCk7CisgCisgICAgIC8q IGNoZWNrIHJlc3VsdHM6ICAqLworICAgZm9yIChpPTA7IGk8TjsgaSsrKQor ICAgICB7CisgICAgICAgc3VtID0gMDsKKyAgICAgICBmb3IgKGogPSAwOyBq IDwgTjsgaisrKXsKKyAgICAgICAgIHN1bSArPSAoaiArIGkpOworIAlpKys7 CisgICAgICAgfQorICAgICAgIGlmIChhW2srK10gIT0gc3VtKQorICAgICAg ICAgYWJvcnQoKTsKKyAgICAgfQorIAorICAgcmV0dXJuIDA7CisgfQorIAor IC8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiT1VURVIg TE9PUCBWRUNUT1JJWkVELiIgMSAidmVjdCIgeyB4ZmFpbCAqLSotKiB9IH0g fSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVj dCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2Nl dmNjcC1vdXRlci0yMi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRl c3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTIyLmMJKHJl dmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNj cC1vdXRlci0yMi5jCShyZXZpc2lvbiAwKQoqKioqKioqKioqKioqKioKKioq IDAgKioqKgotLS0gMSw1NCAtLS0tCisgLyogeyBkZy1yZXF1aXJlLWVmZmVj dGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNsdWRlIDxzdGRh cmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisgI2RlZmluZSBO IDQwCisgCisgaW50IGFbTl07CisgCisgaW50CisgZm9vIChpbnQgbil7Cisg ICBpbnQgaSxqOworICAgaW50IHN1bTsKKyAKKyAgIGlmIChuPD0wKQorICAg ICByZXR1cm4gMDsKKyAKKyAgIC8qIGlubmVyLWxvb3AgaW5kZXggaiB1c2Vk IGFmdGVyIHRoZSBpbm5lci1sb29wICovCisgICBmb3IgKGkgPSAwOyBpIDwg TjsgaSsrKSB7CisgICAgIHN1bSA9IDA7CisgICAgIGZvciAoaiA9IDA7IGog PCBuOyBqKz0yKSB7CisgICAgICAgc3VtICs9IGo7CisgICAgIH0KKyAgICAg YVtpXSA9IHN1bSArIGo7CisgICB9CisgfQorIAorIGludCBtYWluICh2b2lk KQorIHsKKyAgIGludCBpLGo7CisgICBpbnQgc3VtOworIAorICAgY2hlY2tf dmVjdCAoKTsKKyAKKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgYVtp XSA9IGk7CisgIAorICAgZm9vIChOKTsKKyAKKyAgICAgLyogY2hlY2sgcmVz dWx0czogICovCisgICBmb3IgKGk9MDsgaTxOOyBpKyspCisgICAgIHsKKyAg ICAgICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKz0y KQorICAgICAgICAgc3VtICs9IGo7CisgICAgICAgaWYgKGFbaV0gIT0gc3Vt ICsgaikKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAgIHJldHVy biAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt dGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIH0gfSAq LworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIg fSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNj cC1vdXRlci0zLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoqKiogdGVzdHN1 aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItMy5jCShyZXZpc2lv biAwKQotLS0gdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0 ZXItMy5jCShyZXZpc2lvbiAwKQoqKioqKioqKioqKioqKioKKioqIDAgKioq KgotLS0gMSw1MSAtLS0tCisgLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10 YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNsdWRlIDxzdGRhcmcuaD4K KyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisgI2RlZmluZSBOIDQwCisg CisgaW50IGFbTl07CisgCisgaW50CisgZm9vICgpeworICAgaW50IGksajsK KyAgIGludCBzdW07CisgCisgICAvKiBpbm5lci1sb29wIHN0ZXAgPiAxICov CisgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgIHN1bSA9IDA7 CisgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKz0yKSB7CisgICAgICAgc3Vt ICs9IGo7CisgICAgIH0KKyAgICAgYVtpXSA9IHN1bTsKKyAgIH0KKyB9Cisg CisgaW50IG1haW4gKHZvaWQpCisgeworICAgaW50IGksajsKKyAgIGludCBz dW07CisgCisgICBjaGVja192ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8 TjsgaSsrKQorICAgICBhW2ldID0gaTsKKyAgCisgICBmb28gKCk7CisgCisg ICAgIC8qIGNoZWNrIHJlc3VsdHM6ICAqLworICAgZm9yIChpPTA7IGk8Tjsg aSsrKQorICAgICB7CisgICAgICAgc3VtID0gMDsKKyAgICAgICBmb3IgKGog PSAwOyBqIDwgTjsgais9MikKKyAgICAgICAgIHN1bSArPSBqOworICAgICAg IGlmIChhW2ldICE9IHN1bSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0K KyAKKyAgIHJldHVybiAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEg InZlY3QiIH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUt ZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3Zl Y3Qvbm8tc2NldmNjcC1vdXRlci0xNC5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVy LTE0LmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qv bm8tc2NldmNjcC1vdXRlci0xNC5jCShyZXZpc2lvbiAwKQoqKioqKioqKioq KioqKioKKioqIDAgKioqKgotLS0gMSw2MSAtLS0tCisgLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNs dWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisg I2RlZmluZSBOIDY0CisgCisgdW5zaWduZWQgc2hvcnQKKyBmb28gKHNob3J0 IHNjYWxlKXsKKyAgIGludCBpOworICAgdW5zaWduZWQgc2hvcnQgajsKKyAg IHVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisgICB1bnNpZ25lZCBzaG9ydCBz dW1fajsKKyAKKyAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAg c3VtX2ogPSAwOworICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7Cisg ICAgICAgc3VtX2ogKz0gajsKKyAgICAgfQorICAgICBzdW0gKz0gc3VtX2o7 CisgICB9CisgICByZXR1cm4gc3VtOworIH0KKyAKKyB1bnNpZ25lZCBzaG9y dAorIGJhciAodm9pZCkKKyB7CisgICB1bnNpZ25lZCBzaG9ydCBqOworICAg dW5zaWduZWQgc2hvcnQgc3VtX2o7CisgICAgIHN1bV9qID0gMDsKKyAgICAg Zm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAgIHN1bV9qICs9IGo7 CisgICAgIH0KKyAgIHJldHVybiBzdW1fajsKKyB9CisgCisgaW50IG1haW4g KHZvaWQpCisgeworICAgaW50IGk7CisgICB1bnNpZ25lZCBzaG9ydCBqLCBz dW1fajsKKyAgIHVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisgICB1bnNpZ25l ZCBzaG9ydCByZXM7CisgCisgICBjaGVja192ZWN0ICgpOworIAorICAgcmVz ID0gZm9vICgyKTsKKyAKKyAgIC8qIGNoZWNrIHJlc3VsdHM6ICAqLworICAg Zm9yIChpPTA7IGk8TjsgaSsrKQorICAgICB7CisgICAgICAgc3VtX2ogPSBi YXIoKTsKKyAgICAgICBzdW0gKz0gc3VtX2o7CisgICAgIH0KKyAgIGlmIChy ZXMgIT0gc3VtKQorICAgICBhYm9ydCAoKTsKKyAKKyAgIHJldHVybiAwOwor IH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg Ik9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIHsgdGFyZ2V0IHZl Y3Rfd2lkZW5fbXVsdF9oaV90b19zaSB9IH0gfSAqLworIC8qIHsgZGctZmlu YWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0 ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1ub3JlYXNzb2Mtb3V0 ZXItMi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9n Y2MuZGcvdmVjdC9uby1zY2V2Y2NwLW5vcmVhc3NvYy1vdXRlci0yLmMJKHJl dmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNj cC1ub3JlYXNzb2Mtb3V0ZXItMi5jCShyZXZpc2lvbiAwKQoqKioqKioqKioq KioqKioKKioqIDAgKioqKgotLS0gMSw0OSAtLS0tCisgLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNs dWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisg I2RlZmluZSBOIDQwCisgaW50IGFbMjAwKk5dOworIAorIHZvaWQKKyBmb28g KCl7CisgICBpbnQgaSxqOworICAgaW50IHN1bSxzPTA7CisgCisgICBmb3Ig KGkgPSAwOyBpIDwgMjAwKk47IGkrKykgeworICAgICBzdW0gPSAwOworICAg ICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgc3VtICs9IChp ICsgaik7CisgICAgICAgaSsrOworICAgICB9CisgICAgIGFbaV0gPSBzdW07 CisgICB9CisgfQorIAorIGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBp LGosaz0wOworICAgaW50IHN1bSxzPTA7CisgCisgICBjaGVja192ZWN0ICgp OworIAorICAgZm9vICgpOworIAorICAgICAvKiBjaGVjayByZXN1bHRzOiAg Ki8KKyAgIGZvciAoaT0wOyBpPDIwMCpOOyBpKyspCisgICAgIHsKKyAgICAg ICBzdW0gPSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspewor ICAgICAgICAgc3VtICs9IChqICsgaSk7CisgCWkrKzsKKyAgICAgICB9Cisg ICAgICAgaWYgKGFbaV0gIT0gc3VtKQorIAlhYm9ydCAoKTsKKyAgICAgfQor IAorICAgcmV0dXJuIDA7CisgfQorIAorIC8qIHsgZGctZmluYWwgeyBzY2Fu LXRyZWUtZHVtcC10aW1lcyAiT1VURVIgTE9PUCBWRUNUT1JJWkVELiIgMSAi dmVjdCIgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLworIC8qIHsgZGctZmluYWwg eyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0 c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tdHJlZS1zY2V2LWNwcm9wLXZlY3QtaXYt MS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC9uby10cmVlLXNjZXYtY3Byb3AtdmVjdC1pdi0xLmMJKHJldmlz aW9uIDEyNzM1NikKLS0tIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby10cmVl LXNjZXYtY3Byb3AtdmVjdC1pdi0xLmMJKHdvcmtpbmcgY29weSkKKioqKioq KioqKioqKioqCioqKiAxLDM0ICoqKioKLSAvKiB7IGRnLXJlcXVpcmUtZWZm ZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCi0gCi0gI2luY2x1ZGUgPHN0 ZGFyZy5oPgotICNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKLSAKLSAjZGVmaW5l IE4gMjYKLSAgCi0gaW50IG1haW4xIChpbnQgWCkKLSB7ICAKLSAgIGludCBz ID0gWDsKLSAgIGludCBpOwotIAotICAgLyogdmVjdG9yaXphdGlvbiBvZiBy ZWR1Y3Rpb24gd2l0aCBpbmR1Y3Rpb24uIAotICAgICAgTmVlZCAtZm5vLXRy ZWUtc2Nldi1jcHJvcCBvciBlbHNlIHRoZSBsb29wIGlzIGVsaW1pbmF0ZWQu ICAqLwotICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKLSAgICAgcyArPSBp OwotIAotICAgcmV0dXJuIHM7Ci0gfQotIAotIGludCBtYWluICh2b2lkKQot IHsgCi0gICBpbnQgczsKLSAgIGNoZWNrX3ZlY3QgKCk7Ci0gICAKLSAgIHMg PSBtYWluMSAoMyk7Ci0gICBpZiAocyAhPSAzMjgpCi0gICAgIGFib3J0ICgp OwotIAotICAgcmV0dXJuIDA7Ci0gfSAKLSAKLSAvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtdGltZXMgInZlY3Rvcml6ZWQgMSBsb29wcyIgMSAi dmVjdCIgfSB9ICovCi0gLyogeyBkZy1maW5hbCB7IGNsZWFudXAtdHJlZS1k dW1wICJ2ZWN0IiB9IH0gKi8KLS0tIDAgLS0tLQpJbmRleDogdGVzdHN1aXRl L2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItNC5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2 Y2NwLW91dGVyLTQuYwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTQuYwkocmV2aXNpb24gMCkKKioq KioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsNTUgLS0tLQorIC8qIHsg ZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0gKi8KKyAK KyAjaW5jbHVkZSA8c3RkYXJnLmg+CisgI2luY2x1ZGUgInRyZWUtdmVjdC5o IgorIAorICNkZWZpbmUgTiA0MAorIAorIGludCBhW05dOworIAorIC8qIGlu ZHVjdGlvbiB2YXJpYWJsZSBrIGFkdmFuY2VzIHRocm91Z2ggaW5uZXIgYW5k IG91dGVyIGxvb3BzLiAgKi8KKyAKKyBpbnQKKyBmb28gKGludCBuKXsKKyAg IGludCBpLGosaz0wOworICAgaW50IHN1bTsKKyAKKyAgIGlmIChuPD0wKQor ICAgICByZXR1cm4gMDsKKyAKKyAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKysp IHsKKyAgICAgc3VtID0gMDsKKyAgICAgZm9yIChqID0gMDsgaiA8IG47IGor PTIpIHsKKyAgICAgICBzdW0gKz0gaysrOworICAgICB9CisgICAgIGFbaV0g PSBzdW0gKyBqOworICAgfQorIH0KKyAKKyBpbnQgbWFpbiAodm9pZCkKKyB7 CisgICBpbnQgaSxqLGs9MDsKKyAgIGludCBzdW07CisgCisgICBjaGVja192 ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAgICBhW2ld ID0gaTsKKyAgCisgICBmb28gKE4pOworIAorICAgICAvKiBjaGVjayByZXN1 bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgeworICAg ICAgIHN1bSA9IDA7CisgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorPTIp CisgICAgICAgICBzdW0gKz0gaysrOworICAgICAgIGlmIChhW2ldICE9IHN1 bSArIGopCisgICAgICAgICBhYm9ydCgpOworICAgICB9CisgCisgICByZXR1 cm4gMDsKKyB9CisgCisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w LXRpbWVzICJPVVRFUiBMT09QIFZFQ1RPUklaRUQuIiAxICJ2ZWN0IiB7IHhm YWlsICotKi0qIH0gfSB9ICovCisgLyogeyBkZy1maW5hbCB7IGNsZWFudXAt dHJlZS1kdW1wICJ2ZWN0IiB9IH0gKi8KSW5kZXg6IHRlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTE1LmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQoqKiogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3At b3V0ZXItMTUuYwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0ZS9nY2MuZGcv dmVjdC9uby1zY2V2Y2NwLW91dGVyLTE1LmMJKHJldmlzaW9uIDApCioqKioq KioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDQ4IC0tLS0KKyAvKiB7IGRn LXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCisgCisg I2luY2x1ZGUgPHN0ZGFyZy5oPgorICNpbmNsdWRlICJ0cmVlLXZlY3QuaCIK KyAKKyAjZGVmaW5lIE4gNDAKKyAKKyBpbnQgYVtOXTsKKyAKKyBpbnQKKyBm b28gKGludCB4KXsKKyAgIGludCBpLGo7CisgICBpbnQgc3VtOworIAorICAg Zm9yIChpID0gMDsgaSA8IE47IGkrKykgeworICAgICBzdW0gPSAwOworICAg ICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgc3VtICs9IGo7 CisgICAgIH0KKyAgICAgYVtpXSA9IHN1bSArIGkgKyB4OworICAgfQorIH0K KyAKKyBpbnQgbWFpbiAodm9pZCkKKyB7CisgICBpbnQgaSxqOworICAgaW50 IHN1bTsKKyAgIGludCBhYVtOXTsKKyAKKyAgIGNoZWNrX3ZlY3QgKCk7Cisg IAorICAgZm9vICgzKTsKKyAKKyAgICAgLyogY2hlY2sgcmVzdWx0czogICov CisgICBmb3IgKGk9MDsgaTxOOyBpKyspCisgICAgIHsKKyAgICAgICBzdW0g PSAwOworICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspCisgICAgICAg ICBzdW0gKz0gajsKKyAgICAgICBpZiAoYVtpXSAhPSBzdW0gKyBpICsgMykK KyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAgIHJldHVybiAwOwor IH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg Ik9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIH0gfSAqLworIC8q IHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICov CkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1ub3Jl YXNzb2Mtb3V0ZXItMy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRl c3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW5vcmVhc3NvYy1vdXRl ci0zLmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qv bm8tc2NldmNjcC1ub3JlYXNzb2Mtb3V0ZXItMy5jCShyZXZpc2lvbiAwKQoq KioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw0OCAtLS0tCisgLyog eyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLwor IAorICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0 LmgiCisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgCisgaW50 CisgZm9vICgpeworICAgaW50IGksajsKKyAgIGludCBzdW0seDsKKyAKKyAg IGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgc3VtID0gMDsKKyAg ICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAgIHN1bSArPSAo aSArIGopOworICAgICB9CisgICAgIGFbaV0gPSBzdW07CisgICB9CisgfQor IAorIGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpLGo7CisgICBpbnQg c3VtOworIAorICAgY2hlY2tfdmVjdCAoKTsKKyAKKyAgIGZvbyAoKTsKKyAK KyAgICAgLyogY2hlY2sgcmVzdWx0czogICovCisgICBmb3IgKGk9MDsgaTxO OyBpKyspCisgICAgIHsKKyAgICAgICBzdW0gPSAwOworICAgICAgIGZvciAo aiA9IDA7IGogPCBOOyBqKyspeworICAgICAgICAgc3VtICs9IChqICsgaSk7 CisgICAgICAgfQorICAgICAgIGlmIChhW2ldICE9IHN1bSkKKyAgICAgICAg IGFib3J0KCk7CisgICAgIH0KKyAKKyAgIHJldHVybiAwOworIH0KKyAKKyAv KiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExP T1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIH0gfSAqLworIC8qIHsgZGctZmlu YWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0 ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tdHJlZS1zY2V2LWNwcm9wLXZlY3Qt aXYtMi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9n Y2MuZGcvdmVjdC9uby10cmVlLXNjZXYtY3Byb3AtdmVjdC1pdi0yLmMJKHJl dmlzaW9uIDEyNzM1NikKLS0tIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby10 cmVlLXNjZXYtY3Byb3AtdmVjdC1pdi0yLmMJKHdvcmtpbmcgY29weSkKKioq KioqKioqKioqKioqCioqKiAxLDQ5ICoqKioKLSAvKiB7IGRnLXJlcXVpcmUt ZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCi0gCi0gI2luY2x1ZGUg PHN0ZGFyZy5oPgotICNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKLSAKLSAjZGVm aW5lIE4gMTYKLSAgCi0gaW50IG1haW4xICgpCi0geyAgCi0gICBpbnQgYXJy MVtOXTsKLSAgIGludCBrID0gMDsKLSAgIGludCBtID0gMywgaSA9IDA7Ci0g ICAKLSAgIC8qIFZlY3Rvcml6YXRpb24gb2YgaW5kdWN0aW9uIHRoYXQgaXMg dXNlZCBhZnRlciB0aGUgbG9vcC4gIAotICAgICAgQ3VycmVudGx5IHZlY3Rv cml6YWJsZSBiZWNhdXNlIHNjZXZfY2NwIGRpc2Nvbm5lY3RzIHRoZQotICAg ICAgdXNlLWFmdGVyLXRoZS1sb29wIGZyb20gdGhlIGl2IGRlZiBpbnNpZGUg dGhlIGxvb3AuICAqLwotIAotICAgIGRvIHsgCi0gICAgICAgICBrID0gayAr IDI7Ci0gICAgICAgICBhcnIxW2ldID0gazsKLSAJbSA9IG0gKyBrOwotIAlp Kys7Ci0gICAgfSB3aGlsZSAoaSA8IE4pOwotIAotICAgLyogY2hlY2sgcmVz dWx0czogICovCi0gICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQotICAgICB7 IAotICAgICAgIGlmIChhcnIxW2ldICE9IDIrMippKQotICAgICAgICAgYWJv cnQgKCk7Ci0gICAgIH0KLSAKLSAgIHJldHVybiBtICsgazsKLSB9Ci0gCi0g aW50IG1haW4gKHZvaWQpCi0geyAKLSAgIGludCByZXM7Ci0gCi0gICBjaGVj a192ZWN0ICgpOwotICAgCi0gICByZXMgPSBtYWluMSAoKTsKLSAgIGlmIChy ZXMgIT0gMzIgKyAyNzUpCi0gICAgIGFib3J0ICgpOwotIAotICAgcmV0dXJu IDA7Ci0gfSAKLSAKLSAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt dGltZXMgInZlY3Rvcml6ZWQgMSBsb29wcyIgMSAidmVjdCIgeyB4ZmFpbCAq LSotKiB9IH0gfSAqLwotIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUt ZHVtcCAidmVjdCIgfSB9ICovCi0tLSAwIC0tLS0KSW5kZXg6IHRlc3RzdWl0 ZS9nY2MuZGcvdmVjdC92ZWN0LmV4cAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CioqKiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC5leHAJKHJldmlzaW9u IDEyNzM3MSkKLS0tIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LmV4cAko d29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogZGctcnVudGVzdCBbbHNv cnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyYwoqKiogMTc2LDE4MyAqKioqCiAg IyAtZm5vLXRyZWUtc2Nldi1jcHJvcAogIHNldCBERUZBVUxUX1ZFQ1RDRkxB R1MgJFNBVkVEX0RFRkFVTFRfVkVDVENGTEFHUwogIGxhcHBlbmQgREVGQVVM VF9WRUNUQ0ZMQUdTICItZm5vLXRyZWUtc2Nldi1jcHJvcCIKISBkZy1ydW50 ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIv bm8tdHJlZS1zY2V2LWNwcm9wLSouXFtjU1xdXV0gIFwKISAJIiIgJERFRkFV TFRfVkVDVENGTEFHUwogIAogICMgLWZuby10cmVlLWRvbWluYXRvci1vcHRz CiAgc2V0IERFRkFVTFRfVkVDVENGTEFHUyAkU0FWRURfREVGQVVMVF9WRUNU Q0ZMQUdTCi0tLSAxNzYsMTk1IC0tLS0KICAjIC1mbm8tdHJlZS1zY2V2LWNw cm9wCiAgc2V0IERFRkFVTFRfVkVDVENGTEFHUyAkU0FWRURfREVGQVVMVF9W RUNUQ0ZMQUdTCiAgbGFwcGVuZCBERUZBVUxUX1ZFQ1RDRkxBR1MgIi1mbm8t dHJlZS1zY2V2LWNwcm9wIgohIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1u b2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci9uby1zY2V2Y2NwLXZlY3QtKi5c W2NTXF1dXSAgXAohICAgICAgICAgIiIgJERFRkFVTFRfVkVDVENGTEFHUwoh IAohICMgLWZuby10cmVlLXNjZXYtY3Byb3AKISBzZXQgREVGQVVMVF9WRUNU Q0ZMQUdTICRTQVZFRF9ERUZBVUxUX1ZFQ1RDRkxBR1MKISBsYXBwZW5kIERF RkFVTFRfVkVDVENGTEFHUyAiLWZuby10cmVlLXNjZXYtY3Byb3AiCiEgZGct cnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3Vi ZGlyL25vLXNjZXZjY3Atb3V0ZXItKi5cW2NTXF1dXSAgXAohICAgICAgICAg IiIgJERFRkFVTFRfVkVDVENGTEFHUwohIAohICMgLWZuby10cmVlLXNjZXYt Y3Byb3AgLWZuby10cmVlLXJlYXNzb2MKISBzZXQgREVGQVVMVF9WRUNUQ0ZM QUdTICRTQVZFRF9ERUZBVUxUX1ZFQ1RDRkxBR1MKISBsYXBwZW5kIERFRkFV TFRfVkVDVENGTEFHUyAiLWZuby10cmVlLXNjZXYtY3Byb3AiICItZm5vLXRy ZWUtcmVhc3NvYyIKISBkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21w bGFpbiAkc3JjZGlyLyRzdWJkaXIvbm8tc2NldmNjcC1ub3JlYXNzb2MtKi5c W2NTXF1dXSAgXAohICAgICAgICAgIiIgJERFRkFVTFRfVkVDVENGTEFHUwog IAogICMgLWZuby10cmVlLWRvbWluYXRvci1vcHRzCiAgc2V0IERFRkFVTFRf VkVDVENGTEFHUyAkU0FWRURfREVGQVVMVF9WRUNUQ0ZMQUdTCkluZGV4OiB0 ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci01LmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQoqKiogdGVzdHN1aXRlL2djYy5kZy92ZWN0 L25vLXNjZXZjY3Atb3V0ZXItNS5jCShyZXZpc2lvbiAwKQotLS0gdGVzdHN1 aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItNS5jCShyZXZpc2lv biAwKQoqKioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw1MyAtLS0t CisgLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQg fSAqLworIAorICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJl ZS12ZWN0LmgiCisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07Cisg CisgaW50CisgZm9vICgpeworICAgaW50IGksajsKKyAgIGludCBzdW07Cisg CisgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgIHN1bSA9IDA7 CisgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICBzdW0g Kz0gajsKKyAgICAgfQorICAgICBhW2ldICs9IHN1bSArIGk7CisgICB9Cisg fQorIAorIGludCBtYWluICh2b2lkKQorIHsKKyAgIGludCBpLGo7CisgICBp bnQgc3VtOworICAgaW50IGFhW05dOworIAorICAgY2hlY2tfdmVjdCAoKTsK KyAKKyAgIGZvciAoaT0wOyBpPE47IGkrKyl7CisgICAgIGFbaV0gPSBpOwor ICAgICBhYVtpXSA9IGk7CisgICB9CisgIAorICAgZm9vICgpOworIAorICAg ICAvKiBjaGVjayByZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkr KykKKyAgICAgeworICAgICAgIHN1bSA9IDA7CisgICAgICAgZm9yIChqID0g MDsgaiA8IE47IGorKykKKyAgICAgICAgIHN1bSArPSBqOworICAgICAgIGlm IChhW2ldICE9IGFhW2ldICsgc3VtICsgaSkKKyAgICAgICAgIGFib3J0KCk7 CisgICAgIH0KKyAKKyAgIHJldHVybiAwOworIH0KKyAKKyAvKiB7IGRnLWZp bmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9S SVpFRC4iIDEgInZlY3QiIH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVh bnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUv Z2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci05YS5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2 Y2NwLW91dGVyLTlhLmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2Nj LmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci05YS5jCShyZXZpc2lvbiAwKQoq KioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw1NCAtLS0tCisgLyog eyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLwor IAorICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0 LmgiCisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgCisgaW50 CisgZm9vIChpbnQgbil7CisgICBpbnQgaSxqOworICAgaW50IHN1bTsKKyAK KyAgIGlmIChuPD0wKQorICAgICByZXR1cm4gMDsKKyAKKyAgIGZvciAoaSA9 IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgc3VtID0gMDsKKyAgICAgaiA9IDA7 CisgICAgIGRvIHsKKyAgICAgICBzdW0gKz0gajsKKyAgICAgfXdoaWxlICgr K2ogPCBuKTsKKyAgICAgYVtpXSA9IHN1bTsKKyAgIH0KKyB9CisgCisgaW50 IG1haW4gKHZvaWQpCisgeworICAgaW50IGksajsKKyAgIGludCBzdW07Cisg CisgICBjaGVja192ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsr KQorICAgICBhW2ldID0gaTsKKyAgCisgICBmb28gKE4pOworIAorICAgICAv KiBjaGVjayByZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykK KyAgICAgeworICAgICAgIHN1bSA9IDA7CisgICAgICAgZm9yIChqID0gMDsg aiA8IE47IGorKykKKyAgICAgICAgIHN1bSArPSBqOworICAgICAgIGlmIChh W2ldICE9IHN1bSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAKKyAg IHJldHVybiAwOworIH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVl LWR1bXAtdGltZXMgIk9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3Qi IH0gfSAqLworIC8qIHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAi dmVjdCIgfSB9ICovCkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8t c2NldmNjcC1vdXRlci0xNi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioq IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTE2LmMJ KHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2Nl dmNjcC1vdXRlci0xNi5jCShyZXZpc2lvbiAwKQoqKioqKioqKioqKioqKioK KioqIDAgKioqKgotLS0gMSw2MiAtLS0tCisgLyogeyBkZy1yZXF1aXJlLWVm ZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNsdWRlIDxz dGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisgI2RlZmlu ZSBOIDQwCisgCisgaW50IGFbTl07CisgCisgaW50CisgZm9vICgpeworICAg aW50IGk7CisgICB1bnNpZ25lZCBzaG9ydCBqOworICAgaW50IHN1bSA9IDA7 CisgICB1bnNpZ25lZCBzaG9ydCBzdW1fajsKKyAKKyAgIGZvciAoaSA9IDA7 IGkgPCBOOyBpKyspIHsKKyAgICAgc3VtICs9IGk7CisgCisgICAgIHN1bV9q ID0gMDsKKyAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgeworICAgICAg IHN1bV9qICs9IGo7CisgICAgIH0KKyAgICAgYVtpXSA9IHN1bV9qICsgNTsK KyAgIH0KKyAgIHJldHVybiBzdW07CisgfQorIAorIGludCBtYWluICh2b2lk KQorIHsKKyAgIGludCBpOworICAgdW5zaWduZWQgc2hvcnQgaiwgc3VtX2o7 CisgICBpbnQgc3VtID0gMDsKKyAgIGludCByZXM7CisgCisgICBjaGVja192 ZWN0ICgpOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQorICAgICBhW2ld ID0gaTsKKyAgCisgICByZXMgPSBmb28gKCk7CisgCisgICAvKiBjaGVjayBy ZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgewor ICAgICAgIHN1bSArPSBpOworIAorICAgICAgIHN1bV9qID0gMDsKKyAgICAg ICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKXsKKyAgICAgICAgIHN1bV9qICs9 IGo7CisgICAgICAgfQorICAgICAgIGlmIChhW2ldICE9IHN1bV9qICsgNSkK KyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAgIGlmIChyZXMgIT0gc3Vt KQorICAgICBhYm9ydCAoKTsKKyAKKyAgIHJldHVybiAwOworIH0KKyAKKyAv KiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIk9VVEVSIExP T1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIH0gfSAqLworIC8qIHsgZGctZmlu YWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCkluZGV4OiB0 ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1ub3JlYXNzb2Mtb3V0 ZXItNC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRlc3RzdWl0ZS9n Y2MuZGcvdmVjdC9uby1zY2V2Y2NwLW5vcmVhc3NvYy1vdXRlci00LmMJKHJl dmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNj cC1ub3JlYXNzb2Mtb3V0ZXItNC5jCShyZXZpc2lvbiAwKQoqKioqKioqKioq KioqKioKKioqIDAgKioqKgotLS0gMSw1NiAtLS0tCisgLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworIAorICNpbmNs dWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisgCisg I2RlZmluZSBOIDQwCisgCisgaW50CisgZm9vICgpeworICAgaW50IGksajsK KyAgIGludCBzdW0scz0wOworIAorICAgZm9yIChpID0gMDsgaSA8IDIwMCpO OyBpKyspIHsKKyAgICAgc3VtID0gMDsKKyAgICAgZm9yIChqID0gMDsgaiA8 IE47IGorKykgeworICAgICAgIHN1bSArPSAoaSArIGopOworICAgICAgIGkr KzsKKyAgICAgfQorICAgICBzICs9IHN1bTsKKyAgIH0KKyAgIHJldHVybiBz OworIH0KKyAKKyBpbnQgYmFyIChpbnQgaSwgaW50IGopCisgeworIHJldHVy biAoaSArIGopOworIH0KKyAKKyBpbnQgbWFpbiAodm9pZCkKKyB7CisgICBp bnQgaSxqLGs9MDsKKyAgIGludCBzdW0scz0wOworICAgaW50IHJlczsgCisg CisgICBjaGVja192ZWN0ICgpOworIAorICAgcmVzID0gZm9vICgpOworIAor ICAgICAvKiBjaGVjayByZXN1bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPDIw MCpOOyBpKyspCisgICAgIHsKKyAgICAgICBzdW0gPSAwOworICAgICAgIGZv ciAoaiA9IDA7IGogPCBOOyBqKyspeworICAgICAgICAgc3VtICs9IGJhciAo aSwgaik7CisgCWkrKzsKKyAgICAgICB9CisgICAgICAgcyArPSBzdW07Cisg ICAgIH0KKyAgIGlmIChyZXMgIT0gcykKKyAgICAgYWJvcnQgKCk7CisgCisg ICByZXR1cm4gMDsKKyB9CisgCisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJl ZS1kdW1wLXRpbWVzICJPVVRFUiBMT09QIFZFQ1RPUklaRUQuIiAxICJ2ZWN0 IiB9IH0gKi8KKyAvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10cmVlLWR1bXAg InZlY3QiIH0gfSAqLwpJbmRleDogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25v LXRyZWUtc2Nldi1jcHJvcC12ZWN0LWl2LTMuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CioqKiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tdHJlZS1zY2V2 LWNwcm9wLXZlY3QtaXYtMy5jCShyZXZpc2lvbiAxMjczNTYpCi0tLSB0ZXN0 c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tdHJlZS1zY2V2LWNwcm9wLXZlY3QtaXYt My5jCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKgoqKiogMSwyNyAq KioqCi0gLyogeyBkZy1kbyBjb21waWxlIH0gKi8KLSAvKiB7IGRnLXJlcXVp cmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCi0gCi0gI2luY2x1 ZGUgPHN0ZGFyZy5oPgotICNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKLSAKLSAj ZGVmaW5lIE4gMjYKLSAgCi0gdW5zaWduZWQgaW50IG1haW4xICgpCi0geyAg Ci0gICB1bnNpZ25lZCBzaG9ydCBpOwotICAgdW5zaWduZWQgaW50IGludHN1 bSA9IDA7Ci0gCi0gICAvKiB2ZWN0b3JpemF0aW9uIG9mIHJlZHVjdGlvbiB3 aXRoIGluZHVjdGlvbiwgYW5kIHdpZGVubmluZyBzdW06IAotICAgICAgc3Vt IHNob3J0cyBpbnRvIGludC4gCi0gICAgICBOZWVkIC1mbm8tdHJlZS1zY2V2 LWNwcm9wIG9yIGVsc2UgdGhlIGxvb3AgaXMgZWxpbWluYXRlZC4gICovCi0g ICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQotICAgICB7Ci0gICAgICAgaW50 c3VtICs9IGk7Ci0gICAgIH0gCi0gCi0gICByZXR1cm4gaW50c3VtOwotIH0K LSAKLSAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgInZl Y3Rvcml6ZWQgMSBsb29wcyIgMSAidmVjdCIgeyB0YXJnZXQgdmVjdF93aWRl bl9zdW1faGlfdG9fc2kgfSB9IH0gKi8KLSAvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtdGltZXMgInZlY3RfcmVjb2dfd2lkZW5fc3VtX3BhdHRl cm46IGRldGVjdGVkIiAxICJ2ZWN0IiB7IHRhcmdldCB2ZWN0X3dpZGVuX3N1 bV9oaV90b19zaSB9IH0gfSAqLwotIC8qIHsgZGctZmluYWwgeyBjbGVhbnVw LXRyZWUtZHVtcCAidmVjdCIgfSB9ICovCi0tLSAwIC0tLS0KSW5kZXg6IHRl c3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW91dGVyLTYuYwo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09CioqKiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qv bm8tc2NldmNjcC1vdXRlci02LmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3Vp dGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1vdXRlci02LmMJKHJldmlzaW9u IDApCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDU2IC0tLS0K KyAvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9 ICovCisgCisgI2luY2x1ZGUgPHN0ZGFyZy5oPgorICNpbmNsdWRlICJ0cmVl LXZlY3QuaCIKKyAKKyAjZGVmaW5lIE4gNDAKKyAKKyBpbnQKKyBmb28gKGlu dCAqIF9fcmVzdHJpY3RfXyBiLCBpbnQgayl7CisgICBpbnQgaSxqOworICAg aW50IHN1bSx4OworICAgaW50IGFbTl07CisgCisgICBmb3IgKGkgPSAwOyBp IDwgTjsgaSsrKSB7CisgICAgIHN1bSA9IGJbaV07CisgICAgIGZvciAoaiA9 IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICBzdW0gKz0gajsKKyAgICAgfQor ICAgICBhW2ldID0gc3VtOworICAgfQorICAgCisgICByZXR1cm4gYVtrXTsK KyB9CisgCisgaW50IG1haW4gKHZvaWQpCisgeworICAgaW50IGksajsKKyAg IGludCBzdW07CisgICBpbnQgYltOXTsKKyAgIGludCBhW05dOworIAorICAg Y2hlY2tfdmVjdCAoKTsKKyAKKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAg ICAgYltpXSA9IGkgKyAyOworIAorICAgZm9yIChpPTA7IGk8TjsgaSsrKQor ICAgICBhW2ldID0gZm9vIChiLGkpOworIAorICAgICAvKiBjaGVjayByZXN1 bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgeworICAg ICAgIHN1bSA9IGJbaV07CisgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGor Kyl7CisgICAgICAgICBzdW0gKz0gajsKKyAgICAgICB9CisgICAgICAgaWYg KGFbaV0gIT0gc3VtKQorICAgICAgICAgYWJvcnQoKTsKKyAgICAgfQorIAor ICAgcmV0dXJuIDA7CisgfQorIAorIC8qIHsgZGctZmluYWwgeyBzY2FuLXRy ZWUtZHVtcC10aW1lcyAiT1VURVIgTE9PUCBWRUNUT1JJWkVELiIgMSAidmVj dCIgfSB9ICovCisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRp bWVzICJ2ZWN0X3JlY29nX3dpZGVuX211bHRfcGF0dGVybjogZGV0ZWN0ZWQi IDEgInZlY3QiIHsgeGZhaWwgKi0qLSogfSB9IH0gKi8KKyAvKiB7IGRnLWZp bmFsIHsgY2xlYW51cC10cmVlLWR1bXAgInZlY3QiIH0gfSAqLwpJbmRleDog dGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItOWIuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CioqKiB0ZXN0c3VpdGUvZ2NjLmRnL3Zl Y3Qvbm8tc2NldmNjcC1vdXRlci05Yi5jCShyZXZpc2lvbiAwKQotLS0gdGVz dHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItOWIuYwkocmV2 aXNpb24gMCkKKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsNTMg LS0tLQorIC8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3Rf aW50IH0gKi8KKyAKKyAjaW5jbHVkZSA8c3RkYXJnLmg+CisgI2luY2x1ZGUg InRyZWUtdmVjdC5oIgorIAorICNkZWZpbmUgTiA0MAorIAorIGludCBhW05d OworIAorIGludAorIGZvbyAoaW50IG4peworICAgaW50IGksajsKKyAgIGlu dCBzdW07CisgCisgICBpZiAobjw9MCkKKyAgICAgcmV0dXJuIDA7CisgCisg ICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgIHN1bSA9IDA7Cisg ICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICBzdW0gKz0g ajsKKyAgICAgfQorICAgICBhW2ldID0gc3VtOworICAgfQorIH0KKyAKKyBp bnQgbWFpbiAodm9pZCkKKyB7CisgICBpbnQgaSxqOworICAgaW50IHN1bTsK KyAKKyAgIGNoZWNrX3ZlY3QgKCk7CisgCisgICBmb3IgKGk9MDsgaTxOOyBp KyspCisgICAgIGFbaV0gPSBpOworICAKKyAgIGZvbyAoTik7CisgCisgICAg IC8qIGNoZWNrIHJlc3VsdHM6ICAqLworICAgZm9yIChpPTA7IGk8TjsgaSsr KQorICAgICB7CisgICAgICAgc3VtID0gMDsKKyAgICAgICBmb3IgKGogPSAw OyBqIDwgTjsgaisrKQorICAgICAgICAgc3VtICs9IGo7CisgICAgICAgaWYg KGFbaV0gIT0gc3VtKQorICAgICAgICAgYWJvcnQoKTsKKyAgICAgfQorIAor ICAgcmV0dXJuIDA7CisgfQorIAorIC8qIHsgZGctZmluYWwgeyBzY2FuLXRy ZWUtZHVtcC10aW1lcyAiT1VURVIgTE9PUCBWRUNUT1JJWkVELiIgMSAidmVj dCIgfSB9ICovCisgLyogeyBkZy1maW5hbCB7IGNsZWFudXAtdHJlZS1kdW1w ICJ2ZWN0IiB9IH0gKi8KSW5kZXg6IHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9u by1zY2V2Y2NwLW91dGVyLTE3LmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoq KiogdGVzdHN1aXRlL2djYy5kZy92ZWN0L25vLXNjZXZjY3Atb3V0ZXItMTcu YwkocmV2aXNpb24gMCkKLS0tIHRlc3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1z Y2V2Y2NwLW91dGVyLTE3LmMJKHJldmlzaW9uIDApCioqKioqKioqKioqKioq KgoqKiogMCAqKioqCi0tLSAxLDY4IC0tLS0KKyAvKiB7IGRnLXJlcXVpcmUt ZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCisgCisgI2luY2x1ZGUg PHN0ZGFyZy5oPgorICNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKKyAKKyAjZGVm aW5lIE4gNDAKKyAKKyBpbnQgYVtOXTsKKyBpbnQgYltOXTsKKyBpbnQgY1tO XTsKKyAKKyBpbnQKKyBmb28gKCl7CisgICBpbnQgaTsKKyAgIHVuc2lnbmVk IHNob3J0IGo7CisgICBpbnQgc3VtID0gMDsKKyAgIHVuc2lnbmVkIHNob3J0 IHN1bV9qOworIAorICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeworICAg ICBpbnQgZGlmZiA9IGJbaV0gLSBjW2ldOworIAorICAgICBzdW1faiA9IDA7 CisgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICBzdW1f aiArPSBqOworICAgICB9CisgICAgIGFbaV0gPSBzdW1faiArIDU7CisgCisg ICAgIHN1bSArPSBkaWZmOworICAgfQorICAgcmV0dXJuIHN1bTsKKyB9Cisg CisgaW50IG1haW4gKHZvaWQpCisgeworICAgaW50IGk7CisgICB1bnNpZ25l ZCBzaG9ydCBqLCBzdW1fajsKKyAgIGludCBzdW0gPSAwOworICAgaW50IHJl czsKKyAKKyAgIGNoZWNrX3ZlY3QgKCk7CisgCisgICBmb3IgKGk9MDsgaTxO OyBpKyspeworICAgICBiW2ldID0gaTsKKyAgICAgY1tpXSA9IDIqaTsKKyAg IH0KKyAgCisgICByZXMgPSBmb28gKCk7CisgCisgICAvKiBjaGVjayByZXN1 bHRzOiAgKi8KKyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgeworICAg ICAgIHN1bSArPSAoYltpXSAtIGNbaV0pOworIAorICAgICAgIHN1bV9qID0g MDsKKyAgICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKXsKKyAgICAgICAg IHN1bV9qICs9IGo7CisgICAgICAgfQorICAgICAgIGlmIChhW2ldICE9IHN1 bV9qICsgNSkKKyAgICAgICAgIGFib3J0KCk7CisgICAgIH0KKyAgIGlmIChy ZXMgIT0gc3VtKQorICAgICBhYm9ydCAoKTsKKyAKKyAgIHJldHVybiAwOwor IH0KKyAKKyAvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMg Ik9VVEVSIExPT1AgVkVDVE9SSVpFRC4iIDEgInZlY3QiIH0gfSAqLworIC8q IHsgZGctZmluYWwgeyBjbGVhbnVwLXRyZWUtZHVtcCAidmVjdCIgfSB9ICov CkluZGV4OiB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qvbm8tc2NldmNjcC1ub3Jl YXNzb2Mtb3V0ZXItNS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRl c3RzdWl0ZS9nY2MuZGcvdmVjdC9uby1zY2V2Y2NwLW5vcmVhc3NvYy1vdXRl ci01LmMJKHJldmlzaW9uIDApCi0tLSB0ZXN0c3VpdGUvZ2NjLmRnL3ZlY3Qv bm8tc2NldmNjcC1ub3JlYXNzb2Mtb3V0ZXItNS5jCShyZXZpc2lvbiAwKQoq KioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSw1NCAtLS0tCisgLyog eyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLwor IAorICNpbmNsdWRlIDxzdGRhcmcuaD4KKyAjaW5jbHVkZSAidHJlZS12ZWN0 LmgiCisgCisgI2RlZmluZSBOIDQwCisgCisgaW50IGFbTl07CisgCisgaW50 CisgZm9vICgpeworICAgaW50IGksajsKKyAgIGludCBzdW0seDsKKyAKKyAg IGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgc3VtID0gMDsKKyAg ICAgeCA9IGFbaV07CisgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspIHsK KyAgICAgICBzdW0gKz0gKHggKyBqKTsKKyAgICAgfQorICAgICBhW2ldID0g c3VtICsgaSArIHg7CisgICB9CisgfQorIAorIGludCBtYWluICh2b2lkKQor IHsKKyAgIGludCBpLGo7CisgICBpbnQgc3VtOworICAgaW50IGFhW05dOwor IAorICAgY2hlY2tfdmVjdCAoKTsKKyAKKyAgIGZvciAoaT0wOyBpPE47IGkr Kyl7CisgICAgIGFbaV0gPSBpOworICAgICBhYVtpXSA9IGk7CisgICB9Cisg IAorICAgZm9vICgpOworIAorICAgICAvKiBjaGVjayByZXN1bHRzOiAgKi8K KyAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgeworICAgICAgIHN1bSA9 IDA7CisgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykKKyAgICAgICAg IHN1bSArPSAoaiArIGFhW2ldKTsKKyAgICAgICBpZiAoYVtpXSAhPSBzdW0g KyBpICsgYWFbaV0pCisgICAgICAgICBhYm9ydCgpOworICAgICB9CisgCisg ICByZXR1cm4gMDsKKyB9CisgCisgLyogeyBkZy1maW5hbCB7IHNjYW4tdHJl ZS1kdW1wLXRpbWVzICJPVVRFUiBMT09QIFZFQ1RPUklaRUQuIiAxICJ2ZWN0 IiB9IH0gKi8KKyAvKiB7IGRnLWZpbmFsIHsgY2xlYW51cC10cmVlLWR1bXAg InZlY3QiIH0gfSAqLwpJbmRleDogdHJlZS12ZWN0b3JpemVyLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQoqKiogdHJlZS12ZWN0b3JpemVyLmMJKHJldmlz aW9uIDEyNzM1NikKLS0tIHRyZWUtdmVjdG9yaXplci5jCSh3b3JraW5nIGNv cHkpCioqKioqKioqKioqKioqKiBuZXdfc3RtdF92ZWNfaW5mbyAodHJlZSBz dG10LCBsb29wX3ZlY19pCioqKiAxMzQ1LDEzNTEgKioqKgogICAgU1RNVF9W SU5GT19JTl9QQVRURVJOX1AgKHJlcykgPSBmYWxzZTsKICAgIFNUTVRfVklO Rk9fUkVMQVRFRF9TVE1UIChyZXMpID0gTlVMTDsKICAgIFNUTVRfVklORk9f REFUQV9SRUYgKHJlcykgPSBOVUxMOwohICAgaWYgKFRSRUVfQ09ERSAoc3Rt dCkgPT0gUEhJX05PREUpCiAgICAgIFNUTVRfVklORk9fREVGX1RZUEUgKHJl cykgPSB2ZWN0X3Vua25vd25fZGVmX3R5cGU7CiAgICBlbHNlCiAgICAgIFNU TVRfVklORk9fREVGX1RZUEUgKHJlcykgPSB2ZWN0X2xvb3BfZGVmOwotLS0g MTM0NSwxMzUxIC0tLS0KICAgIFNUTVRfVklORk9fSU5fUEFUVEVSTl9QIChy ZXMpID0gZmFsc2U7CiAgICBTVE1UX1ZJTkZPX1JFTEFURURfU1RNVCAocmVz KSA9IE5VTEw7CiAgICBTVE1UX1ZJTkZPX0RBVEFfUkVGIChyZXMpID0gTlVM TDsKISAgIGlmIChUUkVFX0NPREUgKHN0bXQpID09IFBISV9OT0RFICYmIGlz X2xvb3BfaGVhZGVyX2JiX3AgKGJiX2Zvcl9zdG10IChzdG10KSkpCiAgICAg IFNUTVRfVklORk9fREVGX1RZUEUgKHJlcykgPSB2ZWN0X3Vua25vd25fZGVm X3R5cGU7CiAgICBlbHNlCiAgICAgIFNUTVRfVklORk9fREVGX1RZUEUgKHJl cykgPSB2ZWN0X2xvb3BfZGVmOwoqKioqKioqKioqKioqKiogbmV3X3N0bXRf dmVjX2luZm8gKHRyZWUgc3RtdCwgbG9vcF92ZWNfaQoqKiogMTM2NCwxMzY5 ICoqKioKLS0tIDEzNjQsMTM4MyAtLS0tCiAgfQogIAogIAorIC8qIEZ1bmN0 aW9uIGJiX2luX2xvb3BfcAorIAorICAgIFVzZWQgYXMgcHJlZGljYXRlIGZv ciBkZnMgb3JkZXIgdHJhdmVyc2FsIG9mIHRoZSBsb29wIGJicy4gICovCisg Cisgc3RhdGljIGJvb2wKKyBiYl9pbl9sb29wX3AgKGJhc2ljX2Jsb2NrIGJi LCB2b2lkICpkYXRhKQorIHsKKyAgIHN0cnVjdCBsb29wICpsb29wID0gKHN0 cnVjdCBsb29wICopZGF0YTsKKyAgIGlmIChmbG93X2JiX2luc2lkZV9sb29w X3AgKGxvb3AsIGJiKSkKKyAgICAgcmV0dXJuIHRydWU7CisgICByZXR1cm4g ZmFsc2U7CisgfQorIAorIAogIC8qIEZ1bmN0aW9uIG5ld19sb29wX3ZlY19p bmZvLgogIAogICAgIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBsb29w X3ZlY19pbmZvIHN0cnVjdCBmb3IgTE9PUCwgYXMgd2VsbCBhcwoqKioqKioq KioqKioqKiogbmV3X2xvb3BfdmVjX2luZm8gKHN0cnVjdCBsb29wICpsb29w KQoqKiogMTM3NSwxMzkyICoqKioKICAgIGxvb3BfdmVjX2luZm8gcmVzOwog ICAgYmFzaWNfYmxvY2sgKmJiczsKICAgIGJsb2NrX3N0bXRfaXRlcmF0b3Ig c2k7CiEgICB1bnNpZ25lZCBpbnQgaTsKICAKICAgIHJlcyA9IChsb29wX3Zl Y19pbmZvKSB4Y2FsbG9jICgxLCBzaXplb2YgKHN0cnVjdCBfbG9vcF92ZWNf aW5mbykpOwogIAogICAgYmJzID0gZ2V0X2xvb3BfYm9keSAobG9vcCk7CiAg CiEgICAvKiBDcmVhdGUgc3RtdF9pbmZvIGZvciBhbGwgc3RtdHMgaW4gdGhl IGxvb3AuICAqLwogICAgZm9yIChpID0gMDsgaSA8IGxvb3AtPm51bV9ub2Rl czsgaSsrKQogICAgICB7CiAgICAgICAgYmFzaWNfYmxvY2sgYmIgPSBiYnNb aV07CiAgICAgICAgdHJlZSBwaGk7CiAgCiAgICAgICAgZm9yIChwaGkgPSBw aGlfbm9kZXMgKGJiKTsgcGhpOyBwaGkgPSBQSElfQ0hBSU4gKHBoaSkpCiAg ICAgICAgICB7CiAgICAgICAgICAgIHN0bXRfYW5uX3QgYW5uID0gZ2V0X3N0 bXRfYW5uIChwaGkpOwotLS0gMTM4OSwxNDM3IC0tLS0KICAgIGxvb3BfdmVj X2luZm8gcmVzOwogICAgYmFzaWNfYmxvY2sgKmJiczsKICAgIGJsb2NrX3N0 bXRfaXRlcmF0b3Igc2k7CiEgICB1bnNpZ25lZCBpbnQgaSwgbmJiczsKICAK ICAgIHJlcyA9IChsb29wX3ZlY19pbmZvKSB4Y2FsbG9jICgxLCBzaXplb2Yg KHN0cnVjdCBfbG9vcF92ZWNfaW5mbykpOworICAgTE9PUF9WSU5GT19MT09Q IChyZXMpID0gbG9vcDsKICAKICAgIGJicyA9IGdldF9sb29wX2JvZHkgKGxv b3ApOwogIAohICAgLyogQ3JlYXRlL1VwZGF0ZSBzdG10X2luZm8gZm9yIGFs bCBzdG10cyBpbiB0aGUgbG9vcC4gICovCiAgICBmb3IgKGkgPSAwOyBpIDwg bG9vcC0+bnVtX25vZGVzOyBpKyspCiAgICAgIHsKICAgICAgICBiYXNpY19i bG9jayBiYiA9IGJic1tpXTsKICAgICAgICB0cmVlIHBoaTsKICAKKyAgICAg ICAvKiBCQnMgaW4gYSBuZXN0ZWQgaW5uZXItbG9vcCB3aWxsIGhhdmUgYmVl biBhbHJlYWR5IHByb2Nlc3NlZCAoYmVjYXVzZSAKKyAJIHdlIHdpbGwgaGF2 ZSBjYWxsZWQgdmVjdF9hbmFseXplX2xvb3BfZm9ybSBmb3IgYW55IG5lc3Rl ZCBpbm5lci1sb29wKS4KKyAJIFRoZXJlZm9yZSwgZm9yIHN0bXRzIGluIGFu IGlubmVyLWxvb3Agd2UganVzdCB3YW50IHRvIHVwZGF0ZSB0aGUgCisgCSBT VE1UX1ZJTkZPX0xPT1BfVklORk8gZmllbGQgb2YgdGhlaXIgc3RtdF9pbmZv IHRvIHBvaW50IHRvIHRoZSBuZXcgCisgCSBsb29wX2luZm8gb2YgdGhlIG91 dGVyLWxvb3Agd2UgYXJlIGN1cnJlbnRseSBjb25zaWRlcmluZyB0byB2ZWN0 b3JpemUgCisgCSAoaW5zdGVhZCBvZiB0aGUgbG9vcF9pbmZvIG9mIHRoZSBp bm5lci1sb29wKS4KKyAJIEZvciBzdG10cyBpbiBvdGhlciBCQnMgd2UgbmVl ZCB0byBjcmVhdGUgYSBzdG10X2luZm8gZnJvbSBzY3JhdGNoLiAgKi8KKyAg ICAgICBpZiAoYmItPmxvb3BfZmF0aGVyICE9IGxvb3ApCisgCXsKKyAJICAv KiBJbm5lci1sb29wIGJiLiAgKi8KKyAJICBnY2NfYXNzZXJ0IChsb29wLT5p bm5lciAmJiBiYi0+bG9vcF9mYXRoZXIgPT0gbG9vcC0+aW5uZXIpOworIAkg IGZvciAocGhpID0gcGhpX25vZGVzIChiYik7IHBoaTsgcGhpID0gUEhJX0NI QUlOIChwaGkpKQorIAkgICAgeworIAkgICAgICBzdG10X3ZlY19pbmZvIHN0 bXRfaW5mbyA9IHZpbmZvX2Zvcl9zdG10IChwaGkpOworIAkgICAgICBsb29w X3ZlY19pbmZvIGlubmVyX2xvb3BfdmluZm8gPSBTVE1UX1ZJTkZPX0xPT1Bf VklORk8gKHN0bXRfaW5mbyk7CisgCSAgICAgIGdjY19hc3NlcnQgKGxvb3At PmlubmVyID09IExPT1BfVklORk9fTE9PUCAoaW5uZXJfbG9vcF92aW5mbykp OworIAkgICAgICBTVE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfaW5mbykg PSByZXM7CisgCSAgICB9CisgCSAgZm9yIChzaSA9IGJzaV9zdGFydCAoYmIp OyAhYnNpX2VuZF9wIChzaSk7IGJzaV9uZXh0ICgmc2kpKQorIAkgICB7Cisg CSAgICAgIHRyZWUgc3RtdCA9IGJzaV9zdG10IChzaSk7CisgCSAgICAgIHN0 bXRfdmVjX2luZm8gc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0bXQgKHN0bXQp OworIAkgICAgICBsb29wX3ZlY19pbmZvIGlubmVyX2xvb3BfdmluZm8gPSBT VE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfaW5mbyk7CisgCSAgICAgIGdj Y19hc3NlcnQgKGxvb3AtPmlubmVyID09IExPT1BfVklORk9fTE9PUCAoaW5u ZXJfbG9vcF92aW5mbykpOworIAkgICAgICBTVE1UX1ZJTkZPX0xPT1BfVklO Rk8gKHN0bXRfaW5mbykgPSByZXM7CisgCSAgIH0KKyAJfQorICAgICAgIGVs c2UKKyAJeworIAkgIC8qIGJiIGluIGN1cnJlbnQgbmVzdC4gICovCiAgICAg ICAgZm9yIChwaGkgPSBwaGlfbm9kZXMgKGJiKTsgcGhpOyBwaGkgPSBQSElf Q0hBSU4gKHBoaSkpCiAgICAgICAgICB7CiAgICAgICAgICAgIHN0bXRfYW5u X3QgYW5uID0gZ2V0X3N0bXRfYW5uIChwaGkpOwoqKioqKioqKioqKioqKiog bmV3X2xvb3BfdmVjX2luZm8gKHN0cnVjdCBsb29wICpsb29wKQoqKiogMTM5 NiwxNDExICoqKioKICAgICAgICBmb3IgKHNpID0gYnNpX3N0YXJ0IChiYik7 ICFic2lfZW5kX3AgKHNpKTsgYnNpX25leHQgKCZzaSkpCiAgCXsKICAJICB0 cmVlIHN0bXQgPSBic2lfc3RtdCAoc2kpOwohIAkgIHN0bXRfYW5uX3QgYW5u OwohIAohIAkgIGFubiA9IHN0bXRfYW5uIChzdG10KTsKICAJICBzZXRfc3Rt dF9pbmZvIChhbm4sIG5ld19zdG10X3ZlY19pbmZvIChzdG10LCByZXMpKTsK ICAJfQogICAgICB9CiAgCi0gICBMT09QX1ZJTkZPX0xPT1AgKHJlcykgPSBs b29wOwogICAgTE9PUF9WSU5GT19CQlMgKHJlcykgPSBiYnM7Ci0gICBMT09Q X1ZJTkZPX0VYSVRfQ09ORCAocmVzKSA9IE5VTEw7CiAgICBMT09QX1ZJTkZP X05JVEVSUyAocmVzKSA9IE5VTEw7CiAgICBMT09QX1ZJTkZPX0NPU1RfTU9E RUxfTUlOX0lURVJTIChyZXMpID0gMDsKICAgIExPT1BfVklORk9fVkVDVE9S SVpBQkxFX1AgKHJlcykgPSAwOwotLS0gMTQ0MSwxNDY0IC0tLS0KICAgICAg ICBmb3IgKHNpID0gYnNpX3N0YXJ0IChiYik7ICFic2lfZW5kX3AgKHNpKTsg YnNpX25leHQgKCZzaSkpCiAgCXsKICAJICB0cmVlIHN0bXQgPSBic2lfc3Rt dCAoc2kpOwohIAkgICAgICBzdG10X2Fubl90IGFubiA9IHN0bXRfYW5uIChz dG10KTsKICAJICBzZXRfc3RtdF9pbmZvIChhbm4sIG5ld19zdG10X3ZlY19p bmZvIChzdG10LCByZXMpKTsKICAJfQogICAgICB9CisgICAgIH0KKyAKKyAg IC8qIENIRUNLTUU6IFdlIHdhbnQgdG8gdmlzaXQgYWxsIEJCcyBiZWZvcmUg dGhlaXIgc3VjY2Vzc29ycyAoZXhjZXB0IGZvciAKKyAgICAgIGxhdGNoIGJs b2NrcywgZm9yIHdoaWNoIHRoaXMgYXNzZXJ0aW9uIHdvdWxkbid0IGhvbGQp LiAgSW4gdGhlIHNpbXBsZSAKKyAgICAgIGNhc2Ugb2YgdGhlIGxvb3AgZm9y bXMgd2UgYWxsb3csIGEgZGZzIG9yZGVyIG9mIHRoZSBCQnMgd291bGQgdGhl IHNhbWUgCisgICAgICBhcyByZXZlcnNlZCBwb3N0b3JkZXIgdHJhdmVyc2Fs LCBzbyB3ZSBhcmUgc2FmZS4gICovCisgCisgICAgZnJlZSAoYmJzKTsKKyAg ICBiYnMgPSBYQ05FV1ZFQyAoYmFzaWNfYmxvY2ssIGxvb3AtPm51bV9ub2Rl cyk7CisgICAgbmJicyA9IGRmc19lbnVtZXJhdGVfZnJvbSAobG9vcC0+aGVh ZGVyLCAwLCBiYl9pbl9sb29wX3AsIAorIAkJCSAgICAgIGJicywgbG9vcC0+ bnVtX25vZGVzLCBsb29wKTsKKyAgICBnY2NfYXNzZXJ0IChuYmJzID09IGxv b3AtPm51bV9ub2Rlcyk7CiAgCiAgICBMT09QX1ZJTkZPX0JCUyAocmVzKSA9 IGJiczsKICAgIExPT1BfVklORk9fTklURVJTIChyZXMpID0gTlVMTDsKICAg IExPT1BfVklORk9fQ09TVF9NT0RFTF9NSU5fSVRFUlMgKHJlcykgPSAwOwog ICAgTE9PUF9WSU5GT19WRUNUT1JJWkFCTEVfUCAocmVzKSA9IDA7CioqKioq KioqKioqKioqKiBuZXdfbG9vcF92ZWNfaW5mbyAoc3RydWN0IGxvb3AgKmxv b3ApCioqKiAxNDI3LDE0MzMgKioqKgogICAgIHN0bXRzIGluIHRoZSBsb29w LiAgKi8KICAKICB2b2lkCiEgZGVzdHJveV9sb29wX3ZlY19pbmZvIChsb29w X3ZlY19pbmZvIGxvb3BfdmluZm8pCiAgewogICAgc3RydWN0IGxvb3AgKmxv b3A7CiAgICBiYXNpY19ibG9jayAqYmJzOwotLS0gMTQ4MCwxNDg2IC0tLS0K ICAgICBzdG10cyBpbiB0aGUgbG9vcC4gICovCiAgCiAgdm9pZAohIGRlc3Ry b3lfbG9vcF92ZWNfaW5mbyAobG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvLCBi b29sIGNsZWFuX3N0bXRzKQogIHsKICAgIHN0cnVjdCBsb29wICpsb29wOwog ICAgYmFzaWNfYmxvY2sgKmJiczsKKioqKioqKioqKioqKioqIGRlc3Ryb3lf bG9vcF92ZWNfaW5mbyAobG9vcF92ZWNfaW5mbyBsb28KKioqIDE0NDMsMTQ0 OCAqKioqCi0tLSAxNDk2LDE1MTMgLS0tLQogICAgYmJzID0gTE9PUF9WSU5G T19CQlMgKGxvb3BfdmluZm8pOwogICAgbmJicyA9IGxvb3AtPm51bV9ub2Rl czsKICAKKyAgIGlmICghY2xlYW5fc3RtdHMpCisgICAgIHsKKyAgICAgICBm cmVlIChMT09QX1ZJTkZPX0JCUyAobG9vcF92aW5mbykpOworICAgICAgIGZy ZWVfZGF0YV9yZWZzIChMT09QX1ZJTkZPX0RBVEFSRUZTIChsb29wX3ZpbmZv KSk7CisgICAgICAgZnJlZV9kZXBlbmRlbmNlX3JlbGF0aW9ucyAoTE9PUF9W SU5GT19ERFJTIChsb29wX3ZpbmZvKSk7CisgICAgICAgVkVDX2ZyZWUgKHRy ZWUsIGhlYXAsIExPT1BfVklORk9fTUFZX01JU0FMSUdOX1NUTVRTIChsb29w X3ZpbmZvKSk7CisgCisgICAgICAgZnJlZSAobG9vcF92aW5mbyk7CisgICAg ICAgbG9vcC0+YXV4ID0gTlVMTDsKKyAgICAgICByZXR1cm47CisgICAgIH0K KyAKICAgIGZvciAoaiA9IDA7IGogPCBuYmJzOyBqKyspCiAgICAgIHsKICAg ICAgICBiYXNpY19ibG9jayBiYiA9IGJic1tqXTsKKioqKioqKioqKioqKioq IHZlY3RfaXNfc2ltcGxlX3VzZSAodHJlZSBvcGVyYW5kLCBsb29wX3YKKioq IDE3MTQsMTcyMSAqKioqCiAgICAgIHsKICAgICAgY2FzZSBQSElfTk9ERToK ICAgICAgICAqZGVmID0gUEhJX1JFU1VMVCAoKmRlZl9zdG10KTsKLSAgICAg ICBnY2NfYXNzZXJ0ICgqZHQgPT0gdmVjdF9pbmR1Y3Rpb25fZGVmIHx8ICpk dCA9PSB2ZWN0X3JlZHVjdGlvbl9kZWYKLSAJCSAgfHwgKmR0ID09IHZlY3Rf aW52YXJpYW50X2RlZik7CiAgICAgICAgYnJlYWs7CiAgCiAgICAgIGNhc2Ug R0lNUExFX01PRElGWV9TVE1UOgotLS0gMTc3OSwxNzg0IC0tLS0KKioqKioq KioqKioqKioqIHN1cHBvcnRhYmxlX3dpZGVuaW5nX29wZXJhdGlvbiAoZW51 bSB0cmUKKioqIDE3NTYsMTc2MSAqKioqCi0tLSAxODE5LDE4MjYgLS0tLQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB0cmVlX2Nv ZGUgKmNvZGUxLCBlbnVtIHRyZWVfY29kZSAqY29kZTIpCiAgewogICAgc3Rt dF92ZWNfaW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3RtdCk7 CisgICBsb29wX3ZlY19pbmZvIGxvb3BfaW5mbyA9IFNUTVRfVklORk9fTE9P UF9WSU5GTyAoc3RtdF9pbmZvKTsKKyAgIHN0cnVjdCBsb29wICp2ZWN0X2xv b3AgPSBMT09QX1ZJTkZPX0xPT1AgKGxvb3BfaW5mbyk7CiAgICBib29sIG9y ZGVyZWRfcDsKICAgIGVudW0gbWFjaGluZV9tb2RlIHZlY19tb2RlOwogICAg ZW51bSBpbnNuX2NvZGUgaWNvZGUxLCBpY29kZTI7CioqKioqKioqKioqKioq KiBzdXBwb3J0YWJsZV93aWRlbmluZ19vcGVyYXRpb24gKGVudW0gdHJlCioq KiAxNzc4LDE3ODYgKioqKgogICAgICAgU29tZSB0YXJnZXRzIGNhbiB0YWtl IGFkdmFudGFnZSBvZiB0aGlzIGFuZCBnZW5lcmF0ZSBtb3JlIGVmZmljaWVu dCBjb2RlLgogICAgICAgRm9yIGV4YW1wbGUsIHRhcmdldHMgbGlrZSBBbHRp dmVjLCB0aGF0IHN1cHBvcnQgd2lkZW5fbXVsdCB1c2luZyBhIHNlcXVlbmNl CiAgICAgICBvZiB7bXVsdF9ldmVuLG11bHRfb2RkfSBnZW5lcmF0ZSB0aGUg Zm9sbG93aW5nIHZlY3RvcnM6CiEgICAgICAgICB2ZWN0MTogW3JlczEscmVz MyxyZXM1LHJlczddLCB2ZWN0MjogW3JlczIscmVzNCxyZXM2LHJlczhdLiAg Ki8KICAKISAgICBpZiAoU1RNVF9WSU5GT19SRUxFVkFOVCAoc3RtdF9pbmZv KSA9PSB2ZWN0X3VzZWRfYnlfcmVkdWN0aW9uKQogICAgICAgb3JkZXJlZF9w ID0gZmFsc2U7CiAgICAgZWxzZQogICAgICAgb3JkZXJlZF9wID0gdHJ1ZTsK LS0tIDE4NDMsMTg1NyAtLS0tCiAgICAgICBTb21lIHRhcmdldHMgY2FuIHRh a2UgYWR2YW50YWdlIG9mIHRoaXMgYW5kIGdlbmVyYXRlIG1vcmUgZWZmaWNp ZW50IGNvZGUuCiAgICAgICBGb3IgZXhhbXBsZSwgdGFyZ2V0cyBsaWtlIEFs dGl2ZWMsIHRoYXQgc3VwcG9ydCB3aWRlbl9tdWx0IHVzaW5nIGEgc2VxdWVu Y2UKICAgICAgIG9mIHttdWx0X2V2ZW4sbXVsdF9vZGR9IGdlbmVyYXRlIHRo ZSBmb2xsb3dpbmcgdmVjdG9yczoKISAgICAgICAgIHZlY3QxOiBbcmVzMSxy ZXMzLHJlczUscmVzN10sIHZlY3QyOiBbcmVzMixyZXM0LHJlczYscmVzOF0u CiAgCiEgICAgICBXaGVuIHZlY3Rvcml6YWluZyBvdXRlci1sb29wcywgd2Ug ZXhlY3V0ZSB0aGUgaW5uZXItbG9vcCBzZXF1ZW50aWFsbHkKISAgICAgIChl YWNoIHZlY3Rvcml6ZWQgaW5uZXItbG9vcCBpdGVyYXRpb24gY29udHJpYnV0 ZXMgdG8gVkYgb3V0ZXItbG9vcCAKISAgICAgIGl0ZXJhdGlvbnMgaW4gcGFy YWxsZWwpLiBXZSB0aGVyZWZvcmUgZG9uJ3QgYWxsb3cgdG8gY2hhbmdlIHRo ZSBvcmRlciAKISAgICAgIG9mIHRoZSBjb21wdXRhdGlvbiBpbiB0aGUgaW5u ZXItbG9vcCBkdXJpbmcgb3V0ZXItbG9vcCB2ZWN0b3JpemF0aW9uLiAgKi8K ISAKISAgICBpZiAoU1RNVF9WSU5GT19SRUxFVkFOVCAoc3RtdF9pbmZvKSA9 PSB2ZWN0X3VzZWRfYnlfcmVkdWN0aW9uCiEgICAgICAgICYmICFuZXN0ZWRf aW5fdmVjdF9sb29wX3AgKHZlY3RfbG9vcCwgc3RtdCkpCiAgICAgICBvcmRl cmVkX3AgPSBmYWxzZTsKICAgICBlbHNlCiAgICAgICBvcmRlcmVkX3AgPSB0 cnVlOwoqKioqKioqKioqKioqKiogcmVkdWN0aW9uX2NvZGVfZm9yX3NjYWxh cl9jb2RlIChlbnVtIHRyZQoqKiogMjAwNCwyMDExICoqKioKICAgICBDb25k aXRpb25zIDIsMyBhcmUgdGVzdGVkIGluIHZlY3RfbWFya19zdG10c190b19i ZV92ZWN0b3JpemVkLiAgKi8KICAKICB0cmVlCiEgdmVjdF9pc19zaW1wbGVf cmVkdWN0aW9uIChzdHJ1Y3QgbG9vcCAqbG9vcCwgdHJlZSBwaGkpCiAgewog ICAgZWRnZSBsYXRjaF9lID0gbG9vcF9sYXRjaF9lZGdlIChsb29wKTsKICAg IHRyZWUgbG9vcF9hcmcgPSBQSElfQVJHX0RFRl9GUk9NX0VER0UgKHBoaSwg bGF0Y2hfZSk7CiAgICB0cmVlIGRlZl9zdG10LCBkZWYxLCBkZWYyOwotLS0g MjA3NSwyMDg0IC0tLS0KICAgICBDb25kaXRpb25zIDIsMyBhcmUgdGVzdGVk IGluIHZlY3RfbWFya19zdG10c190b19iZV92ZWN0b3JpemVkLiAgKi8KICAK ICB0cmVlCiEgdmVjdF9pc19zaW1wbGVfcmVkdWN0aW9uIChsb29wX3ZlY19p bmZvIGxvb3BfaW5mbywgdHJlZSBwaGkpCiAgeworICAgc3RydWN0IGxvb3Ag Kmxvb3AgPSAoYmJfZm9yX3N0bXQgKHBoaSkpLT5sb29wX2ZhdGhlcjsKKyAg IHN0cnVjdCBsb29wICp2ZWN0X2xvb3AgPSBMT09QX1ZJTkZPX0xPT1AgKGxv b3BfaW5mbyk7CiAgICBlZGdlIGxhdGNoX2UgPSBsb29wX2xhdGNoX2VkZ2Ug KGxvb3ApOwogICAgdHJlZSBsb29wX2FyZyA9IFBISV9BUkdfREVGX0ZST01f RURHRSAocGhpLCBsYXRjaF9lKTsKICAgIHRyZWUgZGVmX3N0bXQsIGRlZjEs IGRlZjI7CioqKioqKioqKioqKioqKiB2ZWN0X2lzX3NpbXBsZV9yZWR1Y3Rp b24gKHN0cnVjdCBsb29wICpsCioqKiAyMDE4LDIwMjMgKioqKgotLS0gMjA5 MSwyMDk4IC0tLS0KICAgIGltbV91c2VfaXRlcmF0b3IgaW1tX2l0ZXI7CiAg ICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwogIAorICAgZ2NjX2Fzc2VydCAobG9v cCA9PSB2ZWN0X2xvb3AgfHwgZmxvd19sb29wX25lc3RlZF9wICh2ZWN0X2xv b3AsIGxvb3ApKTsKKyAKICAgIG5hbWUgPSBQSElfUkVTVUxUIChwaGkpOwog ICAgbmxvb3BfdXNlcyA9IDA7CiAgICBGT1JfRUFDSF9JTU1fVVNFX0ZBU1Qg KHVzZV9wLCBpbW1faXRlciwgbmFtZSkKKioqKioqKioqKioqKioqIHZlY3Rf aXNfc2ltcGxlX3JlZHVjdGlvbiAoc3RydWN0IGxvb3AgKmwKKioqIDIxMjks MjEzNiAqKioqCiAgICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgICAgfQog IAogICAgLyogQ0hFQ0tNRTogY2hlY2sgZm9yICFmbGFnX2Zpbml0ZV9tYXRo X29ubHkgdG9vPyAgKi8KISAgIGlmIChTQ0FMQVJfRkxPQVRfVFlQRV9QICh0 eXBlKSAmJiAhZmxhZ191bnNhZmVfbWF0aF9vcHRpbWl6YXRpb25zKQogICAg ICB7CiAgICAgICAgLyogQ2hhbmdpbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlv bnMgY2hhbmdlcyB0aGUgc2VtYW50aWNzLiAgKi8KICAgICAgICBpZiAodmVj dF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKLS0tIDIyMDQs MjIxOSAtLS0tCiAgICAgICAgcmV0dXJuIE5VTExfVFJFRTsKICAgICAgfQog IAorICAgLyogR2VuZXJhbGx5LCB3aGVuIHZlY3Rvcml6aW5nIGEgcmVkdWN0 aW9uIHdlIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlCisgICAgICBjb21wdXRh dGlvbi4gIFRoaXMgbWF5IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHBy b2dyYW0gaW4gc29tZQorICAgICAgY2FzZXMsIHNvIHdlIG5lZWQgdG8gY2hl Y2sgdGhhdCB0aGlzIGlzIG9rLiAgT25lIGV4Y2VwdGlvbiBpcyB3aGVuIAor ICAgICAgdmVjdG9yaXppbmcgYW4gb3V0ZXItbG9vcDogdGhlIGlubmVyLWxv b3AgaXMgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LAorICAgICAgYW5kIHRoZXJl Zm9yZSB2ZWN0b3JpemluZyByZWR1Y3Rpb25zIGluIHRoZSBpbm5lci1sb29w IGR1cmludCAKKyAgICAgIG91dGVyLWxvb3AgdmVjdG9yaXphdGlvbiBpcyBz YWZlLiAgKi8KKyAKICAgIC8qIENIRUNLTUU6IGNoZWNrIGZvciAhZmxhZ19m aW5pdGVfbWF0aF9vbmx5IHRvbz8gICovCiEgICBpZiAoU0NBTEFSX0ZMT0FU X1RZUEVfUCAodHlwZSkgJiYgIWZsYWdfdW5zYWZlX21hdGhfb3B0aW1pemF0 aW9ucwohICAgICAgICYmICFuZXN0ZWRfaW5fdmVjdF9sb29wX3AgKHZlY3Rf bG9vcCwgZGVmX3N0bXQpKSAKICAgICAgewogICAgICAgIC8qIENoYW5naW5n IHRoZSBvcmRlciBvZiBvcGVyYXRpb25zIGNoYW5nZXMgdGhlIHNlbWFudGlj cy4gICovCiAgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBP UlRfREVUQUlMUykpCioqKioqKioqKioqKioqKiB2ZWN0X2lzX3NpbXBsZV9y ZWR1Y3Rpb24gKHN0cnVjdCBsb29wICpsCioqKiAyMTQwLDIxNDYgKioqKgog ICAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMX1RSRUU7CiAgICAgIH0K ISAgIGVsc2UgaWYgKElOVEVHUkFMX1RZUEVfUCAodHlwZSkgJiYgVFlQRV9P VkVSRkxPV19UUkFQUyAodHlwZSkpCiAgICAgIHsKICAgICAgICAvKiBDaGFu Z2luZyB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9ucyBjaGFuZ2VzIHRoZSBzZW1h bnRpY3MuICAqLwogICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAo UkVQT1JUX0RFVEFJTFMpKQotLS0gMjIyMywyMjMwIC0tLS0KICAgICAgICAg IH0KICAgICAgICByZXR1cm4gTlVMTF9UUkVFOwogICAgICB9CiEgICBlbHNl IGlmIChJTlRFR1JBTF9UWVBFX1AgKHR5cGUpICYmIFRZUEVfT1ZFUkZMT1df VFJBUFMgKHR5cGUpCiEgCSAgICYmICFuZXN0ZWRfaW5fdmVjdF9sb29wX3Ag KHZlY3RfbG9vcCwgZGVmX3N0bXQpKQogICAgICB7CiAgICAgICAgLyogQ2hh bmdpbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgY2hhbmdlcyB0aGUgc2Vt YW50aWNzLiAgKi8KICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8g KFJFUE9SVF9ERVRBSUxTKSkKKioqKioqKioqKioqKioqIHZlY3RfaXNfc2lt cGxlX3JlZHVjdGlvbiAoc3RydWN0IGxvb3AgKmwKKioqIDIxNzksMjE5MSAq KioqCiAgCiAgCiAgICAvKiBDaGVjayB0aGF0IG9uZSBkZWYgaXMgdGhlIHJl ZHVjdGlvbiBkZWYsIGRlZmluZWQgYnkgUEhJLAohICAgICAgdGhlIG90aGVy IGRlZiBpcyBlaXRoZXIgZGVmaW5lZCBpbiB0aGUgbG9vcCBieSBhIEdJTVBM RV9NT0RJRllfU1RNVCwKISAgICAgIG9yIGl0J3MgYW4gaW5kdWN0aW9uIChk ZWZpbmVkIGJ5IHNvbWUgcGhpIG5vZGUpLiAgKi8KICAKICAgIGlmIChkZWYy ID09IHBoaQogICAgICAgICYmIGZsb3dfYmJfaW5zaWRlX2xvb3BfcCAobG9v cCwgYmJfZm9yX3N0bXQgKGRlZjEpKQogICAgICAgICYmIChUUkVFX0NPREUg KGRlZjEpID09IEdJTVBMRV9NT0RJRllfU1RNVCAKISAJICB8fCBTVE1UX1ZJ TkZPX0RFRl9UWVBFICh2aW5mb19mb3Jfc3RtdCAoZGVmMSkpID09IHZlY3Rf aW5kdWN0aW9uX2RlZikpCiAgICAgIHsKICAgICAgICBpZiAodmVjdF9wcmlu dF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKICAgICAgICAgIHsKLS0t IDIyNjMsMjI3OCAtLS0tCiAgCiAgCiAgICAvKiBDaGVjayB0aGF0IG9uZSBk ZWYgaXMgdGhlIHJlZHVjdGlvbiBkZWYsIGRlZmluZWQgYnkgUEhJLAohICAg ICAgdGhlIG90aGVyIGRlZiBpcyBlaXRoZXIgZGVmaW5lZCBpbiB0aGUgbG9v cCAoInZlY3RfbG9vcF9kZWYiKSwKISAgICAgIG9yIGl0J3MgYW4gaW5kdWN0 aW9uIChkZWZpbmVkIGJ5IGEgbG9vcC1oZWFkZXIgcGhpLW5vZGUpLiAgKi8K ICAKICAgIGlmIChkZWYyID09IHBoaQogICAgICAgICYmIGZsb3dfYmJfaW5z aWRlX2xvb3BfcCAobG9vcCwgYmJfZm9yX3N0bXQgKGRlZjEpKQogICAgICAg ICYmIChUUkVFX0NPREUgKGRlZjEpID09IEdJTVBMRV9NT0RJRllfU1RNVCAK ISAJICB8fCBTVE1UX1ZJTkZPX0RFRl9UWVBFICh2aW5mb19mb3Jfc3RtdCAo ZGVmMSkpID09IHZlY3RfaW5kdWN0aW9uX2RlZgohIAkgIHx8IChUUkVFX0NP REUgKGRlZjEpID09IFBISV9OT0RFIAohIAkgICAgICAmJiBTVE1UX1ZJTkZP X0RFRl9UWVBFICh2aW5mb19mb3Jfc3RtdCAoZGVmMSkpID09IHZlY3RfbG9v cF9kZWYKISAJICAgICAgJiYgIWlzX2xvb3BfaGVhZGVyX2JiX3AgKGJiX2Zv cl9zdG10IChkZWYxKSkpKSkKICAgICAgewogICAgICAgIGlmICh2ZWN0X3By aW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQogICAgICAgICAgewoq KioqKioqKioqKioqKiogdmVjdF9pc19zaW1wbGVfcmVkdWN0aW9uIChzdHJ1 Y3QgbG9vcCAqbAoqKiogMjE5NywyMjAzICoqKioKICAgIGVsc2UgaWYgKGRl ZjEgPT0gcGhpCiAgCSAgICYmIGZsb3dfYmJfaW5zaWRlX2xvb3BfcCAobG9v cCwgYmJfZm9yX3N0bXQgKGRlZjIpKQogIAkgICAmJiAoVFJFRV9DT0RFIChk ZWYyKSA9PSBHSU1QTEVfTU9ESUZZX1NUTVQgCiEgCSAgICAgICB8fCBTVE1U X1ZJTkZPX0RFRl9UWVBFICh2aW5mb19mb3Jfc3RtdCAoZGVmMikpID09IHZl Y3RfaW5kdWN0aW9uX2RlZikpCiAgICAgIHsKICAgICAgICAvKiBTd2FwIG9w ZXJhbmRzIChqdXN0IGZvciBzaW1wbGljaXR5IC0gc28gdGhhdCB0aGUgcmVz dCBvZiB0aGUgY29kZQogIAkgY2FuIGFzc3VtZSB0aGF0IHRoZSByZWR1Y3Rp b24gdmFyaWFibGUgaXMgYWx3YXlzIHRoZSBsYXN0IChzZWNvbmQpCi0tLSAy Mjg0LDIyOTMgLS0tLQogICAgZWxzZSBpZiAoZGVmMSA9PSBwaGkKICAJICAg JiYgZmxvd19iYl9pbnNpZGVfbG9vcF9wIChsb29wLCBiYl9mb3Jfc3RtdCAo ZGVmMikpCiAgCSAgICYmIChUUkVFX0NPREUgKGRlZjIpID09IEdJTVBMRV9N T0RJRllfU1RNVCAKISAJICAgICAgIHx8IFNUTVRfVklORk9fREVGX1RZUEUg KHZpbmZvX2Zvcl9zdG10IChkZWYyKSkgPT0gdmVjdF9pbmR1Y3Rpb25fZGVm CiEgCSAgICAgICB8fCAoVFJFRV9DT0RFIChkZWYyKSA9PSBQSElfTk9ERQoh IAkJICAgJiYgU1RNVF9WSU5GT19ERUZfVFlQRSAodmluZm9fZm9yX3N0bXQg KGRlZjIpKSA9PSB2ZWN0X2xvb3BfZGVmCiEgCQkgICAmJiAhaXNfbG9vcF9o ZWFkZXJfYmJfcCAoYmJfZm9yX3N0bXQgKGRlZjIpKSkpKQogICAgICB7CiAg ICAgICAgLyogU3dhcCBvcGVyYW5kcyAoanVzdCBmb3Igc2ltcGxpY2l0eSAt IHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUKICAJIGNhbiBhc3N1bWUg dGhhdCB0aGUgcmVkdWN0aW9uIHZhcmlhYmxlIGlzIGFsd2F5cyB0aGUgbGFz dCAoc2Vjb25kKQoqKioqKioqKioqKioqKiogdmVjdG9yaXplX2xvb3BzICh2 b2lkKQoqKiogMjMzNiwyMzQyICoqKioKICAgICAgICBpZiAoIWxvb3ApCiAg CWNvbnRpbnVlOwogICAgICAgIGxvb3BfdmluZm8gPSBsb29wLT5hdXg7CiEg ICAgICAgZGVzdHJveV9sb29wX3ZlY19pbmZvIChsb29wX3ZpbmZvKTsKICAg ICAgICBsb29wLT5hdXggPSBOVUxMOwogICAgICB9CiAgCi0tLSAyNDI2LDI0 MzIgLS0tLQogICAgICAgIGlmICghbG9vcCkKICAJY29udGludWU7CiAgICAg ICAgbG9vcF92aW5mbyA9IGxvb3AtPmF1eDsKISAgICAgICBkZXN0cm95X2xv b3BfdmVjX2luZm8gKGxvb3BfdmluZm8sIHRydWUpOwogICAgICAgIGxvb3At PmF1eCA9IE5VTEw7CiAgICAgIH0KICAKSW5kZXg6IHRyZWUtdmVjdG9yaXpl ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRyZWUtdmVjdG9yaXpl ci5oCShyZXZpc2lvbiAxMjczNTYpCi0tLSB0cmVlLXZlY3Rvcml6ZXIuaAko d29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogdHlwZWRlZiBzdHJ1Y3Qg X2xvb3BfdmVjX2luZm8gewoqKiogOTIsMTAwICoqKioKICAgIC8qIFRoZSBs b29wIGJhc2ljIGJsb2Nrcy4gICovCiAgICBiYXNpY19ibG9jayAqYmJzOwog IAotICAgLyogVGhlIGxvb3AgZXhpdF9jb25kaXRpb24uICAqLwotICAgdHJl ZSBleGl0X2NvbmQ7Ci0gCiAgICAvKiBOdW1iZXIgb2YgaXRlcmF0aW9ucy4g ICovCiAgICB0cmVlIG51bV9pdGVyczsKICAKLS0tIDkyLDk3IC0tLS0KKioq KioqKioqKioqKioqIHR5cGVkZWYgc3RydWN0IF9sb29wX3ZlY19pbmZvIHsK KioqIDE0NCwxNTAgKioqKgogIC8qIEFjY2VzcyBGdW5jdGlvbnMuICAqLwog ICNkZWZpbmUgTE9PUF9WSU5GT19MT09QKEwpICAgICAgICAgICAgKEwpLT5s b29wCiAgI2RlZmluZSBMT09QX1ZJTkZPX0JCUyhMKSAgICAgICAgICAgICAo TCktPmJicwotICNkZWZpbmUgTE9PUF9WSU5GT19FWElUX0NPTkQoTCkgICAg ICAgKEwpLT5leGl0X2NvbmQKICAjZGVmaW5lIExPT1BfVklORk9fTklURVJT KEwpICAgICAgICAgIChMKS0+bnVtX2l0ZXJzCiAgI2RlZmluZSBMT09QX1ZJ TkZPX0NPU1RfTU9ERUxfTUlOX0lURVJTKEwpCShMKS0+bWluX3Byb2ZpdGFi bGVfaXRlcnMKICAjZGVmaW5lIExPT1BfVklORk9fVkVDVE9SSVpBQkxFX1Ao TCkgIChMKS0+dmVjdG9yaXphYmxlCi0tLSAxNDEsMTQ2IC0tLS0KKioqKioq KioqKioqKioqIHR5cGVkZWYgc3RydWN0IF9sb29wX3ZlY19pbmZvIHsKKioq IDE2NSwxNzAgKioqKgotLS0gMTYxLDE3OSAtLS0tCiAgI2RlZmluZSBMT09Q X1ZJTkZPX05JVEVSU19LTk9XTl9QKEwpICAgICAgICAgICAgICAgICAgICAg XAogIE5JVEVSU19LTk9XTl9QKChMKS0+bnVtX2l0ZXJzKQogIAorIHN0YXRp YyBpbmxpbmUgbG9vcF92ZWNfaW5mbworIGxvb3BfdmVjX2luZm9fZm9yX2xv b3AgKHN0cnVjdCBsb29wICpsb29wKQorIHsKKyAgIHJldHVybiAobG9vcF92 ZWNfaW5mbykgbG9vcC0+YXV4OworIH0KKyAKKyBzdGF0aWMgaW5saW5lIGJv b2wKKyBuZXN0ZWRfaW5fdmVjdF9sb29wX3AgKHN0cnVjdCBsb29wICpsb29w LCB0cmVlIHN0bXQpCisgeworICAgcmV0dXJuIChsb29wLT5pbm5lciAKKyAg ICAgICAgICAgJiYgKGxvb3AtPmlubmVyID09IChiYl9mb3Jfc3RtdCAoc3Rt dCkpLT5sb29wX2ZhdGhlcikpOworIH0KKyAKICAvKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tKi8KICAvKiBJbmZvIG9uIHZlY3Rvcml6ZWQgZGVmcy4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKi8KKioqKioqKioqKioqKioqIGVudW0gc3RtdF92 ZWNfaW5mb190eXBlIHsKKioqIDE4MCwxOTEgKioqKgogICAgaW5kdWNfdmVj X2luZm9fdHlwZSwKICAgIHR5cGVfcHJvbW90aW9uX3ZlY19pbmZvX3R5cGUs CiAgICB0eXBlX2RlbW90aW9uX3ZlY19pbmZvX3R5cGUsCiEgICB0eXBlX2Nv bnZlcnNpb25fdmVjX2luZm9fdHlwZQogIH07CiAgCiAgLyogSW5kaWNhdGVz IHdoZXRoZXIvaG93IGEgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgbG9vcC4g ICovCiAgZW51bSB2ZWN0X3JlbGV2YW50IHsKICAgIHZlY3RfdW51c2VkX2lu X2xvb3AgPSAwLAogIAogICAgLyogZGVmcyB0aGF0IGZlZWQgY29tcHV0YXRp b25zIHRoYXQgZW5kIHVwIChvbmx5KSBpbiBhIHJlZHVjdGlvbi4gVGhlc2UK ICAgICAgIGRlZnMgbWF5IGJlIHVzZWQgYnkgbm9uLXJlZHVjdGlvbiBzdG10 cywgYnV0IGV2ZW50dWFsbHksIGFueSAKLS0tIDE4OSwyMDMgLS0tLQogICAg aW5kdWNfdmVjX2luZm9fdHlwZSwKICAgIHR5cGVfcHJvbW90aW9uX3ZlY19p bmZvX3R5cGUsCiAgICB0eXBlX2RlbW90aW9uX3ZlY19pbmZvX3R5cGUsCiEg ICB0eXBlX2NvbnZlcnNpb25fdmVjX2luZm9fdHlwZSwKISAgIGxvb3BfZXhp dF9jdHJsX3ZlY19pbmZvX3R5cGUKICB9OwogIAogIC8qIEluZGljYXRlcyB3 aGV0aGVyL2hvdyBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIGxvb3AuICAq LwogIGVudW0gdmVjdF9yZWxldmFudCB7CiAgICB2ZWN0X3VudXNlZF9pbl9s b29wID0gMCwKKyAgIHZlY3RfdXNlZF9pbl9vdXRlcl9ieV9yZWR1Y3Rpb24s CisgICB2ZWN0X3VzZWRfaW5fb3V0ZXIsCiAgCiAgICAvKiBkZWZzIHRoYXQg ZmVlZCBjb21wdXRhdGlvbnMgdGhhdCBlbmQgdXAgKG9ubHkpIGluIGEgcmVk dWN0aW9uLiBUaGVzZQogICAgICAgZGVmcyBtYXkgYmUgdXNlZCBieSBub24t cmVkdWN0aW9uIHN0bXRzLCBidXQgZXZlbnR1YWxseSwgYW55IAoqKioqKioq KioqKioqKiogaXNfcGF0dGVybl9zdG10X3AgKHN0bXRfdmVjX2luZm8gc3Rt dF9pbgoqKiogNDAzLDQwOCAqKioqCi0tLSA0MTUsNDI5IC0tLS0KICAgIHJl dHVybiBmYWxzZTsKICB9CiAgCisgc3RhdGljIGlubGluZSBib29sCisgaXNf bG9vcF9oZWFkZXJfYmJfcCAoYmFzaWNfYmxvY2sgYmIpCisgeworICAgaWYg KGJiID09IChiYi0+bG9vcF9mYXRoZXIpLT5oZWFkZXIpCisgICAgIHJldHVy biB0cnVlOworICAgZ2NjX2Fzc2VydCAoRURHRV9DT1VOVCAoYmItPnByZWRz KSA9PSAxKTsKKyAgIHJldHVybiBmYWxzZTsKKyB9CisgCiAgLyotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSovCiAgLyogSW5mbyBvbiBkYXRhIHJlZmVyZW5jZXMg YWxpZ25tZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAg LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCioqKioqKioqKioqKioqKiBleHRl cm4gdHJlZSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFyX3R5cGUgCioqKiA0NjIs NDY4ICoqKioKICBleHRlcm4gYm9vbCB2ZWN0X2lzX3NpbXBsZV91c2UgKHRy ZWUsIGxvb3BfdmVjX2luZm8sIHRyZWUgKiwgdHJlZSAqLAogIAkJCQllbnVt IHZlY3RfZGVmX3R5cGUgKik7CiAgZXh0ZXJuIGJvb2wgdmVjdF9pc19zaW1w bGVfaXZfZXZvbHV0aW9uICh1bnNpZ25lZCwgdHJlZSwgdHJlZSAqLCB0cmVl ICopOwohIGV4dGVybiB0cmVlIHZlY3RfaXNfc2ltcGxlX3JlZHVjdGlvbiAo c3RydWN0IGxvb3AgKiwgdHJlZSk7CiAgZXh0ZXJuIGJvb2wgdmVjdF9jYW5f Zm9yY2VfZHJfYWxpZ25tZW50X3AgKHRyZWUsIHVuc2lnbmVkIGludCk7CiAg ZXh0ZXJuIGVudW0gZHJfYWxpZ25tZW50X3N1cHBvcnQgdmVjdF9zdXBwb3J0 YWJsZV9kcl9hbGlnbm1lbnQKICAgIChzdHJ1Y3QgZGF0YV9yZWZlcmVuY2Ug Kik7Ci0tLSA0ODMsNDg5IC0tLS0KICBleHRlcm4gYm9vbCB2ZWN0X2lzX3Np bXBsZV91c2UgKHRyZWUsIGxvb3BfdmVjX2luZm8sIHRyZWUgKiwgdHJlZSAq LAogIAkJCQllbnVtIHZlY3RfZGVmX3R5cGUgKik7CiAgZXh0ZXJuIGJvb2wg dmVjdF9pc19zaW1wbGVfaXZfZXZvbHV0aW9uICh1bnNpZ25lZCwgdHJlZSwg dHJlZSAqLCB0cmVlICopOwohIGV4dGVybiB0cmVlIHZlY3RfaXNfc2ltcGxl X3JlZHVjdGlvbiAobG9vcF92ZWNfaW5mbywgdHJlZSk7CiAgZXh0ZXJuIGJv b2wgdmVjdF9jYW5fZm9yY2VfZHJfYWxpZ25tZW50X3AgKHRyZWUsIHVuc2ln bmVkIGludCk7CiAgZXh0ZXJuIGVudW0gZHJfYWxpZ25tZW50X3N1cHBvcnQg dmVjdF9zdXBwb3J0YWJsZV9kcl9hbGlnbm1lbnQKICAgIChzdHJ1Y3QgZGF0 YV9yZWZlcmVuY2UgKik7CioqKioqKioqKioqKioqKiBleHRlcm4gYm9vbCBz dXBwb3J0YWJsZV9uYXJyb3dpbmdfb3BlcmF0CioqKiA0NzQsNDgwICoqKioK ICAKICAvKiBDcmVhdGlvbiBhbmQgZGVsZXRpb24gb2YgbG9vcCBhbmQgc3Rt dCBpbmZvIHN0cnVjdHMuICAqLwogIGV4dGVybiBsb29wX3ZlY19pbmZvIG5l d19sb29wX3ZlY19pbmZvIChzdHJ1Y3QgbG9vcCAqbG9vcCk7CiEgZXh0ZXJu IHZvaWQgZGVzdHJveV9sb29wX3ZlY19pbmZvIChsb29wX3ZlY19pbmZvKTsK ICBleHRlcm4gc3RtdF92ZWNfaW5mbyBuZXdfc3RtdF92ZWNfaW5mbyAodHJl ZSBzdG10LCBsb29wX3ZlY19pbmZvKTsKICAKICAKLS0tIDQ5NSw1MDEgLS0t LQogIAogIC8qIENyZWF0aW9uIGFuZCBkZWxldGlvbiBvZiBsb29wIGFuZCBz dG10IGluZm8gc3RydWN0cy4gICovCiAgZXh0ZXJuIGxvb3BfdmVjX2luZm8g bmV3X2xvb3BfdmVjX2luZm8gKHN0cnVjdCBsb29wICpsb29wKTsKISBleHRl cm4gdm9pZCBkZXN0cm95X2xvb3BfdmVjX2luZm8gKGxvb3BfdmVjX2luZm8s IGJvb2wpOwogIGV4dGVybiBzdG10X3ZlY19pbmZvIG5ld19zdG10X3ZlY19p bmZvICh0cmVlIHN0bXQsIGxvb3BfdmVjX2luZm8pOwogIAogIApJbmRleDog dHJlZS12ZWN0LWFuYWx5emUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cioq KiB0cmVlLXZlY3QtYW5hbHl6ZS5jCShyZXZpc2lvbiAxMjczNTYpCi0tLSB0 cmVlLXZlY3QtYW5hbHl6ZS5jCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioq KioqKiB2ZWN0X2FuYWx5emVfb3BlcmF0aW9ucyAobG9vcF92ZWNfaW5mbyBs CioqKiAzMjUsMzMwICoqKioKLS0tIDMyNSwzNDggLS0tLQogIAkgICAgICBw cmludF9nZW5lcmljX2V4cHIgKHZlY3RfZHVtcCwgcGhpLCBUREZfU0xJTSk7 CiAgCSAgICB9CiAgCisgCSAgaWYgKCEgaXNfbG9vcF9oZWFkZXJfYmJfcCAo YmIpKQorIAkgICAgeworIAkgICAgICAvKiBpbm5lci1sb29wIGxvb3AtY2xv c2VkIGV4aXQgcGhpIGluIG91dGVyLWxvb3AgdmVjdG9yaXphdGlvbgorIAkJ IChpLmUuIGEgcGhpIGluIHRoZSB0YWlsIG9mIHRoZSBvdXRlci1sb29wKS4g CisgCQkgRk9STk9XOiB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCB0aGUg Y2FzZSB0aGF0IHRoZXNlIHBoaXMKKyAJCSBhcmUgbm90IHVzZWQgaW4gdGhl IG91dGVybG9vcCwgY2F1c2UgdGhpcyBjYXNlIHJlcXVpcmVzCisgCQkgdG8g YWN0dWFsbHkgZG8gc29tZXRoaW5nIGhlcmUuICAqLworIAkgICAgICBpZiAo IVNUTVRfVklORk9fUkVMRVZBTlRfUCAoc3RtdF9pbmZvKSAKKyAJCSAgfHwg U1RNVF9WSU5GT19MSVZFX1AgKHN0bXRfaW5mbykpCisgCQl7CisgCQkgIGlm ICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQorIAkJ ICAgIGZwcmludGYgKHZlY3RfZHVtcCwgCisgCQkJICAgICAiVW5zdXBwb3J0 ZWQgbG9vcC1jbG9zZWQgcGhpIGluIG91dGVyLWxvb3AuIik7CisgCQkgIHJl dHVybiBmYWxzZTsKKyAJCX0KKyAJICAgICAgY29udGludWU7CisgCSAgICB9 CisgCiAgCSAgZ2NjX2Fzc2VydCAoc3RtdF9pbmZvKTsKICAKICAJICBpZiAo U1RNVF9WSU5GT19MSVZFX1AgKHN0bXRfaW5mbykpCioqKioqKioqKioqKioq KiB2ZWN0X2FuYWx5emVfb3BlcmF0aW9ucyAobG9vcF92ZWNfaW5mbyBsCioq KiAzOTgsNDA0ICoqKioKICAJICAgICAgYnJlYWs7CiAgCQogIAkgICAgY2Fz ZSB2ZWN0X3JlZHVjdGlvbl9kZWY6CiEgCSAgICAgIGdjY19hc3NlcnQgKHJl bGV2YW5jZSA9PSB2ZWN0X3VudXNlZF9pbl9sb29wKTsKICAJICAgICAgYnJl YWs7CQogIAogIAkgICAgY2FzZSB2ZWN0X2luZHVjdGlvbl9kZWY6Ci0tLSA0 MTYsNDI0IC0tLS0KICAJICAgICAgYnJlYWs7CiAgCQogIAkgICAgY2FzZSB2 ZWN0X3JlZHVjdGlvbl9kZWY6CiEgCSAgICAgIGdjY19hc3NlcnQgKHJlbGV2 YW5jZSA9PSB2ZWN0X3VzZWRfaW5fb3V0ZXIKISAJCQkgIHx8IHJlbGV2YW5j ZSA9PSB2ZWN0X3VzZWRfaW5fb3V0ZXJfYnlfcmVkdWN0aW9uCiEgCQkJICB8 fCByZWxldmFuY2UgPT0gdmVjdF91bnVzZWRfaW5fbG9vcCk7CiAgCSAgICAg IGJyZWFrOwkKICAKICAJICAgIGNhc2UgdmVjdF9pbmR1Y3Rpb25fZGVmOgoq KioqKioqKioqKioqKiogZXhpc3Rfbm9uX2luZGV4aW5nX29wZXJhbmRzX2Zv cl91c2VfcCAodAoqKiogNTg5LDYzOCAqKioqCiAgfQogIAogIAohIC8qIEZ1 bmN0aW9uIHZlY3RfYW5hbHl6ZV9zY2FsYXJfY3ljbGVzLgohIAohICAgIEV4 YW1pbmUgdGhlIGNyb3NzIGl0ZXJhdGlvbiBkZWYtdXNlIGN5Y2xlcyBvZiBz Y2FsYXIgdmFyaWFibGVzLCBieQohICAgIGFuYWx5emluZyB0aGUgbG9vcCAo c2NhbGFyKSBQSElzOyBDbGFzc2lmeSBlYWNoIGN5Y2xlIGFzIG9uZSBvZiB0 aGUKISAgICBmb2xsb3dpbmc6IGludmFyaWFudCwgaW5kdWN0aW9uLCByZWR1 Y3Rpb24sIHVua25vd24uCiEgICAgCiEgICAgU29tZSBmb3JtcyBvZiBzY2Fs YXIgY3ljbGVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4KISAKISAgICBFeGFt cGxlMTogcmVkdWN0aW9uOiAodW5zdXBwb3J0ZWQgeWV0KQohIAohICAgICAg ICAgICAgICAgbG9vcDE6CiEgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxO OyBpKyspCiEgICAgICAgICAgICAgICAgICBzdW0gKz0gYVtpXTsKISAKISAg ICBFeGFtcGxlMjogaW5kdWN0aW9uOiAodW5zdXBwb3J0ZWQgeWV0KQohIAoh ICAgICAgICAgICAgICAgbG9vcDI6CiEgICAgICAgICAgICAgICBmb3IgKGk9 MDsgaTxOOyBpKyspCiEgICAgICAgICAgICAgICAgICBhW2ldID0gaTsKISAK ISAgICBOb3RlOiB0aGUgZm9sbG93aW5nIGxvb3AgKmlzKiB2ZWN0b3JpemFi bGU6CiEgCiEgICAgICAgICAgICAgICBsb29wMzoKISAgICAgICAgICAgICAg IGZvciAoaT0wOyBpPE47IGkrKykKISAgICAgICAgICAgICAgICAgIGFbaV0g PSBiW2ldOwogIAohICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IGhhcyBhIGRl Zi11c2UgY3ljbGUgY2F1c2VkIGJ5IHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUg aToKISAKISAgICAgICAgICAgICAgIGxvb3A6IGlfMiA9IFBISSAoaV8wLCBp XzEpCiEgICAgICAgICAgICAgICAgICAgICBhW2lfMl0gPSAuLi47CiEgICAg ICAgICAgICAgICAgICAgICBpXzEgPSBpXzIgKyAxOwohICAgICAgICAgICAg ICAgICAgICAgR09UTyBsb29wOwohIAohICAgICAgICAgIGJlY2F1c2UgdGhl IGRlZi11c2UgY3ljbGUgaW4gbG9vcDMgaXMgY29uc2lkZXJlZCAibm90IHJl bGV2YW50IiAtIGkuZS4sCiEgICAgICAgICAgaXQgZG9lcyBub3QgbmVlZCB0 byBiZSB2ZWN0b3JpemVkIGJlY2F1c2UgaXQgaXMgb25seSB1c2VkIGZvciBh cnJheQohICAgICAgICAgIGluZGV4aW5nIChzZWUgJ21hcmtfc3RtdHNfdG9f YmVfdmVjdG9yaXplZCcpLiBUaGUgZGVmLXVzZSBjeWNsZSBpbgohICAgICAg ICAgIGxvb3AyIG9uIHRoZSBvdGhlciBoYW5kIGlzIHJlbGV2YW50IChpdCBp cyBiZWluZyB3cml0dGVuIHRvIG1lbW9yeSkuCiEgKi8KICAKICBzdGF0aWMg dm9pZAohIHZlY3RfYW5hbHl6ZV9zY2FsYXJfY3ljbGVzIChsb29wX3ZlY19p bmZvIGxvb3BfdmluZm8pCiAgewogICAgdHJlZSBwaGk7Ci0gICBzdHJ1Y3Qg bG9vcCAqbG9vcCA9IExPT1BfVklORk9fTE9PUCAobG9vcF92aW5mbyk7CiAg ICBiYXNpY19ibG9jayBiYiA9IGxvb3AtPmhlYWRlcjsKICAgIHRyZWUgZHVt eTsKICAgIFZFQyh0cmVlLGhlYXApICp3b3JrbGlzdCA9IFZFQ19hbGxvYyAo dHJlZSwgaGVhcCwgNjQpOwotLS0gNjA5LDYyNSAtLS0tCiAgfQogIAogIAoh IC8qIEZ1bmN0aW9uIHZlY3RfYW5hbHl6ZV9zY2FsYXJfY3ljbGVzXzEuCiAg CiEgICAgRXhhbWluZSB0aGUgY3Jvc3MgaXRlcmF0aW9uIGRlZi11c2UgY3lj bGVzIG9mIHNjYWxhciB2YXJpYWJsZXMKISAgICBpbiBMT09QLiBMT09QX1ZJ TkZPIHJlcHJlc2VudHMgdGhlIGxvb3AgdGhhdCBpcyBub2UgYmVpbmcKISAg ICBjb25zaWRlcmVkIGZvciB2ZWN0b3JpemF0aW9uIChjYW4gYmUgTE9PUCwg b3IgYW4gb3V0ZXItbG9vcAohICAgIGVuY2xvc2luZyBMT09QKS4gICovCiAg CiAgc3RhdGljIHZvaWQKISB2ZWN0X2FuYWx5emVfc2NhbGFyX2N5Y2xlc18x IChsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8sIHN0cnVjdCBsb29wICpsb29w KQogIHsKICAgIHRyZWUgcGhpOwogICAgYmFzaWNfYmxvY2sgYmIgPSBsb29w LT5oZWFkZXI7CiAgICB0cmVlIGR1bXk7CiAgICBWRUModHJlZSxoZWFwKSAq d29ya2xpc3QgPSBWRUNfYWxsb2MgKHRyZWUsIGhlYXAsIDY0KTsKKioqKioq KioqKioqKioqIHZlY3RfYW5hbHl6ZV9zY2FsYXJfY3ljbGVzIChsb29wX3Zl Y19pbmYKKioqIDY5OCw3MDQgKioqKgogICAgICAgIGdjY19hc3NlcnQgKGlz X2dpbXBsZV9yZWcgKFNTQV9OQU1FX1ZBUiAoZGVmKSkpOwogICAgICAgIGdj Y19hc3NlcnQgKFNUTVRfVklORk9fREVGX1RZUEUgKHN0bXRfdmluZm8pID09 IHZlY3RfdW5rbm93bl9kZWZfdHlwZSk7CiAgCiEgICAgICAgcmVkdWNfc3Rt dCA9IHZlY3RfaXNfc2ltcGxlX3JlZHVjdGlvbiAobG9vcCwgcGhpKTsKICAg ICAgICBpZiAocmVkdWNfc3RtdCkKICAgICAgICAgIHsKICAgICAgICAgICAg aWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVUQUlMUykpCi0t LSA2ODUsNjkxIC0tLS0KICAgICAgICBnY2NfYXNzZXJ0IChpc19naW1wbGVf cmVnIChTU0FfTkFNRV9WQVIgKGRlZikpKTsKICAgICAgICBnY2NfYXNzZXJ0 IChTVE1UX1ZJTkZPX0RFRl9UWVBFIChzdG10X3ZpbmZvKSA9PSB2ZWN0X3Vu a25vd25fZGVmX3R5cGUpOwogIAohICAgICAgIHJlZHVjX3N0bXQgPSB2ZWN0 X2lzX3NpbXBsZV9yZWR1Y3Rpb24gKGxvb3BfdmluZm8sIHBoaSk7CiAgICAg ICAgaWYgKHJlZHVjX3N0bXQpCiAgICAgICAgICB7CiAgICAgICAgICAgIGlm ICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQoqKioq KioqKioqKioqKiogdmVjdF9hbmFseXplX3NjYWxhcl9jeWNsZXMgKGxvb3Bf dmVjX2luZgoqKiogNzE3LDcyMiAqKioqCi0tLSA3MDQsNzUxIC0tLS0KICB9 CiAgCiAgCisgLyogRnVuY3Rpb24gdmVjdF9hbmFseXplX3NjYWxhcl9jeWNs ZXMuCisgCisgICAgRXhhbWluZSB0aGUgY3Jvc3MgaXRlcmF0aW9uIGRlZi11 c2UgY3ljbGVzIG9mIHNjYWxhciB2YXJpYWJsZXMsIGJ5CisgICAgYW5hbHl6 aW5nIHRoZSBsb29wLWhlYWRlciBQSElzIG9mIHNjYWxhciB2YXJpYWJsZXM7 IENsYXNzaWZ5IGVhY2ggCisgICAgY3ljbGUgYXMgb25lIG9mIHRoZSBmb2xs b3dpbmc6IGludmFyaWFudCwgaW5kdWN0aW9uLCByZWR1Y3Rpb24sIHVua25v d24uCisgICAgV2UgZG8gdGhhdCBmb3IgdGhlIGxvb3AgcmVwcmVzZW50ZWQg YnkgTE9PUF9WSU5GTywgYW5kIGFsc28gdG8gaXRzCisgICAgaW5uZXItbG9v cCwgaWYgZXhpc3RzLgorICAgIEV4YW1wbGVzIGZvciBzY2FsYXIgY3ljbGVz OgorIAorICAgIEV4YW1wbGUxOiByZWR1Y3Rpb246CisgCisgICAgICAgICAg ICAgICBsb29wMToKKyAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPE47IGkr KykKKyAgICAgICAgICAgICAgICAgIHN1bSArPSBhW2ldOworIAorICAgIEV4 YW1wbGUyOiBpbmR1Y3Rpb246CisgCisgICAgICAgICAgICAgICBsb29wMjoK KyAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPE47IGkrKykKKyAgICAgICAg ICAgICAgICAgIGFbaV0gPSBpOyAgKi8KKyAKKyBzdGF0aWMgdm9pZAorIHZl Y3RfYW5hbHl6ZV9zY2FsYXJfY3ljbGVzIChsb29wX3ZlY19pbmZvIGxvb3Bf dmluZm8pCisgeworICAgc3RydWN0IGxvb3AgKmxvb3AgPSBMT09QX1ZJTkZP X0xPT1AgKGxvb3BfdmluZm8pOworIAorICAgdmVjdF9hbmFseXplX3NjYWxh cl9jeWNsZXNfMSAobG9vcF92aW5mbywgbG9vcCk7CisgCisgICAvKiBXaGVu IHZlY3Rvcml6aW5nIGFuIG91dGVyLWxvb3AsIHRoZSBpbm5lci1sb29wIGlz IGV4ZWN1dGVkIHNlcXVlbnRpYWxseS4KKyAgICAgIFJlZHVjdGlvbnMgaW4g c3VjaCBpbm5lci1sb29wIHRoZXJlZm9yZSBoYXZlIGRpZmZlcmVudCBwcm9w ZXJ0aWVzIHRoYW4KKyAgICAgIHRoZSByZWR1Y3Rpb25zIGluIHRoZSBuZXN0 IHRoYXQgZ2V0cyB2ZWN0b3JpemVkOgorICAgICAgMS4gV2hlbiB2ZWN0b3Jp emVkLCB0aGV5IGFyZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBp biB0aGUgb3JpZ2luYWwKKyAgICAgICAgIHNjYWxhciBsb29wLCBzbyB3ZSBj YW4ndCBjaGFuZ2UgdGhlIG9yZGVyIG9mIGNvbXB1dGF0aW9uIHdoZW4KKyAg ICAgICAgIHZlY3Rvcml6aW5nIHRoZW0uCisgICAgICAyLiBGSVhNRTogSW5u ZXItbG9vcCByZWR1Y3Rpb25zIGNhbiBiZSB1c2VkIGluIHRoZSBpbm5lci1s b29wLCBzbyB0aGUgCisgICAgICAgICBjdXJyZW50IGNoZWNrcyBhcmUgdG9v IHN0cmljdC4gICovCisgCisgICBpZiAobG9vcC0+aW5uZXIpCisgICAgIHZl Y3RfYW5hbHl6ZV9zY2FsYXJfY3ljbGVzXzEgKGxvb3BfdmluZm8sIGxvb3At PmlubmVyKTsKKyB9CisgCisgCiAgLyogRnVuY3Rpb24gdmVjdF9pbnNlcnRf aW50b19pbnRlcmxlYXZpbmdfY2hhaW4uCiAgCiAgICAgSW5zZXJ0IERSQSBp bnRvIHRoZSBpbnRlcmxlYXZpbmcgY2hhaW4gb2YgRFJCIGFjY29yZGluZyB0 byBEUkEncyBJTklULiAgKi8KKioqKioqKioqKioqKioqIHZlY3RfZW5oYW5j ZV9kYXRhX3JlZnNfYWxpZ25tZW50IChsb29wX3YKKioqIDE3MjIsMTcyOCAq KioqCiAgICAgICA0KSBhbGwgbWlzYWxpZ25lZCBkYXRhIHJlZnMgd2l0aCBh IGtub3duIG1pc2FsaWdubWVudCBhcmUgc3VwcG9ydGVkLCBhbmQKICAgICAg IDUpIHRoZSBudW1iZXIgb2YgcnVudGltZSBhbGlnbm1lbnQgY2hlY2tzIGlz IHdpdGhpbiByZWFzb24uICAqLwogIAohICAgZG9fdmVyc2lvbmluZyA9IGZs YWdfdHJlZV92ZWN0X2xvb3BfdmVyc2lvbiAmJiAoIW9wdGltaXplX3NpemUp OwogIAogICAgaWYgKGRvX3ZlcnNpb25pbmcpCiAgICAgIHsKLS0tIDE3NTEs MTc2MCAtLS0tCiAgICAgICA0KSBhbGwgbWlzYWxpZ25lZCBkYXRhIHJlZnMg d2l0aCBhIGtub3duIG1pc2FsaWdubWVudCBhcmUgc3VwcG9ydGVkLCBhbmQK ICAgICAgIDUpIHRoZSBudW1iZXIgb2YgcnVudGltZSBhbGlnbm1lbnQgY2hl Y2tzIGlzIHdpdGhpbiByZWFzb24uICAqLwogIAohICAgZG9fdmVyc2lvbmlu ZyA9IAohIAlmbGFnX3RyZWVfdmVjdF9sb29wX3ZlcnNpb24gCiEgCSYmICgh b3B0aW1pemVfc2l6ZSkKISAJJiYgKCFsb29wLT5pbm5lcik7CiAgCiAgICBp ZiAoZG9fdmVyc2lvbmluZykKICAgICAgewoqKioqKioqKioqKioqKiogdmVj dF9hbmFseXplX2RhdGFfcmVmcyAobG9vcF92ZWNfaW5mbyBsbwoqKiogMjEw NSwyMTEwICoqKioKLS0tIDIxMzcsMjE0MyAtLS0tCiAgICAgIHsKICAgICAg ICB0cmVlIHN0bXQ7CiAgICAgICAgc3RtdF92ZWNfaW5mbyBzdG10X2luZm87 CisgICAgICAgYmFzaWNfYmxvY2sgYmI7CiAgICAgCiAgICAgICAgaWYgKCFk ciB8fCAhRFJfUkVGIChkcikpCiAgICAgICAgICB7CioqKioqKioqKioqKioq KiB2ZWN0X2FuYWx5emVfZGF0YV9yZWZzIChsb29wX3ZlY19pbmZvIGxvCioq KiAyMTE3LDIxMjIgKioqKgotLS0gMjE1MCwyMTY1IC0tLS0KICAgICAgICBz dG10ID0gRFJfU1RNVCAoZHIpOwogICAgICAgIHN0bXRfaW5mbyA9IHZpbmZv X2Zvcl9zdG10IChzdG10KTsKICAKKyAgICAgICAvKiBJZiBvdXRlci1sb29w IHZlY3Rvcml6YXRpb246IHdlIGRvbid0IHlldCBzdXBwb3J0IGRhdGFyZWZz CisgCSBpbiB0aGUgaW5uZXJtb3N0IGxvb3AuICAqLworICAgICAgIGJiID0g YmJfZm9yX3N0bXQgKHN0bXQpOworICAgICAgIGlmIChiYi0+bG9vcF9mYXRo ZXIgIT0gTE9PUF9WSU5GT19MT09QIChsb29wX3ZpbmZvKSkKKyAJeworIAkg IGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX1VOVkVDVE9SSVpF RF9MT09QUykpCisgCSAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJub3QgdmVj dG9yaXplZDogZGF0YS1yZWYgaW4gbmVzdGVkIGxvb3AiKTsKKyAJICByZXR1 cm4gZmFsc2U7CisgCX0KKyAKICAgICAgICBpZiAoU1RNVF9WSU5GT19EQVRB X1JFRiAoc3RtdF9pbmZvKSkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYg KHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfVU5WRUNUT1JJWkVEX0xP T1BTKSkKKioqKioqKioqKioqKioqIHZlY3RfbWFya19yZWxldmFudCAoVkVD KHRyZWUsaGVhcCkgKip3b3IKKioqIDIyMDQsMjIxNCAqKioqCiAgCiAgICAg ICAgLyogVGhpcyBpcyB0aGUgbGFzdCBzdG10IGluIGEgc2VxdWVuY2UgdGhh dCB3YXMgZGV0ZWN0ZWQgYXMgYSAKICAgICAgICAgICBwYXR0ZXJuIHRoYXQg Y2FuIHBvdGVudGlhbGx5IGJlIHZlY3Rvcml6ZWQuICBEb24ndCBtYXJrIHRo ZSBzdG10CiEgICAgICAgICAgYXMgcmVsZXZhbnQvbGl2ZSBiZWNhdXNlIGl0 J3Mgbm90IGdvaW5nIHRvIHZlY3Rvcml6ZWQuCiAgICAgICAgICAgSW5zdGVh ZCBtYXJrIHRoZSBwYXR0ZXJuLXN0bXQgdGhhdCByZXBsYWNlcyBpdC4gICov CiAgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVU QUlMUykpCiAgICAgICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJsYXN0IHN0 bXQgaW4gcGF0dGVybi4gZG9uJ3QgbWFyayByZWxldmFudC9saXZlLiIpOwot ICAgICAgIHBhdHRlcm5fc3RtdCA9IFNUTVRfVklORk9fUkVMQVRFRF9TVE1U IChzdG10X2luZm8pOwogICAgICAgIHN0bXRfaW5mbyA9IHZpbmZvX2Zvcl9z dG10IChwYXR0ZXJuX3N0bXQpOwogICAgICAgIGdjY19hc3NlcnQgKFNUTVRf VklORk9fUkVMQVRFRF9TVE1UIChzdG10X2luZm8pID09IHN0bXQpOwogICAg ICAgIHNhdmVfcmVsZXZhbnQgPSBTVE1UX1ZJTkZPX1JFTEVWQU5UIChzdG10 X2luZm8pOwotLS0gMjI0NywyMjU5IC0tLS0KICAKICAgICAgICAvKiBUaGlz IGlzIHRoZSBsYXN0IHN0bXQgaW4gYSBzZXF1ZW5jZSB0aGF0IHdhcyBkZXRl Y3RlZCBhcyBhIAogICAgICAgICAgIHBhdHRlcm4gdGhhdCBjYW4gcG90ZW50 aWFsbHkgYmUgdmVjdG9yaXplZC4gIERvbid0IG1hcmsgdGhlIHN0bXQKISAg ICAgICAgICBhcyByZWxldmFudC9saXZlIGJlY2F1c2UgaXQncyBub3QgZ29p bmcgdG8gYmUgdmVjdG9yaXplZC4KICAgICAgICAgICBJbnN0ZWFkIG1hcmsg dGhlIHBhdHRlcm4tc3RtdCB0aGF0IHJlcGxhY2VzIGl0LiAgKi8KKyAKKyAg ICAgICBwYXR0ZXJuX3N0bXQgPSBTVE1UX1ZJTkZPX1JFTEFURURfU1RNVCAo c3RtdF9pbmZvKTsKKyAKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2lu Zm8gKFJFUE9SVF9ERVRBSUxTKSkKICAgICAgICAgIGZwcmludGYgKHZlY3Rf ZHVtcCwgImxhc3Qgc3RtdCBpbiBwYXR0ZXJuLiBkb24ndCBtYXJrIHJlbGV2 YW50L2xpdmUuIik7CiAgICAgICAgc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0 bXQgKHBhdHRlcm5fc3RtdCk7CiAgICAgICAgZ2NjX2Fzc2VydCAoU1RNVF9W SU5GT19SRUxBVEVEX1NUTVQgKHN0bXRfaW5mbykgPT0gc3RtdCk7CiAgICAg ICAgc2F2ZV9yZWxldmFudCA9IFNUTVRfVklORk9fUkVMRVZBTlQgKHN0bXRf aW5mbyk7CioqKioqKioqKioqKioqKiB2ZWN0X3N0bXRfcmVsZXZhbnRfcCAo dHJlZSBzdG10LCBsb29wX3ZlCioqKiAyMjU4LDIyNjQgKioqKgogICAgKmxp dmVfcCA9IGZhbHNlOwogIAogICAgLyogY29uZCBzdG10IG90aGVyIHRoYW4g bG9vcCBleGl0IGNvbmQuICAqLwohICAgaWYgKGlzX2N0cmxfc3RtdCAoc3Rt dCkgJiYgKHN0bXQgIT0gTE9PUF9WSU5GT19FWElUX0NPTkQgKGxvb3Bfdmlu Zm8pKSkKICAgICAgKnJlbGV2YW50ID0gdmVjdF91c2VkX2luX2xvb3A7CiAg CiAgICAvKiBjaGFuZ2luZyBtZW1vcnkuICAqLwotLS0gMjMwMywyMzEwIC0t LS0KICAgICpsaXZlX3AgPSBmYWxzZTsKICAKICAgIC8qIGNvbmQgc3RtdCBv dGhlciB0aGFuIGxvb3AgZXhpdCBjb25kLiAgKi8KISAgIGlmIChpc19jdHJs X3N0bXQgKHN0bXQpIAohICAgICAgICYmIFNUTVRfVklORk9fVFlQRSAodmlu Zm9fZm9yX3N0bXQgKHN0bXQpKSAhPSBsb29wX2V4aXRfY3RybF92ZWNfaW5m b190eXBlKSAKICAgICAgKnJlbGV2YW50ID0gdmVjdF91c2VkX2luX2xvb3A7 CiAgCiAgICAvKiBjaGFuZ2luZyBtZW1vcnkuICAqLwoqKioqKioqKioqKioq KiogdmVjdF9zdG10X3JlbGV2YW50X3AgKHRyZWUgc3RtdCwgbG9vcF92ZQoq KiogMjMxNSwyMzIwICoqKioKLS0tIDIzNjEsMjM2OCAtLS0tCiAgICAgb2Yg dGhlIHJlc3BlY3RpdmUgREVGX1NUTVQgaXMgbGVmdCB1bmNoYW5nZWQuCiAg ICAgLSBjYXNlIDI6IElmIFNUTVQgaXMgYSByZWR1Y3Rpb24gcGhpIGFuZCBE RUZfU1RNVCBpcyBhIHJlZHVjdGlvbiBzdG10LCB3ZSAKICAgICBza2lwIERF Rl9TVE1UIGNhdXNlIGl0IGhhZCBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLiAg CisgICAgLSBjYXNlIDM6IElmIERFRl9TVE1UIGFuZCBTVE1UIGFyZSBpbiBk aWZmZXJlbnQgbmVzdHMsIHRoZW4gICJyZWxldmFudCIgd2lsbAorICAgIGJl IG1vZGlmaWVkIGFjY29yZGluZ2x5LgogIAogICAgIFJldHVybiB0cnVlIGlm IGV2ZXJ5dGhpbmcgaXMgYXMgZXhwZWN0ZWQuIFJldHVybiBmYWxzZSBvdGhl cndpc2UuICAqLwogIAoqKioqKioqKioqKioqKiogcHJvY2Vzc191c2UgKHRy ZWUgc3RtdCwgdHJlZSB1c2UsIGxvb3BfdgoqKiogMjMyNSwyMzMxICoqKioK ICAgIHN0cnVjdCBsb29wICpsb29wID0gTE9PUF9WSU5GT19MT09QIChsb29w X3ZpbmZvKTsKICAgIHN0bXRfdmVjX2luZm8gc3RtdF92aW5mbyA9IHZpbmZv X2Zvcl9zdG10IChzdG10KTsKICAgIHN0bXRfdmVjX2luZm8gZHN0bXRfdmlu Zm87CiEgICBiYXNpY19ibG9jayBkZWZfYmI7CiAgICB0cmVlIGRlZiwgZGVm X3N0bXQ7CiAgICBlbnVtIHZlY3RfZGVmX3R5cGUgZHQ7CiAgCi0tLSAyMzcz LDIzNzkgLS0tLQogICAgc3RydWN0IGxvb3AgKmxvb3AgPSBMT09QX1ZJTkZP X0xPT1AgKGxvb3BfdmluZm8pOwogICAgc3RtdF92ZWNfaW5mbyBzdG10X3Zp bmZvID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOwogICAgc3RtdF92ZWNfaW5m byBkc3RtdF92aW5mbzsKISAgIGJhc2ljX2Jsb2NrIGJiLCBkZWZfYmI7CiAg ICB0cmVlIGRlZiwgZGVmX3N0bXQ7CiAgICBlbnVtIHZlY3RfZGVmX3R5cGUg ZHQ7CiAgCioqKioqKioqKioqKioqKiBwcm9jZXNzX3VzZSAodHJlZSBzdG10 LCB0cmVlIHVzZSwgbG9vcF92CioqKiAyMzQ2LDIzNjIgKioqKgogIAogICAg ZGVmX2JiID0gYmJfZm9yX3N0bXQgKGRlZl9zdG10KTsKICAgIGlmICghZmxv d19iYl9pbnNpZGVfbG9vcF9wIChsb29wLCBkZWZfYmIpKQohICAgICByZXR1 cm4gdHJ1ZTsKICAKISAgIC8qIGNhc2UgMjogQSByZWR1Y3Rpb24gcGhpIGRl ZmluaW5nIGEgcmVkdWN0aW9uIHN0bXQgKERFRl9TVE1UKS4gREVGX1NUTVQg CiEgICAgICBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCwgc28g d2UganVzdCBjaGVjayB0aGF0IGV2ZXJ5dGhpbmcgaXMgYXMgCiEgICAgICBl eHBlY3RlZCwgYW5kIHdlIGFyZSBkb25lLiAgKi8KICAgIGRzdG10X3ZpbmZv ID0gdmluZm9fZm9yX3N0bXQgKGRlZl9zdG10KTsKICAgIGlmIChUUkVFX0NP REUgKHN0bXQpID09IFBISV9OT0RFCiAgICAgICAgJiYgU1RNVF9WSU5GT19E RUZfVFlQRSAoc3RtdF92aW5mbykgPT0gdmVjdF9yZWR1Y3Rpb25fZGVmCiAg ICAgICAgJiYgVFJFRV9DT0RFIChkZWZfc3RtdCkgIT0gUEhJX05PREUKISAg ICAgICAmJiBTVE1UX1ZJTkZPX0RFRl9UWVBFIChkc3RtdF92aW5mbykgPT0g dmVjdF9yZWR1Y3Rpb25fZGVmKQogICAgICB7CiAgICAgICAgaWYgKFNUTVRf VklORk9fSU5fUEFUVEVSTl9QIChkc3RtdF92aW5mbykpCiAgCWRzdG10X3Zp bmZvID0gdmluZm9fZm9yX3N0bXQgKFNUTVRfVklORk9fUkVMQVRFRF9TVE1U IChkc3RtdF92aW5mbykpOwogICAgICAgIGdjY19hc3NlcnQgKFNUTVRfVklO Rk9fUkVMRVZBTlQgKGRzdG10X3ZpbmZvKSA8IHZlY3RfdXNlZF9ieV9yZWR1 Y3Rpb24pOwotLS0gMjM5NCwyNDIwIC0tLS0KICAKICAgIGRlZl9iYiA9IGJi X2Zvcl9zdG10IChkZWZfc3RtdCk7CiAgICBpZiAoIWZsb3dfYmJfaW5zaWRl X2xvb3BfcCAobG9vcCwgZGVmX2JiKSkKISAgICAgewohICAgICAgIGlmICh2 ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQohIAlmcHJp bnRmICh2ZWN0X2R1bXAsICJkZWZfc3RtdCBpcyBvdXQgb2YgbG9vcC4iKTsK ISAgICAgICByZXR1cm4gdHJ1ZTsKISAgICAgfQogIAohICAgLyogY2FzZSAy OiBBIHJlZHVjdGlvbiBwaGkgKFNUTVQpIGRlZmluZWQgYnkgYSByZWR1Y3Rp b24gc3RtdCAoREVGX1NUTVQpLiAKISAgICAgIERFRl9TVE1UIG11c3QgaGF2 ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBiZWNhdXNlIHRoaXMgc2hvdWxk IGJlIHRoZSAKISAgICAgIG9ubHkgd2F5IHRoYXQgU1RNVCwgd2hpY2ggaXMg YSByZWR1Y3Rpb24tcGhpLCB3YXMgcHV0IGluIHRoZSB3b3JrbGlzdCwgCiEg ICAgICBhcyB0aGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgdXNlcyBmb3IgREVG X1NUTVQgaW4gdGhlIGxvb3AuICBTbyB3ZSBqdXN0IAohICAgICAgY2hlY2sg dGhhdCBldmVyeXRoaW5nIGlzIGFzIGV4cGVjdGVkLCBhbmQgd2UgYXJlIGRv bmUuICAqLwogICAgZHN0bXRfdmluZm8gPSB2aW5mb19mb3Jfc3RtdCAoZGVm X3N0bXQpOworICAgYmIgPSBiYl9mb3Jfc3RtdCAoc3RtdCk7CiAgICBpZiAo VFJFRV9DT0RFIChzdG10KSA9PSBQSElfTk9ERQogICAgICAgICYmIFNUTVRf VklORk9fREVGX1RZUEUgKHN0bXRfdmluZm8pID09IHZlY3RfcmVkdWN0aW9u X2RlZgogICAgICAgICYmIFRSRUVfQ09ERSAoZGVmX3N0bXQpICE9IFBISV9O T0RFCiEgICAgICAgJiYgU1RNVF9WSU5GT19ERUZfVFlQRSAoZHN0bXRfdmlu Zm8pID09IHZlY3RfcmVkdWN0aW9uX2RlZgohICAgICAgICYmIGJiLT5sb29w X2ZhdGhlciA9PSBkZWZfYmItPmxvb3BfZmF0aGVyKQogICAgICB7CisgICAg ICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVUQUlMUykp CisgCWZwcmludGYgKHZlY3RfZHVtcCwgInJlZHVjLXN0bXQgZGVmaW5pbmcg cmVkdWMtcGhpIGluIHRoZSBzYW1lIG5lc3QuIik7CiAgICAgICAgaWYgKFNU TVRfVklORk9fSU5fUEFUVEVSTl9QIChkc3RtdF92aW5mbykpCiAgCWRzdG10 X3ZpbmZvID0gdmluZm9fZm9yX3N0bXQgKFNUTVRfVklORk9fUkVMQVRFRF9T VE1UIChkc3RtdF92aW5mbykpOwogICAgICAgIGdjY19hc3NlcnQgKFNUTVRf VklORk9fUkVMRVZBTlQgKGRzdG10X3ZpbmZvKSA8IHZlY3RfdXNlZF9ieV9y ZWR1Y3Rpb24pOwoqKioqKioqKioqKioqKiogcHJvY2Vzc191c2UgKHRyZWUg c3RtdCwgdHJlZSB1c2UsIGxvb3BfdgoqKiogMjM2NSwyMzcwICoqKioKLS0t IDI0MjMsMjQ5NSAtLS0tCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0K ICAKKyAgIC8qIGNhc2UgM2E6IG91dGVyLWxvb3Agc3RtdCBkZWZpbmluZyBh biBpbm5lci1sb29wIHN0bXQ6CisgCW91dGVyLWxvb3AtaGVhZGVyLWJiOgor IAkJZCA9IGRlZl9zdG10CisgCWlubmVyLWxvb3A6CisgCQlzdG10ICMgdXNl IChkKQorIAlvdXRlci1sb29wLXRhaWwtYmI6CisgCQkuLi4JCSAgKi8KKyAg IGlmIChmbG93X2xvb3BfbmVzdGVkX3AgKGRlZl9iYi0+bG9vcF9mYXRoZXIs IGJiLT5sb29wX2ZhdGhlcikpCisgICAgIHsKKyAgICAgICBpZiAodmVjdF9w cmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKKyAJZnByaW50ZiAo dmVjdF9kdW1wLCAib3V0ZXItbG9vcCBkZWYtc3RtdCBkZWZpbmluZyBpbm5l ci1sb29wIHN0bXQuIik7CisgICAgICAgc3dpdGNoIChyZWxldmFudCkKKyAJ eworIAljYXNlIHZlY3RfdW51c2VkX2luX2xvb3A6CisgCSAgcmVsZXZhbnQg PSAoU1RNVF9WSU5GT19ERUZfVFlQRSAoc3RtdF92aW5mbykgPT0gdmVjdF9y ZWR1Y3Rpb25fZGVmKSA/CisgCQkJdmVjdF91c2VkX2J5X3JlZHVjdGlvbiA6 IHZlY3RfdW51c2VkX2luX2xvb3A7CisgCSAgYnJlYWs7CisgCWNhc2UgdmVj dF91c2VkX2luX291dGVyX2J5X3JlZHVjdGlvbjoKKyAJICByZWxldmFudCA9 IHZlY3RfdXNlZF9ieV9yZWR1Y3Rpb247CisgCSAgYnJlYWs7CisgCWNhc2Ug dmVjdF91c2VkX2luX291dGVyOgorIAkgIHJlbGV2YW50ID0gdmVjdF91c2Vk X2luX2xvb3A7CisgCSAgYnJlYWs7CisgCWNhc2UgdmVjdF91c2VkX2J5X3Jl ZHVjdGlvbjogCisgCWNhc2UgdmVjdF91c2VkX2luX2xvb3A6CisgCSAgYnJl YWs7CisgCisgCWRlZmF1bHQ6CisgCSAgZ2NjX3VucmVhY2hhYmxlICgpOwor IAl9ICAgCisgICAgIH0KKyAKKyAgIC8qIGNhc2UgM2I6IGlubmVyLWxvb3Ag c3RtdCBkZWZpbmluZyBhbiBvdXRlci1sb29wIHN0bXQ6CisgCW91dGVyLWxv b3AtaGVhZGVyLWJiOgorIAkJLi4uCisgCWlubmVyLWxvb3A6CisgCQlkID0g ZGVmX3N0bXQKKyAJb3V0ZXItbG9vcC10YWlsLWJiOgorIAkJc3RtdCAjIHVz ZSAoZCkJCSovCisgICBlbHNlIGlmIChmbG93X2xvb3BfbmVzdGVkX3AgKGJi LT5sb29wX2ZhdGhlciwgZGVmX2JiLT5sb29wX2ZhdGhlcikpCisgICAgIHsK KyAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRB SUxTKSkKKyAJZnByaW50ZiAodmVjdF9kdW1wLCAiaW5uZXItbG9vcCBkZWYt c3RtdCBkZWZpbmluZyBvdXRlci1sb29wIHN0bXQuIik7CisgICAgICAgc3dp dGNoIChyZWxldmFudCkKKyAgICAgICAgIHsKKyAgICAgICAgIGNhc2UgdmVj dF91bnVzZWRfaW5fbG9vcDoKKyAgICAgICAgICAgcmVsZXZhbnQgPSAoU1RN VF9WSU5GT19ERUZfVFlQRSAoc3RtdF92aW5mbykgPT0gdmVjdF9yZWR1Y3Rp b25fZGVmKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdF91c2Vk X2luX291dGVyX2J5X3JlZHVjdGlvbiA6IHZlY3RfdW51c2VkX2luX2xvb3A7 CisgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAgY2FzZSB2ZWN0X3Vz ZWRfaW5fb3V0ZXJfYnlfcmVkdWN0aW9uOgorICAgICAgICAgY2FzZSB2ZWN0 X3VzZWRfaW5fb3V0ZXI6CisgICAgICAgICAgIGJyZWFrOworIAorICAgICAg ICAgY2FzZSB2ZWN0X3VzZWRfYnlfcmVkdWN0aW9uOgorICAgICAgICAgICBy ZWxldmFudCA9IHZlY3RfdXNlZF9pbl9vdXRlcl9ieV9yZWR1Y3Rpb247Cisg ICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAgY2FzZSB2ZWN0X3VzZWRf aW5fbG9vcDoKKyAgICAgICAgICAgcmVsZXZhbnQgPSB2ZWN0X3VzZWRfaW5f b3V0ZXI7CisgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAgZGVmYXVs dDoKKyAgICAgICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOworICAgICAgICAg fQorICAgICB9CisgCiAgICB2ZWN0X21hcmtfcmVsZXZhbnQgKHdvcmtsaXN0 LCBkZWZfc3RtdCwgcmVsZXZhbnQsIGxpdmVfcCk7CiAgICByZXR1cm4gdHJ1 ZTsKICB9CioqKioqKioqKioqKioqKiB2ZWN0X21hcmtfc3RtdHNfdG9fYmVf dmVjdG9yaXplZCAobG9vcF92CioqKiAyNDczLDI0OTcgKioqKgogIAkgaWRl bnRpZnkgc3RtdHMgdGhhdCBhcmUgdXNlZCBzb2xlbHkgYnkgYSByZWR1Y3Rp b24sIGFuZCB0aGVyZWZvcmUgdGhlIAogIAkgb3JkZXIgb2YgdGhlIHJlc3Vs dHMgdGhhdCB0aGV5IHByb2R1Y2UgZG9lcyBub3QgaGF2ZSB0byBiZSBrZXB0 LgogIAohICAgICAgICAgIFJlZHVjdGlvbiBwaGlzIGFyZSBleHBlY3RlZCB0 byBiZSB1c2VkIGJ5IGEgcmVkdWN0aW9uIHN0bXQ7ICBPdGhlciAKISAJIHJl ZHVjdGlvbiBzdG10cyBhcmUgZXhwZWN0ZWQgdG8gYmUgdW51c2VkIGluIHRo ZSBsb29wLiAgVGhlc2UgYXJlIHRoZSAKISAJIGV4cGVjdGVkIHZhbHVlcyBv ZiAicmVsZXZhbnQiIGZvciByZWR1Y3Rpb24gcGhpcy9zdG10cyBpbiB0aGUg bG9vcDoKICAKICAJIHJlbGV2YW5jZToJCQkJcGhpCXN0bXQKICAJIHZlY3Rf dW51c2VkX2luX2xvb3AJCQkJb2sKICAJIHZlY3RfdXNlZF9ieV9yZWR1Y3Rp b24JCQlvawogIAkgdmVjdF91c2VkX2luX2xvb3AgCQkJCQkJICAqLwogIAog ICAgICAgIGlmIChTVE1UX1ZJTkZPX0RFRl9UWVBFIChzdG10X3ZpbmZvKSA9 PSB2ZWN0X3JlZHVjdGlvbl9kZWYpCiAgICAgICAgICB7CiEgCSAgc3dpdGNo IChyZWxldmFudCkKICAJICAgIHsKICAJICAgIGNhc2UgdmVjdF91bnVzZWRf aW5fbG9vcDoKICAJICAgICAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChzdG10 KSAhPSBQSElfTk9ERSk7CiAgCSAgICAgIGJyZWFrOwogIAkgICAgY2FzZSB2 ZWN0X3VzZWRfYnlfcmVkdWN0aW9uOgogIAkgICAgICBpZiAoVFJFRV9DT0RF IChzdG10KSA9PSBQSElfTk9ERSkKICAJCWJyZWFrOwogIAkgICAgY2FzZSB2 ZWN0X3VzZWRfaW5fbG9vcDoKICAJICAgIGRlZmF1bHQ6CiAgCSAgICAgIGlm ICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQotLS0g MjU5OCwyNjM1IC0tLS0KICAJIGlkZW50aWZ5IHN0bXRzIHRoYXQgYXJlIHVz ZWQgc29sZWx5IGJ5IGEgcmVkdWN0aW9uLCBhbmQgdGhlcmVmb3JlIHRoZSAK ICAJIG9yZGVyIG9mIHRoZSByZXN1bHRzIHRoYXQgdGhleSBwcm9kdWNlIGRv ZXMgbm90IGhhdmUgdG8gYmUga2VwdC4KICAKISAJIFJlZHVjdGlvbiBwaGlz IGFyZSBleHBlY3RlZCB0byBiZSB1c2VkIGJ5IGEgcmVkdWN0aW9uIHN0bXQs IG9yIGJ5CiEgCSBpbiBhbiBvdXRlciBsb29wOyAgT3RoZXIgcmVkdWN0aW9u IHN0bXRzIGFyZSBleHBlY3RlZCB0byBiZQohIAkgaW4gdGhlIGxvb3AsIGFu ZCBwb3NzaWJseSB1c2VkIGJ5IGEgc3RtdCBpbiBhbiBvdXRlciBsb29wLiAK ISAJIEhlcmUgYXJlIHRoZSBleHBlY3RlZCB2YWx1ZXMgb2YgInJlbGV2YW50 IiBmb3IgcmVkdWN0aW9uIHBoaXMvc3RtdHM6CiAgCiAgCSByZWxldmFuY2U6 CQkJCXBoaQlzdG10CiAgCSB2ZWN0X3VudXNlZF9pbl9sb29wCQkJCW9rCisg CSB2ZWN0X3VzZWRfaW5fb3V0ZXJfYnlfcmVkdWN0aW9uCW9rCW9rCisgCSB2 ZWN0X3VzZWRfaW5fb3V0ZXIJCQlvawlvawogIAkgdmVjdF91c2VkX2J5X3Jl ZHVjdGlvbgkJCW9rCiAgCSB2ZWN0X3VzZWRfaW5fbG9vcCAJCQkJCQkgICov CiAgCiAgICAgICAgaWYgKFNUTVRfVklORk9fREVGX1RZUEUgKHN0bXRfdmlu Zm8pID09IHZlY3RfcmVkdWN0aW9uX2RlZikKICAgICAgICAgIHsKISAJICBl bnVtIHZlY3RfcmVsZXZhbnQgdG1wX3JlbGV2YW50ID0gcmVsZXZhbnQ7CiEg CSAgc3dpdGNoICh0bXBfcmVsZXZhbnQpCiAgCSAgICB7CiAgCSAgICBjYXNl IHZlY3RfdW51c2VkX2luX2xvb3A6CiAgCSAgICAgIGdjY19hc3NlcnQgKFRS RUVfQ09ERSAoc3RtdCkgIT0gUEhJX05PREUpOworIAkgICAgICByZWxldmFu dCA9IHZlY3RfdXNlZF9ieV9yZWR1Y3Rpb247CisgCSAgICAgIGJyZWFrOwor IAorIAkgICAgY2FzZSB2ZWN0X3VzZWRfaW5fb3V0ZXJfYnlfcmVkdWN0aW9u OgorIAkgICAgY2FzZSB2ZWN0X3VzZWRfaW5fb3V0ZXI6CisgCSAgICAgIGdj Y19hc3NlcnQgKFRSRUVfQ09ERSAoc3RtdCkgIT0gV0lERU5fU1VNX0VYUFIK KyAJCQkgICYmIFRSRUVfQ09ERSAoc3RtdCkgIT0gRE9UX1BST0RfRVhQUik7 CiAgCSAgICAgIGJyZWFrOworIAogIAkgICAgY2FzZSB2ZWN0X3VzZWRfYnlf cmVkdWN0aW9uOgogIAkgICAgICBpZiAoVFJFRV9DT0RFIChzdG10KSA9PSBQ SElfTk9ERSkKICAJCWJyZWFrOworIAkgICAgICAvKiBmYWxsIHRocm91Z2gg Ki8KICAJICAgIGNhc2UgdmVjdF91c2VkX2luX2xvb3A6CiAgCSAgICBkZWZh dWx0OgogIAkgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9S VF9ERVRBSUxTKSkKKioqKioqKioqKioqKioqIHZlY3RfbWFya19zdG10c190 b19iZV92ZWN0b3JpemVkIChsb29wX3YKKioqIDI0OTksMjUwNSAqKioqCiAg CSAgICAgIFZFQ19mcmVlICh0cmVlLCBoZWFwLCB3b3JrbGlzdCk7CiAgCSAg ICAgIHJldHVybiBmYWxzZTsKICAJICAgIH0KLSAJICByZWxldmFudCA9IHZl Y3RfdXNlZF9ieV9yZWR1Y3Rpb247CiAgCSAgbGl2ZV9wID0gZmFsc2U7CQog IAl9CiAgCi0tLSAyNjM3LDI2NDIgLS0tLQoqKioqKioqKioqKioqKiogdmVj dF9nZXRfbG9vcF9uaXRlcnMgKHN0cnVjdCBsb29wICpsb29wLAoqKiogMjY0 MSwyNjUxICoqKioKICB9CiAgCiAgCiAgLyogRnVuY3Rpb24gdmVjdF9hbmFs eXplX2xvb3BfZm9ybS4KICAKISAgICBWZXJpZnkgdGhlIGZvbGxvd2luZyBy ZXN0cmljdGlvbnMgKHNvbWUgbWF5IGJlIHJlbGF4ZWQgaW4gdGhlIGZ1dHVy ZSk6CiEgICAgLSBpdCdzIGFuIGlubmVyLW1vc3QgbG9vcAohICAgIC0gbnVt YmVyIG9mIEJCcyA9IDIgKHdoaWNoIGFyZSB0aGUgbG9vcCBoZWFkZXIgYW5k IHRoZSBsYXRjaCkKICAgICAtIHRoZSBsb29wIGhhcyBhIHByZS1oZWFkZXIK ICAgICAtIHRoZSBsb29wIGhhcyBhIHNpbmdsZSBlbnRyeSBhbmQgZXhpdAog ICAgIC0gdGhlIGxvb3AgZXhpdCBjb25kaXRpb24gaXMgc2ltcGxlIGVub3Vn aCwgYW5kIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucwotLS0gMjc3OCwyODE2 IC0tLS0KICB9CiAgCiAgCisgLyogRnVuY3Rpb24gdmVjdF9hbmFseXplX2xv b3BfMS4KKyAKKyAgICBBcHBseSBhIHNldCBvZiBhbmFseXNlcyBvbiBMT09Q LCBhbmQgY3JlYXRlIGEgbG9vcF92ZWNfaW5mbyBzdHJ1Y3QKKyAgICBmb3Ig aXQuIFRoZSBkaWZmZXJlbnQgYW5hbHlzZXMgd2lsbCByZWNvcmQgaW5mb3Jt YXRpb24gaW4gdGhlCisgICAgbG9vcF92ZWNfaW5mbyBzdHJ1Y3QuICBUaGlz IGlzIGEgc3Vic2V0IG9mIHRoZSBhbmFseXNlcyBhcHBsaWVkIGluCisgICAg dmVjdF9hbmFseXplX2xvb3AsIHRvIGJlIGFwcGxpZWQgb24gYW4gaW5uZXIt bG9vcCBuZXN0ZWQgaW4gdGhlIGxvb3AKKyAgICB0aGF0IGlzIG5vdyBjb25z aWRlcmVkIGZvciAob3V0ZXItbG9vcCkgdmVjdG9yaXphdGlvbi4gICovCisg Cisgc3RhdGljIGxvb3BfdmVjX2luZm8KKyB2ZWN0X2FuYWx5emVfbG9vcF8x IChzdHJ1Y3QgbG9vcCAqbG9vcCkKKyB7CisgICBsb29wX3ZlY19pbmZvIGxv b3BfdmluZm87CisgCisgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJF UE9SVF9ERVRBSUxTKSkKKyAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiPT09 PT0gYW5hbHl6ZV9sb29wX25lc3RfMSA9PT09PSIpOworIAorICAgLyogQ2hl Y2sgdGhlIENGRyBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGxvb3AgKG5lc3Rp bmcsIGVudHJ5L2V4aXQsIGV0Yy4gICovCisgCisgICBsb29wX3ZpbmZvID0g dmVjdF9hbmFseXplX2xvb3BfZm9ybSAobG9vcCk7CisgICBpZiAoIWxvb3Bf dmluZm8pCisgICAgIHsKKyAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2lu Zm8gKFJFUE9SVF9ERVRBSUxTKSkKKyAgICAgICAgIGZwcmludGYgKHZlY3Rf ZHVtcCwgImJhZCBpbm5lci1sb29wIGZvcm0uIik7CisgICAgICAgcmV0dXJu IE5VTEw7CisgICAgIH0KKyAKKyAgIHJldHVybiBsb29wX3ZpbmZvOworIH0K KyAKKyAKICAvKiBGdW5jdGlvbiB2ZWN0X2FuYWx5emVfbG9vcF9mb3JtLgog IAohICAgIFZlcmlmeSB0aGF0IGNlcnRhaW4gQ0ZHIHJlc3RyaWN0aW9ucyBo b2xkLCBpbmNsdWRpbmc6CiAgICAgLSB0aGUgbG9vcCBoYXMgYSBwcmUtaGVh ZGVyCiAgICAgLSB0aGUgbG9vcCBoYXMgYSBzaW5nbGUgZW50cnkgYW5kIGV4 aXQKICAgICAtIHRoZSBsb29wIGV4aXQgY29uZGl0aW9uIGlzIHNpbXBsZSBl bm91Z2gsIGFuZCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKioqKioqKioq KioqKioqIHZlY3RfYW5hbHl6ZV9sb29wX2Zvcm0gKHN0cnVjdCBsb29wICps b28KKioqIDI2NTcsMjY4NyAqKioqCiAgICBsb29wX3ZlY19pbmZvIGxvb3Bf dmluZm87CiAgICB0cmVlIGxvb3BfY29uZDsKICAgIHRyZWUgbnVtYmVyX29m X2l0ZXJhdGlvbnMgPSBOVUxMOwogIAogICAgaWYgKHZlY3RfcHJpbnRfZHVt cF9pbmZvIChSRVBPUlRfREVUQUlMUykpCiAgICAgIGZwcmludGYgKHZlY3Rf ZHVtcCwgIj09PSB2ZWN0X2FuYWx5emVfbG9vcF9mb3JtID09PSIpOwogIAoh ICAgaWYgKGxvb3AtPmlubmVyKQogICAgICB7CiEgICAgICAgaWYgKHZlY3Rf cHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfT1VURVJfTE9PUFMpKQohICAgICAg ICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rvcml6ZWQ6IG5lc3Rl ZCBsb29wLiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CiAgICAK ICAgIGlmICghc2luZ2xlX2V4aXQgKGxvb3ApIAotICAgICAgIHx8IGxvb3At Pm51bV9ub2RlcyAhPSAyCiAgICAgICAgfHwgRURHRV9DT1VOVCAobG9vcC0+ aGVhZGVyLT5wcmVkcykgIT0gMikKICAgICAgewogICAgICAgIGlmICh2ZWN0 X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0JBRF9GT1JNX0xPT1BTKSkKICAg ICAgICAgIHsKICAgICAgICAgICAgaWYgKCFzaW5nbGVfZXhpdCAobG9vcCkp CiAgICAgICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rv cml6ZWQ6IG11bHRpcGxlIGV4aXRzLiIpOwotICAgICAgICAgICBlbHNlIGlm IChsb29wLT5udW1fbm9kZXMgIT0gMikKLSAgICAgICAgICAgICBmcHJpbnRm ICh2ZWN0X2R1bXAsICJub3QgdmVjdG9yaXplZDogdG9vIG1hbnkgQkJzIGlu IGxvb3AuIik7CiAgICAgICAgICAgIGVsc2UgaWYgKEVER0VfQ09VTlQgKGxv b3AtPmhlYWRlci0+cHJlZHMpICE9IDIpCiAgICAgICAgICAgICAgZnByaW50 ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rvcml6ZWQ6IHRvbyBtYW55IGluY29t aW5nIGVkZ2VzLiIpOwogICAgICAgICAgfQohIAogICAgICAgIHJldHVybiBO VUxMOwogICAgICB9CiAgCi0tLSAyODIyLDI5NTUgLS0tLQogICAgbG9vcF92 ZWNfaW5mbyBsb29wX3ZpbmZvOwogICAgdHJlZSBsb29wX2NvbmQ7CiAgICB0 cmVlIG51bWJlcl9vZl9pdGVyYXRpb25zID0gTlVMTDsKKyAgIGxvb3BfdmVj X2luZm8gaW5uZXJfbG9vcF92aW5mbyA9IE5VTEw7CiAgCiAgICBpZiAodmVj dF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKICAgICAgZnBy aW50ZiAodmVjdF9kdW1wLCAiPT09IHZlY3RfYW5hbHl6ZV9sb29wX2Zvcm0g PT09Iik7CiAgCiEgICAvKiBEaWZmZXJlbnQgcmVzdHJpY3Rpb25zIGFwcGx5 IHdoZW4gd2UgYXJlIGNvbnNpZGVyaW5nIGFuIGlubmVyLW1vc3QgbG9vcCwK ISAgICAgIHZzLiBhbiBvdXRlciAobmVzdGVkKSBsb29wLiAgCiEgICAgICAo Rk9STk9XLiBNYXkgd2FudCB0byByZWxheCBzb21lIG9mIHRoZXNlIHJlc3Ry aWN0aW9ucyBpbiB0aGUgZnV0dXJlKS4gICovCiEgCiEgICBpZiAoIWxvb3At PmlubmVyKQohICAgICB7CiEgICAgICAgLyogSW5uZXItbW9zdCBsb29wLiAg V2UgY3VycmVudGx5IHJlcXVpcmUgdGhhdCB0aGUgbnVtYmVyIG9mIEJCcyBp cyAKISAJIGV4YWN0bHkgMiAodGhlIGhlYWRlciBhbmQgbGF0Y2gpLiAgVmVj dG9yaXphYmxlIGlubmVyLW1vc3QgbG9vcHMgCiEgCSBsb29rIGxpa2UgdGhp czoKISAKISAgICAgICAgICAgICAgICAgICAgICAgICAocHJlLWhlYWRlcikK ISAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiEgICAgICAgICAgICAg ICAgICAgICAgICAgICBoZWFkZXIgPC0tLS0tLS0tKwohICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgIHwKISAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICstLT4gbGF0Y2ggLS0rCiEgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfAohICAgICAgICAgICAgICAgICAgICAgICAg IChleGl0LWJiKSAgKi8KISAKISAgICAgICBpZiAobG9vcC0+bnVtX25vZGVz ICE9IDIpCiEgICAgICAgICB7CiEgICAgICAgICAgIGlmICh2ZWN0X3ByaW50 X2R1bXBfaW5mbyAoUkVQT1JUX0JBRF9GT1JNX0xPT1BTKSkKISAgICAgICAg ICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJub3QgdmVjdG9yaXplZDogdG9v IG1hbnkgQkJzIGluIGxvb3AuIik7CiEgICAgICAgICAgIHJldHVybiBOVUxM OwohICAgICAgICAgfQohIAohICAgICAgIGlmIChlbXB0eV9ibG9ja19wIChs b29wLT5oZWFkZXIpKQogICAgICB7CiEgICAgICAgICAgIGlmICh2ZWN0X3By aW50X2R1bXBfaW5mbyAoUkVQT1JUX0JBRF9GT1JNX0xPT1BTKSkKISAgICAg ICAgICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJub3QgdmVjdG9yaXplZDog ZW1wdHkgbG9vcC4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQor ICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICBzdHJ1Y3QgbG9vcCAq aW5uZXJsb29wID0gbG9vcC0+aW5uZXI7CisgICAgICAgZWRnZSBiYWNrZWRn ZSwgZW50cnllZGdlOworIAorICAgICAgIC8qIE5lc3RlZCBsb29wLiBXZSBj dXJyZW50bHkgcmVxdWlyZSB0aGF0IHRoZSBsb29wIGlzIGRvdWJseS1uZXN0 ZWQsCisgCSBjb250YWlucyBhIHNpbmdsZSBpbm5lciBsb29wLCBhbmQgdGhl IG51bWJlciBvZiBCQnMgaXMgZXhhY3RseSA1LiAKKyAJIFZlY3Rvcml6YWJs ZSBvdXRlci1sb29wcyBsb29rIGxpa2UgdGhpczoKKyAKKyAJCQkocHJlLWhl YWRlcikKKyAJCQkgICB8CisgCQkJICBoZWFkZXIgPC0tLSsKKyAJCQkgICB8 ICAgICAgICAgfAorIAkJICAgICAgICAgIGlubmVyLWxvb3AgfAorIAkJCSAg IHwgICAgICAgICB8CisgCQkJICB0YWlsIC0tLS0tLSsKKyAJCQkgICB8IAor IAkJICAgICAgICAoZXhpdC1iYikKKyAKKyAJIFRoZSBpbm5lci1sb29wIGhh cyB0aGUgcHJvcGVydGllcyBleHBlY3RlZCBvZiBpbm5lci1tb3N0IGxvb3Bz CisgCSBhcyBkZXNjcmliZWQgYWJvdmUuICAqLworIAorICAgICAgIGlmICgo bG9vcC0+aW5uZXIpLT5pbm5lciB8fCAobG9vcC0+aW5uZXIpLT5uZXh0KQor IAl7CisgCSAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFE X0ZPUk1fTE9PUFMpKQorIAkgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90 IHZlY3Rvcml6ZWQ6IG11bHRpcGxlIG5lc3RlZCBsb29wcy4iKTsKKyAJICBy ZXR1cm4gTlVMTDsKKyAJfQorIAorICAgICAgIC8qIEFuYWx5emUgdGhlIGlu bmVyLWxvb3AuICAqLworICAgICAgIGlubmVyX2xvb3BfdmluZm8gPSB2ZWN0 X2FuYWx5emVfbG9vcF8xIChsb29wLT5pbm5lcik7CisgICAgICAgaWYgKCFp bm5lcl9sb29wX3ZpbmZvKQorIAl7CisgCSAgaWYgKHZlY3RfcHJpbnRfZHVt cF9pbmZvIChSRVBPUlRfQkFEX0ZPUk1fTE9PUFMpKQorICAgICAgICAgICAg IGZwcmludGYgKHZlY3RfZHVtcCwgIm5vdCB2ZWN0b3JpemVkOiBCYWQgaW5u ZXIgbG9vcC4iKTsKKyAJICByZXR1cm4gTlVMTDsKKyAJfQorIAorICAgICAg IGlmICghZXhwcl9pbnZhcmlhbnRfaW5fbG9vcF9wIChsb29wLAorIAkJCQkJ TE9PUF9WSU5GT19OSVRFUlMgKGlubmVyX2xvb3BfdmluZm8pKSkKKyAJewor IAkgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0JBRF9GT1JN X0xPT1BTKSkKKyAJICAgIGZwcmludGYgKHZlY3RfZHVtcCwKKyAJCSAgICAg Im5vdCB2ZWN0b3JpemVkOiBpbm5lci1sb29wIGNvdW50IG5vdCBpbnZhcmlh bnQuIik7CisgCSAgZGVzdHJveV9sb29wX3ZlY19pbmZvIChpbm5lcl9sb29w X3ZpbmZvLCB0cnVlKTsKKyAJICByZXR1cm4gTlVMTDsKKyAJfQorIAorICAg ICAgIGlmIChsb29wLT5udW1fbm9kZXMgIT0gNSkgCisgICAgICAgICB7Cisg CSAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFEX0ZPUk1f TE9PUFMpKQorIAkgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rv cml6ZWQ6IHRvbyBtYW55IEJCcyBpbiBsb29wLiIpOworIAkgIGRlc3Ryb3lf bG9vcF92ZWNfaW5mbyAoaW5uZXJfbG9vcF92aW5mbywgdHJ1ZSk7CisgCSAg cmV0dXJuIE5VTEw7CisgICAgICAgICB9CisgCisgICAgICAgZ2NjX2Fzc2Vy dCAoRURHRV9DT1VOVCAoaW5uZXJsb29wLT5oZWFkZXItPnByZWRzKSA9PSAy KTsKKyAgICAgICBiYWNrZWRnZSA9IEVER0VfUFJFRCAoaW5uZXJsb29wLT5o ZWFkZXIsIDEpOwkgIAorICAgICAgIGVudHJ5ZWRnZSA9IEVER0VfUFJFRCAo aW5uZXJsb29wLT5oZWFkZXIsIDApOworICAgICAgIGlmIChFREdFX1BSRUQg KGlubmVybG9vcC0+aGVhZGVyLCAwKS0+c3JjID09IGlubmVybG9vcC0+bGF0 Y2gpCisgCXsKKyAJICBiYWNrZWRnZSA9IEVER0VfUFJFRCAoaW5uZXJsb29w LT5oZWFkZXIsIDApOworIAkgIGVudHJ5ZWRnZSA9IEVER0VfUFJFRCAoaW5u ZXJsb29wLT5oZWFkZXIsIDEpOwkKKyAJfQorIAkKKyAgICAgICBpZiAoZW50 cnllZGdlLT5zcmMgIT0gbG9vcC0+aGVhZGVyCisgCSAgfHwgIXNpbmdsZV9l eGl0IChpbm5lcmxvb3ApCisgCSAgfHwgc2luZ2xlX2V4aXQgKGlubmVybG9v cCktPmRlc3QgIT0gIEVER0VfUFJFRCAobG9vcC0+bGF0Y2gsIDApLT5zcmMp CisgCXsKKyAJICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9C QURfRk9STV9MT09QUykpCisgCSAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJu b3QgdmVjdG9yaXplZDogdW5zdXBwb3J0ZWQgb3V0ZXJsb29wIGZvcm0uIik7 CisgCSAgZGVzdHJveV9sb29wX3ZlY19pbmZvIChpbm5lcl9sb29wX3ZpbmZv LCB0cnVlKTsKKyAJICByZXR1cm4gTlVMTDsKKyAJfQorIAorICAgICAgIGlm ICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQorICAg ICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiQ29uc2lkZXJpbmcgb3V0ZXIt bG9vcCB2ZWN0b3JpemF0aW9uLiIpOworICAgICB9CiAgICAKICAgIGlmICgh c2luZ2xlX2V4aXQgKGxvb3ApIAogICAgICAgIHx8IEVER0VfQ09VTlQgKGxv b3AtPmhlYWRlci0+cHJlZHMpICE9IDIpCiAgICAgIHsKICAgICAgICBpZiAo dmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9CQURfRk9STV9MT09QUykp CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICghc2luZ2xlX2V4aXQgKGxv b3ApKQogICAgICAgICAgICAgIGZwcmludGYgKHZlY3RfZHVtcCwgIm5vdCB2 ZWN0b3JpemVkOiBtdWx0aXBsZSBleGl0cy4iKTsKICAgICAgICAgICAgZWxz ZSBpZiAoRURHRV9DT1VOVCAobG9vcC0+aGVhZGVyLT5wcmVkcykgIT0gMikK ICAgICAgICAgICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJub3QgdmVjdG9y aXplZDogdG9vIG1hbnkgaW5jb21pbmcgZWRnZXMuIik7CiAgICAgICAgICB9 CiEgICAgICAgaWYgKGlubmVyX2xvb3BfdmluZm8pCiEgCWRlc3Ryb3lfbG9v cF92ZWNfaW5mbyAoaW5uZXJfbG9vcF92aW5mbywgdHJ1ZSk7CiAgICAgICAg cmV0dXJuIE5VTEw7CiAgICAgIH0KICAKKioqKioqKioqKioqKioqIHZlY3Rf YW5hbHl6ZV9sb29wX2Zvcm0gKHN0cnVjdCBsb29wICpsb28KKioqIDI2OTQs MjY5OSAqKioqCi0tLSAyOTYyLDI5NjkgLS0tLQogICAgICB7CiAgICAgICAg aWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFEX0ZPUk1fTE9P UFMpKQogICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rv cml6ZWQ6IHVuZXhwZWN0ZWQgbG9vcCBmb3JtLiIpOworICAgICAgIGlmIChp bm5lcl9sb29wX3ZpbmZvKQorIAlkZXN0cm95X2xvb3BfdmVjX2luZm8gKGlu bmVyX2xvb3BfdmluZm8sIHRydWUpOwogICAgICAgIHJldHVybiBOVUxMOwog ICAgICB9CiAgCioqKioqKioqKioqKioqKiB2ZWN0X2FuYWx5emVfbG9vcF9m b3JtIChzdHJ1Y3QgbG9vcCAqbG9vCioqKiAyNzExLDI3MzIgKioqKgogIAl7 CiAgCSAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFEX0ZP Uk1fTE9PUFMpKQogIAkgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90IHZl Y3Rvcml6ZWQ6IGFibm9ybWFsIGxvb3AgZXhpdCBlZGdlLiIpOwogIAkgIHJl dHVybiBOVUxMOwogIAl9CiAgICAgIH0KICAKLSAgIGlmIChlbXB0eV9ibG9j a19wIChsb29wLT5oZWFkZXIpKQotICAgICB7Ci0gICAgICAgaWYgKHZlY3Rf cHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFEX0ZPUk1fTE9PUFMpKQotICAg ICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rvcml6ZWQ6IGVt cHR5IGxvb3AuIik7Ci0gICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgIH0KLSAK ICAgIGxvb3BfY29uZCA9IHZlY3RfZ2V0X2xvb3Bfbml0ZXJzIChsb29wLCAm bnVtYmVyX29mX2l0ZXJhdGlvbnMpOwogICAgaWYgKCFsb29wX2NvbmQpCiAg ICAgIHsKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9S VF9CQURfRk9STV9MT09QUykpCiAgCWZwcmludGYgKHZlY3RfZHVtcCwgIm5v dCB2ZWN0b3JpemVkOiBjb21wbGljYXRlZCBleGl0IGNvbmRpdGlvbi4iKTsK ICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQogICAgCi0tLSAyOTgxLDI5 OTkgLS0tLQogIAl7CiAgCSAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChS RVBPUlRfQkFEX0ZPUk1fTE9PUFMpKQogIAkgICAgZnByaW50ZiAodmVjdF9k dW1wLCAibm90IHZlY3Rvcml6ZWQ6IGFibm9ybWFsIGxvb3AgZXhpdCBlZGdl LiIpOworIAkgIGlmIChpbm5lcl9sb29wX3ZpbmZvKQorIAkgICAgZGVzdHJv eV9sb29wX3ZlY19pbmZvIChpbm5lcl9sb29wX3ZpbmZvLCB0cnVlKTsKICAJ ICByZXR1cm4gTlVMTDsKICAJfQogICAgICB9CiAgCiAgICBsb29wX2NvbmQg PSB2ZWN0X2dldF9sb29wX25pdGVycyAobG9vcCwgJm51bWJlcl9vZl9pdGVy YXRpb25zKTsKICAgIGlmICghbG9vcF9jb25kKQogICAgICB7CiAgICAgICAg aWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFEX0ZPUk1fTE9P UFMpKQogIAlmcHJpbnRmICh2ZWN0X2R1bXAsICJub3QgdmVjdG9yaXplZDog Y29tcGxpY2F0ZWQgZXhpdCBjb25kaXRpb24uIik7CisgICAgICAgaWYgKGlu bmVyX2xvb3BfdmluZm8pCisgCWRlc3Ryb3lfbG9vcF92ZWNfaW5mbyAoaW5u ZXJfbG9vcF92aW5mbywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAg ICAgIH0KICAgIAoqKioqKioqKioqKioqKiogdmVjdF9hbmFseXplX2xvb3Bf Zm9ybSAoc3RydWN0IGxvb3AgKmxvbwoqKiogMjczNSwyNzQwICoqKioKLS0t IDMwMDIsMzAwOSAtLS0tCiAgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9p bmZvIChSRVBPUlRfQkFEX0ZPUk1fTE9PUFMpKQogIAlmcHJpbnRmICh2ZWN0 X2R1bXAsIAogIAkJICJub3QgdmVjdG9yaXplZDogbnVtYmVyIG9mIGl0ZXJh dGlvbnMgY2Fubm90IGJlIGNvbXB1dGVkLiIpOworICAgICAgIGlmIChpbm5l cl9sb29wX3ZpbmZvKQorIAlkZXN0cm95X2xvb3BfdmVjX2luZm8gKGlubmVy X2xvb3BfdmluZm8sIHRydWUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAg ICB9CiAgCioqKioqKioqKioqKioqKiB2ZWN0X2FuYWx5emVfbG9vcF9mb3Jt IChzdHJ1Y3QgbG9vcCAqbG9vCioqKiAyNzQyLDI3NDggKioqKgogICAgICB7 CiAgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfQkFE X0ZPUk1fTE9PUFMpKQogICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAi SW5maW5pdGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIik7CiEgICAgICAgcmV0 dXJuIGZhbHNlOwogICAgICB9CiAgCiAgICBpZiAoIU5JVEVSU19LTk9XTl9Q IChudW1iZXJfb2ZfaXRlcmF0aW9ucykpCi0tLSAzMDExLDMwMTkgLS0tLQog ICAgICB7CiAgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBP UlRfQkFEX0ZPUk1fTE9PUFMpKQogICAgICAgICAgZnByaW50ZiAodmVjdF9k dW1wLCAiSW5maW5pdGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIik7CiEgICAg ICAgaWYgKGlubmVyX2xvb3BfdmluZm8pCiEgCWRlc3Ryb3lfbG9vcF92ZWNf aW5mbyAoaW5uZXJfbG9vcF92aW5mbywgdHJ1ZSk7CiEgICAgICAgcmV0dXJu IE5VTEw7CiAgICAgIH0KICAKICAgIGlmICghTklURVJTX0tOT1dOX1AgKG51 bWJlcl9vZl9pdGVyYXRpb25zKSkKKioqKioqKioqKioqKioqIHZlY3RfYW5h bHl6ZV9sb29wX2Zvcm0gKHN0cnVjdCBsb29wICpsb28KKioqIDI3NTcsMjc2 OCAqKioqCiAgICAgIHsKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2lu Zm8gKFJFUE9SVF9VTlZFQ1RPUklaRURfTE9PUFMpKQogICAgICAgICAgZnBy aW50ZiAodmVjdF9kdW1wLCAibm90IHZlY3Rvcml6ZWQ6IG51bWJlciBvZiBp dGVyYXRpb25zID0gMC4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAg fQogIAogICAgbG9vcF92aW5mbyA9IG5ld19sb29wX3ZlY19pbmZvIChsb29w KTsKICAgIExPT1BfVklORk9fTklURVJTIChsb29wX3ZpbmZvKSA9IG51bWJl cl9vZl9pdGVyYXRpb25zOwohICAgTE9PUF9WSU5GT19FWElUX0NPTkQgKGxv b3BfdmluZm8pID0gbG9vcF9jb25kOwogIAogICAgZ2NjX2Fzc2VydCAoIWxv b3AtPmF1eCk7CiAgICBsb29wLT5hdXggPSBsb29wX3ZpbmZvOwotLS0gMzAy OCwzMDQ2IC0tLS0KICAgICAgewogICAgICAgIGlmICh2ZWN0X3ByaW50X2R1 bXBfaW5mbyAoUkVQT1JUX1VOVkVDVE9SSVpFRF9MT09QUykpCiAgICAgICAg ICBmcHJpbnRmICh2ZWN0X2R1bXAsICJub3QgdmVjdG9yaXplZDogbnVtYmVy IG9mIGl0ZXJhdGlvbnMgPSAwLiIpOworICAgICAgIGlmIChpbm5lcl9sb29w X3ZpbmZvKQorICAgICAgICAgZGVzdHJveV9sb29wX3ZlY19pbmZvIChpbm5l cl9sb29wX3ZpbmZvLCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAg ICAgIH0KICAKICAgIGxvb3BfdmluZm8gPSBuZXdfbG9vcF92ZWNfaW5mbyAo bG9vcCk7CiAgICBMT09QX1ZJTkZPX05JVEVSUyAobG9vcF92aW5mbykgPSBu dW1iZXJfb2ZfaXRlcmF0aW9uczsKISAKISAgIFNUTVRfVklORk9fVFlQRSAo dmluZm9fZm9yX3N0bXQgKGxvb3BfY29uZCkpID0gbG9vcF9leGl0X2N0cmxf dmVjX2luZm9fdHlwZTsKISAKISAgIC8qIENIRUNLTUU6IE1heSB3YW50IHRv IGtlZXAgaXQgYXJvdW5kIGl0IGluIHRoZSBmdXR1cmUuICAqLwohICAgaWYg KGlubmVyX2xvb3BfdmluZm8pCiEgICAgIGRlc3Ryb3lfbG9vcF92ZWNfaW5m byAoaW5uZXJfbG9vcF92aW5mbywgZmFsc2UpOwogIAogICAgZ2NjX2Fzc2Vy dCAoIWxvb3AtPmF1eCk7CiAgICBsb29wLT5hdXggPSBsb29wX3ZpbmZvOwoq KioqKioqKioqKioqKiogdmVjdF9hbmFseXplX2xvb3AgKHN0cnVjdCBsb29w ICpsb29wKQoqKiogMjc4NCwyNzg5ICoqKioKLS0tIDMwNjIsMzA3NiAtLS0t CiAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxT KSkKICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiPT09PT0gYW5hbHl6ZV9s b29wX25lc3QgPT09PT0iKTsKICAKKyAgIGlmIChsb29wX291dGVyIChsb29w KSAKKyAgICAgICAmJiBsb29wX3ZlY19pbmZvX2Zvcl9sb29wIChsb29wX291 dGVyIChsb29wKSkKKyAgICAgICAmJiBMT09QX1ZJTkZPX1ZFQ1RPUklaQUJM RV9QIChsb29wX3ZlY19pbmZvX2Zvcl9sb29wIChsb29wX291dGVyIChsb29w KSkpKQorICAgICB7CisgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZv IChSRVBPUlRfREVUQUlMUykpCisgCWZwcmludGYgKHZlY3RfZHVtcCwgIm91 dGVyLWxvb3AgYWxyZWFkeSB2ZWN0b3JpemVkLiIpOworICAgICAgIHJldHVy biBOVUxMOworICAgICB9CisgCiAgICAvKiBDaGVjayB0aGUgQ0ZHIGNoYXJh Y3RlcmlzdGljcyBvZiB0aGUgbG9vcCAobmVzdGluZywgZW50cnkvZXhpdCwg ZXRjLiAgKi8KICAKICAgIGxvb3BfdmluZm8gPSB2ZWN0X2FuYWx5emVfbG9v cF9mb3JtIChsb29wKTsKKioqKioqKioqKioqKioqIHZlY3RfYW5hbHl6ZV9s b29wIChzdHJ1Y3QgbG9vcCAqbG9vcCkKKioqIDI4MDUsMjgxMSAqKioqCiAg ICAgIHsKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9S VF9ERVRBSUxTKSkKICAJZnByaW50ZiAodmVjdF9kdW1wLCAiYmFkIGRhdGEg cmVmZXJlbmNlcy4iKTsKISAgICAgICBkZXN0cm95X2xvb3BfdmVjX2luZm8g KGxvb3BfdmluZm8pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CiAg Ci0tLSAzMDkyLDMwOTggLS0tLQogICAgICB7CiAgICAgICAgaWYgKHZlY3Rf cHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVUQUlMUykpCiAgCWZwcmludGYg KHZlY3RfZHVtcCwgImJhZCBkYXRhIHJlZmVyZW5jZXMuIik7CiEgICAgICAg ZGVzdHJveV9sb29wX3ZlY19pbmZvIChsb29wX3ZpbmZvLCB0cnVlKTsKICAg ICAgICByZXR1cm4gTlVMTDsKICAgICAgfQogIAoqKioqKioqKioqKioqKiog dmVjdF9hbmFseXplX2xvb3AgKHN0cnVjdCBsb29wICpsb29wKQoqKiogMjgy MywyODI5ICoqKioKICAgICAgewogICAgICAgIGlmICh2ZWN0X3ByaW50X2R1 bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQogIAlmcHJpbnRmICh2ZWN0X2R1 bXAsICJ1bmV4cGVjdGVkIHBhdHRlcm4uIik7CiEgICAgICAgZGVzdHJveV9s b29wX3ZlY19pbmZvIChsb29wX3ZpbmZvKTsKICAgICAgICByZXR1cm4gTlVM TDsKICAgICAgfQogIAotLS0gMzExMCwzMTE2IC0tLS0KICAgICAgewogICAg ICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMp KQogIAlmcHJpbnRmICh2ZWN0X2R1bXAsICJ1bmV4cGVjdGVkIHBhdHRlcm4u Iik7CiEgICAgICAgZGVzdHJveV9sb29wX3ZlY19pbmZvIChsb29wX3ZpbmZv LCB0cnVlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQogIAoqKioq KioqKioqKioqKiogdmVjdF9hbmFseXplX2xvb3AgKHN0cnVjdCBsb29wICps b29wKQoqKiogMjgzNSwyODQxICoqKioKICAgICAgewogICAgICAgIGlmICh2 ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQogIAlmcHJp bnRmICh2ZWN0X2R1bXAsICJiYWQgZGF0YSBhbGlnbm1lbnQuIik7CiEgICAg ICAgZGVzdHJveV9sb29wX3ZlY19pbmZvIChsb29wX3ZpbmZvKTsKICAgICAg ICByZXR1cm4gTlVMTDsKICAgICAgfQogIAotLS0gMzEyMiwzMTI4IC0tLS0K ICAgICAgewogICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQ T1JUX0RFVEFJTFMpKQogIAlmcHJpbnRmICh2ZWN0X2R1bXAsICJiYWQgZGF0 YSBhbGlnbm1lbnQuIik7CiEgICAgICAgZGVzdHJveV9sb29wX3ZlY19pbmZv IChsb29wX3ZpbmZvLCB0cnVlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAg ICAgfQogIAoqKioqKioqKioqKioqKiogdmVjdF9hbmFseXplX2xvb3AgKHN0 cnVjdCBsb29wICpsb29wKQoqKiogMjg0NCwyODUwICoqKioKICAgICAgewog ICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJ TFMpKQogICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiY2FuJ3QgZGV0 ZXJtaW5lIHZlY3Rvcml6YXRpb24gZmFjdG9yLiIpOwohICAgICAgIGRlc3Ry b3lfbG9vcF92ZWNfaW5mbyAobG9vcF92aW5mbyk7CiAgICAgICAgcmV0dXJu IE5VTEw7CiAgICAgIH0KICAKLS0tIDMxMzEsMzEzNyAtLS0tCiAgICAgIHsK ICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRB SUxTKSkKICAgICAgICAgIGZwcmludGYgKHZlY3RfZHVtcCwgImNhbid0IGRl dGVybWluZSB2ZWN0b3JpemF0aW9uIGZhY3Rvci4iKTsKISAgICAgICBkZXN0 cm95X2xvb3BfdmVjX2luZm8gKGxvb3BfdmluZm8sIHRydWUpOwogICAgICAg IHJldHVybiBOVUxMOwogICAgICB9CiAgCioqKioqKioqKioqKioqKiB2ZWN0 X2FuYWx5emVfbG9vcCAoc3RydWN0IGxvb3AgKmxvb3ApCioqKiAyODU2LDI4 NjIgKioqKgogICAgICB7CiAgICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9p bmZvIChSRVBPUlRfREVUQUlMUykpCiAgCWZwcmludGYgKHZlY3RfZHVtcCwg ImJhZCBkYXRhIGRlcGVuZGVuY2UuIik7CiEgICAgICAgZGVzdHJveV9sb29w X3ZlY19pbmZvIChsb29wX3ZpbmZvKTsKICAgICAgICByZXR1cm4gTlVMTDsK ICAgICAgfQogIAotLS0gMzE0MywzMTQ5IC0tLS0KICAgICAgewogICAgICAg IGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQog IAlmcHJpbnRmICh2ZWN0X2R1bXAsICJiYWQgZGF0YSBkZXBlbmRlbmNlLiIp OwohICAgICAgIGRlc3Ryb3lfbG9vcF92ZWNfaW5mbyAobG9vcF92aW5mbywg dHJ1ZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAKKioqKioq KioqKioqKioqIHZlY3RfYW5hbHl6ZV9sb29wIChzdHJ1Y3QgbG9vcCAqbG9v cCkKKioqIDI4NjgsMjg3NCAqKioqCiAgICAgIHsKICAgICAgICBpZiAodmVj dF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKICAJZnByaW50 ZiAodmVjdF9kdW1wLCAiYmFkIGRhdGEgYWNjZXNzLiIpOwohICAgICAgIGRl c3Ryb3lfbG9vcF92ZWNfaW5mbyAobG9vcF92aW5mbyk7CiAgICAgICAgcmV0 dXJuIE5VTEw7CiAgICAgIH0KICAKLS0tIDMxNTUsMzE2MSAtLS0tCiAgICAg IHsKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9E RVRBSUxTKSkKICAJZnByaW50ZiAodmVjdF9kdW1wLCAiYmFkIGRhdGEgYWNj ZXNzLiIpOwohICAgICAgIGRlc3Ryb3lfbG9vcF92ZWNfaW5mbyAobG9vcF92 aW5mbywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAK KioqKioqKioqKioqKioqIHZlY3RfYW5hbHl6ZV9sb29wIChzdHJ1Y3QgbG9v cCAqbG9vcCkKKioqIDI4ODAsMjg4NiAqKioqCiAgICAgIHsKICAgICAgICBp ZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKICAJ ZnByaW50ZiAodmVjdF9kdW1wLCAiYmFkIGRhdGEgYWxpZ25tZW50LiIpOwoh ICAgICAgIGRlc3Ryb3lfbG9vcF92ZWNfaW5mbyAobG9vcF92aW5mbyk7CiAg ICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAKLS0tIDMxNjcsMzE3MyAt LS0tCiAgICAgIHsKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8g KFJFUE9SVF9ERVRBSUxTKSkKICAJZnByaW50ZiAodmVjdF9kdW1wLCAiYmFk IGRhdGEgYWxpZ25tZW50LiIpOwohICAgICAgIGRlc3Ryb3lfbG9vcF92ZWNf aW5mbyAobG9vcF92aW5mbywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7 CiAgICAgIH0KICAKKioqKioqKioqKioqKioqIHZlY3RfYW5hbHl6ZV9sb29w IChzdHJ1Y3QgbG9vcCAqbG9vcCkKKioqIDI4OTIsMjg5OCAqKioqCiAgICAg IHsKICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9E RVRBSUxTKSkKICAJZnByaW50ZiAodmVjdF9kdW1wLCAiYmFkIG9wZXJhdGlv biBvciB1bnN1cHBvcnRlZCBsb29wIGJvdW5kLiIpOwohICAgICAgIGRlc3Ry b3lfbG9vcF92ZWNfaW5mbyAobG9vcF92aW5mbyk7CiAgICAgICAgcmV0dXJu IE5VTEw7CiAgICAgIH0KICAKLS0tIDMxNzksMzE4NSAtLS0tCiAgICAgIHsK ICAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRB SUxTKSkKICAJZnByaW50ZiAodmVjdF9kdW1wLCAiYmFkIG9wZXJhdGlvbiBv ciB1bnN1cHBvcnRlZCBsb29wIGJvdW5kLiIpOwohICAgICAgIGRlc3Ryb3lf bG9vcF92ZWNfaW5mbyAobG9vcF92aW5mbywgdHJ1ZSk7CiAgICAgICAgcmV0 dXJuIE5VTEw7CiAgICAgIH0KICAKSW5kZXg6IHRyZWUtdmVjdC1wYXR0ZXJu cy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRyZWUtdmVjdC1wYXR0 ZXJucy5jCShyZXZpc2lvbiAxMjczNTYpCi0tLSB0cmVlLXZlY3QtcGF0dGVy bnMuYwkod29ya2luZyBjb3B5KQoqKioqKioqKioqKioqKiogd2lkZW5lZF9u YW1lX3AgKHRyZWUgbmFtZSwgdHJlZSB1c2Vfc3RtdAoqKiogMTQ4LDE1NCAq KioqCiAgICAgKiBSZXR1cm4gdmFsdWU6IEEgbmV3IHN0bXQgdGhhdCB3aWxs IGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgc2VxdWVuY2Ugb2YKICAgICBzdG10 cyB0aGF0IGNvbnN0aXR1dGUgdGhlIHBhdHRlcm4uIEluIHRoaXMgY2FzZSBp dCB3aWxsIGJlOgogICAgICAgICAgV0lERU5fRE9UX1BST0RVQ1QgPHhfdCwg eV90LCBzdW1fMD4KISAqLwogIAogIHN0YXRpYyB0cmVlCiAgdmVjdF9yZWNv Z19kb3RfcHJvZF9wYXR0ZXJuICh0cmVlIGxhc3Rfc3RtdCwgdHJlZSAqdHlw ZV9pbiwgdHJlZSAqdHlwZV9vdXQpCi0tLSAxNDgsMTYxIC0tLS0KICAgICAq IFJldHVybiB2YWx1ZTogQSBuZXcgc3RtdCB0aGF0IHdpbGwgYmUgdXNlZCB0 byByZXBsYWNlIHRoZSBzZXF1ZW5jZSBvZgogICAgIHN0bXRzIHRoYXQgY29u c3RpdHV0ZSB0aGUgcGF0dGVybi4gSW4gdGhpcyBjYXNlIGl0IHdpbGwgYmU6 CiAgICAgICAgICBXSURFTl9ET1RfUFJPRFVDVCA8eF90LCB5X3QsIHN1bV8w PgohIAohICAgIE5vdGU6IFRoZSBkb3QtcHJvZCBpZGlvbSBpcyBhIHdpZGVu aW5nIHJlZHVjdGlvbiBwYXR0ZXJuIHRoYXQgaXMKISAgICAgICAgICB2ZWN0 b3JpemVkIHdpdGhvdXQgcHJlc2VydmluZyBhbGwgdGhlIGludGVybWVkaWF0 ZSByZXN1bHRzLiBJdAohICAgICAgICAgIHByb2R1Y2VzIG9ubHkgTi8yICh3 aWRlbmVkKSByZXN1bHRzIChieSBzdW1taW5nIHVwIHBhaXJzIG9mCiEgICAg ICAgICAgaW50ZXJtZWRpYXRlIHJlc3VsdHMpIHJhdGhlciB0aGFuIGFsbCBO IHJlc3VsdHMuICBUaGVyZWZvcmUsIHdlCiEgICAgICAgICAgY2Fubm90IGFs bG93IHRoaXMgcGF0dGVybiB3aGVuIHdlIHdhbnQgdG8gZ2V0IGFsbCB0aGUg cmVzdWx0cyBhbmQgaW4KISAgICAgICAgICB0aGUgY29ycmVjdCBvcmRlciAo YXMgaXMgdGhlIGNhc2Ugd2hlbiB0aGlzIGNvbXB1dGF0aW9uIGlzIGluIGFu CiEgICAgICAgICAgaW5uZXItbG9vcCBuZXN0ZWQgaW4gYW4gb3V0ZXItbG9v cCB0aGF0IHVzIGJlaW5nIHZlY3Rvcml6ZWQpLiAgKi8KICAKICBzdGF0aWMg dHJlZQogIHZlY3RfcmVjb2dfZG90X3Byb2RfcGF0dGVybiAodHJlZSBsYXN0 X3N0bXQsIHRyZWUgKnR5cGVfaW4sIHRyZWUgKnR5cGVfb3V0KQoqKioqKioq KioqKioqKiogdmVjdF9yZWNvZ19kb3RfcHJvZF9wYXR0ZXJuICh0cmVlIGxh c3RfcwoqKiogMTYwLDE2NSAqKioqCi0tLSAxNjcsMTc0IC0tLS0KICAgIHRy ZWUgdHlwZSwgaGFsZl90eXBlOwogICAgdHJlZSBwYXR0ZXJuX2V4cHI7CiAg ICB0cmVlIHByb2RfdHlwZTsKKyAgIGxvb3BfdmVjX2luZm8gbG9vcF9pbmZv ID0gU1RNVF9WSU5GT19MT09QX1ZJTkZPIChzdG10X3ZpbmZvKTsKKyAgIHN0 cnVjdCBsb29wICpsb29wID0gTE9PUF9WSU5GT19MT09QIChsb29wX2luZm8p OwogIAogICAgaWYgKFRSRUVfQ09ERSAobGFzdF9zdG10KSAhPSBHSU1QTEVf TU9ESUZZX1NUTVQpCiAgICAgIHJldHVybiBOVUxMOwoqKioqKioqKioqKioq KiogdmVjdF9yZWNvZ19kb3RfcHJvZF9wYXR0ZXJuICh0cmVlIGxhc3Rfcwoq KiogMjQyLDI0NyAqKioqCi0tLSAyNTEsMjYwIC0tLS0KICAgIGdjY19hc3Nl cnQgKHN0bXRfdmluZm8pOwogICAgaWYgKFNUTVRfVklORk9fREVGX1RZUEUg KHN0bXRfdmluZm8pICE9IHZlY3RfbG9vcF9kZWYpCiAgICAgIHJldHVybiBO VUxMOworICAgLyogRk9STk9XLiBDYW4gY29udGludWUgYW5hbHl6aW5nIHRo ZSBkZWYtdXNlIGNoYWluIHdoZW4gdGhpcyBzdG10IGluIGEgcGhpIAorICAg ICAgaW5zaWRlIHRoZSBsb29wIChpbiBjYXNlIHdlIGFyZSBhbmFseXppbmcg YW4gb3V0ZXItbG9vcCkuICAqLworICAgaWYgKFRSRUVfQ09ERSAoc3RtdCkg IT0gR0lNUExFX01PRElGWV9TVE1UKQorICAgICByZXR1cm4gTlVMTDsgCiAg ICBleHByID0gR0lNUExFX1NUTVRfT1BFUkFORCAoc3RtdCwgMSk7CiAgICBp ZiAoVFJFRV9DT0RFIChleHByKSAhPSBNVUxUX0VYUFIpCiAgICAgIHJldHVy biBOVUxMOwoqKioqKioqKioqKioqKiogdmVjdF9yZWNvZ19kb3RfcHJvZF9w YXR0ZXJuICh0cmVlIGxhc3RfcwoqKiogMjk1LDMwMCAqKioqCi0tLSAzMDgs MzIzIC0tLS0KICAgICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJ2ZWN0X3Jl Y29nX2RvdF9wcm9kX3BhdHRlcm46IGRldGVjdGVkOiAiKTsKICAgICAgICBw cmludF9nZW5lcmljX2V4cHIgKHZlY3RfZHVtcCwgcGF0dGVybl9leHByLCBU REZfU0xJTSk7CiAgICAgIH0KKyAKKyAgIC8qIFdlIGRvbid0IGFsbG93IGNo YW5naW5nIHRoZSBvcmRlciBvZiB0aGUgY29tcHV0YXRpb24gaW4gdGhlIGlu bmVyLWxvb3AKKyAgICAgIHdoZW4gZG9pbmcgb3V0ZXItbG9vcCB2ZWN0b3Jp emF0aW9uLiAgKi8KKyAgIGlmIChuZXN0ZWRfaW5fdmVjdF9sb29wX3AgKGxv b3AsIGxhc3Rfc3RtdCkpCisgICAgIHsKKyAgICAgICBpZiAodmVjdF9wcmlu dF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKKyAgICAgICAgIGZwcmlu dGYgKHZlY3RfZHVtcCwgInZlY3RfcmVjb2dfZG90X3Byb2RfcGF0dGVybjog bm90IGFsbG93ZWQuIik7CisgICAgICAgcmV0dXJuIE5VTEw7CisgICAgIH0K KyAKICAgIHJldHVybiBwYXR0ZXJuX2V4cHI7CiAgfQogIAoqKioqKioqKioq KioqKiogdmVjdF9yZWNvZ19wb3dfcGF0dGVybiAodHJlZSBsYXN0X3N0bXQs IAoqKiogNTIxLDUyNyAqKioqCiAgICAgKiBSZXR1cm4gdmFsdWU6IEEgbmV3 IHN0bXQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgc2VxdWVu Y2Ugb2YKICAgICBzdG10cyB0aGF0IGNvbnN0aXR1dGUgdGhlIHBhdHRlcm4u IEluIHRoaXMgY2FzZSBpdCB3aWxsIGJlOgogICAgICAgICAgV0lERU5fU1VN IDx4X3QsIHN1bV8wPgohICovCiAgCiAgc3RhdGljIHRyZWUKICB2ZWN0X3Jl Y29nX3dpZGVuX3N1bV9wYXR0ZXJuICh0cmVlIGxhc3Rfc3RtdCwgdHJlZSAq dHlwZV9pbiwgdHJlZSAqdHlwZV9vdXQpCi0tLSA1NDQsNTU3IC0tLS0KICAg ICAqIFJldHVybiB2YWx1ZTogQSBuZXcgc3RtdCB0aGF0IHdpbGwgYmUgdXNl ZCB0byByZXBsYWNlIHRoZSBzZXF1ZW5jZSBvZgogICAgIHN0bXRzIHRoYXQg Y29uc3RpdHV0ZSB0aGUgcGF0dGVybi4gSW4gdGhpcyBjYXNlIGl0IHdpbGwg YmU6CiAgICAgICAgICBXSURFTl9TVU0gPHhfdCwgc3VtXzA+CiEgCiEgICAg Tm90ZTogVGhlIHdpZG5laW5nLXN1bSBpZGlvbSBpcyBhIHdpZGVuaW5nIHJl ZHVjdGlvbiBwYXR0ZXJuIHRoYXQgaXMgCiEgCSB2ZWN0b3JpemVkIHdpdGhv dXQgcHJlc2VydmluZyBhbGwgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLiBJ dAohICAgICAgICAgIHByb2R1Y2VzIG9ubHkgTi8yICh3aWRlbmVkKSByZXN1 bHRzIChieSBzdW1taW5nIHVwIHBhaXJzIG9mIAohIAkgaW50ZXJtZWRpYXRl IHJlc3VsdHMpIHJhdGhlciB0aGFuIGFsbCBOIHJlc3VsdHMuICBUaGVyZWZv cmUsIHdlIAohIAkgY2Fubm90IGFsbG93IHRoaXMgcGF0dGVybiB3aGVuIHdl IHdhbnQgdG8gZ2V0IGFsbCB0aGUgcmVzdWx0cyBhbmQgaW4gCiEgCSB0aGUg Y29ycmVjdCBvcmRlciAoYXMgaXMgdGhlIGNhc2Ugd2hlbiB0aGlzIGNvbXB1 dGF0aW9uIGlzIGluIGFuIAohIAkgaW5uZXItbG9vcCBuZXN0ZWQgaW4gYW4g b3V0ZXItbG9vcCB0aGF0IHVzIGJlaW5nIHZlY3Rvcml6ZWQpLiAgKi8KICAK ICBzdGF0aWMgdHJlZQogIHZlY3RfcmVjb2dfd2lkZW5fc3VtX3BhdHRlcm4g KHRyZWUgbGFzdF9zdG10LCB0cmVlICp0eXBlX2luLCB0cmVlICp0eXBlX291 dCkKKioqKioqKioqKioqKioqIHZlY3RfcmVjb2dfd2lkZW5fc3VtX3BhdHRl cm4gKHRyZWUgbGFzdF8KKioqIDUzMSw1MzYgKioqKgotLS0gNTYxLDU2OCAt LS0tCiAgICBzdG10X3ZlY19pbmZvIHN0bXRfdmluZm8gPSB2aW5mb19mb3Jf c3RtdCAobGFzdF9zdG10KTsKICAgIHRyZWUgdHlwZSwgaGFsZl90eXBlOwog ICAgdHJlZSBwYXR0ZXJuX2V4cHI7CisgICBsb29wX3ZlY19pbmZvIGxvb3Bf aW5mbyA9IFNUTVRfVklORk9fTE9PUF9WSU5GTyAoc3RtdF92aW5mbyk7Cisg ICBzdHJ1Y3QgbG9vcCAqbG9vcCA9IExPT1BfVklORk9fTE9PUCAobG9vcF9p bmZvKTsKICAKICAgIGlmIChUUkVFX0NPREUgKGxhc3Rfc3RtdCkgIT0gR0lN UExFX01PRElGWV9TVE1UKQogICAgICByZXR1cm4gTlVMTDsKKioqKioqKioq KioqKioqIHZlY3RfcmVjb2dfd2lkZW5fc3VtX3BhdHRlcm4gKHRyZWUgbGFz dF8KKioqIDU4MCw1ODUgKioqKgotLS0gNjEyLDYyNyAtLS0tCiAgICAgICAg ZnByaW50ZiAodmVjdF9kdW1wLCAidmVjdF9yZWNvZ193aWRlbl9zdW1fcGF0 dGVybjogZGV0ZWN0ZWQ6ICIpOwogICAgICAgIHByaW50X2dlbmVyaWNfZXhw ciAodmVjdF9kdW1wLCBwYXR0ZXJuX2V4cHIsIFRERl9TTElNKTsKICAgICAg fQorIAorICAgLyogV2UgZG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIG9yZGVy IG9mIHRoZSBjb21wdXRhdGlvbiBpbiB0aGUgaW5uZXItbG9vcAorICAgICAg d2hlbiBkb2luZyBvdXRlci1sb29wIHZlY3Rvcml6YXRpb24uICAqLworICAg aWYgKG5lc3RlZF9pbl92ZWN0X2xvb3BfcCAobG9vcCwgbGFzdF9zdG10KSkK KyAgICAgeworICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQ T1JUX0RFVEFJTFMpKQorICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAi dmVjdF9yZWNvZ193aWRlbl9zdW1fcGF0dGVybjogbm90IGFsbG93ZWQuIik7 CisgICAgICAgcmV0dXJuIE5VTEw7CisgICAgIH0KKyAKICAgIHJldHVybiBw YXR0ZXJuX2V4cHI7CiAgfQogIApJbmRleDogdHJlZS12ZWN0LXRyYW5zZm9y bS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKioqIHRyZWUtdmVjdC10cmFu c2Zvcm0uYwkocmV2aXNpb24gMTI3MzU2KQotLS0gdHJlZS12ZWN0LXRyYW5z Zm9ybS5jCSh3b3JraW5nIGNvcHkpCioqKioqKioqKioqKioqKiB2ZWN0X2Vz dGltYXRlX21pbl9wcm9maXRhYmxlX2l0ZXJzIChsb29wCioqKiAxMjQsMTI5 ICoqKioKLS0tIDEyNCwxMzAgLS0tLQogICAgYmFzaWNfYmxvY2sgKmJicyA9 IExPT1BfVklORk9fQkJTIChsb29wX3ZpbmZvKTsKICAgIGludCBuYmJzID0g bG9vcC0+bnVtX25vZGVzOwogICAgaW50IGJ5dGVfbWlzYWxpZ247CisgICBp bnQgaW5uZXJsb29wX2l0ZXJzLCBmYWN0b3I7CiAgCiAgICAvKiBDb3N0IG1v ZGVsIGRpc2FibGVkLiAgKi8KICAgIGlmICghZmxhZ192ZWN0X2Nvc3RfbW9k ZWwpCioqKioqKioqKioqKioqKiB2ZWN0X2VzdGltYXRlX21pbl9wcm9maXRh YmxlX2l0ZXJzIChsb29wCioqKiAxNTIsMTYyICoqKioKLS0tIDE1MywxNzIg LS0tLQogICAgICAgVE9ETzogQ29uc2lkZXIgYXNzaWduaW5nIGRpZmZlcmVu dCBjb3N0cyB0byBkaWZmZXJlbnQgc2NhbGFyCiAgICAgICBzdGF0ZW1lbnRz LiAgKi8KICAKKyAgIC8qIEZPUk5PVy4gICovCisgICBpZiAobG9vcC0+aW5u ZXIpCisgICAgIGlubmVybG9vcF9pdGVycyA9IDUwOyAvKiBGSVhNRSAqLwor IAogICAgZm9yIChpID0gMDsgaSA8IG5iYnM7IGkrKykKICAgICAgewogICAg ICAgIGJsb2NrX3N0bXRfaXRlcmF0b3Igc2k7CiAgICAgICAgYmFzaWNfYmxv Y2sgYmIgPSBiYnNbaV07CiAgCisgICAgICAgaWYgKGJiLT5sb29wX2ZhdGhl ciA9PSBsb29wLT5pbm5lcikKKyAgCWZhY3RvciA9IGlubmVybG9vcF9pdGVy czsKKyAgICAgICBlbHNlCisgIAlmYWN0b3IgPSAxOworIAogICAgICAgIGZv ciAoc2kgPSBic2lfc3RhcnQgKGJiKTsgIWJzaV9lbmRfcCAoc2kpOyBic2lf bmV4dCAoJnNpKSkKICAgICAgICAgIHsKICAgICAgICAgICAgdHJlZSBzdG10 ID0gYnNpX3N0bXQgKHNpKTsKKioqKioqKioqKioqKioqIHZlY3RfZXN0aW1h dGVfbWluX3Byb2ZpdGFibGVfaXRlcnMgKGxvb3AKKioqIDE2NCwxNzEgKioq KgogICAgICAgICAgICBpZiAoIVNUTVRfVklORk9fUkVMRVZBTlRfUCAoc3Rt dF9pbmZvKQogICAgICAgICAgICAgICAgJiYgIVNUTVRfVklORk9fTElWRV9Q IChzdG10X2luZm8pKQogICAgICAgICAgICAgIGNvbnRpbnVlOwohICAgICAg ICAgICBzY2FsYXJfc2luZ2xlX2l0ZXJfY29zdCArPSBjb3N0X2Zvcl9zdG10 IChzdG10KTsKISAgICAgICAgICAgdmVjX2luc2lkZV9jb3N0ICs9IFNUTVRf VklORk9fSU5TSURFX09GX0xPT1BfQ09TVCAoc3RtdF9pbmZvKTsKICAgICAg ICAgICAgdmVjX291dHNpZGVfY29zdCArPSBTVE1UX1ZJTkZPX09VVFNJREVf T0ZfTE9PUF9DT1NUIChzdG10X2luZm8pOwogICAgICAgICAgfQogICAgICB9 Ci0tLSAxNzQsMTgzIC0tLS0KICAgICAgICAgICAgaWYgKCFTVE1UX1ZJTkZP X1JFTEVWQU5UX1AgKHN0bXRfaW5mbykKICAgICAgICAgICAgICAgICYmICFT VE1UX1ZJTkZPX0xJVkVfUCAoc3RtdF9pbmZvKSkKICAgICAgICAgICAgICBj b250aW51ZTsKISAgICAgICAgICAgc2NhbGFyX3NpbmdsZV9pdGVyX2Nvc3Qg Kz0gY29zdF9mb3Jfc3RtdCAoc3RtdCkgKiBmYWN0b3I7CiEgICAgICAgICAg IHZlY19pbnNpZGVfY29zdCArPSBTVE1UX1ZJTkZPX0lOU0lERV9PRl9MT09Q X0NPU1QgKHN0bXRfaW5mbykgKiBmYWN0b3I7CiEgCSAgLyogRklYTUU6IGZv ciBzdG10cyBpbiB0aGUgaW5uZXItbG9vcCBpbiBvdXRlci1sb29wIHZlY3Rv cml6YXRpb24sCiEgCSAgICAgc29tZSBvZiB0aGUgIm91dHNpZGUiIGNvc3Rz IGFyZSBnZW5lcmF0ZWQgaW5zaWRlIHRoZSBvdXRlci1sb29wLiAgKi8KICAg ICAgICAgICAgdmVjX291dHNpZGVfY29zdCArPSBTVE1UX1ZJTkZPX09VVFNJ REVfT0ZfTE9PUF9DT1NUIChzdG10X2luZm8pOwogICAgICAgICAgfQogICAg ICB9CioqKioqKioqKioqKioqKiB2ZWN0X2luaXRfdmVjdG9yICh0cmVlIHN0 bXQsIHRyZWUgdmVjdG9yCioqKiAxMDcxLDEwNzYgKioqKgotLS0gMTA4Mywx MDkxIC0tLS0KICAgIHRyZWUgbmV3X3RlbXA7CiAgICBiYXNpY19ibG9jayBu ZXdfYmI7CiAgIAorICAgaWYgKG5lc3RlZF9pbl92ZWN0X2xvb3BfcCAobG9v cCwgc3RtdCkpCisgICAgIGxvb3AgPSBsb29wLT5pbm5lcjsKKyAKICAgIG5l d192YXIgPSB2ZWN0X2dldF9uZXdfdmVjdF92YXIgKHZlY3Rvcl90eXBlLCB2 ZWN0X3NpbXBsZV92YXIsICJjc3RfIik7CiAgICBhZGRfcmVmZXJlbmNlZF92 YXIgKG5ld192YXIpOyAKICAgCioqKioqKioqKioqKioqKiB2ZWN0X2luaXRf dmVjdG9yICh0cmVlIHN0bXQsIHRyZWUgdmVjdG9yCioqKiAxMDk2LDExMDEg KioqKgotLS0gMTExMSwxMTE3IC0tLS0KICAvKiBGdW5jdGlvbiBnZXRfaW5p dGlhbF9kZWZfZm9yX2luZHVjdGlvbgogIAogICAgIElucHV0OgorICAgIFNU TVQgLSBhIHN0bXQgdGhhdCBwZXJmb3JtcyBhbiBpbmR1Y3Rpb24gb3BlcmF0 aW9uIGluIHRoZSBsb29wLgogICAgIElWX1BISSAtIHRoZSBpbml0aWFsIHZh bHVlIG9mIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUKICAKICAgICBPdXRwdXQ6 CioqKioqKioqKioqKioqKiBnZXRfaW5pdGlhbF9kZWZfZm9yX2luZHVjdGlv biAodHJlZSBpdl9wCioqKiAxMTE0LDExMjEgKioqKgogICAgdHJlZSB2ZWN0 eXBlID0gZ2V0X3ZlY3R5cGVfZm9yX3NjYWxhcl90eXBlIChzY2FsYXJfdHlw ZSk7CiAgICBpbnQgbnVuaXRzID0gIFRZUEVfVkVDVE9SX1NVQlBBUlRTICh2 ZWN0eXBlKTsKICAgIGVkZ2UgcGUgPSBsb29wX3ByZWhlYWRlcl9lZGdlIChs b29wKTsKICAgIGJhc2ljX2Jsb2NrIG5ld19iYjsKLSAgIGJsb2NrX3N0bXRf aXRlcmF0b3IgYnNpOwogICAgdHJlZSB2ZWMsIHZlY19pbml0LCB2ZWNfc3Rl cCwgdDsKICAgIHRyZWUgYWNjZXNzX2ZuOwogICAgdHJlZSBuZXdfdmFyOwot LS0gMTEzMCwxMTM3IC0tLS0KICAgIHRyZWUgdmVjdHlwZSA9IGdldF92ZWN0 eXBlX2Zvcl9zY2FsYXJfdHlwZSAoc2NhbGFyX3R5cGUpOwogICAgaW50IG51 bml0cyA9ICBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAodmVjdHlwZSk7CiAgICBl ZGdlIHBlID0gbG9vcF9wcmVoZWFkZXJfZWRnZSAobG9vcCk7CisgICBzdHJ1 Y3QgbG9vcCAqaXZfbG9vcDsKICAgIGJhc2ljX2Jsb2NrIG5ld19iYjsKICAg IHRyZWUgdmVjLCB2ZWNfaW5pdCwgdmVjX3N0ZXAsIHQ7CiAgICB0cmVlIGFj Y2Vzc19mbjsKICAgIHRyZWUgbmV3X3ZhcjsKKioqKioqKioqKioqKioqIGdl dF9pbml0aWFsX2RlZl9mb3JfaW5kdWN0aW9uICh0cmVlIGl2X3AKKioqIDEx MjksMTEzNiAqKioqCiAgICBpbnQgbmNvcGllcyA9IHZmIC8gbnVuaXRzOwog ICAgdHJlZSBleHByOwogICAgc3RtdF92ZWNfaW5mbyBwaGlfaW5mbyA9IHZp bmZvX2Zvcl9zdG10IChpdl9waGkpOwogICAgdHJlZSBzdG10czsKISAgIHRy ZWUgc3RtdCA9IE5VTExfVFJFRTsKICAgIGJsb2NrX3N0bXRfaXRlcmF0b3Ig c2k7CiAgICBiYXNpY19ibG9jayBiYiA9IGJiX2Zvcl9zdG10IChpdl9waGkp OwogIAotLS0gMTE0NSwxMTU3IC0tLS0KICAgIGludCBuY29waWVzID0gdmYg LyBudW5pdHM7CiAgICB0cmVlIGV4cHI7CiAgICBzdG10X3ZlY19pbmZvIHBo aV9pbmZvID0gdmluZm9fZm9yX3N0bXQgKGl2X3BoaSk7CisgICBib29sIG5l c3RlZF9pbl92ZWN0X2xvb3AgPSBmYWxzZTsKICAgIHRyZWUgc3RtdHM7CiEg ICBpbW1fdXNlX2l0ZXJhdG9yIGltbV9pdGVyOwohICAgdXNlX29wZXJhbmRf cCB1c2VfcDsKISAgIHRyZWUgZXhpdF9waGk7CiEgICBlZGdlIGxhdGNoX2U7 CiEgICB0cmVlIGxvb3BfYXJnOwogICAgYmxvY2tfc3RtdF9pdGVyYXRvciBz aTsKICAgIGJhc2ljX2Jsb2NrIGJiID0gYmJfZm9yX3N0bXQgKGl2X3BoaSk7 CiAgCioqKioqKioqKioqKioqKiBnZXRfaW5pdGlhbF9kZWZfZm9yX2luZHVj dGlvbiAodHJlZSBpdl9wCioqKiAxMTM5LDEyMDMgKioqKgogIAogICAgLyog RmluZCB0aGUgZmlyc3QgaW5zZXJ0aW9uIHBvaW50IGluIHRoZSBCQi4gICov CiAgICBzaSA9IGJzaV9hZnRlcl9sYWJlbHMgKGJiKTsKLSAgIHN0bXQgPSBi c2lfc3RtdCAoc2kpOwogIAohICAgYWNjZXNzX2ZuID0gYW5hbHl6ZV9zY2Fs YXJfZXZvbHV0aW9uIChsb29wLCBQSElfUkVTVUxUIChpdl9waGkpKTsKICAg IGdjY19hc3NlcnQgKGFjY2Vzc19mbik7CiEgICBvayA9IHZlY3RfaXNfc2lt cGxlX2l2X2V2b2x1dGlvbiAobG9vcC0+bnVtLCBhY2Nlc3NfZm4sCiEgCQkJ CSAgICAmaW5pdF9leHByLCAmc3RlcF9leHByKTsKICAgIGdjY19hc3NlcnQg KG9rKTsKICAKICAgIC8qIENyZWF0ZSB0aGUgdmVjdG9yIHRoYXQgaG9sZHMg dGhlIGluaXRpYWxfdmFsdWUgb2YgdGhlIGluZHVjdGlvbi4gICovCiEgICBu ZXdfdmFyID0gdmVjdF9nZXRfbmV3X3ZlY3RfdmFyIChzY2FsYXJfdHlwZSwg dmVjdF9zY2FsYXJfdmFyLCAidmFyXyIpOwohICAgYWRkX3JlZmVyZW5jZWRf dmFyIChuZXdfdmFyKTsKISAKISAgIG5ld19uYW1lID0gZm9yY2VfZ2ltcGxl X29wZXJhbmQgKGluaXRfZXhwciwgJnN0bXRzLCBmYWxzZSwgbmV3X3Zhcik7 CiEgICBpZiAoc3RtdHMpCiAgICAgIHsKISAgICAgICBuZXdfYmIgPSBic2lf aW5zZXJ0X29uX2VkZ2VfaW1tZWRpYXRlIChwZSwgc3RtdHMpOwohICAgICAg IGdjY19hc3NlcnQgKCFuZXdfYmIpOwogICAgICB9CiEgCiEgICB0ID0gTlVM TF9UUkVFOwohICAgdCA9IHRyZWVfY29ucyAoTlVMTF9UUkVFLCBuZXdfbmFt ZSwgdCk7CiEgICBmb3IgKGkgPSAxOyBpIDwgbnVuaXRzOyBpKyspCiAgICAg IHsKISAgICAgICB0cmVlIHRtcDsKICAKISAgICAgICAvKiBDcmVhdGU6IG5l d19uYW1lID0gbmV3X25hbWUgKyBzdGVwX2V4cHIgICovCiEgICAgICAgdG1w ID0gZm9sZF9idWlsZDIgKFBMVVNfRVhQUiwgc2NhbGFyX3R5cGUsIG5ld19u YW1lLCBzdGVwX2V4cHIpOwohICAgICAgIGluaXRfc3RtdCA9IGJ1aWxkX2dp bXBsZV9tb2RpZnlfc3RtdCAobmV3X3ZhciwgdG1wKTsKISAgICAgICBuZXdf bmFtZSA9IG1ha2Vfc3NhX25hbWUgKG5ld192YXIsIGluaXRfc3RtdCk7CiEg ICAgICAgR0lNUExFX1NUTVRfT1BFUkFORCAoaW5pdF9zdG10LCAwKSA9IG5l d19uYW1lOwogIAohICAgICAgIG5ld19iYiA9IGJzaV9pbnNlcnRfb25fZWRn ZV9pbW1lZGlhdGUgKHBlLCBpbml0X3N0bXQpOwohICAgICAgIGdjY19hc3Nl cnQgKCFuZXdfYmIpOwogIAohICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBf aW5mbyAoUkVQT1JUX0RFVEFJTFMpKQohICAgICAgICAgewohICAgICAgICAg ICBmcHJpbnRmICh2ZWN0X2R1bXAsICJjcmVhdGVkIG5ldyBpbml0X3N0bXQ6 ICIpOwohICAgICAgICAgICBwcmludF9nZW5lcmljX2V4cHIgKHZlY3RfZHVt cCwgaW5pdF9zdG10LCBUREZfU0xJTSk7CiEgICAgICAgICB9CiEgICAgICAg dCA9IHRyZWVfY29ucyAoTlVMTF9UUkVFLCBuZXdfbmFtZSwgdCk7CiAgICAg IH0KLSAgIHZlYyA9IGJ1aWxkX2NvbnN0cnVjdG9yX2Zyb21fbGlzdCAodmVj dHlwZSwgbnJldmVyc2UgKHQpKTsKLSAgIHZlY19pbml0ID0gdmVjdF9pbml0 X3ZlY3RvciAoc3RtdCwgdmVjLCB2ZWN0eXBlKTsKICAKICAKICAgIC8qIENy ZWF0ZSB0aGUgdmVjdG9yIHRoYXQgaG9sZHMgdGhlIHN0ZXAgb2YgdGhlIGlu ZHVjdGlvbi4gICovCiEgICBleHByID0gYnVpbGRfaW50X2NzdCAoc2NhbGFy X3R5cGUsIHZmKTsKISAgIG5ld19uYW1lID0gZm9sZF9idWlsZDIgKE1VTFRf RVhQUiwgc2NhbGFyX3R5cGUsIGV4cHIsIHN0ZXBfZXhwcik7CiAgICB0ID0g TlVMTF9UUkVFOwogICAgZm9yIChpID0gMDsgaSA8IG51bml0czsgaSsrKQog ICAgICB0ID0gdHJlZV9jb25zIChOVUxMX1RSRUUsIHVuc2hhcmVfZXhwciAo bmV3X25hbWUpLCB0KTsKICAgIHZlYyA9IGJ1aWxkX2NvbnN0cnVjdG9yX2Zy b21fbGlzdCAodmVjdHlwZSwgdCk7CiEgICB2ZWNfc3RlcCA9IHZlY3RfaW5p dF92ZWN0b3IgKHN0bXQsIHZlYywgdmVjdHlwZSk7CiAgCiAgCiAgICAvKiBD cmVhdGUgdGhlIGZvbGxvd2luZyBkZWYtdXNlIGN5Y2xlOgogICAgICAgbG9v cCBwcm9sb2c6CiEgICAgICAgICAgdmVjX2luaXQgPSBbWCwgWCtTLCBYKzIq UywgWCszKlNdCiEgCSB2ZWNfc3RlcCA9IFtWRipTLCBWRipTLCBWRipTLCBW RipTXQogICAgICAgbG9vcDoKICAgICAgICAgICB2ZWNfaXYgPSBQSEkgPHZl Y19pbml0LCB2ZWNfbG9vcD4KICAgICAgICAgICAuLi4KLS0tIDExNjAsMTI2 NiAtLS0tCiAgCiAgICAvKiBGaW5kIHRoZSBmaXJzdCBpbnNlcnRpb24gcG9p bnQgaW4gdGhlIEJCLiAgKi8KICAgIHNpID0gYnNpX2FmdGVyX2xhYmVscyAo YmIpOwogIAohICAgaWYgKElOVEVHUkFMX1RZUEVfUCAoc2NhbGFyX3R5cGUp KQohICAgICBzdGVwX2V4cHIgPSBidWlsZF9pbnRfY3N0IChzY2FsYXJfdHlw ZSwgMCk7CiEgICBlbHNlCiEgICAgIHN0ZXBfZXhwciA9IGJ1aWxkX3JlYWwg KHNjYWxhcl90eXBlLCBkY29uc3QwKTsKISAKISAgIC8qIElzIHBoaSBpbiBh biBpbm5lci1sb29wLCB3aGlsZSB2ZWN0b3JpemluZyBhbiBlbmNsb3Npbmcg b3V0ZXItbG9vcD8gICovCiEgICBpZiAobmVzdGVkX2luX3ZlY3RfbG9vcF9w IChsb29wLCBpdl9waGkpKQohICAgICB7CiEgICAgICAgbmVzdGVkX2luX3Zl Y3RfbG9vcCA9IHRydWU7CiEgICAgICAgaXZfbG9vcCA9IGxvb3AtPmlubmVy OwohICAgICB9CiEgICBlbHNlCiEgICAgIGl2X2xvb3AgPSBsb29wOwohICAg Z2NjX2Fzc2VydCAoaXZfbG9vcCA9PSAoYmJfZm9yX3N0bXQgKGl2X3BoaSkp LT5sb29wX2ZhdGhlcik7CiEgCiEgICBsYXRjaF9lID0gbG9vcF9sYXRjaF9l ZGdlIChpdl9sb29wKTsKISAgIGxvb3BfYXJnID0gUEhJX0FSR19ERUZfRlJP TV9FREdFIChpdl9waGksIGxhdGNoX2UpOwohIAohICAgYWNjZXNzX2ZuID0g YW5hbHl6ZV9zY2FsYXJfZXZvbHV0aW9uIChpdl9sb29wLCBQSElfUkVTVUxU IChpdl9waGkpKTsKICAgIGdjY19hc3NlcnQgKGFjY2Vzc19mbik7CiEgICBv ayA9IHZlY3RfaXNfc2ltcGxlX2l2X2V2b2x1dGlvbiAoaXZfbG9vcC0+bnVt LCBhY2Nlc3NfZm4sCiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICZpbml0X2V4cHIsICZzdGVwX2V4cHIpOwogICAgZ2NjX2Fzc2VydCAo b2spOworICAgcGUgPSBsb29wX3ByZWhlYWRlcl9lZGdlIChpdl9sb29wKTsK ICAKICAgIC8qIENyZWF0ZSB0aGUgdmVjdG9yIHRoYXQgaG9sZHMgdGhlIGlu aXRpYWxfdmFsdWUgb2YgdGhlIGluZHVjdGlvbi4gICovCiEgICBpZiAobmVz dGVkX2luX3ZlY3RfbG9vcCkKICAgICAgewohICAgICAgIC8qIGl2X2xvb3Ag aXMgbmVzdGVkIGluIHRoZSBsb29wIHRvIGJlIHZlY3Rvcml6ZWQuICBpbml0 X2V4cHIgaGFkIGFscmVhZHkKISAJIGJlZW4gY3JlYXRlZCBkdXJpbmcgdmVj dG9yaXphdGlvbiBvZiBwcmV2aW91cyBzdG10czsgV2Ugb2J0YWluIGl0IGZy b20KISAJIHRoZSBTVE1UX1ZJTkZPX1ZFQ19TVE1UIG9mIHRoZSBkZWZpbmlu ZyBzdG10LiAqLwohICAgICAgIHRyZWUgaXZfZGVmID0gUEhJX0FSR19ERUZf RlJPTV9FREdFIChpdl9waGksIGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGl2X2xv b3ApKTsKISAgICAgICB2ZWNfaW5pdCA9IHZlY3RfZ2V0X3ZlY19kZWZfZm9y X29wZXJhbmQgKGl2X2RlZiwgaXZfcGhpLCBOVUxMKTsKICAgICAgfQohICAg ZWxzZQogICAgICB7CiEgICAgICAgLyogaXZfbG9vcCBpcyB0aGUgbG9vcCB0 byBiZSB2ZWN0b3JpemVkLiBDcmVhdGU6CiEgCSB2ZWNfaW5pdCA9IFtYLCBY K1MsIFgrMipTLCBYKzMqU10gKFMgPSBzdGVwX2V4cHIsIFggPSBpbml0X2V4 cHIpICAqLwohICAgICAgIG5ld192YXIgPSB2ZWN0X2dldF9uZXdfdmVjdF92 YXIgKHNjYWxhcl90eXBlLCB2ZWN0X3NjYWxhcl92YXIsICJ2YXJfIik7CiEg ICAgICAgYWRkX3JlZmVyZW5jZWRfdmFyIChuZXdfdmFyKTsKISAKISAgICAg ICBuZXdfbmFtZSA9IGZvcmNlX2dpbXBsZV9vcGVyYW5kIChpbml0X2V4cHIs ICZzdG10cywgZmFsc2UsIG5ld192YXIpOwohICAgICAgIGlmIChzdG10cykK ISAJewohIAkgIG5ld19iYiA9IGJzaV9pbnNlcnRfb25fZWRnZV9pbW1lZGlh dGUgKHBlLCBzdG10cyk7CiEgCSAgZ2NjX2Fzc2VydCAoIW5ld19iYik7CiEg CX0KISAKISAgICAgICB0ID0gTlVMTF9UUkVFOwohICAgICAgIHQgPSB0cmVl X2NvbnMgKE5VTExfVFJFRSwgaW5pdF9leHByLCB0KTsKISAgICAgICBmb3Ig KGkgPSAxOyBpIDwgbnVuaXRzOyBpKyspCiEgCXsKISAJICB0cmVlIHRtcDsK ICAKISAJICAvKiBDcmVhdGU6IG5ld19uYW1lX2kgPSBuZXdfbmFtZSArIHN0 ZXBfZXhwciAgKi8KISAJICB0bXAgPSBmb2xkX2J1aWxkMiAoUExVU19FWFBS LCBzY2FsYXJfdHlwZSwgbmV3X25hbWUsIHN0ZXBfZXhwcik7CiEgCSAgaW5p dF9zdG10ID0gYnVpbGRfZ2ltcGxlX21vZGlmeV9zdG10IChuZXdfdmFyLCB0 bXApOwohIAkgIG5ld19uYW1lID0gbWFrZV9zc2FfbmFtZSAobmV3X3Zhciwg aW5pdF9zdG10KTsKISAJICBHSU1QTEVfU1RNVF9PUEVSQU5EIChpbml0X3N0 bXQsIDApID0gbmV3X25hbWU7CiAgCiEgCSAgbmV3X2JiID0gYnNpX2luc2Vy dF9vbl9lZGdlX2ltbWVkaWF0ZSAocGUsIGluaXRfc3RtdCk7CiEgCSAgZ2Nj X2Fzc2VydCAoIW5ld19iYik7CiAgCiEgCSAgaWYgKHZlY3RfcHJpbnRfZHVt cF9pbmZvIChSRVBPUlRfREVUQUlMUykpCiEgCSAgICB7CiEgCSAgICAgIGZw cmludGYgKHZlY3RfZHVtcCwgImNyZWF0ZWQgbmV3IGluaXRfc3RtdDogIik7 CiEgCSAgICAgIHByaW50X2dlbmVyaWNfZXhwciAodmVjdF9kdW1wLCBpbml0 X3N0bXQsIFRERl9TTElNKTsKISAJICAgIH0KISAJICB0ID0gdHJlZV9jb25z IChOVUxMX1RSRUUsIG5ld19uYW1lLCB0KTsKISAJfQohICAgICAgIC8qIENy ZWF0ZSBhIHZlY3RvciBmcm9tIFtuZXdfbmFtZV8wLCBuZXdfbmFtZV8xLCAu Li4sIG5ld19uYW1lX251bml0cy0xXSAgKi8KISAgICAgICB2ZWMgPSBidWls ZF9jb25zdHJ1Y3Rvcl9mcm9tX2xpc3QgKHZlY3R5cGUsIG5yZXZlcnNlICh0 KSk7CiEgICAgICAgdmVjX2luaXQgPSB2ZWN0X2luaXRfdmVjdG9yIChpdl9w aGksIHZlYywgdmVjdHlwZSk7CiAgICAgIH0KICAKICAKICAgIC8qIENyZWF0 ZSB0aGUgdmVjdG9yIHRoYXQgaG9sZHMgdGhlIHN0ZXAgb2YgdGhlIGluZHVj dGlvbi4gICovCiEgICBpZiAobmVzdGVkX2luX3ZlY3RfbG9vcCkKISAgICAg LyogaXZfbG9vcCBpcyBuZXN0ZWQgaW4gdGhlIGxvb3AgdG8gYmUgdmVjdG9y aXplZC4gR2VuZXJhdGU6CiEgICAgICAgIHZlY19zdGVwID0gW1MsIFMsIFMs IFNdICAqLwohICAgICBuZXdfbmFtZSA9IHN0ZXBfZXhwcjsKISAgIGVsc2UK ISAgICAgewohICAgICAgIC8qIGl2X2xvb3AgaXMgdGhlIGxvb3AgdG8gYmUg dmVjdG9yaXplZC4gR2VuZXJhdGU6CiEgCSAgdmVjX3N0ZXAgPSBbVkYqUywg VkYqUywgVkYqUywgVkYqU10gICovCiEgICAgICAgZXhwciA9IGJ1aWxkX2lu dF9jc3QgKHNjYWxhcl90eXBlLCB2Zik7CiEgICAgICAgbmV3X25hbWUgPSBm b2xkX2J1aWxkMiAoTVVMVF9FWFBSLCBzY2FsYXJfdHlwZSwgZXhwciwgc3Rl cF9leHByKTsKISAgICAgfQohIAogICAgdCA9IE5VTExfVFJFRTsKICAgIGZv ciAoaSA9IDA7IGkgPCBudW5pdHM7IGkrKykKICAgICAgdCA9IHRyZWVfY29u cyAoTlVMTF9UUkVFLCB1bnNoYXJlX2V4cHIgKG5ld19uYW1lKSwgdCk7CiAg ICB2ZWMgPSBidWlsZF9jb25zdHJ1Y3Rvcl9mcm9tX2xpc3QgKHZlY3R5cGUs IHQpOwohICAgdmVjX3N0ZXAgPSB2ZWN0X2luaXRfdmVjdG9yIChpdl9waGks IHZlYywgdmVjdHlwZSk7CiAgCiAgCiAgICAvKiBDcmVhdGUgdGhlIGZvbGxv d2luZyBkZWYtdXNlIGN5Y2xlOgogICAgICAgbG9vcCBwcm9sb2c6CiEgICAg ICAgICAgdmVjX2luaXQgPSAuLi4KISAJIHZlY19zdGVwID0gLi4uCiAgICAg ICBsb29wOgogICAgICAgICAgIHZlY19pdiA9IFBISSA8dmVjX2luaXQsIHZl Y19sb29wPgogICAgICAgICAgIC4uLgoqKioqKioqKioqKioqKiogZ2V0X2lu aXRpYWxfZGVmX2Zvcl9pbmR1Y3Rpb24gKHRyZWUgaXZfcAoqKiogMTIwOCwx MjE0ICoqKioKICAgIC8qIENyZWF0ZSB0aGUgaW5kdWN0aW9uLXBoaSB0aGF0 IGRlZmluZXMgdGhlIGluZHVjdGlvbi1vcGVyYW5kLiAgKi8KICAgIHZlY19k ZXN0ID0gdmVjdF9nZXRfbmV3X3ZlY3RfdmFyICh2ZWN0eXBlLCB2ZWN0X3Np bXBsZV92YXIsICJ2ZWNfaXZfIik7CiAgICBhZGRfcmVmZXJlbmNlZF92YXIg KHZlY19kZXN0KTsKISAgIGluZHVjdGlvbl9waGkgPSBjcmVhdGVfcGhpX25v ZGUgKHZlY19kZXN0LCBsb29wLT5oZWFkZXIpOwogICAgc2V0X3N0bXRfaW5m byAoZ2V0X3N0bXRfYW5uIChpbmR1Y3Rpb25fcGhpKSwKICAgICAgICAgICAg ICAgICAgIG5ld19zdG10X3ZlY19pbmZvIChpbmR1Y3Rpb25fcGhpLCBsb29w X3ZpbmZvKSk7CiAgICBpbmR1Y19kZWYgPSBQSElfUkVTVUxUIChpbmR1Y3Rp b25fcGhpKTsKLS0tIDEyNzEsMTI3NyAtLS0tCiAgICAvKiBDcmVhdGUgdGhl IGluZHVjdGlvbi1waGkgdGhhdCBkZWZpbmVzIHRoZSBpbmR1Y3Rpb24tb3Bl cmFuZC4gICovCiAgICB2ZWNfZGVzdCA9IHZlY3RfZ2V0X25ld192ZWN0X3Zh ciAodmVjdHlwZSwgdmVjdF9zaW1wbGVfdmFyLCAidmVjX2l2XyIpOwogICAg YWRkX3JlZmVyZW5jZWRfdmFyICh2ZWNfZGVzdCk7CiEgICBpbmR1Y3Rpb25f cGhpID0gY3JlYXRlX3BoaV9ub2RlICh2ZWNfZGVzdCwgaXZfbG9vcC0+aGVh ZGVyKTsKICAgIHNldF9zdG10X2luZm8gKGdldF9zdG10X2FubiAoaW5kdWN0 aW9uX3BoaSksCiAgICAgICAgICAgICAgICAgICBuZXdfc3RtdF92ZWNfaW5m byAoaW5kdWN0aW9uX3BoaSwgbG9vcF92aW5mbykpOwogICAgaW5kdWNfZGVm ID0gUEhJX1JFU1VMVCAoaW5kdWN0aW9uX3BoaSk7CioqKioqKioqKioqKioq KiBnZXRfaW5pdGlhbF9kZWZfZm9yX2luZHVjdGlvbiAodHJlZSBpdl9wCioq KiAxMjE5LDEyMzMgKioqKgogIAkJCQkJICAgICAgIGluZHVjX2RlZiwgdmVj X3N0ZXApKTsKICAgIHZlY19kZWYgPSBtYWtlX3NzYV9uYW1lICh2ZWNfZGVz dCwgbmV3X3N0bXQpOwogICAgR0lNUExFX1NUTVRfT1BFUkFORCAobmV3X3N0 bXQsIDApID0gdmVjX2RlZjsKISAgIGJzaSA9IGJzaV9mb3Jfc3RtdCAoc3Rt dCk7CiEgICB2ZWN0X2ZpbmlzaF9zdG10X2dlbmVyYXRpb24gKHN0bXQsIG5l d19zdG10LCAmYnNpKTsKICAKICAgIC8qIFNldCB0aGUgYXJndW1lbnRzIG9m IHRoZSBwaGkgbm9kZTogICovCiEgICBhZGRfcGhpX2FyZyAoaW5kdWN0aW9u X3BoaSwgdmVjX2luaXQsIGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApKTsK ISAgIGFkZF9waGlfYXJnIChpbmR1Y3Rpb25fcGhpLCB2ZWNfZGVmLCBsb29w X2xhdGNoX2VkZ2UgKGxvb3ApKTsKICAKICAKISAgIC8qIEluIGNhc2UgdGhl IHZlY3Rvcml6YXRpb24gZmFjdG9yIChWRikgaXMgYmlnZ2VyIHRoYW4gdGhl IG51bWJlcgogICAgICAgb2YgZWxlbWVudHMgdGhhdCB3ZSBjYW4gZml0IGlu IGEgdmVjdHlwZSAobnVuaXRzKSwgd2UgaGF2ZSB0byBnZW5lcmF0ZQogICAg ICAgbW9yZSB0aGFuIG9uZSB2ZWN0b3Igc3RtdCAtIGkuZSAtIHdlIG5lZWQg dG8gInVucm9sbCIgdGhlCiAgICAgICB2ZWN0b3Igc3RtdCBieSBhIGZhY3Rv ciBWRi9udW5pdHMuICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBkb2N1bWVudGF0 aW9uCi0tLSAxMjgyLDEyOTcgLS0tLQogIAkJCQkJICAgICAgIGluZHVjX2Rl ZiwgdmVjX3N0ZXApKTsKICAgIHZlY19kZWYgPSBtYWtlX3NzYV9uYW1lICh2 ZWNfZGVzdCwgbmV3X3N0bXQpOwogICAgR0lNUExFX1NUTVRfT1BFUkFORCAo bmV3X3N0bXQsIDApID0gdmVjX2RlZjsKISAgIGJzaV9pbnNlcnRfYmVmb3Jl ICgmc2ksIG5ld19zdG10LCBCU0lfU0FNRV9TVE1UKTsKISAgIHNldF9zdG10 X2luZm8gKGdldF9zdG10X2FubiAobmV3X3N0bXQpLAohIAkJIG5ld19zdG10 X3ZlY19pbmZvIChuZXdfc3RtdCwgbG9vcF92aW5mbykpOwogIAogICAgLyog U2V0IHRoZSBhcmd1bWVudHMgb2YgdGhlIHBoaSBub2RlOiAgKi8KISAgIGFk ZF9waGlfYXJnIChpbmR1Y3Rpb25fcGhpLCB2ZWNfaW5pdCwgcGUpOwohICAg YWRkX3BoaV9hcmcgKGluZHVjdGlvbl9waGksIHZlY19kZWYsIGxvb3BfbGF0 Y2hfZWRnZSAoaXZfbG9vcCkpOwogIAogIAohICAgLyogSW4gY2FzZSB0aGF0 IHZlY3Rvcml6YXRpb24gZmFjdG9yIChWRikgaXMgYmlnZ2VyIHRoYW4gdGhl IG51bWJlcgogICAgICAgb2YgZWxlbWVudHMgdGhhdCB3ZSBjYW4gZml0IGlu IGEgdmVjdHlwZSAobnVuaXRzKSwgd2UgaGF2ZSB0byBnZW5lcmF0ZQogICAg ICAgbW9yZSB0aGFuIG9uZSB2ZWN0b3Igc3RtdCAtIGkuZSAtIHdlIG5lZWQg dG8gInVucm9sbCIgdGhlCiAgICAgICB2ZWN0b3Igc3RtdCBieSBhIGZhY3Rv ciBWRi9udW5pdHMuICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBkb2N1bWVudGF0 aW9uCioqKioqKioqKioqKioqKiBnZXRfaW5pdGlhbF9kZWZfZm9yX2luZHVj dGlvbiAodHJlZSBpdl9wCioqKiAxMjM2LDEyNDEgKioqKgotLS0gMTMwMCwx MzA3IC0tLS0KICAgIGlmIChuY29waWVzID4gMSkKICAgICAgewogICAgICAg IHN0bXRfdmVjX2luZm8gcHJldl9zdG10X3ZpbmZvOworICAgICAgIC8qIEZP Uk5PVy4gVGhpcyByZXN0cmljdGlvbiBzaG91bGQgYmUgcmVsYXhlZC4gICov CisgICAgICAgZ2NjX2Fzc2VydCAoIW5lc3RlZF9pbl92ZWN0X2xvb3ApOwog IAogICAgICAgIC8qIENyZWF0ZSB0aGUgdmVjdG9yIHRoYXQgaG9sZHMgdGhl IHN0ZXAgb2YgdGhlIGluZHVjdGlvbi4gICovCiAgICAgICAgZXhwciA9IGJ1 aWxkX2ludF9jc3QgKHNjYWxhcl90eXBlLCBudW5pdHMpOwoqKioqKioqKioq KioqKiogZ2V0X2luaXRpYWxfZGVmX2Zvcl9pbmR1Y3Rpb24gKHRyZWUgaXZf cAoqKiogMTI0NCwxMjUwICoqKioKICAgICAgICBmb3IgKGkgPSAwOyBpIDwg bnVuaXRzOyBpKyspCiAgCXQgPSB0cmVlX2NvbnMgKE5VTExfVFJFRSwgdW5z aGFyZV9leHByIChuZXdfbmFtZSksIHQpOwogICAgICAgIHZlYyA9IGJ1aWxk X2NvbnN0cnVjdG9yX2Zyb21fbGlzdCAodmVjdHlwZSwgdCk7CiEgICAgICAg dmVjX3N0ZXAgPSB2ZWN0X2luaXRfdmVjdG9yIChzdG10LCB2ZWMsIHZlY3R5 cGUpOwogIAogICAgICAgIHZlY19kZWYgPSBpbmR1Y19kZWY7CiAgICAgICAg cHJldl9zdG10X3ZpbmZvID0gdmluZm9fZm9yX3N0bXQgKGluZHVjdGlvbl9w aGkpOwotLS0gMTMxMCwxMzE2IC0tLS0KICAgICAgICBmb3IgKGkgPSAwOyBp IDwgbnVuaXRzOyBpKyspCiAgCXQgPSB0cmVlX2NvbnMgKE5VTExfVFJFRSwg dW5zaGFyZV9leHByIChuZXdfbmFtZSksIHQpOwogICAgICAgIHZlYyA9IGJ1 aWxkX2NvbnN0cnVjdG9yX2Zyb21fbGlzdCAodmVjdHlwZSwgdCk7CiEgICAg ICAgdmVjX3N0ZXAgPSB2ZWN0X2luaXRfdmVjdG9yIChpdl9waGksIHZlYywg dmVjdHlwZSk7CiAgCiAgICAgICAgdmVjX2RlZiA9IGluZHVjX2RlZjsKICAg ICAgICBwcmV2X3N0bXRfdmluZm8gPSB2aW5mb19mb3Jfc3RtdCAoaW5kdWN0 aW9uX3BoaSk7CioqKioqKioqKioqKioqKiBnZXRfaW5pdGlhbF9kZWZfZm9y X2luZHVjdGlvbiAodHJlZSBpdl9wCioqKiAxMjUyLDEyNzAgKioqKgogIAl7 CiAgCSAgdHJlZSB0bXA7CiAgCiEgCSAgLyogdmVjX2kgPSB2ZWNfcHJldiAr IHZlY197c3RlcCpudW5pdHN9ICAqLwogIAkgIHRtcCA9IGJ1aWxkMiAoUExV U19FWFBSLCB2ZWN0eXBlLCB2ZWNfZGVmLCB2ZWNfc3RlcCk7CiAgCSAgbmV3 X3N0bXQgPSBidWlsZF9naW1wbGVfbW9kaWZ5X3N0bXQgKE5VTExfVFJFRSwg dG1wKTsKICAJICB2ZWNfZGVmID0gbWFrZV9zc2FfbmFtZSAodmVjX2Rlc3Qs IG5ld19zdG10KTsKICAJICBHSU1QTEVfU1RNVF9PUEVSQU5EIChuZXdfc3Rt dCwgMCkgPSB2ZWNfZGVmOwohIAkgIGJzaSA9IGJzaV9mb3Jfc3RtdCAoc3Rt dCk7CiEgCSAgdmVjdF9maW5pc2hfc3RtdF9nZW5lcmF0aW9uIChzdG10LCBu ZXdfc3RtdCwgJmJzaSk7CiEgCiAgCSAgU1RNVF9WSU5GT19SRUxBVEVEX1NU TVQgKHByZXZfc3RtdF92aW5mbykgPSBuZXdfc3RtdDsKICAJICBwcmV2X3N0 bXRfdmluZm8gPSB2aW5mb19mb3Jfc3RtdCAobmV3X3N0bXQpOyAKICAJfQog ICAgICB9CiAgCiAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9S VF9ERVRBSUxTKSkKICAgICAgewogICAgICAgIGZwcmludGYgKHZlY3RfZHVt cCwgInRyYW5zZm9ybSBpbmR1Y3Rpb246IGNyZWF0ZWQgZGVmLXVzZSBjeWNs ZToiKTsKLS0tIDEzMTgsMTM2NyAtLS0tCiAgCXsKICAJICB0cmVlIHRtcDsK ICAKISAJICAvKiB2ZWNfaSA9IHZlY19wcmV2ICsgdmVjX3N0ZXAgICovCiAg CSAgdG1wID0gYnVpbGQyIChQTFVTX0VYUFIsIHZlY3R5cGUsIHZlY19kZWYs IHZlY19zdGVwKTsKICAJICBuZXdfc3RtdCA9IGJ1aWxkX2dpbXBsZV9tb2Rp Znlfc3RtdCAoTlVMTF9UUkVFLCB0bXApOwogIAkgIHZlY19kZWYgPSBtYWtl X3NzYV9uYW1lICh2ZWNfZGVzdCwgbmV3X3N0bXQpOwogIAkgIEdJTVBMRV9T VE1UX09QRVJBTkQgKG5ld19zdG10LCAwKSA9IHZlY19kZWY7CiEgCSAgYnNp X2luc2VydF9iZWZvcmUgKCZzaSwgbmV3X3N0bXQsIEJTSV9TQU1FX1NUTVQp OwohIAkgIHNldF9zdG10X2luZm8gKGdldF9zdG10X2FubiAobmV3X3N0bXQp LAohIAkJCSBuZXdfc3RtdF92ZWNfaW5mbyAobmV3X3N0bXQsIGxvb3Bfdmlu Zm8pKTsKICAJICBTVE1UX1ZJTkZPX1JFTEFURURfU1RNVCAocHJldl9zdG10 X3ZpbmZvKSA9IG5ld19zdG10OwogIAkgIHByZXZfc3RtdF92aW5mbyA9IHZp bmZvX2Zvcl9zdG10IChuZXdfc3RtdCk7IAogIAl9CiAgICAgIH0KICAKKyAg IGlmIChuZXN0ZWRfaW5fdmVjdF9sb29wKQorICAgICB7CisgICAgICAgLyog RmluZCB0aGUgbG9vcC1jbG9zZWQgZXhpdC1waGkgb2YgdGhlIGluZHVjdGlv biwgYW5kIHJlY29yZAorICAgICAgICAgIHRoZSBmaW5hbCB2ZWN0b3Igb2Yg aW5kdWN0aW9uIHJlc3VsdHM6ICAqLworICAgICAgIGV4aXRfcGhpID0gTlVM TDsKKyAgICAgICBGT1JfRUFDSF9JTU1fVVNFX0ZBU1QgKHVzZV9wLCBpbW1f aXRlciwgbG9vcF9hcmcpCisgICAgICAgICB7CisgCSAgaWYgKCFmbG93X2Ji X2luc2lkZV9sb29wX3AgKGl2X2xvb3AsIGJiX2Zvcl9zdG10IChVU0VfU1RN VCAodXNlX3ApKSkpCisgCSAgICB7CisgCSAgICAgIGV4aXRfcGhpID0gVVNF X1NUTVQgKHVzZV9wKTsKKyAJICAgICAgYnJlYWs7CisgCSAgICB9CisgICAg ICAgICB9CisgICAgICAgaWYgKGV4aXRfcGhpKSAKKyAJeworIAkgIHN0bXRf dmVjX2luZm8gc3RtdF92aW5mbyA9IHZpbmZvX2Zvcl9zdG10IChleGl0X3Bo aSk7CisgCSAgLyogRk9STk9XLiBDdXJyZW50bHkgbm90IHN1cHBvcnRpbmcg dGhlIGNhc2UgdGhhdCBhbiBpbm5lci1sb29wIGluZHVjdGlvbgorIAkgICAg IGlzIG5vdCB1c2VkIGluIHRoZSBvdXRlci1sb29wIChpLmUuIG9ubHkgb3V0 c2lkZSB0aGUgb3V0ZXItbG9vcCkuICAqLworIAkgIGdjY19hc3NlcnQgKFNU TVRfVklORk9fUkVMRVZBTlRfUCAoc3RtdF92aW5mbykKKyAJCSAgICAgICYm ICFTVE1UX1ZJTkZPX0xJVkVfUCAoc3RtdF92aW5mbykpOworIAorIAkgIFNU TVRfVklORk9fVkVDX1NUTVQgKHN0bXRfdmluZm8pID0gbmV3X3N0bXQ7Cisg CSAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVUQUlMUykp CisgCSAgICB7CisgCSAgICAgIGZwcmludGYgKHZlY3RfZHVtcCwgInZlY3Rv ciBvZiBpbmR1Y3Rpb25zIGFmdGVyIGlubmVyLWxvb3A6Iik7CisgCSAgICAg IHByaW50X2dlbmVyaWNfZXhwciAodmVjdF9kdW1wLCBuZXdfc3RtdCwgVERG X1NMSU0pOworIAkgICAgfQorIAl9CisgICAgIH0KKyAKKyAKICAgIGlmICh2 ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQogICAgICB7 CiAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAidHJhbnNmb3JtIGluZHVj dGlvbjogY3JlYXRlZCBkZWYtdXNlIGN5Y2xlOiIpOwoqKioqKioqKioqKioq KiogdmVjdF9nZXRfdmVjX2RlZl9mb3Jfb3BlcmFuZCAodHJlZSBvcCwgdAoq KiogMTMwMCwxMzA2ICoqKioKICAgIHRyZWUgdmVjdHlwZSA9IFNUTVRfVklO Rk9fVkVDVFlQRSAoc3RtdF92aW5mbyk7CiAgICBpbnQgbnVuaXRzID0gVFlQ RV9WRUNUT1JfU1VCUEFSVFMgKHZlY3R5cGUpOwogICAgbG9vcF92ZWNfaW5m byBsb29wX3ZpbmZvID0gU1RNVF9WSU5GT19MT09QX1ZJTkZPIChzdG10X3Zp bmZvKTsKLSAgIHN0cnVjdCBsb29wICpsb29wID0gTE9PUF9WSU5GT19MT09Q IChsb29wX3ZpbmZvKTsKICAgIHRyZWUgdmVjX2ludjsKICAgIHRyZWUgdmVj X2NzdDsKICAgIHRyZWUgdCA9IE5VTExfVFJFRTsKLS0tIDEzOTcsMTQwMiAt LS0tCioqKioqKioqKioqKioqKiB2ZWN0X2dldF92ZWNfZGVmX2Zvcl9vcGVy YW5kICh0cmVlIG9wLCB0CioqKiAxMzg2LDEzOTkgKioqKgogICAgICAgICAg ZGVmX3N0bXRfaW5mbyA9IHZpbmZvX2Zvcl9zdG10IChkZWZfc3RtdCk7CiAg ICAgICAgICB2ZWNfc3RtdCA9IFNUTVRfVklORk9fVkVDX1NUTVQgKGRlZl9z dG10X2luZm8pOwogICAgICAgICAgZ2NjX2Fzc2VydCAodmVjX3N0bXQpOwoh ICAgICAgICAgdmVjX29wcm5kID0gR0lNUExFX1NUTVRfT1BFUkFORCAodmVj X3N0bXQsIDApOwogICAgICAgICAgcmV0dXJuIHZlY19vcHJuZDsKICAgICAg ICB9CiAgCiAgICAgIC8qIENhc2UgNDogb3BlcmFuZCBpcyBkZWZpbmVkIGJ5 IGEgbG9vcCBoZWFkZXIgcGhpIC0gcmVkdWN0aW9uICAqLwogICAgICBjYXNl IHZlY3RfcmVkdWN0aW9uX2RlZjoKICAgICAgICB7CiAgICAgICAgICBnY2Nf YXNzZXJ0IChUUkVFX0NPREUgKGRlZl9zdG10KSA9PSBQSElfTk9ERSk7CiAg CiAgICAgICAgICAvKiBHZXQgdGhlIGRlZiBiZWZvcmUgdGhlIGxvb3AgICov CiAgICAgICAgICBvcCA9IFBISV9BUkdfREVGX0ZST01fRURHRSAoZGVmX3N0 bXQsIGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApKTsKLS0tIDE0ODIsMTUw MSAtLS0tCiAgICAgICAgICBkZWZfc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0 bXQgKGRlZl9zdG10KTsKICAgICAgICAgIHZlY19zdG10ID0gU1RNVF9WSU5G T19WRUNfU1RNVCAoZGVmX3N0bXRfaW5mbyk7CiAgICAgICAgICBnY2NfYXNz ZXJ0ICh2ZWNfc3RtdCk7CiEgCWlmIChUUkVFX0NPREUgKHZlY19zdG10KSA9 PSBQSElfTk9ERSkKISAJICB2ZWNfb3BybmQgPSBQSElfUkVTVUxUICh2ZWNf c3RtdCk7CiEgCWVsc2UKISAJICB2ZWNfb3BybmQgPSBHSU1QTEVfU1RNVF9P UEVSQU5EICh2ZWNfc3RtdCwgMCk7CiAgICAgICAgICByZXR1cm4gdmVjX29w cm5kOwogICAgICAgIH0KICAKICAgICAgLyogQ2FzZSA0OiBvcGVyYW5kIGlz IGRlZmluZWQgYnkgYSBsb29wIGhlYWRlciBwaGkgLSByZWR1Y3Rpb24gICov CiAgICAgIGNhc2UgdmVjdF9yZWR1Y3Rpb25fZGVmOgogICAgICAgIHsKKyAJ c3RydWN0IGxvb3AgKmxvb3A7CisgCiAgICAgICAgICBnY2NfYXNzZXJ0IChU UkVFX0NPREUgKGRlZl9zdG10KSA9PSBQSElfTk9ERSk7CisgCWxvb3AgPSAo YmJfZm9yX3N0bXQgKGRlZl9zdG10KSktPmxvb3BfZmF0aGVyOyAKICAKICAg ICAgICAgIC8qIEdldCB0aGUgZGVmIGJlZm9yZSB0aGUgbG9vcCAgKi8KICAg ICAgICAgIG9wID0gUEhJX0FSR19ERUZfRlJPTV9FREdFIChkZWZfc3RtdCwg bG9vcF9wcmVoZWFkZXJfZWRnZSAobG9vcCkpOwoqKioqKioqKioqKioqKiog dmVjdF9nZXRfdmVjX2RlZl9mb3Jfb3BlcmFuZCAodHJlZSBvcCwgdAoqKiog MTQwNSwxNDEyICoqKioKICAgICAgICB7CiAgCWdjY19hc3NlcnQgKFRSRUVf Q09ERSAoZGVmX3N0bXQpID09IFBISV9OT0RFKTsKICAKISAJLyogR2V0IHRo ZSBkZWYgYmVmb3JlIHRoZSBsb29wICAqLwohIAlyZXR1cm4gZ2V0X2luaXRp YWxfZGVmX2Zvcl9pbmR1Y3Rpb24gKGRlZl9zdG10KTsKICAgICAgICB9CiAg CiAgICAgIGRlZmF1bHQ6Ci0tLSAxNTA3LDE1MTggLS0tLQogICAgICAgIHsK ICAJZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChkZWZfc3RtdCkgPT0gUEhJX05P REUpOwogIAohICAgICAgICAgLyogR2V0IHRoZSBkZWYgZnJvbSB0aGUgdmVj dG9yaXplZCBzdG10LiAgKi8KISAgICAgICAgIGRlZl9zdG10X2luZm8gPSB2 aW5mb19mb3Jfc3RtdCAoZGVmX3N0bXQpOwohICAgICAgICAgdmVjX3N0bXQg PSBTVE1UX1ZJTkZPX1ZFQ19TVE1UIChkZWZfc3RtdF9pbmZvKTsKISAgICAg ICAgIGdjY19hc3NlcnQgKHZlY19zdG10ICYmIChUUkVFX0NPREUgKHZlY19z dG10KSA9PSBQSElfTk9ERSkpOwohICAgICAgICAgdmVjX29wcm5kID0gUEhJ X1JFU1VMVCAodmVjX3N0bXQpOwohICAgICAgICAgcmV0dXJuIHZlY19vcHJu ZDsKICAgICAgICB9CiAgCiAgICAgIGRlZmF1bHQ6CioqKioqKioqKioqKioq KiB2ZWN0X2dldF92ZWNfZGVmX2Zvcl9zdG10X2NvcHkgKGVudW0gdmVjCioq KiAxNDg3LDE0OTMgKioqKgogICAgdmVjX3N0bXRfZm9yX29wZXJhbmQgPSBT VE1UX1ZJTkZPX1JFTEFURURfU1RNVCAoZGVmX3N0bXRfaW5mbyk7CiAgICBn Y2NfYXNzZXJ0ICh2ZWNfc3RtdF9mb3Jfb3BlcmFuZCk7CiAgICB2ZWNfb3By bmQgPSBHSU1QTEVfU1RNVF9PUEVSQU5EICh2ZWNfc3RtdF9mb3Jfb3BlcmFu ZCwgMCk7Ci0gCiAgICByZXR1cm4gdmVjX29wcm5kOwogIH0KICAKLS0tIDE1 OTMsMTU5OCAtLS0tCioqKioqKioqKioqKioqKiB2ZWN0X2ZpbmlzaF9zdG10 X2dlbmVyYXRpb24gKHRyZWUgc3RtdCwgCioqKiAxNTAzLDE1MDkgKioqKgot LS0gMTYwOCwxNjE4IC0tLS0KICAgIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZv ID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOwogICAgbG9vcF92ZWNfaW5mbyBs b29wX3ZpbmZvID0gU1RNVF9WSU5GT19MT09QX1ZJTkZPIChzdG10X2luZm8p OwogIAorICAgZ2NjX2Fzc2VydCAoc3RtdCA9PSBic2lfc3RtdCAoKmJzaSkp OworICAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChzdG10KSAhPSBMQUJFTF9F WFBSKTsKKyAKICAgIGJzaV9pbnNlcnRfYmVmb3JlIChic2ksIHZlY19zdG10 LCBCU0lfU0FNRV9TVE1UKTsKKyAKICAgIHNldF9zdG10X2luZm8gKGdldF9z dG10X2FubiAodmVjX3N0bXQpLCAKICAJCSBuZXdfc3RtdF92ZWNfaW5mbyAo dmVjX3N0bXQsIGxvb3BfdmluZm8pKTsgCiAgCioqKioqKioqKioqKioqKiBz dGF0aWMgdHJlZQoqKiogMTU3MSwxNTc2ICoqKioKLS0tIDE2ODAsMTY4NyAt LS0tCiAgZ2V0X2luaXRpYWxfZGVmX2Zvcl9yZWR1Y3Rpb24gKHRyZWUgc3Rt dCwgdHJlZSBpbml0X3ZhbCwgdHJlZSAqYWRqdXN0bWVudF9kZWYpCiAgewog ICAgc3RtdF92ZWNfaW5mbyBzdG10X3ZpbmZvID0gdmluZm9fZm9yX3N0bXQg KHN0bXQpOworICAgbG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvID0gU1RNVF9W SU5GT19MT09QX1ZJTkZPIChzdG10X3ZpbmZvKTsKKyAgIHN0cnVjdCBsb29w ICpsb29wID0gTE9PUF9WSU5GT19MT09QIChsb29wX3ZpbmZvKTsKICAgIHRy ZWUgdmVjdHlwZSA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF92aW5mbyk7 CiAgICBpbnQgbnVuaXRzID0gIFRZUEVfVkVDVE9SX1NVQlBBUlRTICh2ZWN0 eXBlKTsKICAgIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBUUkVFX0NPREUgKEdJ TVBMRV9TVE1UX09QRVJBTkQgKHN0bXQsIDEpKTsKKioqKioqKioqKioqKioq IGdldF9pbml0aWFsX2RlZl9mb3JfcmVkdWN0aW9uICh0cmVlIHN0bXQKKioq IDE1ODEsMTU4OCAqKioqCi0tLSAxNjkyLDE3MDUgLS0tLQogICAgdHJlZSB0 ID0gTlVMTF9UUkVFOwogICAgaW50IGk7CiAgICB0cmVlIHZlY3Rvcl90eXBl OworICAgYm9vbCBuZXN0ZWRfaW5fdmVjdF9sb29wID0gZmFsc2U7IAogIAog ICAgZ2NjX2Fzc2VydCAoSU5URUdSQUxfVFlQRV9QICh0eXBlKSB8fCBTQ0FM QVJfRkxPQVRfVFlQRV9QICh0eXBlKSk7CisgICBpZiAobmVzdGVkX2luX3Zl Y3RfbG9vcF9wIChsb29wLCBzdG10KSkKKyAgICAgbmVzdGVkX2luX3ZlY3Rf bG9vcCA9IHRydWU7CisgICBlbHNlCisgICAgIGdjY19hc3NlcnQgKGxvb3Ag PT0gKGJiX2Zvcl9zdG10IChzdG10KSktPmxvb3BfZmF0aGVyKTsKKyAKICAg IHZlY2RlZiA9IHZlY3RfZ2V0X3ZlY19kZWZfZm9yX29wZXJhbmQgKGluaXRf dmFsLCBzdG10LCBOVUxMKTsKICAKICAgIHN3aXRjaCAoY29kZSkKKioqKioq KioqKioqKioqIGdldF9pbml0aWFsX2RlZl9mb3JfcmVkdWN0aW9uICh0cmVl IHN0bXQKKioqIDE1OTAsMTU5NiAqKioqCiAgICBjYXNlIFdJREVOX1NVTV9F WFBSOgogICAgY2FzZSBET1RfUFJPRF9FWFBSOgogICAgY2FzZSBQTFVTX0VY UFI6CiEgICAgICphZGp1c3RtZW50X2RlZiA9IGluaXRfdmFsOwogICAgICAv KiBDcmVhdGUgYSB2ZWN0b3Igb2YgemVyb3MgZm9yIGluaXRfZGVmLiAgKi8K ICAgICAgaWYgKElOVEVHUkFMX1RZUEVfUCAodHlwZSkpCiAgICAgICAgZGVm X2Zvcl9pbml0ID0gYnVpbGRfaW50X2NzdCAodHlwZSwgMCk7Ci0tLSAxNzA3 LDE3MTYgLS0tLQogICAgY2FzZSBXSURFTl9TVU1fRVhQUjoKICAgIGNhc2Ug RE9UX1BST0RfRVhQUjoKICAgIGNhc2UgUExVU19FWFBSOgohICAgICAgIGlm IChuZXN0ZWRfaW5fdmVjdF9sb29wKQohIAkqYWRqdXN0bWVudF9kZWYgPSB2 ZWNkZWY7CiEgICAgICAgZWxzZQohIAkqYWRqdXN0bWVudF9kZWYgPSBpbml0 X3ZhbDsKICAgICAgLyogQ3JlYXRlIGEgdmVjdG9yIG9mIHplcm9zIGZvciBp bml0X2RlZi4gICovCiAgICAgIGlmIChJTlRFR1JBTF9UWVBFX1AgKHR5cGUp KQogICAgICAgIGRlZl9mb3JfaW5pdCA9IGJ1aWxkX2ludF9jc3QgKHR5cGUs IDApOwoqKioqKioqKioqKioqKiogdmVjdF9jcmVhdGVfZXBpbG9nX2Zvcl9y ZWR1Y3Rpb24gKHRyZWUgdgoqKiogMTY3OSwxNzAyICoqKioKICAgIHRyZWUg bmV3X3BoaTsKICAgIGJsb2NrX3N0bXRfaXRlcmF0b3IgZXhpdF9ic2k7CiAg ICB0cmVlIHZlY19kZXN0OwohICAgdHJlZSBuZXdfdGVtcDsKICAgIHRyZWUg bmV3X25hbWU7CiEgICB0cmVlIGVwaWxvZ19zdG10OwohICAgdHJlZSBuZXdf c2NhbGFyX2Rlc3QsIGV4aXRfcGhpOwogICAgdHJlZSBiaXRzaXplLCBiaXRw b3MsIGJ5dGVzaXplOyAKICAgIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBUUkVF X0NPREUgKEdJTVBMRV9TVE1UX09QRVJBTkQgKHN0bXQsIDEpKTsKISAgIHRy ZWUgc2NhbGFyX2luaXRpYWxfZGVmOwogICAgdHJlZSB2ZWNfaW5pdGlhbF9k ZWY7CiAgICB0cmVlIG9yaWdfbmFtZTsKICAgIGltbV91c2VfaXRlcmF0b3Ig aW1tX2l0ZXI7CiAgICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwohICAgYm9vbCBl eHRyYWN0X3NjYWxhcl9yZXN1bHQ7CiEgICB0cmVlIHJlZHVjdGlvbl9vcDsK ICAgIHRyZWUgb3JpZ19zdG10OwogICAgdHJlZSB1c2Vfc3RtdDsKICAgIHRy ZWUgb3BlcmF0aW9uID0gR0lNUExFX1NUTVRfT1BFUkFORCAoc3RtdCwgMSk7 CiAgICBpbnQgb3BfdHlwZTsKICAgIAogICAgb3BfdHlwZSA9IFRSRUVfT1BF UkFORF9MRU5HVEggKG9wZXJhdGlvbik7CiAgICByZWR1Y3Rpb25fb3AgPSBU UkVFX09QRVJBTkQgKG9wZXJhdGlvbiwgb3BfdHlwZS0xKTsKICAgIHZlY3R5 cGUgPSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFyX3R5cGUgKFRSRUVfVFlQRSAo cmVkdWN0aW9uX29wKSk7Ci0tLSAxNzk5LDE4MjkgLS0tLQogICAgdHJlZSBu ZXdfcGhpOwogICAgYmxvY2tfc3RtdF9pdGVyYXRvciBleGl0X2JzaTsKICAg IHRyZWUgdmVjX2Rlc3Q7CiEgICB0cmVlIG5ld190ZW1wID0gTlVMTF9UUkVF OwogICAgdHJlZSBuZXdfbmFtZTsKISAgIHRyZWUgZXBpbG9nX3N0bXQgPSBO VUxMX1RSRUU7CiEgICB0cmVlIG5ld19zY2FsYXJfZGVzdCwgZXhpdF9waGks IG5ld19kZXN0OwogICAgdHJlZSBiaXRzaXplLCBiaXRwb3MsIGJ5dGVzaXpl OyAKICAgIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBUUkVFX0NPREUgKEdJTVBM RV9TVE1UX09QRVJBTkQgKHN0bXQsIDEpKTsKISAgIHRyZWUgYWRqdXN0bWVu dF9kZWY7CiAgICB0cmVlIHZlY19pbml0aWFsX2RlZjsKICAgIHRyZWUgb3Jp Z19uYW1lOwogICAgaW1tX3VzZV9pdGVyYXRvciBpbW1faXRlcjsKICAgIHVz ZV9vcGVyYW5kX3AgdXNlX3A7CiEgICBib29sIGV4dHJhY3Rfc2NhbGFyX3Jl c3VsdCA9IGZhbHNlOwohICAgdHJlZSByZWR1Y3Rpb25fb3AsIGV4cHI7CiAg ICB0cmVlIG9yaWdfc3RtdDsKICAgIHRyZWUgdXNlX3N0bXQ7CiAgICB0cmVl IG9wZXJhdGlvbiA9IEdJTVBMRV9TVE1UX09QRVJBTkQgKHN0bXQsIDEpOwor ICAgYm9vbCBuZXN0ZWRfaW5fdmVjdF9sb29wID0gZmFsc2U7CiAgICBpbnQg b3BfdHlwZTsKICAgIAorICAgaWYgKG5lc3RlZF9pbl92ZWN0X2xvb3BfcCAo bG9vcCwgc3RtdCkpCisgICAgIHsKKyAgICAgICBsb29wID0gbG9vcC0+aW5u ZXI7CisgICAgICAgbmVzdGVkX2luX3ZlY3RfbG9vcCA9IHRydWU7CisgICAg IH0KKyAgIAogICAgb3BfdHlwZSA9IFRSRUVfT1BFUkFORF9MRU5HVEggKG9w ZXJhdGlvbik7CiAgICByZWR1Y3Rpb25fb3AgPSBUUkVFX09QRVJBTkQgKG9w ZXJhdGlvbiwgb3BfdHlwZS0xKTsKICAgIHZlY3R5cGUgPSBnZXRfdmVjdHlw ZV9mb3Jfc2NhbGFyX3R5cGUgKFRSRUVfVFlQRSAocmVkdWN0aW9uX29wKSk7 CioqKioqKioqKioqKioqKiB2ZWN0X2NyZWF0ZV9lcGlsb2dfZm9yX3JlZHVj dGlvbiAodHJlZSB2CioqKiAxNzA5LDE3MTUgKioqKgogICAgICAgdGhlIHNj YWxhciBkZWYgYmVmb3JlIHRoZSBsb29wLCB0aGF0IGRlZmluZXMgdGhlIGlu aXRpYWwgdmFsdWUKICAgICAgIG9mIHRoZSByZWR1Y3Rpb24gdmFyaWFibGUu ICAqLwogICAgdmVjX2luaXRpYWxfZGVmID0gdmVjdF9nZXRfdmVjX2RlZl9m b3Jfb3BlcmFuZCAocmVkdWN0aW9uX29wLCBzdG10LAohIAkJCQkJCSAgJnNj YWxhcl9pbml0aWFsX2RlZik7CiAgICBhZGRfcGhpX2FyZyAocmVkdWN0aW9u X3BoaSwgdmVjX2luaXRpYWxfZGVmLCBsb29wX3ByZWhlYWRlcl9lZGdlIChs b29wKSk7CiAgCiAgICAvKiAxLjIgc2V0IHRoZSBsb29wLWxhdGNoIGFyZyBm b3IgdGhlIHJlZHVjdGlvbi1waGk6ICAqLwotLS0gMTgzNiwxODQyIC0tLS0K ICAgICAgIHRoZSBzY2FsYXIgZGVmIGJlZm9yZSB0aGUgbG9vcCwgdGhhdCBk ZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlCiAgICAgICBvZiB0aGUgcmVkdWN0 aW9uIHZhcmlhYmxlLiAgKi8KICAgIHZlY19pbml0aWFsX2RlZiA9IHZlY3Rf Z2V0X3ZlY19kZWZfZm9yX29wZXJhbmQgKHJlZHVjdGlvbl9vcCwgc3RtdCwK ISAJCQkJCQkgICZhZGp1c3RtZW50X2RlZik7CiAgICBhZGRfcGhpX2FyZyAo cmVkdWN0aW9uX3BoaSwgdmVjX2luaXRpYWxfZGVmLCBsb29wX3ByZWhlYWRl cl9lZGdlIChsb29wKSk7CiAgCiAgICAvKiAxLjIgc2V0IHRoZSBsb29wLWxh dGNoIGFyZyBmb3IgdGhlIHJlZHVjdGlvbi1waGk6ICAqLwoqKioqKioqKioq KioqKiogdmVjdF9jcmVhdGVfZXBpbG9nX2Zvcl9yZWR1Y3Rpb24gKHRyZWUg dgoqKiogMTc4OCwxNzkzICoqKioKLS0tIDE5MTUsMTkyOSAtLS0tCiAgICBi aXRzaXplID0gVFlQRV9TSVpFIChzY2FsYXJfdHlwZSk7CiAgICBieXRlc2l6 ZSA9IFRZUEVfU0laRV9VTklUIChzY2FsYXJfdHlwZSk7CiAgCisgCisgICAv KiBJbiBjYXNlIHRoaXMgaXMgYSByZWR1Y3Rpb24gaW4gYW4gaW5uZXItbG9v cCB3aGlsZSB2ZWN0b3JpemluZyBhbiBvdXRlcgorICAgICAgbG9vcCAtIHdl IGRvbid0IG5lZWQgdG8gZXh0cmFjdCBhIHNpbmdsZSBzY2FsYXIgcmVzdWx0 IGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICBpbm5lci1sb29wLiAgVGhlIGZp bmFsIHZlY3RvciBvZiBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSB1c2VkIGlu IHRoZQorICAgICAgdmVjdG9yaXplZCBvdXRlci1sb29wLCBvciByZWR1Y2Vk IHRvIGEgc2NhbGFyIHJlc3VsdCBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAg b3V0ZXItbG9vcC4gICovCisgICBpZiAobmVzdGVkX2luX3ZlY3RfbG9vcCkK KyAgICAgZ290byB2ZWN0X2ZpbmFsaXplX3JlZHVjdGlvbjsKKyAKICAgIC8q IDIuMyBDcmVhdGUgdGhlIHJlZHVjdGlvbiBjb2RlLCB1c2luZyBvbmUgb2Yg dGhlIHRocmVlIHNjaGVtZXMgZGVzY3JpYmVkCiAgICAgICAgICAgYWJvdmUu ICAqLwogIAoqKioqKioqKioqKioqKiogdmVjdF9jcmVhdGVfZXBpbG9nX2Zv cl9yZWR1Y3Rpb24gKHRyZWUgdgoqKiogMTkzNCwxOTM5ICoqKioKLS0tIDIw NzAsMjA3NiAtLS0tCiAgICAgIHsKICAgICAgICB0cmVlIHJoczsKICAKKyAg ICAgICBnY2NfYXNzZXJ0ICghbmVzdGVkX2luX3ZlY3RfbG9vcCk7CiAgICAg ICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVUQUlMUykp CiAgCWZwcmludGYgKHZlY3RfZHVtcCwgImV4dHJhY3Qgc2NhbGFyIHJlc3Vs dCIpOwogIAoqKioqKioqKioqKioqKiogdmVjdF9jcmVhdGVfZXBpbG9nX2Zv cl9yZWR1Y3Rpb24gKHRyZWUgdgoqKiogMTk1MiwxOTc2ICoqKioKICAgICAg ICBic2lfaW5zZXJ0X2JlZm9yZSAoJmV4aXRfYnNpLCBlcGlsb2dfc3RtdCwg QlNJX1NBTUVfU1RNVCk7CiAgICAgIH0KICAKISAgIC8qIDIuNCBBZGp1c3Qg dGhlIGZpbmFsIHJlc3VsdCBieSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUg cmVkdWN0aW9uCiAgCSB2YXJpYWJsZS4gKFdoZW4gc3VjaCBhZGp1c3RtZW50 IGlzIG5vdCBuZWVkZWQsIHRoZW4KISAJICdzY2FsYXJfaW5pdGlhbF9kZWYn IGlzIHplcm8pLgogIAohIAkgQ3JlYXRlOiAKISAJIHNfb3V0NCA9IHNjYWxh cl9leHByIDxzX291dDMsIHNjYWxhcl9pbml0aWFsX2RlZj4gICovCiEgICAK ISAgIGlmIChzY2FsYXJfaW5pdGlhbF9kZWYpCiAgICAgIHsKISAgICAgICB0 cmVlIHRtcCA9IGJ1aWxkMiAoY29kZSwgc2NhbGFyX3R5cGUsIG5ld190ZW1w LCBzY2FsYXJfaW5pdGlhbF9kZWYpOwohICAgICAgIGVwaWxvZ19zdG10ID0g YnVpbGRfZ2ltcGxlX21vZGlmeV9zdG10IChuZXdfc2NhbGFyX2Rlc3QsIHRt cCk7CiEgICAgICAgbmV3X3RlbXAgPSBtYWtlX3NzYV9uYW1lIChuZXdfc2Nh bGFyX2Rlc3QsIGVwaWxvZ19zdG10KTsKICAgICAgICBHSU1QTEVfU1RNVF9P UEVSQU5EIChlcGlsb2dfc3RtdCwgMCkgPSBuZXdfdGVtcDsKICAgICAgICBi c2lfaW5zZXJ0X2JlZm9yZSAoJmV4aXRfYnNpLCBlcGlsb2dfc3RtdCwgQlNJ X1NBTUVfU1RNVCk7CiAgICAgIH0KICAKLSAgIC8qIDIuNiBSZXBsYWNlIHVz ZXMgb2Ygc19vdXQwIHdpdGggdXNlcyBvZiBzX291dDMgICovCiAgCiEgICAv KiBGaW5kIHRoZSBsb29wLWNsb3NlZC11c2UgYXQgdGhlIGxvb3AgZXhpdCBv ZiB0aGUgb3JpZ2luYWwgc2NhbGFyIHJlc3VsdC4gIAogICAgICAgKFRoZSBy ZWR1Y3Rpb24gcmVzdWx0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdHdvIGltbWVk aWF0ZSB1c2VzIC0gb25lIGF0IHRoZSAKICAgICAgIGxhdGNoIGJsb2NrLCBh bmQgb25lIGF0IHRoZSBsb29wIGV4aXQpLiAgKi8KICAgIGV4aXRfcGhpID0g TlVMTDsKLS0tIDIwODksMjEzMCAtLS0tCiAgICAgICAgYnNpX2luc2VydF9i ZWZvcmUgKCZleGl0X2JzaSwgZXBpbG9nX3N0bXQsIEJTSV9TQU1FX1NUTVQp OwogICAgICB9CiAgCiEgdmVjdF9maW5hbGl6ZV9yZWR1Y3Rpb246CiEgCiEg ICAvKiAyLjUgQWRqdXN0IHRoZSBmaW5hbCByZXN1bHQgYnkgdGhlIGluaXRp YWwgdmFsdWUgb2YgdGhlIHJlZHVjdGlvbgogIAkgdmFyaWFibGUuIChXaGVu IHN1Y2ggYWRqdXN0bWVudCBpcyBub3QgbmVlZGVkLCB0aGVuCiEgCSAnYWRq dXN0bWVudF9kZWYnIGlzIHplcm8pLiAgRm9yIGV4YW1wbGUsIGlmIGNvZGUg aXMgUExVUyB3ZSBjcmVhdGU6CiEgCSBuZXdfdGVtcCA9IGxvb3BfZXhpdF9k ZWYgKyBhZGp1c3RtZW50X2RlZiAgKi8KICAKISAgIGlmIChhZGp1c3RtZW50 X2RlZikKICAgICAgewohICAgICAgIGlmIChuZXN0ZWRfaW5fdmVjdF9sb29w KQohIAl7CiEgCSAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChUUkVFX1RZUEUg KGFkanVzdG1lbnRfZGVmKSkgPT0gVkVDVE9SX1RZUEUpOwohIAkgIGV4cHIg PSBidWlsZDIgKGNvZGUsIHZlY3R5cGUsIFBISV9SRVNVTFQgKG5ld19waGkp LCBhZGp1c3RtZW50X2RlZik7CiEgCSAgbmV3X2Rlc3QgPSB2ZWN0X2NyZWF0 ZV9kZXN0aW5hdGlvbl92YXIgKHNjYWxhcl9kZXN0LCB2ZWN0eXBlKTsKISAJ fQohICAgICAgIGVsc2UKISAJewohIAkgIGdjY19hc3NlcnQgKFRSRUVfQ09E RSAoVFJFRV9UWVBFIChhZGp1c3RtZW50X2RlZikpICE9IFZFQ1RPUl9UWVBF KTsKISAJICBleHByID0gYnVpbGQyIChjb2RlLCBzY2FsYXJfdHlwZSwgbmV3 X3RlbXAsIGFkanVzdG1lbnRfZGVmKTsKISAJICBuZXdfZGVzdCA9IHZlY3Rf Y3JlYXRlX2Rlc3RpbmF0aW9uX3ZhciAoc2NhbGFyX2Rlc3QsIHNjYWxhcl90 eXBlKTsKISAJfQohICAgICAgIGVwaWxvZ19zdG10ID0gYnVpbGRfZ2ltcGxl X21vZGlmeV9zdG10IChuZXdfZGVzdCwgZXhwcik7CiEgICAgICAgbmV3X3Rl bXAgPSBtYWtlX3NzYV9uYW1lIChuZXdfZGVzdCwgZXBpbG9nX3N0bXQpOwog ICAgICAgIEdJTVBMRV9TVE1UX09QRVJBTkQgKGVwaWxvZ19zdG10LCAwKSA9 IG5ld190ZW1wOworICNpZiAwCisgICAgICAgYnNpX2luc2VydF9hZnRlciAo JmV4aXRfYnNpLCBlcGlsb2dfc3RtdCwgQlNJX05FV19TVE1UKTsKKyAjZWxz ZQogICAgICAgIGJzaV9pbnNlcnRfYmVmb3JlICgmZXhpdF9ic2ksIGVwaWxv Z19zdG10LCBCU0lfU0FNRV9TVE1UKTsKKyAjZW5kaWYKICAgICAgfQogIAog IAohICAgLyogMi42ICBIYW5kbGUgdGhlIGxvb3AtZXhpdCBwaGkgICovCiEg CiEgICAvKiBSZXBsYWNlIHVzZXMgb2Ygc19vdXQwIHdpdGggdXNlcyBvZiBz X291dDM6CiEgICAgICBGaW5kIHRoZSBsb29wLWNsb3NlZC11c2UgYXQgdGhl IGxvb3AgZXhpdCBvZiB0aGUgb3JpZ2luYWwgc2NhbGFyIHJlc3VsdC4KICAg ICAgIChUaGUgcmVkdWN0aW9uIHJlc3VsdCBpcyBleHBlY3RlZCB0byBoYXZl IHR3byBpbW1lZGlhdGUgdXNlcyAtIG9uZSBhdCB0aGUgCiAgICAgICBsYXRj aCBibG9jaywgYW5kIG9uZSBhdCB0aGUgbG9vcCBleGl0KS4gICovCiAgICBl eGl0X3BoaSA9IE5VTEw7CioqKioqKioqKioqKioqKiB2ZWN0X2NyZWF0ZV9l cGlsb2dfZm9yX3JlZHVjdGlvbiAodHJlZSB2CioqKiAxOTg0LDE5ODkgKioq KgotLS0gMjEzOCwyMTY2IC0tLS0KICAgICAgfQogICAgLyogV2UgZXhwZWN0 IHRvIGhhdmUgZm91bmQgYW4gZXhpdF9waGkgYmVjYXVzZSBvZiBsb29wLWNs b3NlZC1zc2EgZm9ybS4gICovCiAgICBnY2NfYXNzZXJ0IChleGl0X3BoaSk7 CisgCisgICBpZiAobmVzdGVkX2luX3ZlY3RfbG9vcCkKKyAgICAgeworICAg ICAgIHN0bXRfdmVjX2luZm8gc3RtdF92aW5mbyA9IHZpbmZvX2Zvcl9zdG10 IChleGl0X3BoaSk7CisgCisgICAgICAgLyogRk9STk9XLiBDdXJyZW50bHkg bm90IHN1cHBvcnRpbmcgdGhlIGNhc2UgdGhhdCBhbiBpbm5lci1sb29wIHJl ZHVjdGlvbgorIAkgaXMgbm90IHVzZWQgaW4gdGhlIG91dGVyLWxvb3AgKGJ1 dCBvbmx5IG91dHNpZGUgdGhlIG91dGVyLWxvb3ApLiAgKi8KKyAgICAgICBn Y2NfYXNzZXJ0IChTVE1UX1ZJTkZPX1JFTEVWQU5UX1AgKHN0bXRfdmluZm8p IAorIAkJICAmJiAhU1RNVF9WSU5GT19MSVZFX1AgKHN0bXRfdmluZm8pKTsK KyAKKyAgICAgICBlcGlsb2dfc3RtdCA9IGFkanVzdG1lbnRfZGVmID8gZXBp bG9nX3N0bXQgOiAgbmV3X3BoaTsKKyAgICAgICBTVE1UX1ZJTkZPX1ZFQ19T VE1UIChzdG10X3ZpbmZvKSA9IGVwaWxvZ19zdG10OworICAgICAgIHNldF9z dG10X2luZm8gKGdldF9zdG10X2FubiAoZXBpbG9nX3N0bXQpLAorICAgICAg ICAgICAgICAgICAgICAgIG5ld19zdG10X3ZlY19pbmZvIChlcGlsb2dfc3Rt dCwgbG9vcF92aW5mbykpOworIAorICAgICAgIGlmICh2ZWN0X3ByaW50X2R1 bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQorICAgICAgICAgeworICAgICAg ICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJ2ZWN0b3Igb2YgcGFydGlhbCBy ZXN1bHRzIGFmdGVyIGlubmVyLWxvb3A6Iik7CisgICAgICAgICAgIHByaW50 X2dlbmVyaWNfZXhwciAodmVjdF9kdW1wLCBlcGlsb2dfc3RtdCwgVERGX1NM SU0pOworICAgICAgICAgfQorICAgICAgIHJldHVybjsKKyAgICAgfQorIAog ICAgLyogUmVwbGFjZSB0aGUgdXNlczogICovCiAgICBvcmlnX25hbWUgPSBQ SElfUkVTVUxUIChleGl0X3BoaSk7CiAgICBGT1JfRUFDSF9JTU1fVVNFX1NU TVQgKHVzZV9zdG10LCBpbW1faXRlciwgb3JpZ19uYW1lKQoqKioqKioqKioq KioqKiogdmVjdG9yaXphYmxlX3JlZHVjdGlvbiAodHJlZSBzdG10LCBibG9j awoqKiogMjA2NSwyMDc5ICoqKioKICAgIHRyZWUgbmV3X3N0bXQgPSBOVUxM X1RSRUU7CiAgICBpbnQgajsKICAKICAgIGdjY19hc3NlcnQgKG5jb3BpZXMg Pj0gMSk7CiAgCiAgICAvKiAxLiBJcyB2ZWN0b3JpemFibGUgcmVkdWN0aW9u PyAgKi8KICAKICAgIC8qIE5vdCBzdXBwb3J0YWJsZSBpZiB0aGUgcmVkdWN0 aW9uIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIGxvb3AuICAqLwohICAgaWYg KFNUTVRfVklORk9fUkVMRVZBTlRfUCAoc3RtdF9pbmZvKSkKICAgICAgcmV0 dXJuIGZhbHNlOwogIAohICAgaWYgKCFTVE1UX1ZJTkZPX0xJVkVfUCAoc3Rt dF9pbmZvKSkKICAgICAgcmV0dXJuIGZhbHNlOwogIAogICAgLyogTWFrZSBz dXJlIGl0IHdhcyBhbHJlYWR5IHJlY29nbml6ZWQgYXMgYSByZWR1Y3Rpb24g Y29tcHV0YXRpb24uICAqLwotLS0gMjI0MiwyMjcxIC0tLS0KICAgIHRyZWUg bmV3X3N0bXQgPSBOVUxMX1RSRUU7CiAgICBpbnQgajsKICAKKyAgIGlmIChu ZXN0ZWRfaW5fdmVjdF9sb29wX3AgKGxvb3AsIHN0bXQpKQorICAgICB7Cisg ICAgICAgbG9vcCA9IGxvb3AtPmlubmVyOworICAgICAgIC8qIEZPUk5PVy4g VGhpcyByZXN0cmljdGlvbiBzaG91bGQgYmUgcmVsYXhlZC4gICovCisgICAg ICAgaWYgKG5jb3BpZXMgPiAxKQorIAl7CisgCSAgaWYgKHZlY3RfcHJpbnRf ZHVtcF9pbmZvIChSRVBPUlRfREVUQUlMUykpCisgCSAgICBmcHJpbnRmICh2 ZWN0X2R1bXAsICJtdWx0aXBsZSB0eXBlcyBpbiBuZXN0ZWQgbG9vcC4iKTsK KyAJICByZXR1cm4gZmFsc2U7CisgCX0KKyAgICAgfQorIAogICAgZ2NjX2Fz c2VydCAobmNvcGllcyA+PSAxKTsKICAKICAgIC8qIDEuIElzIHZlY3Rvcml6 YWJsZSByZWR1Y3Rpb24/ICAqLwogIAogICAgLyogTm90IHN1cHBvcnRhYmxl IGlmIHRoZSByZWR1Y3Rpb24gdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgbG9v cC4gICovCiEgICBpZiAoU1RNVF9WSU5GT19SRUxFVkFOVCAoc3RtdF9pbmZv KSA+IHZlY3RfdXNlZF9pbl9vdXRlcikKICAgICAgcmV0dXJuIGZhbHNlOwog IAohICAgLyogUmVkdWN0aW9ucyB0aGF0IGFyZSBub3QgdXNlZCBldmVuIGlu IGFuIGVuY2xvc2luZyBvdXRlci1sb29wLAohICAgICAgYXJlIGV4cGVjdGVk IHRvIGJlICJsaXZlIiAodXNlZCBvdXQgb2YgdGhlIGxvb3ApLiAgKi8KISAg IGlmIChTVE1UX1ZJTkZPX1JFTEVWQU5UIChzdG10X2luZm8pID09IHZlY3Rf dW51c2VkX2luX2xvb3AKISAgICAgICAmJiAhU1RNVF9WSU5GT19MSVZFX1Ag KHN0bXRfaW5mbykpCiAgICAgIHJldHVybiBmYWxzZTsKICAKICAgIC8qIE1h a2Ugc3VyZSBpdCB3YXMgYWxyZWFkeSByZWNvZ25pemVkIGFzIGEgcmVkdWN0 aW9uIGNvbXB1dGF0aW9uLiAgKi8KKioqKioqKioqKioqKioqIHZlY3Rvcml6 YWJsZV9yZWR1Y3Rpb24gKHRyZWUgc3RtdCwgYmxvY2sKKioqIDIxMzAsMjEz OCAqKioqCiAgICBnY2NfYXNzZXJ0IChkdCA9PSB2ZWN0X3JlZHVjdGlvbl9k ZWYpOwogICAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChkZWZfc3RtdCkgPT0g UEhJX05PREUpOwogICAgaWYgKG9yaWdfc3RtdCkgCiEgICAgIGdjY19hc3Nl cnQgKG9yaWdfc3RtdCA9PSB2ZWN0X2lzX3NpbXBsZV9yZWR1Y3Rpb24gKGxv b3AsIGRlZl9zdG10KSk7CiAgICBlbHNlCiEgICAgIGdjY19hc3NlcnQgKHN0 bXQgPT0gdmVjdF9pc19zaW1wbGVfcmVkdWN0aW9uIChsb29wLCBkZWZfc3Rt dCkpOwogICAgCiAgICBpZiAoU1RNVF9WSU5GT19MSVZFX1AgKHZpbmZvX2Zv cl9zdG10IChkZWZfc3RtdCkpKQogICAgICByZXR1cm4gZmFsc2U7Ci0tLSAy MzIyLDIzMzAgLS0tLQogICAgZ2NjX2Fzc2VydCAoZHQgPT0gdmVjdF9yZWR1 Y3Rpb25fZGVmKTsKICAgIGdjY19hc3NlcnQgKFRSRUVfQ09ERSAoZGVmX3N0 bXQpID09IFBISV9OT0RFKTsKICAgIGlmIChvcmlnX3N0bXQpIAohICAgICBn Y2NfYXNzZXJ0IChvcmlnX3N0bXQgPT0gdmVjdF9pc19zaW1wbGVfcmVkdWN0 aW9uIChsb29wX3ZpbmZvLCBkZWZfc3RtdCkpOwogICAgZWxzZQohICAgICBn Y2NfYXNzZXJ0IChzdG10ID09IHZlY3RfaXNfc2ltcGxlX3JlZHVjdGlvbiAo bG9vcF92aW5mbywgZGVmX3N0bXQpKTsKICAgIAogICAgaWYgKFNUTVRfVklO Rk9fTElWRV9QICh2aW5mb19mb3Jfc3RtdCAoZGVmX3N0bXQpKSkKICAgICAg cmV0dXJuIGZhbHNlOwoqKioqKioqKioqKioqKiogdmVjdG9yaXphYmxlX2Nh bGwgKHRyZWUgc3RtdCwgYmxvY2tfc3RtdAoqKiogMjM1NywyMzYyICoqKioK LS0tIDI1NDksMjU1NSAtLS0tCiAgICBpbnQgbnVuaXRzX2luOwogICAgaW50 IG51bml0c19vdXQ7CiAgICBsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8gPSBT VE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfaW5mbyk7CisgICBzdHJ1Y3Qg bG9vcCAqbG9vcCA9IExPT1BfVklORk9fTE9PUCAobG9vcF92aW5mbyk7CiAg ICB0cmVlIGZuZGVjbCwgcmhzLCBuZXdfdGVtcCwgZGVmLCBkZWZfc3RtdCwg cmhzX3R5cGUsIGxoc190eXBlOwogICAgZW51bSB2ZWN0X2RlZl90eXBlIGR0 WzJdID0ge3ZlY3RfdW5rbm93bl9kZWZfdHlwZSwgdmVjdF91bmtub3duX2Rl Zl90eXBlfTsKICAgIHRyZWUgbmV3X3N0bXQ7CioqKioqKioqKioqKioqKiB2 ZWN0b3JpemFibGVfY2FsbCAodHJlZSBzdG10LCBibG9ja19zdG10CioqKiAy NDY2LDI0NzEgKioqKgotLS0gMjY1OSwyNjcyIC0tLS0KICAgICAgIG5lZWRz IHRvIGJlIGdlbmVyYXRlZC4gICovCiAgICBnY2NfYXNzZXJ0IChuY29waWVz ID49IDEpOwogIAorICAgLyogRk9STk9XLiBUaGlzIHJlc3RyaWN0aW9uIHNo b3VsZCBiZSByZWxheGVkLiAgKi8KKyAgIGlmIChuZXN0ZWRfaW5fdmVjdF9s b29wX3AgKGxvb3AsIHN0bXQpICYmIG5jb3BpZXMgPiAxKQorICAgICB7Cisg ICAgICAgaWYgKHZlY3RfcHJpbnRfZHVtcF9pbmZvIChSRVBPUlRfREVUQUlM UykpCisgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibXVsdGlwbGUgdHlw ZXMgaW4gbmVzdGVkIGxvb3AuIik7CisgICAgICAgcmV0dXJuIGZhbHNlOwor ICAgICB9CisgCiAgICBpZiAoIXZlY19zdG10KSAvKiB0cmFuc2Zvcm1hdGlv biBub3QgcmVxdWlyZWQuICAqLwogICAgICB7CiAgICAgICAgU1RNVF9WSU5G T19UWVBFIChzdG10X2luZm8pID0gY2FsbF92ZWNfaW5mb190eXBlOwoqKioq KioqKioqKioqKiogdmVjdG9yaXphYmxlX2NhbGwgKHRyZWUgc3RtdCwgYmxv Y2tfc3RtdAoqKiogMjQ4MCwyNDg1ICoqKioKLS0tIDI2ODEsMjY5NCAtLS0t CiAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxT KSkKICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAidHJhbnNmb3JtIG9wZXJh dGlvbi4iKTsKICAKKyAgIC8qIEZPUk5PVy4gVGhpcyByZXN0cmljdGlvbiBz aG91bGQgYmUgcmVsYXhlZC4gICovCisgICBpZiAobmVzdGVkX2luX3ZlY3Rf bG9vcF9wIChsb29wLCBzdG10KSAmJiBuY29waWVzID4gMSkKKyAgICAgewor ICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJ TFMpKQorICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibXVsdGlwbGUg dHlwZXMgaW4gbmVzdGVkIGxvb3AuIik7CisgICAgICAgcmV0dXJuIGZhbHNl OworICAgICB9CisgCiAgICAvKiBIYW5kbGUgZGVmLiAgKi8KICAgIHNjYWxh cl9kZXN0ID0gR0lNUExFX1NUTVRfT1BFUkFORCAoc3RtdCwgMCk7CiAgICB2 ZWNfZGVzdCA9IHZlY3RfY3JlYXRlX2Rlc3RpbmF0aW9uX3ZhciAoc2NhbGFy X2Rlc3QsIHZlY3R5cGVfb3V0KTsKKioqKioqKioqKioqKioqIHZlY3Rvcml6 YWJsZV9jb252ZXJzaW9uICh0cmVlIHN0bXQsIGJsb2MKKioqIDI2NzEsMjY3 NiAqKioqCi0tLSAyODgwLDI4ODYgLS0tLQogICAgdHJlZSB2ZWNfb3BybmQw ID0gTlVMTF9UUkVFLCB2ZWNfb3BybmQxID0gTlVMTF9UUkVFOwogICAgc3Rt dF92ZWNfaW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3RtdCk7 CiAgICBsb29wX3ZlY19pbmZvIGxvb3BfdmluZm8gPSBTVE1UX1ZJTkZPX0xP T1BfVklORk8gKHN0bXRfaW5mbyk7CisgICBzdHJ1Y3QgbG9vcCAqbG9vcCA9 IExPT1BfVklORk9fTE9PUCAobG9vcF92aW5mbyk7CiAgICBlbnVtIHRyZWVf Y29kZSBjb2RlLCBjb2RlMSA9IEVSUk9SX01BUkssIGNvZGUyID0gRVJST1Jf TUFSSzsKICAgIHRyZWUgZGVjbDEgPSBOVUxMX1RSRUUsIGRlY2wyID0gTlVM TF9UUkVFOwogICAgdHJlZSBuZXdfdGVtcDsKKioqKioqKioqKioqKioqIHZl Y3Rvcml6YWJsZV9jb252ZXJzaW9uICh0cmVlIHN0bXQsIGJsb2MKKioqIDI3 NTIsMjc1NyAqKioqCi0tLSAyOTYyLDI5NzUgLS0tLQogICAgICAgbmVlZHMg dG8gYmUgZ2VuZXJhdGVkLiAgKi8KICAgIGdjY19hc3NlcnQgKG5jb3BpZXMg Pj0gMSk7CiAgCisgICAvKiBGT1JOT1cuIFRoaXMgcmVzdHJpY3Rpb24gc2hv dWxkIGJlIHJlbGF4ZWQuICAqLworICAgaWYgKG5lc3RlZF9pbl92ZWN0X2xv b3BfcCAobG9vcCwgc3RtdCkgJiYgbmNvcGllcyA+IDEpCisgICAgIHsKKyAg ICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxT KSkKKyAgICAgICBmcHJpbnRmICh2ZWN0X2R1bXAsICJtdWx0aXBsZSB0eXBl cyBpbiBuZXN0ZWQgbG9vcC4iKTsKKyAgICAgICByZXR1cm4gZmFsc2U7Cisg ICAgIH0KKyAKICAgIC8qIENoZWNrIHRoZSBvcGVyYW5kcyBvZiB0aGUgb3Bl cmF0aW9uLiAgKi8KICAgIGlmICghdmVjdF9pc19zaW1wbGVfdXNlIChvcDAs IGxvb3BfdmluZm8sICZkZWZfc3RtdCwgJmRlZiwgJmR0MCkpCiAgICAgIHsK KioqKioqKioqKioqKioqIHZlY3Rvcml6YWJsZV9vcGVyYXRpb24gKHRyZWUg c3RtdCwgYmxvY2sKKioqIDMwOTMsMzA5OCAqKioqCi0tLSAzMzExLDMzMTcg LS0tLQogICAgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8gPSB2aW5mb19mb3Jf c3RtdCAoc3RtdCk7CiAgICB0cmVlIHZlY3R5cGUgPSBTVE1UX1ZJTkZPX1ZF Q1RZUEUgKHN0bXRfaW5mbyk7CiAgICBsb29wX3ZlY19pbmZvIGxvb3Bfdmlu Zm8gPSBTVE1UX1ZJTkZPX0xPT1BfVklORk8gKHN0bXRfaW5mbyk7CisgICBz dHJ1Y3QgbG9vcCAqbG9vcCA9IExPT1BfVklORk9fTE9PUCAobG9vcF92aW5m byk7CiAgICBlbnVtIHRyZWVfY29kZSBjb2RlOwogICAgZW51bSBtYWNoaW5l X21vZGUgdmVjX21vZGU7CiAgICB0cmVlIG5ld190ZW1wOwoqKioqKioqKioq KioqKiogdmVjdG9yaXphYmxlX29wZXJhdGlvbiAodHJlZSBzdG10LCBibG9j awoqKiogMzExMSwzMTE2ICoqKioKLS0tIDMzMzAsMzM0MiAtLS0tCiAgICBp bnQgajsKICAKICAgIGdjY19hc3NlcnQgKG5jb3BpZXMgPj0gMSk7CisgICAv KiBGT1JOT1cuIFRoaXMgcmVzdHJpY3Rpb24gc2hvdWxkIGJlIHJlbGF4ZWQu ICAqLworICAgaWYgKG5lc3RlZF9pbl92ZWN0X2xvb3BfcCAobG9vcCwgc3Rt dCkgJiYgbmNvcGllcyA+IDEpCisgICAgIHsKKyAgICAgICBpZiAodmVjdF9w cmludF9kdW1wX2luZm8gKFJFUE9SVF9ERVRBSUxTKSkKKyAgICAgICAgIGZw cmludGYgKHZlY3RfZHVtcCwgIm11bHRpcGxlIHR5cGVzIGluIG5lc3RlZCBs b29wLiIpOworICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgfQogIAogICAg aWYgKCFTVE1UX1ZJTkZPX1JFTEVWQU5UX1AgKHN0bXRfaW5mbykpCiAgICAg IHJldHVybiBmYWxzZTsKKioqKioqKioqKioqKioqIHZlY3Rvcml6YWJsZV90 eXBlX2RlbW90aW9uICh0cmVlIHN0bXQsIGIKKioqIDMzNzMsMzM3OCAqKioq Ci0tLSAzNTk5LDM2MDUgLS0tLQogICAgdHJlZSB2ZWNfb3BybmQwPU5VTEws IHZlY19vcHJuZDE9TlVMTDsKICAgIHN0bXRfdmVjX2luZm8gc3RtdF9pbmZv ID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOwogICAgbG9vcF92ZWNfaW5mbyBs b29wX3ZpbmZvID0gU1RNVF9WSU5GT19MT09QX1ZJTkZPIChzdG10X2luZm8p OworICAgc3RydWN0IGxvb3AgKmxvb3AgPSBMT09QX1ZJTkZPX0xPT1AgKGxv b3BfdmluZm8pOwogICAgZW51bSB0cmVlX2NvZGUgY29kZSwgY29kZTEgPSBF UlJPUl9NQVJLOwogICAgdHJlZSBuZXdfdGVtcDsKICAgIHRyZWUgZGVmLCBk ZWZfc3RtdDsKKioqKioqKioqKioqKioqIHZlY3Rvcml6YWJsZV90eXBlX2Rl bW90aW9uICh0cmVlIHN0bXQsIGIKKioqIDM0MjUsMzQzMCAqKioqCi0tLSAz NjUyLDM2NjQgLS0tLQogIAogICAgbmNvcGllcyA9IExPT1BfVklORk9fVkVD VF9GQUNUT1IgKGxvb3BfdmluZm8pIC8gbnVuaXRzX291dDsKICAgIGdjY19h c3NlcnQgKG5jb3BpZXMgPj0gMSk7CisgICAvKiBGT1JOT1cuIFRoaXMgcmVz dHJpY3Rpb24gc2hvdWxkIGJlIHJlbGF4ZWQuICAqLworICAgaWYgKG5lc3Rl ZF9pbl92ZWN0X2xvb3BfcCAobG9vcCwgc3RtdCkgJiYgbmNvcGllcyA+IDEp CisgICAgIHsKKyAgICAgICBpZiAodmVjdF9wcmludF9kdW1wX2luZm8gKFJF UE9SVF9ERVRBSUxTKSkKKyAgICAgICAgIGZwcmludGYgKHZlY3RfZHVtcCwg Im11bHRpcGxlIHR5cGVzIGluIG5lc3RlZCBsb29wLiIpOworICAgICAgIHJl dHVybiBmYWxzZTsKKyAgICAgfQogIAogICAgaWYgKCEgKChJTlRFR1JBTF9U WVBFX1AgKFRSRUVfVFlQRSAoc2NhbGFyX2Rlc3QpKQogIAkgICYmIElOVEVH UkFMX1RZUEVfUCAoVFJFRV9UWVBFIChvcDApKSkKKioqKioqKioqKioqKioq IHZlY3Rvcml6YWJsZV90eXBlX3Byb21vdGlvbiAodHJlZSBzdG10LCAKKioq IDM1MjIsMzUyNyAqKioqCi0tLSAzNzU2LDM3NjIgLS0tLQogICAgdHJlZSB2 ZWNfb3BybmQwPU5VTEwsIHZlY19vcHJuZDE9TlVMTDsKICAgIHN0bXRfdmVj X2luZm8gc3RtdF9pbmZvID0gdmluZm9fZm9yX3N0bXQgKHN0bXQpOwogICAg bG9vcF92ZWNfaW5mbyBsb29wX3ZpbmZvID0gU1RNVF9WSU5GT19MT09QX1ZJ TkZPIChzdG10X2luZm8pOworICAgc3RydWN0IGxvb3AgKmxvb3AgPSBMT09Q X1ZJTkZPX0xPT1AgKGxvb3BfdmluZm8pOwogICAgZW51bSB0cmVlX2NvZGUg Y29kZSwgY29kZTEgPSBFUlJPUl9NQVJLLCBjb2RlMiA9IEVSUk9SX01BUks7 CiAgICB0cmVlIGRlY2wxID0gTlVMTF9UUkVFLCBkZWNsMiA9IE5VTExfVFJF RTsKICAgIGludCBvcF90eXBlOyAKKioqKioqKioqKioqKioqIHZlY3Rvcml6 YWJsZV90eXBlX3Byb21vdGlvbiAodHJlZSBzdG10LCAKKioqIDM1NzUsMzU4 MCAqKioqCi0tLSAzODEwLDM4MjIgLS0tLQogIAogICAgbmNvcGllcyA9IExP T1BfVklORk9fVkVDVF9GQUNUT1IgKGxvb3BfdmluZm8pIC8gbnVuaXRzX2lu OwogICAgZ2NjX2Fzc2VydCAobmNvcGllcyA+PSAxKTsKKyAgIC8qIEZPUk5P Vy4gVGhpcyByZXN0cmljdGlvbiBzaG91bGQgYmUgcmVsYXhlZC4gICovCisg ICBpZiAobmVzdGVkX2luX3ZlY3RfbG9vcF9wIChsb29wLCBzdG10KSAmJiBu Y29waWVzID4gMSkKKyAgICAgeworICAgICAgIGlmICh2ZWN0X3ByaW50X2R1 bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQorICAgICAgICAgZnByaW50ZiAo dmVjdF9kdW1wLCAibXVsdGlwbGUgdHlwZXMgaW4gbmVzdGVkIGxvb3AuIik7 CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgICB9CiAgCiAgICBpZiAoISAo KElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChzY2FsYXJfZGVzdCkpCiAg CSAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG9wMCkpKQoqKioq KioqKioqKioqKiogdmVjdG9yaXphYmxlX3N0b3JlICh0cmVlIHN0bXQsIGJs b2NrX3N0bQoqKiogMzg2NywzODcyICoqKioKLS0tIDQxMDksNDExNSAtLS0t CiAgICBzdHJ1Y3QgZGF0YV9yZWZlcmVuY2UgKmRyID0gU1RNVF9WSU5GT19E QVRBX1JFRiAoc3RtdF9pbmZvKSwgKmZpcnN0X2RyID0gTlVMTDsKICAgIHRy ZWUgdmVjdHlwZSA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF9pbmZvKTsK ICAgIGxvb3BfdmVjX2luZm8gbG9vcF92aW5mbyA9IFNUTVRfVklORk9fTE9P UF9WSU5GTyAoc3RtdF9pbmZvKTsKKyAgIHN0cnVjdCBsb29wICpsb29wID0g TE9PUF9WSU5GT19MT09QIChsb29wX3ZpbmZvKTsKICAgIGVudW0gbWFjaGlu ZV9tb2RlIHZlY19tb2RlOwogICAgdHJlZSBkdW1teTsKICAgIGVudW0gZHJf YWxpZ25tZW50X3N1cHBvcnQgYWxpZ25tZW50X3N1cHBvcnRfY2hlbWU7Cioq KioqKioqKioqKioqKiB2ZWN0b3JpemFibGVfc3RvcmUgKHRyZWUgc3RtdCwg YmxvY2tfc3RtCioqKiAzODgyLDM4ODcgKioqKgotLS0gNDEyNSw0MTM3IC0t LS0KICAgIHVuc2lnbmVkIGludCBncm91cF9zaXplLCBpOwogICAgVkVDKHRy ZWUsaGVhcCkgKmRyX2NoYWluID0gTlVMTCwgKm9wcm5kcyA9IE5VTEwsICpy ZXN1bHRfY2hhaW4gPSBOVUxMOwogICAgZ2NjX2Fzc2VydCAobmNvcGllcyA+ PSAxKTsKKyAgIC8qIEZPUk5PVy4gVGhpcyByZXN0cmljdGlvbiBzaG91bGQg YmUgcmVsYXhlZC4gICovCisgICBpZiAobmVzdGVkX2luX3ZlY3RfbG9vcF9w IChsb29wLCBzdG10KSAmJiBuY29waWVzID4gMSkKKyAgICAgeworICAgICAg IGlmICh2ZWN0X3ByaW50X2R1bXBfaW5mbyAoUkVQT1JUX0RFVEFJTFMpKQor ICAgICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAibXVsdGlwbGUgdHlwZXMg aW4gbmVzdGVkIGxvb3AuIik7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAg ICB9CiAgCiAgICBpZiAoIVNUTVRfVklORk9fUkVMRVZBTlRfUCAoc3RtdF9p bmZvKSkKICAgICAgcmV0dXJuIGZhbHNlOwoqKioqKioqKioqKioqKiogdmVj dG9yaXphYmxlX2xvYWQgKHRyZWUgc3RtdCwgYmxvY2tfc3RtdAoqKiogNDUx Nyw0NTIyICoqKioKLS0tIDQ3NjcsNDc4MSAtLS0tCiAgICBib29sIHN0cmlk ZWRfbG9hZCA9IGZhbHNlOwogICAgdHJlZSBmaXJzdF9zdG10OwogIAorICAg Z2NjX2Fzc2VydCAobmNvcGllcyA+PSAxKTsKKyAgIC8qIEZPUk5PVy4gVGhp cyByZXN0cmljdGlvbiBzaG91bGQgYmUgcmVsYXhlZC4gICovCisgICBpZiAo bmVzdGVkX2luX3ZlY3RfbG9vcF9wIChsb29wLCBzdG10KSAmJiBuY29waWVz ID4gMSkKKyAgICAgeworICAgICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5m byAoUkVQT1JUX0RFVEFJTFMpKQorICAgICAgICAgZnByaW50ZiAodmVjdF9k dW1wLCAibXVsdGlwbGUgdHlwZXMgaW4gbmVzdGVkIGxvb3AuIik7CisgICAg ICAgcmV0dXJuIGZhbHNlOworICAgICB9CisgCiAgICBpZiAoIVNUTVRfVklO Rk9fUkVMRVZBTlRfUCAoc3RtdF9pbmZvKSkKICAgICAgcmV0dXJuIGZhbHNl OwogIAoqKioqKioqKioqKioqKiogdmVjdG9yaXphYmxlX2xpdmVfb3BlcmF0 aW9uICh0cmVlIHN0bXQsCioqKiA0ODEyLDQ4MTcgKioqKgotLS0gNTA3MSw1 MDc3IC0tLS0KICAgIHRyZWUgb3BlcmF0aW9uOwogICAgc3RtdF92ZWNfaW5m byBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3RtdCAoc3RtdCk7CiAgICBsb29w X3ZlY19pbmZvIGxvb3BfdmluZm8gPSBTVE1UX1ZJTkZPX0xPT1BfVklORk8g KHN0bXRfaW5mbyk7CisgICBzdHJ1Y3QgbG9vcCAqbG9vcCA9IExPT1BfVklO Rk9fTE9PUCAobG9vcF92aW5mbyk7CiAgICBpbnQgaTsKICAgIGludCBvcF90 eXBlOwogICAgdHJlZSBvcDsKKioqKioqKioqKioqKioqIHZlY3Rvcml6YWJs ZV9saXZlX29wZXJhdGlvbiAodHJlZSBzdG10LAoqKiogNDgyOSw0ODM0ICoq KioKLS0tIDUwODksNTA5OCAtLS0tCiAgICBpZiAoVFJFRV9DT0RFIChHSU1Q TEVfU1RNVF9PUEVSQU5EIChzdG10LCAwKSkgIT0gU1NBX05BTUUpCiAgICAg IHJldHVybiBmYWxzZTsKICAKKyAgIC8qIEZPUk5PVy4gQ0hFQ0tNRS4gKi8K KyAgIGlmIChuZXN0ZWRfaW5fdmVjdF9sb29wX3AgKGxvb3AsIHN0bXQpKQor ICAgICByZXR1cm4gZmFsc2U7CisgCiAgICBvcGVyYXRpb24gPSBHSU1QTEVf U1RNVF9PUEVSQU5EIChzdG10LCAxKTsKICAgIG9wX3R5cGUgPSBUUkVFX09Q RVJBTkRfTEVOR1RIIChvcGVyYXRpb24pOwogIAoqKioqKioqKioqKioqKiog dmVjdF90cmFuc2Zvcm1fbG9vcCAobG9vcF92ZWNfaW5mbyBsb29wXwoqKiog NTk2NSw1OTcyICoqKioKICAJICAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAi LS0tLS0tPnZlY3Rvcml6aW5nIHN0YXRlbWVudDogIik7CiAgCSAgICAgIHBy aW50X2dlbmVyaWNfZXhwciAodmVjdF9kdW1wLCBzdG10LCBUREZfU0xJTSk7 CiAgCSAgICB9CQogIAkgIHN0bXRfaW5mbyA9IHZpbmZvX2Zvcl9zdG10IChz dG10KTsKISAJICBnY2NfYXNzZXJ0IChzdG10X2luZm8pOwogIAkgIGlmICgh U1RNVF9WSU5GT19SRUxFVkFOVF9QIChzdG10X2luZm8pCiAgCSAgICAgICYm ICFTVE1UX1ZJTkZPX0xJVkVfUCAoc3RtdF9pbmZvKSkKICAJICAgIHsKLS0t IDYyMjksNjI0NiAtLS0tCiAgCSAgICAgIGZwcmludGYgKHZlY3RfZHVtcCwg Ii0tLS0tLT52ZWN0b3JpemluZyBzdGF0ZW1lbnQ6ICIpOwogIAkgICAgICBw cmludF9nZW5lcmljX2V4cHIgKHZlY3RfZHVtcCwgc3RtdCwgVERGX1NMSU0p OwogIAkgICAgfQkKKyAKICAJICBzdG10X2luZm8gPSB2aW5mb19mb3Jfc3Rt dCAoc3RtdCk7CiEgCiEgCSAgLyogdmVjdG9yIHN0bXRzIGNyZWF0ZWQgaW4g dGhlIG91dGVyLWxvb3AgZHVyaW5nIHZlY3Rvcml6YXRpb24gb2YKISAJICAg ICBzdG10cyBpbiBhbiBpbm5lci1sb29wIG1heSBub3QgaGF2ZSBhIHN0bXRf aW5mbywgYW5kIGRvIG5vdAohIAkgICAgIG5lZWQgdG8gYmUgdmVjdG9yaXpl ZC4gICovCiEgCSAgaWYgKCFzdG10X2luZm8pCiEgCSAgICB7CiEgCSAgICAg IGJzaV9uZXh0ICgmc2kpOwohIAkgICAgICBjb250aW51ZTsKISAJICAgIH0K ISAKICAJICBpZiAoIVNUTVRfVklORk9fUkVMRVZBTlRfUCAoc3RtdF9pbmZv KQogIAkgICAgICAmJiAhU1RNVF9WSU5GT19MSVZFX1AgKHN0bXRfaW5mbykp CiAgCSAgICB7CioqKioqKioqKioqKioqKiB2ZWN0X3RyYW5zZm9ybV9sb29w IChsb29wX3ZlY19pbmZvIGxvb3BfCioqKiA2MDM4LDYwNDEgKioqKgotLS0g NjMxMiw2MzE3IC0tLS0KICAKICAgIGlmICh2ZWN0X3ByaW50X2R1bXBfaW5m byAoUkVQT1JUX1ZFQ1RPUklaRURfTE9PUFMpKQogICAgICBmcHJpbnRmICh2 ZWN0X2R1bXAsICJMT09QIFZFQ1RPUklaRUQuIik7CisgICBpZiAobG9vcC0+ aW5uZXIgJiYgdmVjdF9wcmludF9kdW1wX2luZm8gKFJFUE9SVF9WRUNUT1JJ WkVEX0xPT1BTKSkKKyAgICAgZnByaW50ZiAodmVjdF9kdW1wLCAiT1VURVIg TE9PUCBWRUNUT1JJWkVELiIpOwogIH0K --0__=4DBBF9A6DFD8BE328f9e8a93df938690918c4DBBF9A6DFD8BE32--