From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2109.outbound.protection.outlook.com [40.107.237.109]) by sourceware.org (Postfix) with ESMTPS id E4854385734B for ; Fri, 18 Aug 2023 14:30:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E4854385734B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=os.amperecomputing.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=os.amperecomputing.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WLKe3dLgUAy8M64QEV8xyXODUv0FncATAS/NMIwnDDcnvDZULWMRiVCy/ibvlhex37uFIQVlzTt1p+v1pQS2rUqqjku/2e6ICXewwv4DSly/UIxuyKE59t0xhc2VmkI/YyfZK4zBdgxV8cr1ckwYjlwIT0q0PXB4b6zs524i9JoV9q6/fevTjqdfvE0268KvSuc+XgErDE7PWjsBalgiEsvrwZn9SxrnvwrtDuwVLKA56MNahtkX/Sv6RbQNhw7uQzt9drMlmtOQKVcMrvakeQ91r11F/EqD9uPSbVkO67uUDF0+6kTu5AlZvS25C6uSJUAD2OiAcTAI5rk1FdNxDw== 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=CMLRInmoOwpO3bb0zwVbiEYiJY2tkCPe7ZLE/tBhKA4=; b=hKVRYZoJ+wXy2rwME6NhvOMESE+gUrEPoCdrAOptZFR7aEkz66NTdmAsE9yr7IxiEFTe5/RXg7omS0xVT6cr3I+KLy00zd78zx1c1suQq+VeHyh4RiWYPhQyRAV1/j13Lx8ZqQ4WlrKGxTCJTDYIVw+xjPL+YTfsQQEASrO8eFtVD47bmGWsQT+PGsoQa/HvYKytK6A+HeNaams8wrjuCPGPpfpKpuEk7LvYUOxphzL8G4OaU/plcKBHx5kpiu8icZe6MfvHP6cgAyf2KImKnfasbPVEcn6AWvX03uS7tZwXA6CErgHrAkXLu8/Be82n8b/bGbhgWUPPpOy0TApCPA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=os.amperecomputing.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CMLRInmoOwpO3bb0zwVbiEYiJY2tkCPe7ZLE/tBhKA4=; b=qNgAXZ0l+wLvqsZbymcPMSbc3Wch9MRW+X5A+v1fb4KGl1AvWcim14wSkuJyDOFySrzZMKvzSkqLHNS+dyZo6sfgT2S5KiowFqZ7ayoR5p4M7g6/1QqI8uvjdH96f1MbZYxn7hV5KfkQdhqyx1tHcqiHmbXN8LhjWR7dq/DZQIQ= Received: from SN6PR01MB4240.prod.exchangelabs.com (2603:10b6:805:ae::22) by BL3PR01MB6899.prod.exchangelabs.com (2603:10b6:208:356::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.20; Fri, 18 Aug 2023 14:30:27 +0000 Received: from SN6PR01MB4240.prod.exchangelabs.com ([fe80::44ff:531:6d29:85a]) by SN6PR01MB4240.prod.exchangelabs.com ([fe80::44ff:531:6d29:85a%7]) with mapi id 15.20.6678.031; Fri, 18 Aug 2023 14:30:27 +0000 From: Di Zhao OS To: "gcc-patches@gcc.gnu.org" CC: Richard Biener Subject: RE: [PATCH v3] tree-optimization/110279- Check for nested FMA in reassoc Thread-Topic: [PATCH v3] tree-optimization/110279- Check for nested FMA in reassoc Thread-Index: AdnK2M+1i5oWBmCvSFqFs8Xs+fzYpQHB2MGg Date: Fri, 18 Aug 2023 14:30:27 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: zh-CN X-MS-Has-Attach: yes X-MS-TNEF-Correlator: msip_labels: MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_ActionId=96993eca-e234-44ce-bc62-4831e4fd5c18;MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_ContentBits=0;MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_Enabled=true;MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_Method=Standard;MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_Name=Confidential (Default);MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_SetDate=2023-08-09T15:46:49Z;MSIP_Label_5b82cb1d-c2e0-4643-920a-bbe7b2d7cc47_SiteId=3bc2b170-fd94-476d-b0ce-4229bdc904a7; authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=os.amperecomputing.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SN6PR01MB4240:EE_|BL3PR01MB6899:EE_ x-ms-office365-filtering-correlation-id: 12714837-075c-4d26-7b52-08db9ff7aac7 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: SVdWYVkk6b59A1Z9Sh9RHLYSOw5ahhkSYLYQHAJweyB35vq7ELglxwRnNruQFrVKip3t0fdGEcffV0G9kdLICrxoJbtvT80lWq45OYg7EJ1qS3I6kUgJykRfCG4SFZM1wIxPQWAb950ej1lnzbNbNIO82+bWeFvmepTZrCAy5YIVCsHarOFft6ILlJKoiQLbF/6RxhdpS2w9jiXOwlD0yC66aUEMZbOyVcSkrgGrveitCuuoQALCJ7PtEpxX8yZF2Qstm089idwBJNK3jZTMpuZFJ44kGpYoAGjQFUte1mwcYxC4qNKKvg0dx4BaNlOComsIe34s+a003hev3P0TjddC5TN53s49TDpxP8gcp4UsHOmK0d2tivVbi/2RWleEYH7wj3X8md9xxpJ7MWesVGlPaWv5a0PpHSnvKn9Z3GJD6ptCbHyRKHg7lwHwMZ67jXvyjerYGZN7CW+BPSF1ORorKppVtcHd94BW7DkFhFkohg6aGyCwLAcrHxMizxCv+znJwwhLVSP2fUvVqGmh0OcCz8Lz1JigLuS5mY/ofdq7z4C90LNayJx1uGujHeUCnwDYZuhRsFCtqTPfm1wGmoGismCJUrUfGYlhIafkHEI= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN6PR01MB4240.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(366004)(136003)(346002)(39850400004)(376002)(186009)(1800799009)(451199024)(84970400001)(86362001)(33656002)(122000001)(55016003)(99936003)(66899024)(64756008)(66946007)(6916009)(66446008)(66476007)(316002)(66556008)(478600001)(76116006)(41300700001)(38100700002)(38070700005)(26005)(71200400001)(6506007)(7696005)(9686003)(53546011)(8676002)(52536014)(8936002)(5660300002)(4326008)(2906002)(83380400001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?xogzFHw6Mg0aizCPUYYvNsio8BLp8kwjs3d4a8A1hx277F3iGRse4Hr6vG9z?= =?us-ascii?Q?NU9eRQeRkMDdxivYYorL2fis+9Sp2pCyvrMTg3WNrk7z5BsP1QLT0xLPpEOw?= =?us-ascii?Q?qV8UUb24E9ipCZXENFZ6mpTm2QjT3zLguQaqtltumNw5Lg5H3y1sPKeogPOa?= =?us-ascii?Q?hXenHiU70b7MrDgT8CU8qgzGb3txcUyrLtioNfFujtQwq45l5bpAjZGitfk/?= =?us-ascii?Q?kEack/vT4+u3ofaB1MdrbinNRStiGx1+ZSlSvUpigFzGVXDgqFNfRuSdO/FG?= =?us-ascii?Q?6sUgQMB2PPKauDuorA+0dgCRkM8drbeIc5IxpZcp/jrokxOO0LcwmlCmkuwv?= =?us-ascii?Q?VDBkYr+zQuzyPZQlYhH66pOCNDBPLsEsqA1gdu/EtVb2v+SZ+SvmlgRq2PfH?= =?us-ascii?Q?UzRZzmyeivsKNupmDRMAWi9xjmeai0X5nG7kDGw7WggGHvwWH+fNtxUdTC3E?= =?us-ascii?Q?q075I0CAtJYlm7XGvZpamPAlsngbqCWke0cdea5N3fX3Wkd+p3jwKm4b6JYD?= =?us-ascii?Q?zk588YGCk1hysecVTPajyAUTp0c+HznWhldtz+O3C5XdiZcX+LmdU+t/wgtC?= =?us-ascii?Q?VJCSwRQbScMljcNKUKXqHlNBAgO4P0S0wy2c9sgHssdEl7JxMhN4Rgyp3tOV?= =?us-ascii?Q?B2ra/FjvNmnUqIo1SCuo2BYzocpQr2zCNyp4x+NSR43Aw9zVT4elZC3dyb8d?= =?us-ascii?Q?5YX+ToLDO3xDQcOx+r4Oc7QxaMIbWcDIk0HBA5VqqMxiUm3AeCxfiT/AZcEI?= =?us-ascii?Q?jlMdfHkvmULwcElzHnl4qgUJfipDL8CU0WGeQ7IBQ2CL2hSZq1c6I2F/xCsD?= =?us-ascii?Q?wkx5CRkJL1jG4AIpXrHflJiO3Z6wiziuaE2I0/PsPqzPsGWCEpdgaTeQgp3b?= =?us-ascii?Q?k/5WAaffFnxz7kmOQTb/aZm5X0zrR2Zuq5FnUQJQeK7JMJ6jKVQxu10323Ua?= =?us-ascii?Q?2lWj19NIN+QgBXM5ZiRIwmLhhVBVKZaJh/xkelWC6ABSsDlkrzibPtKG+B4u?= =?us-ascii?Q?rMbiufjI19PVFlOPK5q+o1qCYaDWmknnEpFg6Wfmxj6fx5c7qjK6ex6RF7VZ?= =?us-ascii?Q?hKQBt12IW2z95o1jPvcUzeidCuPt0w7leZPvRGNorWv5NwMdnxqSA4eiZ66L?= =?us-ascii?Q?LfVDv8b7XB/MtnDaJE9vUE+BRQZQ1S4PsjbeqfXomZaanKWw8Y5dpkpyBwXY?= =?us-ascii?Q?/uUIVBAlLMBV/8Jmf3zo4Kqyt4Nq+01MH+PXNDV2PZvYeXTvdDiWk8kqybm8?= =?us-ascii?Q?KluYvpc3WvLhv55wPM2P/tgtarFGUSsICi2+hGig7zWcJgFJ9oV3tkYrxQLu?= =?us-ascii?Q?N03YEmBwhvYz4FXBotRyrtiQDOTfGY7a1nSo2YN0WMsYS5F83Y/pnXIFcnaK?= =?us-ascii?Q?3doMoi7oroaHYr8TNathTqUQ5e1MUnNpTw9NHu7nsXyMddxbQMMp+MdUoC6W?= =?us-ascii?Q?52GNcRhLsJujknJqwzFJQZ4WMq5CeFXbSin+F4PG9SIuYTjNTe5Z85rJjznP?= =?us-ascii?Q?JDwSvyQpXyJ6uSibrmzPNUn635xqR4FCB1GTEgtwyccr4xOkrcalUVm8jifL?= =?us-ascii?Q?RmUwqkGKMbinPbgcRi2oa7FZztdjBsWZNIqjoyb1+heZTGci66MF4DCm2vZ7?= =?us-ascii?Q?FA=3D=3D?= Content-Type: multipart/mixed; boundary="_002_SN6PR01MB424027B98B421FDB99448D29E81BASN6PR01MB4240prod_" MIME-Version: 1.0 X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR01MB4240.prod.exchangelabs.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12714837-075c-4d26-7b52-08db9ff7aac7 X-MS-Exchange-CrossTenant-originalarrivaltime: 18 Aug 2023 14:30:27.3603 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Jee23yYB0iTkGpABP+dxF7rUjSmugys+f6V6vYLP7si7ky6/GpsjRlF1Qrq19JhBejpDWzCxOFwpCxAWsFmBBYId8QUBrjJs8bi2FAThOxbcA5LSBEu7CWC12IMJrkL8 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR01MB6899 X-Spam-Status: No, score=-3.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS,TXREP 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: --_002_SN6PR01MB424027B98B421FDB99448D29E81BASN6PR01MB4240prod_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, A few updates to the patch: 1. rank_ops_for_fma: return FMA_STATE_NESTED only for complete FMA chain, since the regression is obvious only in this case. 2. Added new testcase. Thanks, Di Zhao ---- PR tree-optimization/110279 gcc/ChangeLog: * tree-ssa-math-opts.cc (convert_mult_to_fma_1): Added new parameter collect_lhs. (struct fma_transformation_info): Moved to header. (class fma_deferring_state): Moved to header. (convert_mult_to_fma): Added new parameter collect_lhs. * tree-ssa-math-opts.h (struct fma_transformation_info): (class fma_deferring_state): Moved from .cc. (convert_mult_to_fma): Moved from .cc. * tree-ssa-reassoc.cc (enum fma_state): Defined enum to describe the state of FMA candidates for a list of operands. (rewrite_expr_tree_parallel): Changed boolean parameter to enum type. (has_nested_fma_p): New function to check for nested FMA on given multiplication statement. (rank_ops_for_fma): Return enum fma_state. (reassociate_bb): Avoid rewriting to parallel if nested FMAs are found. gcc/testsuite/ChangeLog: * gcc.dg/pr110279-1.c: New test. * gcc.dg/pr110279-2.c: New test. * gcc.dg/pr110279-3.c: New test. > -----Original Message----- > From: Di Zhao OS > Sent: Thursday, August 10, 2023 12:53 AM > To: gcc-patches@gcc.gnu.org > Cc: Richard Biener > Subject: [PATCH v3] tree-optimization/110279- Check for nested FMA in rea= ssoc >=20 > Hi, >=20 > The previous version of this patch tries to solve two problems > at the same time. For better clarity, I'll separate them and > only deal with the "nested" FMA in this version. I plan to > propose another patch in avoiding bad shaped FMA (deferring FMA). >=20 > Other changes: >=20 > 1. Added new testcases for the "nested" FMA issue. For the > following code: >=20 > tmp1 =3D a + c * c + d * d + x * y; > tmp2 =3D x * tmp1; > result +=3D (a + c + d + tmp2); >=20 > , when "tmp1 =3D ..." is not rewritten, tmp1 will be result of > an FMA, and there will be a list of consecutive FMAs: >=20 > _1 =3D .FMA (c, c, a_39); > _2 =3D .FMA (d, d, _1); > tmp1 =3D .FMA (x, y, _2); > _3 =3D .FMA (tmp1, x, d); > ... >=20 > If "tmp1 =3D ..." is rewritten to parallel, tmp1 will be result > of a PLUS_EXPR between FMAs: >=20 > _1 =3D .FMA (c, c, a_39); > _2 =3D x * y; > _3 =3D .FMA (d, d, _2); > tmp1 =3D _3 + _1; > _4 =3D .FMA (tmp1, x, d); > ... >=20 > It seems the register pressure of the latter is higher than > the former. On the test machines we have (including Ampere1, > Neoverse-n1 and Intel Xeon), with "tmp1 =3D ..." is rewritten to > parallel, the run time all increased significantly. In > contrast, when "tmp1" is not the 1st or 2nd operand of another > FMA (pr110279-1.c), rewriting it results in better performance. > (I'll also append the testcases in the bug tracker.) >=20 > 2. Enhanced checking for nested FMA by: 1) Modified > convert_mult_to_fma so it can return multiple LHS. 2) Check > NEGATE_EXPRs for nested FMA. >=20 > (I think maybe this can be further refined by enabling rewriting > to parallel for very long op list. ) >=20 > Bootstrapped and regression tested on x86_64-linux-gnu. >=20 > Thanks, > Di Zhao --_002_SN6PR01MB424027B98B421FDB99448D29E81BASN6PR01MB4240prod_ Content-Type: application/octet-stream; name="0001-PATCH-tree-optimization-110279-Check-for-nested-FMA-.patch" Content-Description: 0001-PATCH-tree-optimization-110279-Check-for-nested-FMA-.patch Content-Disposition: attachment; filename="0001-PATCH-tree-optimization-110279-Check-for-nested-FMA-.patch"; size=20792; creation-date="Fri, 18 Aug 2023 14:30:05 GMT"; modification-date="Fri, 18 Aug 2023 14:30:26 GMT" Content-Transfer-Encoding: base64 RnJvbSA5MTY4YjkwNWY1MTYzNDkyNDM0YTc1NjI5OGFkZWZmNWRmZDE4NjRmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiRGkgWmhhbyBPUyIgPGRpemhhb0Bvcy5hbXBlcmVjb21wdXRp bmcuY29tPgpEYXRlOiBUdWUsIDggQXVnIDIwMjMgMjA6MjA6MzQgKzA4MDAKU3ViamVjdDogW1BB VENIXSB0cmVlLW9wdGltaXphdGlvbi8xMTAyNzk6IENoZWNrIGZvciBuZXN0ZWQgRk1BIGluIHJl YXNzb2MKClJldXNlZCBjb2RlIGluIHBhc3Mgd2lkZW5pbmdfbXVsIHRvIGNoZWNrIGZvciBuZXN0 ZWQgRk1BcwooTEhTIG9mIGFuIGV4cHJlc3Npb24gdHJlZSBpcyB0aGUgMXN0IG9yIDJuZCBvcGVy YW5kIG9mCmFub3RoZXIgRk1BKSwgc2luY2UgcmUtd3JpdGluZyBpdCB0byBwYXJhbGxlbCBnZW5l cmF0ZXMKd29yc2UgY29kZXMuCgpXaXRoIG9wdGlvbiAiLWZ1bnJvbGwtbG9vcHMgLU9mYXN0IC0t cGFyYW0gdHJlZS1yZWFzc29jLXdpZHRoPTQiLAp0aGUgaW1wcm92ZW1lbnRzIGluIHNwZWMyMDE3 IDUwOC5uYW1kX3IgMS1jb3B5IHJ1biBhcmU6CgpBbXBlcmUxOiAgICAgICAgICA0LjUlCkludGVs IFhlb246ICAgICAgIDEuOCUKTmVvdmVyc2UtbjE6ICAgICAgMi4zJQotLS0KIGdjYy90ZXN0c3Vp dGUvZ2NjLmRnL3ByMTEwMjc5LTEuYyB8ICA1MCArKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUv Z2NjLmRnL3ByMTEwMjc5LTIuYyB8ICA0OSArKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2Nj LmRnL3ByMTEwMjc5LTMuYyB8ICA0NCArKysrKysrKysrKwogZ2NjL3RyZWUtc3NhLW1hdGgtb3B0 cy5jYyAgICAgICAgIHwgIDg1ICsrKysrKystLS0tLS0tLS0tLS0tLQogZ2NjL3RyZWUtc3NhLW1h dGgtb3B0cy5oICAgICAgICAgIHwgIDU0ICsrKysrKysrKysrKysKIGdjYy90cmVlLXNzYS1yZWFz c29jLmNjICAgICAgICAgICB8IDEyMSArKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0KIDYg ZmlsZXMgY2hhbmdlZCwgMzMyIGluc2VydGlvbnMoKyksIDcxIGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByMTEwMjc5LTEuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByMTEwMjc5LTIuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByMTEwMjc5LTMuYwoKZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3ByMTEwMjc5LTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3By MTEwMjc5LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYmU2ZmYx ZTA2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjExMDI3OS0x LmMKQEAgLTAsMCArMSw1MCBAQAorLyogUFIgdHJlZS1vcHRpbWl6YXRpb24vMTEwMjc5ICovCisv KiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItT2Zhc3QgLS1wYXJhbSB0 cmVlLXJlYXNzb2Mtd2lkdGg9NCAtZmR1bXAtdHJlZS1yZWFzc29jMi1kZXRhaWxzIiB9ICovCisv KiB7IGRnLWFkZGl0aW9uYWwtb3B0aW9ucyAiLW1mcG1hdGg9c3NlIC1tZm1hIiB7IHRhcmdldCB7 IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9IH0gKi8KKworI2RlZmluZSBMT09QX0NPVU5UIDgwMDAw MDAwMAordHlwZWRlZiBkb3VibGUgZGF0YV9lOworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyog Tm8gbmVzdGVkIEZNQSwgcmUtd3JpdGUgYm90aCB0aGUgdHdvIGxpc3RzLgorCitSdW4gdGltZToK KyAgICAgICAgICAgICBvbmx5IHJld3JpdGUgInJlc3VsdCIgIHJld3JpdGUgYm90aCAicmVzdWx0 IiBhbmQgInRtcCIKK0FtcGVyZTEgICAgICA1Ljg3ICAgICAgICAgICAgICAgICAgIDQuNTMKK25l b3ZlcnNlLW4xICAzLjYxICAgICAgICAgICAgICAgICAgIDIuOTMKK0ludGVsIFhlb24gICA0LjI4 ICAgICAgICAgICAgICAgICAgIDMuMzMKKyovCitfX2F0dHJpYnV0ZV9ub2lubGluZV9fIGRhdGFf ZQorZm9vIChkYXRhX2UgYSwgZGF0YV9lIGIsIGRhdGFfZSBjLCBkYXRhX2UgZCwgZGF0YV9lIHgs IGRhdGFfZSB5KQoreworICBkYXRhX2UgZmFzdGMgPSAwLCB0bXAxOworICBkYXRhX2UgcmVzdWx0 ID0gMDsKKworICBmb3IgKGludCBpYyA9IDA7IGljIDwgTE9PUF9DT1VOVDsgaWMrKykKKyAgICB7 CisgICAgICAvKiBMZW5ndGggb2Ygb3AgbGlzdDogNAorCSBOdW1iZXIgb2YgTVVMVF9FWFBSczog MyAqLworICAgICAgdG1wMSA9IGEgKyBjICogYyAtIGQgKiBkICsgeCAqIHk7CisgICAgICByZXN1 bHQgKz0gYiAqIGMgLSB4ICsgeSAtIDAuMDEgKyB0bXAxOworCisgICAgICBhIC09IDAuMTsKKyAg ICAgIGIgKz0gMC45OworICAgICAgYyAqPSB0bXAxOworICAgICAgZCArPSBhOworICAgICAgeCAq PSAwLjE7CisgICAgICB5ICo9IHk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2lu dAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBwcmludGYgKCIlZlxuIiwgZm9v ICgtMS4wLCAwLjAxLCA5LjgsIDFlMiwgLTEuOSwgMC4yKSk7Cit9CisKKworLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJXaWR0aCA9IDIgd2FzIGNob3NlbiBmb3IgcmVhc3Nv Y2lhdGlvbiIgMiAicmVhc3NvYzIifSB9ICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHIxMTAyNzktMi5jIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvcHIxMTAyNzktMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwLi44NjlhOWI0MTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LmRnL3ByMTEwMjc5LTIuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBQUiB0cmVlLW9wdGltaXphdGlv bi8xMTAyNzkgKi8KKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P ZmFzdCAtLXBhcmFtIHRyZWUtcmVhc3NvYy13aWR0aD00IC1mZHVtcC10cmVlLXJlYXNzb2MyLWRl dGFpbHMiIH0gKi8KKy8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItbWZwbWF0aD1zc2UgLW1m bWEiIHsgdGFyZ2V0IHsgaT84Ni0qLSogeDg2XzY0LSotKiB9IH0gfSAqLworCisjZGVmaW5lIExP T1BfQ09VTlQgODAwMDAwMDAwCit0eXBlZGVmIGRvdWJsZSBkYXRhX2U7CisKKyNpbmNsdWRlIDxz dGRpby5oPgorCisvKiAgUnVuIHRpbWU6CisgICAgICAgICAgICAgIG9ubHkgcmV3cml0ZSAicmVz dWx0IiAgcmV3cml0ZSBib3RoICJyZXN1bHQiIGFuZCAidG1wIgorQW1wZXJlMSAgICAgICAxLjg4 ICAgICAgICAgICAgICAgICAgIDIuMTAKK25lb3ZlcnNlLW4xICAgMS40NSAgICAgICAgICAgICAg ICAgICAxLjUyCitJbnRlbCBYZW9uICAgIDEuNTUgICAgICAgICAgICAgICAgICAgMS42MgorKi8K KworX19hdHRyaWJ1dGVfbm9pbmxpbmVfXyBkYXRhX2UKK2ZvbyAoZGF0YV9lIGEsIGRhdGFfZSBi LCBkYXRhX2UgYywgZGF0YV9lIGQsIGRhdGFfZSB4LCBkYXRhX2UgeSkKK3sKKyAgZGF0YV9lIHRt cDEsIHRtcDI7CisgIGRhdGFfZSByZXN1bHQgPSAwOworCisgIGZvciAoaW50IGljID0gMDsgaWMg PCBMT09QX0NPVU5UOyBpYysrKQorICAgIHsKKyAgICAgIC8qICBMSFMgaXMgb3BlcmF0b3Igb2Yg YW5vdGhlciBGTUEsIHJlLXdyaXRpbmcgdG8gcGFyYWxsZWwgaXMgd29yc2UuICAqLworICAgICAg dG1wMSA9IGEgKyBjICogYyAtIGQgKiBkICsgeCAqIHk7CisKKyAgICAgIHRtcDIgPSB4ICogdG1w MTsKKyAgICAgIHJlc3VsdCArPSAoYSArIGMgLSBkICsgdG1wMik7CisKKyAgICAgIGEgLT0gMC4x OworICAgICAgYiArPSAwLjk7CisgICAgICBjICo9IDEuMDI7CisgICAgICB4ICo9IDAuMTsKKyAg ICAgIHkgKj0geTsKKyAgICAgIGQgKj0gMC42MTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsK K30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHByaW50ZiAoIiVm XG4iLCBmb28gKC0xLjAsIDAuMDEsIDkuOCwgMWUyLCAtMS45LCAwLjIpKTsKK30KKworLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJXaWR0aCA9IDIgd2FzIGNob3NlbiBmb3Ig cmVhc3NvY2lhdGlvbiIgMSAicmVhc3NvYzIifSB9ICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg ZmlsZQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHIxMTAyNzktMy5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvcHIxMTAyNzktMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi4wZjgxNGYzNDA1MwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL3ByMTEwMjc5LTMuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBQUiB0cmVlLW9wdGlt aXphdGlvbi8xMTAyNzkgKi8KKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PZmFzdCAtLXBhcmFtIHRyZWUtcmVhc3NvYy13aWR0aD00IC1mZHVtcC10cmVlLXJlYXNz b2MyLWRldGFpbHMiIH0gKi8KKy8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItbWZwbWF0aD1z c2UgLW1mbWEiIHsgdGFyZ2V0IHsgaT84Ni0qLSogeDg2XzY0LSotKiB9IH0gfSAqLworCisjZGVm aW5lIExPT1BfQ09VTlQgODAwMDAwMDAwCit0eXBlZGVmIGRvdWJsZSBkYXRhX2U7CisKKyNpbmNs dWRlIDxzdGRpby5oPgorCitfX2F0dHJpYnV0ZV9ub2lubGluZV9fIGRhdGFfZQorZm9vIChkYXRh X2UgYSwgZGF0YV9lIGIsIGRhdGFfZSBjLCBkYXRhX2UgZCwgZGF0YV9lIHgsIGRhdGFfZSB5KQor eworICBkYXRhX2UgdG1wMSwgdG1wMjsKKyAgZGF0YV9lIHJlc3VsdCA9IDA7CisKKyAgZm9yIChp bnQgaWMgPSAwOyBpYyA8IExPT1BfQ09VTlQ7IGljKyspCisgICAgeworICAgICAgLyogInRtcDEi IGlzIG5vdCBhIGNvbXBsZXRlIEZNQSBjaGFpbiwgcGVyZm9ybWFuY2UgY2hhbmdlIGlzIG5vdAor CSBzaWduaWZpY2FudCB3aGV0aGVyIGl0IGlzIHJld3JpdHRlbi4gIFNvIGxlYXZlIHRoaXMgd2l0 aCBkZWZhdWx0CisJIGJlaGF2aW9yLiAgKi8KKyAgICAgIHRtcDEgPSBhICsgYyAqIGMgLSBkICsg eCAqIHk7CisKKyAgICAgIHRtcDIgPSB4ICogdG1wMTsKKyAgICAgIHJlc3VsdCArPSAoYSArIGMg LSBkICsgdG1wMik7CisKKyAgICAgIGEgLT0gMC4xOworICAgICAgYiArPSAwLjk7CisgICAgICBj ICo9IDEuMDI7CisgICAgICB4ICo9IDAuMTsKKyAgICAgIHkgKj0geTsKKyAgICAgIGQgKj0gMC42 MTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50CittYWluIChpbnQgYXJnYywg Y2hhciAqKmFyZ3YpCit7CisgIHByaW50ZiAoIiVmXG4iLCBmb28gKC0xLjAsIDAuMDEsIDkuOCwg MWUyLCAtMS45LCAwLjIpKTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRp bWVzICJXaWR0aCA9IDIgd2FzIGNob3NlbiBmb3IgcmVhc3NvY2lhdGlvbiIgMiAicmVhc3NvYzIi fSB9ICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUt c3NhLW1hdGgtb3B0cy5jYyBiL2djYy90cmVlLXNzYS1tYXRoLW9wdHMuY2MKaW5kZXggNzEyMDk3 YWM1YmUuLjA2YTYwOTRmMmQzIDEwMDY0NAotLS0gYS9nY2MvdHJlZS1zc2EtbWF0aC1vcHRzLmNj CisrKyBiL2djYy90cmVlLXNzYS1tYXRoLW9wdHMuY2MKQEAgLTMwNjQsMTUgKzMwNjQsMjAgQEAg Y29udmVydF9wbHVzbWludXNfdG9fd2lkZW4gKGdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2ksIGdp bXBsZSAqc3RtdCwKIAogLyogR2l2ZW4gYSByZXN1bHQgTVVMX1JFU1VMVCB3aGljaCBpcyBhIHJl c3VsdCBvZiBhIG11bHRpcGxpY2F0aW9uIG9mIE9QMSBhbmQKICAgIE9QMiBhbmQgd2hpY2ggd2Ug a25vdyBpcyB1c2VkIGluIHN0YXRlbWVudHMgdGhhdCBjYW4gYmUsIHRvZ2V0aGVyIHdpdGggdGhl Ci0gICBtdWx0aXBsaWNhdGlvbiwgY29udmVydGVkIHRvIEZNQXMsIHBlcmZvcm0gdGhlIHRyYW5z Zm9ybWF0aW9uLiAgKi8KKyAgIG11bHRpcGxpY2F0aW9uLCBjb252ZXJ0ZWQgdG8gRk1BcywgcGVy Zm9ybSB0aGUgdHJhbnNmb3JtYXRpb24uCisKKyAgIElmIENPTExFQ1RfTEhTIGlzIG5vdCBOVUxM LCBza2lwIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24gYW5kIHN0b3JlIExIUyBvZgorICAgRk1B IGluIENPTExFQ1RfTEhTLiAgKi8KIAogc3RhdGljIHZvaWQKLWNvbnZlcnRfbXVsdF90b19mbWFf MSAodHJlZSBtdWxfcmVzdWx0LCB0cmVlIG9wMSwgdHJlZSBvcDIpCitjb252ZXJ0X211bHRfdG9f Zm1hXzEgKHRyZWUgbXVsX3Jlc3VsdCwgdHJlZSBvcDEsIHRyZWUgb3AyLAorCQkgICAgICAgdmVj PHRyZWU+ICpjb2xsZWN0X2xocyA9IE5VTEwpCiB7CiAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAo bXVsX3Jlc3VsdCk7CiAgIGdpbXBsZSAqdXNlX3N0bXQ7CiAgIGltbV91c2VfaXRlcmF0b3IgaW1t X2l0ZXI7CiAgIGdjYWxsICpmbWFfc3RtdDsKKyAgdHJlZSBsaHMgPSBOVUxMX1RSRUU7CiAKICAg Rk9SX0VBQ0hfSU1NX1VTRV9TVE1UICh1c2Vfc3RtdCwgaW1tX2l0ZXIsIG11bF9yZXN1bHQpCiAg ICAgewpAQCAtMzA5MSw4ICszMDk2LDExIEBAIGNvbnZlcnRfbXVsdF90b19mbWFfMSAodHJlZSBt dWxfcmVzdWx0LCB0cmVlIG9wMSwgdHJlZSBvcDIpCiAJICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwog CSAgZ2ltcGxlICpuZWd1c2Vfc3RtdDsKIAkgIHNpbmdsZV9pbW1fdXNlIChnaW1wbGVfYXNzaWdu X2xocyAodXNlX3N0bXQpLCAmdXNlX3AsICZuZWd1c2Vfc3RtdCk7Ci0JICBnc2lfcmVtb3ZlICgm Z3NpLCB0cnVlKTsKLQkgIHJlbGVhc2VfZGVmcyAodXNlX3N0bXQpOworCSAgaWYgKCFjb2xsZWN0 X2xocykKKwkgICAgeworCSAgICAgIGdzaV9yZW1vdmUgKCZnc2ksIHRydWUpOworCSAgICAgIHJl bGVhc2VfZGVmcyAodXNlX3N0bXQpOworCSAgICB9CiAKIAkgIHVzZV9zdG10ID0gbmVndXNlX3N0 bXQ7CiAJICBnc2kgPSBnc2lfZm9yX3N0bXQgKHVzZV9zdG10KTsKQEAgLTMxMDcsNiArMzExNSwx MiBAQCBjb252ZXJ0X211bHRfdG9fZm1hXzEgKHRyZWUgbXVsX3Jlc3VsdCwgdHJlZSBvcDEsIHRy ZWUgb3AyKQogCWdjY191bnJlYWNoYWJsZSAoKTsKICAgICAgIGFkZG9wID0gb3BzWzBdID09IHJl c3VsdCA/IG9wc1sxXSA6IG9wc1swXTsKIAorICAgICAgbGhzID0gZ2ltcGxlX2dldF9saHMgKHVz ZV9zdG10KTsKKyAgICAgIGlmIChjb2xsZWN0X2xocykKKwl7CisJICBjb2xsZWN0X2xocy0+c2Fm ZV9wdXNoIChsaHMpOworCSAgY29udGludWU7CisJfQogICAgICAgaWYgKGNvZGUgPT0gTUlOVVNf RVhQUikKIAl7CiAJICBpZiAob3BzWzBdID09IHJlc3VsdCkKQEAgLTMxMzIsNyArMzE0Niw3IEBA IGNvbnZlcnRfbXVsdF90b19mbWFfMSAodHJlZSBtdWxfcmVzdWx0LCB0cmVlIG9wMSwgdHJlZSBv cDIpCiAJCQkJCSAgICAgICBvcDIsIGFkZG9wLCBlbHNlX3ZhbHVlKTsKICAgICAgIGVsc2UKIAlm bWFfc3RtdCA9IGdpbXBsZV9idWlsZF9jYWxsX2ludGVybmFsIChJRk5fRk1BLCAzLCBtdWxvcDEs IG9wMiwgYWRkb3ApOwotICAgICAgZ2ltcGxlX3NldF9saHMgKGZtYV9zdG10LCBnaW1wbGVfZ2V0 X2xocyAodXNlX3N0bXQpKTsKKyAgICAgIGdpbXBsZV9zZXRfbGhzIChmbWFfc3RtdCwgbGhzKTsK ICAgICAgIGdpbXBsZV9jYWxsX3NldF9ub3Rocm93IChmbWFfc3RtdCwgIXN0bXRfY2FuX3Rocm93 X2ludGVybmFsIChjZnVuLAogCQkJCQkJCQkgICB1c2Vfc3RtdCkpOwogICAgICAgZ3NpX3JlcGxh Y2UgKCZnc2ksIGZtYV9zdG10LCB0cnVlKTsKQEAgLTMxODYsNTQgKzMyMDAsNiBAQCBjb252ZXJ0 X211bHRfdG9fZm1hXzEgKHRyZWUgbXVsX3Jlc3VsdCwgdHJlZSBvcDEsIHRyZWUgb3AyKQogICAg IH0KIH0KIAotLyogRGF0YSBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHRyYW5zZm9y bWF0aW9uIGZyb20gYSBtdWx0aXBsaWNhdGlvbgotICAgYW5kIGFuIGFkZGl0aW9uIHRvIGFuIEZN QSBhZnRlciBkZWNpc2lvbiBpcyB0YWtlbiBpdCBzaG91bGQgYmUgZG9uZSBhbmQgdG8KLSAgIHRo ZW4gZGVsZXRlIHRoZSBtdWx0aXBsaWNhdGlvbiBzdGF0ZW1lbnQgZnJvbSB0aGUgZnVuY3Rpb24g SUwuICAqLwotCi1zdHJ1Y3QgZm1hX3RyYW5zZm9ybWF0aW9uX2luZm8KLXsKLSAgZ2ltcGxlICpt dWxfc3RtdDsKLSAgdHJlZSBtdWxfcmVzdWx0OwotICB0cmVlIG9wMTsKLSAgdHJlZSBvcDI7Ci19 OwotCi0vKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiBGTUEgZGVm ZXJyaW5nLCBpLmUuIHdoZXRoZXIgd2UgYXJlCi0gICBkZWZlcnJpbmcsIHdoZXRoZXIgdG8gY29u dGludWUgZGVmZXJyaW5nLCBhbmQgYWxsIGRhdGEgbmVjZXNzYXJ5IHRvIGNvbWUKLSAgIGJhY2sg YW5kIHBlcmZvcm0gYWxsIGRlZmVycmVkIHRyYW5zZm9ybWF0aW9ucy4gICovCi0KLWNsYXNzIGZt YV9kZWZlcnJpbmdfc3RhdGUKLXsKLXB1YmxpYzoKLSAgLyogQ2xhc3MgY29uc3RydWN0b3IuICBQ YXNzIHRydWUgYXMgUEVSRk9STV9ERUZFUlJJTkcgaW4gb3JkZXIgdG8gYWN0dWFsbHkKLSAgICAg ZG8gYW55IGRlZmVycmluZy4gICovCi0KLSAgZm1hX2RlZmVycmluZ19zdGF0ZSAoYm9vbCBwZXJm b3JtX2RlZmVycmluZykKLSAgICA6IG1fY2FuZGlkYXRlcyAoKSwgbV9tdWxfcmVzdWx0X3NldCAo KSwgbV9pbml0aWFsX3BoaSAoTlVMTCksCi0gICAgICBtX2xhc3RfcmVzdWx0IChOVUxMX1RSRUUp LCBtX2RlZmVycmluZ19wIChwZXJmb3JtX2RlZmVycmluZykge30KLQotICAvKiBMaXN0IG9mIEZN QSBjYW5kaWRhdGVzIGZvciB3aGljaCB3ZSB0aGUgdHJhbnNmb3JtYXRpb24gaGFzIGJlZW4gZGV0 ZXJtaW5lZAotICAgICBwb3NzaWJsZSBidXQgd2UgYXQgdGhpcyBwb2ludCBpbiBCQiBhbmFseXNp cyB3ZSBkbyBub3QgY29uc2lkZXIgdGhlbQotICAgICBiZW5lZmljaWFsLiAgKi8KLSAgYXV0b192 ZWM8Zm1hX3RyYW5zZm9ybWF0aW9uX2luZm8sIDg+IG1fY2FuZGlkYXRlczsKLQotICAvKiBTZXQg b2YgcmVzdWx0cyBvZiBtdWx0aXBsaWNhdGlvbiB0aGF0IGFyZSBwYXJ0IG9mIGFuIGFscmVhZHkg ZGVmZXJyZWQgRk1BCi0gICAgIGNhbmRpZGF0ZXMuICAqLwotICBoYXNoX3NldDx0cmVlPiBtX211 bF9yZXN1bHRfc2V0OwotCi0gIC8qIFRoZSBQSEkgdGhhdCBzdXBwb3NlZGx5IGZlZWRzIGJhY2sg cmVzdWx0IG9mIGEgRk1BIHRvIGFub3RoZXIgb3ZlciBsb29wCi0gICAgIGJvdW5kYXJ5LiAgKi8K LSAgZ3BoaSAqbV9pbml0aWFsX3BoaTsKLQotICAvKiBSZXN1bHQgb2YgdGhlIGxhc3QgcHJvZHVj ZWQgRk1BIGNhbmRpZGF0ZSBvciBOVUxMIGlmIHRoZXJlIGhhcyBub3QgYmVlbgotICAgICBvbmUu ICAqLwotICB0cmVlIG1fbGFzdF9yZXN1bHQ7Ci0KLSAgLyogSWYgdHJ1ZSwgZGVmZXJyaW5nIG1p Z2h0IHN0aWxsIGJlIHByb2ZpdGFibGUuICBJZiBmYWxzZSwgdHJhbnNmb3JtIGFsbAotICAgICBj YW5kaWRhdGVzIGFuZCBubyBsb25nZXIgZGVmZXIuICAqLwotICBib29sIG1fZGVmZXJyaW5nX3A7 Ci19OwotCiAvKiBUcmFuc2Zvcm0gYWxsIGRlZmVycmVkIEZNQSBjYW5kaWRhdGVzIGFuZCBtYXJr IFNUQVRFIGFzIG5vIGxvbmdlcgogICAgZGVmZXJyaW5nLiAgKi8KIApAQCAtMzMwOCwxMiArMzI3 NCwxNSBAQCBsYXN0X2ZtYV9jYW5kaWRhdGVfZmVlZHNfaW5pdGlhbF9waGkgKGZtYV9kZWZlcnJp bmdfc3RhdGUgKnN0YXRlLAogICBvciBpdHMgdW5yb2xsZWQgdmVyc2lvbiwgaS5lLiB3aXRoIHNl dmVyYWwgRk1BIGNhbmRpZGF0ZXMgdGhhdCBmZWVkIHJlc3VsdAogICBvZiBvbmUgaW50byB0aGUg YWRkZW5kIG9mIGFub3RoZXIuICBJbnN0ZWFkLCB3ZSBhZGQgdGhlbSB0byBhIGxpc3QgaW4gU1RB VEUKICAgYW5kIGlmIHdlIGxhdGVyIGRpc2NvdmVyIGFuIEZNQSBjYW5kaWRhdGUgdGhhdCBpcyBu b3QgcGFydCBvZiBzdWNoIGEgY2hhaW4sCi0gIHdlIGdvIGJhY2sgYW5kIHBlcmZvcm0gYWxsIGRl ZmVycmVkIHBhc3QgY2FuZGlkYXRlcy4gICovCisgIHdlIGdvIGJhY2sgYW5kIHBlcmZvcm0gYWxs IGRlZmVycmVkIHBhc3QgY2FuZGlkYXRlcy4KIAotc3RhdGljIGJvb2wKKyAgSWYgQ09MTEVDVF9M SFMgaXMgbm90IE5VTEwsIHNraXAgdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbiBhbmQgc3RvcmUg TEhTIG9mCisgIEZNQSBpbiBDT0xMRUNUX0xIUy4gICovCisKK2Jvb2wKIGNvbnZlcnRfbXVsdF90 b19mbWEgKGdpbXBsZSAqbXVsX3N0bXQsIHRyZWUgb3AxLCB0cmVlIG9wMiwKLQkJICAgICBmbWFf ZGVmZXJyaW5nX3N0YXRlICpzdGF0ZSwgdHJlZSBtdWxfY29uZCA9IE5VTExfVFJFRSwKLQkJICAg ICB0cmVlIG11bF9sZW4gPSBOVUxMX1RSRUUsIHRyZWUgbXVsX2JpYXMgPSBOVUxMX1RSRUUpCisJ CSAgICAgZm1hX2RlZmVycmluZ19zdGF0ZSAqc3RhdGUsIHRyZWUgbXVsX2NvbmQsIHRyZWUgbXVs X2xlbiwKKwkJICAgICB0cmVlIG11bF9iaWFzLCB2ZWM8dHJlZT4gKmNvbGxlY3RfbGhzKQogewog ICB0cmVlIG11bF9yZXN1bHQgPSBnaW1wbGVfZ2V0X2xocyAobXVsX3N0bXQpOwogICAvKiBJZiB0 aGVyZSBpc24ndCBhIExIUyB0aGVuIHRoaXMgY2FuJ3QgYmUgYW4gRk1BLiAgVGhlcmUgY2FuIGJl IG5vIExIUwpAQCAtMzU5MCw3ICszNTU5LDcgQEAgY29udmVydF9tdWx0X3RvX2ZtYSAoZ2ltcGxl ICptdWxfc3RtdCwgdHJlZSBvcDEsIHRyZWUgb3AyLAogICAgIHsKICAgICAgIGlmIChzdGF0ZS0+ bV9kZWZlcnJpbmdfcCkKIAljYW5jZWxfZm1hX2RlZmVycmluZyAoc3RhdGUpOwotICAgICAgY29u dmVydF9tdWx0X3RvX2ZtYV8xIChtdWxfcmVzdWx0LCBvcDEsIG9wMik7CisgICAgICBjb252ZXJ0 X211bHRfdG9fZm1hXzEgKG11bF9yZXN1bHQsIG9wMSwgb3AyLCBjb2xsZWN0X2xocyk7CiAgICAg ICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9nY2MvdHJlZS1zc2EtbWF0aC1v cHRzLmggYi9nY2MvdHJlZS1zc2EtbWF0aC1vcHRzLmgKaW5kZXggNTJiNzkzOGI1OTkuLjM1Nzcz YWM2NWNlIDEwMDY0NAotLS0gYS9nY2MvdHJlZS1zc2EtbWF0aC1vcHRzLmgKKysrIGIvZ2NjL3Ry ZWUtc3NhLW1hdGgtb3B0cy5oCkBAIC0yMyw0ICsyMyw1OCBAQCBhbG9uZyB3aXRoIEdDQzsgc2Vl IHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogZXh0ZXJuIHRyZWUgcG93aV9hc19tdWx0 cyAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKiwgbG9jYXRpb25fdCwKIAkJCSAgIHRyZWUsIEhPU1Rf V0lERV9JTlQpOwogCisvKiBEYXRhIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSBhY3R1YWwgdHJh bnNmb3JtYXRpb24gZnJvbSBhIG11bHRpcGxpY2F0aW9uCisgICBhbmQgYW4gYWRkaXRpb24gdG8g YW4gRk1BIGFmdGVyIGRlY2lzaW9uIGlzIHRha2VuIGl0IHNob3VsZCBiZSBkb25lIGFuZCB0bwor ICAgdGhlbiBkZWxldGUgdGhlIG11bHRpcGxpY2F0aW9uIHN0YXRlbWVudCBmcm9tIHRoZSBmdW5j dGlvbiBJTC4gICovCisKK3N0cnVjdCBmbWFfdHJhbnNmb3JtYXRpb25faW5mbworeworICBnaW1w bGUgKm11bF9zdG10OworICB0cmVlIG11bF9yZXN1bHQ7CisgIHRyZWUgb3AxOworICB0cmVlIG9w MjsKK307CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIEZN QSBkZWZlcnJpbmcsIGkuZS4gd2hldGhlciB3ZSBhcmUKKyAgIGRlZmVycmluZywgd2hldGhlciB0 byBjb250aW51ZSBkZWZlcnJpbmcsIGFuZCBhbGwgZGF0YSBuZWNlc3NhcnkgdG8gY29tZQorICAg YmFjayBhbmQgcGVyZm9ybSBhbGwgZGVmZXJyZWQgdHJhbnNmb3JtYXRpb25zLiAgKi8KKworY2xh c3MgZm1hX2RlZmVycmluZ19zdGF0ZQoreworcHVibGljOgorICAvKiBDbGFzcyBjb25zdHJ1Y3Rv ci4gIFBhc3MgdHJ1ZSBhcyBQRVJGT1JNX0RFRkVSUklORyBpbiBvcmRlciB0byBhY3R1YWxseQor ICAgICBkbyBhbnkgZGVmZXJyaW5nLiAgKi8KKworICBmbWFfZGVmZXJyaW5nX3N0YXRlIChib29s IHBlcmZvcm1fZGVmZXJyaW5nKQorICAgIDogbV9jYW5kaWRhdGVzICgpLCBtX211bF9yZXN1bHRf c2V0ICgpLCBtX2luaXRpYWxfcGhpIChOVUxMKSwKKyAgICAgIG1fbGFzdF9yZXN1bHQgKE5VTExf VFJFRSksIG1fZGVmZXJyaW5nX3AgKHBlcmZvcm1fZGVmZXJyaW5nKSB7fQorCisgIC8qIExpc3Qg b2YgRk1BIGNhbmRpZGF0ZXMgZm9yIHdoaWNoIHdlIHRoZSB0cmFuc2Zvcm1hdGlvbiBoYXMgYmVl biBkZXRlcm1pbmVkCisgICAgIHBvc3NpYmxlIGJ1dCB3ZSBhdCB0aGlzIHBvaW50IGluIEJCIGFu YWx5c2lzIHdlIGRvIG5vdCBjb25zaWRlciB0aGVtCisgICAgIGJlbmVmaWNpYWwuICAqLworICBh dXRvX3ZlYzxmbWFfdHJhbnNmb3JtYXRpb25faW5mbywgOD4gbV9jYW5kaWRhdGVzOworCisgIC8q IFNldCBvZiByZXN1bHRzIG9mIG11bHRpcGxpY2F0aW9uIHRoYXQgYXJlIHBhcnQgb2YgYW4gYWxy ZWFkeSBkZWZlcnJlZCBGTUEKKyAgICAgY2FuZGlkYXRlcy4gICovCisgIGhhc2hfc2V0PHRyZWU+ IG1fbXVsX3Jlc3VsdF9zZXQ7CisKKyAgLyogVGhlIFBISSB0aGF0IHN1cHBvc2VkbHkgZmVlZHMg YmFjayByZXN1bHQgb2YgYSBGTUEgdG8gYW5vdGhlciBvdmVyIGxvb3AKKyAgICAgYm91bmRhcnku ICAqLworICBncGhpICptX2luaXRpYWxfcGhpOworCisgIC8qIFJlc3VsdCBvZiB0aGUgbGFzdCBw cm9kdWNlZCBGTUEgY2FuZGlkYXRlIG9yIE5VTEwgaWYgdGhlcmUgaGFzIG5vdCBiZWVuCisgICAg IG9uZS4gICovCisgIHRyZWUgbV9sYXN0X3Jlc3VsdDsKKworICAvKiBJZiB0cnVlLCBkZWZlcnJp bmcgbWlnaHQgc3RpbGwgYmUgcHJvZml0YWJsZS4gIElmIGZhbHNlLCB0cmFuc2Zvcm0gYWxsCisg ICAgIGNhbmRpZGF0ZXMgYW5kIG5vIGxvbmdlciBkZWZlci4gICovCisgIGJvb2wgbV9kZWZlcnJp bmdfcDsKK307CisKK2Jvb2wKK2NvbnZlcnRfbXVsdF90b19mbWEgKGdpbXBsZSAqbXVsX3N0bXQs IHRyZWUgb3AxLCB0cmVlIG9wMiwKKwkJICAgICBmbWFfZGVmZXJyaW5nX3N0YXRlICpzdGF0ZSwg dHJlZSBtdWxfY29uZCA9IE5VTExfVFJFRSwKKwkJICAgICB0cmVlIG11bF9sZW4gPSBOVUxMX1RS RUUsIHRyZWUgbXVsX2JpYXMgPSBOVUxMX1RSRUUsCisJCSAgICAgdmVjPHRyZWU+ICpjb2xsZWN0 X2xocyA9IE5VTEwpOworCiAjZW5kaWYgIC8qIEdDQ19UUkVFX1NTQV9NQVRIX09QVFNfSCAgKi8K ZGlmZiAtLWdpdCBhL2djYy90cmVlLXNzYS1yZWFzc29jLmNjIGIvZ2NjL3RyZWUtc3NhLXJlYXNz b2MuY2MKaW5kZXggZWRhMDNiZjk4YTYuLjc4YmZjNGE5ZGYwIDEwMDY0NAotLS0gYS9nY2MvdHJl ZS1zc2EtcmVhc3NvYy5jYworKysgYi9nY2MvdHJlZS1zc2EtcmVhc3NvYy5jYwpAQCAtNTQ3MSw2 ICs1NDcxLDIyIEBAIGdldF9yZWFzc29jaWF0aW9uX3dpZHRoIChpbnQgb3BzX251bSwgZW51bSB0 cmVlX2NvZGUgb3BjLAogICByZXR1cm4gd2lkdGg7CiB9CiAKKy8qIFRoaXMgZW51bSBkZXNjcmli ZXMgdGhlIHN0YXRlIG9mIEZNQSBjYW5kaWRhdGVzIGZvciBhIGxpc3Qgb2Ygb3BlcmFuZHMuICAq LworCitlbnVtIGZtYV9zdGF0ZSB7CisgIC8qIFRoZXJlIGlzIGF0IG1vc3Qgb25lIEZNQSBjYW5k aWRhdGUgaW4gdGhlIG9wIGxpc3QuICBJbiB0aGlzIGNhc2UsIG5vCisgICAgIHNwZWNpYWwgdHJl YXRtZW50IGlzIG5lZWRlZCB3aGVuIHJld3JpdGluZyBleHByZXNzaW9uIHRyZWUuICAqLworICBG TUFfU1RBVEVfTk9ORV9PUl9TSU5HTEUgPSAwLAorCisgIC8qIFRoZSByZXN1bHQgb2YgYSBGTUEg aXMgdGhlIGZpcnN0IG9yIHNlY29uZCBvcGVyYW5kIG9mIGFub3RoZXIgRk1BLiAgSW4KKyAgICAg dGhpcyBjYXNlLCByZXdyaXRpbmcgZXhwcmVzc2lvbiB0cmVlIHNob3VsZCBiZSBhdm9pZGVkLiAg Ki8KKyAgRk1BX1NUQVRFX05FU1RFRCwKKworICAvKiBUaGVyZSBhcmUgbXVsdGlwbGUgRk1BIGNh bmRpZGF0ZXMgaW4gdGhlIG9wIGxpc3QuICBBdm9pZCBzd2FwcGluZyBvcGVyYW5kcworICAgICBp biB0aGlzIGNhc2UuICAqLworICBGTUFfU1RBVEVfTVVMVElQTEUKK307CisKICNkZWZpbmUgU1BF Q0lBTF9CSUFTRURfRU5EX1NUTVQgMCAvKiBJdCBpcyB0aGUgZW5kIHN0bXQgb2YgYWxsIG9wcy4g ICovCiAjZGVmaW5lIEJJQVNFRF9FTkRfU1RNVCAxIC8qIEl0IGlzIHRoZSBlbmQgc3RtdCBvZiBu b3JtYWwgb3IgYmlhc2VkIG9wcy4gICovCiAjZGVmaW5lIE5PUk1BTF9FTkRfU1RNVCAyIC8qIEl0 IGlzIHRoZSBlbmQgc3RtdCBvZiBub3JtYWwgb3BzLiAgKi8KQEAgLTU1MDcsNyArNTUyMyw3IEBA IGdldF9yZWFzc29jaWF0aW9uX3dpZHRoIChpbnQgb3BzX251bSwgZW51bSB0cmVlX2NvZGUgb3Bj LAogICAgU1NBNiA9IFNTQTQgKyBTU0E1OwogICovCiBzdGF0aWMgdm9pZAotcmV3cml0ZV9leHBy X3RyZWVfcGFyYWxsZWwgKGdhc3NpZ24gKnN0bXQsIGludCB3aWR0aCwgYm9vbCBoYXNfZm1hLAor cmV3cml0ZV9leHByX3RyZWVfcGFyYWxsZWwgKGdhc3NpZ24gKnN0bXQsIGludCB3aWR0aCwgZW51 bSBmbWFfc3RhdGUgZnMsCiAJCQkgICAgY29uc3QgdmVjPG9wZXJhbmRfZW50cnkgKj4gJm9wcykK IHsKICAgZW51bSB0cmVlX2NvZGUgb3Bjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3Rt dCk7CkBAIC01NTgyLDcgKzU1OTgsNyBAQCByZXdyaXRlX2V4cHJfdHJlZV9wYXJhbGxlbCAoZ2Fz c2lnbiAqc3RtdCwgaW50IHdpZHRoLCBib29sIGhhc19mbWEsCiAJfQogCiAgICAgICAvKiBTd2Fw IHRoZSBvcGVyYW5kcyBpZiBubyBGTUEgaW4gdGhlIGNoYWluLiAgKi8KLSAgICAgIGlmIChvcHMx LT5sZW5ndGggKCkgPiAyICYmICFoYXNfZm1hKQorICAgICAgaWYgKG9wczEtPmxlbmd0aCAoKSA+ IDIgJiYgZnMgPT0gRk1BX1NUQVRFX05PTkVfT1JfU0lOR0xFKQogCXN3YXBfb3BzX2Zvcl9iaW5h cnlfc3RtdCAoKm9wczEsIG9wczEtPmxlbmd0aCAoKSAtIDMpOwogCiAgICAgICBpZiAoaSA8IHdp ZHRoX2FjdGl2ZQpAQCAtNjc2Niw3ICs2NzgyLDU5IEBAIHRyYW5zZm9ybV9zdG10X3RvX211bHRp cGx5IChnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3NpLCBnaW1wbGUgKnN0bXQsCiAgICAgfQogfQog CisvKiBHaXZlbiBMSFMgaXMgcmVzdWx0IG9mIGEgZXhwcmVzc2lvbiB0cmVlIGFuZCBNVUxfU1RN VCBpcyBvbmUgb2YgaXRzCisgICBvcGVyYXRvcnMsIHJldHVybiB3aGV0aGVyIExIUyBpcyB0aGUg b3BlcmFuZCBvZiBhbm90aGVyIEZNQS4gICovCitzdGF0aWMgYm9vbAoraGFzX25lc3RlZF9mbWFf cCAoZ2ltcGxlICptdWxfc3RtdCwgdHJlZSBsaHMpCit7CisgIGF1dG9fdmVjPHRyZWUsIDI+IGxo c192ZWM7CisgIGZtYV9kZWZlcnJpbmdfc3RhdGUgZmRzIChmYWxzZSk7CisKKyAgaWYgKGNvbnZl cnRfbXVsdF90b19mbWEgKG11bF9zdG10LCBnaW1wbGVfYXNzaWduX3JoczEgKG11bF9zdG10KSwK KwkJCSAgIGdpbXBsZV9hc3NpZ25fcmhzMiAobXVsX3N0bXQpLCAmZmRzLCBOVUxMLCBOVUxMLAor CQkJICAgTlVMTCwgJmxoc192ZWMpCisgICAgICAmJiBsaHNfdmVjLmNvbnRhaW5zIChsaHMpKQor ICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciBNVUxUX0VYUFJzIHRoYXQgdXNlIExIUy4gICovCisg ICAgICBpbW1fdXNlX2l0ZXJhdG9yIGltbV9pdGVyOworICAgICAgZ2ltcGxlICp1c2Vfc3RtdDsK KyAgICAgIHVzZV9vcGVyYW5kX3AgdXNlX3A7CisKKyAgICAgIEZPUl9FQUNIX0lNTV9VU0VfRkFT VCAodXNlX3AsIGltbV9pdGVyLCBsaHMpCisJeworCSAgdXNlX3N0bXQgPSBVU0VfU1RNVCAodXNl X3ApOworCSAgaWYgKGlzX2dpbXBsZV9kZWJ1ZyAodXNlX3N0bXQpKQorCSAgICBjb250aW51ZTsK KwkgIGlmIChnaW1wbGVfYmIgKHVzZV9zdG10KSAhPSBnaW1wbGVfYmIgKG11bF9zdG10KSkKKwkg ICAgY29udGludWU7CisKKwkgIGxoc192ZWMudHJ1bmNhdGUgKDApOworCSAgaWYgKGlzX2dpbXBs ZV9hc3NpZ24gKHVzZV9zdG10KQorCSAgICAgICYmIGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHVz ZV9zdG10KSA9PSBNVUxUX0VYUFIKKwkgICAgICAmJiBjb252ZXJ0X211bHRfdG9fZm1hICh1c2Vf c3RtdCwgZ2ltcGxlX2Fzc2lnbl9yaHMxICh1c2Vfc3RtdCksCisJCQkJICAgICAgZ2ltcGxlX2Fz c2lnbl9yaHMyICh1c2Vfc3RtdCksICZmZHMsIE5VTEwsCisJCQkJICAgICAgTlVMTCwgTlVMTCwg Jmxoc192ZWMpKQorCSAgICB7CisJICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAm IFRERl9ERVRBSUxTKSkKKwkJeworCQkgIGZwcmludGYgKGR1bXBfZmlsZSwgIkZvdW5kIG5lc3Rl ZCBGTUEgZm9yICIpOworCQkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCBsaHMpOwor CQkgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7CisJCX0KKwkgICAgICByZXR1cm4gdHJ1ZTsK KwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogLyogUmVhcnJhbmdlIG9w cyBtYXkgaGF2ZSBtb3JlIEZNQSB3aGVuIHRoZSBjaGFpbiBtYXkgaGFzIG1vcmUgdGhhbiAyIEZN QXMuCisgICBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBGTUEgY2FuZGlkYXRlcyBpbiBPUFM6CisgICAt IEZNQV9TVEFURV9OT05FX09SX1NJTkdMRSBpZiB0aGVyZSdzIGF0IG1vc3Qgb25lIEZNQSBjYW5k aWRhdGUgaW4gT1BTLAorICAgLSBGTUFfU1RBVEVfTkVTVEVEIGlmIGEgRk1BJ3MgcmVzdWx0IGlz IHRoZSBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBvZgorICAgICBhbm90aGVyIEZNQSwKKyAgIC0g Rk1BX1NUQVRFX01VTFRJUExFIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBGTUEgY2FuZGlkYXRlcyBp biB0aGUgb3AgbGlzdC4KKwogICAgUHV0IG5vLW11bHQgb3BzIGFuZCBtdWx0IG9wcyBhbHRlcm5h dGVseSBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSwgd2hpY2ggaXMKICAgIGNvbmR1Y2l2ZSB0byBn ZW5lcmF0aW5nIG1vcmUgRk1BIGFuZCByZWR1Y2luZyB0aGUgbG9zcyBvZiBGTUEgd2hlbiBicmVh a2luZwogICAgdGhlIGNoYWluLgpAQCAtNjc4MSwyOSArNjg0OSw1NSBAQCB0cmFuc2Zvcm1fc3Rt dF90b19tdWx0aXBseSAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSwgZ2ltcGxlICpzdG10LAog CiAgICBfNCAgPSAuRk1BIChjXzcoRCksIGRfOChEKSwgXzMpOwogICAgXzExID0gLkZNQSAoYV81 KEQpLCBiXzYoRCksIF80KTsgICovCi1zdGF0aWMgYm9vbAotcmFua19vcHNfZm9yX2ZtYSAodmVj PG9wZXJhbmRfZW50cnkgKj4gKm9wcykKK3N0YXRpYyBlbnVtIGZtYV9zdGF0ZQorcmFua19vcHNf Zm9yX2ZtYSAodmVjPG9wZXJhbmRfZW50cnkgKj4gKm9wcywgdHJlZSBsaHMpCiB7CiAgIG9wZXJh bmRfZW50cnkgKm9lOwogICB1bnNpZ25lZCBpbnQgaTsKICAgdW5zaWduZWQgaW50IG9wc19sZW5n dGggPSBvcHMtPmxlbmd0aCAoKTsKICAgYXV0b192ZWM8b3BlcmFuZF9lbnRyeSAqPiBvcHNfbXVs dDsKICAgYXV0b192ZWM8b3BlcmFuZF9lbnRyeSAqPiBvcHNfb3RoZXJzOworICBib29sIGhhc19u ZXN0ZWRfZm1hID0gZmFsc2U7CiAKICAgRk9SX0VBQ0hfVkVDX0VMVCAoKm9wcywgaSwgb2UpCiAg ICAgewogICAgICAgaWYgKFRSRUVfQ09ERSAob2UtPm9wKSA9PSBTU0FfTkFNRSkKIAl7CiAJICBn aW1wbGUgKmRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQgKG9lLT5vcCk7Ci0JICBpZiAoaXNf Z2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAgICAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29k ZSAoZGVmX3N0bXQpID09IE1VTFRfRVhQUikKLQkgICAgb3BzX211bHQuc2FmZV9wdXNoIChvZSk7 CisJICBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpKQorCSAgICB7CisJICAgICAgaWYg KGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10KSA9PSBNVUxUX0VYUFIpCisJCXsKKwkJ ICBoYXNfbmVzdGVkX2ZtYSB8PSBoYXNfbmVzdGVkX2ZtYV9wIChkZWZfc3RtdCwgbGhzKTsKKwkJ ICBvcHNfbXVsdC5zYWZlX3B1c2ggKG9lKTsKKwkJfQorCSAgICAgIC8qIEFsc28gY2hlY2sgTkVH QVRFX0VYUFJzIGZvciBwb3NzaWJsZSBuZXN0ZWQgRk1BLiAgKi8KKwkgICAgICBlbHNlIGlmIChn aW1wbGVfYXNzaWduX3Joc19jb2RlIChkZWZfc3RtdCkgPT0gTkVHQVRFX0VYUFIKKwkJICAgICAg ICYmIFRSRUVfQ09ERSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCkpID09IFNTQV9OQU1F KQorCQl7CisJCSAgZ2ltcGxlICpuZWdfZGVmX3N0bXQKKwkJICAgID0gU1NBX05BTUVfREVGX1NU TVQgKGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpKTsKKwkJICBpZiAoaXNfZ2ltcGxlX2Fz c2lnbiAobmVnX2RlZl9zdG10KQorCQkgICAgICAmJiBnaW1wbGVfYmIgKG5lZ19kZWZfc3RtdCkg PT0gZ2ltcGxlX2JiIChkZWZfc3RtdCkKKwkJICAgICAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29k ZSAobmVnX2RlZl9zdG10KSA9PSBNVUxUX0VYUFIpCisJCSAgICBoYXNfbmVzdGVkX2ZtYSB8PSBo YXNfbmVzdGVkX2ZtYV9wIChuZWdfZGVmX3N0bXQsIGxocyk7CisJCSAgb3BzX290aGVycy5zYWZl X3B1c2ggKG9lKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJb3BzX290aGVycy5zYWZlX3B1c2ggKG9l KTsKKwkgICAgfQogCSAgZWxzZQogCSAgICBvcHNfb3RoZXJzLnNhZmVfcHVzaCAob2UpOwogCX0K ICAgICAgIGVsc2UKIAlvcHNfb3RoZXJzLnNhZmVfcHVzaCAob2UpOwogICAgIH0KKworICAvKiBX aGVuIHRoZXJlJ3MgbmVzdGVkIEZNQSBmb2xsb3dpbmcgYSBjb21wbGV0ZSBGTUEgY2hhaW4sIGJy ZWFraW5nIGl0CisgICAgIGluY3JlYXNlcyBydW4gdGltZSAocHIxMTAyNzkpLiAgKi8KKyAgaWYg KGhhc19uZXN0ZWRfZm1hICYmIG9wc19tdWx0Lmxlbmd0aCAoKSA+PSBvcHNfbGVuZ3RoIC0gMSkK KyAgICByZXR1cm4gRk1BX1NUQVRFX05FU1RFRDsKKwogICAvKiAxLiBXaGVuIG9wc19tdWx0Lmxl bmd0aCA9PSAyLCBsaWtlIHRoZSBmb2xsb3dpbmcgY2FzZSwKIAogICAgICBhICogYiArIGMgKiBk ICsgZS4KQEAgLTY4MjksOSArNjkyMyw5IEBAIHJhbmtfb3BzX2Zvcl9mbWEgKHZlYzxvcGVyYW5k X2VudHJ5ICo+ICpvcHMpCiAJICBpZiAob3BpbmRleCA+IDApCiAJICAgIG9waW5kZXgtLTsKIAl9 Ci0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBGTUFfU1RBVEVfTVVMVElQTEU7CiAg ICAgfQotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBGTUFfU1RBVEVfTk9ORV9PUl9TSU5HTEU7 CiB9CiAvKiBSZWFzc29jaWF0ZSBleHByZXNzaW9ucyBpbiBiYXNpYyBibG9jayBCQiBhbmQgaXRz IHBvc3QtZG9taW5hdG9yIGFzCiAgICBjaGlsZHJlbi4KQEAgLTY5OTcsNyArNzA5MSw3IEBAIHJl YXNzb2NpYXRlX2JiIChiYXNpY19ibG9jayBiYikKIAkJICBtYWNoaW5lX21vZGUgbW9kZSA9IFRZ UEVfTU9ERSAoVFJFRV9UWVBFIChsaHMpKTsKIAkJICBpbnQgb3BzX251bSA9IG9wcy5sZW5ndGgg KCk7CiAJCSAgaW50IHdpZHRoOwotCQkgIGJvb2wgaGFzX2ZtYSA9IGZhbHNlOworCQkgIGVudW0g Zm1hX3N0YXRlIGZzID0gRk1BX1NUQVRFX05PTkVfT1JfU0lOR0xFOwogCiAJCSAgLyogRm9yIGJp bmFyeSBiaXQgb3BlcmF0aW9ucywgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IDMKIAkJICAgICBvcGVy YW5kcyBhbmQgdGhlIGxhc3Qgb3BlcmFuZCBpbiBPUFMgaXMgYSBjb25zdGFudCwKQEAgLTcwMjAs NyArNzExNCw3IEBAIHJlYXNzb2NpYXRlX2JiIChiYXNpY19ibG9jayBiYikKIAkJCQkJCSAgICAg IG9wdF90eXBlKQogCQkgICAgICAmJiAocmhzX2NvZGUgPT0gUExVU19FWFBSIHx8IHJoc19jb2Rl ID09IE1JTlVTX0VYUFIpKQogCQkgICAgewotCQkgICAgICBoYXNfZm1hID0gcmFua19vcHNfZm9y X2ZtYSAoJm9wcyk7CisJCSAgICAgIGZzID0gcmFua19vcHNfZm9yX2ZtYSAoJm9wcywgbGhzKTsK IAkJICAgIH0KIAogCQkgIC8qIE9ubHkgcmV3cml0ZSB0aGUgZXhwcmVzc2lvbiB0cmVlIHRvIHBh cmFsbGVsIGluIHRoZQpAQCAtNzAyOCw2ICs3MTIyLDcgQEAgcmVhc3NvY2lhdGVfYmIgKGJhc2lj X2Jsb2NrIGJiKQogCQkgICAgIHdpdGggaW5pdGlhbCBsaW5lYXJpemF0aW9uLiAgKi8KIAkJICBp ZiAoIXJlYXNzb2NfaW5zZXJ0X3Bvd2lfcAogCQkgICAgICAmJiBvcHMubGVuZ3RoICgpID4gMwor CQkgICAgICAmJiBmcyAhPSBGTUFfU1RBVEVfTkVTVEVECiAJCSAgICAgICYmICh3aWR0aCA9IGdl dF9yZWFzc29jaWF0aW9uX3dpZHRoIChvcHNfbnVtLCByaHNfY29kZSwKIAkJCQkJCQkgICBtb2Rl KSkgPiAxKQogCQkgICAgewpAQCAtNzAzNyw3ICs3MTMyLDcgQEAgcmVhc3NvY2lhdGVfYmIgKGJh c2ljX2Jsb2NrIGJiKQogCQkJCSB3aWR0aCk7CiAJCSAgICAgIHJld3JpdGVfZXhwcl90cmVlX3Bh cmFsbGVsIChhc19hIDxnYXNzaWduICo+IChzdG10KSwKIAkJCQkJCSAgd2lkdGgsCi0JCQkJCQkg IGhhc19mbWEsCisJCQkJCQkgIGZzLAogCQkJCQkJICBvcHMpOwogCQkgICAgfQogCQkgIGVsc2UK QEAgLTcwNDYsNyArNzE0MSw3IEBAIHJlYXNzb2NpYXRlX2JiIChiYXNpY19ibG9jayBiYikKIAkJ CSB0byBtYWtlIHN1cmUgdGhlIG9uZXMgdGhhdCBnZXQgdGhlIGRvdWJsZQogCQkJIGJpbmFyeSBv cCBhcmUgY2hvc2VuIHdpc2VseS4gICovCiAJCSAgICAgIGludCBsZW4gPSBvcHMubGVuZ3RoICgp OwotCQkgICAgICBpZiAobGVuID49IDMgJiYgIWhhc19mbWEpCisJCSAgICAgIGlmIChsZW4gPj0g MyAmJiBmcyA9PSBGTUFfU1RBVEVfTk9ORV9PUl9TSU5HTEUpCiAJCQlzd2FwX29wc19mb3JfYmlu YXJ5X3N0bXQgKG9wcywgbGVuIC0gMyk7CiAKIAkJICAgICAgbmV3X2xocyA9IHJld3JpdGVfZXhw cl90cmVlIChzdG10LCByaHNfY29kZSwgMCwgb3BzLAotLSAKMi4yNS4xCgo= --_002_SN6PR01MB424027B98B421FDB99448D29E81BASN6PR01MB4240prod_--