From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2079.outbound.protection.outlook.com [40.107.7.79]) by sourceware.org (Postfix) with ESMTPS id D5EC2385771F for ; Thu, 15 Jun 2023 11:47:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D5EC2385771F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZMYKpuYnwYZ3glgLnIXpXQusYgoNYHCEphNrVxB59iE=; b=WrRNiubEx3hDVGvqNJkw9CBg2Y42fjJHnC45zR6Pg+/PfNuop4kavtflLsibOG9q7gElrdzj6xiOF8g2h7LyMMm0v6Jpw1/TxvQey4ARWEbsWeTyZjism+t51Zm2PEiihaMOC7YFBznq7UAQHEU4syWqHRwEJgE444S2sArnJgA= Received: from DU2P250CA0020.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:231::25) by DB9PR08MB8204.eurprd08.prod.outlook.com (2603:10a6:10:39f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.44; Thu, 15 Jun 2023 11:47:55 +0000 Received: from DBAEUR03FT022.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:231:cafe::97) by DU2P250CA0020.outlook.office365.com (2603:10a6:10:231::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6477.38 via Frontend Transport; Thu, 15 Jun 2023 11:47:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DBAEUR03FT022.mail.protection.outlook.com (100.127.142.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.25 via Frontend Transport; Thu, 15 Jun 2023 11:47:55 +0000 Received: ("Tessian outbound 5154e9d36775:v136"); Thu, 15 Jun 2023 11:47:55 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 8b50268a9308bdc7 X-CR-MTA-TID: 64aa7808 Received: from 3d20f3995b6f.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id A6A98FF8-85F8-480E-BC06-BC80671B4286.1; Thu, 15 Jun 2023 11:47:49 +0000 Received: from EUR01-VE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 3d20f3995b6f.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 15 Jun 2023 11:47:49 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QUMntJAp0hrAcXcqy6wrTFUmsjP3VcpfXLU6j64NT3dCDkNOhi/1qGMBf6nU08vVMApgbaIjCJnGHOJTSXbXuZ17It17+DNCq1Xy9o/W4TWvlDxIoMdros5dDNRpnWM37PEIlzarh1qEJ05cjAyiB2jcy6Xn/u7QlSYAnN7pUUOAe6BsXXTqVQ19PWT/WswqBnlKx0D5ZGonj5Z8gjpfDG891TC5xRlVueWS/c4QLvDZd5Zu1ZqfFqmTsk85MooYVR48m5+sh76BSE2p3TDKTkurduesZi0dP2LgQWLh1+hq0jPbWdJIxYPBxe7C5hAl4lWS7O0c+TNuI8be4IBE6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZMYKpuYnwYZ3glgLnIXpXQusYgoNYHCEphNrVxB59iE=; b=AF6AKsghG/fIitWbBG6wRBpMdv9XU2vcnCFJ77G9u+GI8lg1hwk70+TLp1+STlihvwS/BFlTP8FYeyJH05bK00dFgPP1OutSUj3txFx5Etov9JOMLpD9G9l9aTJrqf069r6SGc5iYKB+p3vpdbAUIqnfwRP6EANe3yZAXfdyOHeCNUYE3cCMKxZJnM4uhuo+jYyjg+UrNK0t5yu3q45anEaBpH0h3cUfhjW5908fvCBkRQ8cABLBQD99tmOo9A1AOBb8Jd3vsp535Gc5X2GLJdNl0O8OOMpzc2XPqRYfHefCh/4et+3hsBbgUIoCvy/uDPZ0rewmxKj0xNM0cekR9g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZMYKpuYnwYZ3glgLnIXpXQusYgoNYHCEphNrVxB59iE=; b=WrRNiubEx3hDVGvqNJkw9CBg2Y42fjJHnC45zR6Pg+/PfNuop4kavtflLsibOG9q7gElrdzj6xiOF8g2h7LyMMm0v6Jpw1/TxvQey4ARWEbsWeTyZjism+t51Zm2PEiihaMOC7YFBznq7UAQHEU4syWqHRwEJgE444S2sArnJgA= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by VI1PR08MB5455.eurprd08.prod.outlook.com (2603:10a6:803:135::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.46; Thu, 15 Jun 2023 11:47:46 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::2fd1:9380:86b1:467f]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::2fd1:9380:86b1:467f%4]) with mapi id 15.20.6477.037; Thu, 15 Jun 2023 11:47:46 +0000 Content-Type: multipart/mixed; boundary="------------r58WMpLrPU4YXPbz9iFdDacP" Message-ID: Date: Thu, 15 Jun 2023 12:47:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Content-Language: en-US To: "gcc-patches@gcc.gnu.org" Cc: Kyrylo Tkachov , Richard Earnshaw , ramana.gcc@gmail.com, "nickc@redhat.com" From: Stamatis Markianos-Wright Subject: [PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops X-ClientProxiedBy: LO4P123CA0403.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:189::12) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|VI1PR08MB5455:EE_|DBAEUR03FT022:EE_|DB9PR08MB8204:EE_ X-MS-Office365-Filtering-Correlation-Id: 339c323f-20a0-4eac-2cb3-08db6d965bfe X-LD-Processed: f34e5979-57d9-4aaa-ad4d-b122a662184d,ExtAddr x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 5F2rMkmGVpHPzHB7DKbvYUDoCnXa3aZmTeGYHZAPSidtDa1U3oQycGsH03bESFeK+eyJfJoe8XwDQcHtYT9DIJlykoQ1yFsG9lzVREZNSpkHsLsBa4g5N8HBsMVxDmbSBwg4CDw2ZKpXtwcJyegdaGsmYwZugx93QmZWM+O9IYMa9rmsODXaXGtCBSZJBq8Y1iMzkYkeK+tozFum5J4mvaoJCvb2VtDbGSa5jIZhohB6WHyiPJ5VDUfgy8yti+GsChyDxqkrna0Vaw0wHSzjr1XTHyeVx8T8pl6BW3p1eihuTWFjhSRgTEm40rbbGziKG2VaXg0Fn1krkWWpWmbiAC1xvsuFuWqMmFRqAF/zct3mNj98kMd6M3bfrKMO1y9upnAz4vKir4OcsyVOvlhSSv1Ya/cQEWFynYoej+bLrxoeAtOR5NiEyiNzZGQRUfDPZxOmWHjrXB7kEzb2joJ8/MBfFlrxtzg9XxIjeAGAM4qkvNtyXcfwm5/yoTAFFLBWU4m+29cSQ6/STVBnE0vAdWXeGaUOtnsoZl4epDvuijHefu9O/Gf4pvIvUrRQII3t05dVPhl2Krk6659647vXWKfD4SNlWQiecGJjwjMeyY9RJ4Deh4wNq25y8wYX7PTKaeiQEneEIPDPFBVj2y6COdsagQXtZkvwuUDcKTS01tGrviFZcfiJXTxdkY0HGenE X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR08MB6507.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(376002)(396003)(136003)(346002)(39860400002)(366004)(451199021)(186003)(8936002)(235185007)(5660300002)(8676002)(316002)(41300700001)(36756003)(478600001)(4326008)(6916009)(31696002)(86362001)(66556008)(66476007)(6486002)(54906003)(66946007)(38100700002)(33964004)(26005)(6506007)(6512007)(31686004)(2906002)(83380400001)(84970400001)(2616005)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB5455 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DBAEUR03FT022.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: f4c15cf8-92d4-456f-3df1-08db6d96563e X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: c0XbBuoaPUiYYTaTe7mQk4U46ke1yqaL2ZNECk/fGF7mACltf4HkktetKwq0AJif3bJl2R3fSKX/fYqVjdcU/xZqKk0/ZhKqUDUKpIff1h/2O4yTZGDK5uKXIrigNU014MUDm2MJl2ixMt+a/K9sKZ4zmiBxqNoq+gRfdpfrNpyRSiV9SN7FiqN2rtCT0RHfkmpJY+fIHwIumURLBX3OkN86+fZpux4iLSPAZW7/HCbadYnfkKLptD5Dyy++blucB3qwzjbR4zPG1DG4Y6oTqsljZ4p5Ge1SmDYTU1zWF8a6+upAjKzsHKMO6J8bZpjIdsUIRCdZuVYbVpHiiMf1DqSNtiXzJnfo06yspLoRJ9bm/L4/HL4HGylzUfnwP6zYzDkZ41oohyjSbIP8bJ0AOdqJEkAoQrxtFY3kihMjEgrOaZZKpc1ag3khhCeusZQ74BAaSTjQWTeoTkjs7RtBHHCN3Ebyrc9oAc3ay+ODrtqT5UAl6eK4EmVgMCqQFJzlYDhDEw2Bx2Q3hKh4VJslW/cmHYa85uAOry3f7YhITzV5zp4Jyi3H/pAF2JPUPaGs0tswewjD1cbWjss2pQC4r6OfhyJxeSR/QK5wid7e+qGlbqn6KchfBfpjOzejak8grvDWzaQWevGzAYZYn8n46lrG2HG4YxL419ksXRdzU9jGGtI2AW3rUM/oK8bLsfDI08lopvvrFen5iLRg72S5M61H7vabqxYw536lStcWa+H1lvJug6iB6stsjeSHaCFznAL3JiCfIMTfy5zKRsIlaJLQDu3yxBkabbykBrLesPECVeMjGVQPdPYVTF10Kk91 X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230028)(4636009)(376002)(39860400002)(346002)(136003)(396003)(451199021)(36840700001)(40470700004)(46966006)(40460700003)(54906003)(33964004)(336012)(83380400001)(86362001)(31696002)(6512007)(107886003)(6506007)(2616005)(36860700001)(26005)(81166007)(356005)(82740400003)(47076005)(186003)(82310400005)(40480700001)(478600001)(36756003)(6486002)(84970400001)(41300700001)(2906002)(31686004)(5660300002)(235185007)(8676002)(8936002)(6916009)(4326008)(70206006)(70586007)(316002)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jun 2023 11:47:55.8807 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 339c323f-20a0-4eac-2cb3-08db6d965bfe X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DBAEUR03FT022.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB8204 X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------r58WMpLrPU4YXPbz9iFdDacP Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit     Hi all,     This is the 2/2 patch that contains the functional changes needed     for MVE Tail Predicated Low Overhead Loops.  See my previous email     for a general introduction of MVE LOLs.     This support is added through the already existing loop-doloop     mechanisms that are used for non-MVE dls/le looping.     Mid-end changes are:     1) Relax the loop-doloop mechanism in the mid-end to allow for        decrement numbers other that -1 and for `count` to be an        rtx containing a simple REG (which in this case will contain        the number of elements to be processed), rather        than an expression for calculating the number of iterations.     2) Added a new df utility function: `df_bb_regno_only_def_find` that        will return the DEF of a REG only if it is DEF-ed once within the        basic block.     And many things in the backend to implement the above optimisation:     3)  Implement the `arm_predict_doloop_p` target hook to instruct the         mid-end about Low Overhead Loops (MVE or not), as well as         `arm_loop_unroll_adjust` which will prevent unrolling of any loops         that are valid for becoming MVE Tail_Predicated Low Overhead Loops         (unrolling can transform a loop in ways that invalidate the dlstp/         letp tranformation logic and the benefit of the dlstp/letp loop         would be considerably higher than that of unrolling)     4)  Appropriate changes to the define_expand of doloop_end, new         patterns for dlstp and letp, new iterators,  unspecs, etc.     5) `arm_mve_loop_valid_for_dlstp` and a number of checking functions:        * `arm_mve_dlstp_check_dec_counter`        * `arm_mve_dlstp_check_inc_counter`        * `arm_mve_check_reg_origin_is_num_elems`        * `arm_mve_check_df_chain_back_for_implic_predic`        * `arm_mve_check_df_chain_fwd_for_implic_predic_impact`        This all, in smoe way or another, are running checks on the loop        structure in order to determine if the loop is valid for dlstp/letp        transformation.     6) `arm_attempt_dlstp_transform`: (called from the define_expand of         doloop_end) this function re-checks for the loop's suitability for         dlstp/letp transformation and then implements it, if possible.     7) Various utility functions:        *`arm_mve_get_vctp_lanes` to map        from vctp unspecs to number of lanes, and `arm_get_required_vpr_reg`        to check an insn to see if it requires the VPR or not.        * `arm_mve_get_loop_vctp`        * `arm_mve_get_vctp_lanes`        * `arm_emit_mve_unpredicated_insn_to_seq`        * `arm_get_required_vpr_reg`        * `arm_get_required_vpr_reg_param`        * `arm_get_required_vpr_reg_ret_val`        * `arm_mve_vec_insn_is_predicated_with_this_predicate`        * `arm_mve_vec_insn_is_unpredicated_or_uses_other_predicate`     No regressions on arm-none-eabi with various targets and on     aarch64-none-elf. Thoughts on getting this into trunk?     Thank you,     Stam Markianos-Wright     gcc/ChangeLog:             * config/arm/arm-protos.h (arm_target_insn_ok_for_lob): Rename to...             (arm_target_bb_ok_for_lob): ...this             (arm_attempt_dlstp_transform): New.             * config/arm/arm.cc (TARGET_LOOP_UNROLL_ADJUST): New.             (TARGET_PREDICT_DOLOOP_P): New.             (arm_block_set_vect):             (arm_target_insn_ok_for_lob): Rename from arm_target_insn_ok_for_lob.             (arm_target_bb_ok_for_lob): New.             (arm_mve_get_vctp_lanes): New.             (arm_get_required_vpr_reg): New.             (arm_get_required_vpr_reg_param): New.             (arm_get_required_vpr_reg_ret_val): New.             (arm_mve_get_loop_vctp): New. (arm_mve_vec_insn_is_unpredicated_or_uses_other_predicate): New.             (arm_mve_vec_insn_is_predicated_with_this_predicate): New.             (arm_mve_check_df_chain_back_for_implic_predic): New.             (arm_mve_check_df_chain_fwd_for_implic_predic_impact): New.             (arm_mve_check_reg_origin_is_num_elems): New.             (arm_mve_dlstp_check_inc_counter): New.             (arm_mve_dlstp_check_dec_counter): New.             (arm_mve_loop_valid_for_dlstp): New.             (arm_predict_doloop_p): New.             (arm_loop_unroll_adjust): New.             (arm_emit_mve_unpredicated_insn_to_seq): New.             (arm_attempt_dlstp_transform): New.             * config/arm/iterators.md (DLSTP): New.             (mode1): Add DLSTP mappings.             * config/arm/mve.md (*predicated_doloop_end_internal): New.             (dlstp_insn): New.             * config/arm/thumb2.md (doloop_end): Update for MVE LOLs.             * config/arm/unspecs.md: New unspecs.             * df-core.cc (df_bb_regno_only_def_find): New.             * df.h (df_bb_regno_only_def_find): New.             * loop-doloop.cc (doloop_condition_get): Relax conditions.             (doloop_optimize): Add support for elementwise LoLs.     gcc/testsuite/ChangeLog:             * gcc.target/arm/lob.h: Update framework.             * gcc.target/arm/lob1.c: Likewise.             * gcc.target/arm/lob6.c: Likewise.             * gcc.target/arm/mve/dlstp-compile-asm.c: New test.             * gcc.target/arm/mve/dlstp-int16x8.c: New test.             * gcc.target/arm/mve/dlstp-int32x4.c: New test.             * gcc.target/arm/mve/dlstp-int64x2.c: New test.             * gcc.target/arm/mve/dlstp-int8x16.c: New test.             * gcc.target/arm/mve/dlstp-invalid-asm.c: New test. --------------r58WMpLrPU4YXPbz9iFdDacP Content-Type: text/x-patch; charset=UTF-8; name="2.patch" Content-Disposition: attachment; filename="2.patch" Content-Transfer-Encoding: base64 Y29tbWl0IDRmNmIyYzg4NjI1N2M0ZTI2NWZlMjU1MTQ1ZjJlY2IxNzUxMDUwMWIKQXV0aG9yOiBT dGFtIE1hcmtpYW5vcy1XcmlnaHQgPHN0YW0ubWFya2lhbm9zLXdyaWdodEBhcm0uY29tPgpEYXRl OiAgIFR1ZSBPY3QgMTggMTc6NDI6NTYgMjAyMiArMDEwMAoKICAgIGFybTogQWRkIHN1cHBvcnQg Zm9yIE1WRSBUYWlsLVByZWRpY2F0ZWQgTG93IE92ZXJoZWFkIExvb3BzCiAgICAKICAgIFRoaXMg aXMgdGhlIDIvMiBwYXRjaCB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbmFsIGNoYW5nZXMgbmVl ZGVkCiAgICBmb3IgTVZFIFRhaWwgUHJlZGljYXRlZCBMb3cgT3ZlcmhlYWQgTG9vcHMuICBTZWUg bXkgcHJldmlvdXMgZW1haWwKICAgIGZvciBhIGdlbmVyYWwgaW50cm9kdWN0aW9uIG9mIE1WRSBM T0xzLgogICAgCiAgICBUaGlzIHN1cHBvcnQgaXMgYWRkZWQgdGhyb3VnaCB0aGUgYWxyZWFkeSBl eGlzdGluZyBsb29wLWRvbG9vcAogICAgbWVjaGFuaXNtcyB0aGF0IGFyZSB1c2VkIGZvciBub24t TVZFIGRscy9sZSBsb29waW5nLgogICAgCiAgICBNaWQtZW5kIGNoYW5nZXMgYXJlOgogICAgCiAg ICAxKSBSZWxheCB0aGUgbG9vcC1kb2xvb3AgbWVjaGFuaXNtIGluIHRoZSBtaWQtZW5kIHRvIGFs bG93IGZvcgogICAgICAgZGVjcmVtZW50IG51bWJlcnMgb3RoZXIgdGhhdCAtMSBhbmQgZm9yIGBj b3VudGAgdG8gYmUgYW4KICAgICAgIHJ0eCBjb250YWluaW5nIGEgc2ltcGxlIFJFRyAod2hpY2gg aW4gdGhpcyBjYXNlIHdpbGwgY29udGFpbgogICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0 byBiZSBwcm9jZXNzZWQpLCByYXRoZXIKICAgICAgIHRoYW4gYW4gZXhwcmVzc2lvbiBmb3IgY2Fs Y3VsYXRpbmcgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgogICAgMikgQWRkZWQgYSBuZXcgZGYg dXRpbGl0eSBmdW5jdGlvbjogYGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmRgIHRoYXQKICAgICAg IHdpbGwgcmV0dXJuIHRoZSBERUYgb2YgYSBSRUcgb25seSBpZiBpdCBpcyBERUYtZWQgb25jZSB3 aXRoaW4gdGhlCiAgICAgICBiYXNpYyBibG9jay4KICAgIAogICAgQW5kIG1hbnkgdGhpbmdzIGlu IHRoZSBiYWNrZW5kIHRvIGltcGxlbWVudCB0aGUgYWJvdmUgb3B0aW1pc2F0aW9uOgogICAgCiAg ICAzKSAgSW1wbGVtZW50IHRoZSBgYXJtX3ByZWRpY3RfZG9sb29wX3BgIHRhcmdldCBob29rIHRv IGluc3RydWN0IHRoZQogICAgICAgIG1pZC1lbmQgYWJvdXQgTG93IE92ZXJoZWFkIExvb3BzIChN VkUgb3Igbm90KSwgYXMgd2VsbCBhcwogICAgICAgIGBhcm1fbG9vcF91bnJvbGxfYWRqdXN0YCB3 aGljaCB3aWxsIHByZXZlbnQgdW5yb2xsaW5nIG9mIGFueSBsb29wcwogICAgICAgIHRoYXQgYXJl IHZhbGlkIGZvciBiZWNvbWluZyBNVkUgVGFpbF9QcmVkaWNhdGVkIExvdyBPdmVyaGVhZCBMb29w cwogICAgICAgICh1bnJvbGxpbmcgY2FuIHRyYW5zZm9ybSBhIGxvb3AgaW4gd2F5cyB0aGF0IGlu dmFsaWRhdGUgdGhlIGRsc3RwLwogICAgICAgIGxldHAgdHJhbmZvcm1hdGlvbiBsb2dpYyBhbmQg dGhlIGJlbmVmaXQgb2YgdGhlIGRsc3RwL2xldHAgbG9vcAogICAgICAgIHdvdWxkIGJlIGNvbnNp ZGVyYWJseSBoaWdoZXIgdGhhbiB0aGF0IG9mIHVucm9sbGluZykKICAgIDQpICBBcHByb3ByaWF0 ZSBjaGFuZ2VzIHRvIHRoZSBkZWZpbmVfZXhwYW5kIG9mIGRvbG9vcF9lbmQsIG5ldwogICAgICAg IHBhdHRlcm5zIGZvciBkbHN0cCBhbmQgbGV0cCwgbmV3IGl0ZXJhdG9ycywgIHVuc3BlY3MsIGV0 Yy4KICAgIDUpIGBhcm1fbXZlX2xvb3BfdmFsaWRfZm9yX2Rsc3RwYCBhbmQgYSBudW1iZXIgb2Yg Y2hlY2tpbmcgZnVuY3Rpb25zOgogICAgICAgKiBgYXJtX212ZV9kbHN0cF9jaGVja19kZWNfY291 bnRlcmAKICAgICAgICogYGFybV9tdmVfZGxzdHBfY2hlY2tfaW5jX2NvdW50ZXJgCiAgICAgICAq IGBhcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5faXNfbnVtX2VsZW1zYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9md2RfZm9yX2ltcGxpY19wcmVkaWNfaW1wYWN0YAogICAgICAgVGhp cyBhbGwsIGluIHNtb2Ugd2F5IG9yIGFub3RoZXIsIGFyZSBydW5uaW5nIGNoZWNrcyBvbiB0aGUg bG9vcAogICAgICAgc3RydWN0dXJlIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB0aGUgbG9vcCBp cyB2YWxpZCBmb3IgZGxzdHAvbGV0cAogICAgICAgdHJhbnNmb3JtYXRpb24uCiAgICA2KSBgYXJt X2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtYDogKGNhbGxlZCBmcm9tIHRoZSBkZWZpbmVfZXhwYW5k IG9mCiAgICAgICAgZG9sb29wX2VuZCkgdGhpcyBmdW5jdGlvbiByZS1jaGVja3MgZm9yIHRoZSBs b29wJ3Mgc3VpdGFiaWxpdHkgZm9yCiAgICAgICAgZGxzdHAvbGV0cCB0cmFuc2Zvcm1hdGlvbiBh bmQgdGhlbiBpbXBsZW1lbnRzIGl0LCBpZiBwb3NzaWJsZS4KICAgIDcpIFZhcmlvdXMgdXRpbGl0 eSBmdW5jdGlvbnM6CiAgICAgICAqYGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXNgIHRvIG1hcAogICAg ICAgZnJvbSB2Y3RwIHVuc3BlY3MgdG8gbnVtYmVyIG9mIGxhbmVzLCBhbmQgYGFybV9nZXRfcmVx dWlyZWRfdnByX3JlZ2AKICAgICAgIHRvIGNoZWNrIGFuIGluc24gdG8gc2VlIGlmIGl0IHJlcXVp cmVzIHRoZSBWUFIgb3Igbm90LgogICAgICAgKiBgYXJtX212ZV9nZXRfbG9vcF92Y3RwYAogICAg ICAgKiBgYXJtX212ZV9nZXRfdmN0cF9sYW5lc2AKICAgICAgICogYGFybV9lbWl0X212ZV91bnBy ZWRpY2F0ZWRfaW5zbl90b19zZXFgCiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdg CiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW1gCiAgICAgICAqIGBhcm1f Z2V0X3JlcXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbGAKICAgICAgICogYGFybV9tdmVfdmVjX2luc25f aXNfcHJlZGljYXRlZF93aXRoX3RoaXNfcHJlZGljYXRlYAogICAgICAgKiBgYXJtX212ZV92ZWNf aW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGVgCiAgICAKICAgIE5v IHJlZ3Jlc3Npb25zIG9uIGFybS1ub25lLWVhYmkgd2l0aCB2YXJpb3VzIHRhcmdldHMgYW5kIG9u CiAgICBhYXJjaDY0LW5vbmUtZWxmLiBUaG91Z2h0cyBvbiBnZXR0aW5nIHRoaXMgaW50byB0cnVu az8KICAgIAogICAgVGhhbmsgeW91LAogICAgU3RhbSBNYXJraWFub3MtV3JpZ2h0CiAgICAKICAg IGdjYy9DaGFuZ2VMb2c6CiAgICAKICAgICAgICAgICAgKiBjb25maWcvYXJtL2FybS1wcm90b3Mu aCAoYXJtX3RhcmdldF9pbnNuX29rX2Zvcl9sb2IpOiBSZW5hbWUgdG8uLi4KICAgICAgICAgICAg KGFybV90YXJnZXRfYmJfb2tfZm9yX2xvYik6IC4uLnRoaXMKICAgICAgICAgICAgKGFybV9hdHRl bXB0X2Rsc3RwX3RyYW5zZm9ybSk6IE5ldy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL2FybS5j YyAoVEFSR0VUX0xPT1BfVU5ST0xMX0FESlVTVCk6IE5ldy4KICAgICAgICAgICAgKFRBUkdFVF9Q UkVESUNUX0RPTE9PUF9QKTogTmV3LgogICAgICAgICAgICAoYXJtX2Jsb2NrX3NldF92ZWN0KToK ICAgICAgICAgICAgKGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iKTogUmVuYW1lIGZyb20gYXJt X3RhcmdldF9pbnNuX29rX2Zvcl9sb2IuCiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2JiX29rX2Zv cl9sb2IpOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX2dldF92Y3RwX2xhbmVzKTogTmV3Lgog ICAgICAgICAgICAoYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnKTogTmV3LgogICAgICAgICAgICAo YXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtKTogTmV3LgogICAgICAgICAgICAoYXJtX2dl dF9yZXF1aXJlZF92cHJfcmVnX3JldF92YWwpOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX2dl dF9sb29wX3ZjdHApOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX3ZlY19pbnNuX2lzX3VucHJl ZGljYXRlZF9vcl91c2VzX290aGVyX3ByZWRpY2F0ZSk6IE5ldy4KICAgICAgICAgICAgKGFybV9t dmVfdmVjX2luc25faXNfcHJlZGljYXRlZF93aXRoX3RoaXNfcHJlZGljYXRlKTogTmV3LgogICAg ICAgICAgICAoYXJtX212ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljKTog TmV3LgogICAgICAgICAgICAoYXJtX212ZV9jaGVja19kZl9jaGFpbl9md2RfZm9yX2ltcGxpY19w cmVkaWNfaW1wYWN0KTogTmV3LgogICAgICAgICAgICAoYXJtX212ZV9jaGVja19yZWdfb3JpZ2lu X2lzX251bV9lbGVtcyk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfZGxzdHBfY2hlY2tfaW5j X2NvdW50ZXIpOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX2Rsc3RwX2NoZWNrX2RlY19jb3Vu dGVyKTogTmV3LgogICAgICAgICAgICAoYXJtX212ZV9sb29wX3ZhbGlkX2Zvcl9kbHN0cCk6IE5l dy4KICAgICAgICAgICAgKGFybV9wcmVkaWN0X2RvbG9vcF9wKTogTmV3LgogICAgICAgICAgICAo YXJtX2xvb3BfdW5yb2xsX2FkanVzdCk6IE5ldy4KICAgICAgICAgICAgKGFybV9lbWl0X212ZV91 bnByZWRpY2F0ZWRfaW5zbl90b19zZXEpOiBOZXcuCiAgICAgICAgICAgIChhcm1fYXR0ZW1wdF9k bHN0cF90cmFuc2Zvcm0pOiBOZXcuCiAgICAgICAgICAgICogY29uZmlnL2FybS9pdGVyYXRvcnMu bWQgKERMU1RQKTogTmV3LgogICAgICAgICAgICAobW9kZTEpOiBBZGQgRExTVFAgbWFwcGluZ3Mu CiAgICAgICAgICAgICogY29uZmlnL2FybS9tdmUubWQgKCpwcmVkaWNhdGVkX2RvbG9vcF9lbmRf aW50ZXJuYWwpOiBOZXcuCiAgICAgICAgICAgIChkbHN0cDxtb2RlMT5faW5zbik6IE5ldy4KICAg ICAgICAgICAgKiBjb25maWcvYXJtL3RodW1iMi5tZCAoZG9sb29wX2VuZCk6IFVwZGF0ZSBmb3Ig TVZFIExPTHMuCiAgICAgICAgICAgICogY29uZmlnL2FybS91bnNwZWNzLm1kOiBOZXcgdW5zcGVj cy4KICAgICAgICAgICAgKiBkZi1jb3JlLmNjIChkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kKTog TmV3LgogICAgICAgICAgICAqIGRmLmggKGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQpOiBOZXcu CiAgICAgICAgICAgICogbG9vcC1kb2xvb3AuY2MgKGRvbG9vcF9jb25kaXRpb25fZ2V0KTogUmVs YXggY29uZGl0aW9ucy4KICAgICAgICAgICAgKGRvbG9vcF9vcHRpbWl6ZSk6IEFkZCBzdXBwb3J0 IGZvciBlbGVtZW50d2lzZSBMb0xzLgogICAgCiAgICBnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoK ICAgIAogICAgICAgICAgICAqIGdjYy50YXJnZXQvYXJtL2xvYi5oOiBVcGRhdGUgZnJhbWV3b3Jr LgogICAgICAgICAgICAqIGdjYy50YXJnZXQvYXJtL2xvYjEuYzogTGlrZXdpc2UuCiAgICAgICAg ICAgICogZ2NjLnRhcmdldC9hcm0vbG9iNi5jOiBMaWtld2lzZS4KICAgICAgICAgICAgKiBnY2Mu dGFyZ2V0L2FybS9tdmUvZGxzdHAtY29tcGlsZS1hc20uYzogTmV3IHRlc3QuCiAgICAgICAgICAg ICogZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDE2eDguYzogTmV3IHRlc3QuCiAgICAgICAg ICAgICogZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYzogTmV3IHRlc3QuCiAgICAg ICAgICAgICogZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDY0eDIuYzogTmV3IHRlc3QuCiAg ICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4MTYuYzogTmV3IHRlc3Qu CiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludmFsaWQtYXNtLmM6IE5l dyB0ZXN0LgoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybS1wcm90b3MuaCBiL2djYy9j b25maWcvYXJtL2FybS1wcm90b3MuaAppbmRleCA2MWZjZDY3MTQzNy4uYjRmNjUzOGM5OTEgMTAw NjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL2FybS1wcm90b3MuaAorKysgYi9nY2MvY29uZmlnL2Fy bS9hcm0tcHJvdG9zLmgKQEAgLTY0LDggKzY0LDggQEAgZXh0ZXJuIHZvaWQgYXJtX2VtaXRfc3Bl Y3VsYXRpb25fYmFycmllcl9mdW5jdGlvbiAodm9pZCk7CiBleHRlcm4gdm9pZCBhcm1fZGVjb21w b3NlX2RpX2Jpbm9wIChydHgsIHJ0eCwgcnR4ICosIHJ0eCAqLCBydHggKiwgcnR4ICopOwogZXh0 ZXJuIGJvb2wgYXJtX3FfYml0X2FjY2VzcyAodm9pZCk7CiBleHRlcm4gYm9vbCBhcm1fZ2VfYml0 c19hY2Nlc3MgKHZvaWQpOwotZXh0ZXJuIGJvb2wgYXJtX3RhcmdldF9pbnNuX29rX2Zvcl9sb2Ig KHJ0eCk7Ci0KK2V4dGVybiBib29sIGFybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAoYmFzaWNfYmxv Y2spOworZXh0ZXJuIHJ0eCBhcm1fYXR0ZW1wdF9kbHN0cF90cmFuc2Zvcm0gKHJ0eCk7CiAjaWZk ZWYgUlRYX0NPREUKIGVudW0gcmVnX2NsYXNzCiBhcm1fbW9kZV9iYXNlX3JlZ19jbGFzcyAobWFj aGluZV9tb2RlKTsKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybS5jYyBiL2djYy9jb25m aWcvYXJtL2FybS5jYwppbmRleCBjM2U3MzFiODk4Mi4uNzYwNjM1ZGE5MTQgMTAwNjQ0Ci0tLSBh L2djYy9jb25maWcvYXJtL2FybS5jYworKysgYi9nY2MvY29uZmlnL2FybS9hcm0uY2MKQEAgLTY1 OSw2ICs2NTksMTIgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfc3BlYyBhcm1fYXR0 cmlidXRlX3RhYmxlW10gPQogI3VuZGVmIFRBUkdFVF9IQVZFX0NPTkRJVElPTkFMX0VYRUNVVElP TgogI2RlZmluZSBUQVJHRVRfSEFWRV9DT05ESVRJT05BTF9FWEVDVVRJT04gYXJtX2hhdmVfY29u ZGl0aW9uYWxfZXhlY3V0aW9uCiAKKyN1bmRlZiBUQVJHRVRfTE9PUF9VTlJPTExfQURKVVNUCisj ZGVmaW5lIFRBUkdFVF9MT09QX1VOUk9MTF9BREpVU1QgYXJtX2xvb3BfdW5yb2xsX2FkanVzdAor CisjdW5kZWYgVEFSR0VUX1BSRURJQ1RfRE9MT09QX1AKKyNkZWZpbmUgVEFSR0VUX1BSRURJQ1Rf RE9MT09QX1AgYXJtX3ByZWRpY3RfZG9sb29wX3AKKwogI3VuZGVmIFRBUkdFVF9MRUdJVElNQVRF X0NPTlNUQU5UX1AKICNkZWZpbmUgVEFSR0VUX0xFR0lUSU1BVEVfQ09OU1RBTlRfUCBhcm1fbGVn aXRpbWF0ZV9jb25zdGFudF9wCiAKQEAgLTM0NDE2LDkgKzM0NDIyLDggQEAgYXJtX2ludmFsaWRf d2l0aGluX2RvbG9vcCAoY29uc3QgcnR4X2luc24gKmluc24pCiB9CiAKIGJvb2wKLWFybV90YXJn ZXRfaW5zbl9va19mb3JfbG9iIChydHggaW5zbikKK2FybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAo YmFzaWNfYmxvY2sgYmIpCiB7Ci0gIGJhc2ljX2Jsb2NrIGJiID0gQkxPQ0tfRk9SX0lOU04gKGlu c24pOwogICAvKiBNYWtlIHN1cmUgdGhlIGJhc2ljIGJsb2NrIG9mIHRoZSB0YXJnZXQgaW5zbiBp cyBhIHNpbXBsZSBsYXRjaAogICAgICBoYXZpbmcgYXMgc2luZ2xlIHByZWRlY2Vzc29yIGFuZCBz dWNjZXNzb3IgdGhlIGJvZHkgb2YgdGhlIGxvb3AKICAgICAgaXRzZWxmLiAgT25seSBzaW1wbGUg bG9vcHMgd2l0aCBhIHNpbmdsZSBiYXNpYyBibG9jayBhcyBib2R5IGFyZQpAQCAtMzQ0MjcsOCAr MzQ0MzIsOTIzIEBAIGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iIChydHggaW5zbikKIAogICBy ZXR1cm4gc2luZ2xlX3N1Y2NfcCAoYmIpCiAgICAgJiYgc2luZ2xlX3ByZWRfcCAoYmIpCi0gICAg JiYgc2luZ2xlX3N1Y2NfZWRnZSAoYmIpLT5kZXN0ID09IHNpbmdsZV9wcmVkX2VkZ2UgKGJiKS0+ c3JjCi0gICAgJiYgY29udGFpbnNfbm9fYWN0aXZlX2luc25fcCAoYmIpOworICAgICYmIHNpbmds ZV9zdWNjX2VkZ2UgKGJiKS0+ZGVzdCA9PSBzaW5nbGVfcHJlZF9lZGdlIChiYiktPnNyYzsKK30K KworLyogVXRpbGl0eSBmdWN0aW9uOiBHaXZlbiBhIFZDVFAgb3IgYSBWQ1RQX00gaW5zbiwgcmV0 dXJuIHRoZSBudW1iZXIgb2YgTVZFCisgICBsYW5lcyBiYXNlZCBvbiB0aGUgbWFjaGluZSBtb2Rl IGJlaW5nIHVzZWQuICAqLworCitzdGF0aWMgaW50Cithcm1fbXZlX2dldF92Y3RwX2xhbmVzIChy dHggeCkKK3sKKyAgaWYgKEdFVF9DT0RFICh4KSA9PSBTRVQgJiYgR0VUX0NPREUgKFhFWFAgKHgs IDEpKSA9PSBVTlNQRUMKKyAgICAgICYmIChYSU5UIChYRVhQICh4LCAxKSwgMSkgPT0gVkNUUCB8 fCBYSU5UIChYRVhQICh4LCAxKSwgMSkgPT0gVkNUUF9NKSkKKyAgICB7CisgICAgICBzd2l0Y2gg KEdFVF9NT0RFIChYRVhQICh4LCAxKSkpCisJeworCSAgY2FzZSBWMTZCSW1vZGU6CisJICAgIHJl dHVybiAxNjsKKwkgIGNhc2UgVjhCSW1vZGU6CisJICAgIHJldHVybiA4OworCSAgY2FzZSBWNEJJ bW9kZToKKwkgICAgcmV0dXJuIDQ7CisJICBjYXNlIFYyUUltb2RlOgorCSAgICByZXR1cm4gMjsK KwkgIGRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCisv KiBDaGVjayBpZiBhbiBpbnNuIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIFZQUl9SRUcsIGlmIGl0 IGRvZXMsIHJldHVybiB0aGUKKyAgIHN1Yi1ydHggb2YgdGhlIFZQUl9SRUcuICBUaGUgYHR5cGVg IGFyZ3VtZW50IGNvbnRyb2xzIHdoZXRoZXIKKyAgIHRoaXMgZnVuY3Rpb24gc2hvdWxkOgorICAg KiBGb3IgdHlwZSA9PSAwLCBjaGVjayBhbGwgb3BlcmFuZHMsIGluY2x1ZGluZyB0aGUgT1VUIG9w ZXJhbmRzLAorICAgICBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgdGhlIFZQUl9S RUcuCisgICAqIEZvciB0eXBlID09IDEsIG9ubHkgY2hlY2sgdGhlIGlucHV0IG9wZXJhbmRzLgor ICAgKiBGb3IgdHlwZSA9PSAyLCBvbmx5IGNoZWNrIHRoZSBvdXRwdXQgb3BlcmFuZHMuCisgICAo SU5PVVQgb3BlcmFuZHMgYXJlIGNvbnNpZGVyZWQgYm90aCBhcyBpbnB1dCBhbmQgb3V0cHV0IG9w ZXJhbmRzKQorKi8KK3N0YXRpYyBydHgKK2FybV9nZXRfcmVxdWlyZWRfdnByX3JlZyAocnR4X2lu c24gKmluc24sIHVuc2lnbmVkIGludCB0eXBlID0gMCkKK3sKKyAgZ2NjX2Fzc2VydCAodHlwZSA8 IDMpOworICBpZiAoIU5PTkpVTVBfSU5TTl9QIChpbnNuKSkKKyAgICByZXR1cm4gTlVMTF9SVFg7 CisKKwkgIGJvb2wgcmVxdWlyZXNfdnByOworICBleHRyYWN0X2NvbnN0cmFpbl9pbnNuIChpbnNu KTsKKyAgaW50IG5fb3BlcmFuZHMgPSByZWNvZ19kYXRhLm5fb3BlcmFuZHM7CisgIGlmIChyZWNv Z19kYXRhLm5fYWx0ZXJuYXRpdmVzID09IDApCisgICAgcmV0dXJuIE5VTExfUlRYOworCisgIC8q IEZpbGwgaW4gcmVjb2dfb3BfYWx0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnN0cmFp bnRzIG9mCisgICAgIHRoaXMgaW5zbi4gICovCisgIHByZXByb2Nlc3NfY29uc3RyYWludHMgKGlu c24pOworCisgIGZvciAoaW50IG9wID0gMDsgb3AgPCBuX29wZXJhbmRzOyBvcCsrKQorICAgIHsK KyAgICAgIHJlcXVpcmVzX3ZwciA9IHRydWU7CisgICAgICBpZiAodHlwZSA9PSAxICYmIChyZWNv Z19kYXRhLm9wZXJhbmRfdHlwZVtvcF0gPT0gT1BfT1VUCisJCQl8fCByZWNvZ19kYXRhLm9wZXJh bmRfdHlwZVtvcF0gPT0gT1BfSU5PVVQpKQorCWNvbnRpbnVlOworICAgICAgZWxzZSBpZiAodHlw ZSA9PSAyICYmIChyZWNvZ19kYXRhLm9wZXJhbmRfdHlwZVtvcF0gPT0gT1BfSU4KKwkJCSAgICAg fHwgcmVjb2dfZGF0YS5vcGVyYW5kX3R5cGVbb3BdID09IE9QX0lOT1VUKSkKKwljb250aW51ZTsK KworICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIGFsdGVybmF0aXZlcyBvZiBvcGVyYW5kICJvcCIg aW4gcmVjb2dfb3BfYWx0IGFuZAorCSBpZGVudGlmeSBpZiB0aGUgb3BlcmFuZCBpcyByZXF1aXJl ZCB0byBiZSB0aGUgVlBSLiAgKi8KKyAgICAgIGZvciAoaW50IGFsdCA9IDA7IGFsdCA8IHJlY29n X2RhdGEubl9hbHRlcm5hdGl2ZXM7IGFsdCsrKQorCXsKKwkgIGNvbnN0IG9wZXJhbmRfYWx0ZXJu YXRpdmUgKm9wX2FsdAorCSAgICAgID0gJnJlY29nX29wX2FsdFthbHQgKiBuX29wZXJhbmRzXTsK KwkgIC8qIEZldGNoIHRoZSByZWdfY2xhc3MgZm9yIGVhY2ggZW50cnkgYW5kIGNoZWNrIGl0IGFn YWluc3QgdGhlCisJICAgKiBWUFJfUkVHIHJlZ19jbGFzcy4gICovCisJICBpZiAoYWx0ZXJuYXRp dmVfY2xhc3MgKG9wX2FsdCwgb3ApICE9IFZQUl9SRUcpCisJICAgIHJlcXVpcmVzX3ZwciA9IGZh bHNlOworCX0KKyAgICAgIC8qIElmIGFsbCBhbHRlcm5hdGl2ZXMgb2YgdGhlIGluc24gcmVxdWly ZSB0aGUgVlBSIHJlZyBmb3IgdGhpcyBvcGVyYW5kLAorCSBpdCBtZWFucyB0aGF0IGVpdGhlciB0 aGlzIGlzIFZQUi1nZW5lcmF0aW5nIGluc3RydWN0aW9uLCBsaWtlIGEgdmN0cCwKKwkgdmNtcCwg ZXRjLiwgb3IgaXQgaXMgYSBWUFQtcHJlZGljYXRlZCBpbnNydWN0aW9uLiAgUmV0dXJuIHRoZSBz dWJydHgKKwkgb2YgdGhlIFZQUiByZWcgb3BlcmFuZC4gICovCisgICAgICBpZiAocmVxdWlyZXNf dnByKQorCXJldHVybiByZWNvZ19kYXRhLm9wZXJhbmRbb3BdOworICAgIH0KKyAgcmV0dXJuIE5V TExfUlRYOworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIG9mIGFybV9nZXRfcmVxdWlyZWRfdnBy X3JlZyB3aXRoIHR5cGUgPT0gMSwgc28gcmV0dXJuCisgICBzb21ldGhpbmcgb25seSBpZiB0aGUg VlBSIHJlZyBpcyBhbiBpbnB1dCBvcGVyYW5kIHRvIHRoZSBpbnNuLiAgKi8KKworc3RhdGljIHJ0 eAorQUxXQVlTX0lOTElORQorYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChydHhfaW5z biAqaW5zbikKK3sKKyAgcmV0dXJuIGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZyAoaW5zbiwgMSk7 Cit9CisKKy8qIFdyYXBwZXIgZnVuY3Rpb24gb2YgYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnIHdp dGggdHlwZSA9PSAyLCBzbyByZXR1cm4KKyAgIHNvbWV0aGluZyBvbmx5IGlmIHRoZSBWUFIgcmVn IGlzIHRoZSByZXRydXJuIHZhbHVlLCBhbiBvdXRwdXQgb2YsIG9yIGlzCisgICBjbG9iYmVyZWQg YnkgdGhlIGluc24uICAqLworCitzdGF0aWMgcnR4CitBTFdBWVNfSU5MSU5FCithcm1fZ2V0X3Jl cXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbCAocnR4X2luc24gKmluc24pCit7CisgIHJldHVybiBhcm1f Z2V0X3JlcXVpcmVkX3Zwcl9yZWcgKGluc24sIDIpOworfQorCisvKiBTY2FuIHRoZSBiYXNpYyBi bG9jayBvZiBhIGxvb3AgYm9keSBmb3IgYSB2Y3RwIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMK KyAgIGF0IGxlYXN0IHZjdHAgaW5zdHJ1Y3Rpb24sIHJldHVybiB0aGUgZmlyc3QgcnR4X2luc24g Ki4gICovCisKK3N0YXRpYyBydHhfaW5zbiAqCithcm1fbXZlX2dldF9sb29wX3ZjdHAgKGJhc2lj X2Jsb2NrIGJiKQoreworICBydHhfaW5zbiAqaW5zbiA9IEJCX0hFQUQgKGJiKTsKKworICAvKiBO b3cgc2NhbiB0aHJvdWdoIGFsbCB0aGUgaW5zdHJ1Y3Rpb24gcGF0dGVybnMgYW5kIHBpY2sgb3V0 IHRoZSBWQ1RQCisgICAgIGluc3RydWN0aW9uLiAgV2UgcmVxdWlyZSBhcm1fZ2V0X3JlcXVpcmVk X3Zwcl9yZWdfcGFyYW0gdG8gYmUgZmFsc2UKKyAgICAgdG8gbWFrZSBzdXJlIHdlIHBpY2sgdXAg YSBWQ1RQLCByYXRoZXIgdGhhbiBhIFZDVFBfTS4gICovCisgIEZPUl9CQl9JTlNOUyAoYmIsIGlu c24pCisgICAgaWYgKE5PTkRFQlVHX0lOU05fUCAoaW5zbikpCisgICAgICBpZiAoYXJtX2dldF9y ZXF1aXJlZF92cHJfcmVnX3JldF92YWwgKGluc24pCisJICAmJiAoYXJtX212ZV9nZXRfdmN0cF9s YW5lcyAoUEFUVEVSTiAoaW5zbikpICE9IDApCisJICAmJiAhYXJtX2dldF9yZXF1aXJlZF92cHJf cmVnX3BhcmFtIChpbnNuKSkKKwlyZXR1cm4gaW5zbjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8q IFJldHVybiB0cnVlIGlmIGFuIGluc24gaXMgYW4gTVZFIGluc3RydWN0aW9uIHRoYXQgVlBULXBy ZWRpY2FibGUsIGJ1dCBpbgorICAgaXRzIHVucHJlZGljYXRlZCBmb3JtLCBvciBpZiBpdCBpcyBw cmVkaWNhdGVkLCBidXQgb24gYSBwcmVkaWNhdGUgb3RoZXIKKyAgIHRoYW4gdnByX3JlZy4gICov CisKK3N0YXRpYyBib29sCithcm1fbXZlX3ZlY19pbnNuX2lzX3VucHJlZGljYXRlZF9vcl91c2Vz X290aGVyX3ByZWRpY2F0ZSAocnR4X2luc24gKmluc24sCisJCQkJCQkJICBydHggdnByX3JlZykK K3sKKyAgcnR4IGluc25fdnByX3JlZ19vcGVyYW5kOworICBpZiAoTVZFX1ZQVF9VTlBSRURJQ0FU RURfSU5TTl9QIChpbnNuKQorICAgICAgfHwgKE1WRV9WUFRfUFJFRElDQVRFRF9JTlNOX1AgKGlu c24pCisJICAmJiAoaW5zbl92cHJfcmVnX29wZXJhbmQgPSBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9y ZWdfcGFyYW0gKGluc24pKQorCSAgJiYgIXJ0eF9lcXVhbF9wICh2cHJfcmVnLCBpbnNuX3Zwcl9y ZWdfb3BlcmFuZCkpKQorICAgIHJldHVybiB0cnVlOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNl OworfQorCitzdGF0aWMgYm9vbAorYXJtX212ZV92ZWNfaW5zbl9pc19wcmVkaWNhdGVkX3dpdGhf dGhpc19wcmVkaWNhdGUgKHJ0eF9pbnNuICppbnNuLAorCQkJCQkJCSAgcnR4IHZwcl9yZWcpCit7 CisgIHJ0eCBpbnNuX3Zwcl9yZWdfb3BlcmFuZDsKKyAgaWYgKE1WRV9WUFRfUFJFRElDQVRFRF9J TlNOX1AgKGluc24pCisgICAgICAmJiAoaW5zbl92cHJfcmVnX29wZXJhbmQgPSBhcm1fZ2V0X3Jl cXVpcmVkX3Zwcl9yZWdfcGFyYW0gKGluc24pKQorICAgICAgJiYgcnR4X2VxdWFsX3AgKHZwcl9y ZWcsIGluc25fdnByX3JlZ19vcGVyYW5kKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAg IHJldHVybiBmYWxzZTsKK30KKworLyogUmVjdXJzaXZlbHkgc2NhbiB0aHJvdWdoIHRoZSBERiBj aGFpbiBiYWNrd2FyZHMgd2l0aGluIHRoZSBiYXNpYyBibG9jayBhbmQKKyAgIGRldGVybWluZSBp ZiBhbnkgb2YgdGhlIFVTRXMgb2YgdGhlIG9yaWdpbmFsIGluc24gKG9yIHRoZSBVU0VzIG9mIHRo ZSBpbnNucworICAgd2hlcmUgdGh5IHdlcmUgREVGLWVkLCBldGMuLCByZWN1cnNpdmVseSkgd2Vy ZSBhZmZlY3RlZCBieSBpbXBsaWNpdCBWUFQKKyAgIHByZWRpY2F0aW9uIG9mIGFuIE1WRV9WUFRf VU5QUkVESUNBVEVEX0lOU05fUCBpbiBhIGRsc3RwL2xldHAgbG9vcC4KKyAgIEhhdmluZyBzdWNo IGltcGxpY2l0IHByZWRpY2F0aW9uIG9uIGFuIHVucHJlZGljYXRlZCBpbnNuIGlzbid0IGluIGl0 c2VsZgorICAgYW4gZXJyb3IsIGJlY2F1c2UgdGhlIG91dHB1dCBvZiB0aGF0IGluc24gbWlnaHQg dGhlbiBiZSB1c2VkIGluIGEgY29ycmVjdGx5CisgICBwcmVkaWNhdGVkIHN0b3JlIGluc24sIHdo ZXJlIHRoZSBkaXNhYmxlZCBsYW5lcyB3aWxsIGJlIGlnbm9yZWQuICBUbyB2ZXJpZnkKKyAgIHRo aXMgd2UgbGF0ZXIgY2FsbCBhcm1fbXZlX2NoZWNrX2RmX2NoYWluX2Z3ZF9mb3JfaW1wbGljX3By ZWRpY19pbXBhY3QsCisgICB3aGljaCB3aWxsIGNoZWNrIHRoZSBERiBjaGFpbnMgZm9yd2FyZCB0 byBzZWUgaWYgYW55IGltcGxpY2l0bHktcHJlZGljYXRlZAorICAgb3BlcmFuZCBnZXRzIHVzZWQg aW4gYW4gaW1wcm9wZXIgd2F5LiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tfZGZf Y2hhaW5fYmFja19mb3JfaW1wbGljX3ByZWRpYyAocnR4X2luc24gKmluc24sCisJCQkJCSAgICAg ICBydHggdmN0cF92cHJfZ2VuZXJhdGVkKQoreworICBiYXNpY19ibG9jayBib2R5ID0gQkxPQ0tf Rk9SX0lOU04gKGluc24pOworICAvKiBJZiB3ZSd2ZSB0cmFjZWQgYmFjayB0byB0aGUgbG9vcCB2 Y3RwLCB0aGVuIHRoaXMgb3BlcmFuZCBtdXN0IGJlIHRoZSBWUFIKKyAgICAgcmVnIGFuZCBpcyBz YWZlLiAgKi8KKyAgaWYgKGluc24gIT0gYXJtX212ZV9nZXRfbG9vcF92Y3RwIChib2R5KSkKKyAg ICB7CisgICAgICAvKiBUaGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCBhbiBpbnN0cnVjdGlv biBpcyBhZmZlY3RlZCBieSAiaW1wbGljaXQKKwkgcHJlZGljYXRpb24iIGFyZSBhcyBmb2xsb3dz OgorCSAgKiBJdCBpcyBhbiBVTlBSRURJQ0FURURfSU5TTl9QOgorCSAgICAqIFRoYXQgbG9hZHMv c3RvcmVzIGZyb20vdG8gbWVtb3J5LgorCSAgICAqIFdoZXJlIGFueSBvbmUgb2YgaXRzIG9wZXJh bmRzIGFyZSBNVkUgdmVjdG9ycyBmcm9tIG91dHNpZGUgdGhlCisJICAgICAgbG9vcCBib2R5IGJi LgorCU9yOgorCSAgKiBBbnkgb2YgaXQncyBvcGVyYW5kcywgcmVjdXJzaXZlbHkgYmFja3dhcmRz LCBhcmUgYWZmZWN0ZWQuICAqLworICAgICAgaWYgKE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05f UCAoaW5zbikpCisJeworCSAgLyogRmluZCBpZiB0aGlzIGlzIGEgbG9hZCBvciBhIHN0b3JlIGlu c24uICAqLworCSAgZXh0cmFjdF9pbnNuIChpbnNuKTsKKwkgIGludCBuX29wZXJhbmRzID0gcmVj b2dfZGF0YS5uX29wZXJhbmRzOworCSAgZm9yIChpbnQgb3AgPSAwOyBvcCA8IG5fb3BlcmFuZHM7 IG9wKyspCisJICAgIGlmIChtdmVfbWVtb3J5X29wZXJhbmQgKHJlY29nX2RhdGEub3BlcmFuZFtv cF0sCisJCQkJICAgICAgR0VUX01PREUgKHJlY29nX2RhdGEub3BlcmFuZFtvcF0pKSkKKwkgICAg ICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIGRmX3JlZiBpbnNuX3VzZXMgPSBOVUxMOworICAg ICAgRk9SX0VBQ0hfSU5TTl9VU0UgKGluc25fdXNlcywgaW5zbikKKwl7CisJICAvKiBJZiB0aGUg aW5zbiBpcyB1bnByZWRpY2F0ZWQsIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnB1dCByZWcgc2V0 CisJICAgICB0byB0aGUgdGhlIGJhc2ljIGJsb2NrIGFuZCBpcyBhbiBNVkUgdmVjdG9yLCBjb25z aWRlciBpdCB1bnNhZmUuCisJICAqLworCWlmIChNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1Ag KGluc24pCisJICAgICYmIFZBTElEX01WRV9NT0RFIChHRVRfTU9ERSAoREZfUkVGX1JFRyAoaW5z bl91c2VzKSkpCisJICAgICYmIFJFR05PX1JFR19TRVRfUCAoZGZfZ2V0X2xpdmVfaW4gKGJvZHkp LCBERl9SRUZfUkVHTk8KKwkJCQkJCQkoaW5zbl91c2VzKSkpCisJICByZXR1cm4gdHJ1ZTsKKwor CS8qIFN0YXJ0aW5nIGZyb20gdGhlIGN1cnJlbnQgaW5zbiwgc2NhbiBiYWNrd2FyZHMgdGhyb3Vn aCB0aGUgaW5zbiAKKwkgICBjaGFpbiB1bnRpbCBCQl9IRUFEOiAiZm9yIGVhY2ggaW5zbiBpbiB0 aGUgQkIgcHJpb3IgdG8gdGhlIGN1cnJlbnQiLgorCSovCisJcnR4X2luc24gKnByZXZfaW5zbiA9 IE5VTEw7CisJZm9yIChwcmV2X2luc24gPSBpbnNuOworCSAgICAgcHJldl9pbnNuICYmIHByZXZf aW5zbiAhPSBQUkVWX0lOU04gKEJCX0hFQUQgKGJvZHkpKTsKKwkgICAgIHByZXZfaW5zbiA9IFBS RVZfSU5TTiAocHJldl9pbnNuKSkKKwkgIHsKKwkgICAgLyogTG9vayBhdCBhbGwgdGhlIERFRnMg b2YgdGhhdCBwcmV2aW91cyBpbnNuOiBpZiBvbmUgb2YgdGhlbSBpcyBvbgorCSAgICAgICB0aGUg c2FtZSBSRUcgYXMgb3VyIGN1cnJlbnQgaW5zbiwgdGhlbiByZWN1cnNlIGluIG9yZGVyIHRvIGNo ZWNrCisJICAgICAgIHRoYXQgaW5zbidzIFVTRXMuICBJZiBhbnkgb2YgdGhlc2UgaW5zbnMgcmV0 dXJuIHRydWUgYXMKKwkgICAgICAgTVZFX1ZQVF9VTlBSRURJQ0FURURfSU5TTl9QcywgdGhlbiB0 aGUgd2hvbGUgY2hhaW4gaXMgYWZmZWN0ZWQKKwkgICAgICAgYnkgdGhlIGNoYW5nZSBpbiBiZWhh dmlvdXIgZnJvbSBiZWluZyBwbGFjZWQgaW4gZGxzdHAvbGV0cCBsb29wLgorCSAgICAqLworCSAg ICBkZl9yZWYgcHJldl9pbnNuX2RlZnMgPSBOVUxMOworCSAgICBGT1JfRUFDSF9JTlNOX0RFRiAo cHJldl9pbnNuX2RlZnMsIHByZXZfaW5zbikKKwkgICAgICB7CisJCWlmIChERl9SRUZfUkVHTk8g KGluc25fdXNlcykgPT0gREZfUkVGX1JFR05PIChwcmV2X2luc25fZGVmcykKKwkJICAgICYmIGlu c24gIT0gcHJldl9pbnNuCisJCSAgICAmJiBib2R5ID09IEJMT0NLX0ZPUl9JTlNOIChwcmV2X2lu c24pCisJCSAgICAmJiAhYXJtX212ZV92ZWNfaW5zbl9pc19wcmVkaWNhdGVkX3dpdGhfdGhpc19w cmVkaWNhdGUKKwkJCSAoaW5zbiwgdmN0cF92cHJfZ2VuZXJhdGVkKQorCQkgICAgJiYgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljCisJCQkgKHByZXZfaW5zbiwg dmN0cF92cHJfZ2VuZXJhdGVkKSkKKwkJICByZXR1cm4gdHJ1ZTsKKwkgICAgICB9CisJICB9Cisg ICAgICB9CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIElmIHdlIGhhdmUgaWRlbnRp ZmllZCB0aGF0IHRoZSBjdXJyZW50IERFRiB3aWxsIGJlIG1vZGlmaWVkCisgICAgYnkgc3VjaCBp bXBsaWNpdCBwcmVkaWNhdGlvbiwgc2NhbiB0aHJvdWdoIGFsbCB0aGUKKyAgIGluc25zIHRoYXQg VVNFIGl0IGFuZCBiYWlsIG91dCBpZiBhbnkgb25lIGlzIG91dHNpZGUgdGhlCisgICBjdXJyZW50 IGJhc2ljIGJsb2NrIChpLmUuIHRoZSByZWcgaXMgbGl2ZSBhZnRlciB0aGUgbG9vcCkKKyAgIG9y IGlmIGFueSBhcmUgc3RvcmUgaW5zbnMgdGhhdCBhcmUgdW5wcmVkaWNhdGVkIG9yIHVzaW5nIGEK KyAgIHByZWRpY2F0ZSBvdGhlciB0aGFuIHRoZSBsb29wIFZQUi4gICovCisKK3N0YXRpYyBib29s Cithcm1fbXZlX2NoZWNrX2RmX2NoYWluX2Z3ZF9mb3JfaW1wbGljX3ByZWRpY19pbXBhY3QgKHJ0 eF9pbnNuICppbnNuLAorCQkJCQkJICAgICBydHggdmN0cF92cHJfZ2VuZXJhdGVkKQoreworICAv KiBJZiB0aGlzIGluc24gaXMgaW5kZWVkIGFuIHVucHJlZGljYXRlZCBzdG9yZSB0byBtZW1vcnks IGJhaWwgb3V0LiAgKi8KKyAgaWYgKGFybV9tdmVfdmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29y X3VzZXNfb3RoZXJfcHJlZGljYXRlCisJKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkKKyAgICAg ICYmIG12ZV9tZW1vcnlfb3BlcmFuZCAoU0VUX0RFU1QgKHNpbmdsZV9zZXQgKGluc24pKSwKKwkJ CSAgICAgR0VUX01PREUgKFNFVF9ERVNUIChzaW5nbGVfc2V0IChpbnNuKSkpKSkKKyAgICByZXR1 cm4gdHJ1ZTsKKworICAvKiBOZXh0LCBzY2FuIGZvcndhcmQgdG8gdGhlIHZhcmlvdXMgVVNFcyBv ZiB0aGUgREVGcyBpbiB0aGlzIGluc24uICAqLworICBkZl9yZWYgaW5zbl9kZWYgPSBOVUxMOwor ICBGT1JfRUFDSF9JTlNOX0RFRiAoaW5zbl9kZWYsIGluc24pCisgICAgeworICAgICAgZm9yIChk Zl9yZWYgdXNlID0gREZfUkVHX1VTRV9DSEFJTiAoREZfUkVGX1JFR05PIChpbnNuX2RlZikpOyB1 c2U7CisJICAgdXNlID0gREZfUkVGX05FWFRfUkVHICh1c2UpKQorCXsKKwkgIHJ0eF9pbnNuICpu ZXh0X3VzZV9pbnNuID0gREZfUkVGX0lOU04gKHVzZSk7CisJICBpZiAoaW5zbiAhPSBuZXh0X3Vz ZV9pbnNuICYmIE5PTkRFQlVHX0lOU05fUCAobmV4dF91c2VfaW5zbikpCisJICAgIHsKKwkgICAg ICAvKiBJZiB0aGUgVVNFIGlzIG91dHNpZGUgdGhlIGxvb3AgYm9keSBiYiwgb3IgaXQgaXMgaW5z aWRlLCBidXQKKwkJIGlzIGFuIHVucHJlZGljYXRlZCBzdG9yZSB0byBtZW1vcnkuICAqLworCSAg ICAgIGlmIChCTE9DS19GT1JfSU5TTiAoaW5zbikgIT0gQkxPQ0tfRk9SX0lOU04gKG5leHRfdXNl X2luc24pCisJCSB8fCAoYXJtX212ZV92ZWNfaW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19v dGhlcl9wcmVkaWNhdGUKKwkJICAgICAobmV4dF91c2VfaW5zbiwgdmN0cF92cHJfZ2VuZXJhdGVk KQorCQkgICAgJiYgbXZlX21lbW9yeV9vcGVyYW5kCisJCQkoU0VUX0RFU1QgKHNpbmdsZV9zZXQg KG5leHRfdXNlX2luc24pKSwKKwkJCSBHRVRfTU9ERSAoU0VUX0RFU1QgKHNpbmdsZV9zZXQgKG5l eHRfdXNlX2luc24pKSkpKSkKKwkJcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisgICAgfQorICBy ZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sCithcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5f aXNfbnVtX2VsZW1zIChiYXNpY19ibG9jayBib2R5LCBydHggcmVnLCBydHggdmN0cF9zdGVwKQor eworICAvKiBPaywgd2Ugbm93IGtub3cgdGhlIGxvb3Agc3RhcnRzIGZyb20gemVybyBhbmQgaW5j cmVtZW50cyBieSBvbmUuCisgICAgIE5vdyBqdXN0IHNob3cgdGhhdCB0aGUgbWF4IHZhbHVlIG9m IHRoZSBjb3VudGVyIGNhbWUgZnJvbSBhbgorICAgICBhcHByb3ByaWF0ZSBBU0hJRlJUIGV4cHIg b2YgdGhlIGNvcnJlY3QgYW1vdW50LiAgKi8KKyAgYmFzaWNfYmxvY2sgcHJlX2xvb3BfYmIgPSBi b2R5LT5wcmV2X2JiOworICB3aGlsZSAocHJlX2xvb3BfYmIgJiYgQkJfRU5EIChwcmVfbG9vcF9i YikKKwkgJiYgIWRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQgKHByZV9sb29wX2JiLCBSRUdOTyAo cmVnKSkpCisgICAgcHJlX2xvb3BfYmIgPSBwcmVfbG9vcF9iYi0+cHJldl9iYjsKKworICBkZl9y ZWYgY291bnRlcl9tYXhfbGFzdF9kZWYgPSBkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kIChwcmVf bG9vcF9iYiwgUkVHTk8gKHJlZykpOworICBydHggY291bnRlcl9tYXhfbGFzdF9zZXQ7CisgIGlm IChjb3VudGVyX21heF9sYXN0X2RlZikKKyAgICBjb3VudGVyX21heF9sYXN0X3NldCA9IFBBVFRF Uk4gKERGX1JFRl9JTlNOIChjb3VudGVyX21heF9sYXN0X2RlZikpOworICBlbHNlCisgICAgcmV0 dXJuIGZhbHNlOworCisgIC8qIElmIHdlIGVuY291bnRlciBhIHNpbXBsZSBTRVQgZnJvbSBhIFJF RywgZm9sbG93IGl0IHRocm91Z2guICAqLworICBpZiAoR0VUX0NPREUgKGNvdW50ZXJfbWF4X2xh c3Rfc2V0KSA9PSBTRVQKKyAgICAgICYmIFJFR19QIChYRVhQIChjb3VudGVyX21heF9sYXN0X3Nl dCwgMSkpKQorICAgIHJldHVybiBhcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5faXNfbnVtX2VsZW1z CisJICAgICAocHJlX2xvb3BfYmIsIFhFWFAgKGNvdW50ZXJfbWF4X2xhc3Rfc2V0LCAxKSwgdmN0 cF9zdGVwKTsKKworICBpZiAoR0VUX0NPREUgKFhFWFAgKGNvdW50ZXJfbWF4X2xhc3Rfc2V0LCAx KSkgPT0gQVNISUZUUlQKKyAgICAgICYmIENPTlNUX0lOVF9QIChYRVhQIChYRVhQIChjb3VudGVy X21heF9sYXN0X3NldCwgMSksIDEpKQorICAgICAgJiYgKCgxIDw8IElOVFZBTCAoWEVYUCAoWEVY UCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEpLCAxKSkpCisJICAgPT0gYWJzIChJTlRWQUwgKHZj dHBfc3RlcCkpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8q IElmIHdlIGhhdmUgaWRlbnRpZmllZCB0aGUgbG9vcCB0byBoYXZlIGFuIGluY3JlbWVudGluZyBj b3VudGVyLCB3ZSBuZWVkIHRvCisgICBtYWtlIHN1cmUgdGhhdCBpdCBpbmNyZW1lbnRzIGJ5IDEg YW5kIHRoYXQgdGhlIGxvb3AgaXMgc3RydWN0dXJlZCBjb3JyZWN0bHk6CisgICAgKiBUaGUgY291 bnRlciBzdGFydHMgZnJvbSAwCisgICAgKiBUaGUgY291bnRlciB0ZXJtaW5hdGVzIGF0IChudW1f b2ZfZWxlbSArIG51bV9vZl9sYW5lcyAtIDEpIC8gbnVtX29mX2xhbmVzCisgICAgKiBUaGUgdmN0 cCBpbnNuIHVzZXMgYSByZWcgdGhhdCBkZWNyZW1lbnRzIGFwcHJvcHJpYXRlbHkgaW4gZWFjaCBp dGVyYXRpb24uCisqLworCitzdGF0aWMgYm9vbAorYXJtX212ZV9kbHN0cF9jaGVja19pbmNfY291 bnRlciAoYmFzaWNfYmxvY2sgYm9keSwgcnR4X2luc24qIHZjdHBfaW5zbiwKKwkJCQkgcnR4IGNv bmRjb25zdCwgcnR4IGNvbmRjb3VudCkKK3sKKyAgcnR4IHZjdHBfcmVnID0gWFZFQ0VYUCAoWEVY UCAoUEFUVEVSTiAodmN0cF9pbnNuKSwgMSksIDAsIDApOworICAvKiBUaGUgbG9vcCBsYXRjaCBo YXMgdG8gYmUgZW1wdHkuICBXaGVuIGNvbXBpbGluZyBhbGwgdGhlIGtub3duIE1WRSBMb0xzIGlu CisgICAgIHVzZXIgYXBwbGljYXRpb25zLCBub25lIG9mIHRob3NlIHdpdGggaW5jcmVtZW50aW5n IGNvdW50ZXJzIGhhZCBhbnkgcmVhbAorICAgICBpbnNucyBpbiB0aGUgbG9vcCBsYXRjaC4gIEFz IHN1Y2gsIHRoaXMgZnVuY3Rpb24gaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgd2l0aAorICAgICBhbiBl bXB0eSBsYXRjaCBhbmQgbWF5IG1pc2JlaGF2ZSBvciBJQ0UgaWYgd2Ugc29tZWhvdyBnZXQgaGVy ZSB3aXRoIGFuCisgICAgIGluY3JlbWVudCBpbiB0aGUgbGF0Y2gsIHNvLCBmb3Igc2FuaXR5LCBl cnJvciBvdXQgZWFybHkuICAqLworICBydHhfaW5zbiAqZGVjX2luc24gPSBCQl9FTkQgKGJvZHkt Pmxvb3BfZmF0aGVyLT5sYXRjaCk7CisgIGlmIChOT05ERUJVR19JTlNOX1AgKGRlY19pbnNuKSkK KyAgICBnY2NfdW5yZWFjaGFibGUgKCk7CisKKyAgY2xhc3MgcnR4X2l2IHZjdHBfcmVnX2l2Owor ICAvKiBGb3IgbG9vcHMgb2YgdHlwZSBCKSB0aGUgbG9vcCBjb3VudGVyIGlzIGluZGVwZW5kZW50 IG9mIHRoZSBkZWNyZW1lbnQKKyAgICAgb2YgdGhlIHJlZyB1c2VkIGluIHRoZSB2Y3RwX2luc24u IFNvIHJ1biBpdiBhbmFseXNpcyBvbiB0aGF0IHJlZy4gIFRoaXMKKyAgICAgaGFzIHRvIHN1Y2Nl ZWQgZm9yIHN1Y2ggbG9vcHMgdG8gYmUgc3VwcG9ydGVkLiAgKi8KKyAgaWYgKCFpdl9hbmFseXpl ICh2Y3RwX2luc24sIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKHZjdHBfcmVnKSks CisgICAgICB2Y3RwX3JlZywgJnZjdHBfcmVnX2l2KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAg LyogRmluZCB3aGVyZSBib3RoIG9mIHRob3NlIGFyZSBtb2RpZmllZCBpbiB0aGUgbG9vcCBib2R5 IGJiLiAgKi8KKyAgcnR4IGNvbmRjb3VudF9yZWdfc2V0ID0gUEFUVEVSTiAoREZfUkVGX0lOU04g KGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQKKwkJCQkJCSAoYm9keSwgUkVHTk8gKGNvbmRjb3Vu dCkpKSk7CisgIHJ0eCB2Y3RwX3JlZ19zZXQgPSBQQVRURVJOIChERl9SRUZfSU5TTiAoZGZfYmJf cmVnbm9fb25seV9kZWZfZmluZAorCQkJCQkgICAgKGJvZHksIFJFR05PICh2Y3RwX3JlZykpKSk7 CisgIGlmICghdmN0cF9yZWdfc2V0IHx8ICFjb25kY291bnRfcmVnX3NldCkKKyAgICByZXR1cm4g ZmFsc2U7CisKKyAgaWYgKFJFR19QIChjb25kY291bnQpICYmIFJFR19QIChjb25kY29uc3QpKQor ICAgIHsKKyAgICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8gcHJvdmUgdGhhdCB0aGUgbG9vcCBpcyBn b2luZyAwLi5jb25kY29uc3Qgd2l0aCBhbgorCSBpbmMgb2YgMSBpbiBlYWNoIGl0ZXJhdGlvbi4g ICovCisgICAgICBpZiAoR0VUX0NPREUgKFhFWFAgKGNvbmRjb3VudF9yZWdfc2V0LCAxKSkgPT0g UExVUworCSAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGNvbmRjb3VudF9yZWdfc2V0LCAx KSwgMSkpCisJICAmJiBJTlRWQUwgKFhFWFAgKFhFWFAgKGNvbmRjb3VudF9yZWdfc2V0LCAxKSwg MSkpID09IDEpCisJeworCSAgLyogQ2hlY2sgdGhhdCB0aGUgY291bnRlciBkaWQgaW5kZWVkIHN0 YXJ0IGZyb20gemVyby4gICovCisJICBydHggY291bnRlcl9vcmlnX3NldDsKKwkgIGNvdW50ZXJf b3JpZ19zZXQgPSBYRVhQIChQQVRURVJOCisJCQkJICAgIChERl9SRUZfSU5TTgorCQkJCSAgICAg IChERl9SRUZfTkVYVF9SRUcKKwkJCQkJKERGX1JFR19ERUZfQ0hBSU4KKwkJCQkJIChSRUdOTwor CQkJCQkgICAoWEVYUCAoY29uZGNvdW50X3JlZ19zZXQsIDApKSkpKSksIDEpOworCSAgaWYgKCFD T05TVF9JTlRfUCAoY291bnRlcl9vcmlnX3NldCkKKwkgICAgICB8fCAoSU5UVkFMIChjb3VudGVy X29yaWdfc2V0KSAhPSAwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLyogQW5kIGZpbmFsbHkg Y2hlY2sgdGhhdCB0aGUgdGFyZ2V0IHZhbHVlIG9mIHRoZSBjb3VudGVyLCBjb25kY29uc3QKKwkg ICAgIGlzIG9mIHRoZSBjb3JyZWN0IHNoYXBlLiAgKi8KKwkgIGlmICghYXJtX212ZV9jaGVja19y ZWdfb3JpZ2luX2lzX251bV9lbGVtcyAoYm9keSwgY29uZGNvbnN0LCB2Y3RwX3JlZ19pdi5zdGVw KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gZmFsc2U7Cisg ICAgfQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEV4dHJhY3QgdGhlIGRlY3Jl bWVudG51bSBvZiB0aGUgdmN0cCByZWcuICAqLworICBpbnQgZGVjcmVtZW50bnVtID0gYWJzIChJ TlRWQUwgKHZjdHBfcmVnX2l2LnN0ZXApKTsKKyAgLyogRW5zdXJlIGl0IG1hdGNoZXMgdGhlIG51 bWJlciBvZiBsYW5lcyBvZiB0aGUgdmN0cCBpbnN0cnVjdGlvbi4gICovCisgIGlmIChkZWNyZW1l bnRudW0gIT0gYXJtX212ZV9nZXRfdmN0cF9sYW5lcyAoUEFUVEVSTiAodmN0cF9pbnNuKSkpCisg ICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgdmFsaWQuICAqLworICBy ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2FybV9tdmVfZGxzdHBfY2hlY2tfZGVjX2Nv dW50ZXIgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eF9pbnNuKiB2Y3RwX2luc24sCisJCQkJIHJ0eCBj b25kY29uc3QsIHJ0eCBjb25kY291bnQpCit7CisgIHJ0eCB2Y3RwX3JlZyA9IFhWRUNFWFAgKFhF WFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsKKyAgY2xhc3MgcnR4X2l2IHZjdHBf cmVnX2l2OworICBpbnQgZGVjcmVtZW50bnVtOworICAvKiBGb3IgZGVjcmVtZW50aW5nIGxvb3Bz IG9mIHR5cGUgQSksIHRoZSBjb3VudGVyIGlzIHVzdWFsbHkgcHJlc2VudCBpbiB0aGUKKyAgICAg bG9vcCBsYXRjaC4gIEhlcmUgd2Ugc2ltcGx5IG5lZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBjb3Vu dGVyIGlzIHRoZSBzYW1lCisgICAgIHJlZyB0aGF0IGlzIGFsc28gdXNlZCBpbiB0aGUgdmN0cF9p bnNuIGFuZCB0aGF0IGl0IGlzIG5vdCBvdGhlcndpc2UKKyAgICAgbW9kaWZpZWQuICAqLworICBy dHhfaW5zbiAqZGVjX2luc24gPSBCQl9FTkQgKGJvZHktPmxvb3BfZmF0aGVyLT5sYXRjaCk7Cisg IC8qIElmIG5vdCBpbiB0aGUgbG9vcCBsYXRjaCwgdHJ5IHRvIGZpbmQgdGhlIGRlY3JlbWVudCBp biB0aGUgbG9vcCBib2R5LiAgKi8KKyAgaWYgKCFOT05ERUJVR19JTlNOX1AgKGRlY19pbnNuKSkK KyAgeworICAgIGRmX3JlZiB0ZW1wID0gZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAoYm9keSwg UkVHTk8gKGNvbmRjb3VudCkpOworICAgIC8qIElmIHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZp bmQgdGhlIGRlY3JlbWVudCwgYmFpbCBvdXQuICAqLworICAgIGlmICghdGVtcCkKKyAgICAgIHJl dHVybiBmYWxzZTsKKyAgICBkZWNfaW5zbiA9IERGX1JFRl9JTlNOICh0ZW1wKTsKKyAgfQorCisg IC8qIE5leHQsIGVuc3VyZSB0aGF0IGl0IGlzIGEgUExVUyBvZiB0aGUgZm9ybToKKyAgICAgKHNl dCAocmVnIGEpIChwbHVzIChyZWcgYSkgKGNvbnN0X2ludCkpKQorICAgICB3aGVyZSAocmVnIGEp IGlzIHRoZSBzYW1lIGFzIGNvbmRjb3VudC4gICovCisgIGlmIChHRVRfQ09ERSAoWEVYUCAoUEFU VEVSTiAoZGVjX2luc24pLCAxKSkgPT0gUExVUworICAgICAgJiYgUkVHTk8gKFhFWFAgKFBBVFRF Uk4gKGRlY19pbnNuKSwgMCkpCisJICA9PSBSRUdOTyAoWEVYUCAoWEVYUCAoUEFUVEVSTiAoZGVj X2luc24pLCAxKSwgMCkpCisgICAgICAmJiBSRUdOTyAoWEVYUCAoUEFUVEVSTiAoZGVjX2luc24p LCAwKSkgPT0gUkVHTk8gKGNvbmRjb3VudCkpCisgICAgZGVjcmVtZW50bnVtID0gYWJzIChJTlRW QUwgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGRlY19pbnNuKSwgMSksIDEpKSk7CisgIGVsc2UKKyAg ICByZXR1cm4gZmFsc2U7CisKKyAgLyogT2ssIHNvIHdlIG5vdyBrbm93IHRoZSBsb29wIGRlY3Jl bWVudC4gIElmIGl0IGlzIGEgMSwgdGhlbiB3ZSBuZWVkIHRvCisgICAgIGxvb2sgYXQgdGhlIGxv b3AgdmN0cF9yZWcgYW5kIHZlcmlmeSB0aGF0IGl0IGFsc28gZGVjcmVtZW50cyBjb3JyZWN0bHku CisgICAgIFRoZW4sIHdlIG5lZWQgdG8gZXN0YWJsaXNoIHRoYXQgdGhlIHN0YXJ0aW5nIHZhbHVl IG9mIHRoZSBsb29wIGRlY3JlbWVudAorICAgICBvcmlnaW5hdGVzIGZyb20gdGhlIHN0YXJ0aW5n IHZhbHVlIG9mIHRoZSB2Y3RwIGRlY3JlbWVudC4gICovCisgIGlmIChkZWNyZW1lbnRudW0gPT0g MSkKKyAgICB7CisgICAgICBjbGFzcyBydHhfaXYgdmN0cF9yZWdfaXY7CisgICAgICAvKiBUaGUg bG9vcCBjb3VudGVyIGlzIGZvdW5kIHRvIGJlIGluZGVwZW5kZW50IG9mIHRoZSBkZWNyZW1lbnQK Kwkgb2YgdGhlIHJlZyB1c2VkIGluIHRoZSB2Y3RwX2luc24sIGFnYWluLiAgRW5zdXJlIHRoYXQg SVYgYW5hbHlzaXMKKwkgc3VjY2VlZHMgYW5kIGNoZWNrIHRoZSBzdGVwLiAgKi8KKyAgICAgIGlm ICghaXZfYW5hbHl6ZSAodmN0cF9pbnNuLCBhc19hPHNjYWxhcl9pbnRfbW9kZT4gKEdFVF9NT0RF ICh2Y3RwX3JlZykpLAorCQkgICAgICAgdmN0cF9yZWcsICZ2Y3RwX3JlZ19pdikpCisJcmV0dXJu IGZhbHNlOworICAgICAgLyogRW5zdXJlIGl0IG1hdGNoZXMgdGhlIG51bWJlciBvZiBsYW5lcyBv ZiB0aGUgdmN0cCBpbnN0cnVjdGlvbi4gICovCisgICAgICBpZiAoYWJzIChJTlRWQUwgKHZjdHBf cmVnX2l2LnN0ZXApKQorCSAgIT0gYXJtX212ZV9nZXRfdmN0cF9sYW5lcyAoUEFUVEVSTiAodmN0 cF9pbnNuKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFhcm1fbXZlX2NoZWNrX3JlZ19v cmlnaW5faXNfbnVtX2VsZW1zIChib2R5LCBjb25kY291bnQsIHZjdHBfcmVnX2l2LnN0ZXApKQor CXJldHVybiBmYWxzZTsKKyAgICB9CisgIC8qIElmIHRoZSBkZWNyZW1lbnRzIGFyZSB0aGUgc2Ft ZSwgdGhlbiB0aGUgc2l0dWF0aW9uIGlzIHNpbXBsZTogZWl0aGVyIHRoZXkKKyAgICAgYXJlIGFs c28gdGhlIHNhbWUgcmVnLCB3aGljaCBpcyBzYWZlLCBvciB0aGV5IGFyZSBkaWZmZXJlbnQgcmVn aXN0ZXJzLCBpbgorICAgICB3aGljaCBjYXNlIG1ha3NlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIG9u bHkgc2ltcGxlIFNFVCBmcm9tIG9uZSB0byB0aGUKKyAgICAgb3RoZXIgaW5zaWRlIHRoZSBsb29w LiovCisgIGVsc2UgaWYgKGRlY3JlbWVudG51bSA9PSBhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQ QVRURVJOICh2Y3RwX2luc24pKSkKKyAgICB7CisgICAgICBpZiAoUkVHTk8gKGNvbmRjb3VudCkg IT0gUkVHTk8gKHZjdHBfcmVnKSkKKwl7CisJICAvKiBJdCB3YXNuJ3QgdGhlIHNhbWUgcmVnLCBi dXQgaXQgY291bGQgYmUgYmVoaWxkIGEKKwkgICAgIChzZXQgKHZjdHBfcmVnKSAoY29uZGNvdW50 KSksIHNvIGluc3RlYWQgZmluZCB3aGVyZQorCSAgICAgdGhlIFZDVFAgaW5zbiBpcyBERUYnZCBp bnNpZGUgdGhlIGxvb3AuICAqLworCSAgcnR4IHZjdHBfcmVnX3NldCA9CisJCVBBVFRFUk4gKERG X1JFRl9JTlNOIChkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kCisJCQkJCShib2R5LCBSRUdOTyAo dmN0cF9yZWcpKSkpOworCSAgLyogVGhpcyBtdXN0IGp1c3QgYmUgYSBzaW1wbGUgU0VUIGZyb20g dGhlIGNvbmRjb3VudC4gICovCisJICBpZiAoR0VUX0NPREUgKHZjdHBfcmVnX3NldCkgIT0gU0VU IHx8ICFSRUdfUCAoWEVYUCAodmN0cF9yZWdfc2V0LCAxKSkKKwkgICAgICB8fCBSRUdOTyAoWEVY UCAodmN0cF9yZWdfc2V0LCAxKSkgIT0gUkVHTk8gKGNvbmRjb3VudCkpCisJICAgIHJldHVybiBm YWxzZTsKKwl9CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFdlIG5v dyBvbmx5IG5lZWQgdG8gZmluZCBvdXQgdGhhdCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdpdGggYSBM RQorICAgICB6ZXJvIGNvbmRpdGlvbi4gIElmIGNvbmRjb25zdCBpcyBhIGNvbnN0X2ludCwgdGhl biB0aGlzIGlzIGVhc3kuCisgICAgIElmIGl0cyBhIFJFRywgbG9vayBhdCB0aGUgbGFzdCBjb25k aXRpb24ranVtcCBpbiBhIGJiIGJlZm9yZQorICAgICB0aGUgbG9vcCwgYmVjYXVzZSB0aGF0IHVz dWFsbHkgd2lsbCBoYXZlIGEgYnJhbmNoIGp1bXBpbmcgb3ZlcgorICAgICB0aGUgbG9vcCBib2R5 LiAgKi8KKyAgaWYgKENPTlNUX0lOVF9QIChjb25kY29uc3QpCisgICAgICAmJiAhKElOVFZBTCAo Y29uZGNvbnN0KSA9PSAwICYmIEpVTVBfUCAoQkJfRU5EIChib2R5KSkKKwkgICAmJiBHRVRfQ09E RSAoWEVYUCAoUEFUVEVSTiAoQkJfRU5EIChib2R5KSksIDEpKSA9PSBJRl9USEVOX0VMU0UKKwkg ICAmJiAoR0VUX0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKEJCX0VORCAoYm9keSkpLCAxKSwg MCkpID09IE5FCisJICAgICAgIHx8R0VUX0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKEJCX0VO RCAoYm9keSkpLCAxKSwgMCkpID09IEdUKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlIGlm IChSRUdfUCAoY29uZGNvbnN0KSkKKyAgICB7CisgICAgICBiYXNpY19ibG9jayBwcmVfbG9vcF9i YiA9IGJvZHk7CisgICAgICB3aGlsZSAocHJlX2xvb3BfYmItPnByZXZfYmIgJiYgQkJfRU5EIChw cmVfbG9vcF9iYi0+cHJldl9iYikKKwkgICAgICYmICFKVU1QX1AgKEJCX0VORCAocHJlX2xvb3Bf YmItPnByZXZfYmIpKSkKKwlwcmVfbG9vcF9iYiA9IHByZV9sb29wX2JiLT5wcmV2X2JiOworICAg ICAgaWYgKHByZV9sb29wX2JiICYmIEJCX0VORCAocHJlX2xvb3BfYmIpKQorCXByZV9sb29wX2Ji ID0gcHJlX2xvb3BfYmItPnByZXZfYmI7CisgICAgICBlbHNlCisJcmV0dXJuIGZhbHNlOworICAg ICAgcnR4IGluaXRpYWxfY29tcGFyZSA9IE5VTExfUlRYOworICAgICAgaWYgKCEocHJldl9ub25u b3RlX25vbmRlYnVnX2luc25fYmIgKEJCX0VORCAocHJlX2xvb3BfYmIpKQorCSAgICAmJiBJTlNO X1AgKHByZXZfbm9ubm90ZV9ub25kZWJ1Z19pbnNuX2JiIChCQl9FTkQgKHByZV9sb29wX2JiKSkp KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBlbHNlCisJaW5pdGlhbF9jb21wYXJlCisJICAgID0g UEFUVEVSTiAocHJldl9ub25ub3RlX25vbmRlYnVnX2luc25fYmIgKEJCX0VORCAocHJlX2xvb3Bf YmIpKSk7CisgICAgICBpZiAoIShpbml0aWFsX2NvbXBhcmUgJiYgR0VUX0NPREUgKGluaXRpYWxf Y29tcGFyZSkgPT0gU0VUCisJICAgICYmIGNjX3JlZ2lzdGVyIChYRVhQIChpbml0aWFsX2NvbXBh cmUsIDApLCBWT0lEbW9kZSkKKwkgICAgJiYgR0VUX0NPREUgKFhFWFAgKGluaXRpYWxfY29tcGFy ZSwgMSkpID09IENPTVBBUkUKKwkgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGluaXRp YWxfY29tcGFyZSwgMSksIDEpKQorCSAgICAmJiBJTlRWQUwgKFhFWFAgKFhFWFAgKGluaXRpYWxf Y29tcGFyZSwgMSksIDEpKSA9PSAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFVzdWFs bHkgdGhpcyBpcyBhIExFIGNvbmRpdGlvbiwgYnV0IGl0IGNhbiBhbHNvIGp1c3QgYmUgYSBHVCBv ciBhbiBFUQorCSBjb25kaXRpb24gKGlmIHRoZSB2YWx1ZSBpcyB1bnNpZ25lZCBvciB0aGUgY29t cGlsZXIga25vd3MgaXRzIG5vdCBuZWdhdGl2ZSkgICovCisgICAgICBydHhfaW5zbiAqbG9vcF9q dW1wb3ZlciA9IEJCX0VORCAocHJlX2xvb3BfYmIpOworICAgICAgaWYgKCEoSlVNUF9QIChsb29w X2p1bXBvdmVyKQorCSAgICAmJiBHRVRfQ09ERSAoWEVYUCAoUEFUVEVSTiAobG9vcF9qdW1wb3Zl ciksIDEpKSA9PSBJRl9USEVOX0VMU0UKKwkgICAgJiYgKEdFVF9DT0RFIChYRVhQIChYRVhQIChQ QVRURVJOIChsb29wX2p1bXBvdmVyKSwgMSksIDApKSA9PSBMRQorCQl8fCBHRVRfQ09ERSAoWEVY UCAoWEVYUCAoUEFUVEVSTiAobG9vcF9qdW1wb3ZlciksIDEpLCAwKSkgPT0gR1QKKwkJfHwgR0VU X0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfanVtcG92ZXIpLCAxKSwgMCkpID09IEVR KSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBFdmVyeXRoaW5nIGxvb2tzIHZhbGlk LiAgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCithcm1fbXZlX2xvb3BfdmFs aWRfZm9yX2Rsc3RwIChiYXNpY19ibG9jayBib2R5KQoreworICAvKiBEb2xvb3AgY2FuIG9ubHkg YmUgZG9uZSAiZWxlbWVudHdpc2UiIHdpdGggcHJlZGljYXRlZCBkbHN0cC9sZXRwIGlmIGl0Cisg ICAgIGNvbnRhaW5zIGEgVkNUUCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHByb2Nlc3NlZCBi eSB0aGUgbG9vcC4KKyAgICAgRmluZCB0aGUgVkNUUCBwcmVkaWNhdGUgZ2VuZXJhdGlvbiBpbnNp ZGUgdGhlIGxvb3AgYm9keSBCQi4gICovCisgIHJ0eF9pbnNuICp2Y3RwX2luc24gPSBhcm1fbXZl X2dldF9sb29wX3ZjdHAgKGJvZHkpOworICBpZiAoIXZjdHBfaW5zbikKKyAgICByZXR1cm4gZmFs c2U7CisKKyAgLyogVGhlcmUgYXJlIG9ubHkgdHdvIHR5cGVzIG9mIGxvb3BzIHRoYXQgY2FuIGJl IHR1cm5lZCBpbnRvIGRsc3RwL2xldHAKKyAgICAgbG9vcHM6CisgICAgICBBKSBMb29wcyBvZiB0 aGUgZm9ybToKKwkgIHdoaWxlIChudW1fb2ZfZWxlbSA+IDApCisJICAgIHsKKwkgICAgICBwID0g dmN0cDxzaXplPiAobnVtX29mX2VsZW0pCisJICAgICAgbiAtPSBudW1fb2ZfbGFuZXM7CisJICAg IH0KKyAgICAgIEIpIExvb3BzIG9mIHRoZSBmb3JtOgorCSAgaW50IG51bV9vZl9pdGVycyA9IChu dW1fb2ZfZWxlbSArIG51bV9vZl9sYW5lcyAtIDEpIC8gbnVtX29mX2xhbmVzCisJICBmb3IgKGkg PSAwOyBpIDwgbnVtX29mX2l0ZXJzOyBpKyspCisJICAgIHsKKwkgICAgICBwID0gdmN0cDxzaXpl PiAobnVtX29mX2VsZW0pCisJICAgICAgbiAtPSBudW1fb2ZfbGFuZXM7CisJICAgIH0KKworICAg IFRoZW4sIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBsb29wIGFib3ZlIHdlIG5lZWQgd2lsbCBu ZWVkIHRvIGRvCisgICAgZGlmZmVyZW50IHNldHMgb2YgY2hlY2tzLiAgKi8KKyAgaXZfYW5hbHlz aXNfbG9vcF9pbml0IChib2R5LT5sb29wX2ZhdGhlcik7CisKKyAgLyogSW4gb3JkZXIgdG8gZmlu ZCBvdXQgaWYgdGhlIGxvb3AgaXMgb2YgdHlwZSBBIG9yIEIgYWJvdmUgbG9vayBmb3IgdGhlCisg ICAgIGxvb3AgY291bnRlcjogaXQgd2lsbCBlaXRoZXIgYmUgaW5jcmVtZW50aW5nIGJ5IG9uZSBw ZXIgaXRlcmF0aW9uIG9yCisgICAgIGl0IHdpbGwgYmUgZGVjcmVtZW50aW5nIGJ5IG51bV9vZl9s YW5lcy4gIFdlIGNhbiBmaW5kIHRoZSBsb29wIGNvdW50ZXIKKyAgICAgaW4gdGhlIGNvbmRpdGlv biBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLiAgKi8KKyAgcnR4X2luc24gKmxvb3BfY29uZCA9IHBy ZXZfbm9ubm90ZV9ub25kZWJ1Z19pbnNuX2JiIChCQl9FTkQgKGJvZHkpKTsKKyAgZ2NjX2Fzc2Vy dCAoY2NfcmVnaXN0ZXIgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDApLCBWT0lEbW9kZSkK KwkgICAgICAmJiBHRVRfQ09ERSAoWEVYUCAoUEFUVEVSTiAobG9vcF9jb25kKSwgMSkpID09IENP TVBBUkUpOworICAvKiBUaGUgb3BlcmFuZHMgaW4gdGhlIGNvbmRpdGlvbjogIFRyeSB0byBpZGVu dGlmeSB3aGljaCBvbmUgaXMgdGhlCisgICAgIGNvbnN0YW50IGFuZCB3aGljaCBpcyB0aGUgY291 bnRlciBhbmQgcnVuIElWIGFuYWx5c2lzIG9uIHRoZSBsYXR0ZXIuICAqLworICBydHggY29uZF9h cmdfMSA9IFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpLCAwKTsKKyAgcnR4IGNv bmRfYXJnXzIgPSBYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAxKSwgMSk7CisKKyAg cnR4IGxvb3BfY29uZF9jb25zdGFudDsKKyAgcnR4IGxvb3BfY291bnRlcjsKKyAgY2xhc3MgcnR4 X2l2IGNvbmRfY291bnRlcl9pdiwgY29uZF90ZW1wX2l2OworCisgIGlmIChDT05TVF9JTlRfUCAo Y29uZF9hcmdfMSkpCisgICAgeworICAgICAgLyogY29uZF9hcmdfMSBpcyB0aGUgY29uc3RhbnQg YW5kIGNvbmRfYXJnXzIgaXMgdGhlIGNvdW50ZXIuICAqLworICAgICAgbG9vcF9jb25kX2NvbnN0 YW50ID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3BfY291bnRlciA9IGNvbmRfYXJnXzI7CisgICAg ICBpdl9hbmFseXplIChsb29wX2NvbmQsIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUg KGNvbmRfYXJnXzIpKSwKKwkJICBjb25kX2FyZ18yLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICB9 CisgIGVsc2UgaWYgKENPTlNUX0lOVF9QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBj b25kX2FyZ18yIGlzIHRoZSBjb25zdGFudCBhbmQgY29uZF9hcmdfMSBpcyB0aGUgY291bnRlci4g ICovCisgICAgICBsb29wX2NvbmRfY29uc3RhbnQgPSBjb25kX2FyZ18yOworICAgICAgbG9vcF9j b3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwgYXNfYTxz Y2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMSkpLAorCQkgIGNvbmRfYXJnXzEs ICZjb25kX2NvdW50ZXJfaXYpOworICAgIH0KKyAgZWxzZSBpZiAoUkVHX1AgKGNvbmRfYXJnXzEp ICYmIFJFR19QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBJZiBib3RoIG9wZXJhbmRz IHRvIHRoZSBjb21wYXJlIGFyZSBSRUdzLCB3ZSBjYW4gc2FmZWx5CisJIHJ1biBJViBhbmFseXNp cyBvbiBib3RoIGFuZCB0aGVuIGRldGVybWluZSB3aGljaCBpcyB0aGUKKwkgY29uc3RhbnQgYnkg bG9va2luZyBhdCB0aGUgc3RlcC4KKwkgRmlyc3QgYXNzdW1lIGNvbmRfYXJnXzEgaXMgdGhlIGNv dW50ZXIuICAqLworICAgICAgbG9vcF9jb3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3Bf Y29uZF9jb25zdGFudCA9IGNvbmRfYXJnXzI7CisgICAgICBpdl9hbmFseXplIChsb29wX2NvbmQs IGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKGNvbmRfYXJnXzEpKSwKKwkJICBjb25k X2FyZ18xLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwg YXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMikpLAorCQkgIGNvbmRf YXJnXzIsICZjb25kX3RlbXBfaXYpOworCisgICAgICBpZiAoIUNPTlNUX0lOVF9QIChjb25kX2Nv dW50ZXJfaXYuc3RlcCkgfHwgIUNPTlNUX0lOVF9QIChjb25kX3RlbXBfaXYuc3RlcCkpCisJcmV0 dXJuIGZhbHNlOworICAgICAgLyogTG9vayBhdCB0aGUgc3RlcHMgYW5kIHN3YXAgYXJvdW5kIHRo ZSBydHgncyBpZiBuZWVkZWQuICBFcnJvciBvdXQgaWYKKwkgb25lIG9mIHRoZW0gY2Fubm90IGJl IGlkZW50aWZpZWQgYXMgY29uc3RhbnQuICAqLworICAgICAgaWYgKElOVFZBTCAoY29uZF9jb3Vu dGVyX2l2LnN0ZXApICE9IDAgJiYgSU5UVkFMIChjb25kX3RlbXBfaXYuc3RlcCkgIT0gMCkKKwly ZXR1cm4gZmFsc2U7CisgICAgICBpZiAoSU5UVkFMIChjb25kX2NvdW50ZXJfaXYuc3RlcCkgPT0g MCAmJiBJTlRWQUwgKGNvbmRfdGVtcF9pdi5zdGVwKSAhPSAwKQorCXsKKwkgIGxvb3BfY291bnRl ciA9IGNvbmRfYXJnXzI7CisJICBsb29wX2NvbmRfY29uc3RhbnQgPSBjb25kX2FyZ18xOworCSAg Y29uZF9jb3VudGVyX2l2ID0gY29uZF90ZW1wX2l2OworCX0KKyAgICB9CisgIGVsc2UKKyAgICBy ZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFSRUdfUCAobG9vcF9jb3VudGVyKSkKKyAgICByZXR1cm4g ZmFsc2U7CisgIGlmICghKFJFR19QIChsb29wX2NvbmRfY29uc3RhbnQpIHx8IENPTlNUX0lOVF9Q IChsb29wX2NvbmRfY29uc3RhbnQpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm93IHdl IGhhdmUgZXh0cmFjdGVkIHRoZSBJViBzdGVwIG9mIHRoZSBsb29wIGNvdW50ZXIsIGNhbGwgdGhl CisgICAgIGFwcHJvcHJpYXRlIGNoZWNraW5nIGZ1bmN0aW9uLiAgKi8KKyAgaWYgKElOVFZBTCAo Y29uZF9jb3VudGVyX2l2LnN0ZXApID4gMCkKKyAgICByZXR1cm4gYXJtX212ZV9kbHN0cF9jaGVj a19pbmNfY291bnRlciAoYm9keSwgdmN0cF9pbnNuLAorCQkJCQkgICAgbG9vcF9jb25kX2NvbnN0 YW50LCBsb29wX2NvdW50ZXIpOworICBlbHNlIGlmIChJTlRWQUwgKGNvbmRfY291bnRlcl9pdi5z dGVwKSA8IDApCisgICAgcmV0dXJuIGFybV9tdmVfZGxzdHBfY2hlY2tfZGVjX2NvdW50ZXIgKGJv ZHksIHZjdHBfaW5zbiwKKwkJCQkJICAgIGxvb3BfY29uZF9jb25zdGFudCwgbG9vcF9jb3VudGVy KTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyogUHJlZGljdCB3aGV0aGVyIHRo ZSBnaXZlbiBsb29wIGluIGdpbXBsZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGluIHRoZSBSVEwKKyAg IGRvbG9vcF9vcHRpbWl6ZSBwYXNzLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9wcmVkaWN0X2Rv bG9vcF9wIChzdHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgZ2NjX2Fzc2VydCAobG9vcCk7CisgIC8q IE9uIGFybSwgdGFyZ2V0bS5jYW5fdXNlX2RvbG9vcF9wIGlzIGFjdHVhbGx5CisgICAgIGNhbl91 c2VfZG9sb29wX2lmX2lubmVybW9zdC4gIEVuc3VyZSB0aGUgbG9vcCBpcyBpbm5lcm1vc3QsCisg ICAgIGl0IGlzIHZhbGlkIGFuZCBhcyBwZXIgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIGFuZCB0 aGUKKyAgICAgY29ycmVjdCBhcmNoaXRlY3R1cmUgZmxhZ3MgYXJlIGVuYWJsZWQuICAqLworICBp ZiAoIShUQVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIG9wdGltaXplID4gMCkpCisg ICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkK KwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1ZSB0byIKKwkJ CSAgICAiIHRhcmdldCBhcmNoaXRlY3R1cmUgb3Igb3B0aW1pc2F0aW9uIGZsYWdzLlxuIik7Cisg ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsb29wLT5pbm5lciAhPSBOVUxM KQorICAgIHsKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCisJZnByaW50ZiAoZHVtcF9maWxlLCAiUHJlZGljdCBkb2xvb3AgZmFpbHVyZSBkdWUgdG8i CisJCQkgICAgIiBsb29wIG5lc3RpbmcuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9 CisgIGVsc2UgaWYgKCFhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IgKGxvb3AtPmhlYWRlci0+bmV4 dF9iYikpCisgICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9E RVRBSUxTKSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1 ZSB0byIKKwkJCSAgICAiIGxvb3AgYmIgY29tcGxleGl0eS5cbiIpOworICAgICAgcmV0dXJuIGZh bHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSW1wbGVtZW50IHRhcmdldG0u bG9vcF91bnJvbGxfYWRqdXN0LiAgVXNlIHRoaXMgdG8gYmxvY2sgdW5yb2xsaW5nIG9mIGxvb3Bz CisgICB0aGF0IG1heSBsYXRlciBiZSB0dXJuZWQgaW50byBNVkUgVGFpbCBQcmVkaWNhdGVkIExv dyBPdmVyaGVhZCBMb29wcy4gIFRoZQorICAgcGVyZm9ybWFuY2UgYmVuZWZpdCBvZiBhbiBNVkUg TG9MIGlzIGxpa2VseSB0byBiZSBtdWNoIGhpZ2hlciB0aGFuIHRoYXQgb2YKKyAgIHRoZSB1bnJv bGxpbmcuICAqLworCit1bnNpZ25lZAorYXJtX2xvb3BfdW5yb2xsX2FkanVzdCAodW5zaWduZWQg bnVucm9sbCwgc3RydWN0IGxvb3AgKmxvb3ApCit7CisgIGlmIChUQVJHRVRfVEhVTUIyICYmIFRB UkdFVF9IQVZFX0xPQiAmJiBUQVJHRVRfSEFWRV9NVkUKKyAgICAgICYmIGFybV90YXJnZXRfYmJf b2tfZm9yX2xvYiAobG9vcC0+aGVhZGVyLT5uZXh0X2JiKQorICAgICAgJiYgYXJtX212ZV9sb29w X3ZhbGlkX2Zvcl9kbHN0cCAobG9vcC0+aGVhZGVyKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQor ICAgIHJldHVybiBudW5yb2xsOworfQorCisvKiBGdW5jdGlvbiB0byBoYWRsZSBlbWl0dGluZyBh IFZQVC11bnByZWRpY2F0ZWQgdmVyc2lvbiBvZiBhIFZQVC1wcmVkaWNhdGVkCisgICBpbnNuIHRv IGEgc2VxdWVuY2UuICAqLworCitzdGF0aWMgYm9vbAorYXJtX2VtaXRfbXZlX3VucHJlZGljYXRl ZF9pbnNuX3RvX3NlcSAocnR4X2luc24qIGluc24pCit7CisgIHJ0eCBpbnNuX3Zwcl9yZWdfb3Bl cmFuZCA9IGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSAoaW5zbik7CisgIGludCBuZXdf aWNvZGUgPSBnZXRfYXR0cl9tdmVfdW5wcmVkaWNhdGVkX2luc24gKGluc24pOworICBpZiAoIWlu X3NlcXVlbmNlX3AgKCkKKyAgICAgIHx8ICFNVkVfVlBUX1BSRURJQ0FURURfSU5TTl9QIChpbnNu KQorICAgICAgfHwgKCFpbnNuX3Zwcl9yZWdfb3BlcmFuZCkKKyAgICAgIHx8ICghbmV3X2ljb2Rl KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZXh0cmFjdF9pbnNuIChpbnNuKTsKKyAgcnR4IGFy cls4XTsKKyAgaW50IGogPSAwOworCisgIC8qIFdoZW4gdHJhbnNmb3JtaW5nIGEgVlBULXByZWRp Y2F0ZWQgaW5zdHJ1Y3Rpb24KKyAgICAgaW50byBpdHMgdW5wcmVkaWNhdGVkIGVxdWl2YWxlbnQg d2UgbmVlZCB0byBkcm9wCisgICAgIHRoZSBWUFIgb3BlcmFuZCBhbmQgd2UgbWF5IG5lZWQgdG8g YWxzbyBkcm9wIGEKKyAgICAgbWVyZ2UgInZ1bmluaXQiIGlucHV0IG9wZXJhbmQsIGRlcGVuZGlu ZyBvbiB0aGUKKyAgICAgaW5zdHJ1Y3Rpb24gcGF0dGVybi4gIEhlcmUgZW5zdXJlIHRoYXQgd2Ug aGF2ZSBhdAorICAgICBtb3N0IGEgdHdvLW9wZXJhbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0 d28KKyAgICAgaW5zdHJ1bmN0aW9ucy4gICovCisgIGludCBuX29wZXJhbmRzX2RpZmYKKyAgICAg ID0gcmVjb2dfZGF0YS5uX29wZXJhbmRzIC0gaW5zbl9kYXRhW25ld19pY29kZV0ubl9vcGVyYW5k czsKKyAgaWYgKCEobl9vcGVyYW5kc19kaWZmID4gMCAmJiBuX29wZXJhbmRzX2RpZmYgPD0gMikp CisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFRoZW4sIGxvb3AgdGhyb3VnaCB0aGUgb3BlcmFu ZHMgb2YgdGhlIHByZWRpY2F0ZWQKKyAgICAgaW5zdHJ1Y3Rpb24sIGFuZCByZXRhaW4gdGhlIG9u ZXMgdGhhdCBtYXAgdG8gdGhlCisgICAgIHVucHJlZGljYXRlZCBpbnN0cnVjdGlvbi4gICovCisg IGZvciAoaW50IGkgPSAwOyBpIDwgcmVjb2dfZGF0YS5uX29wZXJhbmRzOyBpKyspCisgICAgewor ICAgICAgLyogSWdub3JlIHRoZSBWUFIgYW5kLCBpZiBuZWVkZWQsIHRoZSB2dW5pbml0CisJIG9w ZXJhbmQuICAqLworICAgICAgaWYgKGluc25fdnByX3JlZ19vcGVyYW5kID09IHJlY29nX2RhdGEu b3BlcmFuZFtpXQorCSAgfHwgKG5fb3BlcmFuZHNfZGlmZiA9PSAyCisJICAgICAgJiYgIXN0cmNt cCAocmVjb2dfZGF0YS5jb25zdHJhaW50c1tpXSwgIjAiKSkpCisJY29udGludWU7CisgICAgICBl bHNlCisJeworCSAgYXJyW2pdID0gcmVjb2dfZGF0YS5vcGVyYW5kW2ldOworCSAgaisrOworCX0K KyAgICB9CisKKyAgLyogRmluYWxseSwgZW1pdCB0aGUgdXByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24u ICAqLworICBzd2l0Y2ggKGopCisgICAgeworICAgICAgY2FzZSAxOgorCWVtaXRfaW5zbiAoR0VO X0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBdKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJZW1p dF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0sIGFyclsxXSkpOworCWJyZWFrOwor ICAgICAgY2FzZSAzOgorCWVtaXRfaW5zbiAoR0VOX0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBdLCBh cnJbMV0sIGFyclsyXSkpOworCWJyZWFrOworICAgICAgY2FzZSA0OgorCWVtaXRfaW5zbiAoR0VO X0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSwKKwkJCQkJYXJyWzNdKSk7 CisJYnJlYWs7CisgICAgICBjYXNlIDU6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUp IChhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSkpOworCWJyZWFr OworICAgICAgY2FzZSA2OgorCWVtaXRfaW5zbiAoR0VOX0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBd LCBhcnJbMV0sIGFyclsyXSwgYXJyWzNdLAorCQkJCQlhcnJbNF0sIGFycls1XSkpOworCWJyZWFr OworICAgICAgY2FzZSA3OgorCWVtaXRfaW5zbiAoR0VOX0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBd LCBhcnJbMV0sIGFyclsyXSwgYXJyWzNdLAorCQkJCQlhcnJbNF0sIGFycls1XSwgYXJyWzZdKSk7 CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWdjY191bnJlYWNoYWJsZSAoKTsKKyAgICB9Cisg IHJldHVybiB0cnVlOworfQorCisvKiBBdHRlbXB0IHRvIHRyYW5zZm9ybSB0aGUgbG9vcCBjb250 ZW50cyBvZiBsb29wIGJhc2ljIGJsb2NrIGZyb20gVlBUCisgICBwcmVkaWNhdGVkIGluc25zIGlu dG8gdW5wcmVkaWNhdGVkIGluc25zIGZvciBhIGRsc3RwL2xldHAgbG9vcC4gICovCisKK3J0eAor YXJtX2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChydHggbGFiZWwpCit7CisgIGJhc2ljX2Jsb2Nr IGJvZHkgPSBCTE9DS19GT1JfSU5TTiAobGFiZWwpLT5wcmV2X2JiOworCisgIC8qIEVuc3VyZSB0 aGF0IHRoZSBiYiBpcyB3aXRoaW4gYSBsb29wIHRoYXQgaGFzIGFsbCByZXF1aXJlZCBtZXRhZGF0 YS4gICovCisgIGlmICghYm9keS0+bG9vcF9mYXRoZXIgfHwgIWJvZHktPmxvb3BfZmF0aGVyLT5o ZWFkZXIKKyAgICAgIHx8ICFib2R5LT5sb29wX2ZhdGhlci0+c2ltcGxlX2xvb3BfZGVzYykKKyAg ICByZXR1cm4gR0VOX0lOVCAoMSk7CisKKyAgcnR4X2luc24gKnZjdHBfaW5zbiA9IGFybV9tdmVf Z2V0X2xvb3BfdmN0cCAoYm9keSk7CisgIGlmICghdmN0cF9pbnNuIHx8ICFhcm1fbXZlX2xvb3Bf dmFsaWRfZm9yX2Rsc3RwIChib2R5KSkKKyAgICByZXR1cm4gR0VOX0lOVCAoMSk7CisgIHJ0eCB2 Y3RwX3JlZyA9IFhWRUNFWFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsK KyAgLyogZGVjcmVtZW50dW51bSBpcyBhbHJlYWR5IGtub3duIHRvIGJlIHZhbGlkIGF0IHRoaXMg cG9pbnQuICAqLworICBpbnQgZGVjcmVtZW50bnVtID0gYXJtX212ZV9nZXRfdmN0cF9sYW5lcwor CQkgICAgICAoUEFUVEVSTiAoYXJtX212ZV9nZXRfbG9vcF92Y3RwIChib2R5KSkpOworCisgIHJ0 eF9pbnNuICppbnNuID0gMDsKKyAgcnR4X2luc24gKmN1cl9pbnNuID0gMDsKKyAgcnR4X2luc24g KnNlcTsKKyAgcnR4IHZjdHBfdnByX2dlbmVyYXRlZCA9IE5VTExfUlRYOworCisgIC8qIFNjYW4g dGhyb3VnaCB0aGUgaW5zbnMgaW4gdGhlIGxvb3AgYmIgYW5kIGVtaXQgdGhlIHRyYW5zZm9ybWVk IGJiCisgICAgIGluc25zIHRvIGEgc2VxdWVuY2UuICAqLworICBzdGFydF9zZXF1ZW5jZSAoKTsK KyAgRk9SX0JCX0lOU05TIChib2R5LCBpbnNuKQorICAgIHsKKyAgICAgIGlmIChHRVRfQ09ERSAo aW5zbikgPT0gQ09ERV9MQUJFTCB8fCBOT1RFX0lOU05fQkFTSUNfQkxPQ0tfUCAoaW5zbikpCisJ Y29udGludWU7CisgICAgICBlbHNlIGlmIChOT1RFX1AgKGluc24pKQorCWVtaXRfbm90ZSAoKGVu dW0gaW5zbl9ub3RlKU5PVEVfS0lORCAoaW5zbikpOworICAgICAgZWxzZSBpZiAoREVCVUdfSU5T Tl9QIChpbnNuKSkKKwllbWl0X2RlYnVnX2luc24gKFBBVFRFUk4gKGluc24pKTsKKyAgICAgIGVs c2UgaWYgKCFJTlNOX1AgKGluc24pKQorCXsKKwkgIGVuZF9zZXF1ZW5jZSAoKTsKKwkgIHJldHVy biBHRU5fSU5UICgxKTsKKwl9CisgICAgICAvKiBXaGVuIHdlIGZpbmQgdGhlIHZjdHAgaW5zdHJ1 Y3Rpb246IFRoaXMgbWF5IGJlIGZvbGxvd2VkIGJ5CisgICAgICBhIHplcm8tZXh0ZW5kIGluc24g dG8gU0ltb2RlLiAgSWYgaXQgaXMsIHRoZW4gc2F2ZSB0aGUKKyAgICAgIHplcm8tZXh0ZW5kZWQg UkVHIGludG8gdmN0cF92cHJfZ2VuZXJhdGVkLiAgSWYgdGhlcmUgaXMgbm8KKyAgICAgIHplcm8t ZXh0ZW5kLCB0aGVuIHN0b3JlIHRoZSByYXcgb3V0cHV0IG9mIHRoZSB2Y3RwLgorICAgICAgRm9y IGFueSBWUFQtcHJlZGljYXRlZCBpbnN0cnVjdGlvbnMgd2UgbmVlZCB0byBlbnN1cmUgdGhhdAor ICAgICAgdGhlIFZQUiB0aGV5IHVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdpdmVuIGhlcmUg YW5kCisgICAgICB0aGV5IG9mdGVuIGNvbnN1bWUgdGhlIG91dHB1dCBvZiBhIHN1YnJlZyBvZiB0 aGUgU0ltb2RlCisgICAgICB6ZXJvLWV4dGVuZGVkIFZQUi1yZWcuICBBcyBhIHJlc3VsdCwgY29t cGFyaW5nIGFnYWluc3QgdGhlCisgICAgICBvdXRwdXQgb2YgdGhlIHplcm8tZXh0ZW5kIGlzIG1v cmUgbGlrZWx5IHRvIHN1Y2NlZWQuCisgICAgICBUaGlzIGNvZGUgYWxzbyBndWFyYW50ZWVzIHRv IHVzIHRoYXQgdGhlIHZjdHAgY29tZXMgYmVmb3JlCisgICAgICBhbnkgaW5zdHJ1Y3Rpb25zIHRo YXQgdXNlIHRoZSBWUFIgd2l0aGluIHRoZSBsb29wLCBmb3IgdGhlCisgICAgICBkbHN0cC9sZXRw IHRyYW5zZm9ybSB0byBzdWNjZWVkLiAgKi8KKyAgICAgIGVsc2UgaWYgKGluc24gPT0gdmN0cF9p bnNuKQorCXsKKwkgIHJ0eF9pbnNuICpuZXh0X3VzZTEgPSBOVUxMOworCSAgZGZfcmVmIHVzZTsK KwkgIGZvciAodXNlID0gREZfUkVHX1VTRV9DSEFJTgorCQkgICAgICAoREZfUkVGX1JFR05PIChE Rl9JTlNOX0lORk9fREVGUworCQkJCSAgICAgIChERl9JTlNOX0lORk9fR0VUIChpbnNuKSkpKTsK KwkgICAgICAgdXNlOyB1c2UgPSBERl9SRUZfTkVYVF9SRUcgKHVzZSkpCisJICAgIGlmICghbmV4 dF91c2UxICYmIE5PTkRFQlVHX0lOU05fUCAoREZfUkVGX0lOU04gKHVzZSkpKQorCSAgICAgIG5l eHRfdXNlMSA9IERGX1JFRl9JTlNOICh1c2UpOworCisJICBpZiAoR0VUX0NPREUgKFNFVF9TUkMg KHNpbmdsZV9zZXQgKG5leHRfdXNlMSkpKSA9PSBaRVJPX0VYVEVORCkKKwkgICAgeworCSAgICAg IHJ0eF9pbnNuICpuZXh0X3VzZTIgPSBOVUxMOworCSAgICAgIGZvciAodXNlID0gREZfUkVHX1VT RV9DSEFJTgorCQkJICAoREZfUkVGX1JFR05PIChERl9JTlNOX0lORk9fREVGUworCQkJCQkgKERG X0lOU05fSU5GT19HRVQgKG5leHRfdXNlMSkpKSk7CisJCSAgIHVzZTsgdXNlID0gREZfUkVGX05F WFRfUkVHICh1c2UpKQorCQlpZiAoIW5leHRfdXNlMiAmJiBOT05ERUJVR19JTlNOX1AgKERGX1JF Rl9JTlNOICh1c2UpKSkKKwkJICBuZXh0X3VzZTIgPSBERl9SRUZfSU5TTiAodXNlKTsKKworCSAg ICAgIGlmIChHRVRfQ09ERSAoU0VUX1NSQyAoc2luZ2xlX3NldCAobmV4dF91c2UyKSkpID09IFNV QlJFRykKKwkJdmN0cF92cHJfZ2VuZXJhdGVkID0gWEVYUCAoUEFUVEVSTiAobmV4dF91c2UyKSwg MCk7CisJICAgIH0KKworCSAgaWYgKCF2Y3RwX3Zwcl9nZW5lcmF0ZWQgfHwgIVJFR19QICh2Y3Rw X3Zwcl9nZW5lcmF0ZWQpCisJICAgICAgfHwgIVZBTElEX01WRV9QUkVEX01PREUgKEdFVF9NT0RF ICh2Y3RwX3Zwcl9nZW5lcmF0ZWQpKSkKKwkgICAgeworCSAgICAgIGVuZF9zZXF1ZW5jZSAoKTsK KwkgICAgICByZXR1cm4gR0VOX0lOVCAoMSk7CisJICAgIH0KKwkgIGNvbnRpbnVlOworCX0KKyAg ICAgICAvKiBJZiB0aGUgaW5zbiBwYXR0ZXJuIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIFZQUiB2 YWx1ZSBmcm9tIHRoZQorCSAgdmN0cCBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIuICAqLworICAgICAg ZWxzZSBpZiAoYXJtX212ZV92ZWNfaW5zbl9pc19wcmVkaWNhdGVkX3dpdGhfdGhpc19wcmVkaWNh dGUgKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJeworCSAgYm9vbCBzdWNjZXNzID0gYXJt X2VtaXRfbXZlX3VucHJlZGljYXRlZF9pbnNuX3RvX3NlcSAoaW5zbik7CisJICBpZiAoIXN1Y2Nl c3MpCisJICAgIHsKKwkgICAgICBlbmRfc2VxdWVuY2UgKCk7CisJICAgICAgcmV0dXJuIEdFTl9J TlQgKDEpOworCSAgICB9CisJfQorICAgICAgLyogSWYgdGhlIGluc24gaXNuJ3QgVlBUIHByZWRp Y2F0ZWQgb24gdmN0cF92cHJfZ2VuZXJhdGVkLCB3ZSBuZWVkIHRvCisJIG1ha2Ugc3VyZSB0aGF0 IGl0IGlzIHN0aWxsIHZhbGlkIHdpdGhpbiB0aGUgZGxzdHAvbGV0cCBsb29wLiAgKi8KKyAgICAg IGVsc2UKKwl7CisJICAvKiBOb25lIG9mIHJlZ2lzdGVycyBVU0UtZCBieSB0aGUgaW5zdHJ1Y3Rp b24gbmVlZCBjYW4gYmUgdGhlIFZQUgorCSAgICAgdmN0cF92cHJfZ2VuZXJhdGVkLiAgVGhpcyBi bG9ja3MgdGhlIG9wdGltaXNhdGlvbiBpZiB0aGVyZSBhbnkKKwkgICAgIGluc3RydWN0aW9ucyB0 aGF0IHVzZSB0aGUgb3B0aW1pc2VkLW91dCBWUFIgdmFsdWUgaW4gYW55IHdheQorCSAgICAgb3Ro ZXIgdGhhbiBhcyBhIFZQVCBibG9jayBwcmVkaWNhdGUuICAqLworCSAgZGZfcmVmIGluc25fdXNl cyA9IE5VTEw7CisJICBGT1JfRUFDSF9JTlNOX1VTRSAoaW5zbl91c2VzLCBpbnNuKQorCSAgewor CSAgICBpZiAocnR4X2VxdWFsX3AgKHZjdHBfdnByX2dlbmVyYXRlZCwgREZfUkVGX1JFRyAoaW5z bl91c2VzKSkpCisJICAgICAgeworCQllbmRfc2VxdWVuY2UgKCk7CisJCXJldHVybiBHRU5fSU5U ICgxKTsKKwkgICAgICB9CisJICB9CisJICAvKiBJZiB3aXRoaW4gdGhlIGxvb3Agd2UgaGF2ZSBh biBNVkUgdmVjdG9yIGluc3RydWN0aW9uIHRoYXQgaXMKKwkgICAgIHVucHJlZGljYXRlZCwgdGhl IGRsc3RwL2xldHAgbG9vcGluZyB3aWxsIGFkZCBpbXBsaWNpdAorCSAgICAgcHJlZGljYXRpb24g dG8gaXQuICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgY2hhbmdlIGluIGJlaGF2aW91cgorCSAgICAg b2YgdGhlIGluc3RydWN0aW9uLCBzbyB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmIGFueSBpbnN0cnVj dGlvbnMKKwkgICAgIHRoYXQgZmVlZCBpbnRvIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdlcmUg aW1wbGljaXRseQorCSAgICAgcHJlZGljYXRlZC4gICovCisJICBpZiAoYXJtX212ZV9jaGVja19k Zl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljCisJCShpbnNuLCB2Y3RwX3Zwcl9nZW5lcmF0 ZWQpKQorCSAgICB7CisJICAgICAgaWYgKGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zvcl9p bXBsaWNfcHJlZGljX2ltcGFjdAorCQkgICAgKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJ CXsKKwkJICBlbmRfc2VxdWVuY2UgKCk7CisJCSAgcmV0dXJuIEdFTl9JTlQgKDEpOworCQl9CisJ ICAgIH0KKwkgIGVtaXRfaW5zbiAoUEFUVEVSTiAoaW5zbikpOworCX0KKyAgICB9CisgIHNlcSA9 IGdldF9pbnNucyAoKTsKKyAgZW5kX3NlcXVlbmNlICgpOworCisgIC8qIFJlLXdyaXRlIHRoZSBl bnRpcmUgQkIgY29udGVudHMgd2l0aCB0aGUgdHJhbnNmb3JtZWQKKyAgICAgc2VxdWVuY2UuICAq LworICBGT1JfQkJfSU5TTlNfU0FGRSAoYm9keSwgaW5zbiwgY3VyX2luc24pCisgICAgaWYgKCEo R0VUX0NPREUgKGluc24pID09IENPREVfTEFCRUwgfHwgTk9URV9JTlNOX0JBU0lDX0JMT0NLX1Ag KGluc24pKSkKKyAgICAgIGRlbGV0ZV9pbnNuIChpbnNuKTsKKyAgZm9yIChpbnNuID0gc2VxOyBO RVhUX0lOU04gKGluc24pOyBpbnNuID0gTkVYVF9JTlNOIChpbnNuKSkKKyAgICBpZiAoTk9URV9Q IChpbnNuKSkKKyAgICAgIGVtaXRfbm90ZV9hZnRlciAoKGVudW0gaW5zbl9ub3RlKU5PVEVfS0lO RCAoaW5zbiksIEJCX0VORCAoYm9keSkpOworICAgIGVsc2UgaWYgKERFQlVHX0lOU05fUCAoaW5z bikpCisgICAgICBlbWl0X2RlYnVnX2luc25fYWZ0ZXIgKFBBVFRFUk4gKGluc24pLCBCQl9FTkQg KGJvZHkpKTsKKyAgICBlbHNlCisgICAgICBlbWl0X2luc25fYWZ0ZXIgKFBBVFRFUk4gKGluc24p LCBCQl9FTkQgKGJvZHkpKTsKKworICBlbWl0X2p1bXBfaW5zbl9hZnRlciAoUEFUVEVSTiAoaW5z biksIEJCX0VORCAoYm9keSkpOworICAvKiBUaGUgdHJhbnNmb3JtYXRpb24gaGFzIHN1Y2NlZWRl ZCwgc28gbm93IG1vZGlmeSB0aGUgImNvdW50IgorICAgICAoYS5rLmEuIG5pdGVyX2V4cHIpIGZv ciB0aGUgbWlkZGxlLWVuZC4gICovCisgIHNpbXBsZV9sb29wX2Rlc2MgKGJvZHktPmxvb3BfZmF0 aGVyKS0+bml0ZXJfZXhwciA9IHZjdHBfcmVnOworICByZXR1cm4gR0VOX0lOVCAoZGVjcmVtZW50 bnVtKTsKIH0KIAogI2lmIENIRUNLSU5HX1AKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2l0 ZXJhdG9ycy5tZCBiL2djYy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZAppbmRleCA1OTdjMWRhZTY0 MC4uODM1Y2FhMDZmYWQgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZAor KysgYi9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKQEAgLTI1OTksNiArMjU5OSw5IEBACiAo ZGVmaW5lX2ludF9hdHRyIG1ycmMgWyhWVU5TUEVDX01SUkMgIm1ycmMiKSAoVlVOU1BFQ19NUlJD MiAibXJyYzIiKV0pCiAoZGVmaW5lX2ludF9hdHRyIE1SUkMgWyhWVU5TUEVDX01SUkMgIk1SUkMi KSAoVlVOU1BFQ19NUlJDMiAiTVJSQzIiKV0pCiAKKyhkZWZpbmVfaW50X2F0dHIgbW9kZTEgWyhE TFNUUDggIjgiKSAoRExTVFAxNiAiMTYiKSAoRExTVFAzMiAiMzIiKQorCQkJKERMU1RQNjQgIjY0 IildKQorCiAoZGVmaW5lX2ludF9hdHRyIG9wc3VmZml4IFsoVU5TUEVDX0RPVF9TICJzOCIpCiAJ CQkgICAoVU5TUEVDX0RPVF9VICJ1OCIpCiAJCQkgICAoVU5TUEVDX0RPVF9VUyAiczgiKQpAQCAt Mjg0MSw2ICsyODQ0LDggQEAKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFZTSExDUV9NIFtWU0hMQ1Ff TV9TIFZTSExDUV9NX1VdKQogKGRlZmluZV9pbnRfaXRlcmF0b3IgVlFTSExVUV9NX04gW1ZRU0hM VVFfTV9OX1NdKQogKGRlZmluZV9pbnRfaXRlcmF0b3IgVlFTSExVUV9OIFtWUVNITFVRX05fU10p CisoZGVmaW5lX2ludF9pdGVyYXRvciBETFNUUCBbRExTVFA4IERMU1RQMTYgRExTVFAzMgorCQkJ CSAgIERMU1RQNjRdKQogCiA7OyBEZWZpbmUgaXRlcmF0b3JzIGZvciBWQ01MQSBvcGVyYXRpb25z CiAoZGVmaW5lX2ludF9pdGVyYXRvciBWQ01MQV9PUCBbVU5TUEVDX1ZDTUxBCmRpZmYgLS1naXQg YS9nY2MvY29uZmlnL2FybS9tdmUubWQgYi9nY2MvY29uZmlnL2FybS9tdmUubWQKaW5kZXggNzRi OGFmOGQ1N2UuLmE4MTcyMGY0YWEyIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS9tdmUubWQK KysrIGIvZ2NjL2NvbmZpZy9hcm0vbXZlLm1kCkBAIC03MTk0LDMgKzcxOTQsNDEgQEAKICAgICAg IH0KICAgfQogKQorCis7OyBPcmlnaW5hbGx5IGV4cGFuZGVkIGJ5ICdwcmVkaWNhdGVkX2RvbG9v cF9lbmQnLgorOzsgSW4gdGhlIHJhcmUgc2l0dWF0aW9uIHdoZXJlIHRoZSBicmFuY2ggaXMgdG9v IGZhciwgd2UgZG8gYWxzbyBuZWVkIHRvCis7OyByZXZlcnQgRlBTQ1IuTFRQU0laRSBiYWNrIHRv IDB4MTAwIGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbi4KKyhkZWZpbmVfaW5zbiAiKnByZWRpY2F0 ZWRfZG9sb29wX2VuZF9pbnRlcm5hbCIKKyAgWyhzZXQgKHBjKQorCShpZl90aGVuX2Vsc2UKKwkg ICAoZ2UgKHBsdXM6U0kgKHJlZzpTSSBMUl9SRUdOVU0pCisJCQkobWF0Y2hfb3BlcmFuZDpTSSAw ICJjb25zdF9pbnRfb3BlcmFuZCIgIiIpKQorCQkoY29uc3RfaW50IDApKQorCSAobGFiZWxfcmVm IChtYXRjaF9vcGVyYW5kIDEgIiIgIiIpKQorCSAocGMpKSkKKyAgIChzZXQgKHJlZzpTSSBMUl9S RUdOVU0pCisJKHBsdXM6U0kgKHJlZzpTSSBMUl9SRUdOVU0pIChtYXRjaF9kdXAgMCkpKQorICAg KGNsb2JiZXIgKHJlZzpDQyBDQ19SRUdOVU0pKQorICAgKGNsb2JiZXIgKG1hdGNoX3NjcmF0Y2g6 U0kgMiAiPXIiKSldCisgICJUQVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIFRBUkdF VF9IQVZFX01WRSAmJiBUQVJHRVRfVEhVTUIyIgorICB7CisgICAgaWYgKGdldF9hdHRyX2xlbmd0 aCAoaW5zbikgPT0gNCkKKyAgICAgIHJldHVybiAibGV0cFx0JXxsciwgJWwxIjsKKyAgICBlbHNl CisgICAgICByZXR1cm4gInN1YnNcdCV8bHIsICMlbjBcblx0Ymd0XHQlbDFcblx0dm1yc1x0JTIs IEZQU0NSXG5cdG9yclx0JTIsICUyLCAjMHg0MDAwMFxuXHRhbmRcdCUyLCAlMiwgMHhGRkZDRkZG RlxuXHR2bXNyXHRGUFNDUiwgJTI7IjsKKyAgfQorICBbKHNldCAoYXR0ciAibGVuZ3RoIikKKwko aWZfdGhlbl9lbHNlCisJICAgKGx0dSAobWludXMgKHBjKSAobWF0Y2hfZHVwIDEpKSAoY29uc3Rf aW50IDEwMjQpKQorCSAgICAoY29uc3RfaW50IDQpCisJICAgIChjb25zdF9pbnQgNikpKQorICAg KHNldF9hdHRyICJ0eXBlIiAiYnJhbmNoIildKQorCisoZGVmaW5lX2luc24gImRsc3RwPG1vZGUx Pl9pbnNuIgorICBbCisgICAgKHNldCAocmVnOlNJIExSX1JFR05VTSkKKwkgKHVuc3BlYzpTSSBb KG1hdGNoX29wZXJhbmQ6U0kgMCAic19yZWdpc3Rlcl9vcGVyYW5kIiAiciIpXQorCSAgRExTVFAp KQorICBdCisgICJUQVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIFRBUkdFVF9IQVZF X01WRSAmJiBUQVJHRVRfVEhVTUIyIgorICAiZGxzdHAuPG1vZGUxPlx0JXxsciwgJTAiKQpkaWZm IC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kIGIvZ2NjL2NvbmZpZy9hcm0vdGh1bWIy Lm1kCmluZGV4IGUxZTAxM2JlZmE3Li4yMDk0ZTljNDY0MSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZp Zy9hcm0vdGh1bWIyLm1kCisrKyBiL2djYy9jb25maWcvYXJtL3RodW1iMi5tZApAQCAtMTYxMyw3 ICsxNjEzLDcgQEAKICAgICh1c2UgKG1hdGNoX29wZXJhbmQgMSAiIiAiIikpXSAgICAgOyBsYWJl bAogICAiVEFSR0VUXzMyQklUIgogICAiCi0geworewogICAgLyogQ3VycmVudGx5IFNNUyByZWxp ZXMgb24gdGhlIGRvLWxvb3AgcGF0dGVybiB0byByZWNvZ25pemUgbG9vcHMKICAgICAgIHdoZXJl ICgxKSB0aGUgY29udHJvbCBwYXJ0IGNvbnNpc3RzIG9mIGFsbCBpbnNucyBkZWZpbmluZyBhbmQv b3IKICAgICAgIHVzaW5nIGEgY2VydGFpbiAnY291bnQnIHJlZ2lzdGVyIGFuZCAoMikgdGhlIGxv b3AgY291bnQgY2FuIGJlCkBAIC0xNjIzLDQxICsxNjIzLDY3IEBACiAKICAgICAgIEFsc28gdXNl ZCB0byBpbXBsZW1lbnQgdGhlIGxvdyBvdmVyIGhlYWQgbG9vcHMgZmVhdHVyZSwgd2hpY2ggaXMg cGFydCBvZgogICAgICAgdGhlIEFybXY4LjEtTSBNYWlubGluZSBMb3cgT3ZlcmhlYWQgQnJhbmNo IChMT0IpIGV4dGVuc2lvbi4gICovCi0gICBpZiAob3B0aW1pemUgPiAwICYmIChmbGFnX21vZHVs b19zY2hlZCB8fCBUQVJHRVRfSEFWRV9MT0IpKQotICAgewotICAgICBydHggczA7Ci0gICAgIHJ0 eCBiY29tcDsKLSAgICAgcnR4IGxvY19yZWY7Ci0gICAgIHJ0eCBjY19yZWc7Ci0gICAgIHJ0eCBp bnNuOwotICAgICBydHggY21wOwotCi0gICAgIGlmIChHRVRfTU9ERSAob3BlcmFuZHNbMF0pICE9 IFNJbW9kZSkKLSAgICAgICBGQUlMOwotCi0gICAgIHMwID0gb3BlcmFuZHMgWzBdOwotCi0gICAg IC8qIExvdyBvdmVyIGhlYWQgbG9vcCBpbnN0cnVjdGlvbnMgcmVxdWlyZSB0aGUgZmlyc3Qgb3Bl cmFuZCB0byBiZSBMUi4gICovCi0gICAgIGlmIChUQVJHRVRfSEFWRV9MT0IgJiYgYXJtX3Rhcmdl dF9pbnNuX29rX2Zvcl9sb2IgKG9wZXJhbmRzIFsxXSkpCi0gICAgICAgczAgPSBnZW5fcnR4X1JF RyAoU0ltb2RlLCBMUl9SRUdOVU0pOwotCi0gICAgIGlmIChUQVJHRVRfVEhVTUIyKQotICAgICAg IGluc24gPSBlbWl0X2luc24gKGdlbl90aHVtYjJfYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdF Tl9JTlQgKC0xKSkpOwotICAgICBlbHNlCi0gICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX2Fk ZHNpM19jb21wYXJlMCAoczAsIHMwLCBHRU5fSU5UICgtMSkpKTsKLQotICAgICBjbXAgPSBYVkVD RVhQIChQQVRURVJOIChpbnNuKSwgMCwgMCk7Ci0gICAgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXAp OwotICAgICBiY29tcCA9IGdlbl9ydHhfTkUgKFZPSURtb2RlLCBjY19yZWcsIGNvbnN0MF9ydHgp OwotICAgICBsb2NfcmVmID0gZ2VuX3J0eF9MQUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kcyBb MV0pOwotICAgICBlbWl0X2p1bXBfaW5zbiAoZ2VuX3J0eF9TRVQgKHBjX3J0eCwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fcnR4X0lGX1RIRU5fRUxTRSAoVk9JRG1vZGUs IGJjb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBsb2NfcmVmLCBwY19ydHgpKSk7Ci0gICAgIERPTkU7Ci0gICB9Ci0gZWxzZQotICAg RkFJTDsKLSB9IikKKyAgaWYgKG9wdGltaXplID4gMCAmJiAoZmxhZ19tb2R1bG9fc2NoZWQgfHwg VEFSR0VUX0hBVkVfTE9CKSkKKyAgICB7CisgICAgICBydHggczA7CisgICAgICBydHggYmNvbXA7 CisgICAgICBydHggbG9jX3JlZjsKKyAgICAgIHJ0eCBjY19yZWc7CisgICAgICBydHggaW5zbjsK KyAgICAgIHJ0eCBjbXA7CisgICAgICBydHggZGVjcmVtZW50X251bTsKKworICAgICAgaWYgKEdF VF9NT0RFIChvcGVyYW5kc1swXSkgIT0gU0ltb2RlKQorCUZBSUw7CisKKyAgICAgIHMwID0gb3Bl cmFuZHNbMF07CisKKyAgICAgICBpZiAoVEFSR0VUX0hBVkVfTE9CICYmIGFybV90YXJnZXRfYmJf b2tfZm9yX2xvYiAoQkxPQ0tfRk9SX0lOU04gKG9wZXJhbmRzWzFdKSkpCisJeworCSAgczAgPSBn ZW5fcnR4X1JFRyAoU0ltb2RlLCBMUl9SRUdOVU0pOworCisJICAvKiBJZiB3ZSBoYXZlIGEgY29t cGF0aWJlIE1WRSB0YXJnZXQsIHRyeSBhbmQgYW5hbHlzZSB0aGUgbG9vcAorCSAgICAgY29udGVu dHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiB1c2UgcHJlZGljYXRlZCBkbHN0cC9sZXRwCisJICAg ICBsb29waW5nLiAgKi8KKwkgIGlmIChUQVJHRVRfSEFWRV9NVkUgJiYgVEFSR0VUX1RIVU1CMgor CSAgICAgICYmIChkZWNyZW1lbnRfbnVtID0gYXJtX2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChv cGVyYW5kc1sxXSkpCisJICAgICAgJiYgKElOVFZBTCAoZGVjcmVtZW50X251bSkgIT0gMSkpCisJ ICAgIHsKKwkgICAgICBpbnNuID0gZW1pdF9pbnNuCisJCSAgICAgIChnZW5fdGh1bWIyX2FkZHNp M19jb21wYXJlMAorCQkJICAoczAsIHMwLCBHRU5fSU5UICgoLTEpICogKElOVFZBTCAoZGVjcmVt ZW50X251bSkpKSkpOworCSAgICAgIGNtcCA9IFhWRUNFWFAgKFBBVFRFUk4gKGluc24pLCAwLCAw KTsKKwkgICAgICBjY19yZWcgPSBTRVRfREVTVCAoY21wKTsKKwkgICAgICBiY29tcCA9IGdlbl9y dHhfR0UgKFZPSURtb2RlLCBjY19yZWcsIGNvbnN0MF9ydHgpOworCSAgICAgIGxvY19yZWYgPSBn ZW5fcnR4X0xBQkVMX1JFRiAoVk9JRG1vZGUsIG9wZXJhbmRzWzFdKTsKKwkgICAgICBlbWl0X2p1 bXBfaW5zbiAoZ2VuX3J0eF9TRVQgKHBjX3J0eCwKKwkJCQkgICAgICAgZ2VuX3J0eF9JRl9USEVO X0VMU0UgKFZPSURtb2RlLCBiY29tcCwKKwkJCQkJCQkgICAgIGxvY19yZWYsIHBjX3J0eCkpKTsK KwkgICAgICBET05FOworCSAgICB9CisKKwkgIC8qIE90aGVyd2lzZSwgdHJ5IHN0YW5kYXJkIGRl Y3JlbWVudC1ieS1vbmUgZGxzL2xlIGxvb3BpbmcuICAqLworCSAgaWYgKFRBUkdFVF9USFVNQjIp CisJICAgIGluc24gPSBlbWl0X2luc24gKGdlbl90aHVtYjJfYWRkc2kzX2NvbXBhcmUwIChzMCwg czAsCisJCQkJCQkJICBHRU5fSU5UICgtMSkpKTsKKwkgIGVsc2UKKwkgICAgaW5zbiA9IGVtaXRf aW5zbiAoZ2VuX2FkZHNpM19jb21wYXJlMCAoczAsIHMwLCBHRU5fSU5UICgtMSkpKTsKKworCSAg Y21wID0gWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksIDAsIDApOworCSAgY2NfcmVnID0gU0VUX0RF U1QgKGNtcCk7CisJICBiY29tcCA9IGdlbl9ydHhfTkUgKFZPSURtb2RlLCBjY19yZWcsIGNvbnN0 MF9ydHgpOworCSAgbG9jX3JlZiA9IGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgb3BlcmFu ZHNbMV0pOworCSAgZW1pdF9qdW1wX2luc24gKGdlbl9ydHhfU0VUIChwY19ydHgsCisJCQkJICAg ICAgIGdlbl9ydHhfSUZfVEhFTl9FTFNFIChWT0lEbW9kZSwgYmNvbXAsCisJCQkJCQkJICAgICBs b2NfcmVmLCBwY19ydHgpKSk7CisJICBET05FOworCX0KKyAgICAgIGVsc2UKKwlGQUlMOworICAg IH0KKyAgZWxzZQorICAgIEZBSUw7Cit9IikKIAogKGRlZmluZV9pbnNuICIqY2xlYXJfYXBzciIK ICAgWyh1bnNwZWNfdm9sYXRpbGU6U0kgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNfQ0xSTV9BUFNS KQpAQCAtMTc1NSw3ICsxNzgxLDM3IEBACiAgIHsKICAgICBpZiAoUkVHTk8gKG9wZXJhbmRzWzBd KSA9PSBMUl9SRUdOVU0pCiAgICAgICB7Ci0JZW1pdF9pbnNuIChnZW5fZGxzX2luc24gKG9wZXJh bmRzWzBdKSk7CisJLyogUGljayBvdXQgdGhlIG51bWJlciBieSB3aGljaCB3ZSBhcmUgZGVjcmVt ZW50aW5nIHRoZSBsb29wIGNvdW50ZXIKKwkgICBpbiBldmVyeSBpdGVyYXRpb24uICBJZiBpdCdz ID4gMSwgdGhlbiB1c2UgZGxzdHAuICAqLworCWludCBjb25zdF9pbnRfZGVjX251bQorCSAgICAg PSBhYnMgKElOVFZBTCAoWEVYUCAoWEVYUCAoWFZFQ0VYUCAoUEFUVEVSTiAob3BlcmFuZHNbMV0p LCAwLCAxKSwKKwkJCQkgIDEpLAorCQkJICAgIDEpKSk7CisJc3dpdGNoIChjb25zdF9pbnRfZGVj X251bSkKKwkgIHsKKwkgICAgY2FzZSAxNjoKKwkgICAgICBlbWl0X2luc24gKGdlbl9kbHN0cDhf aW5zbiAob3BlcmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIDg6CisJICAg ICAgZW1pdF9pbnNuIChnZW5fZGxzdHAxNl9pbnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJy ZWFrOworCisJICAgIGNhc2UgNDoKKwkgICAgICBlbWl0X2luc24gKGdlbl9kbHN0cDMyX2luc24g KG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAyOgorCSAgICAgIGVt aXRfaW5zbiAoZ2VuX2Rsc3RwNjRfaW5zbiAob3BlcmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsK KworCSAgICBjYXNlIDE6CisJICAgICAgZW1pdF9pbnNuIChnZW5fZGxzX2luc24gKG9wZXJhbmRz WzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBnY2NfdW5yZWFj aGFibGUgKCk7CisJICB9CiAJRE9ORTsKICAgICAgIH0KICAgICBlbHNlCmRpZmYgLS1naXQgYS9n Y2MvY29uZmlnL2FybS91bnNwZWNzLm1kIGIvZ2NjL2NvbmZpZy9hcm0vdW5zcGVjcy5tZAppbmRl eCBkY2NkYTI4MzU3My4uZjdjNGYyYjFiMGUgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL3Vu c3BlY3MubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0vdW5zcGVjcy5tZApAQCAtNTgxLDYgKzU4MSwx MCBAQAogICBWQURETFZRX1UKICAgVkNUUAogICBWQ1RQX00KKyAgRExTVFA4CisgIERMU1RQMTYK KyAgRExTVFAzMgorICBETFNUUDY0CiAgIFZQTk9UCiAgIFZDUkVBVEVRX0YKICAgVkNWVFFfTl9U T19GX1MKZGlmZiAtLWdpdCBhL2djYy9kZi1jb3JlLmNjIGIvZ2NjL2RmLWNvcmUuY2MKaW5kZXgg ZDQ4MTJiMDRhN2MuLjRmY2MxNGJmNzkwIDEwMDY0NAotLS0gYS9nY2MvZGYtY29yZS5jYworKysg Yi9nY2MvZGYtY29yZS5jYwpAQCAtMTk2NCw2ICsxOTY0LDIxIEBAIGRmX2JiX3JlZ25vX2xhc3Rf ZGVmX2ZpbmQgKGJhc2ljX2Jsb2NrIGJiLCB1bnNpZ25lZCBpbnQgcmVnbm8pCiAgIHJldHVybiBO VUxMOwogfQogCisvKiBSZXR1cm4gdGhlIG9uZSBhbmQgb25seSBkZWYgb2YgUkVHTk8gd2l0aGlu IEJCLiAgSWYgdGhlcmUgaXMgbm8gZGVmIG9yCisgICB0aGVyZSBhcmUgbXVsdGlwbGUgZGVmcywg cmV0dXJuIE5VTEwuICAqLworCitkZl9yZWYKK2RmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQgKGJh c2ljX2Jsb2NrIGJiLCB1bnNpZ25lZCBpbnQgcmVnbm8pCit7CisgIGRmX3JlZiB0ZW1wID0gZGZf YmJfcmVnbm9fZmlyc3RfZGVmX2ZpbmQgKGJiLCByZWdubyk7CisgIGlmICghdGVtcCkKKyAgICBy ZXR1cm4gTlVMTDsKKyAgZWxzZSBpZiAodGVtcCA9PSBkZl9iYl9yZWdub19sYXN0X2RlZl9maW5k IChiYiwgcmVnbm8pKQorICAgIHJldHVybiB0ZW1wOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7 Cit9CisKIC8qIEZpbmRzIHRoZSByZWZlcmVuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGVmaW5p dGlvbiBvZiBSRUcgaW4gSU5TTi4KICAgIERGIGlzIHRoZSBkYXRhZmxvdyBvYmplY3QuICAqLwog CmRpZmYgLS1naXQgYS9nY2MvZGYuaCBiL2djYy9kZi5oCmluZGV4IDQwMjY1N2E3MDc2Li45ODYy MzYzN2Y5YyAxMDA2NDQKLS0tIGEvZ2NjL2RmLmgKKysrIGIvZ2NjL2RmLmgKQEAgLTk4Nyw2ICs5 ODcsNyBAQCBleHRlcm4gdm9pZCBkZl9jaGVja19jZmdfY2xlYW4gKHZvaWQpOwogI2VuZGlmCiBl eHRlcm4gZGZfcmVmIGRmX2JiX3JlZ25vX2ZpcnN0X2RlZl9maW5kIChiYXNpY19ibG9jaywgdW5z aWduZWQgaW50KTsKIGV4dGVybiBkZl9yZWYgZGZfYmJfcmVnbm9fbGFzdF9kZWZfZmluZCAoYmFz aWNfYmxvY2ssIHVuc2lnbmVkIGludCk7CitleHRlcm4gZGZfcmVmIGRmX2JiX3JlZ25vX29ubHlf ZGVmX2ZpbmQgKGJhc2ljX2Jsb2NrLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGRmX3JlZiBkZl9m aW5kX2RlZiAocnR4X2luc24gKiwgcnR4KTsKIGV4dGVybiBib29sIGRmX3JlZ19kZWZpbmVkIChy dHhfaW5zbiAqLCBydHgpOwogZXh0ZXJuIGRmX3JlZiBkZl9maW5kX3VzZSAocnR4X2luc24gKiwg cnR4KTsKZGlmZiAtLWdpdCBhL2djYy9sb29wLWRvbG9vcC5jYyBiL2djYy9sb29wLWRvbG9vcC5j YwppbmRleCA0ZmViMGEyNWFiOS4uZjZkYmQwNTE1ZGUgMTAwNjQ0Ci0tLSBhL2djYy9sb29wLWRv bG9vcC5jYworKysgYi9nY2MvbG9vcC1kb2xvb3AuY2MKQEAgLTg1LDI5ICs4NSwyOSBAQCBkb2xv b3BfY29uZGl0aW9uX2dldCAocnR4X2luc24gKmRvbG9vcF9wYXQpCiAgICAgIGZvcm1zOgogCiAg ICAgIDEpICAocGFyYWxsZWwgWyhzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChjb25kaXRpb24pCi0J ICAJCQkgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0JCQkJICAgICAgICAgICAgKHBj KSkpCi0JICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkp KQotCSAgICAgICAgICAgICAoYWRkaXRpb25hbCBjbG9iYmVycyBhbmQgdXNlcyldKQorCQkJCQkg ICAgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCQkgICAgKHBjKSkpCisJCSAgICAgKHNldCAocmVn KSAocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkpCisJCSAgICAgKGFkZGl0aW9uYWwgY2xvYmJl cnMgYW5kIHVzZXMpXSkKIAogICAgICBUaGUgYnJhbmNoIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5 IG9mIHRoZSBwYXJhbGxlbCAoYWxzbyByZXF1aXJlZAogICAgICBieSBqdW1wLmNjKSwgYW5kIHRo ZSBzZWNvbmQgZW50cnkgb2YgdGhlIHBhcmFsbGVsIG11c3QgYmUgYSBzZXQgb2YKICAgICAgdGhl IGxvb3AgY291bnRlciByZWdpc3Rlci4gIFNvbWUgdGFyZ2V0cyAoSUEtNjQpIHdyYXAgdGhlIHNl dCBvZgogICAgICB0aGUgbG9vcCBjb3VudGVyIGluIGFuIGlmX3RoZW5fZWxzZSB0b28uCiAKLSAg ICAgMikgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAgICAgICAo c2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCi0JICAgICAgICAgICAgICAgICAgICAg ICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLQkJCSAgICAgICAgIChwYykpKS4gIAorICAgICAyKSAg KHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkKKwkgKHNldCAocGMpIChpZl90 aGVuX2Vsc2UgKHJlZyAhPSAwKQorCQkJCSAobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJIChwYykp KS4KIAogICAgICBTb21lIHRhcmdldHMgKEFSTSkgZG8gdGhlIGNvbXBhcmlzb24gYmVmb3JlIHRo ZSBicmFuY2gsIGFzIGluIHRoZQogICAgICBmb2xsb3dpbmcgZm9ybToKIAotICAgICAzKSAocGFy YWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAoKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSksIDAp KSkKLSAgICAgICAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQg LTEpKSldKQotICAgICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY2MgPT0gTkUpCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkpICovCisgICAgIDMpIChwYXJhbGxlbCBbKHNl dCAoY2MpIChjb21wYXJlICgocGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSwgMCkpKQorCQkgICAo c2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLW4pKSldKQorCShzZXQgKHBjKSAoaWZf dGhlbl9lbHNlIChjYyA9PSBORSkKKwkJCQkobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJKHBjKSkp ICovCiAKICAgcGF0dGVybiA9IFBBVFRFUk4gKGRvbG9vcF9wYXQpOwogCkBAIC0xNDMsNyArMTQz LDcgQEAgZG9sb29wX2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogCSAgICAg IHx8IEdFVF9DT0RFIChjbXBfYXJnMSkgIT0gUExVUykKIAkgICAgcmV0dXJuIDA7CiAJICByZWdf b3JpZyA9IFhFWFAgKGNtcF9hcmcxLCAwKTsKLQkgIGlmIChYRVhQIChjbXBfYXJnMSwgMSkgIT0g R0VOX0lOVCAoLTEpIAorCSAgaWYgKCFDT05TVF9JTlRfUCAoWEVYUCAoY21wX2FyZzEsIDEpKQog CSAgICAgIHx8ICFSRUdfUCAocmVnX29yaWcpKQogCSAgICByZXR1cm4gMDsKIAkgIGNjX3JlZyA9 IFNFVF9ERVNUIChjbXBfb3JpZyk7CkBAIC0xNTYsNyArMTU2LDggQEAgZG9sb29wX2NvbmRpdGlv bl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogCXsKIAkgIC8qIFdlIGV4cGVjdCB0aGUgY29u ZGl0aW9uIHRvIGJlIG9mIHRoZSBmb3JtIChyZWcgIT0gMCkgICovCiAJICBjb25kID0gWEVYUCAo U0VUX1NSQyAoY21wKSwgMCk7Ci0JICBpZiAoR0VUX0NPREUgKGNvbmQpICE9IE5FIHx8IFhFWFAg KGNvbmQsIDEpICE9IGNvbnN0MF9ydHgpCisJICBpZiAoKEdFVF9DT0RFIChjb25kKSAhPSBORSAm JiBHRVRfQ09ERSAoY29uZCkgIT0gR0UpCisJICAgICAgfHwgWEVYUCAoY29uZCwgMSkgIT0gY29u c3QwX3J0eCkKIAkgICAgcmV0dXJuIDA7CiAJfQogICAgIH0KQEAgLTE3MywxNCArMTc0LDE0IEBA IGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAqZG9sb29wX3BhdCkKICAgaWYgKCEgUkVH X1AgKHJlZykpCiAgICAgcmV0dXJuIDA7CiAKLSAgLyogQ2hlY2sgaWYgc29tZXRoaW5nID0gKHBs dXMgKHJlZykgKGNvbnN0X2ludCAtMSkpLgorICAvKiBDaGVjayBpZiBzb21ldGhpbmcgPSAocGx1 cyAocmVnKSAoY29uc3RfaW50IC1uKSkuCiAgICAgIE9uIElBLTY0LCB0aGlzIGRlY3JlbWVudCBp cyB3cmFwcGVkIGluIGFuIGlmX3RoZW5fZWxzZS4gICovCiAgIGluY19zcmMgPSBTRVRfU1JDIChp bmMpOwogICBpZiAoR0VUX0NPREUgKGluY19zcmMpID09IElGX1RIRU5fRUxTRSkKICAgICBpbmNf c3JjID0gWEVYUCAoaW5jX3NyYywgMSk7CiAgIGlmIChHRVRfQ09ERSAoaW5jX3NyYykgIT0gUExV UwogICAgICAgfHwgWEVYUCAoaW5jX3NyYywgMCkgIT0gcmVnCi0gICAgICB8fCBYRVhQIChpbmNf c3JjLCAxKSAhPSBjb25zdG0xX3J0eCkKKyAgICAgIHx8ICFDT05TVF9JTlRfUCAoWEVYUCAoaW5j X3NyYywgMSkpKQogICAgIHJldHVybiAwOwogCiAgIC8qIENoZWNrIGZvciAoc2V0IChwYykgKGlm X3RoZW5fZWxzZSAoY29uZGl0aW9uKQpAQCAtMjExLDQyICsyMTIsNDkgQEAgZG9sb29wX2NvbmRp dGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogICAgICAgfHwgKEdFVF9DT0RFIChYRVhQ IChjb25kaXRpb24sIDApKSA9PSBQTFVTCiAJICAmJiBYRVhQIChYRVhQIChjb25kaXRpb24sIDAp LCAwKSA9PSByZWcpKQogICAgewotICAgICBpZiAoR0VUX0NPREUgKHBhdHRlcm4pICE9IFBBUkFM TEVMKQogICAgICAvKiAgRm9yIHRoZSBzZWNvbmQgZm9ybSB3ZSBleHBlY3Q6CiAKLSAgICAgICAg IChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAgICAgICAoc2V0IChw YykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAocGMpKSkuCisJIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpCisJIChz ZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChyZWcgIT0gMCkKKwkJCQkgKGxhYmVsX3JlZiAobGFiZWwp KQorCQkJCSAocGMpKSkuCiAKLSAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2lu ZzoKKwkgSWYgbiA9PSAxLCB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKIAot ICAgICAgICAgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDEpCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxh YmVsKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkp Ci0gICAgICAgICAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQg LTEpKSkKLSAgICAgICAgICAgICAgICAgICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFuZCB1c2Vz KV0pCisJIChwYXJhbGxlbCBbKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKHJlZyAhPSAxKQorCQkJ CQkgICAgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCQkgICAgKHBjKSkpCisJCSAgICAgKHNldCAo cmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpCisJCSAgICAgKGFkZGl0aW9uYWwgY2xv YmJlcnMgYW5kIHVzZXMpXSkKIAotICAgICAgICBGb3IgdGhlIHRoaXJkIGZvcm0gd2UgZXhwZWN0 OgorCUZvciB0aGUgdGhpcmQgZm9ybSB3ZSBleHBlY3Q6CiAKLSAgICAgICAgKHBhcmFsbGVsIFso c2V0IChjYykgKGNvbXBhcmUgKChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSwgMCkpCi0gICAg ICAgICAgICAgICAgICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpXSkK LSAgICAgICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNjID09IE5FKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChwYykpKSAKKwkocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAo KHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpLCAwKSkKKwkJICAgKHNldCAocmVnKSAocGx1cyAo cmVnKSAoY29uc3RfaW50IC1uKSkpXSkKKwkoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY2MgPT0g TkUpCisJCQkJKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCShwYykpKQogCi0gICAgICAgIHdoaWNo IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKKwlXaGljaCBhbHNvIGZvciBuID09IDEg aXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgogCi0gICAgICAgIChwYXJhbGxlbCBbKHNl dCAoY2MpIChjb21wYXJlIChyZWcsICAxKSkKLSAgICAgICAgICAgICAgICAgICAoc2V0IChyZWcp IChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkKLSAgICAgICAgICAgICAgICAgICAoc2V0IChw YykgKGlmX3RoZW5fZWxzZSAoTkUgPT0gY2MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChwYykpKSldKQorCShwYXJhbGxlbCBbKHNldCAoY2MpIChj b21wYXJlIChyZWcsICAxKSkKKwkJICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50 IC0xKSkpCisJCSAgIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChORSA9PSBjYykKKwkJCQkJICAg KGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCQkgICAocGMpKSkpXSkKIAotICAgICAgICBTbyB3ZSBy ZXR1cm4gdGhlIHNlY29uZCBmb3JtIGluc3RlYWQgZm9yIHRoZSB0d28gY2FzZXMuCisJU28gd2Ug cmV0dXJuIHRoZSBzZWNvbmQgZm9ybSBpbnN0ZWFkIGZvciB0aGUgdHdvIGNhc2VzLgogCisJRm9y IHRoZSAiZWxlbWVudHdpc2UiIGZvcm0gd2hlcmUgdGhlIGRlY3JlbWVudCBudW1iZXIgaXNuJ3Qg LTEsCisJdGhlIGZpbmFsIHZhbHVlIG1heSBiZSBleGNlZWRlZCwgc28gdXNlIEdFIGluc3RlYWQg b2YgTkUuCiAgICAgICovCi0gICAgICAgIGNvbmRpdGlvbiA9IGdlbl9ydHhfZm10X2VlIChORSwg Vk9JRG1vZGUsIGluY19zcmMsIGNvbnN0MV9ydHgpOworICAgICBpZiAoR0VUX0NPREUgKHBhdHRl cm4pICE9IFBBUkFMTEVMKQorICAgICAgIHsKKwlpZiAoSU5UVkFMIChYRVhQIChpbmNfc3JjLCAx KSkgIT0gLTEpCisJICBjb25kaXRpb24gPSBnZW5fcnR4X2ZtdF9lZSAoR0UsIFZPSURtb2RlLCBp bmNfc3JjLCBjb25zdDBfcnR4KTsKKwllbHNlCisJICBjb25kaXRpb24gPSBnZW5fcnR4X2ZtdF9l ZSAoTkUsIFZPSURtb2RlLCBpbmNfc3JjLCBjb25zdDFfcnR4KTs7CisgICAgICAgfQogCiAgICAg cmV0dXJuIGNvbmRpdGlvbjsKICAgIH0KQEAgLTY4NSwxNyArNjkzLDYgQEAgZG9sb29wX29wdGlt aXplIChjbGFzcyBsb29wICpsb29wKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICBt YXhfY29zdAotICAgID0gQ09TVFNfTl9JTlNOUyAocGFyYW1fbWF4X2l0ZXJhdGlvbnNfY29tcHV0 YXRpb25fY29zdCk7Ci0gIGlmIChzZXRfc3JjX2Nvc3QgKGRlc2MtPm5pdGVyX2V4cHIsIG1vZGUs IG9wdGltaXplX2xvb3BfZm9yX3NwZWVkX3AgKGxvb3ApKQotICAgICAgPiBtYXhfY29zdCkKLSAg ICB7Ci0gICAgICBpZiAoZHVtcF9maWxlKQotCWZwcmludGYgKGR1bXBfZmlsZSwKLQkJICJEb2xv b3A6IG51bWJlciBvZiBpdGVyYXRpb25zIHRvbyBjb3N0bHkgdG8gY29tcHV0ZS5cbiIpOwotICAg ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICBpZiAoZGVzYy0+Y29uc3RfaXRlcikKICAgICBp dGVyYXRpb25zID0gd2lkZXN0X2ludDo6ZnJvbSAocnR4X21vZGVfdCAoZGVzYy0+bml0ZXJfZXhw ciwgbW9kZSksCiAJCQkJICAgVU5TSUdORUQpOwpAQCAtNzE2LDExICs3MTMsMjQgQEAgZG9sb29w X29wdGltaXplIChjbGFzcyBsb29wICpsb29wKQogCiAgIC8qIEdlbmVyYXRlIGxvb3BpbmcgaW5z bi4gIElmIHRoZSBwYXR0ZXJuIEZBSUxzIHRoZW4gZ2l2ZSB1cCB0cnlpbmcKICAgICAgdG8gbW9k aWZ5IHRoZSBsb29wIHNpbmNlIHRoZXJlIGlzIHNvbWUgYXNwZWN0IHRoZSBiYWNrLWVuZCBkb2Vz Ci0gICAgIG5vdCBsaWtlLiAgKi8KLSAgY291bnQgPSBjb3B5X3J0eCAoZGVzYy0+bml0ZXJfZXhw cik7CisgICAgIG5vdCBsaWtlLiAgSWYgdGhpcyBzdWNjZWVkcywgdGhlcmUgaXMgYSBjaGFuY2Ug dGhhdCB0aGUgbG9vcAorICAgICBkZXNjLT5uaXRlcl9leHByIGhhcyBiZWVuIGFsdGVyZWQgYnkg dGhlIGJhY2tlbmQsIHNvIG9ubHkgZXh0cmFjdAorICAgICB0aGF0IGRhdGEgYWZ0ZXIgdGhlIGdl bl9kb2xvb3BfZW5kLiAgKi8KICAgc3RhcnRfbGFiZWwgPSBibG9ja19sYWJlbCAoZGVzYy0+aW5f ZWRnZS0+ZGVzdCk7CiAgIGRvbG9vcF9yZWcgPSBnZW5fcmVnX3J0eCAobW9kZSk7CiAgIHJ0eF9p bnNuICpkb2xvb3Bfc2VxID0gdGFyZ2V0bS5nZW5fZG9sb29wX2VuZCAoZG9sb29wX3JlZywgc3Rh cnRfbGFiZWwpOworICBjb3VudCA9IGNvcHlfcnR4IChkZXNjLT5uaXRlcl9leHByKTsKKworICBt YXhfY29zdAorICAgID0gQ09TVFNfTl9JTlNOUyAocGFyYW1fbWF4X2l0ZXJhdGlvbnNfY29tcHV0 YXRpb25fY29zdCk7CisgIGlmIChzZXRfc3JjX2Nvc3QgKGNvdW50LCBtb2RlLCBvcHRpbWl6ZV9s b29wX2Zvcl9zcGVlZF9wIChsb29wKSkKKyAgICAgID4gbWF4X2Nvc3QpCisgICAgeworICAgICAg aWYgKGR1bXBfZmlsZSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsCisJCSAiRG9sb29wOiBudW1iZXIg b2YgaXRlcmF0aW9ucyB0b28gY29zdGx5IHRvIGNvbXB1dGUuXG4iKTsKKyAgICAgIHJldHVybiBm YWxzZTsKKyAgICB9CiAKICAgd29yZF9tb2RlX3NpemUgPSBHRVRfTU9ERV9QUkVDSVNJT04gKHdv cmRfbW9kZSk7CiAgIHdvcmRfbW9kZV9tYXggPSAoSE9TVF9XSURFX0lOVF8xVSA8PCAod29yZF9t b2RlX3NpemUgLSAxKSA8PCAxKSAtIDE7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvYXJtL2xvYi5oIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IuaAppbmRl eCBmZWFhZTdjYzg5OS4uMzk0MWZlN2E4YjYgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hcm0vbG9iLmgKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2Iu aApAQCAtMSwxNSArMSwxMzEgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KLQorI2luY2x1ZGUgPHN0 ZGludC5oPgogLyogQ29tbW9uIGNvZGUgZm9yIGxvYiB0ZXN0cy4gICovCiAKICNkZWZpbmUgTk9f TE9CIGFzbSB2b2xhdGlsZSAoIkAgY2xvYmJlciBsciIgOiA6IDogImxyIiApCiAKLSNkZWZpbmUg TiAxMDAwMAorI2RlZmluZSBOIDEwMAorCitzdGF0aWMgdm9pZAorcmVzZXRfZGF0YSAoaW50ICph LCBpbnQgKmIsIGludCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2Yg KCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywg MCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGE4IChpbnQ4 X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgeCkKK3sKKyAgbWVtc2V0IChhLCAtMSwg eCAqIHNpemVvZiAoKmEpKTsKKyAgbWVtc2V0IChiLCAtMSwgeCAqIHNpemVvZiAoKmIpKTsKKyAg bWVtc2V0IChjLCAwLCB4ICogc2l6ZW9mICgqYykpOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRf ZGF0YTE2IChpbnQxNl90ICphLCBpbnQxNl90ICpiLCBpbnQxNl90ICpjLCBpbnQgeCkKK3sKKyAg bWVtc2V0IChhLCAtMSwgeCAqIHNpemVvZiAoKmEpKTsKKyAgbWVtc2V0IChiLCAtMSwgeCAqIHNp emVvZiAoKmIpKTsKKyAgbWVtc2V0IChjLCAwLCB4ICogc2l6ZW9mICgqYykpOworfQorCitzdGF0 aWMgdm9pZAorcmVzZXRfZGF0YTMyIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpj LCBpbnQgeCkKK3sKKyAgbWVtc2V0IChhLCAtMSwgeCAqIHNpemVvZiAoKmEpKTsKKyAgbWVtc2V0 IChiLCAtMSwgeCAqIHNpemVvZiAoKmIpKTsKKyAgbWVtc2V0IChjLCAwLCB4ICogc2l6ZW9mICgq YykpOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRfZGF0YTY0IChpbnQ2NF90ICphLCBpbnQ2NF90 ICpjLCBpbnQgeCkKK3sKKyAgbWVtc2V0IChhLCAtMSwgeCAqIHNpemVvZiAoKmEpKTsKKyAgbWVt c2V0IChjLCAwLCB4ICogc2l6ZW9mICgqYykpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGx1 cyAoaW50ICphLCBpbnQgKmIsIGludCAqYywgaW50IHgpCit7CisgIGZvciAoaW50IGkgPSAwOyBp IDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJ ICBpZiAoY1tpXSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJ eworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZv aWQKK2NoZWNrX3BsdXM4IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgeCkK K3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9COwor ICAgICAgaWYgKGkgPCB4KQorCXsKKwkgIGlmIChjW2ldICE9IChhW2ldICsgYltpXSkpIGFib3J0 ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9 CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcGx1czE2IChpbnQxNl90ICphLCBpbnQx Nl90ICpiLCBpbnQxNl90ICpjLCBpbnQgeCkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBp KyspCisgICAgeworICAgICAgTk9fTE9COworICAgICAgaWYgKGkgPCB4KQorCXsKKwkgIGlmIChj W2ldICE9IChhW2ldICsgYltpXSkpIGFib3J0ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBp ZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hl Y2tfcGx1czMyIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgeCkKK3sK KyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9COworICAg ICAgaWYgKGkgPCB4KQorCXsKKwkgIGlmIChjW2ldICE9IChhW2ldICsgYltpXSkpIGFib3J0ICgp OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9Cisg ICAgfQorfQogCiBzdGF0aWMgdm9pZAotcmVzZXRfZGF0YSAoaW50ICphLCBpbnQgKmIsIGludCAq YykKK2NoZWNrX21lbWNweTY0IChpbnQ2NF90ICphLCBpbnQ2NF90ICpjLCBpbnQgeCkKIHsKLSAg bWVtc2V0IChhLCAtMSwgTiAqIHNpemVvZiAoKmEpKTsKLSAgbWVtc2V0IChiLCAtMSwgTiAqIHNp emVvZiAoKmIpKTsKLSAgbWVtc2V0IChjLCAtMSwgTiAqIHNpemVvZiAoKmMpKTsKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9COworICAgICAgaWYgKGkg PCB4KQorCXsKKwkgIGlmIChjW2ldICE9IGFbaV0pIGFib3J0ICgpOworCX0KKyAgICAgIGVsc2UK Kwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9CisgICAgfQogfQpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvYXJtL2xvYjEuYwppbmRleCBiYTVjODJjZDU1Yy4uYzhjZTY1M2E1YzMgMTAwNjQ0 Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iMS5jCisrKyBiL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iMS5jCkBAIC01NCwyOSArNTQsMTggQEAgbG9vcDMgKGlu dCAqYSwgaW50ICpiLCBpbnQgKmMpCiAgICAgfSB3aGlsZSAoaSA8IE4pOwogfQogCi12b2lkCi1j aGVjayAoaW50ICphLCBpbnQgKmIsIGludCAqYykKLXsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBO OyBpKyspCi0gICAgewotICAgICAgTk9fTE9COwotICAgICAgaWYgKGNbaV0gIT0gYVtpXSArIGJb aV0pCi0JYWJvcnQgKCk7Ci0gICAgfQotfQotCiBpbnQKIG1haW4gKHZvaWQpCiB7Ci0gIHJlc2V0 X2RhdGEgKGEsIGIsIGMpOworICByZXNldF9kYXRhIChhLCBiLCBjLCBOKTsKICAgbG9vcDEgKGEs IGIgLGMpOwotICBjaGVjayAoYSwgYiAsYyk7Ci0gIHJlc2V0X2RhdGEgKGEsIGIsIGMpOworICBj aGVja19wbHVzIChhLCBiLCBjLCBOKTsKKyAgcmVzZXRfZGF0YSAoYSwgYiwgYywgTik7CiAgIGxv b3AyIChhLCBiICxjKTsKLSAgY2hlY2sgKGEsIGIgLGMpOwotICByZXNldF9kYXRhIChhLCBiLCBj KTsKKyAgY2hlY2tfcGx1cyAoYSwgYiwgYywgTik7CisgIHJlc2V0X2RhdGEgKGEsIGIsIGMsIE4p OwogICBsb29wMyAoYSwgYiAsYyk7Ci0gIGNoZWNrIChhLCBiICxjKTsKKyAgY2hlY2tfcGx1cyAo YSwgYiwgYywgTik7CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYXJtL2xvYjYuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9i Ni5jCmluZGV4IDE3YjYxMjQyOTVlLi40ZmUxMTZlMmMyYiAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2FybS9sb2I2LmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FybS9sb2I2LmMKQEAgLTc5LDE0ICs3OSwxNCBAQCBjaGVjayAodm9pZCkKIGludAogbWFpbiAo dm9pZCkKIHsKLSAgcmVzZXRfZGF0YSAoYTEsIGIxLCBjMSk7Ci0gIHJlc2V0X2RhdGEgKGEyLCBi MiwgYzIpOworICByZXNldF9kYXRhIChhMSwgYjEsIGMxLCBOKTsKKyAgcmVzZXRfZGF0YSAoYTIs IGIyLCBjMiwgTik7CiAgIGxvb3AxIChhMSwgYjEsIGMxKTsKICAgcmVmMSAoYTIsIGIyLCBjMik7 CiAgIGNoZWNrICgpOwogCi0gIHJlc2V0X2RhdGEgKGExLCBiMSwgYzEpOwotICByZXNldF9kYXRh IChhMiwgYjIsIGMyKTsKKyAgcmVzZXRfZGF0YSAoYTEsIGIxLCBjMSwgTik7CisgIHJlc2V0X2Rh dGEgKGEyLCBiMiwgYzIsIE4pOwogICBsb29wMiAoYTEsIGIxLCBjMSk7CiAgIHJlZjIgKGEyLCBi MiwgYzIpOwogICBjaGVjayAoKTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9hcm0vbXZlL2Rsc3RwLWNvbXBpbGUtYXNtLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv YXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwLi5mZTU3M2ViYjc0OQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWNvbXBpbGUtYXNtLmMKQEAgLTAsMCArMSw0NDIgQEAK Ky8qIHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRn LXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGct b3B0aW9ucyAiLU8zIC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92 OF8xbV9tdmUgfSAqLworCisjaW5jbHVkZSA8YXJtX212ZS5oPgorCisjZGVmaW5lIElNTSA1CisK KyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUlkoQklUUywgTEFORVMsIExEUlNU UllUUEUsIFRZUEUsIFNJR04sIE5BTUUsIFBSRUQpCQkJCVwKK3ZvaWQgdGVzdF8jI05BTUUjI1BS RUQjI18jI1NJR04jI0JJVFMgKFRZUEUjI0JJVFMjI190ICphLCBUWVBFIyNCSVRTIyNfdCAqYiwg IFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3aGlsZSAobiA+ IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJlZDE2X3QgcCA9 IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNf dCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHApOwkJXAorICAg ICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZiID0gdmxkciMjTERSU1RSWVRQRSMjcV96XyMj U0lHTiMjQklUUyAoYiwgcCk7CQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmMg PSBOQU1FIyNQUkVEIyNfIyNTSUdOIyNCSVRTICh2YSwgdmIsIHApOwkJXAorICAgICAgdnN0ciMj TERSU1RSWVRQRSMjcV9wXyMjU0lHTiMjQklUUyAoYywgdmMsIHApOwkJCQkJXAorICAgICAgYyAr PSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBhICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIGIg Kz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgbiAtPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgfQkJ CQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5T SUdORURfVEVSTkFSWShCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgTkFNRSwgUFJFRCkJXAorVEVT VF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUlkgKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBpbnQs IHMsIE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUlkgKEJJVFMs IExBTkVTLCBMRFJTVFJZVFBFLCB1aW50LCB1LCBOQU1FLCBQUkVEKQorCisjZGVmaW5lIFRFU1Rf Q09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZKE5BTUUsIFBS RUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZICg4 LCAxNiwgYiwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9V TlNJR05FRF9URVJOQVJZICgxNiwgOCwgaCwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxF X0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZICgzMiwgNCwgdywgTkFNRSwgUFJFRCkK KworCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFS WSAodmFkZHEsIF94KQorVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lH TkVEX1RFUk5BUlkgKHZtdWxxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZICh2c3VicSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBf SU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWSAodmhhZGRxLCBfeCkKK1RFU1RfQ09NUElM RV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZICh2b3JycSwgX3gpCisK KworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWV9NKEJJVFMsIExBTkVTLCBM RFJTVFJZVFBFLCBUWVBFLCBTSUdOLCBOQU1FLCBQUkVEKQkJCQlcCit2b2lkIHRlc3RfIyNOQU1F IyNQUkVEIyNfIyNTSUdOIyNCSVRTIChUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgX19pbmFjdGl2 ZSwgVFlQRSMjQklUUyMjX3QgKmEsIFRZUEUjI0JJVFMjI190ICpiLCAgVFlQRSMjQklUUyMjX3Qg KmMsIGludCBuKQlcCit7CQkJCQkJCQkJCQlcCisgIHdoaWxlIChuID4gMCkJCQkJCQkJCQkJXAor ICAgIHsJCQkJCQkJCQkJCVwKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cCMjQklUUyMjcSAo bik7CQkJCQkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZhID0gdmxkciMjTERS U1RSWVRQRSMjcV96XyMjU0lHTiMjQklUUyAoYSwgcCk7CQlcCisgICAgICBUWVBFIyNCSVRTIyN4 IyNMQU5FUyMjX3QgdmIgPSB2bGRyIyNMRFJTVFJZVFBFIyNxX3pfIyNTSUdOIyNCSVRTIChiLCBw KTsJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YyA9IE5BTUUjI1BSRUQjI18j I1NJR04jI0JJVFMgKF9faW5hY3RpdmUsIHZhLCB2YiwgcCk7CQlcCisgICAgICB2c3RyIyNMRFJT VFJZVFBFIyNxX3BfIyNTSUdOIyNCSVRTIChjLCB2YywgcCk7CQkJCQlcCisgICAgICBjICs9IExB TkVTOwkJCQkJCQkJCVwKKyAgICAgIGEgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYiArPSBM QU5FUzsJCQkJCQkJCQlcCisgICAgICBuIC09IExBTkVTOwkJCQkJCQkJCVwKKyAgICB9CQkJCQkJ CQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05F RF9URVJOQVJZX00oQklUUywgTEFORVMsIExEUlNUUllUUEUsIE5BTUUsIFBSRUQpCVwKK1RFU1Rf Q09NUElMRV9JTl9ETFNUUF9URVJOQVJZX00gKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBpbnQs IHMsIE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTSAoQklU UywgTEFORVMsIExEUlNUUllUUEUsIHVpbnQsIHUsIE5BTUUsIFBSRUQpCisKKyNkZWZpbmUgVEVT VF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTShOQU1F LCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFS WV9NICg4LCAxNiwgYiwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX00gKDE2LCA4LCBoLCBOQU1FLCBQUkVEKQkJCQlcCitURVNU X0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAoMzIsIDQsIHcsIE5B TUUsIFBSRUQpCisKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lH TkVEX1RFUk5BUllfTSAodmFkZHEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNf U0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAodm11bHEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RM U1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAodnN1YnEsIF9tKQorVEVTVF9D T01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAodmhhZGRx LCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJO QVJZX00gKHZvcnJxLCBfbSkKKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFS WV9OKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBUWVBFLCBTSUdOLCBOQU1FLCBQUkVEKQlcCit2 b2lkIHRlc3RfIyNOQU1FIyNQUkVEIyNfbl8jI1NJR04jI0JJVFMgKFRZUEUjI0JJVFMjI190ICph LCAgVFlQRSMjQklUUyMjX3QgKmMsIGludCBuKQlcCit7CQkJCQkJCQkJCQlcCisgIHdoaWxlIChu ID4gMCkJCQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQkJCVwKKyAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cCMjQklUUyMjcSAobik7CQkJCQkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMj I190IHZhID0gdmxkciMjTERSU1RSWVRQRSMjcV96XyMjU0lHTiMjQklUUyAoYSwgcCk7CQlcCisg ICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmMgPSBOQU1FIyNQUkVEIyNfbl8jI1NJR04j I0JJVFMgKHZhLCBJTU0sIHApOwkJXAorICAgICAgdnN0ciMjTERSU1RSWVRQRSMjcV9wXyMjU0lH TiMjQklUUyAoYywgdmMsIHApOwkJCQkJXAorICAgICAgYyArPSBMQU5FUzsJCQkJCQkJCQlcCisg ICAgICBhICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIG4gLT0gTEFORVM7CQkJCQkJCQkJXAor ICAgIH0JCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lH TkVEX1VOU0lHTkVEX1RFUk5BUllfTihCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgTkFNRSwgUFJF RCkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTiAoQklUUywgTEFORVMsIExEUlNU UllUUEUsIGludCwgcywgTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVS TkFSWV9OIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgdWludCwgdSwgTkFNRSwgUFJFRCkKKwor I2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVS TkFSWV9OKE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZX04gKDgsIDE2LCBiLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVf SU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAoMTYsIDgsIGgsIE5BTUUsIFBSRUQp CQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICgz MiwgNCwgdywgTkFNRSwgUFJFRCkKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lH TkVEX1VOU0lHTkVEX1RFUk5BUllfTiAodmFkZHEsIF94KQorVEVTVF9DT01QSUxFX0lOX0RMU1RQ X0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAodm11bHEsIF94KQorVEVTVF9DT01Q SUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAodnN1YnEsIF94 KQorVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllf TiAodmhhZGRxLCBfeCkKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VO U0lHTkVEX1RFUk5BUllfTiAodmJyc3JxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRC SVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZzaGxxLCBfeCkKK1RFU1RfQ09NUElMRV9J Tl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZzaHJxLCBfeCkKKwor I2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWV9NX04oQklUUywgTEFORVMsIExE UlNUUllUUEUsIFRZUEUsIFNJR04sIE5BTUUsIFBSRUQpCVwKK3ZvaWQgdGVzdF8jI05BTUUjI1BS RUQjI19uXyMjU0lHTiMjQklUUyAoVFlQRSMjQklUUyMjeCMjTEFORVMjI190IF9faW5hY3RpdmUs IFRZUEUjI0JJVFMjI190ICphLCAgVFlQRSMjQklUUyMjX3QgKmMsIGludCBuKQlcCit7CQkJCQkJ CQkJCQlcCisgIHdoaWxlIChuID4gMCkJCQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQkJCVwKKyAg ICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cCMjQklUUyMjcSAobik7CQkJCQkJXAorICAgICAgVFlQ RSMjQklUUyMjeCMjTEFORVMjI190IHZhID0gdmxkciMjTERSU1RSWVRQRSMjcV96XyMjU0lHTiMj QklUUyAoYSwgcCk7CQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmMgPSBOQU1F IyNQUkVEIyNfbl8jI1NJR04jI0JJVFMgKF9faW5hY3RpdmUsIHZhLCBJTU0sIHApOwkJXAorICAg ICAgdnN0ciMjTERSU1RSWVRQRSMjcV9wXyMjU0lHTiMjQklUUyAoYywgdmMsIHApOwkJCQkJXAor ICAgICAgYyArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBhICs9IExBTkVTOwkJCQkJCQkJCVwK KyAgICAgIG4gLT0gTEFORVM7CQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQkJCVwKK30KKworI2Rl ZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OKEJJ VFMsIExBTkVTLCBMRFJTVFJZVFBFLCBOQU1FLCBQUkVEKQlcCitURVNUX0NPTVBJTEVfSU5fRExT VFBfVEVSTkFSWV9NX04gKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBpbnQsIHMsIE5BTUUsIFBS RUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTV9OIChCSVRTLCBMQU5FUywg TERSU1RSWVRQRSwgdWludCwgdSwgTkFNRSwgUFJFRCkKKworI2RlZmluZSBURVNUX0NPTVBJTEVf SU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04oTkFNRSwgUFJFRCkJ CQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICg4 LCAxNiwgYiwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9V TlNJR05FRF9URVJOQVJZX01fTiAoMTYsIDgsIGgsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKDMyLCA0LCB3LCBOQU1F LCBQUkVEKQorCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURf VEVSTkFSWV9NX04gKHZhZGRxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAodm11bHEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RM U1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2c3VicSwgX20pCitURVNU X0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZo YWRkcSwgX20pCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05F RF9URVJOQVJZX01fTiAodmJyc3JxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRT X1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAodnNobHEsIF9tKQorVEVTVF9DT01QSUxFX0lO X0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2c2hycSwgX20pCisK Ky8qIE5vdyB0ZXN0IHNvbWUgbW9yZSBjb25maWd1cmF0aW9ucy4gICovCisKKy8qIFVzaW5nIGEg Pj0xIGNvbmRpdGlvbi4gICovCit2b2lkIHRlc3QxIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBp bnQzMl90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPj0gMSkKKyAgICB7CisgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pf czMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7Cisg ICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwKTsKKyAgICAgIHZzdHJ3 cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYys9NDsKKyAgICAgIGErPTQ7CisgICAgICBiKz00 OworICAgICAgbi09NDsKKyAgICB9Cit9CisKKy8qIFRlc3QgYSBmb3IgbG9vcCBmb3JtYXQgb2Yg ZGVjcmVtZW50aW5nIHRvIHplcm8gKi8KK2ludDMyX3QgYVtdID0gezAsIDEsIDIsIDMsIDQsIDUs IDYsIDd9Owordm9pZCB0ZXN0MiAoaW50MzJfdCAqYiwgaW50IG51bV9lbGVtcykKK3sKKyAgICBm b3IgKGludCBpID0gbnVtX2VsZW1zOyBpID4gMDsgaS09IDQpCisgICAgeworICAgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHAzMnEgKGkpOworICAgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ff el9zMzIgKCYoYVtpXSksIHApOworICAgICAgICB2c3Ryd3FfcF9zMzIgKGIgKyBpLCB2YSwgcCk7 CisgICAgfQorfQorCisvKiBJdGVyYXRpb24gY291bnRlciBjb3VudGluZyB1cCB0byBudW1faXRl ci4gICovCit2b2lkIHRlc3QzICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBp bnQgbikKK3sKKyAgICBpbnQgbnVtX2l0ZXIgPSAobiArIDE1KS8xNjsKKyAgICBmb3IgKGludCBp ID0gMDsgaSA8IG51bV9pdGVyOyBpKyspCisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9 IHZjdHA4cSAobik7CisgICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7 CisgICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgIHVp bnQ4eDE2X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgICB2c3RyYnFfcF91 OCAoYywgdmMsIHApOworICAgICAgICBuLT0xNjsKKyAgICB9Cit9CisKKy8qIFVzaW5nIGFuIHVu cHJlZGljYXRlZCBhcml0aG1ldGljIGluc3RydWN0aW9uIHdpdGhpbiB0aGUgbG9vcC4gICovCit2 b2lkIHRlc3Q0ICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCAgdWludDhfdCAq ZCwgaW50IG4pCit7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQx Nl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTgg KGEsIHApOworICAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3U4IChiKTsKKwkvKiBJcyBh ZmZlY3RlZCBieSBpbXBsaWNpdCBwcmVkaWNhdGlvbiwgYmVjYXVzZSB2YiBhbHNvCisJY2FtZSBm cm9tIGFuIHVucHJlZGljYXRlZCBsb2FkLCBidXQgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbAorCXBy b2JsZW0sIGJlY2F1c2UgdGhlIHJlc3VsdCBpcyB1c2VkIGluIGEgcHJlZGljYXRlZCBzdG9yZS4g ICovIAorICAgICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfdTggKHZhLCB2Yik7CisgICAgICAg IHVpbnQ4eDE2X3QgdmQgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgICB2c3RyYnFf cF91OCAoYywgdmMsIHApOworICAgICAgICB2c3RyYnFfcF91OCAoZCwgdmQsIHApOworICAgICAg ICBuLT0xNjsKKyAgICB9Cit9CisKKy8qIFVzaW5nIGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBmb3Ig b25lIGluc3RydWN0aW9uIGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDUgKGludDMyX3QgKmEs IGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuLCBtdmVfcHJlZDE2X3QgcDEpCit7CisgIHdo aWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOwor ICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRf dCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFf eF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAg IGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAg ICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGFub3RoZXIgVlBSIHZhbHVlIGluIHRo ZSBsb29wLCB3aXRoIGEgdmN0cC4KKyAgIFRoZSBkb2xvb3AgbG9naWMgd2lsbCBhbHdheXMgdHJ5 IHRvIGRvIHRoZSB0cmFuc2Zvcm0gb24gdGhlIGZpcnN0CisgICB2Y3RwIGl0IGVuY291bnRlcnMs IHNvIHRoaXMgaXMgc3RpbGwgZXhwZWN0ZWQgdG8gd29yay4gICovCit2b2lkIHRlc3Q2IChpbnQz Ml90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgaW50IGcpCit7CisgIHdoaWxl IChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAg ICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIG12ZV9wcmVkMTZf dCBwMSA9IHZjdHAzMnEgKGcpOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChi LCBwMSk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwKTsKKyAg ICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0 OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyogR2VuZXJhdGlu ZyBhbmQgdXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29wLCB3aXRoIGEgdmN0 cCwKKyAgIGJ1dCB0aGlzIHRpbWUgdGhlIHAxIHdpbGwgYWxzbyBjaGFuY2UgaW4gZXZlcnkgbG9v cCAoc3RpbGwgZmluZSkgICovCit2b2lkIHRlc3Q3IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBp bnQzMl90ICpjLCBpbnQgbiwgaW50IGcpCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAg ICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxk cndxX3pfczMyIChhLCBwKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjdHAzMnEgKGcpOwor ICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwMSk7CisgICAgICBpbnQzMng0 X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywg dmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAg ICAgbiAtPSA0OworICAgICAgZysrOworICAgIH0KK30KKworLyogR2VuZXJhdGluZyBhbmQgdXNp bmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29wLCB3aXRoIGEgdmN0cF9tCisgICB0 aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBsb29wIHZjdHAgVlBSLiAgKi8KK3ZvaWQgdGVzdDgg KGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuLCBtdmVfcHJlZDE2X3Qg cDEpCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZj dHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAg ICAgIG12ZV9wcmVkMTZfdCBwMiA9IHZjdHAzMnFfbSAobiwgcDEpOworICAgICAgaW50MzJ4NF90 IHZiID0gdmxkcndxX3pfczMyIChiLCBwMSk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94 X3MzMiAodmEsIHZiLCBwMik7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAg IGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAg ICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBp biB0aGUgbG9vcCwKKyAgIHdpdGggYSB2Y3RwX20gdGhhdCBpcyB0aWVkIHRvIHRoZSBiYXNlIHZj dHAgVlBSLiAgVGhpcworICAgaXMgc3RpbGwgZmluZSwgYmVjYXVzZSB0aGUgdmN0cF9tIHdpbGwg YmUgdHJhbnNmb3JtZWQKKyAgIGludG8gYSB2Y3RwIGFuZCBiZSBpbXBsaWNpdGx5IHByZWRpY2F0 ZWQuICAqLwordm9pZCB0ZXN0OSAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywg aW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9 IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsK KyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjdHAzMnFfbSAobiwgcCk7CisgICAgICBpbnQzMng0 X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRx X3hfczMyICh2YSwgdmIsIHAxKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAg ICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0Owor ICAgIH0KK30KKworLyogR2VuZXJhdGluZyBhbmQgdXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVl IGluIHRoZSBsb29wLCB3aXRoIGEgdmNtcC4gICovCit2b2lkIHRlc3QxMCAoaW50MzJfdCAqYSwg aW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7 CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZh ID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3Mz MiAoYiwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y21wZXFxX3MzMiAodmEsIHZiKTsK KyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHAxKTsKKyAgICAgIHZz dHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAg ICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyogR2VuZXJhdGluZyBhbmQg dXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29wLCB3aXRoIGEgdmNtcF9tLiAg Ki8KK3ZvaWQgdGVzdDExIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQg biwgbXZlX3ByZWQxNl90IHAxKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96 X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOwor ICAgICAgbXZlX3ByZWQxNl90IHAyID0gdmNtcGVxcV9tX3MzMiAodmEsIHZiLCBwMSk7CisgICAg ICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwMik7CisgICAgICB2c3Ryd3Ff cF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIg Kz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5n IGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjbXBfbSAKKyAgIHRo YXQgaXMgdGllZCB0byB0aGUgYmFzZSB2Y3RwIFZQUiAoc2FtZSBhcyBhYm92ZSwgdGhpcyB3aWxs IGJlIHR1cm5lZAorICAgaW50byBhIHZjbXAgYW5kIGJlIGltcGxpY2l0bHkgcHJlZGljYXRlZCku ICAqLwordm9pZCB0ZXN0MTIgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGlu dCBuLCBtdmVfcHJlZDE2X3QgcDEpCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBt dmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndx X3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7 CisgICAgICBtdmVfcHJlZDE2X3QgcDIgPSB2Y21wZXFxX21fczMyICh2YSwgdmIsIHApOworICAg ICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcDIpOworICAgICAgdnN0cndx X3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBi ICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0 ZWQgb3Agd2l0aCBhIHNjYWxhciBvdXRwdXQsIHdoZXJlIHRoZSByZXN1bHQgaXMgdmFsaWQKKyAg IG91dHNpZGUgdGhlIGJiLiAgVGhpcyBpcyB2YWxpZCwgYmVjYXVzZSBhbGwgdGhlIGlucHV0cyB0 byB0aGUgdW5wcmVkaWNhdGVkCisgICBvcCBhcmUgY29ycmVjdGx5IHByZWRpY2F0ZWQuICAqLwor dWludDhfdCB0ZXN0MTMgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBu LCB1aW50OHgxNl90IHZ4KQoreworICAgIHVpbnQ4X3Qgc3VtID0gMDsKKyAgICB3aGlsZSAobiA+ IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1 aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIg PSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX21fdTgg KHZ4LCB2YSwgdmIsIHApOworICAgICAgIHN1bSArPSB2YWRkdnFfdTggKHZjKTsKKyAgICAgICBh ICs9IDE2OworICAgICAgIGIgKz0gMTY7CisgICAgICAgbiAtPSAxNjsKKyAgICB9CisgICAgcmV0 dXJuIHN1bTsKK30KKworLyogU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW5vdGhlciBzY2FsYXIg b3AgYmV0d2VlbiB0aGUgdW5wcmVkaWNhdGVkIG9wIGFuZAorICAgdGhlIHNjYWxhciBvcCBvdXRz aWRlIHRoZSBsb29wLiAgKi8KK3VpbnQ4X3QgdGVzdDE0ICh1aW50OF90ICphLCB1aW50OF90ICpi LCB1aW50OF90ICpjLCBpbnQgbiwgdWludDh4MTZfdCB2eCwgaW50IGcpCit7CisgICAgdWludDhf dCBzdW0gPSAwOworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgbXZlX3ByZWQxNl90 IHAgPSB2Y3RwOHEgKG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwg cCk7CisgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsKKyAgICAgICB1 aW50OHgxNl90IHZjID0gdmFkZHFfbV91OCAodngsIHZhLCB2YiwgcCk7CisgICAgICAgc3VtICs9 IHZhZGR2cV91OCAodmMpOworICAgICAgIHN1bSArPSBnOworICAgICAgIGEgKz0gMTY7CisgICAg ICAgYiArPSAxNjsKKyAgICAgICBuIC09IDE2OworICAgIH0KKyAgICByZXR1cm4gc3VtOworfQor CisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQgdmNtcCB0byBnZW5lcmF0ZSBhIG5ldyBwcmVkaWNh dGUgdmFsdWUgaW4gdGhlCisgICBsb29wIGFuZCB0aGVuIHVzaW5nIGl0IGluIGEgcHJlZGljYXRl ZCBzdG9yZSBpbnNuLiAgKi8KK3ZvaWQgdGVzdDE1IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBp bnQzMng0X3QgdmMsIGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAg eworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2 YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3FfczMy IChiKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAg ICAgbXZlX3ByZWQxNl90IHAxID0gdmNtcGVxcV9zMzIgKHZhLCB2Yyk7CisgICAgICB2c3Ryd3Ff cF9zMzIgKGMsIHZjLCBwMSk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBi ICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhIHByZWRpY2F0ZWQg dmNtcCB0byBnZW5lcmF0ZSBhIG5ldyBwcmVkaWNhdGUgdmFsdWUgaW4gdGhlCisgICBsb29wIGFu ZCB0aGVuIHVzaW5nIGl0IGluIGEgcHJlZGljYXRlZCBzdG9yZSBpbnNuLiAgKi8KK3ZvaWQgdGVz dDE2IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMng0X3QgdmMsIGludDMyX3QgKmMsIGlu dCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2 Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7Cisg ICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgaW50MzJ4NF90 IHZjID0gdmFkZHFfczMyICh2YSwgdmIpOworICAgICAgbXZlX3ByZWQxNl90IHAxID0gdmNtcGVx cV9tX3MzMiAodmEsIHZjLCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHAxKTsKKyAg ICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsK KyAgICB9Cit9CisKKy8qIFRoZSBmaW5hbCBudW1iZXIgb2YgRExTVFBzIGN1cnJlbnRseSBpcyBj YWxjdWxhdGVkIGJ5IHRoZSBudW1iZXIgb2YKKyAgYFRFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRC SVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZLipgIG1hY3JvcyAqIDYgKyAxNi4gICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0ZGxzdHB9IDE2MCB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwfSAxNjAgfSB9ICovCmRp ZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQxNng4 LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQxNng4LmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjBjZGZmYjMxMmIzCi0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MTZ4 OC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0qLSog fSB9IH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVf b2sgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8qIHsgZGct YWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+Cisj aW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICIuLi9sb2Iu aCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50MTZfdCAqYSwg aW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7 CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAgaW50MTZ4OF90IHZh ID0gdmxkcmhxX3pfczE2IChhLCBwKTsKKyAgICAgIGludDE2eDhfdCB2YiA9IHZsZHJocV96X3Mx NiAoYiwgcCk7CisgICAgICBpbnQxNng4X3QgdmMgPSB2YWRkcV94X3MxNiAodmEsIHZiLCBwKTsK KyAgICAgIHZzdHJocV9wX3MxNiAoYywgdmMsIHApOworICAgICAgYys9ODsKKyAgICAgIGErPTg7 CisgICAgICBiKz04OworICAgICAgbi09ODsKKyAgICB9Cit9CisKK2ludCBtYWluICgpCit7Cisg IGludCBpOworICBpbnQxNl90IHRlbXAxW05dOworICBpbnQxNl90IHRlbXAyW05dOworICBpbnQx Nl90IHRlbXAzW05dOworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOwor ICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwg dGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKyAgY2hlY2tfcGx1czE2ICh0 ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3KTsKKyAgY2hlY2tfcGx1 czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKyAgY2hl Y2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKworICByZXNldF9kYXRhMTYgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsK KyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsKKworICByZXNldF9kYXRh MTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCAxNik7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMTYpOworCisgIHJl c2V0X2RhdGExNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNyk7 CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKK30KKworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGRsc3RwLjE2fSAxIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uN2ZmNzg5ZDc2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQzMng0LmMKQEAgLTAsMCArMSw2OCBAQAor LyogeyBkZy1kbyBydW4geyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1f bXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL2xvYi5oIgorCit2b2lkICBfX2F0dHJpYnV0 ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpj LCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHAp OworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMy eDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChj LCB2YywgcCk7CisgICAgICBjKz00OworICAgICAgYSs9NDsKKyAgICAgIGIrPTQ7CisgICAgICBu LT00OworICAgIH0KK30KKworaW50IG1haW4gKCkKK3sKKyAgaW50IGk7CisgIGludDMyX3QgdGVt cDFbTl07CisgIGludDMyX3QgdGVtcDJbTl07CisgIGludDMyX3QgdGVtcDNbTl07CisgIHJlc2V0 X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIDApOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOworCisg IHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIDEpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDEp OworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIDMpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIDMpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDQpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIDQpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7 CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDUpOworICBjaGVja19wbHVzMzIgKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDUpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1w MywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDgpOworICBjaGVja19wbHVzMzIg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDgpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAy LCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDkpOworICBjaGVja19w bHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDkpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEs IHRlbXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10 aW1lcyB7XHRkbHN0cC4zMn0gMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci10aW1lcyB7XHRsZXRwfSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiXHR2Y3RwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3Qg Ilx0dnBzdCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIg fSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0 cC1pbnQ2NHgyLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ2 NHgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjgwNjViZDAyNDY5 Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxz dHAtaW50NjR4Mi5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsg YXJtKi0qLSogfSB9IH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92 OF8xbV9tdmVfb2sgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMiIH0gKi8K Ky8qIHsgZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1f bXZlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRl ICIuLi9sb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50 NjRfdCAqYSwgaW50NjRfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7Cisg ICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA2NHEgKG4pOworICAgICAgaW50NjR4Ml90IHZhID0g dmxkcmRxX2dhdGhlcl9vZmZzZXRfel9zNjQgKGEsIHZjcmVhdGVxX3U2NCAoMCwgOCksIHApOwor ICAgICAgdnN0cmRxX3NjYXR0ZXJfb2Zmc2V0X3BfczY0IChjLCB2Y3JlYXRlcV91NjQgKDAsIDgp LCB2YSwgcCk7CisgICAgICBjKz0yOworICAgICAgYSs9MjsKKyAgICAgIG4tPTI7CisgICAgfQor fQorCitpbnQgbWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50NjRfdCB0ZW1wMVtOXTsKKyAgaW50 NjRfdCB0ZW1wM1tOXTsKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVz dCAodGVtcDEsIHRlbXAzLCAwKTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMCk7 CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRl bXAzLCAxKTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMSk7CisKKyAgcmVzZXRf ZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAyKTsKKyAg Y2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMik7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVt cDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAzKTsKKyAgY2hlY2tfbWVtY3B5 NjQgKHRlbXAxLCB0ZW1wMywgMyk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBO KTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCA0KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0 ZW1wMywgNCk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAo dGVtcDEsIHRlbXAzLCA1KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNSk7CisK KyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAz LCA2KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNik7CisKKyAgcmVzZXRfZGF0 YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCA3KTsKKyAgY2hl Y2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNyk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEs IHRlbXAzLCBOKTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtc dGRsc3RwLjY0fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVz IHtcdGxldHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJc dHZjdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0 IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8K ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4 MTYuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4MTYuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNTUyNzgxMDAxZTkKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ4 eDE2LmMKQEAgLTAsMCArMSw2OCBAQAorLyogeyBkZy1kbyBydW4geyB0YXJnZXQgeyBhcm0qLSot KiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212 ZV9vayB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBk Zy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4K KyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL2xv Yi5oIgorCit2b2lkICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChpbnQ4X3QgKmEs IGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsK KyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgIGludDh4MTZfdCB2YSA9 IHZsZHJicV96X3M4IChhLCBwKTsKKyAgICAgIGludDh4MTZfdCB2YiA9IHZsZHJicV96X3M4IChi LCBwKTsKKyAgICAgIGludDh4MTZfdCB2YyA9IHZhZGRxX3hfczggKHZhLCB2YiwgcCk7CisgICAg ICB2c3RyYnFfcF9zOCAoYywgdmMsIHApOworICAgICAgYys9MTY7CisgICAgICBhKz0xNjsKKyAg ICAgIGIrPTE2OworICAgICAgbi09MTY7CisgICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBp bnQgaTsKKyAgaW50OF90IHRlbXAxW05dOworICBpbnQ4X3QgdGVtcDJbTl07CisgIGludDhfdCB0 ZW1wM1tOXTsKKyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0 ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIDApOworCisgIHJlc2V0X2RhdGE4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAg dGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMSk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7 CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE1KTsKKyAgY2hlY2tfcGx1czggKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDE1KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1w MywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2KTsKKyAgY2hlY2tfcGx1czgg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAy LCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tf cGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKworICByZXNldF9kYXRhOCAodGVtcDEs IHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKyAg Y2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKworICByZXNldF9kYXRhOCAo dGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMz KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMzKTsKKworICByZXNldF9k YXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlci10aW1lcyB7XHRkbHN0cC44fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3QgInAwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h cm0vbXZlL2Rsc3RwLWludmFsaWQtYXNtLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJt L212ZS9kbHN0cC1pbnZhbGlkLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwLi43MGUzNzRkY2U4MQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludmFsaWQtYXNtLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8q IHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJl cXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8zIC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8x bV9tdmUgfSAqLworCisjaW5jbHVkZSA8YXJtX212ZS5oPgorCisvKiBUZXJtaW5hdGluZyBvbiBh IG5vbi16ZXJvIG51bWJlciBvZiBlbGVtZW50cy4gICovCit2b2lkIHRlc3QwICh1aW50OF90ICph LCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbikKK3sKKyAgICB3aGlsZSAobiA+IDEpCisg ICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgx Nl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRy YnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2 YiwgcCk7CisgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2Owor ICAgIH0KK30KKworLyogVGVybWluYXRpbmcgb24gbiA+PSAwLiAgKi8KK3ZvaWQgdGVzdDEgKHVp bnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuKQoreworICAgIHdoaWxlIChu ID49IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAg ICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3Qg dmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hf dTggKHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICBu IC09IDE2OworICAgIH0KK30KKworLyogU2ltaWxhciwgdGVybWluYXRpbmcgb24gYSBub24temVy byBudW1iZXIgb2YgZWxlbWVudHMsIGJ1dCBpbiBhIGZvciBsb29wCisgICBmb3JtYXQuICAqLwor aW50MzJfdCBhW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgN307Cit2b2lkIHRlc3QyIChpbnQz Ml90ICpiLCBpbnQgbnVtX2VsZW1zKQoreworICAgIGZvciAoaW50IGkgPSBudW1fZWxlbXM7IGkg Pj0gMjsgaS09IDQpCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAoaSk7 CisgICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyICgmKGFbaV0pLCBwKTsKKyAgICAg ICB2c3Ryd3FfcF9zMzIgKGIgKyBpLCB2YSwgcCk7CisgICAgfQorfQorCisvKiBJdGVyYXRpb24g Y291bnRlciBjb3VudGluZyB1cCB0byBudW1faXRlciwgd2l0aCBhIG5vbi16ZXJvIHN0YXJ0aW5n IG51bS4gICovCit2b2lkIHRlc3QzICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpj LCBpbnQgbikKK3sKKyAgICBpbnQgbnVtX2l0ZXIgPSAobiArIDE1KS8xNjsKKyAgICBmb3IgKGlu dCBpID0gMTsgaSA8IG51bV9pdGVyOyBpKyspCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHAp OworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWlu dDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3BfdTgg KGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKworLyogSXRlcmF0aW9uIGNv dW50ZXIgY291bnRpbmcgdXAgdG8gbnVtX2l0ZXIsIHdpdGggYSBsYXJnZXIgaW5jcmVtZW50ICAq Lwordm9pZCB0ZXN0NCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4p Cit7CisgICAgaW50IG51bV9pdGVyID0gKG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCBudW1faXRlcjsgaSs9MikKKyAgICB7CisgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw OHEgKG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAg ICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsKKyAgICAgICB1aW50OHgxNl90 IHZjID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICB2c3RyYnFfcF91OCAoYywgdmMs IHApOworICAgICAgIG4gLT0gMTY7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0 ZWQgc3RvcmUgaW5zdHJ1Y3Rpb24gd2l0aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDUgKHVp bnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsICB1aW50OF90ICpkLCBpbnQgbikKK3sK KyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhx IChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAg IHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2 YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgIHVpbnQ4eDE2X3QgdmQgPSB2YWRkcV94X3U4 ICh2YSwgdmIsIHApOworICAgICAgIHZzdHJicV91OCAoZCwgdmQpOworICAgICAgIG4gLT0gMTY7 CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQgc3RvcmUgb3V0c2lkZSB0aGUg bG9vcC4gICovCit2b2lkIHRlc3Q2ICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpj LCBpbnQgbiwgdWludDh4MTZfdCB2eCkKK3sKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAg ICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0g dmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAo YiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX21fdTggKHZ4LCB2YSwgdmIsIHAp OworICAgICAgIHZ4ID0gdmFkZHFfdTggKHZ4LCB2Yyk7CisgICAgICAgYSArPSAxNjsKKyAgICAg ICBiICs9IDE2OworICAgICAgIG4gLT0gMTY7CisgICAgfQorICAgIHZzdHJicV91OCAoYywgdngp OworfQorCisvKiBVc2luZyBhIFZQUiB0aGF0IGdldHMgbW9kaWZpZWQgd2l0aGluIHRoZSBsb29w LiAgKi8KK3ZvaWQgdGVzdDkgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGlu dCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2 Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7Cisg ICAgICBwKys7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAg ICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3Ff cF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIg Kz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVzaW5nIGEgVlBSIHRoYXQgZ2V0 cyByZS1nZW5lcmF0ZWQgd2l0aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDEwIChpbnQzMl90 ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwMzJxIChuKTsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIGludDMyeDRfdCB2 YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBwID0gdmN0cDMycSAobik7CisgICAgICBp bnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0g dmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsK KyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0g NDsKKyAgICB9Cit9CisKKy8qIFVzaW5nIHZjdHAzMnFfbSBpbnN0ZWFkIG9mIHZjdHAzMnEuICAq Lwordm9pZCB0ZXN0MTEgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBu LCBtdmVfcHJlZDE2X3QgcDApCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHAzMnFfbSAobiwgcDApOworICAgICAgaW50MzJ4NF90IHZhID0gdmxk cndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwg cCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwKTsKKyAgICAg IHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0Owor ICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyogVXNpbmcgYW4gdW5w cmVkaWNhdGVkIG9wIHdpdGggYSBzY2FsYXIgb3V0cHV0LCB3aGVyZSB0aGUgcmVzdWx0IGlzIHZh bGlkCisgICBvdXRzaWRlIHRoZSBiYi4gIFRoaXMgaXMgaW52YWxpZCwgYmVjYXVzZSBvbmUgb2Yg dGhlIGlucHV0cyB0byB0aGUKKyAgIHVucHJlZGljYXRlZCBvcCBpcyBhbHNvIHVucHJlZGljYXRl ZC4gICovCit1aW50OF90IHRlc3QxMiAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAq YywgaW50IG4sIHVpbnQ4eDE2X3QgdngpCit7CisgICAgdWludDhfdCBzdW0gPSAwOworICAgIHdo aWxlIChuID4gMCkKKyAgICB7CisgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOwor ICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAgdWludDh4 MTZfdCB2YiA9IHZsZHJicV91OCAoYik7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3U4 ICh2YSwgdmIpOworICAgICAgIHN1bSArPSB2YWRkdnFfdTggKHZjKTsKKyAgICAgICBhICs9IDE2 OworICAgICAgIGIgKz0gMTY7CisgICAgICAgbiAtPSAxNjsKKyAgICB9CisgICAgcmV0dXJuIHN1 bTsKK30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIHZjbXAgdG8gZ2VuZXJhdGUgYSBuZXcg cHJlZGljYXRlIHZhbHVlIGluIHRoZQorICAgbG9vcCBhbmQgdGhlbiB1c2luZyB0aGF0IFZQUiB0 byBwcmVkaWNhdGUgYSBzdG9yZSBpbnNuLiAgKi8KK3ZvaWQgdGVzdDEzIChpbnQzMl90ICphLCBp bnQzMl90ICpiLCBpbnQzMng0X3QgdmMsIGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAo biA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAg IGludDMyeDRfdCB2YSA9IHZsZHJ3cV9zMzIgKGEpOworICAgICAgaW50MzJ4NF90IHZiID0gdmxk cndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3MzMiAodmEsIHZi KTsKKyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjbXBlcXFfczMyICh2YSwgdmMpOworICAgICAg dnN0cndxX3BfczMyIChjLCB2YywgcDEpOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0Owor ICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci1ub3QgIlx0ZGxzdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLW5vdCAiXHRsZXRwIiB9IH0gKi8K --------------r58WMpLrPU4YXPbz9iFdDacP--