From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A89FAC64E7A for ; Tue, 24 Nov 2020 05:37:22 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F01B620719 for ; Tue, 24 Nov 2020 05:37:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=durhamuniversity.onmicrosoft.com header.i=@durhamuniversity.onmicrosoft.com header.b="Uvusl22B" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F01B620719 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=durham.ac.uk Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.35256.66855 (Exim 4.92) (envelope-from ) id 1khR0a-0002UT-4H; Tue, 24 Nov 2020 05:36:56 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 35256.66855; Tue, 24 Nov 2020 05:36:56 +0000 X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1khR0Z-0002UM-VV; Tue, 24 Nov 2020 05:36:56 +0000 Received: by outflank-mailman (input) for mailman id 35256; Mon, 23 Nov 2020 23:01:17 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1khKph-0004Nl-6z for xen-devel@lists.xenproject.org; Mon, 23 Nov 2020 23:01:17 +0000 Received: from GBR01-CWL-obe.outbound.protection.outlook.com (unknown [40.107.11.138]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 57239568-1c56-4dd2-b27e-8f870e3faafe; Mon, 23 Nov 2020 23:01:14 +0000 (UTC) Received: from LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:83::20) by LNXP265MB1177.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:87::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3589.25; Mon, 23 Nov 2020 23:01:12 +0000 Received: from LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM ([fe80::7956:7dd:b840:ac1b]) by LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM ([fe80::7956:7dd:b840:ac1b%6]) with mapi id 15.20.3564.034; Mon, 23 Nov 2020 23:01:12 +0000 Received: from broadband.bt.com (2a00:23c6:751d:7701:1f1a:39af:4235:7681) by LO2P265CA0246.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:8a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3589.20 via Frontend Transport; Mon, 23 Nov 2020 23:01:11 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1khKph-0004Nl-6z for xen-devel@lists.xenproject.org; Mon, 23 Nov 2020 23:01:17 +0000 X-Inumbo-ID: 57239568-1c56-4dd2-b27e-8f870e3faafe Received: from GBR01-CWL-obe.outbound.protection.outlook.com (unknown [40.107.11.138]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 57239568-1c56-4dd2-b27e-8f870e3faafe; Mon, 23 Nov 2020 23:01:14 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jz19VYN69Qkrn9d+NDqkEjtSWSOKMzD9CXnbZUKElSYCEhXOolN//Fsc3ManATZld7AscbdHedHXX72cD0/61+06OH84PWXJDxen7Vk9+avsGe5FrpsN6WoSLd/AIgp0PtgraBl1GEUsVwREqV6UTw8JasKkBcPJg/KV5NIzej5FHJTrPpb5B1kISgtSCaVLQtswbnFsIcSDV6rDYpLWiSnNcb3ypfDN4JqoKJjuV8uCGDG9aFNmLRN3GSYsDYx3qxJ+XMMz0fckLEABCCGjXj2ntl/EjZfCP5/1QZO8wd6AIJ/HQDJ995GDWgGY7I4AYA0gZrD7fGlP4enAJcOnAw== 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-SenderADCheck; bh=VF7SJocNMcMORPgv9hgiFHHhrj/jwlJ4yyENtKUR5/c=; b=FeZ3iVUF6fNt/UCEUbDvZ7CFuaujbOvjbRF0xGIsN36nfDQEyyCcCkYXZobi7uO8SWEoZn4Ui1Wp+Vq+Xj1GkO8bUbpzlJCmOu3HwxEIjxZ6EMiDKOQqbaMo8nC3Os+jfF8/QIBxpEFXgJ5fN3ME2hFXFY8INT1B73kgeC5dvad0jx05IvZC9SuHW0SBuXy9tIWPd/XKFwRU36bHMoLSQlhbJqRdhVfO2FIfBdzScFg2d5CfqIceYstoQSkfvq7glbX7vL3zN2MY6Vk6BHrgRETgCFonLPHC4QU9NR2t0baK8HKjRNj2pMwGmV8Q/VYDRuWaDAd6L5ZGyEb7tUIQzA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=durham.ac.uk; dmarc=pass action=none header.from=durham.ac.uk; dkim=pass header.d=durham.ac.uk; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=durhamuniversity.onmicrosoft.com; s=selector2-durhamuniversity-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VF7SJocNMcMORPgv9hgiFHHhrj/jwlJ4yyENtKUR5/c=; b=Uvusl22Bvs/tYmS4ZVpOU4+45Q1BwK/ZvIXkwcZLflaC3CVyYPy0grx+wQFancVQxpt+MCJppd7efTUKBpWMBEbXoZL6I8S104zkjyMC6QvV9pP1DPqRyCfdWTR9K4DS8EwbTbKycslj1c24sTlkDGvxB3Ka98XwSGCQ90T7zNw= Authentication-Results: citrix.com; dkim=none (message not signed) header.d=none;citrix.com; dmarc=none action=none header.from=durham.ac.uk; Received: from LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:83::20) by LNXP265MB1177.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:87::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3589.25; Mon, 23 Nov 2020 23:01:12 +0000 Received: from LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM ([fe80::7956:7dd:b840:ac1b]) by LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM ([fe80::7956:7dd:b840:ac1b%6]) with mapi id 15.20.3564.034; Mon, 23 Nov 2020 23:01:12 +0000 Date: Mon, 23 Nov 2020 23:01:09 +0000 (GMT) From: Michael Young To: Andrew Cooper cc: xen-devel@lists.xenproject.org Subject: Re: zstd compressed kernels In-Reply-To: <71d36766-1258-0a79-02ff-d888a41e431e@citrix.com> Message-ID: <6edb6c99-4289-b991-c767-333e376ce66@austen3.home> References: <1abcd9d-428f-93d-b63d-996ef4592723@austen3.home> <71d36766-1258-0a79-02ff-d888a41e431e@citrix.com> Content-Type: multipart/mixed; boundary="8323328-1543918517-1606172471=:3753" X-Originating-IP: [2a00:23c6:751d:7701:1f1a:39af:4235:7681] X-ClientProxiedBy: LO2P265CA0246.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:8a::18) To LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:83::20) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from broadband.bt.com (2a00:23c6:751d:7701:1f1a:39af:4235:7681) by LO2P265CA0246.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:8a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3589.20 via Frontend Transport; Mon, 23 Nov 2020 23:01:11 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4755ab6f-57ef-45ef-bc8f-08d89003abe0 X-MS-TrafficTypeDiagnostic: LNXP265MB1177: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5HXg4yz90ktkCyTMBDrdLH2qwt+hwzQ8qShIxedalzqLMb0/PiYIJ3f51gfyT9klRT5l4daVDVhsJdG/s1YuBx7a8gRp1t5ETPJHIqdz0E58g2FrPLlQFtTiQrLZ5tYSSyucoXlVyRqreiDXe92VxdvyZ5goXeUXD0LVs2+58NW2ksHWhjO04oVtXB/B+aaRjeEUZ0kGnhjT6G7KDFvclf7hNFYu0Ebe9Pzhflw8qCn369oR7R3EcQpH1uAgZjizu7AOpdguACF2Wj0RnfkiLBcgQh9tk/Sb/P0aCEFrtoYL64H7ph7CPuigjrpSbUAft2VqelpsABRelcGoiZHQn9Q3GQWTYrH26SlKcEIIPpm/9TPSxdiwQkTDkgJ1w/xO X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(4636009)(396003)(136003)(366004)(346002)(39860400002)(376002)(66576008)(4326008)(66556008)(66476007)(478600001)(52116002)(66946007)(6916009)(86362001)(8936002)(786003)(2906002)(3480700007)(316002)(7116003)(6506007)(5660300002)(235185007)(186003)(16526019)(8676002)(36756003)(6486002)(6512007)(9686003)(58440200005);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?6MviWVw/NI9lHNKvfmQj/EX6z6dfLmHKeKVFtTQXm8bvxz/wn7ht6Rnl9PTi?= =?us-ascii?Q?3OZEDEzeKn1RcpgZcq/csEQUkQqK11nK1xGxMwT5aQH1r+krlTvC/I6J3j0m?= =?us-ascii?Q?1I13/iemce+nuIwjyO7LKjYprZ14jHxD3FbQpuYuWqV4bGL0RyOm/dW2ZvSO?= =?us-ascii?Q?/JjH1XhnToTAKPZ2lx2j124KT6zp+og+tQMzYy2VJLV3Ig2Q7pH6x4V8D0ll?= =?us-ascii?Q?AlxNPlhGP5SN/OCN6ZVfPOKo7TrShNlrIr5rHcoeINXz6zD0mgDKXg8hktfN?= =?us-ascii?Q?CSwk61Sw1Me0xnUSEShSnDkNCS0DILy6CLftoueWqmE3bTAxTpr5050X7Hz5?= =?us-ascii?Q?rUpoxx2jujMDwoxINTM/zaPAgrLDALeoswXq6o3BZdWU7ox7jTp7UBRAicI2?= =?us-ascii?Q?dla5KFOkCRYcE4/Zmk4MkAfD6YzQ5sDhBh9hUf099TbE5/qv2fTaZisO9de3?= =?us-ascii?Q?uo6aR0gIu3x/X9Ec64CB5WIbCFTbb+wDyRRFN5eT0jc46o12yApy8VszXVTe?= =?us-ascii?Q?9W3ZYTxMEf5NkIq2nkI2GyGUj+RjdBeR9osewYgN8xeHF0TIIvzkDqM+gbQW?= =?us-ascii?Q?9pdGj7mpsyeVRW+9q1bDK7nvU3BuwqpzGPXGEM0b4Dj5kzLpfxUIXgR7kNyI?= =?us-ascii?Q?1rwcS8cmU8wrbuFM26pGP+X/SMZzEuUOXL7wiq1DPImk1O2pLf+zazKFc4bS?= =?us-ascii?Q?UQshMwq/bpoaUFbxkyCEmESScQv9wxC6ScRCw0zGkwBwKE5WBz3MqUZjbCib?= =?us-ascii?Q?iSzUUoc2nUBZif+QI+6Zh9LN8LAsywUAXiX50uA8p8u4sj6waWAukQujEXjY?= =?us-ascii?Q?MEAT8MTE/TlyC9VRC+SWkTGQlNRA1UoX+/mjhLPtmkdYEvuldCKV1qJ/vcaR?= =?us-ascii?Q?/R6cfLiln/NlLy0mQYNgfN8Woo/uroRvXDpIlcWYTSawgqHQ7hveRUpCexzB?= =?us-ascii?Q?ToQxfpe35QsE5kyw/J4sMg=3D=3D?= X-OriginatorOrg: durham.ac.uk X-MS-Exchange-CrossTenant-Network-Message-Id: 4755ab6f-57ef-45ef-bc8f-08d89003abe0 X-MS-Exchange-CrossTenant-AuthSource: LNXP265MB0924.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Nov 2020 23:01:12.4584 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7250d88b-4b68-4529-be44-d59a2d8a6f94 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: tWHZzdtnVBELmULRJmIUEVpzhwrX9cgI4TFY7vluS9QxAdLGb2xOXIswv1sFQFDSGWJ8zwl5fXL/hfuxRof1yQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LNXP265MB1177 --8323328-1543918517-1606172471=:3753 Content-Type: text/plain; charset=US-ASCII; format=flowed On Tue, 17 Nov 2020, Andrew Cooper wrote: > If you're willing to have a go: > > For dom0 support, port Linux's decompressor into xen/common/ and plumb > it into xen/common/decompress.c > > For domU's, tools/libs/guest/xg_dom_bzimageloader.c and > xc_dom_probe_bzimage_kernel() Here is what I have so far. It works for me with a dom0 boot, though only after I reduced the the setting of the maximum decompressed size (out_len) from LONG_MAX to INT_MAX. The patches aren't intended to be final, and I suspect there may need to be adjustments for guest support. Michael Young --8323328-1543918517-1606172471=:3753 Content-Type: text/plain; charset=US-ASCII; name=0001-import-zstd-decompress-code-from-fedora-kernel-kerne.patch Content-Transfer-Encoding: BASE64 Content-ID: <716075c8-bcc5-b44b-a261-4b103cb7a97e@austen3.home> Content-Description: Content-Disposition: attachment; filename=0001-import-zstd-decompress-code-from-fedora-kernel-kerne.patch RnJvbSAxZDRkNzZhOTk3MWZiYzM1ODg3NWQ5NTU0M2Q2YWE3ZDhlNzI3YmE0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQ0KTWVzc2FnZS1JZDogPDFkNGQ3NmE5OTcxZmJjMzU4ODc1ZDk1NTQzZDZh YTdkOGU3MjdiYTQuMTYwNjE3MDgzNC5naXQubS5hLnlvdW5nQGR1cmhhbS5hYy51az4NCkZyb206 IE1pY2hhZWwgWW91bmcgPG0uYS55b3VuZ0BkdXJoYW0uYWMudWs+DQpEYXRlOiBTYXQsIDIxIE5v diAyMDIwIDIwOjI4OjU0ICswMDAwDQpTdWJqZWN0OiBbWEVOIFBBVENIIDEvMl0gaW1wb3J0IHpz dGQgZGVjb21wcmVzcyBjb2RlIGZyb20gZmVkb3JhIGtlcm5lbA0KIGtlcm5lbC01LjkuOC0yMDAu ZmMzMw0KDQotLS0NCiB4ZW4vY29tbW9uL2RlY29tcHJlc3NfdW56c3RkLmMgICB8ICAzNDUgKysr Kw0KIHhlbi9jb21tb24veHhoYXNoLmMgICAgICAgICAgICAgIHwgIDUwMCArKysrKysNCiB4ZW4v Y29tbW9uL3pzdGQvYml0c3RyZWFtLmggICAgICB8ICAzNzkgKysrKysNCiB4ZW4vY29tbW9uL3pz dGQvZGVjb21wcmVzcy5jICAgICB8IDI1MzEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr DQogeGVuL2NvbW1vbi96c3RkL2VudHJvcHlfY29tbW9uLmMgfCAgMjQzICsrKw0KIHhlbi9jb21t b24venN0ZC9lcnJvcl9wcml2YXRlLmggIHwgICA1MyArDQogeGVuL2NvbW1vbi96c3RkL2ZzZS5o ICAgICAgICAgICAgfCAgNTc1ICsrKysrKysNCiB4ZW4vY29tbW9uL3pzdGQvZnNlX2RlY29tcHJl c3MuYyB8ICAzMjUgKysrKw0KIHhlbi9jb21tb24venN0ZC9odWYuaCAgICAgICAgICAgIHwgIDIx MiArKysNCiB4ZW4vY29tbW9uL3pzdGQvaHVmX2RlY29tcHJlc3MuYyB8ICA5NjAgKysrKysrKysr KysNCiB4ZW4vY29tbW9uL3pzdGQvbWVtLmggICAgICAgICAgICB8ICAxNTEgKysNCiB4ZW4vY29t bW9uL3pzdGQvenN0ZF9jb21tb24uYyAgICB8ICAgNzUgKw0KIHhlbi9jb21tb24venN0ZC96c3Rk X2ludGVybmFsLmggIHwgIDI3MyArKysrDQogeGVuL2NvbW1vbi96c3RkL3pzdGRfb3B0LmggICAg ICAgfCAxMDE0ICsrKysrKysrKysrKw0KIHhlbi9pbmNsdWRlL3hlbi94eGhhc2guaCAgICAgICAg IHwgIDI1OSArKysNCiB4ZW4vaW5jbHVkZS94ZW4venN0ZC5oICAgICAgICAgICB8IDExNTcgKysr KysrKysrKysrKysNCiAxNiBmaWxlcyBjaGFuZ2VkLCA5MDUyIGluc2VydGlvbnMoKykNCiBjcmVh dGUgbW9kZSAxMDA2NDQgeGVuL2NvbW1vbi9kZWNvbXByZXNzX3VuenN0ZC5jDQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHhlbi9jb21tb24veHhoYXNoLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2Nv bW1vbi96c3RkL2JpdHN0cmVhbS5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9jb21tb24venN0 ZC9kZWNvbXByZXNzLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2NvbW1vbi96c3RkL2VudHJv cHlfY29tbW9uLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2NvbW1vbi96c3RkL2Vycm9yX3By aXZhdGUuaA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vY29tbW9uL3pzdGQvZnNlLmgNCiBjcmVh dGUgbW9kZSAxMDA2NDQgeGVuL2NvbW1vbi96c3RkL2ZzZV9kZWNvbXByZXNzLmMNCiBjcmVhdGUg bW9kZSAxMDA2NDQgeGVuL2NvbW1vbi96c3RkL2h1Zi5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHhl bi9jb21tb24venN0ZC9odWZfZGVjb21wcmVzcy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9j b21tb24venN0ZC9tZW0uaA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vY29tbW9uL3pzdGQvenN0 ZF9jb21tb24uYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vY29tbW9uL3pzdGQvenN0ZF9pbnRl cm5hbC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9jb21tb24venN0ZC96c3RkX29wdC5oDQog Y3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9pbmNsdWRlL3hlbi94eGhhc2guaA0KIGNyZWF0ZSBtb2Rl IDEwMDY0NCB4ZW4vaW5jbHVkZS94ZW4venN0ZC5oDQoNCmRpZmYgLS1naXQgYS94ZW4vY29tbW9u L2RlY29tcHJlc3NfdW56c3RkLmMgYi94ZW4vY29tbW9uL2RlY29tcHJlc3NfdW56c3RkLmMNCm5l dyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi4wYWQyYzE1NDc5DQotLS0gL2Rl di9udWxsDQorKysgYi94ZW4vY29tbW9uL2RlY29tcHJlc3NfdW56c3RkLmMNCkBAIC0wLDAgKzEs MzQ1IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCisNCisvKg0KKyAq IEltcG9ydGFudCBub3RlcyBhYm91dCBpbi1wbGFjZSBkZWNvbXByZXNzaW9uDQorICoNCisgKiBB dCBsZWFzdCBvbiB4ODYsIHRoZSBrZXJuZWwgaXMgZGVjb21wcmVzc2VkIGluIHBsYWNlOiB0aGUg Y29tcHJlc3NlZCBkYXRhDQorICogaXMgcGxhY2VkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBi dWZmZXIsIGFuZCB0aGUgZGVjb21wcmVzc29yIG92ZXJ3cml0ZXMNCisgKiBtb3N0IG9mIHRoZSBj b21wcmVzc2VkIGRhdGEuIFRoZXJlIG11c3QgYmUgZW5vdWdoIHNhZmV0eSBtYXJnaW4gdG8NCisg KiBndWFyYW50ZWUgdGhhdCB0aGUgd3JpdGUgcG9zaXRpb24gaXMgYWx3YXlzIGJlaGluZCB0aGUg cmVhZCBwb3NpdGlvbi4NCisgKg0KKyAqIFRoZSBzYWZldHkgbWFyZ2luIGZvciBaU1REIHdpdGgg YSAxMjggS0IgYmxvY2sgc2l6ZSBpcyBjYWxjdWxhdGVkIGJlbG93Lg0KKyAqIE5vdGUgdGhhdCB0 aGUgbWFyZ2luIHdpdGggWlNURCBpcyBiaWdnZXIgdGhhbiB3aXRoIEdaSVAgb3IgWFohDQorICoN CisgKiBUaGUgd29yc3QgY2FzZSBmb3IgaW4tcGxhY2UgZGVjb21wcmVzc2lvbiBpcyB0aGF0IHRo ZSBiZWdpbm5pbmcgb2YNCisgKiB0aGUgZmlsZSBpcyBjb21wcmVzc2VkIGV4dHJlbWVseSB3ZWxs LCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgaXMNCisgKiB1bmNvbXByZXNzaWJsZS4gVGh1cywg d2UgbXVzdCBsb29rIGZvciB3b3JzdC1jYXNlIGV4cGFuc2lvbiB3aGVuIHRoZQ0KKyAqIGNvbXBy ZXNzb3IgaXMgZW5jb2RpbmcgdW5jb21wcmVzc2libGUgZGF0YS4NCisgKg0KKyAqIFRoZSBzdHJ1 Y3R1cmUgb2YgdGhlIC56c3QgZmlsZSBpbiBjYXNlIG9mIGEgY29tcHJlc2VkIGtlcm5lbCBpcyBh cyBmb2xsb3dzLg0KKyAqIE1heGltdW0gc2l6ZXMgKGFzIGJ5dGVzKSBvZiB0aGUgZmllbGRzIGFy ZSBpbiBwYXJlbnRoZXNpcy4NCisgKg0KKyAqICAgIEZyYW1lIEhlYWRlcjogKDE4KQ0KKyAqICAg IEJsb2NrczogKE4pDQorICogICAgQ2hlY2tzdW06ICg0KQ0KKyAqDQorICogVGhlIGZyYW1lIGhl YWRlciBhbmQgY2hlY2tzdW0gb3ZlcmhlYWQgaXMgYXQgbW9zdCAyMiBieXRlcy4NCisgKg0KKyAq IFpTVEQgc3RvcmVzIHRoZSBkYXRhIGluIGJsb2Nrcy4gRWFjaCBibG9jayBoYXMgYSBoZWFkZXIg d2hvc2Ugc2l6ZSBpcw0KKyAqIGEgMyBieXRlcy4gQWZ0ZXIgdGhlIGJsb2NrIGhlYWRlciwgdGhl cmUgaXMgdXAgdG8gMTI4IEtCIG9mIHBheWxvYWQuDQorICogVGhlIG1heGltdW0gdW5jb21wcmVz c2VkIHNpemUgb2YgdGhlIHBheWxvYWQgaXMgMTI4IEtCLiBUaGUgbWluaW11bQ0KKyAqIHVuY29t cHJlc3NlZCBzaXplIG9mIHRoZSBwYXlsb2FkIGlzIG5ldmVyIGxlc3MgdGhhbiB0aGUgcGF5bG9h ZCBzaXplDQorICogKGV4Y2x1ZGluZyB0aGUgYmxvY2sgaGVhZGVyKS4NCisgKg0KKyAqIFRoZSBh c3N1bXB0aW9uLCB0aGF0IHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpcyBu ZXZlcg0KKyAqIHNtYWxsZXIgdGhhbiB0aGUgcGF5bG9hZCBpdHNlbGYsIGlzIHZhbGlkIG9ubHkg d2hlbiB0YWxraW5nIGFib3V0DQorICogdGhlIHBheWxvYWQgYXMgYSB3aG9sZS4gSXQgaXMgcG9z c2libGUgdGhhdCB0aGUgcGF5bG9hZCBoYXMgcGFydHMgd2hlcmUNCisgKiB0aGUgZGVjb21wcmVz c29yIGNvbnN1bWVzIG1vcmUgaW5wdXQgdGhhbiBpdCBwcm9kdWNlcyBvdXRwdXQuIENhbGN1bGF0 aW5nDQorICogdGhlIHdvcnN0IGNhc2UgZm9yIHRoaXMgd291bGQgYmUgdHJpY2t5LiBJbnN0ZWFk IG9mIHRyeWluZyB0byBkbyB0aGF0LA0KKyAqIGxldCdzIHNpbXBseSBtYWtlIHN1cmUgdGhhdCB0 aGUgZGVjb21wcmVzc29yIG5ldmVyIG92ZXJ3cml0ZXMgYW55IGJ5dGVzDQorICogb2YgdGhlIHBh eWxvYWQgd2hpY2ggaXQgaXMgY3VycmVudGx5IHJlYWRpbmcuDQorICoNCisgKiBOb3cgd2UgaGF2 ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBzYWZldHkgbWFyZ2luLiBXZSBu ZWVkDQorICogICAtIDIyIGJ5dGVzIGZvciB0aGUgLnpzdCBmaWxlIGZvcm1hdCBoZWFkZXJzOw0K KyAqICAgLSAzIGJ5dGVzIHBlciBldmVyeSAxMjggS2lCIG9mIHVuY29tcHJlc3NlZCBzaXplIChv bmUgYmxvY2sgaGVhZGVyIHBlcg0KKyAqICAgICBibG9jayk7IGFuZA0KKyAqICAgLSAxMjggS2lC IChiaWdnZXN0IHBvc3NpYmxlIHpzdGQgYmxvY2sgc2l6ZSkgdG8gbWFrZSBzdXJlIHRoYXQgdGhl DQorICogICAgIGRlY29tcHJlc3NvciBuZXZlciBvdmVyd3JpdGVzIGFueXRoaW5nIGZyb20gdGhl IGJsb2NrIGl0IGlzIGN1cnJlbnRseQ0KKyAqICAgICByZWFkaW5nLg0KKyAqDQorICogV2UgZ2V0 IHRoZSBmb2xsb3dpbmcgZm9ybXVsYToNCisgKg0KKyAqICAgIHNhZmV0eV9tYXJnaW4gPSAyMiAr IHVuY29tcHJlc3NlZF9zaXplICogMyAvIDEzMTA3MiArIDEzMTA3Mg0KKyAqICAgICAgICAgICAg ICAgICA8PSAyMiArICh1bmNvbXByZXNzZWRfc2l6ZSA+PiAxNSkgKyAxMzEwNzINCisgKi8NCisN CisvKg0KKyAqIFByZWJvb3QgZW52aXJvbm1lbnRzICNpbmNsdWRlICJwYXRoL3RvL2RlY29tcHJl c3NfdW56c3RkLmMiLg0KKyAqIEFsbCBvZiB0aGUgc291cmNlIGZpbGVzIHdlIGRlcGVuZCBvbiBt dXN0IGJlICNpbmNsdWRlZC4NCisgKiB6c3RkJ3Mgb25seSBzb3VyY2UgZGVwZW5kZW55IGlzIHh4 aGFzaCwgd2hpY2ggaGFzIG5vIHNvdXJjZQ0KKyAqIGRlcGVuZGVuY2llcy4NCisgKg0KKyAqIFdo ZW4gVU5aU1REX1BSRUJPT1QgaXMgZGVmaW5lZCB3ZSBkZWNsYXJlIF9fZGVjb21wcmVzcygpLCB3 aGljaCBpcw0KKyAqIHVzZWQgZm9yIGtlcm5lbCBkZWNvbXByZXNzaW9uLCBpbnN0ZWFkIG9mIHVu enN0ZCgpLg0KKyAqDQorICogRGVmaW5lIF9fRElTQUJMRV9FWFBPUlRTIGluIHByZWJvb3QgZW52 aXJvbm1lbnRzIHRvIHByZXZlbnQgc3ltYm9scw0KKyAqIGZyb20geHhoYXNoIGFuZCB6c3RkIGZy b20gYmVpbmcgZXhwb3J0ZWQgYnkgdGhlIEVYUE9SVF9TWU1CT0wgbWFjcm8uDQorICovDQorI2lm ZGVmIFNUQVRJQw0KKyMgZGVmaW5lIFVOWlNURF9QUkVCT09UDQorIyBpbmNsdWRlICJ4eGhhc2gu YyINCisjIGluY2x1ZGUgInpzdGQvZW50cm9weV9jb21tb24uYyINCisjIGluY2x1ZGUgInpzdGQv ZnNlX2RlY29tcHJlc3MuYyINCisjIGluY2x1ZGUgInpzdGQvaHVmX2RlY29tcHJlc3MuYyINCisj IGluY2x1ZGUgInpzdGQvenN0ZF9jb21tb24uYyINCisjIGluY2x1ZGUgInpzdGQvZGVjb21wcmVz cy5jIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL21tLmg+DQorI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0KKyNpbmNsdWRlIDxsaW51eC96c3RkLmg+DQorDQorLyog MTI4TUIgaXMgdGhlIG1heGltdW0gd2luZG93IHNpemUgc3VwcG9ydGVkIGJ5IHpzdGQuICovDQor I2RlZmluZSBaU1REX1dJTkRPV1NJWkVfTUFYCSgxIDw8IFpTVERfV0lORE9XTE9HX01BWCkNCisv Kg0KKyAqIFNpemUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBpbiBtdWx0aS1jYWxs IG1vZGUuDQorICogUGljayBhIGxhcmdlciBzaXplIGJlY2F1c2UgaXQgaXNuJ3QgdXNlZCBkdXJp bmcga2VybmVsIGRlY29tcHJlc3Npb24sDQorICogc2luY2UgdGhhdCBpcyBzaW5nbGUgcGFzcywg YW5kIHdlIGhhdmUgdG8gYWxsb2NhdGUgYSBsYXJnZSBidWZmZXIgZm9yDQorICogenN0ZCdzIHdp bmRvdyBhbnl3YXkuIFRoZSBsYXJnZXIgc2l6ZSBzcGVlZHMgdXAgaW5pdHJhbWZzIGRlY29tcHJl c3Npb24uDQorICovDQorI2RlZmluZSBaU1REX0lPQlVGX1NJWkUJCSgxIDw8IDE3KQ0KKw0KK3N0 YXRpYyBpbnQgSU5JVCBoYW5kbGVfenN0ZF9lcnJvcihzaXplX3QgcmV0LCB2b2lkICgqZXJyb3Ip KGNoYXIgKngpKQ0KK3sNCisJY29uc3QgaW50IGVyciA9IFpTVERfZ2V0RXJyb3JDb2RlKHJldCk7 DQorDQorCWlmICghWlNURF9pc0Vycm9yKHJldCkpDQorCQlyZXR1cm4gMDsNCisNCisJc3dpdGNo IChlcnIpIHsNCisJY2FzZSBaU1REX2Vycm9yX21lbW9yeV9hbGxvY2F0aW9uOg0KKwkJZXJyb3Io IlpTVEQgZGVjb21wcmVzc29yIHJhbiBvdXQgb2YgbWVtb3J5Iik7DQorCQlicmVhazsNCisJY2Fz ZSBaU1REX2Vycm9yX3ByZWZpeF91bmtub3duOg0KKwkJZXJyb3IoIklucHV0IGlzIG5vdCBpbiB0 aGUgWlNURCBmb3JtYXQgKHdyb25nIG1hZ2ljIGJ5dGVzKSIpOw0KKwkJYnJlYWs7DQorCWNhc2Ug WlNURF9lcnJvcl9kc3RTaXplX3Rvb1NtYWxsOg0KKwljYXNlIFpTVERfZXJyb3JfY29ycnVwdGlv bl9kZXRlY3RlZDoNCisJY2FzZSBaU1REX2Vycm9yX2NoZWNrc3VtX3dyb25nOg0KKwkJZXJyb3Io IlpTVEQtY29tcHJlc3NlZCBkYXRhIGlzIGNvcnJ1cHQiKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0 Og0KKwkJZXJyb3IoIlpTVEQtY29tcHJlc3NlZCBkYXRhIGlzIHByb2JhYmx5IGNvcnJ1cHQiKTsN CisJCWJyZWFrOw0KKwl9DQorCXJldHVybiAtMTsNCit9DQorDQorLyoNCisgKiBIYW5kbGUgdGhl IGNhc2Ugd2hlcmUgd2UgaGF2ZSB0aGUgZW50aXJlIGlucHV0IGFuZCBvdXRwdXQgaW4gb25lIHNl Z21lbnQuDQorICogV2UgY2FuIGFsbG9jYXRlIGxlc3MgbWVtb3J5IChubyBjaXJjdWxhciBidWZm ZXIgZm9yIHRoZSBzbGlkaW5nIHdpbmRvdyksDQorICogYW5kIGF2b2lkIHNvbWUgbWVtY3B5KCkg Y2FsbHMuDQorICovDQorc3RhdGljIGludCBJTklUIGRlY29tcHJlc3Nfc2luZ2xlKGNvbnN0IHU4 ICppbl9idWYsIGxvbmcgaW5fbGVuLCB1OCAqb3V0X2J1ZiwNCisJCQkJICBsb25nIG91dF9sZW4s IGxvbmcgKmluX3BvcywNCisJCQkJICB2b2lkICgqZXJyb3IpKGNoYXIgKngpKQ0KK3sNCisJY29u c3Qgc2l6ZV90IHdrc3Bfc2l6ZSA9IFpTVERfREN0eFdvcmtzcGFjZUJvdW5kKCk7DQorCXZvaWQg Kndrc3AgPSBsYXJnZV9tYWxsb2Mod2tzcF9zaXplKTsNCisJWlNURF9EQ3R4ICpkY3R4ID0gWlNU RF9pbml0REN0eCh3a3NwLCB3a3NwX3NpemUpOw0KKwlpbnQgZXJyOw0KKwlzaXplX3QgcmV0Ow0K Kw0KKwlpZiAoZGN0eCA9PSBOVUxMKSB7DQorCQllcnJvcigiT3V0IG9mIG1lbW9yeSB3aGlsZSBh bGxvY2F0aW5nIFpTVERfREN0eCIpOw0KKwkJZXJyID0gLTE7DQorCQlnb3RvIG91dDsNCisJfQ0K KwkvKg0KKwkgKiBGaW5kIG91dCBob3cgbGFyZ2UgdGhlIGZyYW1lIGFjdHVhbGx5IGlzLCB0aGVy ZSBtYXkgYmUganVuayBhdA0KKwkgKiB0aGUgZW5kIG9mIHRoZSBmcmFtZSB0aGF0IFpTVERfZGVj b21wcmVzc0RDdHgoKSBjYW4ndCBoYW5kbGUuDQorCSAqLw0KKwlyZXQgPSBaU1REX2ZpbmRGcmFt ZUNvbXByZXNzZWRTaXplKGluX2J1ZiwgaW5fbGVuKTsNCisJZXJyID0gaGFuZGxlX3pzdGRfZXJy b3IocmV0LCBlcnJvcik7DQorCWlmIChlcnIpDQorCQlnb3RvIG91dDsNCisJaW5fbGVuID0gKGxv bmcpcmV0Ow0KKw0KKwlyZXQgPSBaU1REX2RlY29tcHJlc3NEQ3R4KGRjdHgsIG91dF9idWYsIG91 dF9sZW4sIGluX2J1ZiwgaW5fbGVuKTsNCisJZXJyID0gaGFuZGxlX3pzdGRfZXJyb3IocmV0LCBl cnJvcik7DQorCWlmIChlcnIpDQorCQlnb3RvIG91dDsNCisNCisJaWYgKGluX3BvcyAhPSBOVUxM KQ0KKwkJKmluX3BvcyA9IGluX2xlbjsNCisNCisJZXJyID0gMDsNCitvdXQ6DQorCWlmICh3a3Nw ICE9IE5VTEwpDQorCQlsYXJnZV9mcmVlKHdrc3ApOw0KKwlyZXR1cm4gZXJyOw0KK30NCisNCitz dGF0aWMgaW50IElOSVQgX191bnpzdGQodW5zaWduZWQgY2hhciAqaW5fYnVmLCBsb25nIGluX2xl biwNCisJCQkgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwNCisJCQkgbG9uZyAo KmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksDQorCQkJIHVuc2lnbmVkIGNoYXIgKm91dF9i dWYsIGxvbmcgb3V0X2xlbiwNCisJCQkgbG9uZyAqaW5fcG9zLA0KKwkJCSB2b2lkICgqZXJyb3Ip KGNoYXIgKngpKQ0KK3sNCisJWlNURF9pbkJ1ZmZlciBpbjsNCisJWlNURF9vdXRCdWZmZXIgb3V0 Ow0KKwlaU1REX2ZyYW1lUGFyYW1zIHBhcmFtczsNCisJdm9pZCAqaW5fYWxsb2NhdGVkID0gTlVM TDsNCisJdm9pZCAqb3V0X2FsbG9jYXRlZCA9IE5VTEw7DQorCXZvaWQgKndrc3AgPSBOVUxMOw0K KwlzaXplX3Qgd2tzcF9zaXplOw0KKwlaU1REX0RTdHJlYW0gKmRzdHJlYW07DQorCWludCBlcnI7 DQorCXNpemVfdCByZXQ7DQorDQorCWlmIChvdXRfbGVuID09IDApDQorCQlvdXRfbGVuID0gTE9O R19NQVg7IC8qIG5vIGxpbWl0ICovDQorDQorCWlmIChmaWxsID09IE5VTEwgJiYgZmx1c2ggPT0g TlVMTCkNCisJCS8qDQorCQkgKiBXZSBjYW4gZGVjb21wcmVzcyBmYXN0ZXIgYW5kIHdpdGggbGVz cyBtZW1vcnkgd2hlbiB3ZSBoYXZlIGENCisJCSAqIHNpbmdsZSBjaHVuay4NCisJCSAqLw0KKwkJ cmV0dXJuIGRlY29tcHJlc3Nfc2luZ2xlKGluX2J1ZiwgaW5fbGVuLCBvdXRfYnVmLCBvdXRfbGVu LA0KKwkJCQkJIGluX3BvcywgZXJyb3IpOw0KKw0KKwkvKg0KKwkgKiBJZiBpbl9idWYgaXMgbm90 IHByb3ZpZGVkLCB3ZSBtdXN0IGJlIHVzaW5nIGZpbGwoKSwgc28gYWxsb2NhdGUNCisJICogYSBs YXJnZSBlbm91Z2ggYnVmZmVyLiBJZiBpdCBpcyBwcm92aWRlZCwgaXQgbXVzdCBiZSBhdCBsZWFz dA0KKwkgKiBaU1REX0lPQlVGX1NJWkUgbGFyZ2UuDQorCSAqLw0KKwlpZiAoaW5fYnVmID09IE5V TEwpIHsNCisJCWluX2FsbG9jYXRlZCA9IGxhcmdlX21hbGxvYyhaU1REX0lPQlVGX1NJWkUpOw0K KwkJaWYgKGluX2FsbG9jYXRlZCA9PSBOVUxMKSB7DQorCQkJZXJyb3IoIk91dCBvZiBtZW1vcnkg d2hpbGUgYWxsb2NhdGluZyBpbnB1dCBidWZmZXIiKTsNCisJCQllcnIgPSAtMTsNCisJCQlnb3Rv IG91dDsNCisJCX0NCisJCWluX2J1ZiA9IGluX2FsbG9jYXRlZDsNCisJCWluX2xlbiA9IDA7DQor CX0NCisJLyogUmVhZCB0aGUgZmlyc3QgY2h1bmssIHNpbmNlIHdlIG5lZWQgdG8gZGVjb2RlIHRo ZSBmcmFtZSBoZWFkZXIuICovDQorCWlmIChmaWxsICE9IE5VTEwpDQorCQlpbl9sZW4gPSBmaWxs KGluX2J1ZiwgWlNURF9JT0JVRl9TSVpFKTsNCisJaWYgKGluX2xlbiA8IDApIHsNCisJCWVycm9y KCJaU1RELWNvbXByZXNzZWQgZGF0YSBpcyB0cnVuY2F0ZWQiKTsNCisJCWVyciA9IC0xOw0KKwkJ Z290byBvdXQ7DQorCX0NCisJLyogU2V0IHRoZSBmaXJzdCBub24tZW1wdHkgaW5wdXQgYnVmZmVy LiAqLw0KKwlpbi5zcmMgPSBpbl9idWY7DQorCWluLnBvcyA9IDA7DQorCWluLnNpemUgPSBpbl9s ZW47DQorCS8qIEFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyIGlmIHdlIGFyZSB1c2luZyBmbHVz aCgpLiAqLw0KKwlpZiAoZmx1c2ggIT0gTlVMTCkgew0KKwkJb3V0X2FsbG9jYXRlZCA9IGxhcmdl X21hbGxvYyhaU1REX0lPQlVGX1NJWkUpOw0KKwkJaWYgKG91dF9hbGxvY2F0ZWQgPT0gTlVMTCkg ew0KKwkJCWVycm9yKCJPdXQgb2YgbWVtb3J5IHdoaWxlIGFsbG9jYXRpbmcgb3V0cHV0IGJ1ZmZl ciIpOw0KKwkJCWVyciA9IC0xOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKwkJb3V0X2J1ZiA9IG91 dF9hbGxvY2F0ZWQ7DQorCQlvdXRfbGVuID0gWlNURF9JT0JVRl9TSVpFOw0KKwl9DQorCS8qIFNl dCB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8NCisJb3V0LmRzdCA9IG91dF9idWY7DQorCW91dC5wb3Mg PSAwOw0KKwlvdXQuc2l6ZSA9IG91dF9sZW47DQorDQorCS8qDQorCSAqIFdlIG5lZWQgdG8ga25v dyB0aGUgd2luZG93IHNpemUgdG8gYWxsb2NhdGUgdGhlIFpTVERfRFN0cmVhbS4NCisJICogU2lu Y2Ugd2UgYXJlIHN0cmVhbWluZywgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhl IHNsaWRpbmcNCisJICogd2luZG93LiBUaGUgd2luZG93IHNpemUgdmFyaWVzIGZyb20gMSBLQiB0 byBaU1REX1dJTkRPV1NJWkVfTUFYDQorCSAqICg4IE1CKSwgc28gaXQgaXMgaW1wb3J0YW50IHRv IHVzZSB0aGUgYWN0dWFsIHZhbHVlIHNvIGFzIG5vdCB0bw0KKwkgKiB3YXN0ZSBtZW1vcnkgd2hl biBpdCBpcyBzbWFsbGVyLg0KKwkgKi8NCisJcmV0ID0gWlNURF9nZXRGcmFtZVBhcmFtcygmcGFy YW1zLCBpbi5zcmMsIGluLnNpemUpOw0KKwllcnIgPSBoYW5kbGVfenN0ZF9lcnJvcihyZXQsIGVy cm9yKTsNCisJaWYgKGVycikNCisJCWdvdG8gb3V0Ow0KKwlpZiAocmV0ICE9IDApIHsNCisJCWVy cm9yKCJaU1RELWNvbXByZXNzZWQgZGF0YSBoYXMgYW4gaW5jb21wbGV0ZSBmcmFtZSBoZWFkZXIi KTsNCisJCWVyciA9IC0xOw0KKwkJZ290byBvdXQ7DQorCX0NCisJaWYgKHBhcmFtcy53aW5kb3dT aXplID4gWlNURF9XSU5ET1dTSVpFX01BWCkgew0KKwkJZXJyb3IoIlpTVEQtY29tcHJlc3NlZCBk YXRhIGhhcyB0b28gbGFyZ2UgYSB3aW5kb3cgc2l6ZSIpOw0KKwkJZXJyID0gLTE7DQorCQlnb3Rv IG91dDsNCisJfQ0KKw0KKwkvKg0KKwkgKiBBbGxvY2F0ZSB0aGUgWlNURF9EU3RyZWFtIG5vdyB0 aGF0IHdlIGtub3cgaG93IG11Y2ggbWVtb3J5IGlzDQorCSAqIHJlcXVpcmVkLg0KKwkgKi8NCisJ d2tzcF9zaXplID0gWlNURF9EU3RyZWFtV29ya3NwYWNlQm91bmQocGFyYW1zLndpbmRvd1NpemUp Ow0KKwl3a3NwID0gbGFyZ2VfbWFsbG9jKHdrc3Bfc2l6ZSk7DQorCWRzdHJlYW0gPSBaU1REX2lu aXREU3RyZWFtKHBhcmFtcy53aW5kb3dTaXplLCB3a3NwLCB3a3NwX3NpemUpOw0KKwlpZiAoZHN0 cmVhbSA9PSBOVUxMKSB7DQorCQllcnJvcigiT3V0IG9mIG1lbW9yeSB3aGlsZSBhbGxvY2F0aW5n IFpTVERfRFN0cmVhbSIpOw0KKwkJZXJyID0gLTE7DQorCQlnb3RvIG91dDsNCisJfQ0KKw0KKwkv Kg0KKwkgKiBEZWNvbXByZXNzaW9uIGxvb3A6DQorCSAqIFJlYWQgbW9yZSBkYXRhIGlmIG5lY2Vz c2FyeSAoZXJyb3IgaWYgbm8gbW9yZSBkYXRhIGNhbiBiZSByZWFkKS4NCisJICogQ2FsbCB0aGUg ZGVjb21wcmVzc2lvbiBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyAwIHdoZW4gZmluaXNoZWQuDQor CSAqIEZsdXNoIGFueSBkYXRhIHByb2R1Y2VkIGlmIHVzaW5nIGZsdXNoKCkuDQorCSAqLw0KKwlp ZiAoaW5fcG9zICE9IE5VTEwpDQorCQkqaW5fcG9zID0gMDsNCisJZG8gew0KKwkJLyoNCisJCSAq IElmIHdlIG5lZWQgdG8gcmVsb2FkIGRhdGEsIGVpdGhlciB3ZSBoYXZlIGZpbGwoKSBhbmQgY2Fu DQorCQkgKiB0cnkgdG8gZ2V0IG1vcmUgZGF0YSwgb3Igd2UgZG9uJ3QgYW5kIHRoZSBpbnB1dCBp cyB0cnVuY2F0ZWQuDQorCQkgKi8NCisJCWlmIChpbi5wb3MgPT0gaW4uc2l6ZSkgew0KKwkJCWlm IChpbl9wb3MgIT0gTlVMTCkNCisJCQkJKmluX3BvcyArPSBpbi5wb3M7DQorCQkJaW5fbGVuID0g ZmlsbCA/IGZpbGwoaW5fYnVmLCBaU1REX0lPQlVGX1NJWkUpIDogLTE7DQorCQkJaWYgKGluX2xl biA8IDApIHsNCisJCQkJZXJyb3IoIlpTVEQtY29tcHJlc3NlZCBkYXRhIGlzIHRydW5jYXRlZCIp Ow0KKwkJCQllcnIgPSAtMTsNCisJCQkJZ290byBvdXQ7DQorCQkJfQ0KKwkJCWluLnBvcyA9IDA7 DQorCQkJaW4uc2l6ZSA9IGluX2xlbjsNCisJCX0NCisJCS8qIFJldHVybnMgemVybyB3aGVuIHRo ZSBmcmFtZSBpcyBjb21wbGV0ZS4gKi8NCisJCXJldCA9IFpTVERfZGVjb21wcmVzc1N0cmVhbShk c3RyZWFtLCAmb3V0LCAmaW4pOw0KKwkJZXJyID0gaGFuZGxlX3pzdGRfZXJyb3IocmV0LCBlcnJv cik7DQorCQlpZiAoZXJyKQ0KKwkJCWdvdG8gb3V0Ow0KKwkJLyogRmx1c2ggYWxsIG9mIHRoZSBk YXRhIHByb2R1Y2VkIGlmIHVzaW5nIGZsdXNoKCkuICovDQorCQlpZiAoZmx1c2ggIT0gTlVMTCAm JiBvdXQucG9zID4gMCkgew0KKwkJCWlmIChvdXQucG9zICE9IGZsdXNoKG91dC5kc3QsIG91dC5w b3MpKSB7DQorCQkJCWVycm9yKCJGYWlsZWQgdG8gZmx1c2goKSIpOw0KKwkJCQllcnIgPSAtMTsN CisJCQkJZ290byBvdXQ7DQorCQkJfQ0KKwkJCW91dC5wb3MgPSAwOw0KKwkJfQ0KKwl9IHdoaWxl IChyZXQgIT0gMCk7DQorDQorCWlmIChpbl9wb3MgIT0gTlVMTCkNCisJCSppbl9wb3MgKz0gaW4u cG9zOw0KKw0KKwllcnIgPSAwOw0KK291dDoNCisJaWYgKGluX2FsbG9jYXRlZCAhPSBOVUxMKQ0K KwkJbGFyZ2VfZnJlZShpbl9hbGxvY2F0ZWQpOw0KKwlpZiAob3V0X2FsbG9jYXRlZCAhPSBOVUxM KQ0KKwkJbGFyZ2VfZnJlZShvdXRfYWxsb2NhdGVkKTsNCisJaWYgKHdrc3AgIT0gTlVMTCkNCisJ CWxhcmdlX2ZyZWUod2tzcCk7DQorCXJldHVybiBlcnI7DQorfQ0KKw0KKyNpZm5kZWYgVU5aU1RE X1BSRUJPT1QNCitTVEFUSUMgaW50IElOSVQgdW56c3RkKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9u ZyBsZW4sDQorCQkgICAgICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwNCisJ CSAgICAgICBsb25nICgqZmx1c2gpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwNCisJCSAgICAgICB1 bnNpZ25lZCBjaGFyICpvdXRfYnVmLA0KKwkJICAgICAgIGxvbmcgKnBvcywNCisJCSAgICAgICB2 b2lkICgqZXJyb3IpKGNoYXIgKngpKQ0KK3sNCisJcmV0dXJuIF9fdW56c3RkKGJ1ZiwgbGVuLCBm aWxsLCBmbHVzaCwgb3V0X2J1ZiwgMCwgcG9zLCBlcnJvcik7DQorfQ0KKyNlbHNlDQorU1RBVElD IGludCBJTklUIF9fZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgbGVuLA0KKwkJ CSAgICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwNCisJCQkgICAgIGxvbmcg KCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLA0KKwkJCSAgICAgdW5zaWduZWQgY2hhciAq b3V0X2J1ZiwgbG9uZyBvdXRfbGVuLA0KKwkJCSAgICAgbG9uZyAqcG9zLA0KKwkJCSAgICAgdm9p ZCAoKmVycm9yKShjaGFyICp4KSkNCit7DQorCXJldHVybiBfX3VuenN0ZChidWYsIGxlbiwgZmls bCwgZmx1c2gsIG91dF9idWYsIG91dF9sZW4sIHBvcywgZXJyb3IpOw0KK30NCisjZW5kaWYNCmRp ZmYgLS1naXQgYS94ZW4vY29tbW9uL3h4aGFzaC5jIGIveGVuL2NvbW1vbi94eGhhc2guYw0KbmV3 IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAuLmQ1YmI5ZmYxMDYNCi0tLSAvZGV2 L251bGwNCisrKyBiL3hlbi9jb21tb24veHhoYXNoLmMNCkBAIC0wLDAgKzEsNTAwIEBADQorLyoN CisgKiB4eEhhc2ggLSBFeHRyZW1lbHkgRmFzdCBIYXNoIGFsZ29yaXRobQ0KKyAqIENvcHlyaWdo dCAoQykgMjAxMi0yMDE2LCBZYW5uIENvbGxldC4NCisgKg0KKyAqIEJTRCAyLUNsYXVzZSBMaWNl bnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkN CisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y bXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92 aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisgKiBtZXQ6DQorICoNCisg KiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92 ZSBjb3B5cmlnaHQNCisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorICogICAgIGNvcHlyaWdodCBub3Rp Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIN CisgKiAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92 aWRlZCB3aXRoIHRoZQ0KKyAqICAgICBkaXN0cmlidXRpb24uDQorICoNCisgKiBUSElTIFNPRlRX QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT DQorICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM VURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKyAqIE9X TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ TkNJREVOVEFMLA0KKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B R0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisgKiBEQVRBLCBPUiBQ Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB TlkNCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg TElBQklMSVRZLCBPUiBUT1JUDQorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorICogT0YgVEhJUyBTT0ZUV0FS RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisg Kg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQ0KKyAqIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBwcm9ncmFtIGlzIGR1YWwtbGljZW5zZWQ7IHlv dSBtYXkgc2VsZWN0DQorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQ0KKyAqICgiQlNEIikuDQorICoNCisg KiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdDoNCisgKiAtIHh4SGFzaCBob21lcGFnZTog aHR0cHM6Ly9jeWFuNDk3My5naXRodWIuaW8veHhIYXNoLw0KKyAqIC0geHhIYXNoIHNvdXJjZSBy ZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vQ3lhbjQ5NzMveHhIYXNoDQorICovDQorDQor I2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4NCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4NCisj aW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4NCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQor I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4NCisj aW5jbHVkZSA8bGludXgveHhoYXNoLmg+DQorDQorLyotKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KKyAqIE1hY3Jvcw0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCisjZGVmaW5lIHh4aF9yb3RsMzIoeCwgcikgKCh4IDw8IHIpIHwgKHggPj4g KDMyIC0gcikpKQ0KKyNkZWZpbmUgeHhoX3JvdGw2NCh4LCByKSAoKHggPDwgcikgfCAoeCA+PiAo NjQgLSByKSkpDQorDQorI2lmZGVmIF9fTElUVExFX0VORElBTg0KKyMgZGVmaW5lIFhYSF9DUFVf TElUVExFX0VORElBTiAxDQorI2Vsc2UNCisjIGRlZmluZSBYWEhfQ1BVX0xJVFRMRV9FTkRJQU4g MA0KKyNlbmRpZg0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioN CisgKiBDb25zdGFudHMNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov DQorc3RhdGljIGNvbnN0IHVpbnQzMl90IFBSSU1FMzJfMSA9IDI2NTQ0MzU3NjFVOw0KK3N0YXRp YyBjb25zdCB1aW50MzJfdCBQUklNRTMyXzIgPSAyMjQ2ODIyNTE5VTsNCitzdGF0aWMgY29uc3Qg dWludDMyX3QgUFJJTUUzMl8zID0gMzI2NjQ4OTkxN1U7DQorc3RhdGljIGNvbnN0IHVpbnQzMl90 IFBSSU1FMzJfNCA9ICA2NjgyNjUyNjNVOw0KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBQUklNRTMy XzUgPSAgMzc0NzYxMzkzVTsNCisNCitzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF8xID0g MTE0MDA3MTQ3ODUwNzQ2OTQ3OTFVTEw7DQorc3RhdGljIGNvbnN0IHVpbnQ2NF90IFBSSU1FNjRf MiA9IDE0MDI5NDY3MzY2ODk3MDE5NzI3VUxMOw0KK3N0YXRpYyBjb25zdCB1aW50NjRfdCBQUklN RTY0XzMgPSAgMTYwOTU4NzkyOTM5MjgzOTE2MVVMTDsNCitzdGF0aWMgY29uc3QgdWludDY0X3Qg UFJJTUU2NF80ID0gIDk2NTAwMjkyNDIyODc4Mjg1NzlVTEw7DQorc3RhdGljIGNvbnN0IHVpbnQ2 NF90IFBSSU1FNjRfNSA9ICAyODcwMTc3NDUwMDEyNjAwMjYxVUxMOw0KKw0KKy8qLSoqKioqKioq KioqKioqKioqKioqKioqKioqDQorICogIFV0aWxzDQorICoqKioqKioqKioqKioqKioqKioqKioq KioqKi8NCit2b2lkIHh4aDMyX2NvcHlfc3RhdGUoc3RydWN0IHh4aDMyX3N0YXRlICpkc3QsIGNv bnN0IHN0cnVjdCB4eGgzMl9zdGF0ZSAqc3JjKQ0KK3sNCisJbWVtY3B5KGRzdCwgc3JjLCBzaXpl b2YoKmRzdCkpOw0KK30NCitFWFBPUlRfU1lNQk9MKHh4aDMyX2NvcHlfc3RhdGUpOw0KKw0KK3Zv aWQgeHhoNjRfY29weV9zdGF0ZShzdHJ1Y3QgeHhoNjRfc3RhdGUgKmRzdCwgY29uc3Qgc3RydWN0 IHh4aDY0X3N0YXRlICpzcmMpDQorew0KKwltZW1jcHkoZHN0LCBzcmMsIHNpemVvZigqZHN0KSk7 DQorfQ0KK0VYUE9SVF9TWU1CT0woeHhoNjRfY29weV9zdGF0ZSk7DQorDQorLyotKioqKioqKioq KioqKioqKioqKioqKioqKioqDQorICogU2ltcGxlIEhhc2ggRnVuY3Rpb25zDQorICoqKioqKioq KioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHVpbnQzMl90IHh4aDMyX3JvdW5kKHVpbnQz Ml90IHNlZWQsIGNvbnN0IHVpbnQzMl90IGlucHV0KQ0KK3sNCisJc2VlZCArPSBpbnB1dCAqIFBS SU1FMzJfMjsNCisJc2VlZCA9IHh4aF9yb3RsMzIoc2VlZCwgMTMpOw0KKwlzZWVkICo9IFBSSU1F MzJfMTsNCisJcmV0dXJuIHNlZWQ7DQorfQ0KKw0KK3VpbnQzMl90IHh4aDMyKGNvbnN0IHZvaWQg KmlucHV0LCBjb25zdCBzaXplX3QgbGVuLCBjb25zdCB1aW50MzJfdCBzZWVkKQ0KK3sNCisJY29u c3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopaW5wdXQ7DQorCWNvbnN0IHVpbnQ4X3Qg KmJfZW5kID0gcCArIGxlbjsNCisJdWludDMyX3QgaDMyOw0KKw0KKwlpZiAobGVuID49IDE2KSB7 DQorCQljb25zdCB1aW50OF90ICpjb25zdCBsaW1pdCA9IGJfZW5kIC0gMTY7DQorCQl1aW50MzJf dCB2MSA9IHNlZWQgKyBQUklNRTMyXzEgKyBQUklNRTMyXzI7DQorCQl1aW50MzJfdCB2MiA9IHNl ZWQgKyBQUklNRTMyXzI7DQorCQl1aW50MzJfdCB2MyA9IHNlZWQgKyAwOw0KKwkJdWludDMyX3Qg djQgPSBzZWVkIC0gUFJJTUUzMl8xOw0KKw0KKwkJZG8gew0KKwkJCXYxID0geHhoMzJfcm91bmQo djEsIGdldF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJCXYyID0geHhoMzJf cm91bmQodjIsIGdldF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJCXYzID0g eHhoMzJfcm91bmQodjMsIGdldF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJ CXY0ID0geHhoMzJfcm91bmQodjQsIGdldF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0 Ow0KKwkJfSB3aGlsZSAocCA8PSBsaW1pdCk7DQorDQorCQloMzIgPSB4eGhfcm90bDMyKHYxLCAx KSArIHh4aF9yb3RsMzIodjIsIDcpICsNCisJCQl4eGhfcm90bDMyKHYzLCAxMikgKyB4eGhfcm90 bDMyKHY0LCAxOCk7DQorCX0gZWxzZSB7DQorCQloMzIgPSBzZWVkICsgUFJJTUUzMl81Ow0KKwl9 DQorDQorCWgzMiArPSAodWludDMyX3QpbGVuOw0KKw0KKwl3aGlsZSAocCArIDQgPD0gYl9lbmQp IHsNCisJCWgzMiArPSBnZXRfdW5hbGlnbmVkX2xlMzIocCkgKiBQUklNRTMyXzM7DQorCQloMzIg PSB4eGhfcm90bDMyKGgzMiwgMTcpICogUFJJTUUzMl80Ow0KKwkJcCArPSA0Ow0KKwl9DQorDQor CXdoaWxlIChwIDwgYl9lbmQpIHsNCisJCWgzMiArPSAoKnApICogUFJJTUUzMl81Ow0KKwkJaDMy ID0geHhoX3JvdGwzMihoMzIsIDExKSAqIFBSSU1FMzJfMTsNCisJCXArKzsNCisJfQ0KKw0KKwlo MzIgXj0gaDMyID4+IDE1Ow0KKwloMzIgKj0gUFJJTUUzMl8yOw0KKwloMzIgXj0gaDMyID4+IDEz Ow0KKwloMzIgKj0gUFJJTUUzMl8zOw0KKwloMzIgXj0gaDMyID4+IDE2Ow0KKw0KKwlyZXR1cm4g aDMyOw0KK30NCitFWFBPUlRfU1lNQk9MKHh4aDMyKTsNCisNCitzdGF0aWMgdWludDY0X3QgeHho NjRfcm91bmQodWludDY0X3QgYWNjLCBjb25zdCB1aW50NjRfdCBpbnB1dCkNCit7DQorCWFjYyAr PSBpbnB1dCAqIFBSSU1FNjRfMjsNCisJYWNjID0geHhoX3JvdGw2NChhY2MsIDMxKTsNCisJYWNj ICo9IFBSSU1FNjRfMTsNCisJcmV0dXJuIGFjYzsNCit9DQorDQorc3RhdGljIHVpbnQ2NF90IHh4 aDY0X21lcmdlX3JvdW5kKHVpbnQ2NF90IGFjYywgdWludDY0X3QgdmFsKQ0KK3sNCisJdmFsID0g eHhoNjRfcm91bmQoMCwgdmFsKTsNCisJYWNjIF49IHZhbDsNCisJYWNjID0gYWNjICogUFJJTUU2 NF8xICsgUFJJTUU2NF80Ow0KKwlyZXR1cm4gYWNjOw0KK30NCisNCit1aW50NjRfdCB4eGg2NChj b25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6ZV90IGxlbiwgY29uc3QgdWludDY0X3Qgc2VlZCkN Cit7DQorCWNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWlucHV0Ow0KKwljb25z dCB1aW50OF90ICpjb25zdCBiX2VuZCA9IHAgKyBsZW47DQorCXVpbnQ2NF90IGg2NDsNCisNCisJ aWYgKGxlbiA+PSAzMikgew0KKwkJY29uc3QgdWludDhfdCAqY29uc3QgbGltaXQgPSBiX2VuZCAt IDMyOw0KKwkJdWludDY0X3QgdjEgPSBzZWVkICsgUFJJTUU2NF8xICsgUFJJTUU2NF8yOw0KKwkJ dWludDY0X3QgdjIgPSBzZWVkICsgUFJJTUU2NF8yOw0KKwkJdWludDY0X3QgdjMgPSBzZWVkICsg MDsNCisJCXVpbnQ2NF90IHY0ID0gc2VlZCAtIFBSSU1FNjRfMTsNCisNCisJCWRvIHsNCisJCQl2 MSA9IHh4aDY0X3JvdW5kKHYxLCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOw0KKwkJCXAgKz0gODsN CisJCQl2MiA9IHh4aDY0X3JvdW5kKHYyLCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOw0KKwkJCXAg Kz0gODsNCisJCQl2MyA9IHh4aDY0X3JvdW5kKHYzLCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOw0K KwkJCXAgKz0gODsNCisJCQl2NCA9IHh4aDY0X3JvdW5kKHY0LCBnZXRfdW5hbGlnbmVkX2xlNjQo cCkpOw0KKwkJCXAgKz0gODsNCisJCX0gd2hpbGUgKHAgPD0gbGltaXQpOw0KKw0KKwkJaDY0ID0g eHhoX3JvdGw2NCh2MSwgMSkgKyB4eGhfcm90bDY0KHYyLCA3KSArDQorCQkJeHhoX3JvdGw2NCh2 MywgMTIpICsgeHhoX3JvdGw2NCh2NCwgMTgpOw0KKwkJaDY0ID0geHhoNjRfbWVyZ2Vfcm91bmQo aDY0LCB2MSk7DQorCQloNjQgPSB4eGg2NF9tZXJnZV9yb3VuZChoNjQsIHYyKTsNCisJCWg2NCA9 IHh4aDY0X21lcmdlX3JvdW5kKGg2NCwgdjMpOw0KKwkJaDY0ID0geHhoNjRfbWVyZ2Vfcm91bmQo aDY0LCB2NCk7DQorDQorCX0gZWxzZSB7DQorCQloNjQgID0gc2VlZCArIFBSSU1FNjRfNTsNCisJ fQ0KKw0KKwloNjQgKz0gKHVpbnQ2NF90KWxlbjsNCisNCisJd2hpbGUgKHAgKyA4IDw9IGJfZW5k KSB7DQorCQljb25zdCB1aW50NjRfdCBrMSA9IHh4aDY0X3JvdW5kKDAsIGdldF91bmFsaWduZWRf bGU2NChwKSk7DQorDQorCQloNjQgXj0gazE7DQorCQloNjQgPSB4eGhfcm90bDY0KGg2NCwgMjcp ICogUFJJTUU2NF8xICsgUFJJTUU2NF80Ow0KKwkJcCArPSA4Ow0KKwl9DQorDQorCWlmIChwICsg NCA8PSBiX2VuZCkgew0KKwkJaDY0IF49ICh1aW50NjRfdCkoZ2V0X3VuYWxpZ25lZF9sZTMyKHAp KSAqIFBSSU1FNjRfMTsNCisJCWg2NCA9IHh4aF9yb3RsNjQoaDY0LCAyMykgKiBQUklNRTY0XzIg KyBQUklNRTY0XzM7DQorCQlwICs9IDQ7DQorCX0NCisNCisJd2hpbGUgKHAgPCBiX2VuZCkgew0K KwkJaDY0IF49ICgqcCkgKiBQUklNRTY0XzU7DQorCQloNjQgPSB4eGhfcm90bDY0KGg2NCwgMTEp ICogUFJJTUU2NF8xOw0KKwkJcCsrOw0KKwl9DQorDQorCWg2NCBePSBoNjQgPj4gMzM7DQorCWg2 NCAqPSBQUklNRTY0XzI7DQorCWg2NCBePSBoNjQgPj4gMjk7DQorCWg2NCAqPSBQUklNRTY0XzM7 DQorCWg2NCBePSBoNjQgPj4gMzI7DQorDQorCXJldHVybiBoNjQ7DQorfQ0KK0VYUE9SVF9TWU1C T0woeHhoNjQpOw0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqDQorICogQWR2YW5jZWQgSGFzaCBGdW5jdGlvbnMNCisgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgeHhoMzJfcmVz ZXQoc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0ZVB0ciwgY29uc3QgdWludDMyX3Qgc2VlZCkNCit7 DQorCS8qIHVzZSBhIGxvY2FsIHN0YXRlIGZvciBtZW1jcHkoKSB0byBhdm9pZCBzdHJpY3QtYWxp YXNpbmcgd2FybmluZ3MgKi8NCisJc3RydWN0IHh4aDMyX3N0YXRlIHN0YXRlOw0KKw0KKwltZW1z ZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsNCisJc3RhdGUudjEgPSBzZWVkICsgUFJJTUUz Ml8xICsgUFJJTUUzMl8yOw0KKwlzdGF0ZS52MiA9IHNlZWQgKyBQUklNRTMyXzI7DQorCXN0YXRl LnYzID0gc2VlZCArIDA7DQorCXN0YXRlLnY0ID0gc2VlZCAtIFBSSU1FMzJfMTsNCisJbWVtY3B5 KHN0YXRlUHRyLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOw0KK30NCitFWFBPUlRfU1lNQk9MKHh4 aDMyX3Jlc2V0KTsNCisNCit2b2lkIHh4aDY0X3Jlc2V0KHN0cnVjdCB4eGg2NF9zdGF0ZSAqc3Rh dGVQdHIsIGNvbnN0IHVpbnQ2NF90IHNlZWQpDQorew0KKwkvKiB1c2UgYSBsb2NhbCBzdGF0ZSBm b3IgbWVtY3B5KCkgdG8gYXZvaWQgc3RyaWN0LWFsaWFzaW5nIHdhcm5pbmdzICovDQorCXN0cnVj dCB4eGg2NF9zdGF0ZSBzdGF0ZTsNCisNCisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRl KSk7DQorCXN0YXRlLnYxID0gc2VlZCArIFBSSU1FNjRfMSArIFBSSU1FNjRfMjsNCisJc3RhdGUu djIgPSBzZWVkICsgUFJJTUU2NF8yOw0KKwlzdGF0ZS52MyA9IHNlZWQgKyAwOw0KKwlzdGF0ZS52 NCA9IHNlZWQgLSBQUklNRTY0XzE7DQorCW1lbWNweShzdGF0ZVB0ciwgJnN0YXRlLCBzaXplb2Yo c3RhdGUpKTsNCit9DQorRVhQT1JUX1NZTUJPTCh4eGg2NF9yZXNldCk7DQorDQoraW50IHh4aDMy X3VwZGF0ZShzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICppbnB1dCwgY29u c3Qgc2l6ZV90IGxlbikNCit7DQorCWNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAq KWlucHV0Ow0KKwljb25zdCB1aW50OF90ICpjb25zdCBiX2VuZCA9IHAgKyBsZW47DQorDQorCWlm IChpbnB1dCA9PSBOVUxMKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCXN0YXRlLT50b3RhbF9s ZW5fMzIgKz0gKHVpbnQzMl90KWxlbjsNCisJc3RhdGUtPmxhcmdlX2xlbiB8PSAobGVuID49IDE2 KSB8IChzdGF0ZS0+dG90YWxfbGVuXzMyID49IDE2KTsNCisNCisJaWYgKHN0YXRlLT5tZW1zaXpl ICsgbGVuIDwgMTYpIHsgLyogZmlsbCBpbiB0bXAgYnVmZmVyICovDQorCQltZW1jcHkoKHVpbnQ4 X3QgKikoc3RhdGUtPm1lbTMyKSArIHN0YXRlLT5tZW1zaXplLCBpbnB1dCwgbGVuKTsNCisJCXN0 YXRlLT5tZW1zaXplICs9ICh1aW50MzJfdClsZW47DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwlp ZiAoc3RhdGUtPm1lbXNpemUpIHsgLyogc29tZSBkYXRhIGxlZnQgZnJvbSBwcmV2aW91cyB1cGRh dGUgKi8NCisJCWNvbnN0IHVpbnQzMl90ICpwMzIgPSBzdGF0ZS0+bWVtMzI7DQorDQorCQltZW1j cHkoKHVpbnQ4X3QgKikoc3RhdGUtPm1lbTMyKSArIHN0YXRlLT5tZW1zaXplLCBpbnB1dCwNCisJ CQkxNiAtIHN0YXRlLT5tZW1zaXplKTsNCisNCisJCXN0YXRlLT52MSA9IHh4aDMyX3JvdW5kKHN0 YXRlLT52MSwgZ2V0X3VuYWxpZ25lZF9sZTMyKHAzMikpOw0KKwkJcDMyKys7DQorCQlzdGF0ZS0+ djIgPSB4eGgzMl9yb3VuZChzdGF0ZS0+djIsIGdldF91bmFsaWduZWRfbGUzMihwMzIpKTsNCisJ CXAzMisrOw0KKwkJc3RhdGUtPnYzID0geHhoMzJfcm91bmQoc3RhdGUtPnYzLCBnZXRfdW5hbGln bmVkX2xlMzIocDMyKSk7DQorCQlwMzIrKzsNCisJCXN0YXRlLT52NCA9IHh4aDMyX3JvdW5kKHN0 YXRlLT52NCwgZ2V0X3VuYWxpZ25lZF9sZTMyKHAzMikpOw0KKwkJcDMyKys7DQorDQorCQlwICs9 IDE2LXN0YXRlLT5tZW1zaXplOw0KKwkJc3RhdGUtPm1lbXNpemUgPSAwOw0KKwl9DQorDQorCWlm IChwIDw9IGJfZW5kIC0gMTYpIHsNCisJCWNvbnN0IHVpbnQ4X3QgKmNvbnN0IGxpbWl0ID0gYl9l bmQgLSAxNjsNCisJCXVpbnQzMl90IHYxID0gc3RhdGUtPnYxOw0KKwkJdWludDMyX3QgdjIgPSBz dGF0ZS0+djI7DQorCQl1aW50MzJfdCB2MyA9IHN0YXRlLT52MzsNCisJCXVpbnQzMl90IHY0ID0g c3RhdGUtPnY0Ow0KKw0KKwkJZG8gew0KKwkJCXYxID0geHhoMzJfcm91bmQodjEsIGdldF91bmFs aWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJCXYyID0geHhoMzJfcm91bmQodjIsIGdl dF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJCXYzID0geHhoMzJfcm91bmQo djMsIGdldF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJCXY0ID0geHhoMzJf cm91bmQodjQsIGdldF91bmFsaWduZWRfbGUzMihwKSk7DQorCQkJcCArPSA0Ow0KKwkJfSB3aGls ZSAocCA8PSBsaW1pdCk7DQorDQorCQlzdGF0ZS0+djEgPSB2MTsNCisJCXN0YXRlLT52MiA9IHYy Ow0KKwkJc3RhdGUtPnYzID0gdjM7DQorCQlzdGF0ZS0+djQgPSB2NDsNCisJfQ0KKw0KKwlpZiAo cCA8IGJfZW5kKSB7DQorCQltZW1jcHkoc3RhdGUtPm1lbTMyLCBwLCAoc2l6ZV90KShiX2VuZC1w KSk7DQorCQlzdGF0ZS0+bWVtc2l6ZSA9ICh1aW50MzJfdCkoYl9lbmQtcCk7DQorCX0NCisNCisJ cmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0woeHhoMzJfdXBkYXRlKTsNCisNCit1aW50MzJf dCB4eGgzMl9kaWdlc3QoY29uc3Qgc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0ZSkNCit7DQorCWNv bnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKXN0YXRlLT5tZW0zMjsNCisJY29uc3Qg dWludDhfdCAqY29uc3QgYl9lbmQgPSAoY29uc3QgdWludDhfdCAqKShzdGF0ZS0+bWVtMzIpICsN CisJCXN0YXRlLT5tZW1zaXplOw0KKwl1aW50MzJfdCBoMzI7DQorDQorCWlmIChzdGF0ZS0+bGFy Z2VfbGVuKSB7DQorCQloMzIgPSB4eGhfcm90bDMyKHN0YXRlLT52MSwgMSkgKyB4eGhfcm90bDMy KHN0YXRlLT52MiwgNykgKw0KKwkJCXh4aF9yb3RsMzIoc3RhdGUtPnYzLCAxMikgKyB4eGhfcm90 bDMyKHN0YXRlLT52NCwgMTgpOw0KKwl9IGVsc2Ugew0KKwkJaDMyID0gc3RhdGUtPnYzIC8qID09 IHNlZWQgKi8gKyBQUklNRTMyXzU7DQorCX0NCisNCisJaDMyICs9IHN0YXRlLT50b3RhbF9sZW5f MzI7DQorDQorCXdoaWxlIChwICsgNCA8PSBiX2VuZCkgew0KKwkJaDMyICs9IGdldF91bmFsaWdu ZWRfbGUzMihwKSAqIFBSSU1FMzJfMzsNCisJCWgzMiA9IHh4aF9yb3RsMzIoaDMyLCAxNykgKiBQ UklNRTMyXzQ7DQorCQlwICs9IDQ7DQorCX0NCisNCisJd2hpbGUgKHAgPCBiX2VuZCkgew0KKwkJ aDMyICs9ICgqcCkgKiBQUklNRTMyXzU7DQorCQloMzIgPSB4eGhfcm90bDMyKGgzMiwgMTEpICog UFJJTUUzMl8xOw0KKwkJcCsrOw0KKwl9DQorDQorCWgzMiBePSBoMzIgPj4gMTU7DQorCWgzMiAq PSBQUklNRTMyXzI7DQorCWgzMiBePSBoMzIgPj4gMTM7DQorCWgzMiAqPSBQUklNRTMyXzM7DQor CWgzMiBePSBoMzIgPj4gMTY7DQorDQorCXJldHVybiBoMzI7DQorfQ0KK0VYUE9SVF9TWU1CT0wo eHhoMzJfZGlnZXN0KTsNCisNCitpbnQgeHhoNjRfdXBkYXRlKHN0cnVjdCB4eGg2NF9zdGF0ZSAq c3RhdGUsIGNvbnN0IHZvaWQgKmlucHV0LCBjb25zdCBzaXplX3QgbGVuKQ0KK3sNCisJY29uc3Qg dWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopaW5wdXQ7DQorCWNvbnN0IHVpbnQ4X3QgKmNv bnN0IGJfZW5kID0gcCArIGxlbjsNCisNCisJaWYgKGlucHV0ID09IE5VTEwpDQorCQlyZXR1cm4g LUVJTlZBTDsNCisNCisJc3RhdGUtPnRvdGFsX2xlbiArPSBsZW47DQorDQorCWlmIChzdGF0ZS0+ bWVtc2l6ZSArIGxlbiA8IDMyKSB7IC8qIGZpbGwgaW4gdG1wIGJ1ZmZlciAqLw0KKwkJbWVtY3B5 KCgodWludDhfdCAqKXN0YXRlLT5tZW02NCkgKyBzdGF0ZS0+bWVtc2l6ZSwgaW5wdXQsIGxlbik7 DQorCQlzdGF0ZS0+bWVtc2l6ZSArPSAodWludDMyX3QpbGVuOw0KKwkJcmV0dXJuIDA7DQorCX0N CisNCisJaWYgKHN0YXRlLT5tZW1zaXplKSB7IC8qIHRtcCBidWZmZXIgaXMgZnVsbCAqLw0KKwkJ dWludDY0X3QgKnA2NCA9IHN0YXRlLT5tZW02NDsNCisNCisJCW1lbWNweSgoKHVpbnQ4X3QgKilw NjQpICsgc3RhdGUtPm1lbXNpemUsIGlucHV0LA0KKwkJCTMyIC0gc3RhdGUtPm1lbXNpemUpOw0K Kw0KKwkJc3RhdGUtPnYxID0geHhoNjRfcm91bmQoc3RhdGUtPnYxLCBnZXRfdW5hbGlnbmVkX2xl NjQocDY0KSk7DQorCQlwNjQrKzsNCisJCXN0YXRlLT52MiA9IHh4aDY0X3JvdW5kKHN0YXRlLT52 MiwgZ2V0X3VuYWxpZ25lZF9sZTY0KHA2NCkpOw0KKwkJcDY0Kys7DQorCQlzdGF0ZS0+djMgPSB4 eGg2NF9yb3VuZChzdGF0ZS0+djMsIGdldF91bmFsaWduZWRfbGU2NChwNjQpKTsNCisJCXA2NCsr Ow0KKwkJc3RhdGUtPnY0ID0geHhoNjRfcm91bmQoc3RhdGUtPnY0LCBnZXRfdW5hbGlnbmVkX2xl NjQocDY0KSk7DQorDQorCQlwICs9IDMyIC0gc3RhdGUtPm1lbXNpemU7DQorCQlzdGF0ZS0+bWVt c2l6ZSA9IDA7DQorCX0NCisNCisJaWYgKHAgKyAzMiA8PSBiX2VuZCkgew0KKwkJY29uc3QgdWlu dDhfdCAqY29uc3QgbGltaXQgPSBiX2VuZCAtIDMyOw0KKwkJdWludDY0X3QgdjEgPSBzdGF0ZS0+ djE7DQorCQl1aW50NjRfdCB2MiA9IHN0YXRlLT52MjsNCisJCXVpbnQ2NF90IHYzID0gc3RhdGUt PnYzOw0KKwkJdWludDY0X3QgdjQgPSBzdGF0ZS0+djQ7DQorDQorCQlkbyB7DQorCQkJdjEgPSB4 eGg2NF9yb3VuZCh2MSwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsNCisJCQlwICs9IDg7DQorCQkJ djIgPSB4eGg2NF9yb3VuZCh2MiwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsNCisJCQlwICs9IDg7 DQorCQkJdjMgPSB4eGg2NF9yb3VuZCh2MywgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsNCisJCQlw ICs9IDg7DQorCQkJdjQgPSB4eGg2NF9yb3VuZCh2NCwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsN CisJCQlwICs9IDg7DQorCQl9IHdoaWxlIChwIDw9IGxpbWl0KTsNCisNCisJCXN0YXRlLT52MSA9 IHYxOw0KKwkJc3RhdGUtPnYyID0gdjI7DQorCQlzdGF0ZS0+djMgPSB2MzsNCisJCXN0YXRlLT52 NCA9IHY0Ow0KKwl9DQorDQorCWlmIChwIDwgYl9lbmQpIHsNCisJCW1lbWNweShzdGF0ZS0+bWVt NjQsIHAsIChzaXplX3QpKGJfZW5kLXApKTsNCisJCXN0YXRlLT5tZW1zaXplID0gKHVpbnQzMl90 KShiX2VuZCAtIHApOw0KKwl9DQorDQorCXJldHVybiAwOw0KK30NCitFWFBPUlRfU1lNQk9MKHh4 aDY0X3VwZGF0ZSk7DQorDQordWludDY0X3QgeHhoNjRfZGlnZXN0KGNvbnN0IHN0cnVjdCB4eGg2 NF9zdGF0ZSAqc3RhdGUpDQorew0KKwljb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3Qg KilzdGF0ZS0+bWVtNjQ7DQorCWNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJfZW5kID0gKGNvbnN0IHVp bnQ4X3QgKilzdGF0ZS0+bWVtNjQgKw0KKwkJc3RhdGUtPm1lbXNpemU7DQorCXVpbnQ2NF90IGg2 NDsNCisNCisJaWYgKHN0YXRlLT50b3RhbF9sZW4gPj0gMzIpIHsNCisJCWNvbnN0IHVpbnQ2NF90 IHYxID0gc3RhdGUtPnYxOw0KKwkJY29uc3QgdWludDY0X3QgdjIgPSBzdGF0ZS0+djI7DQorCQlj b25zdCB1aW50NjRfdCB2MyA9IHN0YXRlLT52MzsNCisJCWNvbnN0IHVpbnQ2NF90IHY0ID0gc3Rh dGUtPnY0Ow0KKw0KKwkJaDY0ID0geHhoX3JvdGw2NCh2MSwgMSkgKyB4eGhfcm90bDY0KHYyLCA3 KSArDQorCQkJeHhoX3JvdGw2NCh2MywgMTIpICsgeHhoX3JvdGw2NCh2NCwgMTgpOw0KKwkJaDY0 ID0geHhoNjRfbWVyZ2Vfcm91bmQoaDY0LCB2MSk7DQorCQloNjQgPSB4eGg2NF9tZXJnZV9yb3Vu ZChoNjQsIHYyKTsNCisJCWg2NCA9IHh4aDY0X21lcmdlX3JvdW5kKGg2NCwgdjMpOw0KKwkJaDY0 ID0geHhoNjRfbWVyZ2Vfcm91bmQoaDY0LCB2NCk7DQorCX0gZWxzZSB7DQorCQloNjQgID0gc3Rh dGUtPnYzICsgUFJJTUU2NF81Ow0KKwl9DQorDQorCWg2NCArPSAodWludDY0X3Qpc3RhdGUtPnRv dGFsX2xlbjsNCisNCisJd2hpbGUgKHAgKyA4IDw9IGJfZW5kKSB7DQorCQljb25zdCB1aW50NjRf dCBrMSA9IHh4aDY0X3JvdW5kKDAsIGdldF91bmFsaWduZWRfbGU2NChwKSk7DQorDQorCQloNjQg Xj0gazE7DQorCQloNjQgPSB4eGhfcm90bDY0KGg2NCwgMjcpICogUFJJTUU2NF8xICsgUFJJTUU2 NF80Ow0KKwkJcCArPSA4Ow0KKwl9DQorDQorCWlmIChwICsgNCA8PSBiX2VuZCkgew0KKwkJaDY0 IF49ICh1aW50NjRfdCkoZ2V0X3VuYWxpZ25lZF9sZTMyKHApKSAqIFBSSU1FNjRfMTsNCisJCWg2 NCA9IHh4aF9yb3RsNjQoaDY0LCAyMykgKiBQUklNRTY0XzIgKyBQUklNRTY0XzM7DQorCQlwICs9 IDQ7DQorCX0NCisNCisJd2hpbGUgKHAgPCBiX2VuZCkgew0KKwkJaDY0IF49ICgqcCkgKiBQUklN RTY0XzU7DQorCQloNjQgPSB4eGhfcm90bDY0KGg2NCwgMTEpICogUFJJTUU2NF8xOw0KKwkJcCsr Ow0KKwl9DQorDQorCWg2NCBePSBoNjQgPj4gMzM7DQorCWg2NCAqPSBQUklNRTY0XzI7DQorCWg2 NCBePSBoNjQgPj4gMjk7DQorCWg2NCAqPSBQUklNRTY0XzM7DQorCWg2NCBePSBoNjQgPj4gMzI7 DQorDQorCXJldHVybiBoNjQ7DQorfQ0KK0VYUE9SVF9TWU1CT0woeHhoNjRfZGlnZXN0KTsNCisN CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7DQorTU9EVUxFX0RFU0NSSVBUSU9OKCJ4 eEhhc2giKTsNCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvYml0c3RyZWFtLmggYi94ZW4v Y29tbW9uL3pzdGQvYml0c3RyZWFtLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAw MDAwMDAwLi4zYTQ5Nzg0ZDVjDQotLS0gL2Rldi9udWxsDQorKysgYi94ZW4vY29tbW9uL3pzdGQv Yml0c3RyZWFtLmgNCkBAIC0wLDAgKzEsMzc5IEBADQorLyoNCisgKiBiaXRzdHJlYW0NCisgKiBQ YXJ0IG9mIEZTRSBsaWJyYXJ5DQorICogaGVhZGVyIGZpbGUgKHRvIGluY2x1ZGUpDQorICogQ29w eXJpZ2h0IChDKSAyMDEzLTIwMTYsIFlhbm4gQ29sbGV0Lg0KKyAqDQorICogQlNEIDItQ2xhdXNl IExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2Uu cGhwKQ0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisg Kg0KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl IGFib3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJp bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKyAqIGNvcHlyaWdodCBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisg KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp dGggdGhlDQorICogZGlzdHJpYnV0aW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJ UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UDQorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05U UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwN CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE SU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhF T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg T1IgVE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICoNCisgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeSBpdCB1bmRlcg0KKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVj dA0KKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl ICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UNCisgKiAoIkJTRCIpLg0KKyAqDQorICogWW91IGNhbiBj b250YWN0IHRoZSBhdXRob3IgYXQgOg0KKyAqIC0gU291cmNlIHJlcG9zaXRvcnkgOiBodHRwczov L2dpdGh1Yi5jb20vQ3lhbjQ5NzMvRmluaXRlU3RhdGVFbnRyb3B5DQorICovDQorI2lmbmRlZiBC SVRTVFJFQU1fSF9NT0RVTEUNCisjZGVmaW5lIEJJVFNUUkVBTV9IX01PRFVMRQ0KKw0KKy8qDQor KiAgVGhpcyBBUEkgY29uc2lzdHMgb2Ygc21hbGwgdW5pdGFyeSBmdW5jdGlvbnMsIHdoaWNoIG11 c3QgYmUgaW5saW5lZCBmb3IgYmVzdCBwZXJmb3JtYW5jZS4NCisqICBTaW5jZSBsaW5rLXRpbWUt b3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBjb21waWxlcnMsDQorKiAgdGhl c2UgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGludG8gYSAuaCB0byBiZSBpbmNsdWRlZC4NCisqLw0K Kw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBEZXBl bmRlbmNpZXMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQor I2luY2x1ZGUgImVycm9yX3ByaXZhdGUuaCIgLyogZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzICov DQorI2luY2x1ZGUgIm1lbS5oIgkgICAvKiB1bmFsaWduZWQgYWNjZXNzIHJvdXRpbmVzICovDQor DQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyogIFRhcmdl dCBzcGVjaWZpYw0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8N CisjZGVmaW5lIFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU5fMzIgMjUNCisjZGVmaW5lIFNUUkVBTV9B Q0NVTVVMQVRPUl9NSU5fNjQgNTcNCisjZGVmaW5lIFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU4gKChV MzIpKFpTVERfMzJiaXRzKCkgPyBTVFJFQU1fQUNDVU1VTEFUT1JfTUlOXzMyIDogU1RSRUFNX0FD Q1VNVUxBVE9SX01JTl82NCkpDQorDQorLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqDQorKiAgYml0U3RyZWFtIGVuY29kaW5nIEFQSSAod3JpdGUgZm9yd2FyZCkN CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBiaXRT dHJlYW0gY2FuIG1peCBpbnB1dCBmcm9tIG11bHRpcGxlIHNvdXJjZXMuDQorKiAgQSBjcml0aWNh bCBwcm9wZXJ0eSBvZiB0aGVzZSBzdHJlYW1zIGlzIHRoYXQgdGhleSBlbmNvZGUgYW5kIGRlY29k ZSBpbiAqKnJldmVyc2UqKiBkaXJlY3Rpb24uDQorKiAgU28gdGhlIGZpcnN0IGJpdCBzZXF1ZW5j ZSB5b3UgYWRkIHdpbGwgYmUgdGhlIGxhc3QgdG8gYmUgcmVhZCwgbGlrZSBhIExJRk8gc3RhY2su DQorKi8NCit0eXBlZGVmIHN0cnVjdCB7DQorCXNpemVfdCBiaXRDb250YWluZXI7DQorCWludCBi aXRQb3M7DQorCWNoYXIgKnN0YXJ0UHRyOw0KKwljaGFyICpwdHI7DQorCWNoYXIgKmVuZFB0cjsN Cit9IEJJVF9DU3RyZWFtX3Q7DQorDQorWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9pbml0Q1N0cmVh bShCSVRfQ1N0cmVhbV90ICpiaXRDLCB2b2lkICpkc3RCdWZmZXIsIHNpemVfdCBkc3RDYXBhY2l0 eSk7DQorWlNURF9TVEFUSUMgdm9pZCBCSVRfYWRkQml0cyhCSVRfQ1N0cmVhbV90ICpiaXRDLCBz aXplX3QgdmFsdWUsIHVuc2lnbmVkIG5iQml0cyk7DQorWlNURF9TVEFUSUMgdm9pZCBCSVRfZmx1 c2hCaXRzKEJJVF9DU3RyZWFtX3QgKmJpdEMpOw0KK1pTVERfU1RBVElDIHNpemVfdCBCSVRfY2xv c2VDU3RyZWFtKEJJVF9DU3RyZWFtX3QgKmJpdEMpOw0KKw0KKy8qIFN0YXJ0IHdpdGggaW5pdENT dHJlYW0sIHByb3ZpZGluZyB0aGUgc2l6ZSBvZiBidWZmZXIgdG8gd3JpdGUgaW50by4NCisqICBi aXRTdHJlYW0gd2lsbCBuZXZlciB3cml0ZSBvdXRzaWRlIG9mIHRoaXMgYnVmZmVyLg0KKyogIGBk c3RDYXBhY2l0eWAgbXVzdCBiZSA+PSBzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKSwgb3RoZXJ3 aXNlIEByZXR1cm4gd2lsbCBiZSBhbiBlcnJvciBjb2RlLg0KKyoNCisqICBiaXRzIGFyZSBmaXJz dCBhZGRlZCB0byBhIGxvY2FsIHJlZ2lzdGVyLg0KKyogIExvY2FsIHJlZ2lzdGVyIGlzIHNpemVf dCwgaGVuY2UgNjQtYml0cyBvbiA2NC1iaXRzIHN5c3RlbXMsIG9yIDMyLWJpdHMgb24gMzItYml0 cyBzeXN0ZW1zLg0KKyogIFdyaXRpbmcgZGF0YSBpbnRvIG1lbW9yeSBpcyBhbiBleHBsaWNpdCBv cGVyYXRpb24sIHBlcmZvcm1lZCBieSB0aGUgZmx1c2hCaXRzIGZ1bmN0aW9uLg0KKyogIEhlbmNl IGtlZXAgdHJhY2sgaG93IG1hbnkgYml0cyBhcmUgcG90ZW50aWFsbHkgc3RvcmVkIGludG8gbG9j YWwgcmVnaXN0ZXIgdG8gYXZvaWQgcmVnaXN0ZXIgb3ZlcmZsb3cuDQorKiAgQWZ0ZXIgYSBmbHVz aEJpdHMsIGEgbWF4aW11bSBvZiA3IGJpdHMgbWlnaHQgc3RpbGwgYmUgc3RvcmVkIGludG8gbG9j YWwgcmVnaXN0ZXIuDQorKg0KKyogIEF2b2lkIHN0b3JpbmcgZWxlbWVudHMgb2YgbW9yZSB0aGFu IDI0IGJpdHMgaWYgeW91IHdhbnQgY29tcGF0aWJpbGl0eSB3aXRoIDMyLWJpdHMgYml0c3RyZWFt IHJlYWRlcnMuDQorKg0KKyogIExhc3Qgb3BlcmF0aW9uIGlzIHRvIGNsb3NlIHRoZSBiaXRTdHJl YW0uDQorKiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpbmFsIHNpemUgb2YgQ1N0cmVhbSBp biBieXRlcy4NCisqICBJZiBkYXRhIGNvdWxkbid0IGZpdCBpbnRvIGBkc3RCdWZmZXJgLCBpdCB3 aWxsIHJldHVybiBhIDAgKCA9PSBub3Qgc3RvcmFibGUpDQorKi8NCisNCisvKi0qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIGJpdFN0cmVhbSBkZWNvZGlu ZyBBUEkgKHJlYWQgYmFja3dhcmQpDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8NCit0eXBlZGVmIHN0cnVjdCB7DQorCXNpemVfdCBiaXRDb250YWluZXI7 DQorCXVuc2lnbmVkIGJpdHNDb25zdW1lZDsNCisJY29uc3QgY2hhciAqcHRyOw0KKwljb25zdCBj aGFyICpzdGFydDsNCit9IEJJVF9EU3RyZWFtX3Q7DQorDQordHlwZWRlZiBlbnVtIHsNCisJQklU X0RTdHJlYW1fdW5maW5pc2hlZCA9IDAsDQorCUJJVF9EU3RyZWFtX2VuZE9mQnVmZmVyID0gMSwN CisJQklUX0RTdHJlYW1fY29tcGxldGVkID0gMiwNCisJQklUX0RTdHJlYW1fb3ZlcmZsb3cgPSAz DQorfSBCSVRfRFN0cmVhbV9zdGF0dXM7IC8qIHJlc3VsdCBvZiBCSVRfcmVsb2FkRFN0cmVhbSgp ICovDQorLyogMSwyLDQsOCB3b3VsZCBiZSBiZXR0ZXIgZm9yIGJpdG1hcCBjb21iaW5hdGlvbnMs IGJ1dCBzbG93cyBkb3duIHBlcmZvcm1hbmNlIGEgYml0IC4uLiA6KCAqLw0KKw0KK1pTVERfU1RB VElDIHNpemVfdCBCSVRfaW5pdERTdHJlYW0oQklUX0RTdHJlYW1fdCAqYml0RCwgY29uc3Qgdm9p ZCAqc3JjQnVmZmVyLCBzaXplX3Qgc3JjU2l6ZSk7DQorWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9y ZWFkQml0cyhCSVRfRFN0cmVhbV90ICpiaXRELCB1bnNpZ25lZCBuYkJpdHMpOw0KK1pTVERfU1RB VElDIEJJVF9EU3RyZWFtX3N0YXR1cyBCSVRfcmVsb2FkRFN0cmVhbShCSVRfRFN0cmVhbV90ICpi aXREKTsNCitaU1REX1NUQVRJQyB1bnNpZ25lZCBCSVRfZW5kT2ZEU3RyZWFtKGNvbnN0IEJJVF9E U3RyZWFtX3QgKmJpdEQpOw0KKw0KKy8qIFN0YXJ0IGJ5IGludm9raW5nIEJJVF9pbml0RFN0cmVh bSgpLg0KKyogIEEgY2h1bmsgb2YgdGhlIGJpdFN0cmVhbSBpcyB0aGVuIHN0b3JlZCBpbnRvIGEg bG9jYWwgcmVnaXN0ZXIuDQorKiAgTG9jYWwgcmVnaXN0ZXIgc2l6ZSBpcyA2NC1iaXRzIG9uIDY0 LWJpdHMgc3lzdGVtcywgMzItYml0cyBvbiAzMi1iaXRzIHN5c3RlbXMgKHNpemVfdCkuDQorKiAg WW91IGNhbiB0aGVuIHJldHJpZXZlIGJpdEZpZWxkcyBzdG9yZWQgaW50byB0aGUgbG9jYWwgcmVn aXN0ZXIsICoqaW4gcmV2ZXJzZSBvcmRlcioqLg0KKyogIExvY2FsIHJlZ2lzdGVyIGlzIGV4cGxp Y2l0bHkgcmVsb2FkZWQgZnJvbSBtZW1vcnkgYnkgdGhlIEJJVF9yZWxvYWREU3RyZWFtKCkgbWV0 aG9kLg0KKyogIEEgcmVsb2FkIGd1YXJhbnRlZSBhIG1pbmltdW0gb2YgKCg4KnNpemVvZihiaXRE LT5iaXRDb250YWluZXIpKS03KSBiaXRzIHdoZW4gaXRzIHJlc3VsdCBpcyBCSVRfRFN0cmVhbV91 bmZpbmlzaGVkLg0KKyogIE90aGVyd2lzZSwgaXQgY2FuIGJlIGxlc3MgdGhhbiB0aGF0LCBzbyBw cm9jZWVkIGFjY29yZGluZ2x5Lg0KKyogIENoZWNraW5nIGlmIERTdHJlYW0gaGFzIHJlYWNoZWQg aXRzIGVuZCBjYW4gYmUgcGVyZm9ybWVkIHdpdGggQklUX2VuZE9mRFN0cmVhbSgpLg0KKyovDQor DQorLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIHVuc2Fm ZSBBUEkNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorWlNU RF9TVEFUSUMgdm9pZCBCSVRfYWRkQml0c0Zhc3QoQklUX0NTdHJlYW1fdCAqYml0Qywgc2l6ZV90 IHZhbHVlLCB1bnNpZ25lZCBuYkJpdHMpOw0KKy8qIGZhc3RlciwgYnV0IHdvcmtzIG9ubHkgaWYg dmFsdWUgaXMgImNsZWFuIiwgbWVhbmluZyBhbGwgaGlnaCBiaXRzIGFib3ZlIG5iQml0cyBhcmUg MCAqLw0KKw0KK1pTVERfU1RBVElDIHZvaWQgQklUX2ZsdXNoQml0c0Zhc3QoQklUX0NTdHJlYW1f dCAqYml0Qyk7DQorLyogdW5zYWZlIHZlcnNpb247IGRvZXMgbm90IGNoZWNrIGJ1ZmZlciBvdmVy ZmxvdyAqLw0KKw0KK1pTVERfU1RBVElDIHNpemVfdCBCSVRfcmVhZEJpdHNGYXN0KEJJVF9EU3Ry ZWFtX3QgKmJpdEQsIHVuc2lnbmVkIG5iQml0cyk7DQorLyogZmFzdGVyLCBidXQgd29ya3Mgb25s eSBpZiBuYkJpdHMgPj0gMSAqLw0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgSW50ZXJuYWwgZnVuY3Rpb25z DQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCitaU1REX1NUQVRJQyB1bnNpZ25lZCBCSVRfaGlnaGJpdDMyKHJlZ2lzdGVy IFUzMiB2YWwpIHsgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih2YWwpOyB9DQorDQorLyo9PT09 PSAgICBMb2NhbCBDb25zdGFudHMgICA9PT09PSovDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIEJJ VF9tYXNrW10gPSB7MCwgICAgICAgMSwgICAgICAgMywgICAgICAgNywJMHhGLCAgICAgIDB4MUYs ICAgICAweDNGLCAgICAgMHg3RiwgICAgICAweEZGLA0KKwkJCQkgICAgMHgxRkYsICAgMHgzRkYs ICAgMHg3RkYsICAgMHhGRkYsICAgIDB4MUZGRiwgICAweDNGRkYsICAgMHg3RkZGLCAgIDB4RkZG RiwgICAgMHgxRkZGRiwNCisJCQkJICAgIDB4M0ZGRkYsIDB4N0ZGRkYsIDB4RkZGRkYsIDB4MUZG RkZGLCAweDNGRkZGRiwgMHg3RkZGRkYsIDB4RkZGRkZGLCAweDFGRkZGRkYsIDB4M0ZGRkZGRn07 IC8qIHVwIHRvIDI2IGJpdHMgKi8NCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIGJpdFN0cmVhbSBlbmNvZGlu Zw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovDQorLyohIEJJVF9pbml0Q1N0cmVhbSgpIDoNCisgKiAgYGRzdENhcGFjaXR5 YCBtdXN0IGJlID4gc2l6ZW9mKHZvaWQqKQ0KKyAqICBAcmV0dXJuIDogMCBpZiBzdWNjZXNzLA0K KwkJCSAgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUgKGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRVJSX2lz RXJyb3IoKSApICovDQorWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9pbml0Q1N0cmVhbShCSVRfQ1N0 cmVhbV90ICpiaXRDLCB2b2lkICpzdGFydFB0ciwgc2l6ZV90IGRzdENhcGFjaXR5KQ0KK3sNCisJ Yml0Qy0+Yml0Q29udGFpbmVyID0gMDsNCisJYml0Qy0+Yml0UG9zID0gMDsNCisJYml0Qy0+c3Rh cnRQdHIgPSAoY2hhciAqKXN0YXJ0UHRyOw0KKwliaXRDLT5wdHIgPSBiaXRDLT5zdGFydFB0cjsN CisJYml0Qy0+ZW5kUHRyID0gYml0Qy0+c3RhcnRQdHIgKyBkc3RDYXBhY2l0eSAtIHNpemVvZihi aXRDLT5wdHIpOw0KKwlpZiAoZHN0Q2FwYWNpdHkgPD0gc2l6ZW9mKGJpdEMtPnB0cikpDQorCQly ZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7DQorCXJldHVybiAwOw0KK30NCisNCisvKiEg QklUX2FkZEJpdHMoKSA6DQorCWNhbiBhZGQgdXAgdG8gMjYgYml0cyBpbnRvIGBiaXRDYC4NCisJ RG9lcyBub3QgY2hlY2sgZm9yIHJlZ2lzdGVyIG92ZXJmbG93ICEgKi8NCitaU1REX1NUQVRJQyB2 b2lkIEJJVF9hZGRCaXRzKEJJVF9DU3RyZWFtX3QgKmJpdEMsIHNpemVfdCB2YWx1ZSwgdW5zaWdu ZWQgbmJCaXRzKQ0KK3sNCisJYml0Qy0+Yml0Q29udGFpbmVyIHw9ICh2YWx1ZSAmIEJJVF9tYXNr W25iQml0c10pIDw8IGJpdEMtPmJpdFBvczsNCisJYml0Qy0+Yml0UG9zICs9IG5iQml0czsNCit9 DQorDQorLyohIEJJVF9hZGRCaXRzRmFzdCgpIDoNCisgKiAgd29ya3Mgb25seSBpZiBgdmFsdWVg IGlzIF9jbGVhbl8sIG1lYW5pbmcgYWxsIGhpZ2ggYml0cyBhYm92ZSBuYkJpdHMgYXJlIDAgKi8N CitaU1REX1NUQVRJQyB2b2lkIEJJVF9hZGRCaXRzRmFzdChCSVRfQ1N0cmVhbV90ICpiaXRDLCBz aXplX3QgdmFsdWUsIHVuc2lnbmVkIG5iQml0cykNCit7DQorCWJpdEMtPmJpdENvbnRhaW5lciB8 PSB2YWx1ZSA8PCBiaXRDLT5iaXRQb3M7DQorCWJpdEMtPmJpdFBvcyArPSBuYkJpdHM7DQorfQ0K Kw0KKy8qISBCSVRfZmx1c2hCaXRzRmFzdCgpIDoNCisgKiAgdW5zYWZlIHZlcnNpb247IGRvZXMg bm90IGNoZWNrIGJ1ZmZlciBvdmVyZmxvdyAqLw0KK1pTVERfU1RBVElDIHZvaWQgQklUX2ZsdXNo Qml0c0Zhc3QoQklUX0NTdHJlYW1fdCAqYml0QykNCit7DQorCXNpemVfdCBjb25zdCBuYkJ5dGVz ID0gYml0Qy0+Yml0UG9zID4+IDM7DQorCVpTVERfd3JpdGVMRVNUKGJpdEMtPnB0ciwgYml0Qy0+ Yml0Q29udGFpbmVyKTsNCisJYml0Qy0+cHRyICs9IG5iQnl0ZXM7DQorCWJpdEMtPmJpdFBvcyAm PSA3Ow0KKwliaXRDLT5iaXRDb250YWluZXIgPj49IG5iQnl0ZXMgKiA4OyAvKiBpZiBiaXRQb3Mg Pj0gc2l6ZW9mKGJpdENvbnRhaW5lcikqOCAtLT4gdW5kZWZpbmVkIGJlaGF2aW9yICovDQorfQ0K Kw0KKy8qISBCSVRfZmx1c2hCaXRzKCkgOg0KKyAqICBzYWZlIHZlcnNpb247IGNoZWNrIGZvciBi dWZmZXIgb3ZlcmZsb3csIGFuZCBwcmV2ZW50cyBpdC4NCisgKiAgbm90ZSA6IGRvZXMgbm90IHNp Z25hbCBidWZmZXIgb3ZlcmZsb3cuIFRoaXMgd2lsbCBiZSByZXZlYWxlZCBsYXRlciBvbiB1c2lu ZyBCSVRfY2xvc2VDU3RyZWFtKCkgKi8NCitaU1REX1NUQVRJQyB2b2lkIEJJVF9mbHVzaEJpdHMo QklUX0NTdHJlYW1fdCAqYml0QykNCit7DQorCXNpemVfdCBjb25zdCBuYkJ5dGVzID0gYml0Qy0+ Yml0UG9zID4+IDM7DQorCVpTVERfd3JpdGVMRVNUKGJpdEMtPnB0ciwgYml0Qy0+Yml0Q29udGFp bmVyKTsNCisJYml0Qy0+cHRyICs9IG5iQnl0ZXM7DQorCWlmIChiaXRDLT5wdHIgPiBiaXRDLT5l bmRQdHIpDQorCQliaXRDLT5wdHIgPSBiaXRDLT5lbmRQdHI7DQorCWJpdEMtPmJpdFBvcyAmPSA3 Ow0KKwliaXRDLT5iaXRDb250YWluZXIgPj49IG5iQnl0ZXMgKiA4OyAvKiBpZiBiaXRQb3MgPj0g c2l6ZW9mKGJpdENvbnRhaW5lcikqOCAtLT4gdW5kZWZpbmVkIGJlaGF2aW9yICovDQorfQ0KKw0K Ky8qISBCSVRfY2xvc2VDU3RyZWFtKCkgOg0KKyAqICBAcmV0dXJuIDogc2l6ZSBvZiBDU3RyZWFt LCBpbiBieXRlcywNCisJCQkgIG9yIDAgaWYgaXQgY291bGQgbm90IGZpdCBpbnRvIGRzdEJ1ZmZl ciAqLw0KK1pTVERfU1RBVElDIHNpemVfdCBCSVRfY2xvc2VDU3RyZWFtKEJJVF9DU3RyZWFtX3Qg KmJpdEMpDQorew0KKwlCSVRfYWRkQml0c0Zhc3QoYml0QywgMSwgMSk7IC8qIGVuZE1hcmsgKi8N CisJQklUX2ZsdXNoQml0cyhiaXRDKTsNCisNCisJaWYgKGJpdEMtPnB0ciA+PSBiaXRDLT5lbmRQ dHIpDQorCQlyZXR1cm4gMDsgLyogZG9lc24ndCBmaXQgd2l0aGluIGF1dGhvcml6ZWQgYnVkZ2V0 IDogY2FuY2VsICovDQorDQorCXJldHVybiAoYml0Qy0+cHRyIC0gYml0Qy0+c3RhcnRQdHIpICsg KGJpdEMtPmJpdFBvcyA+IDApOw0KK30NCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogYml0U3RyZWFtIGRlY29kaW5nDQor KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisvKiEgQklUX2luaXREU3RyZWFtKCkgOg0KKyogICBJbml0aWFsaXplIGEgQklUX0RTdHJl YW1fdC4NCisqICAgYGJpdERgIDogYSBwb2ludGVyIHRvIGFuIGFscmVhZHkgYWxsb2NhdGVkIEJJ VF9EU3RyZWFtX3Qgc3RydWN0dXJlLg0KKyogICBgc3JjU2l6ZWAgbXVzdCBiZSB0aGUgKmV4YWN0 KiBzaXplIG9mIHRoZSBiaXRTdHJlYW0sIGluIGJ5dGVzLg0KKyogICBAcmV0dXJuIDogc2l6ZSBv ZiBzdHJlYW0gKD09IHNyY1NpemUpIG9yIGFuIGVycm9yQ29kZSBpZiBhIHByb2JsZW0gaXMgZGV0 ZWN0ZWQNCisqLw0KK1pTVERfU1RBVElDIHNpemVfdCBCSVRfaW5pdERTdHJlYW0oQklUX0RTdHJl YW1fdCAqYml0RCwgY29uc3Qgdm9pZCAqc3JjQnVmZmVyLCBzaXplX3Qgc3JjU2l6ZSkNCit7DQor CWlmIChzcmNTaXplIDwgMSkgew0KKwkJbWVtc2V0KGJpdEQsIDAsIHNpemVvZigqYml0RCkpOw0K KwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOw0KKwl9DQorDQorCWlmIChzcmNTaXplID49 IHNpemVvZihiaXRELT5iaXRDb250YWluZXIpKSB7IC8qIG5vcm1hbCBjYXNlICovDQorCQliaXRE LT5zdGFydCA9IChjb25zdCBjaGFyICopc3JjQnVmZmVyOw0KKwkJYml0RC0+cHRyID0gKGNvbnN0 IGNoYXIgKilzcmNCdWZmZXIgKyBzcmNTaXplIC0gc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcik7 DQorCQliaXRELT5iaXRDb250YWluZXIgPSBaU1REX3JlYWRMRVNUKGJpdEQtPnB0cik7DQorCQl7 DQorCQkJQllURSBjb25zdCBsYXN0Qnl0ZSA9ICgoY29uc3QgQllURSAqKXNyY0J1ZmZlcilbc3Jj U2l6ZSAtIDFdOw0KKwkJCWJpdEQtPmJpdHNDb25zdW1lZCA9IGxhc3RCeXRlID8gOCAtIEJJVF9o aWdoYml0MzIobGFzdEJ5dGUpIDogMDsgLyogZW5zdXJlcyBiaXRzQ29uc3VtZWQgaXMgYWx3YXlz IHNldCAqLw0KKwkJCWlmIChsYXN0Qnl0ZSA9PSAwKQ0KKwkJCQlyZXR1cm4gRVJST1IoR0VORVJJ Qyk7IC8qIGVuZE1hcmsgbm90IHByZXNlbnQgKi8NCisJCX0NCisJfSBlbHNlIHsNCisJCWJpdEQt PnN0YXJ0ID0gKGNvbnN0IGNoYXIgKilzcmNCdWZmZXI7DQorCQliaXRELT5wdHIgPSBiaXRELT5z dGFydDsNCisJCWJpdEQtPmJpdENvbnRhaW5lciA9ICooY29uc3QgQllURSAqKShiaXRELT5zdGFy dCk7DQorCQlzd2l0Y2ggKHNyY1NpemUpIHsNCisJCWNhc2UgNzogYml0RC0+Yml0Q29udGFpbmVy ICs9IChzaXplX3QpKCgoY29uc3QgQllURSAqKShzcmNCdWZmZXIpKVs2XSkgPDwgKHNpemVvZihi aXRELT5iaXRDb250YWluZXIpICogOCAtIDE2KTsNCisJCQkvKiBmYWxsIHRocm91Z2ggKi8NCisJ CWNhc2UgNjogYml0RC0+Yml0Q29udGFpbmVyICs9IChzaXplX3QpKCgoY29uc3QgQllURSAqKShz cmNCdWZmZXIpKVs1XSkgPDwgKHNpemVvZihiaXRELT5iaXRDb250YWluZXIpICogOCAtIDI0KTsN CisJCQkvKiBmYWxsIHRocm91Z2ggKi8NCisJCWNhc2UgNTogYml0RC0+Yml0Q29udGFpbmVyICs9 IChzaXplX3QpKCgoY29uc3QgQllURSAqKShzcmNCdWZmZXIpKVs0XSkgPDwgKHNpemVvZihiaXRE LT5iaXRDb250YWluZXIpICogOCAtIDMyKTsNCisJCQkvKiBmYWxsIHRocm91Z2ggKi8NCisJCWNh c2UgNDogYml0RC0+Yml0Q29udGFpbmVyICs9IChzaXplX3QpKCgoY29uc3QgQllURSAqKShzcmNC dWZmZXIpKVszXSkgPDwgMjQ7DQorCQkJLyogZmFsbCB0aHJvdWdoICovDQorCQljYXNlIDM6IGJp dEQtPmJpdENvbnRhaW5lciArPSAoc2l6ZV90KSgoKGNvbnN0IEJZVEUgKikoc3JjQnVmZmVyKSlb Ml0pIDw8IDE2Ow0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLw0KKwkJY2FzZSAyOiBiaXRELT5iaXRD b250YWluZXIgKz0gKHNpemVfdCkoKChjb25zdCBCWVRFICopKHNyY0J1ZmZlcikpWzFdKSA8PCA4 Ow0KKwkJZGVmYXVsdDo7DQorCQl9DQorCQl7DQorCQkJQllURSBjb25zdCBsYXN0Qnl0ZSA9ICgo Y29uc3QgQllURSAqKXNyY0J1ZmZlcilbc3JjU2l6ZSAtIDFdOw0KKwkJCWJpdEQtPmJpdHNDb25z dW1lZCA9IGxhc3RCeXRlID8gOCAtIEJJVF9oaWdoYml0MzIobGFzdEJ5dGUpIDogMDsNCisJCQlp ZiAobGFzdEJ5dGUgPT0gMCkNCisJCQkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOyAvKiBlbmRNYXJr IG5vdCBwcmVzZW50ICovDQorCQl9DQorCQliaXRELT5iaXRzQ29uc3VtZWQgKz0gKFUzMikoc2l6 ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikgLSBzcmNTaXplKSAqIDg7DQorCX0NCisNCisJcmV0dXJu IHNyY1NpemU7DQorfQ0KKw0KK1pTVERfU1RBVElDIHNpemVfdCBCSVRfZ2V0VXBwZXJCaXRzKHNp emVfdCBiaXRDb250YWluZXIsIFUzMiBjb25zdCBzdGFydCkgeyByZXR1cm4gYml0Q29udGFpbmVy ID4+IHN0YXJ0OyB9DQorDQorWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9nZXRNaWRkbGVCaXRzKHNp emVfdCBiaXRDb250YWluZXIsIFUzMiBjb25zdCBzdGFydCwgVTMyIGNvbnN0IG5iQml0cykgeyBy ZXR1cm4gKGJpdENvbnRhaW5lciA+PiBzdGFydCkgJiBCSVRfbWFza1tuYkJpdHNdOyB9DQorDQor WlNURF9TVEFUSUMgc2l6ZV90IEJJVF9nZXRMb3dlckJpdHMoc2l6ZV90IGJpdENvbnRhaW5lciwg VTMyIGNvbnN0IG5iQml0cykgeyByZXR1cm4gYml0Q29udGFpbmVyICYgQklUX21hc2tbbmJCaXRz XTsgfQ0KKw0KKy8qISBCSVRfbG9va0JpdHMoKSA6DQorICogIFByb3ZpZGVzIG5leHQgbiBiaXRz IGZyb20gbG9jYWwgcmVnaXN0ZXIuDQorICogIGxvY2FsIHJlZ2lzdGVyIGlzIG5vdCBtb2RpZmll ZC4NCisgKiAgT24gMzItYml0cywgbWF4TmJCaXRzPT0yNC4NCisgKiAgT24gNjQtYml0cywgbWF4 TmJCaXRzPT01Ni4NCisgKiAgQHJldHVybiA6IHZhbHVlIGV4dHJhY3RlZA0KKyAqLw0KK1pTVERf U1RBVElDIHNpemVfdCBCSVRfbG9va0JpdHMoY29uc3QgQklUX0RTdHJlYW1fdCAqYml0RCwgVTMy IG5iQml0cykNCit7DQorCVUzMiBjb25zdCBiaXRNYXNrID0gc2l6ZW9mKGJpdEQtPmJpdENvbnRh aW5lcikgKiA4IC0gMTsNCisJcmV0dXJuICgoYml0RC0+Yml0Q29udGFpbmVyIDw8IChiaXRELT5i aXRzQ29uc3VtZWQgJiBiaXRNYXNrKSkgPj4gMSkgPj4gKChiaXRNYXNrIC0gbmJCaXRzKSAmIGJp dE1hc2spOw0KK30NCisNCisvKiEgQklUX2xvb2tCaXRzRmFzdCgpIDoNCisqICAgdW5zYWZlIHZl cnNpb247IG9ubHkgd29ya3Mgb25seSBpZiBuYkJpdHMgPj0gMSAqLw0KK1pTVERfU1RBVElDIHNp emVfdCBCSVRfbG9va0JpdHNGYXN0KGNvbnN0IEJJVF9EU3RyZWFtX3QgKmJpdEQsIFUzMiBuYkJp dHMpDQorew0KKwlVMzIgY29uc3QgYml0TWFzayA9IHNpemVvZihiaXRELT5iaXRDb250YWluZXIp ICogOCAtIDE7DQorCXJldHVybiAoYml0RC0+Yml0Q29udGFpbmVyIDw8IChiaXRELT5iaXRzQ29u c3VtZWQgJiBiaXRNYXNrKSkgPj4gKCgoYml0TWFzayArIDEpIC0gbmJCaXRzKSAmIGJpdE1hc2sp Ow0KK30NCisNCitaU1REX1NUQVRJQyB2b2lkIEJJVF9za2lwQml0cyhCSVRfRFN0cmVhbV90ICpi aXRELCBVMzIgbmJCaXRzKSB7IGJpdEQtPmJpdHNDb25zdW1lZCArPSBuYkJpdHM7IH0NCisNCisv KiEgQklUX3JlYWRCaXRzKCkgOg0KKyAqICBSZWFkIChjb25zdW1lKSBuZXh0IG4gYml0cyBmcm9t IGxvY2FsIHJlZ2lzdGVyIGFuZCB1cGRhdGUuDQorICogIFBheSBhdHRlbnRpb24gdG8gbm90IHJl YWQgbW9yZSB0aGFuIG5iQml0cyBjb250YWluZWQgaW50byBsb2NhbCByZWdpc3Rlci4NCisgKiAg QHJldHVybiA6IGV4dHJhY3RlZCB2YWx1ZS4NCisgKi8NCitaU1REX1NUQVRJQyBzaXplX3QgQklU X3JlYWRCaXRzKEJJVF9EU3RyZWFtX3QgKmJpdEQsIFUzMiBuYkJpdHMpDQorew0KKwlzaXplX3Qg Y29uc3QgdmFsdWUgPSBCSVRfbG9va0JpdHMoYml0RCwgbmJCaXRzKTsNCisJQklUX3NraXBCaXRz KGJpdEQsIG5iQml0cyk7DQorCXJldHVybiB2YWx1ZTsNCit9DQorDQorLyohIEJJVF9yZWFkQml0 c0Zhc3QoKSA6DQorKiAgIHVuc2FmZSB2ZXJzaW9uOyBvbmx5IHdvcmtzIG9ubHkgaWYgbmJCaXRz ID49IDEgKi8NCitaU1REX1NUQVRJQyBzaXplX3QgQklUX3JlYWRCaXRzRmFzdChCSVRfRFN0cmVh bV90ICpiaXRELCBVMzIgbmJCaXRzKQ0KK3sNCisJc2l6ZV90IGNvbnN0IHZhbHVlID0gQklUX2xv b2tCaXRzRmFzdChiaXRELCBuYkJpdHMpOw0KKwlCSVRfc2tpcEJpdHMoYml0RCwgbmJCaXRzKTsN CisJcmV0dXJuIHZhbHVlOw0KK30NCisNCisvKiEgQklUX3JlbG9hZERTdHJlYW0oKSA6DQorKiAg IFJlZmlsbCBgYml0RGAgZnJvbSBidWZmZXIgcHJldmlvdXNseSBzZXQgaW4gQklUX2luaXREU3Ry ZWFtKCkgLg0KKyogICBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUsIGl0IGd1YXJhbnRlZXMgaXQgd2ls bCBub3QgcmVhZCBiZXlvbmQgc3JjIGJ1ZmZlci4NCisqICAgQHJldHVybiA6IHN0YXR1cyBvZiBg QklUX0RTdHJlYW1fdGAgaW50ZXJuYWwgcmVnaXN0ZXIuDQorCQkJICBpZiBzdGF0dXMgPT0gQklU X0RTdHJlYW1fdW5maW5pc2hlZCwgaW50ZXJuYWwgcmVnaXN0ZXIgaXMgZmlsbGVkIHdpdGggPj0g KHNpemVvZihiaXRELT5iaXRDb250YWluZXIpKjggLSA3KSBiaXRzICovDQorWlNURF9TVEFUSUMg QklUX0RTdHJlYW1fc3RhdHVzIEJJVF9yZWxvYWREU3RyZWFtKEJJVF9EU3RyZWFtX3QgKmJpdEQp DQorew0KKwlpZiAoYml0RC0+Yml0c0NvbnN1bWVkID4gKHNpemVvZihiaXRELT5iaXRDb250YWlu ZXIpICogOCkpIC8qIHNob3VsZCBub3QgaGFwcGVuID0+IGNvcnJ1cHRpb24gZGV0ZWN0ZWQgKi8N CisJCXJldHVybiBCSVRfRFN0cmVhbV9vdmVyZmxvdzsNCisNCisJaWYgKGJpdEQtPnB0ciA+PSBi aXRELT5zdGFydCArIHNpemVvZihiaXRELT5iaXRDb250YWluZXIpKSB7DQorCQliaXRELT5wdHIg LT0gYml0RC0+Yml0c0NvbnN1bWVkID4+IDM7DQorCQliaXRELT5iaXRzQ29uc3VtZWQgJj0gNzsN CisJCWJpdEQtPmJpdENvbnRhaW5lciA9IFpTVERfcmVhZExFU1QoYml0RC0+cHRyKTsNCisJCXJl dHVybiBCSVRfRFN0cmVhbV91bmZpbmlzaGVkOw0KKwl9DQorCWlmIChiaXRELT5wdHIgPT0gYml0 RC0+c3RhcnQpIHsNCisJCWlmIChiaXRELT5iaXRzQ29uc3VtZWQgPCBzaXplb2YoYml0RC0+Yml0 Q29udGFpbmVyKSAqIDgpDQorCQkJcmV0dXJuIEJJVF9EU3RyZWFtX2VuZE9mQnVmZmVyOw0KKwkJ cmV0dXJuIEJJVF9EU3RyZWFtX2NvbXBsZXRlZDsNCisJfQ0KKwl7DQorCQlVMzIgbmJCeXRlcyA9 IGJpdEQtPmJpdHNDb25zdW1lZCA+PiAzOw0KKwkJQklUX0RTdHJlYW1fc3RhdHVzIHJlc3VsdCA9 IEJJVF9EU3RyZWFtX3VuZmluaXNoZWQ7DQorCQlpZiAoYml0RC0+cHRyIC0gbmJCeXRlcyA8IGJp dEQtPnN0YXJ0KSB7DQorCQkJbmJCeXRlcyA9IChVMzIpKGJpdEQtPnB0ciAtIGJpdEQtPnN0YXJ0 KTsgLyogcHRyID4gc3RhcnQgKi8NCisJCQlyZXN1bHQgPSBCSVRfRFN0cmVhbV9lbmRPZkJ1ZmZl cjsNCisJCX0NCisJCWJpdEQtPnB0ciAtPSBuYkJ5dGVzOw0KKwkJYml0RC0+Yml0c0NvbnN1bWVk IC09IG5iQnl0ZXMgKiA4Ow0KKwkJYml0RC0+Yml0Q29udGFpbmVyID0gWlNURF9yZWFkTEVTVChi aXRELT5wdHIpOyAvKiByZW1pbmRlciA6IHNyY1NpemUgPiBzaXplb2YoYml0RCkgKi8NCisJCXJl dHVybiByZXN1bHQ7DQorCX0NCit9DQorDQorLyohIEJJVF9lbmRPZkRTdHJlYW0oKSA6DQorKiAg IEByZXR1cm4gVGVsbHMgaWYgRFN0cmVhbSBoYXMgZXhhY3RseSByZWFjaGVkIGl0cyBlbmQgKGFs bCBiaXRzIGNvbnN1bWVkKS4NCisqLw0KK1pTVERfU1RBVElDIHVuc2lnbmVkIEJJVF9lbmRPZkRT dHJlYW0oY29uc3QgQklUX0RTdHJlYW1fdCAqRFN0cmVhbSkNCit7DQorCXJldHVybiAoKERTdHJl YW0tPnB0ciA9PSBEU3RyZWFtLT5zdGFydCkgJiYgKERTdHJlYW0tPmJpdHNDb25zdW1lZCA9PSBz aXplb2YoRFN0cmVhbS0+Yml0Q29udGFpbmVyKSAqIDgpKTsNCit9DQorDQorI2VuZGlmIC8qIEJJ VFNUUkVBTV9IX01PRFVMRSAqLw0KZGlmZiAtLWdpdCBhL3hlbi9jb21tb24venN0ZC9kZWNvbXBy ZXNzLmMgYi94ZW4vY29tbW9uL3pzdGQvZGVjb21wcmVzcy5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0 NA0KaW5kZXggMDAwMDAwMDAwMC4uZGI2NzYxZWE0ZA0KLS0tIC9kZXYvbnVsbA0KKysrIGIveGVu L2NvbW1vbi96c3RkL2RlY29tcHJlc3MuYw0KQEAgLTAsMCArMSwyNTMxIEBADQorLyoqDQorICog Q29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIFlhbm4gQ29sbGV0LCBGYWNlYm9vaywgSW5jLg0K KyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxp Y2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUNCisgKiBMSUNF TlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNl Ym9vay96c3RkLg0KKyAqIEFuIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4g YmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUNCisgKiBzYW1lIGRpcmVjdG9yeS4N CisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQ0KKyAq IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBwcm9ncmFtIGlzIGR1YWwtbGljZW5zZWQ7 IHlvdSBtYXkgc2VsZWN0DQorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQ0KKyAqICgiQlNEIikuDQorICov DQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqDQorKiAgVHVuaW5nIHBhcmFtZXRlcnMNCisqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiEN CisqICBNQVhXSU5ET1dTSVpFX0RFRkFVTFQgOg0KKyogIG1heGltdW0gd2luZG93IHNpemUgYWNj ZXB0ZWQgYnkgRFN0cmVhbSwgYnkgZGVmYXVsdC4NCisqICBGcmFtZXMgcmVxdWlyaW5nIG1vcmUg bWVtb3J5IHdpbGwgYmUgcmVqZWN0ZWQuDQorKi8NCisjaWZuZGVmIFpTVERfTUFYV0lORE9XU0la RV9ERUZBVUxUDQorI2RlZmluZSBaU1REX01BWFdJTkRPV1NJWkVfREVGQVVMVCAoKDEgPDwgWlNU RF9XSU5ET1dMT0dfTUFYKSArIDEpIC8qIGRlZmluZWQgd2l0aGluIHpzdGQuaCAqLw0KKyNlbmRp Zg0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioNCisqICBEZXBlbmRlbmNpZXMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgImZzZS5oIg0KKyNpbmNs dWRlICJodWYuaCINCisjaW5jbHVkZSAibWVtLmgiIC8qIGxvdyBsZXZlbCBtZW1vcnkgcm91dGlu ZXMgKi8NCisjaW5jbHVkZSAienN0ZF9pbnRlcm5hbC5oIg0KKyNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4NCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQorI2luY2x1ZGUgPGxpbnV4L3N0cmlu Zy5oPiAvKiBtZW1jcHksIG1lbW1vdmUsIG1lbXNldCAqLw0KKw0KKyNkZWZpbmUgWlNURF9QUkVG RVRDSChwdHIpIF9fYnVpbHRpbl9wcmVmZXRjaChwdHIsIDAsIDApDQorDQorLyotKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIE1hY3Jvcw0KKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVmaW5lIFpTVERfaXNFcnJvciBFUlJfaXNF cnJvciAvKiBmb3IgaW5saW5pbmcgKi8NCisjZGVmaW5lIEZTRV9pc0Vycm9yIEVSUl9pc0Vycm9y DQorI2RlZmluZSBIVUZfaXNFcnJvciBFUlJfaXNFcnJvcg0KKw0KKy8qXyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBNZW1vcnkgb3Bl cmF0aW9ucw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovDQorc3RhdGljIHZvaWQgWlNURF9jb3B5NCh2b2lkICpkc3QsIGNvbnN0IHZv aWQgKnNyYykgeyBtZW1jcHkoZHN0LCBzcmMsIDQpOyB9DQorDQorLyotKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICBDb250 ZXh0IG1hbmFnZW1lbnQNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovDQordHlwZWRlZiBlbnVtIHsNCisJWlNURGRzX2dldEZy YW1lSGVhZGVyU2l6ZSwNCisJWlNURGRzX2RlY29kZUZyYW1lSGVhZGVyLA0KKwlaU1REZHNfZGVj b2RlQmxvY2tIZWFkZXIsDQorCVpTVERkc19kZWNvbXByZXNzQmxvY2ssDQorCVpTVERkc19kZWNv bXByZXNzTGFzdEJsb2NrLA0KKwlaU1REZHNfY2hlY2tDaGVja3N1bSwNCisJWlNURGRzX2RlY29k ZVNraXBwYWJsZUhlYWRlciwNCisJWlNURGRzX3NraXBGcmFtZQ0KK30gWlNURF9kU3RhZ2U7DQor DQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlGU0VfRFRhYmxlIExMVGFibGVbRlNFX0RUQUJMRV9TSVpF X1UzMihMTEZTRUxvZyldOw0KKwlGU0VfRFRhYmxlIE9GVGFibGVbRlNFX0RUQUJMRV9TSVpFX1Uz MihPZmZGU0VMb2cpXTsNCisJRlNFX0RUYWJsZSBNTFRhYmxlW0ZTRV9EVEFCTEVfU0laRV9VMzIo TUxGU0VMb2cpXTsNCisJSFVGX0RUYWJsZSBodWZUYWJsZVtIVUZfRFRBQkxFX1NJWkUoSHVmTG9n KV07IC8qIGNhbiBhY2NvbW1vZGF0ZSBIVUZfZGVjb21wcmVzczRYICovDQorCVU2NCB3b3Jrc3Bh Y2VbSFVGX0RFQ09NUFJFU1NfV09SS1NQQUNFX1NJWkVfVTMyIC8gMl07DQorCVUzMiByZXBbWlNU RF9SRVBfTlVNXTsNCit9IFpTVERfZW50cm9weVRhYmxlc190Ow0KKw0KK3N0cnVjdCBaU1REX0RD dHhfcyB7DQorCWNvbnN0IEZTRV9EVGFibGUgKkxMVHB0cjsNCisJY29uc3QgRlNFX0RUYWJsZSAq TUxUcHRyOw0KKwljb25zdCBGU0VfRFRhYmxlICpPRlRwdHI7DQorCWNvbnN0IEhVRl9EVGFibGUg KkhVRnB0cjsNCisJWlNURF9lbnRyb3B5VGFibGVzX3QgZW50cm9weTsNCisJY29uc3Qgdm9pZCAq cHJldmlvdXNEc3RFbmQ7IC8qIGRldGVjdCBjb250aW51aXR5ICovDQorCWNvbnN0IHZvaWQgKmJh c2U7CSAgIC8qIHN0YXJ0IG9mIGN1cnIgc2VnbWVudCAqLw0KKwljb25zdCB2b2lkICp2QmFzZTsJ ICAvKiB2aXJ0dWFsIHN0YXJ0IG9mIHByZXZpb3VzIHNlZ21lbnQgaWYgaXQgd2FzIGp1c3QgYmVm b3JlIGN1cnIgb25lICovDQorCWNvbnN0IHZvaWQgKmRpY3RFbmQ7CS8qIGVuZCBvZiBwcmV2aW91 cyBzZWdtZW50ICovDQorCXNpemVfdCBleHBlY3RlZDsNCisJWlNURF9mcmFtZVBhcmFtcyBmUGFy YW1zOw0KKwlibG9ja1R5cGVfZSBiVHlwZTsgLyogdXNlZCBpbiBaU1REX2RlY29tcHJlc3NDb250 aW51ZSgpLCB0byB0cmFuc2ZlciBibG9ja1R5cGUgYmV0d2VlbiBoZWFkZXIgZGVjb2RpbmcgYW5k IGJsb2NrIGRlY29kaW5nIHN0YWdlcyAqLw0KKwlaU1REX2RTdGFnZSBzdGFnZTsNCisJVTMyIGxp dEVudHJvcHk7DQorCVUzMiBmc2VFbnRyb3B5Ow0KKwlzdHJ1Y3QgeHhoNjRfc3RhdGUgeHhoU3Rh dGU7DQorCXNpemVfdCBoZWFkZXJTaXplOw0KKwlVMzIgZGljdElEOw0KKwljb25zdCBCWVRFICps aXRQdHI7DQorCVpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbTsNCisJc2l6ZV90IGxpdFNpemU7DQor CXNpemVfdCBybGVTaXplOw0KKwlCWVRFIGxpdEJ1ZmZlcltaU1REX0JMT0NLU0laRV9BQlNPTFVU RU1BWCArIFdJTERDT1BZX09WRVJMRU5HVEhdOw0KKwlCWVRFIGhlYWRlckJ1ZmZlcltaU1REX0ZS QU1FSEVBREVSU0laRV9NQVhdOw0KK307IC8qIHR5cGVkZWYnZCB0byBaU1REX0RDdHggd2l0aGlu ICJ6c3RkLmgiICovDQorDQorc2l6ZV90IFpTVERfREN0eFdvcmtzcGFjZUJvdW5kKHZvaWQpIHsg cmV0dXJuIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfc3RhY2spKSArIFpTVERfQUxJR04oc2l6ZW9m KFpTVERfREN0eCkpOyB9DQorDQorc2l6ZV90IFpTVERfZGVjb21wcmVzc0JlZ2luKFpTVERfREN0 eCAqZGN0eCkNCit7DQorCWRjdHgtPmV4cGVjdGVkID0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJl Zml4Ow0KKwlkY3R4LT5zdGFnZSA9IFpTVERkc19nZXRGcmFtZUhlYWRlclNpemU7DQorCWRjdHgt PnByZXZpb3VzRHN0RW5kID0gTlVMTDsNCisJZGN0eC0+YmFzZSA9IE5VTEw7DQorCWRjdHgtPnZC YXNlID0gTlVMTDsNCisJZGN0eC0+ZGljdEVuZCA9IE5VTEw7DQorCWRjdHgtPmVudHJvcHkuaHVm VGFibGVbMF0gPSAoSFVGX0RUYWJsZSkoKEh1ZkxvZykqMHgxMDAwMDAxKTsgLyogY292ZXIgYm90 aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gKi8NCisJZGN0eC0+bGl0RW50cm9weSA9IGRjdHgtPmZz ZUVudHJvcHkgPSAwOw0KKwlkY3R4LT5kaWN0SUQgPSAwOw0KKwlaU1REX1NUQVRJQ19BU1NFUlQo c2l6ZW9mKGRjdHgtPmVudHJvcHkucmVwKSA9PSBzaXplb2YocmVwU3RhcnRWYWx1ZSkpOw0KKwlt ZW1jcHkoZGN0eC0+ZW50cm9weS5yZXAsIHJlcFN0YXJ0VmFsdWUsIHNpemVvZihyZXBTdGFydFZh bHVlKSk7IC8qIGluaXRpYWwgcmVwY29kZXMgKi8NCisJZGN0eC0+TExUcHRyID0gZGN0eC0+ZW50 cm9weS5MTFRhYmxlOw0KKwlkY3R4LT5NTFRwdHIgPSBkY3R4LT5lbnRyb3B5Lk1MVGFibGU7DQor CWRjdHgtPk9GVHB0ciA9IGRjdHgtPmVudHJvcHkuT0ZUYWJsZTsNCisJZGN0eC0+SFVGcHRyID0g ZGN0eC0+ZW50cm9weS5odWZUYWJsZTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1pTVERfREN0eCAq WlNURF9jcmVhdGVEQ3R4X2FkdmFuY2VkKFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkNCit7DQor CVpTVERfREN0eCAqZGN0eDsNCisNCisJaWYgKCFjdXN0b21NZW0uY3VzdG9tQWxsb2MgfHwgIWN1 c3RvbU1lbS5jdXN0b21GcmVlKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWRjdHggPSAoWlNURF9E Q3R4ICopWlNURF9tYWxsb2Moc2l6ZW9mKFpTVERfREN0eCksIGN1c3RvbU1lbSk7DQorCWlmICgh ZGN0eCkNCisJCXJldHVybiBOVUxMOw0KKwltZW1jcHkoJmRjdHgtPmN1c3RvbU1lbSwgJmN1c3Rv bU1lbSwgc2l6ZW9mKGN1c3RvbU1lbSkpOw0KKwlaU1REX2RlY29tcHJlc3NCZWdpbihkY3R4KTsN CisJcmV0dXJuIGRjdHg7DQorfQ0KKw0KK1pTVERfREN0eCAqWlNURF9pbml0REN0eCh2b2lkICp3 b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3sNCisJWlNURF9jdXN0b21NZW0gY29u c3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0K KwlyZXR1cm4gWlNURF9jcmVhdGVEQ3R4X2FkdmFuY2VkKHN0YWNrTWVtKTsNCit9DQorDQorc2l6 ZV90IFpTVERfZnJlZURDdHgoWlNURF9EQ3R4ICpkY3R4KQ0KK3sNCisJaWYgKGRjdHggPT0gTlVM TCkNCisJCXJldHVybiAwOyAvKiBzdXBwb3J0IGZyZWUgb24gTlVMTCAqLw0KKwlaU1REX2ZyZWUo ZGN0eCwgZGN0eC0+Y3VzdG9tTWVtKTsNCisJcmV0dXJuIDA7IC8qIHJlc2VydmVkIGFzIGEgcG90 ZW50aWFsIGVycm9yIGNvZGUgaW4gdGhlIGZ1dHVyZSAqLw0KK30NCisNCit2b2lkIFpTVERfY29w eURDdHgoWlNURF9EQ3R4ICpkc3REQ3R4LCBjb25zdCBaU1REX0RDdHggKnNyY0RDdHgpDQorew0K KwlzaXplX3QgY29uc3Qgd29ya1NwYWNlU2l6ZSA9IChaU1REX0JMT0NLU0laRV9BQlNPTFVURU1B WCArIFdJTERDT1BZX09WRVJMRU5HVEgpICsgWlNURF9mcmFtZUhlYWRlclNpemVfbWF4Ow0KKwlt ZW1jcHkoZHN0REN0eCwgc3JjREN0eCwgc2l6ZW9mKFpTVERfREN0eCkgLSB3b3JrU3BhY2VTaXpl KTsgLyogbm8gbmVlZCB0byBjb3B5IHdvcmtzcGFjZSAqLw0KK30NCisNCitzdGF0aWMgdm9pZCBa U1REX3JlZkREaWN0KFpTVERfREN0eCAqZHN0REN0eCwgY29uc3QgWlNURF9ERGljdCAqZGRpY3Qp Ow0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioNCisqICAgRGVjb21wcmVzc2lvbiBzZWN0aW9uDQorKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0K Ky8qISBaU1REX2lzRnJhbWUoKSA6DQorICogIFRlbGxzIGlmIHRoZSBjb250ZW50IG9mIGBidWZm ZXJgIHN0YXJ0cyB3aXRoIGEgdmFsaWQgRnJhbWUgSWRlbnRpZmllci4NCisgKiAgTm90ZSA6IEZy YW1lIElkZW50aWZpZXIgaXMgNCBieXRlcy4gSWYgYHNpemUgPCA0YCwgQHJldHVybiB3aWxsIGFs d2F5cyBiZSAwLg0KKyAqICBOb3RlIDIgOiBMZWdhY3kgRnJhbWUgSWRlbnRpZmllcnMgYXJlIGNv bnNpZGVyZWQgdmFsaWQgb25seSBpZiBMZWdhY3kgU3VwcG9ydCBpcyBlbmFibGVkLg0KKyAqICBO b3RlIDMgOiBTa2lwcGFibGUgRnJhbWUgSWRlbnRpZmllcnMgYXJlIGNvbnNpZGVyZWQgdmFsaWQu ICovDQordW5zaWduZWQgWlNURF9pc0ZyYW1lKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNp emUpDQorew0KKwlpZiAoc2l6ZSA8IDQpDQorCQlyZXR1cm4gMDsNCisJew0KKwkJVTMyIGNvbnN0 IG1hZ2ljID0gWlNURF9yZWFkTEUzMihidWZmZXIpOw0KKwkJaWYgKG1hZ2ljID09IFpTVERfTUFH SUNOVU1CRVIpDQorCQkJcmV0dXJuIDE7DQorCQlpZiAoKG1hZ2ljICYgMHhGRkZGRkZGMFUpID09 IFpTVERfTUFHSUNfU0tJUFBBQkxFX1NUQVJUKQ0KKwkJCXJldHVybiAxOw0KKwl9DQorCXJldHVy biAwOw0KK30NCisNCisvKiogWlNURF9mcmFtZUhlYWRlclNpemUoKSA6DQorKiAgIHNyY1NpemUg bXVzdCBiZSA+PSBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXguDQorKiAgIEByZXR1cm4gOiBz aXplIG9mIHRoZSBGcmFtZSBIZWFkZXIgKi8NCitzdGF0aWMgc2l6ZV90IFpTVERfZnJhbWVIZWFk ZXJTaXplKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQorew0KKwlpZiAoc3JjU2l6 ZSA8IFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeCkNCisJCXJldHVybiBFUlJPUihzcmNTaXpl X3dyb25nKTsNCisJew0KKwkJQllURSBjb25zdCBmaGQgPSAoKGNvbnN0IEJZVEUgKilzcmMpWzRd Ow0KKwkJVTMyIGNvbnN0IGRpY3RJRCA9IGZoZCAmIDM7DQorCQlVMzIgY29uc3Qgc2luZ2xlU2Vn bWVudCA9IChmaGQgPj4gNSkgJiAxOw0KKwkJVTMyIGNvbnN0IGZjc0lkID0gZmhkID4+IDY7DQor CQlyZXR1cm4gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4ICsgIXNpbmdsZVNlZ21lbnQgKyBa U1REX2RpZF9maWVsZFNpemVbZGljdElEXSArIFpTVERfZmNzX2ZpZWxkU2l6ZVtmY3NJZF0gKyAo c2luZ2xlU2VnbWVudCAmJiAhZmNzSWQpOw0KKwl9DQorfQ0KKw0KKy8qKiBaU1REX2dldEZyYW1l UGFyYW1zKCkgOg0KKyogICBkZWNvZGUgRnJhbWUgSGVhZGVyLCBvciByZXF1aXJlIGxhcmdlciBg c3JjU2l6ZWAuDQorKiAgIEByZXR1cm4gOiAwLCBgZnBhcmFtc1B0cmAgaXMgY29ycmVjdGx5IGZp bGxlZCwNCisqICAgICAgICAgICAgPjAsIGBzcmNTaXplYCBpcyB0b28gc21hbGwsIHJlc3VsdCBp cyBleHBlY3RlZCBgc3JjU2l6ZWAsDQorKiAgICAgICAgICAgICBvciBhbiBlcnJvciBjb2RlLCB3 aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIFpTVERfaXNFcnJvcigpICovDQorc2l6ZV90IFpTVERf Z2V0RnJhbWVQYXJhbXMoWlNURF9mcmFtZVBhcmFtcyAqZnBhcmFtc1B0ciwgY29uc3Qgdm9pZCAq c3JjLCBzaXplX3Qgc3JjU2l6ZSkNCit7DQorCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUg KilzcmM7DQorDQorCWlmIChzcmNTaXplIDwgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KQ0K KwkJcmV0dXJuIFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeDsNCisJaWYgKFpTVERfcmVhZExF MzIoc3JjKSAhPSBaU1REX01BR0lDTlVNQkVSKSB7DQorCQlpZiAoKFpTVERfcmVhZExFMzIoc3Jj KSAmIDB4RkZGRkZGRjBVKSA9PSBaU1REX01BR0lDX1NLSVBQQUJMRV9TVEFSVCkgew0KKwkJCWlm IChzcmNTaXplIDwgWlNURF9za2lwcGFibGVIZWFkZXJTaXplKQ0KKwkJCQlyZXR1cm4gWlNURF9z a2lwcGFibGVIZWFkZXJTaXplOyAvKiBtYWdpYyBudW1iZXIgKyBza2lwcGFibGUgZnJhbWUgbGVu Z3RoICovDQorCQkJbWVtc2V0KGZwYXJhbXNQdHIsIDAsIHNpemVvZigqZnBhcmFtc1B0cikpOw0K KwkJCWZwYXJhbXNQdHItPmZyYW1lQ29udGVudFNpemUgPSBaU1REX3JlYWRMRTMyKChjb25zdCBj aGFyICopc3JjICsgNCk7DQorCQkJZnBhcmFtc1B0ci0+d2luZG93U2l6ZSA9IDA7IC8qIHdpbmRv d1NpemU9PTAgbWVhbnMgYSBmcmFtZSBpcyBza2lwcGFibGUgKi8NCisJCQlyZXR1cm4gMDsNCisJ CX0NCisJCXJldHVybiBFUlJPUihwcmVmaXhfdW5rbm93bik7DQorCX0NCisNCisJLyogZW5zdXJl IHRoZXJlIGlzIGVub3VnaCBgc3JjU2l6ZWAgdG8gZnVsbHkgcmVhZC9kZWNvZGUgZnJhbWUgaGVh ZGVyICovDQorCXsNCisJCXNpemVfdCBjb25zdCBmaHNpemUgPSBaU1REX2ZyYW1lSGVhZGVyU2l6 ZShzcmMsIHNyY1NpemUpOw0KKwkJaWYgKHNyY1NpemUgPCBmaHNpemUpDQorCQkJcmV0dXJuIGZo c2l6ZTsNCisJfQ0KKw0KKwl7DQorCQlCWVRFIGNvbnN0IGZoZEJ5dGUgPSBpcFs0XTsNCisJCXNp emVfdCBwb3MgPSA1Ow0KKwkJVTMyIGNvbnN0IGRpY3RJRFNpemVDb2RlID0gZmhkQnl0ZSAmIDM7 DQorCQlVMzIgY29uc3QgY2hlY2tzdW1GbGFnID0gKGZoZEJ5dGUgPj4gMikgJiAxOw0KKwkJVTMy IGNvbnN0IHNpbmdsZVNlZ21lbnQgPSAoZmhkQnl0ZSA+PiA1KSAmIDE7DQorCQlVMzIgY29uc3Qg ZmNzSUQgPSBmaGRCeXRlID4+IDY7DQorCQlVMzIgY29uc3Qgd2luZG93U2l6ZU1heCA9IDFVIDw8 IFpTVERfV0lORE9XTE9HX01BWDsNCisJCVUzMiB3aW5kb3dTaXplID0gMDsNCisJCVUzMiBkaWN0 SUQgPSAwOw0KKwkJVTY0IGZyYW1lQ29udGVudFNpemUgPSAwOw0KKwkJaWYgKChmaGRCeXRlICYg MHgwOCkgIT0gMCkNCisJCQlyZXR1cm4gRVJST1IoZnJhbWVQYXJhbWV0ZXJfdW5zdXBwb3J0ZWQp OyAvKiByZXNlcnZlZCBiaXRzLCB3aGljaCBtdXN0IGJlIHplcm8gKi8NCisJCWlmICghc2luZ2xl U2VnbWVudCkgew0KKwkJCUJZVEUgY29uc3Qgd2xCeXRlID0gaXBbcG9zKytdOw0KKwkJCVUzMiBj b25zdCB3aW5kb3dMb2cgPSAod2xCeXRlID4+IDMpICsgWlNURF9XSU5ET1dMT0dfQUJTT0xVVEVN SU47DQorCQkJaWYgKHdpbmRvd0xvZyA+IFpTVERfV0lORE9XTE9HX01BWCkNCisJCQkJcmV0dXJu IEVSUk9SKGZyYW1lUGFyYW1ldGVyX3dpbmRvd1Rvb0xhcmdlKTsgLyogYXZvaWRzIGlzc3VlIHdp dGggMSA8PCB3aW5kb3dMb2cgKi8NCisJCQl3aW5kb3dTaXplID0gKDFVIDw8IHdpbmRvd0xvZyk7 DQorCQkJd2luZG93U2l6ZSArPSAod2luZG93U2l6ZSA+PiAzKSAqICh3bEJ5dGUgJiA3KTsNCisJ CX0NCisNCisJCXN3aXRjaCAoZGljdElEU2l6ZUNvZGUpIHsNCisJCWRlZmF1bHQ6IC8qIGltcG9z c2libGUgKi8NCisJCWNhc2UgMDogYnJlYWs7DQorCQljYXNlIDE6DQorCQkJZGljdElEID0gaXBb cG9zXTsNCisJCQlwb3MrKzsNCisJCQlicmVhazsNCisJCWNhc2UgMjoNCisJCQlkaWN0SUQgPSBa U1REX3JlYWRMRTE2KGlwICsgcG9zKTsNCisJCQlwb3MgKz0gMjsNCisJCQlicmVhazsNCisJCWNh c2UgMzoNCisJCQlkaWN0SUQgPSBaU1REX3JlYWRMRTMyKGlwICsgcG9zKTsNCisJCQlwb3MgKz0g NDsNCisJCQlicmVhazsNCisJCX0NCisJCXN3aXRjaCAoZmNzSUQpIHsNCisJCWRlZmF1bHQ6IC8q IGltcG9zc2libGUgKi8NCisJCWNhc2UgMDoNCisJCQlpZiAoc2luZ2xlU2VnbWVudCkNCisJCQkJ ZnJhbWVDb250ZW50U2l6ZSA9IGlwW3Bvc107DQorCQkJYnJlYWs7DQorCQljYXNlIDE6IGZyYW1l Q29udGVudFNpemUgPSBaU1REX3JlYWRMRTE2KGlwICsgcG9zKSArIDI1NjsgYnJlYWs7DQorCQlj YXNlIDI6IGZyYW1lQ29udGVudFNpemUgPSBaU1REX3JlYWRMRTMyKGlwICsgcG9zKTsgYnJlYWs7 DQorCQljYXNlIDM6IGZyYW1lQ29udGVudFNpemUgPSBaU1REX3JlYWRMRTY0KGlwICsgcG9zKTsg YnJlYWs7DQorCQl9DQorCQlpZiAoIXdpbmRvd1NpemUpDQorCQkJd2luZG93U2l6ZSA9IChVMzIp ZnJhbWVDb250ZW50U2l6ZTsNCisJCWlmICh3aW5kb3dTaXplID4gd2luZG93U2l6ZU1heCkNCisJ CQlyZXR1cm4gRVJST1IoZnJhbWVQYXJhbWV0ZXJfd2luZG93VG9vTGFyZ2UpOw0KKwkJZnBhcmFt c1B0ci0+ZnJhbWVDb250ZW50U2l6ZSA9IGZyYW1lQ29udGVudFNpemU7DQorCQlmcGFyYW1zUHRy LT53aW5kb3dTaXplID0gd2luZG93U2l6ZTsNCisJCWZwYXJhbXNQdHItPmRpY3RJRCA9IGRpY3RJ RDsNCisJCWZwYXJhbXNQdHItPmNoZWNrc3VtRmxhZyA9IGNoZWNrc3VtRmxhZzsNCisJfQ0KKwly ZXR1cm4gMDsNCit9DQorDQorLyoqIFpTVERfZ2V0RnJhbWVDb250ZW50U2l6ZSgpIDoNCisqICAg Y29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBtb2RlDQorKiAgIEByZXR1cm4gOiBkZWNvbXByZXNzZWQg c2l6ZSBvZiB0aGUgc2luZ2xlIGZyYW1lIHBvaW50ZWQgdG8gYmUgYHNyY2AgaWYga25vd24sIG90 aGVyd2lzZQ0KKyogICAgICAgICAgICAgLSBaU1REX0NPTlRFTlRTSVpFX1VOS05PV04gaWYgdGhl IHNpemUgY2Fubm90IGJlIGRldGVybWluZWQNCisqICAgICAgICAgICAgIC0gWlNURF9DT05URU5U U0laRV9FUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZCAoZS5nLiBpbnZhbGlkIG1hZ2ljIG51bWJl ciwgc3JjU2l6ZSB0b28gc21hbGwpICovDQordW5zaWduZWQgbG9uZyBsb25nIFpTVERfZ2V0RnJh bWVDb250ZW50U2l6ZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KK3sNCisJew0K KwkJWlNURF9mcmFtZVBhcmFtcyBmUGFyYW1zOw0KKwkJaWYgKFpTVERfZ2V0RnJhbWVQYXJhbXMo JmZQYXJhbXMsIHNyYywgc3JjU2l6ZSkgIT0gMCkNCisJCQlyZXR1cm4gWlNURF9DT05URU5UU0la RV9FUlJPUjsNCisJCWlmIChmUGFyYW1zLndpbmRvd1NpemUgPT0gMCkgew0KKwkJCS8qIEVpdGhl ciBza2lwcGFibGUgb3IgZW1wdHkgZnJhbWUsIHNpemUgPT0gMCBlaXRoZXIgd2F5ICovDQorCQkJ cmV0dXJuIDA7DQorCQl9IGVsc2UgaWYgKGZQYXJhbXMuZnJhbWVDb250ZW50U2l6ZSAhPSAwKSB7 DQorCQkJcmV0dXJuIGZQYXJhbXMuZnJhbWVDb250ZW50U2l6ZTsNCisJCX0gZWxzZSB7DQorCQkJ cmV0dXJuIFpTVERfQ09OVEVOVFNJWkVfVU5LTk9XTjsNCisJCX0NCisJfQ0KK30NCisNCisvKiog WlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZSgpIDoNCisgKiAgY29tcGF0aWJsZSB3aXRoIGxlZ2Fj eSBtb2RlDQorICogIGBzcmNTaXplYCBtdXN0IGJlIHRoZSBleGFjdCBsZW5ndGggb2Ygc29tZSBu dW1iZXIgb2YgWlNURCBjb21wcmVzc2VkIGFuZC9vcg0KKyAqICAgICAgc2tpcHBhYmxlIGZyYW1l cw0KKyAqICBAcmV0dXJuIDogZGVjb21wcmVzc2VkIHNpemUgb2YgdGhlIGZyYW1lcyBjb250YWlu ZWQgKi8NCit1bnNpZ25lZCBsb25nIGxvbmcgWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZShjb25z dCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KK3sNCisJew0KKwkJdW5zaWduZWQgbG9uZyBs b25nIHRvdGFsRHN0U2l6ZSA9IDA7DQorCQl3aGlsZSAoc3JjU2l6ZSA+PSBaU1REX2ZyYW1lSGVh ZGVyU2l6ZV9wcmVmaXgpIHsNCisJCQljb25zdCBVMzIgbWFnaWNOdW1iZXIgPSBaU1REX3JlYWRM RTMyKHNyYyk7DQorDQorCQkJaWYgKChtYWdpY051bWJlciAmIDB4RkZGRkZGRjBVKSA9PSBaU1RE X01BR0lDX1NLSVBQQUJMRV9TVEFSVCkgew0KKwkJCQlzaXplX3Qgc2tpcHBhYmxlU2l6ZTsNCisJ CQkJaWYgKHNyY1NpemUgPCBaU1REX3NraXBwYWJsZUhlYWRlclNpemUpDQorCQkJCQlyZXR1cm4g RVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorCQkJCXNraXBwYWJsZVNpemUgPSBaU1REX3JlYWRMRTMy KChjb25zdCBCWVRFICopc3JjICsgNCkgKyBaU1REX3NraXBwYWJsZUhlYWRlclNpemU7DQorCQkJ CWlmIChzcmNTaXplIDwgc2tpcHBhYmxlU2l6ZSkgew0KKwkJCQkJcmV0dXJuIFpTVERfQ09OVEVO VFNJWkVfRVJST1I7DQorCQkJCX0NCisNCisJCQkJc3JjID0gKGNvbnN0IEJZVEUgKilzcmMgKyBz a2lwcGFibGVTaXplOw0KKwkJCQlzcmNTaXplIC09IHNraXBwYWJsZVNpemU7DQorCQkJCWNvbnRp bnVlOw0KKwkJCX0NCisNCisJCQl7DQorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBjb25zdCByZXQg PSBaU1REX2dldEZyYW1lQ29udGVudFNpemUoc3JjLCBzcmNTaXplKTsNCisJCQkJaWYgKHJldCA+ PSBaU1REX0NPTlRFTlRTSVpFX0VSUk9SKQ0KKwkJCQkJcmV0dXJuIHJldDsNCisNCisJCQkJLyog Y2hlY2sgZm9yIG92ZXJmbG93ICovDQorCQkJCWlmICh0b3RhbERzdFNpemUgKyByZXQgPCB0b3Rh bERzdFNpemUpDQorCQkJCQlyZXR1cm4gWlNURF9DT05URU5UU0laRV9FUlJPUjsNCisJCQkJdG90 YWxEc3RTaXplICs9IHJldDsNCisJCQl9DQorCQkJew0KKwkJCQlzaXplX3QgY29uc3QgZnJhbWVT cmNTaXplID0gWlNURF9maW5kRnJhbWVDb21wcmVzc2VkU2l6ZShzcmMsIHNyY1NpemUpOw0KKwkJ CQlpZiAoWlNURF9pc0Vycm9yKGZyYW1lU3JjU2l6ZSkpIHsNCisJCQkJCXJldHVybiBaU1REX0NP TlRFTlRTSVpFX0VSUk9SOw0KKwkJCQl9DQorDQorCQkJCXNyYyA9IChjb25zdCBCWVRFICopc3Jj ICsgZnJhbWVTcmNTaXplOw0KKwkJCQlzcmNTaXplIC09IGZyYW1lU3JjU2l6ZTsNCisJCQl9DQor CQl9DQorDQorCQlpZiAoc3JjU2l6ZSkgew0KKwkJCXJldHVybiBaU1REX0NPTlRFTlRTSVpFX0VS Uk9SOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHRvdGFsRHN0U2l6ZTsNCisJfQ0KK30NCisNCisvKiog WlNURF9kZWNvZGVGcmFtZUhlYWRlcigpIDoNCisqICAgYGhlYWRlclNpemVgIG11c3QgYmUgdGhl IHNpemUgcHJvdmlkZWQgYnkgWlNURF9mcmFtZUhlYWRlclNpemUoKS4NCisqICAgQHJldHVybiA6 IDAgaWYgc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2lu ZyBaU1REX2lzRXJyb3IoKSAqLw0KK3N0YXRpYyBzaXplX3QgWlNURF9kZWNvZGVGcmFtZUhlYWRl cihaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGhlYWRlclNpemUpDQor ew0KKwlzaXplX3QgY29uc3QgcmVzdWx0ID0gWlNURF9nZXRGcmFtZVBhcmFtcygmKGRjdHgtPmZQ YXJhbXMpLCBzcmMsIGhlYWRlclNpemUpOw0KKwlpZiAoWlNURF9pc0Vycm9yKHJlc3VsdCkpDQor CQlyZXR1cm4gcmVzdWx0OyAvKiBpbnZhbGlkIGhlYWRlciAqLw0KKwlpZiAocmVzdWx0ID4gMCkN CisJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsgLyogaGVhZGVyU2l6ZSB0b28gc21hbGwg Ki8NCisJaWYgKGRjdHgtPmZQYXJhbXMuZGljdElEICYmIChkY3R4LT5kaWN0SUQgIT0gZGN0eC0+ ZlBhcmFtcy5kaWN0SUQpKQ0KKwkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfd3JvbmcpOw0KKwlp ZiAoZGN0eC0+ZlBhcmFtcy5jaGVja3N1bUZsYWcpDQorCQl4eGg2NF9yZXNldCgmZGN0eC0+eHho U3RhdGUsIDApOw0KKwlyZXR1cm4gMDsNCit9DQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlibG9j a1R5cGVfZSBibG9ja1R5cGU7DQorCVUzMiBsYXN0QmxvY2s7DQorCVUzMiBvcmlnU2l6ZTsNCit9 IGJsb2NrUHJvcGVydGllc190Ow0KKw0KKy8qISBaU1REX2dldGNCbG9ja1NpemUoKSA6DQorKiAg IFByb3ZpZGVzIHRoZSBzaXplIG9mIGNvbXByZXNzZWQgYmxvY2sgZnJvbSBibG9jayBoZWFkZXIg YHNyY2AgKi8NCitzaXplX3QgWlNURF9nZXRjQmxvY2tTaXplKGNvbnN0IHZvaWQgKnNyYywgc2l6 ZV90IHNyY1NpemUsIGJsb2NrUHJvcGVydGllc190ICpicFB0cikNCit7DQorCWlmIChzcmNTaXpl IDwgWlNURF9ibG9ja0hlYWRlclNpemUpDQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7 DQorCXsNCisJCVUzMiBjb25zdCBjQmxvY2tIZWFkZXIgPSBaU1REX3JlYWRMRTI0KHNyYyk7DQor CQlVMzIgY29uc3QgY1NpemUgPSBjQmxvY2tIZWFkZXIgPj4gMzsNCisJCWJwUHRyLT5sYXN0Qmxv Y2sgPSBjQmxvY2tIZWFkZXIgJiAxOw0KKwkJYnBQdHItPmJsb2NrVHlwZSA9IChibG9ja1R5cGVf ZSkoKGNCbG9ja0hlYWRlciA+PiAxKSAmIDMpOw0KKwkJYnBQdHItPm9yaWdTaXplID0gY1NpemU7 IC8qIG9ubHkgdXNlZnVsIGZvciBSTEUgKi8NCisJCWlmIChicFB0ci0+YmxvY2tUeXBlID09IGJ0 X3JsZSkNCisJCQlyZXR1cm4gMTsNCisJCWlmIChicFB0ci0+YmxvY2tUeXBlID09IGJ0X3Jlc2Vy dmVkKQ0KKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCXJldHVybiBj U2l6ZTsNCisJfQ0KK30NCisNCitzdGF0aWMgc2l6ZV90IFpTVERfY29weVJhd0Jsb2NrKHZvaWQg KmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXpl KQ0KK3sNCisJaWYgKHNyY1NpemUgPiBkc3RDYXBhY2l0eSkNCisJCXJldHVybiBFUlJPUihkc3RT aXplX3Rvb1NtYWxsKTsNCisJbWVtY3B5KGRzdCwgc3JjLCBzcmNTaXplKTsNCisJcmV0dXJuIHNy Y1NpemU7DQorfQ0KKw0KK3N0YXRpYyBzaXplX3QgWlNURF9zZXRSbGVCbG9jayh2b2lkICpkc3Qs IHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgc2l6 ZV90IHJlZ2VuU2l6ZSkNCit7DQorCWlmIChzcmNTaXplICE9IDEpDQorCQlyZXR1cm4gRVJST1Io c3JjU2l6ZV93cm9uZyk7DQorCWlmIChyZWdlblNpemUgPiBkc3RDYXBhY2l0eSkNCisJCXJldHVy biBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsNCisJbWVtc2V0KGRzdCwgKihjb25zdCBCWVRFICop c3JjLCByZWdlblNpemUpOw0KKwlyZXR1cm4gcmVnZW5TaXplOw0KK30NCisNCisvKiEgWlNURF9k ZWNvZGVMaXRlcmFsc0Jsb2NrKCkgOg0KKwlAcmV0dXJuIDogbmIgb2YgYnl0ZXMgcmVhZCBmcm9t IHNyYyAoPCBzcmNTaXplICkgKi8NCitzaXplX3QgWlNURF9kZWNvZGVMaXRlcmFsc0Jsb2NrKFpT VERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkgLyogbm90ZSA6 IHNyY1NpemUgPCBCTE9DS1NJWkUgKi8NCit7DQorCWlmIChzcmNTaXplIDwgTUlOX0NCTE9DS19T SVpFKQ0KKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKw0KKwl7DQorCQlj b25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAqKXNyYzsNCisJCXN5bWJvbEVu Y29kaW5nVHlwZV9lIGNvbnN0IGxpdEVuY1R5cGUgPSAoc3ltYm9sRW5jb2RpbmdUeXBlX2UpKGlz dGFydFswXSAmIDMpOw0KKw0KKwkJc3dpdGNoIChsaXRFbmNUeXBlKSB7DQorCQljYXNlIHNldF9y ZXBlYXQ6DQorCQkJaWYgKGRjdHgtPmxpdEVudHJvcHkgPT0gMCkNCisJCQkJcmV0dXJuIEVSUk9S KGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJCQkvKiBmYWxsIHRocm91Z2ggKi8NCisJCWNhc2Ug c2V0X2NvbXByZXNzZWQ6DQorCQkJaWYgKHNyY1NpemUgPCA1KQ0KKwkJCQlyZXR1cm4gRVJST1Io Y29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIHNyY1NpemUgPj0gTUlOX0NCTE9DS19TSVpFID09IDM7 IGhlcmUgd2UgbmVlZCB1cCB0byA1IGZvciBjYXNlIDMgKi8NCisJCQl7DQorCQkJCXNpemVfdCBs aFNpemUsIGxpdFNpemUsIGxpdENTaXplOw0KKwkJCQlVMzIgc2luZ2xlU3RyZWFtID0gMDsNCisJ CQkJVTMyIGNvbnN0IGxobENvZGUgPSAoaXN0YXJ0WzBdID4+IDIpICYgMzsNCisJCQkJVTMyIGNv bnN0IGxoYyA9IFpTVERfcmVhZExFMzIoaXN0YXJ0KTsNCisJCQkJc3dpdGNoIChsaGxDb2RlKSB7 DQorCQkJCWNhc2UgMDoNCisJCQkJY2FzZSAxOg0KKwkJCQlkZWZhdWx0OiAvKiBub3RlIDogZGVm YXVsdCBpcyBpbXBvc3NpYmxlLCBzaW5jZSBsaGxDb2RlIGludG8gWzAuLjNdICovDQorCQkJCQkv KiAyIC0gMiAtIDEwIC0gMTAgKi8NCisJCQkJCXNpbmdsZVN0cmVhbSA9ICFsaGxDb2RlOw0KKwkJ CQkJbGhTaXplID0gMzsNCisJCQkJCWxpdFNpemUgPSAobGhjID4+IDQpICYgMHgzRkY7DQorCQkJ CQlsaXRDU2l6ZSA9IChsaGMgPj4gMTQpICYgMHgzRkY7DQorCQkJCQlicmVhazsNCisJCQkJY2Fz ZSAyOg0KKwkJCQkJLyogMiAtIDIgLSAxNCAtIDE0ICovDQorCQkJCQlsaFNpemUgPSA0Ow0KKwkJ CQkJbGl0U2l6ZSA9IChsaGMgPj4gNCkgJiAweDNGRkY7DQorCQkJCQlsaXRDU2l6ZSA9IGxoYyA+ PiAxODsNCisJCQkJCWJyZWFrOw0KKwkJCQljYXNlIDM6DQorCQkJCQkvKiAyIC0gMiAtIDE4IC0g MTggKi8NCisJCQkJCWxoU2l6ZSA9IDU7DQorCQkJCQlsaXRTaXplID0gKGxoYyA+PiA0KSAmIDB4 M0ZGRkY7DQorCQkJCQlsaXRDU2l6ZSA9IChsaGMgPj4gMjIpICsgKGlzdGFydFs0XSA8PCAxMCk7 DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCQlpZiAobGl0U2l6ZSA+IFpTVERfQkxPQ0tTSVpF X0FCU09MVVRFTUFYKQ0KKwkJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0K KwkJCQlpZiAobGl0Q1NpemUgKyBsaFNpemUgPiBzcmNTaXplKQ0KKwkJCQkJcmV0dXJuIEVSUk9S KGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKw0KKwkJCQlpZiAoSFVGX2lzRXJyb3IoDQorCQkJCQko bGl0RW5jVHlwZSA9PSBzZXRfcmVwZWF0KQ0KKwkJCQkJICAgID8gKHNpbmdsZVN0cmVhbSA/IEhV Rl9kZWNvbXByZXNzMVhfdXNpbmdEVGFibGUoZGN0eC0+bGl0QnVmZmVyLCBsaXRTaXplLCBpc3Rh cnQgKyBsaFNpemUsIGxpdENTaXplLCBkY3R4LT5IVUZwdHIpDQorCQkJCQkJCSAgICA6IEhVRl9k ZWNvbXByZXNzNFhfdXNpbmdEVGFibGUoZGN0eC0+bGl0QnVmZmVyLCBsaXRTaXplLCBpc3RhcnQg KyBsaFNpemUsIGxpdENTaXplLCBkY3R4LT5IVUZwdHIpKQ0KKwkJCQkJICAgIDogKHNpbmdsZVN0 cmVhbQ0KKwkJCQkJCSAgID8gSFVGX2RlY29tcHJlc3MxWDJfREN0eF93a3NwKGRjdHgtPmVudHJv cHkuaHVmVGFibGUsIGRjdHgtPmxpdEJ1ZmZlciwgbGl0U2l6ZSwgaXN0YXJ0ICsgbGhTaXplLCBs aXRDU2l6ZSwNCisJCQkJCQkJCQkJIGRjdHgtPmVudHJvcHkud29ya3NwYWNlLCBzaXplb2YoZGN0 eC0+ZW50cm9weS53b3Jrc3BhY2UpKQ0KKwkJCQkJCSAgIDogSFVGX2RlY29tcHJlc3M0WF9odWZP bmx5X3drc3AoZGN0eC0+ZW50cm9weS5odWZUYWJsZSwgZGN0eC0+bGl0QnVmZmVyLCBsaXRTaXpl LCBpc3RhcnQgKyBsaFNpemUsIGxpdENTaXplLA0KKwkJCQkJCQkJCQkgICBkY3R4LT5lbnRyb3B5 LndvcmtzcGFjZSwgc2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSkpKSkNCisJCQkJCXJl dHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisNCisJCQkJZGN0eC0+bGl0UHRyID0g ZGN0eC0+bGl0QnVmZmVyOw0KKwkJCQlkY3R4LT5saXRTaXplID0gbGl0U2l6ZTsNCisJCQkJZGN0 eC0+bGl0RW50cm9weSA9IDE7DQorCQkJCWlmIChsaXRFbmNUeXBlID09IHNldF9jb21wcmVzc2Vk KQ0KKwkJCQkJZGN0eC0+SFVGcHRyID0gZGN0eC0+ZW50cm9weS5odWZUYWJsZTsNCisJCQkJbWVt c2V0KGRjdHgtPmxpdEJ1ZmZlciArIGRjdHgtPmxpdFNpemUsIDAsIFdJTERDT1BZX09WRVJMRU5H VEgpOw0KKwkJCQlyZXR1cm4gbGl0Q1NpemUgKyBsaFNpemU7DQorCQkJfQ0KKw0KKwkJY2FzZSBz ZXRfYmFzaWM6IHsNCisJCQlzaXplX3QgbGl0U2l6ZSwgbGhTaXplOw0KKwkJCVUzMiBjb25zdCBs aGxDb2RlID0gKChpc3RhcnRbMF0pID4+IDIpICYgMzsNCisJCQlzd2l0Y2ggKGxobENvZGUpIHsN CisJCQljYXNlIDA6DQorCQkJY2FzZSAyOg0KKwkJCWRlZmF1bHQ6IC8qIG5vdGUgOiBkZWZhdWx0 IGlzIGltcG9zc2libGUsIHNpbmNlIGxobENvZGUgaW50byBbMC4uM10gKi8NCisJCQkJbGhTaXpl ID0gMTsNCisJCQkJbGl0U2l6ZSA9IGlzdGFydFswXSA+PiAzOw0KKwkJCQlicmVhazsNCisJCQlj YXNlIDE6DQorCQkJCWxoU2l6ZSA9IDI7DQorCQkJCWxpdFNpemUgPSBaU1REX3JlYWRMRTE2KGlz dGFydCkgPj4gNDsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAzOg0KKwkJCQlsaFNpemUgPSAzOw0K KwkJCQlsaXRTaXplID0gWlNURF9yZWFkTEUyNChpc3RhcnQpID4+IDQ7DQorCQkJCWJyZWFrOw0K KwkJCX0NCisNCisJCQlpZiAobGhTaXplICsgbGl0U2l6ZSArIFdJTERDT1BZX09WRVJMRU5HVEgg PiBzcmNTaXplKSB7IC8qIHJpc2sgcmVhZGluZyBiZXlvbmQgc3JjIGJ1ZmZlciB3aXRoIHdpbGRj b3B5ICovDQorCQkJCWlmIChsaXRTaXplICsgbGhTaXplID4gc3JjU2l6ZSkNCisJCQkJCXJldHVy biBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCQkJbWVtY3B5KGRjdHgtPmxpdEJ1ZmZl ciwgaXN0YXJ0ICsgbGhTaXplLCBsaXRTaXplKTsNCisJCQkJZGN0eC0+bGl0UHRyID0gZGN0eC0+ bGl0QnVmZmVyOw0KKwkJCQlkY3R4LT5saXRTaXplID0gbGl0U2l6ZTsNCisJCQkJbWVtc2V0KGRj dHgtPmxpdEJ1ZmZlciArIGRjdHgtPmxpdFNpemUsIDAsIFdJTERDT1BZX09WRVJMRU5HVEgpOw0K KwkJCQlyZXR1cm4gbGhTaXplICsgbGl0U2l6ZTsNCisJCQl9DQorCQkJLyogZGlyZWN0IHJlZmVy ZW5jZSBpbnRvIGNvbXByZXNzZWQgc3RyZWFtICovDQorCQkJZGN0eC0+bGl0UHRyID0gaXN0YXJ0 ICsgbGhTaXplOw0KKwkJCWRjdHgtPmxpdFNpemUgPSBsaXRTaXplOw0KKwkJCXJldHVybiBsaFNp emUgKyBsaXRTaXplOw0KKwkJfQ0KKw0KKwkJY2FzZSBzZXRfcmxlOiB7DQorCQkJVTMyIGNvbnN0 IGxobENvZGUgPSAoKGlzdGFydFswXSkgPj4gMikgJiAzOw0KKwkJCXNpemVfdCBsaXRTaXplLCBs aFNpemU7DQorCQkJc3dpdGNoIChsaGxDb2RlKSB7DQorCQkJY2FzZSAwOg0KKwkJCWNhc2UgMjoN CisJCQlkZWZhdWx0OiAvKiBub3RlIDogZGVmYXVsdCBpcyBpbXBvc3NpYmxlLCBzaW5jZSBsaGxD b2RlIGludG8gWzAuLjNdICovDQorCQkJCWxoU2l6ZSA9IDE7DQorCQkJCWxpdFNpemUgPSBpc3Rh cnRbMF0gPj4gMzsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxOg0KKwkJCQlsaFNpemUgPSAyOw0K KwkJCQlsaXRTaXplID0gWlNURF9yZWFkTEUxNihpc3RhcnQpID4+IDQ7DQorCQkJCWJyZWFrOw0K KwkJCWNhc2UgMzoNCisJCQkJbGhTaXplID0gMzsNCisJCQkJbGl0U2l6ZSA9IFpTVERfcmVhZExF MjQoaXN0YXJ0KSA+PiA0Ow0KKwkJCQlpZiAoc3JjU2l6ZSA8IDQpDQorCQkJCQlyZXR1cm4gRVJS T1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIHNyY1NpemUgPj0gTUlOX0NCTE9DS19TSVpFID09 IDM7IGhlcmUgd2UgbmVlZCBsaFNpemUrMSA9IDQgKi8NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJ CWlmIChsaXRTaXplID4gWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgpDQorCQkJCXJldHVybiBF UlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCQltZW1zZXQoZGN0eC0+bGl0QnVmZmVyLCBp c3RhcnRbbGhTaXplXSwgbGl0U2l6ZSArIFdJTERDT1BZX09WRVJMRU5HVEgpOw0KKwkJCWRjdHgt PmxpdFB0ciA9IGRjdHgtPmxpdEJ1ZmZlcjsNCisJCQlkY3R4LT5saXRTaXplID0gbGl0U2l6ZTsN CisJCQlyZXR1cm4gbGhTaXplICsgMTsNCisJCX0NCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuIEVS Uk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBpbXBvc3NpYmxlICovDQorCQl9DQorCX0NCit9 DQorDQordHlwZWRlZiB1bmlvbiB7DQorCUZTRV9kZWNvZGVfdCByZWFsRGF0YTsNCisJVTMyIGFs aWduZWRCeTQ7DQorfSBGU0VfZGVjb2RlX3Q0Ow0KKw0KK3N0YXRpYyBjb25zdCBGU0VfZGVjb2Rl X3Q0IExMX2RlZmF1bHREVGFibGVbKDEgPDwgTExfREVGQVVMVE5PUk1MT0cpICsgMV0gPSB7DQor ICAgIHt7TExfREVGQVVMVE5PUk1MT0csIDEsIDF9fSwgLyogaGVhZGVyIDogdGFibGVMb2csIGZh c3RNb2RlLCBmYXN0TW9kZSAqLw0KKyAgICB7ezAsIDAsIDR9fSwJCSAvKiAwIDogYmFzZSwgc3lt Ym9sLCBiaXRzICovDQorICAgIHt7MTYsIDAsIDR9fSwNCisgICAge3szMiwgMSwgNX19LA0KKyAg ICB7ezAsIDMsIDV9fSwNCisgICAge3swLCA0LCA1fX0sDQorICAgIHt7MCwgNiwgNX19LA0KKyAg ICB7ezAsIDcsIDV9fSwNCisgICAge3swLCA5LCA1fX0sDQorICAgIHt7MCwgMTAsIDV9fSwNCisg ICAge3swLCAxMiwgNX19LA0KKyAgICB7ezAsIDE0LCA2fX0sDQorICAgIHt7MCwgMTYsIDV9fSwN CisgICAge3swLCAxOCwgNX19LA0KKyAgICB7ezAsIDE5LCA1fX0sDQorICAgIHt7MCwgMjEsIDV9 fSwNCisgICAge3swLCAyMiwgNX19LA0KKyAgICB7ezAsIDI0LCA1fX0sDQorICAgIHt7MzIsIDI1 LCA1fX0sDQorICAgIHt7MCwgMjYsIDV9fSwNCisgICAge3swLCAyNywgNn19LA0KKyAgICB7ezAs IDI5LCA2fX0sDQorICAgIHt7MCwgMzEsIDZ9fSwNCisgICAge3szMiwgMCwgNH19LA0KKyAgICB7 ezAsIDEsIDR9fSwNCisgICAge3swLCAyLCA1fX0sDQorICAgIHt7MzIsIDQsIDV9fSwNCisgICAg e3swLCA1LCA1fX0sDQorICAgIHt7MzIsIDcsIDV9fSwNCisgICAge3swLCA4LCA1fX0sDQorICAg IHt7MzIsIDEwLCA1fX0sDQorICAgIHt7MCwgMTEsIDV9fSwNCisgICAge3swLCAxMywgNn19LA0K KyAgICB7ezMyLCAxNiwgNX19LA0KKyAgICB7ezAsIDE3LCA1fX0sDQorICAgIHt7MzIsIDE5LCA1 fX0sDQorICAgIHt7MCwgMjAsIDV9fSwNCisgICAge3szMiwgMjIsIDV9fSwNCisgICAge3swLCAy MywgNX19LA0KKyAgICB7ezAsIDI1LCA0fX0sDQorICAgIHt7MTYsIDI1LCA0fX0sDQorICAgIHt7 MzIsIDI2LCA1fX0sDQorICAgIHt7MCwgMjgsIDZ9fSwNCisgICAge3swLCAzMCwgNn19LA0KKyAg ICB7ezQ4LCAwLCA0fX0sDQorICAgIHt7MTYsIDEsIDR9fSwNCisgICAge3szMiwgMiwgNX19LA0K KyAgICB7ezMyLCAzLCA1fX0sDQorICAgIHt7MzIsIDUsIDV9fSwNCisgICAge3szMiwgNiwgNX19 LA0KKyAgICB7ezMyLCA4LCA1fX0sDQorICAgIHt7MzIsIDksIDV9fSwNCisgICAge3szMiwgMTEs IDV9fSwNCisgICAge3szMiwgMTIsIDV9fSwNCisgICAge3swLCAxNSwgNn19LA0KKyAgICB7ezMy LCAxNywgNX19LA0KKyAgICB7ezMyLCAxOCwgNX19LA0KKyAgICB7ezMyLCAyMCwgNX19LA0KKyAg ICB7ezMyLCAyMSwgNX19LA0KKyAgICB7ezMyLCAyMywgNX19LA0KKyAgICB7ezMyLCAyNCwgNX19 LA0KKyAgICB7ezAsIDM1LCA2fX0sDQorICAgIHt7MCwgMzQsIDZ9fSwNCisgICAge3swLCAzMywg Nn19LA0KKyAgICB7ezAsIDMyLCA2fX0sDQorfTsgLyogTExfZGVmYXVsdERUYWJsZSAqLw0KKw0K K3N0YXRpYyBjb25zdCBGU0VfZGVjb2RlX3Q0IE1MX2RlZmF1bHREVGFibGVbKDEgPDwgTUxfREVG QVVMVE5PUk1MT0cpICsgMV0gPSB7DQorICAgIHt7TUxfREVGQVVMVE5PUk1MT0csIDEsIDF9fSwg LyogaGVhZGVyIDogdGFibGVMb2csIGZhc3RNb2RlLCBmYXN0TW9kZSAqLw0KKyAgICB7ezAsIDAs IDZ9fSwJCSAvKiAwIDogYmFzZSwgc3ltYm9sLCBiaXRzICovDQorICAgIHt7MCwgMSwgNH19LA0K KyAgICB7ezMyLCAyLCA1fX0sDQorICAgIHt7MCwgMywgNX19LA0KKyAgICB7ezAsIDUsIDV9fSwN CisgICAge3swLCA2LCA1fX0sDQorICAgIHt7MCwgOCwgNX19LA0KKyAgICB7ezAsIDEwLCA2fX0s DQorICAgIHt7MCwgMTMsIDZ9fSwNCisgICAge3swLCAxNiwgNn19LA0KKyAgICB7ezAsIDE5LCA2 fX0sDQorICAgIHt7MCwgMjIsIDZ9fSwNCisgICAge3swLCAyNSwgNn19LA0KKyAgICB7ezAsIDI4 LCA2fX0sDQorICAgIHt7MCwgMzEsIDZ9fSwNCisgICAge3swLCAzMywgNn19LA0KKyAgICB7ezAs IDM1LCA2fX0sDQorICAgIHt7MCwgMzcsIDZ9fSwNCisgICAge3swLCAzOSwgNn19LA0KKyAgICB7 ezAsIDQxLCA2fX0sDQorICAgIHt7MCwgNDMsIDZ9fSwNCisgICAge3swLCA0NSwgNn19LA0KKyAg ICB7ezE2LCAxLCA0fX0sDQorICAgIHt7MCwgMiwgNH19LA0KKyAgICB7ezMyLCAzLCA1fX0sDQor ICAgIHt7MCwgNCwgNX19LA0KKyAgICB7ezMyLCA2LCA1fX0sDQorICAgIHt7MCwgNywgNX19LA0K KyAgICB7ezAsIDksIDZ9fSwNCisgICAge3swLCAxMiwgNn19LA0KKyAgICB7ezAsIDE1LCA2fX0s DQorICAgIHt7MCwgMTgsIDZ9fSwNCisgICAge3swLCAyMSwgNn19LA0KKyAgICB7ezAsIDI0LCA2 fX0sDQorICAgIHt7MCwgMjcsIDZ9fSwNCisgICAge3swLCAzMCwgNn19LA0KKyAgICB7ezAsIDMy LCA2fX0sDQorICAgIHt7MCwgMzQsIDZ9fSwNCisgICAge3swLCAzNiwgNn19LA0KKyAgICB7ezAs IDM4LCA2fX0sDQorICAgIHt7MCwgNDAsIDZ9fSwNCisgICAge3swLCA0MiwgNn19LA0KKyAgICB7 ezAsIDQ0LCA2fX0sDQorICAgIHt7MzIsIDEsIDR9fSwNCisgICAge3s0OCwgMSwgNH19LA0KKyAg ICB7ezE2LCAyLCA0fX0sDQorICAgIHt7MzIsIDQsIDV9fSwNCisgICAge3szMiwgNSwgNX19LA0K KyAgICB7ezMyLCA3LCA1fX0sDQorICAgIHt7MzIsIDgsIDV9fSwNCisgICAge3swLCAxMSwgNn19 LA0KKyAgICB7ezAsIDE0LCA2fX0sDQorICAgIHt7MCwgMTcsIDZ9fSwNCisgICAge3swLCAyMCwg Nn19LA0KKyAgICB7ezAsIDIzLCA2fX0sDQorICAgIHt7MCwgMjYsIDZ9fSwNCisgICAge3swLCAy OSwgNn19LA0KKyAgICB7ezAsIDUyLCA2fX0sDQorICAgIHt7MCwgNTEsIDZ9fSwNCisgICAge3sw LCA1MCwgNn19LA0KKyAgICB7ezAsIDQ5LCA2fX0sDQorICAgIHt7MCwgNDgsIDZ9fSwNCisgICAg e3swLCA0NywgNn19LA0KKyAgICB7ezAsIDQ2LCA2fX0sDQorfTsgLyogTUxfZGVmYXVsdERUYWJs ZSAqLw0KKw0KK3N0YXRpYyBjb25zdCBGU0VfZGVjb2RlX3Q0IE9GX2RlZmF1bHREVGFibGVbKDEg PDwgT0ZfREVGQVVMVE5PUk1MT0cpICsgMV0gPSB7DQorICAgIHt7T0ZfREVGQVVMVE5PUk1MT0cs IDEsIDF9fSwgLyogaGVhZGVyIDogdGFibGVMb2csIGZhc3RNb2RlLCBmYXN0TW9kZSAqLw0KKyAg ICB7ezAsIDAsIDV9fSwJCSAvKiAwIDogYmFzZSwgc3ltYm9sLCBiaXRzICovDQorICAgIHt7MCwg NiwgNH19LA0KKyAgICB7ezAsIDksIDV9fSwNCisgICAge3swLCAxNSwgNX19LA0KKyAgICB7ezAs IDIxLCA1fX0sDQorICAgIHt7MCwgMywgNX19LA0KKyAgICB7ezAsIDcsIDR9fSwNCisgICAge3sw LCAxMiwgNX19LA0KKyAgICB7ezAsIDE4LCA1fX0sDQorICAgIHt7MCwgMjMsIDV9fSwNCisgICAg e3swLCA1LCA1fX0sDQorICAgIHt7MCwgOCwgNH19LA0KKyAgICB7ezAsIDE0LCA1fX0sDQorICAg IHt7MCwgMjAsIDV9fSwNCisgICAge3swLCAyLCA1fX0sDQorICAgIHt7MTYsIDcsIDR9fSwNCisg ICAge3swLCAxMSwgNX19LA0KKyAgICB7ezAsIDE3LCA1fX0sDQorICAgIHt7MCwgMjIsIDV9fSwN CisgICAge3swLCA0LCA1fX0sDQorICAgIHt7MTYsIDgsIDR9fSwNCisgICAge3swLCAxMywgNX19 LA0KKyAgICB7ezAsIDE5LCA1fX0sDQorICAgIHt7MCwgMSwgNX19LA0KKyAgICB7ezE2LCA2LCA0 fX0sDQorICAgIHt7MCwgMTAsIDV9fSwNCisgICAge3swLCAxNiwgNX19LA0KKyAgICB7ezAsIDI4 LCA1fX0sDQorICAgIHt7MCwgMjcsIDV9fSwNCisgICAge3swLCAyNiwgNX19LA0KKyAgICB7ezAs IDI1LCA1fX0sDQorICAgIHt7MCwgMjQsIDV9fSwNCit9OyAvKiBPRl9kZWZhdWx0RFRhYmxlICov DQorDQorLyohIFpTVERfYnVpbGRTZXFUYWJsZSgpIDoNCisJQHJldHVybiA6IG5iIGJ5dGVzIHJl YWQgZnJvbSBzcmMsDQorCQkJICBvciBhbiBlcnJvciBjb2RlIGlmIGl0IGZhaWxzLCB0ZXN0YWJs ZSB3aXRoIFpTVERfaXNFcnJvcigpDQorKi8NCitzdGF0aWMgc2l6ZV90IFpTVERfYnVpbGRTZXFU YWJsZShGU0VfRFRhYmxlICpEVGFibGVTcGFjZSwgY29uc3QgRlNFX0RUYWJsZSAqKkRUYWJsZVB0 ciwgc3ltYm9sRW5jb2RpbmdUeXBlX2UgdHlwZSwgVTMyIG1heCwgVTMyIG1heExvZywgY29uc3Qg dm9pZCAqc3JjLA0KKwkJCQkgc2l6ZV90IHNyY1NpemUsIGNvbnN0IEZTRV9kZWNvZGVfdDQgKmRl ZmF1bHRUYWJsZSwgVTMyIGZsYWdSZXBlYXRUYWJsZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qg d29ya3NwYWNlU2l6ZSkNCit7DQorCWNvbnN0IHZvaWQgKmNvbnN0IHRtcFB0ciA9IGRlZmF1bHRU YWJsZTsgLyogYnlwYXNzIHN0cmljdCBhbGlhc2luZyAqLw0KKwlzd2l0Y2ggKHR5cGUpIHsNCisJ Y2FzZSBzZXRfcmxlOg0KKwkJaWYgKCFzcmNTaXplKQ0KKwkJCXJldHVybiBFUlJPUihzcmNTaXpl X3dyb25nKTsNCisJCWlmICgoKihjb25zdCBCWVRFICopc3JjKSA+IG1heCkNCisJCQlyZXR1cm4g RVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQlGU0VfYnVpbGREVGFibGVfcmxlKERUYWJs ZVNwYWNlLCAqKGNvbnN0IEJZVEUgKilzcmMpOw0KKwkJKkRUYWJsZVB0ciA9IERUYWJsZVNwYWNl Ow0KKwkJcmV0dXJuIDE7DQorCWNhc2Ugc2V0X2Jhc2ljOiAqRFRhYmxlUHRyID0gKGNvbnN0IEZT RV9EVGFibGUgKil0bXBQdHI7IHJldHVybiAwOw0KKwljYXNlIHNldF9yZXBlYXQ6DQorCQlpZiAo IWZsYWdSZXBlYXRUYWJsZSkNCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7 DQorCQlyZXR1cm4gMDsNCisJZGVmYXVsdDogLyogaW1wb3NzaWJsZSAqLw0KKwljYXNlIHNldF9j b21wcmVzc2VkOiB7DQorCQlVMzIgdGFibGVMb2c7DQorCQlTMTYgKm5vcm0gPSAoUzE2ICopd29y a3NwYWNlOw0KKwkJc2l6ZV90IGNvbnN0IHNwYWNlVXNlZDMyID0gQUxJR04oc2l6ZW9mKFMxNikg KiAoTWF4U2VxICsgMSksIHNpemVvZihVMzIpKSA+PiAyOw0KKw0KKwkJaWYgKChzcGFjZVVzZWQz MiA8PCAyKSA+IHdvcmtzcGFjZVNpemUpDQorCQkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOw0KKwkJ d29ya3NwYWNlID0gKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOw0KKwkJd29ya3NwYWNl U2l6ZSAtPSAoc3BhY2VVc2VkMzIgPDwgMik7DQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IGhlYWRl clNpemUgPSBGU0VfcmVhZE5Db3VudChub3JtLCAmbWF4LCAmdGFibGVMb2csIHNyYywgc3JjU2l6 ZSk7DQorCQkJaWYgKEZTRV9pc0Vycm9yKGhlYWRlclNpemUpKQ0KKwkJCQlyZXR1cm4gRVJST1Io Y29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQkJaWYgKHRhYmxlTG9nID4gbWF4TG9nKQ0KKwkJCQly ZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQkJRlNFX2J1aWxkRFRhYmxlX3dr c3AoRFRhYmxlU3BhY2UsIG5vcm0sIG1heCwgdGFibGVMb2csIHdvcmtzcGFjZSwgd29ya3NwYWNl U2l6ZSk7DQorCQkJKkRUYWJsZVB0ciA9IERUYWJsZVNwYWNlOw0KKwkJCXJldHVybiBoZWFkZXJT aXplOw0KKwkJfQ0KKwl9DQorCX0NCit9DQorDQorc2l6ZV90IFpTVERfZGVjb2RlU2VxSGVhZGVy cyhaU1REX0RDdHggKmRjdHgsIGludCAqbmJTZXFQdHIsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90 IHNyY1NpemUpDQorew0KKwljb25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAq Y29uc3Qpc3JjOw0KKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXN0YXJ0ICsgc3JjU2l6ZTsN CisJY29uc3QgQllURSAqaXAgPSBpc3RhcnQ7DQorDQorCS8qIGNoZWNrICovDQorCWlmIChzcmNT aXplIDwgTUlOX1NFUVVFTkNFU19TSVpFKQ0KKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3Jvbmcp Ow0KKw0KKwkvKiBTZXFIZWFkICovDQorCXsNCisJCWludCBuYlNlcSA9ICppcCsrOw0KKwkJaWYg KCFuYlNlcSkgew0KKwkJCSpuYlNlcVB0ciA9IDA7DQorCQkJcmV0dXJuIDE7DQorCQl9DQorCQlp ZiAobmJTZXEgPiAweDdGKSB7DQorCQkJaWYgKG5iU2VxID09IDB4RkYpIHsNCisJCQkJaWYgKGlw ICsgMiA+IGllbmQpDQorCQkJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorCQkJCW5i U2VxID0gWlNURF9yZWFkTEUxNihpcCkgKyBMT05HTkJTRVEsIGlwICs9IDI7DQorCQkJfSBlbHNl IHsNCisJCQkJaWYgKGlwID49IGllbmQpDQorCQkJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9u Zyk7DQorCQkJCW5iU2VxID0gKChuYlNlcSAtIDB4ODApIDw8IDgpICsgKmlwKys7DQorCQkJfQ0K KwkJfQ0KKwkJKm5iU2VxUHRyID0gbmJTZXE7DQorCX0NCisNCisJLyogRlNFIHRhYmxlIGRlc2Ny aXB0b3JzICovDQorCWlmIChpcCArIDQgPiBpZW5kKQ0KKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVf d3JvbmcpOyAvKiBtaW5pbXVtIHBvc3NpYmxlIHNpemUgKi8NCisJew0KKwkJc3ltYm9sRW5jb2Rp bmdUeXBlX2UgY29uc3QgTEx0eXBlID0gKHN5bWJvbEVuY29kaW5nVHlwZV9lKSgqaXAgPj4gNik7 DQorCQlzeW1ib2xFbmNvZGluZ1R5cGVfZSBjb25zdCBPRnR5cGUgPSAoc3ltYm9sRW5jb2RpbmdU eXBlX2UpKCgqaXAgPj4gNCkgJiAzKTsNCisJCXN5bWJvbEVuY29kaW5nVHlwZV9lIGNvbnN0IE1M dHlwZSA9IChzeW1ib2xFbmNvZGluZ1R5cGVfZSkoKCppcCA+PiAyKSAmIDMpOw0KKwkJaXArKzsN CisNCisJCS8qIEJ1aWxkIERUYWJsZXMgKi8NCisJCXsNCisJCQlzaXplX3QgY29uc3QgbGxoU2l6 ZSA9IFpTVERfYnVpbGRTZXFUYWJsZShkY3R4LT5lbnRyb3B5LkxMVGFibGUsICZkY3R4LT5MTFRw dHIsIExMdHlwZSwgTWF4TEwsIExMRlNFTG9nLCBpcCwgaWVuZCAtIGlwLA0KKwkJCQkJCQkJICBM TF9kZWZhdWx0RFRhYmxlLCBkY3R4LT5mc2VFbnRyb3B5LCBkY3R4LT5lbnRyb3B5LndvcmtzcGFj ZSwgc2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSk7DQorCQkJaWYgKFpTVERfaXNFcnJv cihsbGhTaXplKSkNCisJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKwkJ CWlwICs9IGxsaFNpemU7DQorCQl9DQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IG9maFNpemUgPSBa U1REX2J1aWxkU2VxVGFibGUoZGN0eC0+ZW50cm9weS5PRlRhYmxlLCAmZGN0eC0+T0ZUcHRyLCBP RnR5cGUsIE1heE9mZiwgT2ZmRlNFTG9nLCBpcCwgaWVuZCAtIGlwLA0KKwkJCQkJCQkJICBPRl9k ZWZhdWx0RFRhYmxlLCBkY3R4LT5mc2VFbnRyb3B5LCBkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSwg c2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSk7DQorCQkJaWYgKFpTVERfaXNFcnJvcihv ZmhTaXplKSkNCisJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKwkJCWlw ICs9IG9maFNpemU7DQorCQl9DQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IG1saFNpemUgPSBaU1RE X2J1aWxkU2VxVGFibGUoZGN0eC0+ZW50cm9weS5NTFRhYmxlLCAmZGN0eC0+TUxUcHRyLCBNTHR5 cGUsIE1heE1MLCBNTEZTRUxvZywgaXAsIGllbmQgLSBpcCwNCisJCQkJCQkJCSAgTUxfZGVmYXVs dERUYWJsZSwgZGN0eC0+ZnNlRW50cm9weSwgZGN0eC0+ZW50cm9weS53b3Jrc3BhY2UsIHNpemVv ZihkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSkpOw0KKwkJCWlmIChaU1REX2lzRXJyb3IobWxoU2l6 ZSkpDQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCQlpcCArPSBt bGhTaXplOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiBpcCAtIGlzdGFydDsNCit9DQorDQordHlw ZWRlZiBzdHJ1Y3Qgew0KKwlzaXplX3QgbGl0TGVuZ3RoOw0KKwlzaXplX3QgbWF0Y2hMZW5ndGg7 DQorCXNpemVfdCBvZmZzZXQ7DQorCWNvbnN0IEJZVEUgKm1hdGNoOw0KK30gc2VxX3Q7DQorDQor dHlwZWRlZiBzdHJ1Y3Qgew0KKwlCSVRfRFN0cmVhbV90IERTdHJlYW07DQorCUZTRV9EU3RhdGVf dCBzdGF0ZUxMOw0KKwlGU0VfRFN0YXRlX3Qgc3RhdGVPZmZiOw0KKwlGU0VfRFN0YXRlX3Qgc3Rh dGVNTDsNCisJc2l6ZV90IHByZXZPZmZzZXRbWlNURF9SRVBfTlVNXTsNCisJY29uc3QgQllURSAq YmFzZTsNCisJc2l6ZV90IHBvczsNCisJdVB0ckRpZmYgZ290b0RpY3Q7DQorfSBzZXFTdGF0ZV90 Ow0KKw0KK0ZPUkNFX05PSU5MSU5FDQorc2l6ZV90IFpTVERfZXhlY1NlcXVlbmNlTGFzdDcoQllU RSAqb3AsIEJZVEUgKmNvbnN0IG9lbmQsIHNlcV90IHNlcXVlbmNlLCBjb25zdCBCWVRFICoqbGl0 UHRyLCBjb25zdCBCWVRFICpjb25zdCBsaXRMaW1pdCwgY29uc3QgQllURSAqY29uc3QgYmFzZSwN CisJCQkgICAgICBjb25zdCBCWVRFICpjb25zdCB2QmFzZSwgY29uc3QgQllURSAqY29uc3QgZGlj dEVuZCkNCit7DQorCUJZVEUgKmNvbnN0IG9MaXRFbmQgPSBvcCArIHNlcXVlbmNlLmxpdExlbmd0 aDsNCisJc2l6ZV90IGNvbnN0IHNlcXVlbmNlTGVuZ3RoID0gc2VxdWVuY2UubGl0TGVuZ3RoICsg c2VxdWVuY2UubWF0Y2hMZW5ndGg7DQorCUJZVEUgKmNvbnN0IG9NYXRjaEVuZCA9IG9wICsgc2Vx dWVuY2VMZW5ndGg7IC8qIHJpc2sgOiBhZGRyZXNzIHNwYWNlIG92ZXJmbG93ICgzMi1iaXRzKSAq Lw0KKwlCWVRFICpjb25zdCBvZW5kX3cgPSBvZW5kIC0gV0lMRENPUFlfT1ZFUkxFTkdUSDsNCisJ Y29uc3QgQllURSAqY29uc3QgaUxpdEVuZCA9ICpsaXRQdHIgKyBzZXF1ZW5jZS5saXRMZW5ndGg7 DQorCWNvbnN0IEJZVEUgKm1hdGNoID0gb0xpdEVuZCAtIHNlcXVlbmNlLm9mZnNldDsNCisNCisJ LyogY2hlY2sgKi8NCisJaWYgKG9NYXRjaEVuZCA+IG9lbmQpDQorCQlyZXR1cm4gRVJST1IoZHN0 U2l6ZV90b29TbWFsbCk7IC8qIGxhc3QgbWF0Y2ggbXVzdCBzdGFydCBhdCBhIG1pbmltdW0gZGlz dGFuY2Ugb2YgV0lMRENPUFlfT1ZFUkxFTkdUSCBmcm9tIG9lbmQgKi8NCisJaWYgKGlMaXRFbmQg PiBsaXRMaW1pdCkNCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogb3Zl ci1yZWFkIGJleW9uZCBsaXQgYnVmZmVyICovDQorCWlmIChvTGl0RW5kIDw9IG9lbmRfdykNCisJ CXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogUHJlY29uZGl0aW9uICovDQorDQorCS8qIGNvcHkg bGl0ZXJhbHMgKi8NCisJaWYgKG9wIDwgb2VuZF93KSB7DQorCQlaU1REX3dpbGRjb3B5KG9wLCAq bGl0UHRyLCBvZW5kX3cgLSBvcCk7DQorCQkqbGl0UHRyICs9IG9lbmRfdyAtIG9wOw0KKwkJb3Ag PSBvZW5kX3c7DQorCX0NCisJd2hpbGUgKG9wIDwgb0xpdEVuZCkNCisJCSpvcCsrID0gKigqbGl0 UHRyKSsrOw0KKw0KKwkvKiBjb3B5IE1hdGNoICovDQorCWlmIChzZXF1ZW5jZS5vZmZzZXQgPiAo c2l6ZV90KShvTGl0RW5kIC0gYmFzZSkpIHsNCisJCS8qIG9mZnNldCBiZXlvbmQgcHJlZml4ICov DQorCQlpZiAoc2VxdWVuY2Uub2Zmc2V0ID4gKHNpemVfdCkob0xpdEVuZCAtIHZCYXNlKSkNCisJ CQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQltYXRjaCA9IGRpY3RFbmQg LSAoYmFzZSAtIG1hdGNoKTsNCisJCWlmIChtYXRjaCArIHNlcXVlbmNlLm1hdGNoTGVuZ3RoIDw9 IGRpY3RFbmQpIHsNCisJCQltZW1tb3ZlKG9MaXRFbmQsIG1hdGNoLCBzZXF1ZW5jZS5tYXRjaExl bmd0aCk7DQorCQkJcmV0dXJuIHNlcXVlbmNlTGVuZ3RoOw0KKwkJfQ0KKwkJLyogc3BhbiBleHRE aWN0ICYgY3VyclByZWZpeFNlZ21lbnQgKi8NCisJCXsNCisJCQlzaXplX3QgY29uc3QgbGVuZ3Ro MSA9IGRpY3RFbmQgLSBtYXRjaDsNCisJCQltZW1tb3ZlKG9MaXRFbmQsIG1hdGNoLCBsZW5ndGgx KTsNCisJCQlvcCA9IG9MaXRFbmQgKyBsZW5ndGgxOw0KKwkJCXNlcXVlbmNlLm1hdGNoTGVuZ3Ro IC09IGxlbmd0aDE7DQorCQkJbWF0Y2ggPSBiYXNlOw0KKwkJfQ0KKwl9DQorCXdoaWxlIChvcCA8 IG9NYXRjaEVuZCkNCisJCSpvcCsrID0gKm1hdGNoKys7DQorCXJldHVybiBzZXF1ZW5jZUxlbmd0 aDsNCit9DQorDQorc3RhdGljIHNlcV90IFpTVERfZGVjb2RlU2VxdWVuY2Uoc2VxU3RhdGVfdCAq c2VxU3RhdGUpDQorew0KKwlzZXFfdCBzZXE7DQorDQorCVUzMiBjb25zdCBsbENvZGUgPSBGU0Vf cGVla1N5bWJvbCgmc2VxU3RhdGUtPnN0YXRlTEwpOw0KKwlVMzIgY29uc3QgbWxDb2RlID0gRlNF X3BlZWtTeW1ib2woJnNlcVN0YXRlLT5zdGF0ZU1MKTsNCisJVTMyIGNvbnN0IG9mQ29kZSA9IEZT RV9wZWVrU3ltYm9sKCZzZXFTdGF0ZS0+c3RhdGVPZmZiKTsgLyogPD0gbWF4T2ZmLCBieSB0YWJs ZSBjb25zdHJ1Y3Rpb24gKi8NCisNCisJVTMyIGNvbnN0IGxsQml0cyA9IExMX2JpdHNbbGxDb2Rl XTsNCisJVTMyIGNvbnN0IG1sQml0cyA9IE1MX2JpdHNbbWxDb2RlXTsNCisJVTMyIGNvbnN0IG9m Qml0cyA9IG9mQ29kZTsNCisJVTMyIGNvbnN0IHRvdGFsQml0cyA9IGxsQml0cyArIG1sQml0cyAr IG9mQml0czsNCisNCisJc3RhdGljIGNvbnN0IFUzMiBMTF9iYXNlW01heExMICsgMV0gPSB7MCwg IDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgICA5LCAgICAgMTAsICAgIDExLCAgICAx MiwgICAgMTMsICAgICAxNCwgICAgIDE1LCAgICAgMTYsICAgICAxOCwNCisJCQkJCSAgICAgICAy MCwgMjIsIDI0LCAyOCwgMzIsIDQwLCA0OCwgNjQsIDB4ODAsIDB4MTAwLCAweDIwMCwgMHg0MDAs IDB4ODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAsIDB4MTAwMDB9Ow0KKw0KKwlz dGF0aWMgY29uc3QgVTMyIE1MX2Jhc2VbTWF4TUwgKyAxXSA9IHszLCAgNCwgIDUsICA2LCAgNywg IDgsICA5LCAgMTAsICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAgMTYsICAg ICAxNywgICAgIDE4LCAgICAgMTksICAgICAyMCwNCisJCQkJCSAgICAgICAyMSwgMjIsIDIzLCAy NCwgMjUsIDI2LCAyNywgMjgsICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAg MzQsICAgICAzNSwgICAgIDM3LCAgICAgMzksICAgICA0MSwNCisJCQkJCSAgICAgICA0MywgNDcs IDUxLCA1OSwgNjcsIDgzLCA5OSwgMHg4MywgMHgxMDMsIDB4MjAzLCAweDQwMywgMHg4MDMsIDB4 MTAwMywgMHgyMDAzLCAweDQwMDMsIDB4ODAwMywgMHgxMDAwM307DQorDQorCXN0YXRpYyBjb25z dCBVMzIgT0ZfYmFzZVtNYXhPZmYgKyAxXSA9IHswLCAgICAgICAxLAkxLAk1LAkweEQsICAgICAg MHgxRCwgICAgICAweDNELCAgICAgIDB4N0QsICAgICAgMHhGRCwgICAgIDB4MUZELA0KKwkJCQkJ CTB4M0ZELCAgIDB4N0ZELCAgICAweEZGRCwgICAgMHgxRkZELCAgIDB4M0ZGRCwgICAweDdGRkQs ICAgIDB4RkZGRCwgICAgMHgxRkZGRCwgICAweDNGRkZELCAgMHg3RkZGRCwNCisJCQkJCQkweEZG RkZELCAweDFGRkZGRCwgMHgzRkZGRkQsIDB4N0ZGRkZELCAweEZGRkZGRCwgMHgxRkZGRkZELCAw eDNGRkZGRkQsIDB4N0ZGRkZGRCwgMHhGRkZGRkZEfTsNCisNCisJLyogc2VxdWVuY2UgKi8NCisJ ew0KKwkJc2l6ZV90IG9mZnNldDsNCisJCWlmICghb2ZDb2RlKQ0KKwkJCW9mZnNldCA9IDA7DQor CQllbHNlIHsNCisJCQlvZmZzZXQgPSBPRl9iYXNlW29mQ29kZV0gKyBCSVRfcmVhZEJpdHNGYXN0 KCZzZXFTdGF0ZS0+RFN0cmVhbSwgb2ZCaXRzKTsgLyogPD0gIChaU1REX1dJTkRPV0xPR19NQVgt MSkgYml0cyAqLw0KKwkJCWlmIChaU1REXzMyYml0cygpKQ0KKwkJCQlCSVRfcmVsb2FkRFN0cmVh bSgmc2VxU3RhdGUtPkRTdHJlYW0pOw0KKwkJfQ0KKw0KKwkJaWYgKG9mQ29kZSA8PSAxKSB7DQor CQkJb2Zmc2V0ICs9IChsbENvZGUgPT0gMCk7DQorCQkJaWYgKG9mZnNldCkgew0KKwkJCQlzaXpl X3QgdGVtcCA9IChvZmZzZXQgPT0gMykgPyBzZXFTdGF0ZS0+cHJldk9mZnNldFswXSAtIDEgOiBz ZXFTdGF0ZS0+cHJldk9mZnNldFtvZmZzZXRdOw0KKwkJCQl0ZW1wICs9ICF0ZW1wOyAvKiAwIGlz IG5vdCB2YWxpZDsgaW5wdXQgaXMgY29ycnVwdGVkOyBmb3JjZSBvZmZzZXQgdG8gMSAqLw0KKwkJ CQlpZiAob2Zmc2V0ICE9IDEpDQorCQkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsyXSA9IHNlcVN0 YXRlLT5wcmV2T2Zmc2V0WzFdOw0KKwkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsxXSA9IHNlcVN0 YXRlLT5wcmV2T2Zmc2V0WzBdOw0KKwkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFswXSA9IG9mZnNl dCA9IHRlbXA7DQorCQkJfSBlbHNlIHsNCisJCQkJb2Zmc2V0ID0gc2VxU3RhdGUtPnByZXZPZmZz ZXRbMF07DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsyXSA9 IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFdOw0KKwkJCXNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFdID0g c2VxU3RhdGUtPnByZXZPZmZzZXRbMF07DQorCQkJc2VxU3RhdGUtPnByZXZPZmZzZXRbMF0gPSBv ZmZzZXQ7DQorCQl9DQorCQlzZXEub2Zmc2V0ID0gb2Zmc2V0Ow0KKwl9DQorDQorCXNlcS5tYXRj aExlbmd0aCA9IE1MX2Jhc2VbbWxDb2RlXSArICgobWxDb2RlID4gMzEpID8gQklUX3JlYWRCaXRz RmFzdCgmc2VxU3RhdGUtPkRTdHJlYW0sIG1sQml0cykgOiAwKTsgLyogPD0gIDE2IGJpdHMgKi8N CisJaWYgKFpTVERfMzJiaXRzKCkgJiYgKG1sQml0cyArIGxsQml0cyA+IDI0KSkNCisJCUJJVF9y ZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS0+RFN0cmVhbSk7DQorDQorCXNlcS5saXRMZW5ndGggPSBM TF9iYXNlW2xsQ29kZV0gKyAoKGxsQ29kZSA+IDE1KSA/IEJJVF9yZWFkQml0c0Zhc3QoJnNlcVN0 YXRlLT5EU3RyZWFtLCBsbEJpdHMpIDogMCk7IC8qIDw9ICAxNiBiaXRzICovDQorCWlmIChaU1RE XzMyYml0cygpIHx8ICh0b3RhbEJpdHMgPiA2NCAtIDcgLSAoTExGU0VMb2cgKyBNTEZTRUxvZyAr IE9mZkZTRUxvZykpKQ0KKwkJQklUX3JlbG9hZERTdHJlYW0oJnNlcVN0YXRlLT5EU3RyZWFtKTsN CisNCisJLyogQU5TIHN0YXRlIHVwZGF0ZSAqLw0KKwlGU0VfdXBkYXRlU3RhdGUoJnNlcVN0YXRl LT5zdGF0ZUxMLCAmc2VxU3RhdGUtPkRTdHJlYW0pOyAvKiA8PSAgOSBiaXRzICovDQorCUZTRV91 cGRhdGVTdGF0ZSgmc2VxU3RhdGUtPnN0YXRlTUwsICZzZXFTdGF0ZS0+RFN0cmVhbSk7IC8qIDw9 ICA5IGJpdHMgKi8NCisJaWYgKFpTVERfMzJiaXRzKCkpDQorCQlCSVRfcmVsb2FkRFN0cmVhbSgm c2VxU3RhdGUtPkRTdHJlYW0pOwkJICAgLyogPD0gMTggYml0cyAqLw0KKwlGU0VfdXBkYXRlU3Rh dGUoJnNlcVN0YXRlLT5zdGF0ZU9mZmIsICZzZXFTdGF0ZS0+RFN0cmVhbSk7IC8qIDw9ICA4IGJp dHMgKi8NCisNCisJc2VxLm1hdGNoID0gTlVMTDsNCisNCisJcmV0dXJuIHNlcTsNCit9DQorDQor Rk9SQ0VfSU5MSU5FDQorc2l6ZV90IFpTVERfZXhlY1NlcXVlbmNlKEJZVEUgKm9wLCBCWVRFICpj b25zdCBvZW5kLCBzZXFfdCBzZXF1ZW5jZSwgY29uc3QgQllURSAqKmxpdFB0ciwgY29uc3QgQllU RSAqY29uc3QgbGl0TGltaXQsIGNvbnN0IEJZVEUgKmNvbnN0IGJhc2UsDQorCQkJIGNvbnN0IEJZ VEUgKmNvbnN0IHZCYXNlLCBjb25zdCBCWVRFICpjb25zdCBkaWN0RW5kKQ0KK3sNCisJQllURSAq Y29uc3Qgb0xpdEVuZCA9IG9wICsgc2VxdWVuY2UubGl0TGVuZ3RoOw0KKwlzaXplX3QgY29uc3Qg c2VxdWVuY2VMZW5ndGggPSBzZXF1ZW5jZS5saXRMZW5ndGggKyBzZXF1ZW5jZS5tYXRjaExlbmd0 aDsNCisJQllURSAqY29uc3Qgb01hdGNoRW5kID0gb3AgKyBzZXF1ZW5jZUxlbmd0aDsgLyogcmlz ayA6IGFkZHJlc3Mgc3BhY2Ugb3ZlcmZsb3cgKDMyLWJpdHMpICovDQorCUJZVEUgKmNvbnN0IG9l bmRfdyA9IG9lbmQgLSBXSUxEQ09QWV9PVkVSTEVOR1RIOw0KKwljb25zdCBCWVRFICpjb25zdCBp TGl0RW5kID0gKmxpdFB0ciArIHNlcXVlbmNlLmxpdExlbmd0aDsNCisJY29uc3QgQllURSAqbWF0 Y2ggPSBvTGl0RW5kIC0gc2VxdWVuY2Uub2Zmc2V0Ow0KKw0KKwkvKiBjaGVjayAqLw0KKwlpZiAo b01hdGNoRW5kID4gb2VuZCkNCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyog bGFzdCBtYXRjaCBtdXN0IHN0YXJ0IGF0IGEgbWluaW11bSBkaXN0YW5jZSBvZiBXSUxEQ09QWV9P VkVSTEVOR1RIIGZyb20gb2VuZCAqLw0KKwlpZiAoaUxpdEVuZCA+IGxpdExpbWl0KQ0KKwkJcmV0 dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBvdmVyLXJlYWQgYmV5b25kIGxpdCBi dWZmZXIgKi8NCisJaWYgKG9MaXRFbmQgPiBvZW5kX3cpDQorCQlyZXR1cm4gWlNURF9leGVjU2Vx dWVuY2VMYXN0NyhvcCwgb2VuZCwgc2VxdWVuY2UsIGxpdFB0ciwgbGl0TGltaXQsIGJhc2UsIHZC YXNlLCBkaWN0RW5kKTsNCisNCisJLyogY29weSBMaXRlcmFscyAqLw0KKwlaU1REX2NvcHk4KG9w LCAqbGl0UHRyKTsNCisJaWYgKHNlcXVlbmNlLmxpdExlbmd0aCA+IDgpDQorCQlaU1REX3dpbGRj b3B5KG9wICsgOCwgKCpsaXRQdHIpICsgOCwNCisJCQkgICAgICBzZXF1ZW5jZS5saXRMZW5ndGgg LSA4KTsgLyogbm90ZSA6IHNpbmNlIG9MaXRFbmQgPD0gb2VuZC1XSUxEQ09QWV9PVkVSTEVOR1RI LCBubyByaXNrIG9mIG92ZXJ3cml0ZSBiZXlvbmQgb2VuZCAqLw0KKwlvcCA9IG9MaXRFbmQ7DQor CSpsaXRQdHIgPSBpTGl0RW5kOyAvKiB1cGRhdGUgZm9yIG5leHQgc2VxdWVuY2UgKi8NCisNCisJ LyogY29weSBNYXRjaCAqLw0KKwlpZiAoc2VxdWVuY2Uub2Zmc2V0ID4gKHNpemVfdCkob0xpdEVu ZCAtIGJhc2UpKSB7DQorCQkvKiBvZmZzZXQgYmV5b25kIHByZWZpeCAqLw0KKwkJaWYgKHNlcXVl bmNlLm9mZnNldCA+IChzaXplX3QpKG9MaXRFbmQgLSB2QmFzZSkpDQorCQkJcmV0dXJuIEVSUk9S KGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKwkJbWF0Y2ggPSBkaWN0RW5kICsgKG1hdGNoIC0gYmFz ZSk7DQorCQlpZiAobWF0Y2ggKyBzZXF1ZW5jZS5tYXRjaExlbmd0aCA8PSBkaWN0RW5kKSB7DQor CQkJbWVtbW92ZShvTGl0RW5kLCBtYXRjaCwgc2VxdWVuY2UubWF0Y2hMZW5ndGgpOw0KKwkJCXJl dHVybiBzZXF1ZW5jZUxlbmd0aDsNCisJCX0NCisJCS8qIHNwYW4gZXh0RGljdCAmIGN1cnJQcmVm aXhTZWdtZW50ICovDQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IGxlbmd0aDEgPSBkaWN0RW5kIC0g bWF0Y2g7DQorCQkJbWVtbW92ZShvTGl0RW5kLCBtYXRjaCwgbGVuZ3RoMSk7DQorCQkJb3AgPSBv TGl0RW5kICsgbGVuZ3RoMTsNCisJCQlzZXF1ZW5jZS5tYXRjaExlbmd0aCAtPSBsZW5ndGgxOw0K KwkJCW1hdGNoID0gYmFzZTsNCisJCQlpZiAob3AgPiBvZW5kX3cgfHwgc2VxdWVuY2UubWF0Y2hM ZW5ndGggPCBNSU5NQVRDSCkgew0KKwkJCQlVMzIgaTsNCisJCQkJZm9yIChpID0gMDsgaSA8IHNl cXVlbmNlLm1hdGNoTGVuZ3RoOyArK2kpDQorCQkJCQlvcFtpXSA9IG1hdGNoW2ldOw0KKwkJCQly ZXR1cm4gc2VxdWVuY2VMZW5ndGg7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCS8qIFJlcXVpcmVtZW50 OiBvcCA8PSBvZW5kX3cgJiYgc2VxdWVuY2UubWF0Y2hMZW5ndGggPj0gTUlOTUFUQ0ggKi8NCisN CisJLyogbWF0Y2ggd2l0aGluIHByZWZpeCAqLw0KKwlpZiAoc2VxdWVuY2Uub2Zmc2V0IDwgOCkg ew0KKwkJLyogY2xvc2UgcmFuZ2UgbWF0Y2gsIG92ZXJsYXAgKi8NCisJCXN0YXRpYyBjb25zdCBV MzIgZGVjMzJ0YWJsZVtdID0gezAsIDEsIDIsIDEsIDQsIDQsIDQsIDR9OyAgIC8qIGFkZGVkICov DQorCQlzdGF0aWMgY29uc3QgaW50IGRlYzY0dGFibGVbXSA9IHs4LCA4LCA4LCA3LCA4LCA5LCAx MCwgMTF9OyAvKiBzdWJ0cmFjdGVkICovDQorCQlpbnQgY29uc3Qgc3ViMiA9IGRlYzY0dGFibGVb c2VxdWVuY2Uub2Zmc2V0XTsNCisJCW9wWzBdID0gbWF0Y2hbMF07DQorCQlvcFsxXSA9IG1hdGNo WzFdOw0KKwkJb3BbMl0gPSBtYXRjaFsyXTsNCisJCW9wWzNdID0gbWF0Y2hbM107DQorCQltYXRj aCArPSBkZWMzMnRhYmxlW3NlcXVlbmNlLm9mZnNldF07DQorCQlaU1REX2NvcHk0KG9wICsgNCwg bWF0Y2gpOw0KKwkJbWF0Y2ggLT0gc3ViMjsNCisJfSBlbHNlIHsNCisJCVpTVERfY29weTgob3As IG1hdGNoKTsNCisJfQ0KKwlvcCArPSA4Ow0KKwltYXRjaCArPSA4Ow0KKw0KKwlpZiAob01hdGNo RW5kID4gb2VuZCAtICgxNiAtIE1JTk1BVENIKSkgew0KKwkJaWYgKG9wIDwgb2VuZF93KSB7DQor CQkJWlNURF93aWxkY29weShvcCwgbWF0Y2gsIG9lbmRfdyAtIG9wKTsNCisJCQltYXRjaCArPSBv ZW5kX3cgLSBvcDsNCisJCQlvcCA9IG9lbmRfdzsNCisJCX0NCisJCXdoaWxlIChvcCA8IG9NYXRj aEVuZCkNCisJCQkqb3ArKyA9ICptYXRjaCsrOw0KKwl9IGVsc2Ugew0KKwkJWlNURF93aWxkY29w eShvcCwgbWF0Y2gsIChwdHJkaWZmX3Qpc2VxdWVuY2UubWF0Y2hMZW5ndGggLSA4KTsgLyogd29y a3MgZXZlbiBpZiBtYXRjaExlbmd0aCA8IDggKi8NCisJfQ0KKwlyZXR1cm4gc2VxdWVuY2VMZW5n dGg7DQorfQ0KKw0KK3N0YXRpYyBzaXplX3QgWlNURF9kZWNvbXByZXNzU2VxdWVuY2VzKFpTVERf REN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqc2Vx U3RhcnQsIHNpemVfdCBzZXFTaXplKQ0KK3sNCisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllU RSAqKXNlcVN0YXJ0Ow0KKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXAgKyBzZXFTaXplOw0K KwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqIGNvbnN0KWRzdDsNCisJQllURSAqY29uc3Qg b2VuZCA9IG9zdGFydCArIG1heERzdFNpemU7DQorCUJZVEUgKm9wID0gb3N0YXJ0Ow0KKwljb25z dCBCWVRFICpsaXRQdHIgPSBkY3R4LT5saXRQdHI7DQorCWNvbnN0IEJZVEUgKmNvbnN0IGxpdEVu ZCA9IGxpdFB0ciArIGRjdHgtPmxpdFNpemU7DQorCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSAo Y29uc3QgQllURSAqKShkY3R4LT5iYXNlKTsNCisJY29uc3QgQllURSAqY29uc3QgdkJhc2UgPSAo Y29uc3QgQllURSAqKShkY3R4LT52QmFzZSk7DQorCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RFbmQg PSAoY29uc3QgQllURSAqKShkY3R4LT5kaWN0RW5kKTsNCisJaW50IG5iU2VxOw0KKw0KKwkvKiBC dWlsZCBEZWNvZGluZyBUYWJsZXMgKi8NCisJew0KKwkJc2l6ZV90IGNvbnN0IHNlcUhTaXplID0g WlNURF9kZWNvZGVTZXFIZWFkZXJzKGRjdHgsICZuYlNlcSwgaXAsIHNlcVNpemUpOw0KKwkJaWYg KFpTVERfaXNFcnJvcihzZXFIU2l6ZSkpDQorCQkJcmV0dXJuIHNlcUhTaXplOw0KKwkJaXAgKz0g c2VxSFNpemU7DQorCX0NCisNCisJLyogUmVnZW4gc2VxdWVuY2VzICovDQorCWlmIChuYlNlcSkg ew0KKwkJc2VxU3RhdGVfdCBzZXFTdGF0ZTsNCisJCWRjdHgtPmZzZUVudHJvcHkgPSAxOw0KKwkJ ew0KKwkJCVUzMiBpOw0KKwkJCWZvciAoaSA9IDA7IGkgPCBaU1REX1JFUF9OVU07IGkrKykNCisJ CQkJc2VxU3RhdGUucHJldk9mZnNldFtpXSA9IGRjdHgtPmVudHJvcHkucmVwW2ldOw0KKwkJfQ0K KwkJQ0hFQ0tfRShCSVRfaW5pdERTdHJlYW0oJnNlcVN0YXRlLkRTdHJlYW0sIGlwLCBpZW5kIC0g aXApLCBjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCUZTRV9pbml0RFN0YXRlKCZzZXFTdGF0ZS5z dGF0ZUxMLCAmc2VxU3RhdGUuRFN0cmVhbSwgZGN0eC0+TExUcHRyKTsNCisJCUZTRV9pbml0RFN0 YXRlKCZzZXFTdGF0ZS5zdGF0ZU9mZmIsICZzZXFTdGF0ZS5EU3RyZWFtLCBkY3R4LT5PRlRwdHIp Ow0KKwkJRlNFX2luaXREU3RhdGUoJnNlcVN0YXRlLnN0YXRlTUwsICZzZXFTdGF0ZS5EU3RyZWFt LCBkY3R4LT5NTFRwdHIpOw0KKw0KKwkJZm9yICg7IChCSVRfcmVsb2FkRFN0cmVhbSgmKHNlcVN0 YXRlLkRTdHJlYW0pKSA8PSBCSVRfRFN0cmVhbV9jb21wbGV0ZWQpICYmIG5iU2VxOykgew0KKwkJ CW5iU2VxLS07DQorCQkJew0KKwkJCQlzZXFfdCBjb25zdCBzZXF1ZW5jZSA9IFpTVERfZGVjb2Rl U2VxdWVuY2UoJnNlcVN0YXRlKTsNCisJCQkJc2l6ZV90IGNvbnN0IG9uZVNlcVNpemUgPSBaU1RE X2V4ZWNTZXF1ZW5jZShvcCwgb2VuZCwgc2VxdWVuY2UsICZsaXRQdHIsIGxpdEVuZCwgYmFzZSwg dkJhc2UsIGRpY3RFbmQpOw0KKwkJCQlpZiAoWlNURF9pc0Vycm9yKG9uZVNlcVNpemUpKQ0KKwkJ CQkJcmV0dXJuIG9uZVNlcVNpemU7DQorCQkJCW9wICs9IG9uZVNlcVNpemU7DQorCQkJfQ0KKwkJ fQ0KKw0KKwkJLyogY2hlY2sgaWYgcmVhY2hlZCBleGFjdCBlbmQgKi8NCisJCWlmIChuYlNlcSkN CisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQkvKiBzYXZlIHJlcHMg Zm9yIG5leHQgYmxvY2sgKi8NCisJCXsNCisJCQlVMzIgaTsNCisJCQlmb3IgKGkgPSAwOyBpIDwg WlNURF9SRVBfTlVNOyBpKyspDQorCQkJCWRjdHgtPmVudHJvcHkucmVwW2ldID0gKFUzMikoc2Vx U3RhdGUucHJldk9mZnNldFtpXSk7DQorCQl9DQorCX0NCisNCisJLyogbGFzdCBsaXRlcmFsIHNl Z21lbnQgKi8NCisJew0KKwkJc2l6ZV90IGNvbnN0IGxhc3RMTFNpemUgPSBsaXRFbmQgLSBsaXRQ dHI7DQorCQlpZiAobGFzdExMU2l6ZSA+IChzaXplX3QpKG9lbmQgLSBvcCkpDQorCQkJcmV0dXJu IEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOw0KKwkJbWVtY3B5KG9wLCBsaXRQdHIsIGxhc3RMTFNp emUpOw0KKwkJb3AgKz0gbGFzdExMU2l6ZTsNCisJfQ0KKw0KKwlyZXR1cm4gb3AgLSBvc3RhcnQ7 DQorfQ0KKw0KK0ZPUkNFX0lOTElORSBzZXFfdCBaU1REX2RlY29kZVNlcXVlbmNlTG9uZ19nZW5l cmljKHNlcVN0YXRlX3QgKnNlcVN0YXRlLCBpbnQgY29uc3QgbG9uZ09mZnNldHMpDQorew0KKwlz ZXFfdCBzZXE7DQorDQorCVUzMiBjb25zdCBsbENvZGUgPSBGU0VfcGVla1N5bWJvbCgmc2VxU3Rh dGUtPnN0YXRlTEwpOw0KKwlVMzIgY29uc3QgbWxDb2RlID0gRlNFX3BlZWtTeW1ib2woJnNlcVN0 YXRlLT5zdGF0ZU1MKTsNCisJVTMyIGNvbnN0IG9mQ29kZSA9IEZTRV9wZWVrU3ltYm9sKCZzZXFT dGF0ZS0+c3RhdGVPZmZiKTsgLyogPD0gbWF4T2ZmLCBieSB0YWJsZSBjb25zdHJ1Y3Rpb24gKi8N CisNCisJVTMyIGNvbnN0IGxsQml0cyA9IExMX2JpdHNbbGxDb2RlXTsNCisJVTMyIGNvbnN0IG1s Qml0cyA9IE1MX2JpdHNbbWxDb2RlXTsNCisJVTMyIGNvbnN0IG9mQml0cyA9IG9mQ29kZTsNCisJ VTMyIGNvbnN0IHRvdGFsQml0cyA9IGxsQml0cyArIG1sQml0cyArIG9mQml0czsNCisNCisJc3Rh dGljIGNvbnN0IFUzMiBMTF9iYXNlW01heExMICsgMV0gPSB7MCwgIDEsICAyLCAgMywgIDQsICA1 LCAgNiwgIDcsICA4LCAgICA5LCAgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgICAxNCwg ICAgIDE1LCAgICAgMTYsICAgICAxOCwNCisJCQkJCSAgICAgICAyMCwgMjIsIDI0LCAyOCwgMzIs IDQwLCA0OCwgNjQsIDB4ODAsIDB4MTAwLCAweDIwMCwgMHg0MDAsIDB4ODAwLCAweDEwMDAsIDB4 MjAwMCwgMHg0MDAwLCAweDgwMDAsIDB4MTAwMDB9Ow0KKw0KKwlzdGF0aWMgY29uc3QgVTMyIE1M X2Jhc2VbTWF4TUwgKyAxXSA9IHszLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMTAsICAgMTEs ICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAgMTYsICAgICAxNywgICAgIDE4LCAgICAg MTksICAgICAyMCwNCisJCQkJCSAgICAgICAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgs ICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAgMzQsICAgICAzNSwgICAgIDM3 LCAgICAgMzksICAgICA0MSwNCisJCQkJCSAgICAgICA0MywgNDcsIDUxLCA1OSwgNjcsIDgzLCA5 OSwgMHg4MywgMHgxMDMsIDB4MjAzLCAweDQwMywgMHg4MDMsIDB4MTAwMywgMHgyMDAzLCAweDQw MDMsIDB4ODAwMywgMHgxMDAwM307DQorDQorCXN0YXRpYyBjb25zdCBVMzIgT0ZfYmFzZVtNYXhP ZmYgKyAxXSA9IHswLCAgICAgICAxLAkxLAk1LAkweEQsICAgICAgMHgxRCwgICAgICAweDNELCAg ICAgIDB4N0QsICAgICAgMHhGRCwgICAgIDB4MUZELA0KKwkJCQkJCTB4M0ZELCAgIDB4N0ZELCAg ICAweEZGRCwgICAgMHgxRkZELCAgIDB4M0ZGRCwgICAweDdGRkQsICAgIDB4RkZGRCwgICAgMHgx RkZGRCwgICAweDNGRkZELCAgMHg3RkZGRCwNCisJCQkJCQkweEZGRkZELCAweDFGRkZGRCwgMHgz RkZGRkQsIDB4N0ZGRkZELCAweEZGRkZGRCwgMHgxRkZGRkZELCAweDNGRkZGRkQsIDB4N0ZGRkZG RCwgMHhGRkZGRkZEfTsNCisNCisJLyogc2VxdWVuY2UgKi8NCisJew0KKwkJc2l6ZV90IG9mZnNl dDsNCisJCWlmICghb2ZDb2RlKQ0KKwkJCW9mZnNldCA9IDA7DQorCQllbHNlIHsNCisJCQlpZiAo bG9uZ09mZnNldHMpIHsNCisJCQkJaW50IGNvbnN0IGV4dHJhQml0cyA9IG9mQml0cyAtIE1JTihv ZkJpdHMsIFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU4pOw0KKwkJCQlvZmZzZXQgPSBPRl9iYXNlW29m Q29kZV0gKyAoQklUX3JlYWRCaXRzRmFzdCgmc2VxU3RhdGUtPkRTdHJlYW0sIG9mQml0cyAtIGV4 dHJhQml0cykgPDwgZXh0cmFCaXRzKTsNCisJCQkJaWYgKFpTVERfMzJiaXRzKCkgfHwgZXh0cmFC aXRzKQ0KKwkJCQkJQklUX3JlbG9hZERTdHJlYW0oJnNlcVN0YXRlLT5EU3RyZWFtKTsNCisJCQkJ aWYgKGV4dHJhQml0cykNCisJCQkJCW9mZnNldCArPSBCSVRfcmVhZEJpdHNGYXN0KCZzZXFTdGF0 ZS0+RFN0cmVhbSwgZXh0cmFCaXRzKTsNCisJCQl9IGVsc2Ugew0KKwkJCQlvZmZzZXQgPSBPRl9i YXNlW29mQ29kZV0gKyBCSVRfcmVhZEJpdHNGYXN0KCZzZXFTdGF0ZS0+RFN0cmVhbSwgb2ZCaXRz KTsgLyogPD0gIChaU1REX1dJTkRPV0xPR19NQVgtMSkgYml0cyAqLw0KKwkJCQlpZiAoWlNURF8z MmJpdHMoKSkNCisJCQkJCUJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS0+RFN0cmVhbSk7DQor CQkJfQ0KKwkJfQ0KKw0KKwkJaWYgKG9mQ29kZSA8PSAxKSB7DQorCQkJb2Zmc2V0ICs9IChsbENv ZGUgPT0gMCk7DQorCQkJaWYgKG9mZnNldCkgew0KKwkJCQlzaXplX3QgdGVtcCA9IChvZmZzZXQg PT0gMykgPyBzZXFTdGF0ZS0+cHJldk9mZnNldFswXSAtIDEgOiBzZXFTdGF0ZS0+cHJldk9mZnNl dFtvZmZzZXRdOw0KKwkJCQl0ZW1wICs9ICF0ZW1wOyAvKiAwIGlzIG5vdCB2YWxpZDsgaW5wdXQg aXMgY29ycnVwdGVkOyBmb3JjZSBvZmZzZXQgdG8gMSAqLw0KKwkJCQlpZiAob2Zmc2V0ICE9IDEp DQorCQkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsyXSA9IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFd Ow0KKwkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsxXSA9IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzBd Ow0KKwkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFswXSA9IG9mZnNldCA9IHRlbXA7DQorCQkJfSBl bHNlIHsNCisJCQkJb2Zmc2V0ID0gc2VxU3RhdGUtPnByZXZPZmZzZXRbMF07DQorCQkJfQ0KKwkJ fSBlbHNlIHsNCisJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsyXSA9IHNlcVN0YXRlLT5wcmV2T2Zm c2V0WzFdOw0KKwkJCXNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFdID0gc2VxU3RhdGUtPnByZXZPZmZz ZXRbMF07DQorCQkJc2VxU3RhdGUtPnByZXZPZmZzZXRbMF0gPSBvZmZzZXQ7DQorCQl9DQorCQlz ZXEub2Zmc2V0ID0gb2Zmc2V0Ow0KKwl9DQorDQorCXNlcS5tYXRjaExlbmd0aCA9IE1MX2Jhc2Vb bWxDb2RlXSArICgobWxDb2RlID4gMzEpID8gQklUX3JlYWRCaXRzRmFzdCgmc2VxU3RhdGUtPkRT dHJlYW0sIG1sQml0cykgOiAwKTsgLyogPD0gIDE2IGJpdHMgKi8NCisJaWYgKFpTVERfMzJiaXRz KCkgJiYgKG1sQml0cyArIGxsQml0cyA+IDI0KSkNCisJCUJJVF9yZWxvYWREU3RyZWFtKCZzZXFT dGF0ZS0+RFN0cmVhbSk7DQorDQorCXNlcS5saXRMZW5ndGggPSBMTF9iYXNlW2xsQ29kZV0gKyAo KGxsQ29kZSA+IDE1KSA/IEJJVF9yZWFkQml0c0Zhc3QoJnNlcVN0YXRlLT5EU3RyZWFtLCBsbEJp dHMpIDogMCk7IC8qIDw9ICAxNiBiaXRzICovDQorCWlmIChaU1REXzMyYml0cygpIHx8ICh0b3Rh bEJpdHMgPiA2NCAtIDcgLSAoTExGU0VMb2cgKyBNTEZTRUxvZyArIE9mZkZTRUxvZykpKQ0KKwkJ QklUX3JlbG9hZERTdHJlYW0oJnNlcVN0YXRlLT5EU3RyZWFtKTsNCisNCisJew0KKwkJc2l6ZV90 IGNvbnN0IHBvcyA9IHNlcVN0YXRlLT5wb3MgKyBzZXEubGl0TGVuZ3RoOw0KKwkJc2VxLm1hdGNo ID0gc2VxU3RhdGUtPmJhc2UgKyBwb3MgLSBzZXEub2Zmc2V0OyAvKiBzaW5nbGUgbWVtb3J5IHNl Z21lbnQgKi8NCisJCWlmIChzZXEub2Zmc2V0ID4gcG9zKQ0KKwkJCXNlcS5tYXRjaCArPSBzZXFT dGF0ZS0+Z290b0RpY3Q7IC8qIHNlcGFyYXRlIG1lbW9yeSBzZWdtZW50ICovDQorCQlzZXFTdGF0 ZS0+cG9zID0gcG9zICsgc2VxLm1hdGNoTGVuZ3RoOw0KKwl9DQorDQorCS8qIEFOUyBzdGF0ZSB1 cGRhdGUgKi8NCisJRlNFX3VwZGF0ZVN0YXRlKCZzZXFTdGF0ZS0+c3RhdGVMTCwgJnNlcVN0YXRl LT5EU3RyZWFtKTsgLyogPD0gIDkgYml0cyAqLw0KKwlGU0VfdXBkYXRlU3RhdGUoJnNlcVN0YXRl LT5zdGF0ZU1MLCAmc2VxU3RhdGUtPkRTdHJlYW0pOyAvKiA8PSAgOSBiaXRzICovDQorCWlmICha U1REXzMyYml0cygpKQ0KKwkJQklUX3JlbG9hZERTdHJlYW0oJnNlcVN0YXRlLT5EU3RyZWFtKTsJ CSAgIC8qIDw9IDE4IGJpdHMgKi8NCisJRlNFX3VwZGF0ZVN0YXRlKCZzZXFTdGF0ZS0+c3RhdGVP ZmZiLCAmc2VxU3RhdGUtPkRTdHJlYW0pOyAvKiA8PSAgOCBiaXRzICovDQorDQorCXJldHVybiBz ZXE7DQorfQ0KKw0KK3N0YXRpYyBzZXFfdCBaU1REX2RlY29kZVNlcXVlbmNlTG9uZyhzZXFTdGF0 ZV90ICpzZXFTdGF0ZSwgdW5zaWduZWQgY29uc3Qgd2luZG93U2l6ZSkNCit7DQorCWlmIChaU1RE X2hpZ2hiaXQzMih3aW5kb3dTaXplKSA+IFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU4pIHsNCisJCXJl dHVybiBaU1REX2RlY29kZVNlcXVlbmNlTG9uZ19nZW5lcmljKHNlcVN0YXRlLCAxKTsNCisJfSBl bHNlIHsNCisJCXJldHVybiBaU1REX2RlY29kZVNlcXVlbmNlTG9uZ19nZW5lcmljKHNlcVN0YXRl LCAwKTsNCisJfQ0KK30NCisNCitGT1JDRV9JTkxJTkUNCitzaXplX3QgWlNURF9leGVjU2VxdWVu Y2VMb25nKEJZVEUgKm9wLCBCWVRFICpjb25zdCBvZW5kLCBzZXFfdCBzZXF1ZW5jZSwgY29uc3Qg QllURSAqKmxpdFB0ciwgY29uc3QgQllURSAqY29uc3QgbGl0TGltaXQsIGNvbnN0IEJZVEUgKmNv bnN0IGJhc2UsDQorCQkJICAgICBjb25zdCBCWVRFICpjb25zdCB2QmFzZSwgY29uc3QgQllURSAq Y29uc3QgZGljdEVuZCkNCit7DQorCUJZVEUgKmNvbnN0IG9MaXRFbmQgPSBvcCArIHNlcXVlbmNl LmxpdExlbmd0aDsNCisJc2l6ZV90IGNvbnN0IHNlcXVlbmNlTGVuZ3RoID0gc2VxdWVuY2UubGl0 TGVuZ3RoICsgc2VxdWVuY2UubWF0Y2hMZW5ndGg7DQorCUJZVEUgKmNvbnN0IG9NYXRjaEVuZCA9 IG9wICsgc2VxdWVuY2VMZW5ndGg7IC8qIHJpc2sgOiBhZGRyZXNzIHNwYWNlIG92ZXJmbG93ICgz Mi1iaXRzKSAqLw0KKwlCWVRFICpjb25zdCBvZW5kX3cgPSBvZW5kIC0gV0lMRENPUFlfT1ZFUkxF TkdUSDsNCisJY29uc3QgQllURSAqY29uc3QgaUxpdEVuZCA9ICpsaXRQdHIgKyBzZXF1ZW5jZS5s aXRMZW5ndGg7DQorCWNvbnN0IEJZVEUgKm1hdGNoID0gc2VxdWVuY2UubWF0Y2g7DQorDQorCS8q IGNoZWNrICovDQorCWlmIChvTWF0Y2hFbmQgPiBvZW5kKQ0KKwkJcmV0dXJuIEVSUk9SKGRzdFNp emVfdG9vU21hbGwpOyAvKiBsYXN0IG1hdGNoIG11c3Qgc3RhcnQgYXQgYSBtaW5pbXVtIGRpc3Rh bmNlIG9mIFdJTERDT1BZX09WRVJMRU5HVEggZnJvbSBvZW5kICovDQorCWlmIChpTGl0RW5kID4g bGl0TGltaXQpDQorCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIG92ZXIt cmVhZCBiZXlvbmQgbGl0IGJ1ZmZlciAqLw0KKwlpZiAob0xpdEVuZCA+IG9lbmRfdykNCisJCXJl dHVybiBaU1REX2V4ZWNTZXF1ZW5jZUxhc3Q3KG9wLCBvZW5kLCBzZXF1ZW5jZSwgbGl0UHRyLCBs aXRMaW1pdCwgYmFzZSwgdkJhc2UsIGRpY3RFbmQpOw0KKw0KKwkvKiBjb3B5IExpdGVyYWxzICov DQorCVpTVERfY29weTgob3AsICpsaXRQdHIpOw0KKwlpZiAoc2VxdWVuY2UubGl0TGVuZ3RoID4g OCkNCisJCVpTVERfd2lsZGNvcHkob3AgKyA4LCAoKmxpdFB0cikgKyA4LA0KKwkJCSAgICAgIHNl cXVlbmNlLmxpdExlbmd0aCAtIDgpOyAvKiBub3RlIDogc2luY2Ugb0xpdEVuZCA8PSBvZW5kLVdJ TERDT1BZX09WRVJMRU5HVEgsIG5vIHJpc2sgb2Ygb3ZlcndyaXRlIGJleW9uZCBvZW5kICovDQor CW9wID0gb0xpdEVuZDsNCisJKmxpdFB0ciA9IGlMaXRFbmQ7IC8qIHVwZGF0ZSBmb3IgbmV4dCBz ZXF1ZW5jZSAqLw0KKw0KKwkvKiBjb3B5IE1hdGNoICovDQorCWlmIChzZXF1ZW5jZS5vZmZzZXQg PiAoc2l6ZV90KShvTGl0RW5kIC0gYmFzZSkpIHsNCisJCS8qIG9mZnNldCBiZXlvbmQgcHJlZml4 ICovDQorCQlpZiAoc2VxdWVuY2Uub2Zmc2V0ID4gKHNpemVfdCkob0xpdEVuZCAtIHZCYXNlKSkN CisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQlpZiAobWF0Y2ggKyBz ZXF1ZW5jZS5tYXRjaExlbmd0aCA8PSBkaWN0RW5kKSB7DQorCQkJbWVtbW92ZShvTGl0RW5kLCBt YXRjaCwgc2VxdWVuY2UubWF0Y2hMZW5ndGgpOw0KKwkJCXJldHVybiBzZXF1ZW5jZUxlbmd0aDsN CisJCX0NCisJCS8qIHNwYW4gZXh0RGljdCAmIGN1cnJQcmVmaXhTZWdtZW50ICovDQorCQl7DQor CQkJc2l6ZV90IGNvbnN0IGxlbmd0aDEgPSBkaWN0RW5kIC0gbWF0Y2g7DQorCQkJbWVtbW92ZShv TGl0RW5kLCBtYXRjaCwgbGVuZ3RoMSk7DQorCQkJb3AgPSBvTGl0RW5kICsgbGVuZ3RoMTsNCisJ CQlzZXF1ZW5jZS5tYXRjaExlbmd0aCAtPSBsZW5ndGgxOw0KKwkJCW1hdGNoID0gYmFzZTsNCisJ CQlpZiAob3AgPiBvZW5kX3cgfHwgc2VxdWVuY2UubWF0Y2hMZW5ndGggPCBNSU5NQVRDSCkgew0K KwkJCQlVMzIgaTsNCisJCQkJZm9yIChpID0gMDsgaSA8IHNlcXVlbmNlLm1hdGNoTGVuZ3RoOyAr K2kpDQorCQkJCQlvcFtpXSA9IG1hdGNoW2ldOw0KKwkJCQlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7 DQorCQkJfQ0KKwkJfQ0KKwl9DQorCS8qIFJlcXVpcmVtZW50OiBvcCA8PSBvZW5kX3cgJiYgc2Vx dWVuY2UubWF0Y2hMZW5ndGggPj0gTUlOTUFUQ0ggKi8NCisNCisJLyogbWF0Y2ggd2l0aGluIHBy ZWZpeCAqLw0KKwlpZiAoc2VxdWVuY2Uub2Zmc2V0IDwgOCkgew0KKwkJLyogY2xvc2UgcmFuZ2Ug bWF0Y2gsIG92ZXJsYXAgKi8NCisJCXN0YXRpYyBjb25zdCBVMzIgZGVjMzJ0YWJsZVtdID0gezAs IDEsIDIsIDEsIDQsIDQsIDQsIDR9OyAgIC8qIGFkZGVkICovDQorCQlzdGF0aWMgY29uc3QgaW50 IGRlYzY0dGFibGVbXSA9IHs4LCA4LCA4LCA3LCA4LCA5LCAxMCwgMTF9OyAvKiBzdWJ0cmFjdGVk ICovDQorCQlpbnQgY29uc3Qgc3ViMiA9IGRlYzY0dGFibGVbc2VxdWVuY2Uub2Zmc2V0XTsNCisJ CW9wWzBdID0gbWF0Y2hbMF07DQorCQlvcFsxXSA9IG1hdGNoWzFdOw0KKwkJb3BbMl0gPSBtYXRj aFsyXTsNCisJCW9wWzNdID0gbWF0Y2hbM107DQorCQltYXRjaCArPSBkZWMzMnRhYmxlW3NlcXVl bmNlLm9mZnNldF07DQorCQlaU1REX2NvcHk0KG9wICsgNCwgbWF0Y2gpOw0KKwkJbWF0Y2ggLT0g c3ViMjsNCisJfSBlbHNlIHsNCisJCVpTVERfY29weTgob3AsIG1hdGNoKTsNCisJfQ0KKwlvcCAr PSA4Ow0KKwltYXRjaCArPSA4Ow0KKw0KKwlpZiAob01hdGNoRW5kID4gb2VuZCAtICgxNiAtIE1J Tk1BVENIKSkgew0KKwkJaWYgKG9wIDwgb2VuZF93KSB7DQorCQkJWlNURF93aWxkY29weShvcCwg bWF0Y2gsIG9lbmRfdyAtIG9wKTsNCisJCQltYXRjaCArPSBvZW5kX3cgLSBvcDsNCisJCQlvcCA9 IG9lbmRfdzsNCisJCX0NCisJCXdoaWxlIChvcCA8IG9NYXRjaEVuZCkNCisJCQkqb3ArKyA9ICpt YXRjaCsrOw0KKwl9IGVsc2Ugew0KKwkJWlNURF93aWxkY29weShvcCwgbWF0Y2gsIChwdHJkaWZm X3Qpc2VxdWVuY2UubWF0Y2hMZW5ndGggLSA4KTsgLyogd29ya3MgZXZlbiBpZiBtYXRjaExlbmd0 aCA8IDggKi8NCisJfQ0KKwlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7DQorfQ0KKw0KK3N0YXRpYyBz aXplX3QgWlNURF9kZWNvbXByZXNzU2VxdWVuY2VzTG9uZyhaU1REX0RDdHggKmRjdHgsIHZvaWQg KmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKnNlcVN0YXJ0LCBzaXplX3Qgc2Vx U2l6ZSkNCit7DQorCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKilzZXFTdGFydDsNCisJ Y29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlwICsgc2VxU2l6ZTsNCisJQllURSAqY29uc3Qgb3N0 YXJ0ID0gKEJZVEUgKiBjb25zdClkc3Q7DQorCUJZVEUgKmNvbnN0IG9lbmQgPSBvc3RhcnQgKyBt YXhEc3RTaXplOw0KKwlCWVRFICpvcCA9IG9zdGFydDsNCisJY29uc3QgQllURSAqbGl0UHRyID0g ZGN0eC0+bGl0UHRyOw0KKwljb25zdCBCWVRFICpjb25zdCBsaXRFbmQgPSBsaXRQdHIgKyBkY3R4 LT5saXRTaXplOw0KKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gKGNvbnN0IEJZVEUgKikoZGN0 eC0+YmFzZSk7DQorCWNvbnN0IEJZVEUgKmNvbnN0IHZCYXNlID0gKGNvbnN0IEJZVEUgKikoZGN0 eC0+dkJhc2UpOw0KKwljb25zdCBCWVRFICpjb25zdCBkaWN0RW5kID0gKGNvbnN0IEJZVEUgKiko ZGN0eC0+ZGljdEVuZCk7DQorCXVuc2lnbmVkIGNvbnN0IHdpbmRvd1NpemUgPSBkY3R4LT5mUGFy YW1zLndpbmRvd1NpemU7DQorCWludCBuYlNlcTsNCisNCisJLyogQnVpbGQgRGVjb2RpbmcgVGFi bGVzICovDQorCXsNCisJCXNpemVfdCBjb25zdCBzZXFIU2l6ZSA9IFpTVERfZGVjb2RlU2VxSGVh ZGVycyhkY3R4LCAmbmJTZXEsIGlwLCBzZXFTaXplKTsNCisJCWlmIChaU1REX2lzRXJyb3Ioc2Vx SFNpemUpKQ0KKwkJCXJldHVybiBzZXFIU2l6ZTsNCisJCWlwICs9IHNlcUhTaXplOw0KKwl9DQor DQorCS8qIFJlZ2VuIHNlcXVlbmNlcyAqLw0KKwlpZiAobmJTZXEpIHsNCisjZGVmaW5lIFNUT1JF RF9TRVFTIDQNCisjZGVmaW5lIFNUT1NFUV9NQVNLIChTVE9SRURfU0VRUyAtIDEpDQorI2RlZmlu ZSBBRFZBTkNFRF9TRVFTIDQNCisJCXNlcV90ICpzZXF1ZW5jZXMgPSAoc2VxX3QgKilkY3R4LT5l bnRyb3B5LndvcmtzcGFjZTsNCisJCWludCBjb25zdCBzZXFBZHZhbmNlID0gTUlOKG5iU2VxLCBB RFZBTkNFRF9TRVFTKTsNCisJCXNlcVN0YXRlX3Qgc2VxU3RhdGU7DQorCQlpbnQgc2VxTmI7DQor CQlaU1REX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSA+PSBz aXplb2Yoc2VxX3QpICogU1RPUkVEX1NFUVMpOw0KKwkJZGN0eC0+ZnNlRW50cm9weSA9IDE7DQor CQl7DQorCQkJVTMyIGk7DQorCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQ0K KwkJCQlzZXFTdGF0ZS5wcmV2T2Zmc2V0W2ldID0gZGN0eC0+ZW50cm9weS5yZXBbaV07DQorCQl9 DQorCQlzZXFTdGF0ZS5iYXNlID0gYmFzZTsNCisJCXNlcVN0YXRlLnBvcyA9IChzaXplX3QpKG9w IC0gYmFzZSk7DQorCQlzZXFTdGF0ZS5nb3RvRGljdCA9ICh1UHRyRGlmZilkaWN0RW5kIC0gKHVQ dHJEaWZmKWJhc2U7IC8qIGNhc3QgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciAqLw0KKwkJ Q0hFQ0tfRShCSVRfaW5pdERTdHJlYW0oJnNlcVN0YXRlLkRTdHJlYW0sIGlwLCBpZW5kIC0gaXAp LCBjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCUZTRV9pbml0RFN0YXRlKCZzZXFTdGF0ZS5zdGF0 ZUxMLCAmc2VxU3RhdGUuRFN0cmVhbSwgZGN0eC0+TExUcHRyKTsNCisJCUZTRV9pbml0RFN0YXRl KCZzZXFTdGF0ZS5zdGF0ZU9mZmIsICZzZXFTdGF0ZS5EU3RyZWFtLCBkY3R4LT5PRlRwdHIpOw0K KwkJRlNFX2luaXREU3RhdGUoJnNlcVN0YXRlLnN0YXRlTUwsICZzZXFTdGF0ZS5EU3RyZWFtLCBk Y3R4LT5NTFRwdHIpOw0KKw0KKwkJLyogcHJlcGFyZSBpbiBhZHZhbmNlICovDQorCQlmb3IgKHNl cU5iID0gMDsgKEJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS5EU3RyZWFtKSA8PSBCSVRfRFN0 cmVhbV9jb21wbGV0ZWQpICYmIHNlcU5iIDwgc2VxQWR2YW5jZTsgc2VxTmIrKykgew0KKwkJCXNl cXVlbmNlc1tzZXFOYl0gPSBaU1REX2RlY29kZVNlcXVlbmNlTG9uZygmc2VxU3RhdGUsIHdpbmRv d1NpemUpOw0KKwkJfQ0KKwkJaWYgKHNlcU5iIDwgc2VxQWR2YW5jZSkNCisJCQlyZXR1cm4gRVJS T1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorDQorCQkvKiBkZWNvZGUgYW5kIGRlY29tcHJlc3Mg Ki8NCisJCWZvciAoOyAoQklUX3JlbG9hZERTdHJlYW0oJihzZXFTdGF0ZS5EU3RyZWFtKSkgPD0g QklUX0RTdHJlYW1fY29tcGxldGVkKSAmJiBzZXFOYiA8IG5iU2VxOyBzZXFOYisrKSB7DQorCQkJ c2VxX3QgY29uc3Qgc2VxdWVuY2UgPSBaU1REX2RlY29kZVNlcXVlbmNlTG9uZygmc2VxU3RhdGUs IHdpbmRvd1NpemUpOw0KKwkJCXNpemVfdCBjb25zdCBvbmVTZXFTaXplID0NCisJCQkgICAgWlNU RF9leGVjU2VxdWVuY2VMb25nKG9wLCBvZW5kLCBzZXF1ZW5jZXNbKHNlcU5iIC0gQURWQU5DRURf U0VRUykgJiBTVE9TRVFfTUFTS10sICZsaXRQdHIsIGxpdEVuZCwgYmFzZSwgdkJhc2UsIGRpY3RF bmQpOw0KKwkJCWlmIChaU1REX2lzRXJyb3Iob25lU2VxU2l6ZSkpDQorCQkJCXJldHVybiBvbmVT ZXFTaXplOw0KKwkJCVpTVERfUFJFRkVUQ0goc2VxdWVuY2UubWF0Y2gpOw0KKwkJCXNlcXVlbmNl c1tzZXFOYiAmIFNUT1NFUV9NQVNLXSA9IHNlcXVlbmNlOw0KKwkJCW9wICs9IG9uZVNlcVNpemU7 DQorCQl9DQorCQlpZiAoc2VxTmIgPCBuYlNlcSkNCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlv bl9kZXRlY3RlZCk7DQorDQorCQkvKiBmaW5pc2ggcXVldWUgKi8NCisJCXNlcU5iIC09IHNlcUFk dmFuY2U7DQorCQlmb3IgKDsgc2VxTmIgPCBuYlNlcTsgc2VxTmIrKykgew0KKwkJCXNpemVfdCBj b25zdCBvbmVTZXFTaXplID0gWlNURF9leGVjU2VxdWVuY2VMb25nKG9wLCBvZW5kLCBzZXF1ZW5j ZXNbc2VxTmIgJiBTVE9TRVFfTUFTS10sICZsaXRQdHIsIGxpdEVuZCwgYmFzZSwgdkJhc2UsIGRp Y3RFbmQpOw0KKwkJCWlmIChaU1REX2lzRXJyb3Iob25lU2VxU2l6ZSkpDQorCQkJCXJldHVybiBv bmVTZXFTaXplOw0KKwkJCW9wICs9IG9uZVNlcVNpemU7DQorCQl9DQorDQorCQkvKiBzYXZlIHJl cHMgZm9yIG5leHQgYmxvY2sgKi8NCisJCXsNCisJCQlVMzIgaTsNCisJCQlmb3IgKGkgPSAwOyBp IDwgWlNURF9SRVBfTlVNOyBpKyspDQorCQkJCWRjdHgtPmVudHJvcHkucmVwW2ldID0gKFUzMiko c2VxU3RhdGUucHJldk9mZnNldFtpXSk7DQorCQl9DQorCX0NCisNCisJLyogbGFzdCBsaXRlcmFs IHNlZ21lbnQgKi8NCisJew0KKwkJc2l6ZV90IGNvbnN0IGxhc3RMTFNpemUgPSBsaXRFbmQgLSBs aXRQdHI7DQorCQlpZiAobGFzdExMU2l6ZSA+IChzaXplX3QpKG9lbmQgLSBvcCkpDQorCQkJcmV0 dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOw0KKwkJbWVtY3B5KG9wLCBsaXRQdHIsIGxhc3RM TFNpemUpOw0KKwkJb3AgKz0gbGFzdExMU2l6ZTsNCisJfQ0KKw0KKwlyZXR1cm4gb3AgLSBvc3Rh cnQ7DQorfQ0KKw0KK3N0YXRpYyBzaXplX3QgWlNURF9kZWNvbXByZXNzQmxvY2tfaW50ZXJuYWwo WlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9p ZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCit7IC8qIGJsb2NrVHlwZSA9PSBibG9ja0NvbXByZXNz ZWQgKi8NCisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKXNyYzsNCisNCisJaWYgKHNy Y1NpemUgPj0gWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgpDQorCQlyZXR1cm4gRVJST1Ioc3Jj U2l6ZV93cm9uZyk7DQorDQorCS8qIERlY29kZSBsaXRlcmFscyBzZWN0aW9uICovDQorCXsNCisJ CXNpemVfdCBjb25zdCBsaXRDU2l6ZSA9IFpTVERfZGVjb2RlTGl0ZXJhbHNCbG9jayhkY3R4LCBz cmMsIHNyY1NpemUpOw0KKwkJaWYgKFpTVERfaXNFcnJvcihsaXRDU2l6ZSkpDQorCQkJcmV0dXJu IGxpdENTaXplOw0KKwkJaXAgKz0gbGl0Q1NpemU7DQorCQlzcmNTaXplIC09IGxpdENTaXplOw0K Kwl9DQorCWlmIChzaXplb2Yoc2l6ZV90KSA+IDQpIC8qIGRvIG5vdCBlbmFibGUgcHJlZmV0Y2hp bmcgb24gMzItYml0cyB4ODYsIGFzIGl0J3MgcGVyZm9ybWFuY2UgZGV0cmltZW50YWwgKi8NCisJ CQkJLyogbGlrZWx5IGJlY2F1c2Ugb2YgcmVnaXN0ZXIgcHJlc3N1cmUgKi8NCisJCQkJLyogaWYg dGhhdCdzIHRoZSBjb3JyZWN0IGNhdXNlLCB0aGVuIDMyLWJpdHMgQVJNIHNob3VsZCBiZSBhZmZl Y3RlZCBkaWZmZXJlbnRseSAqLw0KKwkJCQkvKiBpdCB3b3VsZCBiZSBnb29kIHRvIHRlc3QgdGhp cyBvbiBBUk0gcmVhbCBoYXJkd2FyZSwgdG8gc2VlIGlmIHByZWZldGNoIHZlcnNpb24gaW1wcm92 ZXMgc3BlZWQgKi8NCisJCWlmIChkY3R4LT5mUGFyYW1zLndpbmRvd1NpemUgPiAoMSA8PCAyMykp DQorCQkJcmV0dXJuIFpTVERfZGVjb21wcmVzc1NlcXVlbmNlc0xvbmcoZGN0eCwgZHN0LCBkc3RD YXBhY2l0eSwgaXAsIHNyY1NpemUpOw0KKwlyZXR1cm4gWlNURF9kZWNvbXByZXNzU2VxdWVuY2Vz KGRjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIGlwLCBzcmNTaXplKTsNCit9DQorDQorc3RhdGljIHZv aWQgWlNURF9jaGVja0NvbnRpbnVpdHkoWlNURF9EQ3R4ICpkY3R4LCBjb25zdCB2b2lkICpkc3Qp DQorew0KKwlpZiAoZHN0ICE9IGRjdHgtPnByZXZpb3VzRHN0RW5kKSB7IC8qIG5vdCBjb250aWd1 b3VzICovDQorCQlkY3R4LT5kaWN0RW5kID0gZGN0eC0+cHJldmlvdXNEc3RFbmQ7DQorCQlkY3R4 LT52QmFzZSA9IChjb25zdCBjaGFyICopZHN0IC0gKChjb25zdCBjaGFyICopKGRjdHgtPnByZXZp b3VzRHN0RW5kKSAtIChjb25zdCBjaGFyICopKGRjdHgtPmJhc2UpKTsNCisJCWRjdHgtPmJhc2Ug PSBkc3Q7DQorCQlkY3R4LT5wcmV2aW91c0RzdEVuZCA9IGRzdDsNCisJfQ0KK30NCisNCitzaXpl X3QgWlNURF9kZWNvbXByZXNzQmxvY2soWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVf dCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCit7DQorCXNp emVfdCBkU2l6ZTsNCisJWlNURF9jaGVja0NvbnRpbnVpdHkoZGN0eCwgZHN0KTsNCisJZFNpemUg PSBaU1REX2RlY29tcHJlc3NCbG9ja19pbnRlcm5hbChkY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBz cmMsIHNyY1NpemUpOw0KKwlkY3R4LT5wcmV2aW91c0RzdEVuZCA9IChjaGFyICopZHN0ICsgZFNp emU7DQorCXJldHVybiBkU2l6ZTsNCit9DQorDQorLyoqIFpTVERfaW5zZXJ0QmxvY2soKSA6DQor CWluc2VydCBgc3JjYCBibG9jayBpbnRvIGBkY3R4YCBoaXN0b3J5LiBVc2VmdWwgdG8gdHJhY2sg dW5jb21wcmVzc2VkIGJsb2Nrcy4gKi8NCitzaXplX3QgWlNURF9pbnNlcnRCbG9jayhaU1REX0RD dHggKmRjdHgsIGNvbnN0IHZvaWQgKmJsb2NrU3RhcnQsIHNpemVfdCBibG9ja1NpemUpDQorew0K KwlaU1REX2NoZWNrQ29udGludWl0eShkY3R4LCBibG9ja1N0YXJ0KTsNCisJZGN0eC0+cHJldmlv dXNEc3RFbmQgPSAoY29uc3QgY2hhciAqKWJsb2NrU3RhcnQgKyBibG9ja1NpemU7DQorCXJldHVy biBibG9ja1NpemU7DQorfQ0KKw0KK3NpemVfdCBaU1REX2dlbmVyYXRlTnhCeXRlcyh2b2lkICpk c3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgQllURSBieXRlLCBzaXplX3QgbGVuZ3RoKQ0KK3sNCisJ aWYgKGxlbmd0aCA+IGRzdENhcGFjaXR5KQ0KKwkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21h bGwpOw0KKwltZW1zZXQoZHN0LCBieXRlLCBsZW5ndGgpOw0KKwlyZXR1cm4gbGVuZ3RoOw0KK30N CisNCisvKiogWlNURF9maW5kRnJhbWVDb21wcmVzc2VkU2l6ZSgpIDoNCisgKiAgY29tcGF0aWJs ZSB3aXRoIGxlZ2FjeSBtb2RlDQorICogIGBzcmNgIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9m IGEgWlNURCBmcmFtZSwgWlNURCBsZWdhY3kgZnJhbWUsIG9yIHNraXBwYWJsZSBmcmFtZQ0KKyAq ICBgc3JjU2l6ZWAgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgZnJhbWUgY29udGFp bmVkDQorICogIEByZXR1cm4gOiB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBmcmFtZSBzdGFy dGluZyBhdCBgc3JjYCAqLw0KK3NpemVfdCBaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKGNv bnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQorew0KKwlpZiAoc3JjU2l6ZSA+PSBaU1RE X3NraXBwYWJsZUhlYWRlclNpemUgJiYgKFpTVERfcmVhZExFMzIoc3JjKSAmIDB4RkZGRkZGRjBV KSA9PSBaU1REX01BR0lDX1NLSVBQQUJMRV9TVEFSVCkgew0KKwkJcmV0dXJuIFpTVERfc2tpcHBh YmxlSGVhZGVyU2l6ZSArIFpTVERfcmVhZExFMzIoKGNvbnN0IEJZVEUgKilzcmMgKyA0KTsNCisJ fSBlbHNlIHsNCisJCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKilzcmM7DQorCQljb25z dCBCWVRFICpjb25zdCBpcHN0YXJ0ID0gaXA7DQorCQlzaXplX3QgcmVtYWluaW5nU2l6ZSA9IHNy Y1NpemU7DQorCQlaU1REX2ZyYW1lUGFyYW1zIGZQYXJhbXM7DQorDQorCQlzaXplX3QgY29uc3Qg aGVhZGVyU2l6ZSA9IFpTVERfZnJhbWVIZWFkZXJTaXplKGlwLCByZW1haW5pbmdTaXplKTsNCisJ CWlmIChaU1REX2lzRXJyb3IoaGVhZGVyU2l6ZSkpDQorCQkJcmV0dXJuIGhlYWRlclNpemU7DQor DQorCQkvKiBGcmFtZSBIZWFkZXIgKi8NCisJCXsNCisJCQlzaXplX3QgY29uc3QgcmV0ID0gWlNU RF9nZXRGcmFtZVBhcmFtcygmZlBhcmFtcywgaXAsIHJlbWFpbmluZ1NpemUpOw0KKwkJCWlmICha U1REX2lzRXJyb3IocmV0KSkNCisJCQkJcmV0dXJuIHJldDsNCisJCQlpZiAocmV0ID4gMCkNCisJ CQkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOw0KKwkJfQ0KKw0KKwkJaXAgKz0gaGVhZGVy U2l6ZTsNCisJCXJlbWFpbmluZ1NpemUgLT0gaGVhZGVyU2l6ZTsNCisNCisJCS8qIExvb3Agb24g ZWFjaCBibG9jayAqLw0KKwkJd2hpbGUgKDEpIHsNCisJCQlibG9ja1Byb3BlcnRpZXNfdCBibG9j a1Byb3BlcnRpZXM7DQorCQkJc2l6ZV90IGNvbnN0IGNCbG9ja1NpemUgPSBaU1REX2dldGNCbG9j a1NpemUoaXAsIHJlbWFpbmluZ1NpemUsICZibG9ja1Byb3BlcnRpZXMpOw0KKwkJCWlmIChaU1RE X2lzRXJyb3IoY0Jsb2NrU2l6ZSkpDQorCQkJCXJldHVybiBjQmxvY2tTaXplOw0KKw0KKwkJCWlm IChaU1REX2Jsb2NrSGVhZGVyU2l6ZSArIGNCbG9ja1NpemUgPiByZW1haW5pbmdTaXplKQ0KKwkJ CQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorDQorCQkJaXAgKz0gWlNURF9ibG9ja0hl YWRlclNpemUgKyBjQmxvY2tTaXplOw0KKwkJCXJlbWFpbmluZ1NpemUgLT0gWlNURF9ibG9ja0hl YWRlclNpemUgKyBjQmxvY2tTaXplOw0KKw0KKwkJCWlmIChibG9ja1Byb3BlcnRpZXMubGFzdEJs b2NrKQ0KKwkJCQlicmVhazsNCisJCX0NCisNCisJCWlmIChmUGFyYW1zLmNoZWNrc3VtRmxhZykg eyAvKiBGcmFtZSBjb250ZW50IGNoZWNrc3VtICovDQorCQkJaWYgKHJlbWFpbmluZ1NpemUgPCA0 KQ0KKwkJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorCQkJaXAgKz0gNDsNCisJCQly ZW1haW5pbmdTaXplIC09IDQ7DQorCQl9DQorDQorCQlyZXR1cm4gaXAgLSBpcHN0YXJ0Ow0KKwl9 DQorfQ0KKw0KKy8qISBaU1REX2RlY29tcHJlc3NGcmFtZSgpIDoNCisqICAgQGRjdHggbXVzdCBi ZSBwcm9wZXJseSBpbml0aWFsaXplZCAqLw0KK3N0YXRpYyBzaXplX3QgWlNURF9kZWNvbXByZXNz RnJhbWUoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29u c3Qgdm9pZCAqKnNyY1B0ciwgc2l6ZV90ICpzcmNTaXplUHRyKQ0KK3sNCisJY29uc3QgQllURSAq aXAgPSAoY29uc3QgQllURSAqKSgqc3JjUHRyKTsNCisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZ VEUgKiBjb25zdClkc3Q7DQorCUJZVEUgKmNvbnN0IG9lbmQgPSBvc3RhcnQgKyBkc3RDYXBhY2l0 eTsNCisJQllURSAqb3AgPSBvc3RhcnQ7DQorCXNpemVfdCByZW1haW5pbmdTaXplID0gKnNyY1Np emVQdHI7DQorDQorCS8qIGNoZWNrICovDQorCWlmIChyZW1haW5pbmdTaXplIDwgWlNURF9mcmFt ZUhlYWRlclNpemVfbWluICsgWlNURF9ibG9ja0hlYWRlclNpemUpDQorCQlyZXR1cm4gRVJST1Io c3JjU2l6ZV93cm9uZyk7DQorDQorCS8qIEZyYW1lIEhlYWRlciAqLw0KKwl7DQorCQlzaXplX3Qg Y29uc3QgZnJhbWVIZWFkZXJTaXplID0gWlNURF9mcmFtZUhlYWRlclNpemUoaXAsIFpTVERfZnJh bWVIZWFkZXJTaXplX3ByZWZpeCk7DQorCQlpZiAoWlNURF9pc0Vycm9yKGZyYW1lSGVhZGVyU2l6 ZSkpDQorCQkJcmV0dXJuIGZyYW1lSGVhZGVyU2l6ZTsNCisJCWlmIChyZW1haW5pbmdTaXplIDwg ZnJhbWVIZWFkZXJTaXplICsgWlNURF9ibG9ja0hlYWRlclNpemUpDQorCQkJcmV0dXJuIEVSUk9S KHNyY1NpemVfd3JvbmcpOw0KKwkJQ0hFQ0tfRihaU1REX2RlY29kZUZyYW1lSGVhZGVyKGRjdHgs IGlwLCBmcmFtZUhlYWRlclNpemUpKTsNCisJCWlwICs9IGZyYW1lSGVhZGVyU2l6ZTsNCisJCXJl bWFpbmluZ1NpemUgLT0gZnJhbWVIZWFkZXJTaXplOw0KKwl9DQorDQorCS8qIExvb3Agb24gZWFj aCBibG9jayAqLw0KKwl3aGlsZSAoMSkgew0KKwkJc2l6ZV90IGRlY29kZWRTaXplOw0KKwkJYmxv Y2tQcm9wZXJ0aWVzX3QgYmxvY2tQcm9wZXJ0aWVzOw0KKwkJc2l6ZV90IGNvbnN0IGNCbG9ja1Np emUgPSBaU1REX2dldGNCbG9ja1NpemUoaXAsIHJlbWFpbmluZ1NpemUsICZibG9ja1Byb3BlcnRp ZXMpOw0KKwkJaWYgKFpTVERfaXNFcnJvcihjQmxvY2tTaXplKSkNCisJCQlyZXR1cm4gY0Jsb2Nr U2l6ZTsNCisNCisJCWlwICs9IFpTVERfYmxvY2tIZWFkZXJTaXplOw0KKwkJcmVtYWluaW5nU2l6 ZSAtPSBaU1REX2Jsb2NrSGVhZGVyU2l6ZTsNCisJCWlmIChjQmxvY2tTaXplID4gcmVtYWluaW5n U2l6ZSkNCisJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorDQorCQlzd2l0Y2ggKGJs b2NrUHJvcGVydGllcy5ibG9ja1R5cGUpIHsNCisJCWNhc2UgYnRfY29tcHJlc3NlZDogZGVjb2Rl ZFNpemUgPSBaU1REX2RlY29tcHJlc3NCbG9ja19pbnRlcm5hbChkY3R4LCBvcCwgb2VuZCAtIG9w LCBpcCwgY0Jsb2NrU2l6ZSk7IGJyZWFrOw0KKwkJY2FzZSBidF9yYXc6IGRlY29kZWRTaXplID0g WlNURF9jb3B5UmF3QmxvY2sob3AsIG9lbmQgLSBvcCwgaXAsIGNCbG9ja1NpemUpOyBicmVhazsN CisJCWNhc2UgYnRfcmxlOiBkZWNvZGVkU2l6ZSA9IFpTVERfZ2VuZXJhdGVOeEJ5dGVzKG9wLCBv ZW5kIC0gb3AsICppcCwgYmxvY2tQcm9wZXJ0aWVzLm9yaWdTaXplKTsgYnJlYWs7DQorCQljYXNl IGJ0X3Jlc2VydmVkOg0KKwkJZGVmYXVsdDogcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0 ZWQpOw0KKwkJfQ0KKw0KKwkJaWYgKFpTVERfaXNFcnJvcihkZWNvZGVkU2l6ZSkpDQorCQkJcmV0 dXJuIGRlY29kZWRTaXplOw0KKwkJaWYgKGRjdHgtPmZQYXJhbXMuY2hlY2tzdW1GbGFnKQ0KKwkJ CXh4aDY0X3VwZGF0ZSgmZGN0eC0+eHhoU3RhdGUsIG9wLCBkZWNvZGVkU2l6ZSk7DQorCQlvcCAr PSBkZWNvZGVkU2l6ZTsNCisJCWlwICs9IGNCbG9ja1NpemU7DQorCQlyZW1haW5pbmdTaXplIC09 IGNCbG9ja1NpemU7DQorCQlpZiAoYmxvY2tQcm9wZXJ0aWVzLmxhc3RCbG9jaykNCisJCQlicmVh azsNCisJfQ0KKw0KKwlpZiAoZGN0eC0+ZlBhcmFtcy5jaGVja3N1bUZsYWcpIHsgLyogRnJhbWUg Y29udGVudCBjaGVja3N1bSB2ZXJpZmljYXRpb24gKi8NCisJCVUzMiBjb25zdCBjaGVja0NhbGMg PSAoVTMyKXh4aDY0X2RpZ2VzdCgmZGN0eC0+eHhoU3RhdGUpOw0KKwkJVTMyIGNoZWNrUmVhZDsN CisJCWlmIChyZW1haW5pbmdTaXplIDwgNCkNCisJCQlyZXR1cm4gRVJST1IoY2hlY2tzdW1fd3Jv bmcpOw0KKwkJY2hlY2tSZWFkID0gWlNURF9yZWFkTEUzMihpcCk7DQorCQlpZiAoY2hlY2tSZWFk ICE9IGNoZWNrQ2FsYykNCisJCQlyZXR1cm4gRVJST1IoY2hlY2tzdW1fd3JvbmcpOw0KKwkJaXAg Kz0gNDsNCisJCXJlbWFpbmluZ1NpemUgLT0gNDsNCisJfQ0KKw0KKwkvKiBBbGxvdyBjYWxsZXIg dG8gZ2V0IHNpemUgcmVhZCAqLw0KKwkqc3JjUHRyID0gaXA7DQorCSpzcmNTaXplUHRyID0gcmVt YWluaW5nU2l6ZTsNCisJcmV0dXJuIG9wIC0gb3N0YXJ0Ow0KK30NCisNCitzdGF0aWMgY29uc3Qg dm9pZCAqWlNURF9ERGljdERpY3RDb250ZW50KGNvbnN0IFpTVERfRERpY3QgKmRkaWN0KTsNCitz dGF0aWMgc2l6ZV90IFpTVERfRERpY3REaWN0U2l6ZShjb25zdCBaU1REX0REaWN0ICpkZGljdCk7 DQorDQorc3RhdGljIHNpemVfdCBaU1REX2RlY29tcHJlc3NNdWx0aUZyYW1lKFpTVERfREN0eCAq ZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6 ZV90IHNyY1NpemUsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwNCisJCQkJCWNv bnN0IFpTVERfRERpY3QgKmRkaWN0KQ0KK3sNCisJdm9pZCAqY29uc3QgZHN0c3RhcnQgPSBkc3Q7 DQorDQorCWlmIChkZGljdCkgew0KKwkJaWYgKGRpY3QpIHsNCisJCQkvKiBwcm9ncmFtbWVyIGVy cm9yLCB0aGVzZSB0d28gY2FzZXMgc2hvdWxkIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLw0KKwkJ CXJldHVybiBFUlJPUihHRU5FUklDKTsNCisJCX0NCisNCisJCWRpY3QgPSBaU1REX0REaWN0RGlj dENvbnRlbnQoZGRpY3QpOw0KKwkJZGljdFNpemUgPSBaU1REX0REaWN0RGljdFNpemUoZGRpY3Qp Ow0KKwl9DQorDQorCXdoaWxlIChzcmNTaXplID49IFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZp eCkgew0KKwkJVTMyIG1hZ2ljTnVtYmVyOw0KKw0KKwkJbWFnaWNOdW1iZXIgPSBaU1REX3JlYWRM RTMyKHNyYyk7DQorCQlpZiAobWFnaWNOdW1iZXIgIT0gWlNURF9NQUdJQ05VTUJFUikgew0KKwkJ CWlmICgobWFnaWNOdW1iZXIgJiAweEZGRkZGRkYwVSkgPT0gWlNURF9NQUdJQ19TS0lQUEFCTEVf U1RBUlQpIHsNCisJCQkJc2l6ZV90IHNraXBwYWJsZVNpemU7DQorCQkJCWlmIChzcmNTaXplIDwg WlNURF9za2lwcGFibGVIZWFkZXJTaXplKQ0KKwkJCQkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3Jv bmcpOw0KKwkJCQlza2lwcGFibGVTaXplID0gWlNURF9yZWFkTEUzMigoY29uc3QgQllURSAqKXNy YyArIDQpICsgWlNURF9za2lwcGFibGVIZWFkZXJTaXplOw0KKwkJCQlpZiAoc3JjU2l6ZSA8IHNr aXBwYWJsZVNpemUpIHsNCisJCQkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsNCisJCQkJ fQ0KKw0KKwkJCQlzcmMgPSAoY29uc3QgQllURSAqKXNyYyArIHNraXBwYWJsZVNpemU7DQorCQkJ CXNyY1NpemUgLT0gc2tpcHBhYmxlU2l6ZTsNCisJCQkJY29udGludWU7DQorCQkJfSBlbHNlIHsN CisJCQkJcmV0dXJuIEVSUk9SKHByZWZpeF91bmtub3duKTsNCisJCQl9DQorCQl9DQorDQorCQlp ZiAoZGRpY3QpIHsNCisJCQkvKiB3ZSB3ZXJlIGNhbGxlZCBmcm9tIFpTVERfZGVjb21wcmVzc191 c2luZ0REaWN0ICovDQorCQkJWlNURF9yZWZERGljdChkY3R4LCBkZGljdCk7DQorCQl9IGVsc2Ug ew0KKwkJCS8qIHRoaXMgd2lsbCBpbml0aWFsaXplIGNvcnJlY3RseSB3aXRoIG5vIGRpY3QgaWYg ZGljdCA9PSBOVUxMLCBzbw0KKwkJCSAqIHVzZSB0aGlzIGluIGFsbCBjYXNlcyBidXQgZGRpY3Qg Ki8NCisJCQlDSEVDS19GKFpTVERfZGVjb21wcmVzc0JlZ2luX3VzaW5nRGljdChkY3R4LCBkaWN0 LCBkaWN0U2l6ZSkpOw0KKwkJfQ0KKwkJWlNURF9jaGVja0NvbnRpbnVpdHkoZGN0eCwgZHN0KTsN CisNCisJCXsNCisJCQljb25zdCBzaXplX3QgcmVzID0gWlNURF9kZWNvbXByZXNzRnJhbWUoZGN0 eCwgZHN0LCBkc3RDYXBhY2l0eSwgJnNyYywgJnNyY1NpemUpOw0KKwkJCWlmIChaU1REX2lzRXJy b3IocmVzKSkNCisJCQkJcmV0dXJuIHJlczsNCisJCQkvKiBkb24ndCBuZWVkIHRvIGJvdW5kcyBj aGVjayB0aGlzLCBaU1REX2RlY29tcHJlc3NGcmFtZSB3aWxsIGhhdmUNCisJCQkgKiBhbHJlYWR5 ICovDQorCQkJZHN0ID0gKEJZVEUgKilkc3QgKyByZXM7DQorCQkJZHN0Q2FwYWNpdHkgLT0gcmVz Ow0KKwkJfQ0KKwl9DQorDQorCWlmIChzcmNTaXplKQ0KKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVf d3JvbmcpOyAvKiBpbnB1dCBub3QgZW50aXJlbHkgY29uc3VtZWQgKi8NCisNCisJcmV0dXJuIChC WVRFICopZHN0IC0gKEJZVEUgKilkc3RzdGFydDsNCit9DQorDQorc2l6ZV90IFpTVERfZGVjb21w cmVzc191c2luZ0RpY3QoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBh Y2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3Qgdm9pZCAqZGljdCwg c2l6ZV90IGRpY3RTaXplKQ0KK3sNCisJcmV0dXJuIFpTVERfZGVjb21wcmVzc011bHRpRnJhbWUo ZGN0eCwgZHN0LCBkc3RDYXBhY2l0eSwgc3JjLCBzcmNTaXplLCBkaWN0LCBkaWN0U2l6ZSwgTlVM TCk7DQorfQ0KKw0KK3NpemVfdCBaU1REX2RlY29tcHJlc3NEQ3R4KFpTVERfREN0eCAqZGN0eCwg dm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNy Y1NpemUpDQorew0KKwlyZXR1cm4gWlNURF9kZWNvbXByZXNzX3VzaW5nRGljdChkY3R4LCBkc3Qs IGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIE5VTEwsIDApOw0KK30NCisNCisvKi0qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICBBZHZhbmNlZCBTdHJlYW1pbmcg RGVjb21wcmVzc2lvbiBBUEkNCisqICAgQnVmZmVybGVzcyBhbmQgc3luY2hyb25vdXMNCisqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3NpemVfdCBaU1REX25leHRT cmNTaXplVG9EZWNvbXByZXNzKFpTVERfREN0eCAqZGN0eCkgeyByZXR1cm4gZGN0eC0+ZXhwZWN0 ZWQ7IH0NCisNCitaU1REX25leHRJbnB1dFR5cGVfZSBaU1REX25leHRJbnB1dFR5cGUoWlNURF9E Q3R4ICpkY3R4KQ0KK3sNCisJc3dpdGNoIChkY3R4LT5zdGFnZSkgew0KKwlkZWZhdWx0OiAvKiBz aG91bGQgbm90IGhhcHBlbiAqLw0KKwljYXNlIFpTVERkc19nZXRGcmFtZUhlYWRlclNpemU6DQor CWNhc2UgWlNURGRzX2RlY29kZUZyYW1lSGVhZGVyOiByZXR1cm4gWlNURG5pdF9mcmFtZUhlYWRl cjsNCisJY2FzZSBaU1REZHNfZGVjb2RlQmxvY2tIZWFkZXI6IHJldHVybiBaU1REbml0X2Jsb2Nr SGVhZGVyOw0KKwljYXNlIFpTVERkc19kZWNvbXByZXNzQmxvY2s6IHJldHVybiBaU1REbml0X2Js b2NrOw0KKwljYXNlIFpTVERkc19kZWNvbXByZXNzTGFzdEJsb2NrOiByZXR1cm4gWlNURG5pdF9s YXN0QmxvY2s7DQorCWNhc2UgWlNURGRzX2NoZWNrQ2hlY2tzdW06IHJldHVybiBaU1REbml0X2No ZWNrc3VtOw0KKwljYXNlIFpTVERkc19kZWNvZGVTa2lwcGFibGVIZWFkZXI6DQorCWNhc2UgWlNU RGRzX3NraXBGcmFtZTogcmV0dXJuIFpTVERuaXRfc2tpcHBhYmxlRnJhbWU7DQorCX0NCit9DQor DQoraW50IFpTVERfaXNTa2lwRnJhbWUoWlNURF9EQ3R4ICpkY3R4KSB7IHJldHVybiBkY3R4LT5z dGFnZSA9PSBaU1REZHNfc2tpcEZyYW1lOyB9IC8qIGZvciB6YnVmZiAqLw0KKw0KKy8qKiBaU1RE X2RlY29tcHJlc3NDb250aW51ZSgpIDoNCisqICAgQHJldHVybiA6IG5iIG9mIGJ5dGVzIGdlbmVy YXRlZCBpbnRvIGBkc3RgIChuZWNlc3NhcmlseSA8PSBgZHN0Q2FwYWNpdHkpDQorKiAgICAgICAg ICAgICBvciBhbiBlcnJvciBjb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIFpTVERfaXNF cnJvcigpICovDQorc2l6ZV90IFpTVERfZGVjb21wcmVzc0NvbnRpbnVlKFpTVERfREN0eCAqZGN0 eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90 IHNyY1NpemUpDQorew0KKwkvKiBTYW5pdHkgY2hlY2sgKi8NCisJaWYgKHNyY1NpemUgIT0gZGN0 eC0+ZXhwZWN0ZWQpDQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorCWlmIChkc3RD YXBhY2l0eSkNCisJCVpTVERfY2hlY2tDb250aW51aXR5KGRjdHgsIGRzdCk7DQorDQorCXN3aXRj aCAoZGN0eC0+c3RhZ2UpIHsNCisJY2FzZSBaU1REZHNfZ2V0RnJhbWVIZWFkZXJTaXplOg0KKwkJ aWYgKHNyY1NpemUgIT0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KQ0KKwkJCXJldHVybiBF UlJPUihzcmNTaXplX3dyb25nKTsJCQkJCS8qIGltcG9zc2libGUgKi8NCisJCWlmICgoWlNURF9y ZWFkTEUzMihzcmMpICYgMHhGRkZGRkZGMFUpID09IFpTVERfTUFHSUNfU0tJUFBBQkxFX1NUQVJU KSB7IC8qIHNraXBwYWJsZSBmcmFtZSAqLw0KKwkJCW1lbWNweShkY3R4LT5oZWFkZXJCdWZmZXIs IHNyYywgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KTsNCisJCQlkY3R4LT5leHBlY3RlZCA9 IFpTVERfc2tpcHBhYmxlSGVhZGVyU2l6ZSAtIFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeDsg LyogbWFnaWMgbnVtYmVyICsgc2tpcHBhYmxlIGZyYW1lIGxlbmd0aCAqLw0KKwkJCWRjdHgtPnN0 YWdlID0gWlNURGRzX2RlY29kZVNraXBwYWJsZUhlYWRlcjsNCisJCQlyZXR1cm4gMDsNCisJCX0N CisJCWRjdHgtPmhlYWRlclNpemUgPSBaU1REX2ZyYW1lSGVhZGVyU2l6ZShzcmMsIFpTVERfZnJh bWVIZWFkZXJTaXplX3ByZWZpeCk7DQorCQlpZiAoWlNURF9pc0Vycm9yKGRjdHgtPmhlYWRlclNp emUpKQ0KKwkJCXJldHVybiBkY3R4LT5oZWFkZXJTaXplOw0KKwkJbWVtY3B5KGRjdHgtPmhlYWRl ckJ1ZmZlciwgc3JjLCBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXgpOw0KKwkJaWYgKGRjdHgt PmhlYWRlclNpemUgPiBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXgpIHsNCisJCQlkY3R4LT5l eHBlY3RlZCA9IGRjdHgtPmhlYWRlclNpemUgLSBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXg7 DQorCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZGVjb2RlRnJhbWVIZWFkZXI7DQorCQkJcmV0dXJu IDA7DQorCQl9DQorCQlkY3R4LT5leHBlY3RlZCA9IDA7IC8qIG5vdCBuZWNlc3NhcnkgdG8gY29w eSBtb3JlICovDQorCQkvKiBmYWxsIHRocm91Z2ggKi8NCisNCisJY2FzZSBaU1REZHNfZGVjb2Rl RnJhbWVIZWFkZXI6DQorCQltZW1jcHkoZGN0eC0+aGVhZGVyQnVmZmVyICsgWlNURF9mcmFtZUhl YWRlclNpemVfcHJlZml4LCBzcmMsIGRjdHgtPmV4cGVjdGVkKTsNCisJCUNIRUNLX0YoWlNURF9k ZWNvZGVGcmFtZUhlYWRlcihkY3R4LCBkY3R4LT5oZWFkZXJCdWZmZXIsIGRjdHgtPmhlYWRlclNp emUpKTsNCisJCWRjdHgtPmV4cGVjdGVkID0gWlNURF9ibG9ja0hlYWRlclNpemU7DQorCQlkY3R4 LT5zdGFnZSA9IFpTVERkc19kZWNvZGVCbG9ja0hlYWRlcjsNCisJCXJldHVybiAwOw0KKw0KKwlj YXNlIFpTVERkc19kZWNvZGVCbG9ja0hlYWRlcjogew0KKwkJYmxvY2tQcm9wZXJ0aWVzX3QgYnA7 DQorCQlzaXplX3QgY29uc3QgY0Jsb2NrU2l6ZSA9IFpTVERfZ2V0Y0Jsb2NrU2l6ZShzcmMsIFpT VERfYmxvY2tIZWFkZXJTaXplLCAmYnApOw0KKwkJaWYgKFpTVERfaXNFcnJvcihjQmxvY2tTaXpl KSkNCisJCQlyZXR1cm4gY0Jsb2NrU2l6ZTsNCisJCWRjdHgtPmV4cGVjdGVkID0gY0Jsb2NrU2l6 ZTsNCisJCWRjdHgtPmJUeXBlID0gYnAuYmxvY2tUeXBlOw0KKwkJZGN0eC0+cmxlU2l6ZSA9IGJw Lm9yaWdTaXplOw0KKwkJaWYgKGNCbG9ja1NpemUpIHsNCisJCQlkY3R4LT5zdGFnZSA9IGJwLmxh c3RCbG9jayA/IFpTVERkc19kZWNvbXByZXNzTGFzdEJsb2NrIDogWlNURGRzX2RlY29tcHJlc3NC bG9jazsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisJCS8qIGVtcHR5IGJsb2NrICovDQorCQlpZiAo YnAubGFzdEJsb2NrKSB7DQorCQkJaWYgKGRjdHgtPmZQYXJhbXMuY2hlY2tzdW1GbGFnKSB7DQor CQkJCWRjdHgtPmV4cGVjdGVkID0gNDsNCisJCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfY2hlY2tD aGVja3N1bTsNCisJCQl9IGVsc2Ugew0KKwkJCQlkY3R4LT5leHBlY3RlZCA9IDA7IC8qIGVuZCBv ZiBmcmFtZSAqLw0KKwkJCQlkY3R4LT5zdGFnZSA9IFpTVERkc19nZXRGcmFtZUhlYWRlclNpemU7 DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlkY3R4LT5leHBlY3RlZCA9IDM7IC8qIGdvIGRpcmVj dGx5IHRvIG5leHQgaGVhZGVyICovDQorCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZGVjb2RlQmxv Y2tIZWFkZXI7DQorCQl9DQorCQlyZXR1cm4gMDsNCisJfQ0KKwljYXNlIFpTVERkc19kZWNvbXBy ZXNzTGFzdEJsb2NrOg0KKwljYXNlIFpTVERkc19kZWNvbXByZXNzQmxvY2s6IHsNCisJCXNpemVf dCByU2l6ZTsNCisJCXN3aXRjaCAoZGN0eC0+YlR5cGUpIHsNCisJCWNhc2UgYnRfY29tcHJlc3Nl ZDogclNpemUgPSBaU1REX2RlY29tcHJlc3NCbG9ja19pbnRlcm5hbChkY3R4LCBkc3QsIGRzdENh cGFjaXR5LCBzcmMsIHNyY1NpemUpOyBicmVhazsNCisJCWNhc2UgYnRfcmF3OiByU2l6ZSA9IFpT VERfY29weVJhd0Jsb2NrKGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSk7IGJyZWFrOw0K KwkJY2FzZSBidF9ybGU6IHJTaXplID0gWlNURF9zZXRSbGVCbG9jayhkc3QsIGRzdENhcGFjaXR5 LCBzcmMsIHNyY1NpemUsIGRjdHgtPnJsZVNpemUpOyBicmVhazsNCisJCWNhc2UgYnRfcmVzZXJ2 ZWQ6IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8NCisJCWRlZmF1bHQ6IHJldHVybiBFUlJPUihj b3JydXB0aW9uX2RldGVjdGVkKTsNCisJCX0NCisJCWlmIChaU1REX2lzRXJyb3IoclNpemUpKQ0K KwkJCXJldHVybiByU2l6ZTsNCisJCWlmIChkY3R4LT5mUGFyYW1zLmNoZWNrc3VtRmxhZykNCisJ CQl4eGg2NF91cGRhdGUoJmRjdHgtPnh4aFN0YXRlLCBkc3QsIHJTaXplKTsNCisNCisJCWlmIChk Y3R4LT5zdGFnZSA9PSBaU1REZHNfZGVjb21wcmVzc0xhc3RCbG9jaykgeyAvKiBlbmQgb2YgZnJh bWUgKi8NCisJCQlpZiAoZGN0eC0+ZlBhcmFtcy5jaGVja3N1bUZsYWcpIHsJLyogYW5vdGhlciBy b3VuZCBmb3IgZnJhbWUgY2hlY2tzdW0gKi8NCisJCQkJZGN0eC0+ZXhwZWN0ZWQgPSA0Ow0KKwkJ CQlkY3R4LT5zdGFnZSA9IFpTVERkc19jaGVja0NoZWNrc3VtOw0KKwkJCX0gZWxzZSB7DQorCQkJ CWRjdHgtPmV4cGVjdGVkID0gMDsgLyogZW5kcyBoZXJlICovDQorCQkJCWRjdHgtPnN0YWdlID0g WlNURGRzX2dldEZyYW1lSGVhZGVyU2l6ZTsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCWRjdHgt PnN0YWdlID0gWlNURGRzX2RlY29kZUJsb2NrSGVhZGVyOw0KKwkJCWRjdHgtPmV4cGVjdGVkID0g WlNURF9ibG9ja0hlYWRlclNpemU7DQorCQkJZGN0eC0+cHJldmlvdXNEc3RFbmQgPSAoY2hhciAq KWRzdCArIHJTaXplOw0KKwkJfQ0KKwkJcmV0dXJuIHJTaXplOw0KKwl9DQorCWNhc2UgWlNURGRz X2NoZWNrQ2hlY2tzdW06IHsNCisJCVUzMiBjb25zdCBoMzIgPSAoVTMyKXh4aDY0X2RpZ2VzdCgm ZGN0eC0+eHhoU3RhdGUpOw0KKwkJVTMyIGNvbnN0IGNoZWNrMzIgPSBaU1REX3JlYWRMRTMyKHNy Yyk7IC8qIHNyY1NpemUgPT0gNCwgZ3VhcmFudGVlZCBieSBkY3R4LT5leHBlY3RlZCAqLw0KKwkJ aWYgKGNoZWNrMzIgIT0gaDMyKQ0KKwkJCXJldHVybiBFUlJPUihjaGVja3N1bV93cm9uZyk7DQor CQlkY3R4LT5leHBlY3RlZCA9IDA7DQorCQlkY3R4LT5zdGFnZSA9IFpTVERkc19nZXRGcmFtZUhl YWRlclNpemU7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwljYXNlIFpTVERkc19kZWNvZGVTa2lwcGFi bGVIZWFkZXI6IHsNCisJCW1lbWNweShkY3R4LT5oZWFkZXJCdWZmZXIgKyBaU1REX2ZyYW1lSGVh ZGVyU2l6ZV9wcmVmaXgsIHNyYywgZGN0eC0+ZXhwZWN0ZWQpOw0KKwkJZGN0eC0+ZXhwZWN0ZWQg PSBaU1REX3JlYWRMRTMyKGRjdHgtPmhlYWRlckJ1ZmZlciArIDQpOw0KKwkJZGN0eC0+c3RhZ2Ug PSBaU1REZHNfc2tpcEZyYW1lOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJY2FzZSBaU1REZHNfc2tp cEZyYW1lOiB7DQorCQlkY3R4LT5leHBlY3RlZCA9IDA7DQorCQlkY3R4LT5zdGFnZSA9IFpTVERk c19nZXRGcmFtZUhlYWRlclNpemU7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwlkZWZhdWx0Og0KKwkJ cmV0dXJuIEVSUk9SKEdFTkVSSUMpOyAvKiBpbXBvc3NpYmxlICovDQorCX0NCit9DQorDQorc3Rh dGljIHNpemVfdCBaU1REX3JlZkRpY3RDb250ZW50KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9p ZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQ0KK3sNCisJZGN0eC0+ZGljdEVuZCA9IGRjdHgtPnBy ZXZpb3VzRHN0RW5kOw0KKwlkY3R4LT52QmFzZSA9IChjb25zdCBjaGFyICopZGljdCAtICgoY29u c3QgY2hhciAqKShkY3R4LT5wcmV2aW91c0RzdEVuZCkgLSAoY29uc3QgY2hhciAqKShkY3R4LT5i YXNlKSk7DQorCWRjdHgtPmJhc2UgPSBkaWN0Ow0KKwlkY3R4LT5wcmV2aW91c0RzdEVuZCA9IChj b25zdCBjaGFyICopZGljdCArIGRpY3RTaXplOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogWlNU RF9sb2FkRW50cm9weSgpIDoNCisgKiBkaWN0IDogbXVzdCBwb2ludCBhdCBiZWdpbm5pbmcgb2Yg YSB2YWxpZCB6c3RkIGRpY3Rpb25hcnkNCisgKiBAcmV0dXJuIDogc2l6ZSBvZiBlbnRyb3B5IHRh YmxlcyByZWFkICovDQorc3RhdGljIHNpemVfdCBaU1REX2xvYWRFbnRyb3B5KFpTVERfZW50cm9w eVRhYmxlc190ICplbnRyb3B5LCBjb25zdCB2b2lkICpjb25zdCBkaWN0LCBzaXplX3QgY29uc3Qg ZGljdFNpemUpDQorew0KKwljb25zdCBCWVRFICpkaWN0UHRyID0gKGNvbnN0IEJZVEUgKilkaWN0 Ow0KKwljb25zdCBCWVRFICpjb25zdCBkaWN0RW5kID0gZGljdFB0ciArIGRpY3RTaXplOw0KKw0K KwlpZiAoZGljdFNpemUgPD0gOCkNCisJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRl ZCk7DQorCWRpY3RQdHIgKz0gODsgLyogc2tpcCBoZWFkZXIgPSBtYWdpYyArIGRpY3RJRCAqLw0K Kw0KKwl7DQorCQlzaXplX3QgY29uc3QgaFNpemUgPSBIVUZfcmVhZERUYWJsZVg0X3drc3AoZW50 cm9weS0+aHVmVGFibGUsIGRpY3RQdHIsIGRpY3RFbmQgLSBkaWN0UHRyLCBlbnRyb3B5LT53b3Jr c3BhY2UsIHNpemVvZihlbnRyb3B5LT53b3Jrc3BhY2UpKTsNCisJCWlmIChIVUZfaXNFcnJvciho U2l6ZSkpDQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJCWRpY3RQ dHIgKz0gaFNpemU7DQorCX0NCisNCisJew0KKwkJc2hvcnQgb2ZmY29kZU5Db3VudFtNYXhPZmYg KyAxXTsNCisJCVUzMiBvZmZjb2RlTWF4VmFsdWUgPSBNYXhPZmYsIG9mZmNvZGVMb2c7DQorCQlz aXplX3QgY29uc3Qgb2ZmY29kZUhlYWRlclNpemUgPSBGU0VfcmVhZE5Db3VudChvZmZjb2RlTkNv dW50LCAmb2ZmY29kZU1heFZhbHVlLCAmb2ZmY29kZUxvZywgZGljdFB0ciwgZGljdEVuZCAtIGRp Y3RQdHIpOw0KKwkJaWYgKEZTRV9pc0Vycm9yKG9mZmNvZGVIZWFkZXJTaXplKSkNCisJCQlyZXR1 cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOw0KKwkJaWYgKG9mZmNvZGVMb2cgPiBPZmZG U0VMb2cpDQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJCUNIRUNL X0UoRlNFX2J1aWxkRFRhYmxlX3drc3AoZW50cm9weS0+T0ZUYWJsZSwgb2ZmY29kZU5Db3VudCwg b2ZmY29kZU1heFZhbHVlLCBvZmZjb2RlTG9nLCBlbnRyb3B5LT53b3Jrc3BhY2UsIHNpemVvZihl bnRyb3B5LT53b3Jrc3BhY2UpKSwgZGljdGlvbmFyeV9jb3JydXB0ZWQpOw0KKwkJZGljdFB0ciAr PSBvZmZjb2RlSGVhZGVyU2l6ZTsNCisJfQ0KKw0KKwl7DQorCQlzaG9ydCBtYXRjaGxlbmd0aE5D b3VudFtNYXhNTCArIDFdOw0KKwkJdW5zaWduZWQgbWF0Y2hsZW5ndGhNYXhWYWx1ZSA9IE1heE1M LCBtYXRjaGxlbmd0aExvZzsNCisJCXNpemVfdCBjb25zdCBtYXRjaGxlbmd0aEhlYWRlclNpemUg PSBGU0VfcmVhZE5Db3VudChtYXRjaGxlbmd0aE5Db3VudCwgJm1hdGNobGVuZ3RoTWF4VmFsdWUs ICZtYXRjaGxlbmd0aExvZywgZGljdFB0ciwgZGljdEVuZCAtIGRpY3RQdHIpOw0KKwkJaWYgKEZT RV9pc0Vycm9yKG1hdGNobGVuZ3RoSGVhZGVyU2l6ZSkpDQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rp b25hcnlfY29ycnVwdGVkKTsNCisJCWlmIChtYXRjaGxlbmd0aExvZyA+IE1MRlNFTG9nKQ0KKwkJ CXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7DQorCQlDSEVDS19FKEZTRV9idWls ZERUYWJsZV93a3NwKGVudHJvcHktPk1MVGFibGUsIG1hdGNobGVuZ3RoTkNvdW50LCBtYXRjaGxl bmd0aE1heFZhbHVlLCBtYXRjaGxlbmd0aExvZywgZW50cm9weS0+d29ya3NwYWNlLCBzaXplb2Yo ZW50cm9weS0+d29ya3NwYWNlKSksIGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJCWRpY3RQdHIg Kz0gbWF0Y2hsZW5ndGhIZWFkZXJTaXplOw0KKwl9DQorDQorCXsNCisJCXNob3J0IGxpdGxlbmd0 aE5Db3VudFtNYXhMTCArIDFdOw0KKwkJdW5zaWduZWQgbGl0bGVuZ3RoTWF4VmFsdWUgPSBNYXhM TCwgbGl0bGVuZ3RoTG9nOw0KKwkJc2l6ZV90IGNvbnN0IGxpdGxlbmd0aEhlYWRlclNpemUgPSBG U0VfcmVhZE5Db3VudChsaXRsZW5ndGhOQ291bnQsICZsaXRsZW5ndGhNYXhWYWx1ZSwgJmxpdGxl bmd0aExvZywgZGljdFB0ciwgZGljdEVuZCAtIGRpY3RQdHIpOw0KKwkJaWYgKEZTRV9pc0Vycm9y KGxpdGxlbmd0aEhlYWRlclNpemUpKQ0KKwkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1 cHRlZCk7DQorCQlpZiAobGl0bGVuZ3RoTG9nID4gTExGU0VMb2cpDQorCQkJcmV0dXJuIEVSUk9S KGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJCUNIRUNLX0UoRlNFX2J1aWxkRFRhYmxlX3drc3Ao ZW50cm9weS0+TExUYWJsZSwgbGl0bGVuZ3RoTkNvdW50LCBsaXRsZW5ndGhNYXhWYWx1ZSwgbGl0 bGVuZ3RoTG9nLCBlbnRyb3B5LT53b3Jrc3BhY2UsIHNpemVvZihlbnRyb3B5LT53b3Jrc3BhY2Up KSwgZGljdGlvbmFyeV9jb3JydXB0ZWQpOw0KKwkJZGljdFB0ciArPSBsaXRsZW5ndGhIZWFkZXJT aXplOw0KKwl9DQorDQorCWlmIChkaWN0UHRyICsgMTIgPiBkaWN0RW5kKQ0KKwkJcmV0dXJuIEVS Uk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJew0KKwkJaW50IGk7DQorCQlzaXplX3QgY29u c3QgZGljdENvbnRlbnRTaXplID0gKHNpemVfdCkoZGljdEVuZCAtIChkaWN0UHRyICsgMTIpKTsN CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCisJCQlVMzIgY29uc3QgcmVwID0gWlNURF9y ZWFkTEUzMihkaWN0UHRyKTsNCisJCQlkaWN0UHRyICs9IDQ7DQorCQkJaWYgKHJlcCA9PSAwIHx8 IHJlcCA+PSBkaWN0Q29udGVudFNpemUpDQorCQkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2Nv cnJ1cHRlZCk7DQorCQkJZW50cm9weS0+cmVwW2ldID0gcmVwOw0KKwkJfQ0KKwl9DQorDQorCXJl dHVybiBkaWN0UHRyIC0gKGNvbnN0IEJZVEUgKilkaWN0Ow0KK30NCisNCitzdGF0aWMgc2l6ZV90 IFpTVERfZGVjb21wcmVzc19pbnNlcnREaWN0aW9uYXJ5KFpTVERfREN0eCAqZGN0eCwgY29uc3Qg dm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQ0KK3sNCisJaWYgKGRpY3RTaXplIDwgOCkNCisJ CXJldHVybiBaU1REX3JlZkRpY3RDb250ZW50KGRjdHgsIGRpY3QsIGRpY3RTaXplKTsNCisJew0K KwkJVTMyIGNvbnN0IG1hZ2ljID0gWlNURF9yZWFkTEUzMihkaWN0KTsNCisJCWlmIChtYWdpYyAh PSBaU1REX0RJQ1RfTUFHSUMpIHsNCisJCQlyZXR1cm4gWlNURF9yZWZEaWN0Q29udGVudChkY3R4 LCBkaWN0LCBkaWN0U2l6ZSk7IC8qIHB1cmUgY29udGVudCBtb2RlICovDQorCQl9DQorCX0NCisJ ZGN0eC0+ZGljdElEID0gWlNURF9yZWFkTEUzMigoY29uc3QgY2hhciAqKWRpY3QgKyA0KTsNCisN CisJLyogbG9hZCBlbnRyb3B5IHRhYmxlcyAqLw0KKwl7DQorCQlzaXplX3QgY29uc3QgZVNpemUg PSBaU1REX2xvYWRFbnRyb3B5KCZkY3R4LT5lbnRyb3B5LCBkaWN0LCBkaWN0U2l6ZSk7DQorCQlp ZiAoWlNURF9pc0Vycm9yKGVTaXplKSkNCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3Jy dXB0ZWQpOw0KKwkJZGljdCA9IChjb25zdCBjaGFyICopZGljdCArIGVTaXplOw0KKwkJZGljdFNp emUgLT0gZVNpemU7DQorCX0NCisJZGN0eC0+bGl0RW50cm9weSA9IGRjdHgtPmZzZUVudHJvcHkg PSAxOw0KKw0KKwkvKiByZWZlcmVuY2UgZGljdGlvbmFyeSBjb250ZW50ICovDQorCXJldHVybiBa U1REX3JlZkRpY3RDb250ZW50KGRjdHgsIGRpY3QsIGRpY3RTaXplKTsNCit9DQorDQorc2l6ZV90 IFpTVERfZGVjb21wcmVzc0JlZ2luX3VzaW5nRGljdChaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZv aWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkNCit7DQorCUNIRUNLX0YoWlNURF9kZWNvbXByZXNz QmVnaW4oZGN0eCkpOw0KKwlpZiAoZGljdCAmJiBkaWN0U2l6ZSkNCisJCUNIRUNLX0UoWlNURF9k ZWNvbXByZXNzX2luc2VydERpY3Rpb25hcnkoZGN0eCwgZGljdCwgZGljdFNpemUpLCBkaWN0aW9u YXJ5X2NvcnJ1cHRlZCk7DQorCXJldHVybiAwOw0KK30NCisNCisvKiA9PT09PT0gICBaU1REX0RE aWN0ICAgPT09PT09ICovDQorDQorc3RydWN0IFpTVERfRERpY3RfcyB7DQorCXZvaWQgKmRpY3RC dWZmZXI7DQorCWNvbnN0IHZvaWQgKmRpY3RDb250ZW50Ow0KKwlzaXplX3QgZGljdFNpemU7DQor CVpTVERfZW50cm9weVRhYmxlc190IGVudHJvcHk7DQorCVUzMiBkaWN0SUQ7DQorCVUzMiBlbnRy b3B5UHJlc2VudDsNCisJWlNURF9jdXN0b21NZW0gY01lbTsNCit9OyAvKiB0eXBlZGVmJ2QgdG8g WlNURF9ERGljdCB3aXRoaW4gInpzdGQuaCIgKi8NCisNCitzaXplX3QgWlNURF9ERGljdFdvcmtz cGFjZUJvdW5kKHZvaWQpIHsgcmV0dXJuIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfc3RhY2spKSAr IFpTVERfQUxJR04oc2l6ZW9mKFpTVERfRERpY3QpKTsgfQ0KKw0KK3N0YXRpYyBjb25zdCB2b2lk ICpaU1REX0REaWN0RGljdENvbnRlbnQoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpIHsgcmV0dXJu IGRkaWN0LT5kaWN0Q29udGVudDsgfQ0KKw0KK3N0YXRpYyBzaXplX3QgWlNURF9ERGljdERpY3RT aXplKGNvbnN0IFpTVERfRERpY3QgKmRkaWN0KSB7IHJldHVybiBkZGljdC0+ZGljdFNpemU7IH0N CisNCitzdGF0aWMgdm9pZCBaU1REX3JlZkREaWN0KFpTVERfREN0eCAqZHN0REN0eCwgY29uc3Qg WlNURF9ERGljdCAqZGRpY3QpDQorew0KKwlaU1REX2RlY29tcHJlc3NCZWdpbihkc3REQ3R4KTsg LyogaW5pdCAqLw0KKwlpZiAoZGRpY3QpIHsJCSAgICAgICAvKiBzdXBwb3J0IHJlZkREaWN0IG9u IE5VTEwgKi8NCisJCWRzdERDdHgtPmRpY3RJRCA9IGRkaWN0LT5kaWN0SUQ7DQorCQlkc3REQ3R4 LT5iYXNlID0gZGRpY3QtPmRpY3RDb250ZW50Ow0KKwkJZHN0REN0eC0+dkJhc2UgPSBkZGljdC0+ ZGljdENvbnRlbnQ7DQorCQlkc3REQ3R4LT5kaWN0RW5kID0gKGNvbnN0IEJZVEUgKilkZGljdC0+ ZGljdENvbnRlbnQgKyBkZGljdC0+ZGljdFNpemU7DQorCQlkc3REQ3R4LT5wcmV2aW91c0RzdEVu ZCA9IGRzdERDdHgtPmRpY3RFbmQ7DQorCQlpZiAoZGRpY3QtPmVudHJvcHlQcmVzZW50KSB7DQor CQkJZHN0REN0eC0+bGl0RW50cm9weSA9IDE7DQorCQkJZHN0REN0eC0+ZnNlRW50cm9weSA9IDE7 DQorCQkJZHN0REN0eC0+TExUcHRyID0gZGRpY3QtPmVudHJvcHkuTExUYWJsZTsNCisJCQlkc3RE Q3R4LT5NTFRwdHIgPSBkZGljdC0+ZW50cm9weS5NTFRhYmxlOw0KKwkJCWRzdERDdHgtPk9GVHB0 ciA9IGRkaWN0LT5lbnRyb3B5Lk9GVGFibGU7DQorCQkJZHN0REN0eC0+SFVGcHRyID0gZGRpY3Qt PmVudHJvcHkuaHVmVGFibGU7DQorCQkJZHN0REN0eC0+ZW50cm9weS5yZXBbMF0gPSBkZGljdC0+ ZW50cm9weS5yZXBbMF07DQorCQkJZHN0REN0eC0+ZW50cm9weS5yZXBbMV0gPSBkZGljdC0+ZW50 cm9weS5yZXBbMV07DQorCQkJZHN0REN0eC0+ZW50cm9weS5yZXBbMl0gPSBkZGljdC0+ZW50cm9w eS5yZXBbMl07DQorCQl9IGVsc2Ugew0KKwkJCWRzdERDdHgtPmxpdEVudHJvcHkgPSAwOw0KKwkJ CWRzdERDdHgtPmZzZUVudHJvcHkgPSAwOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyBzaXpl X3QgWlNURF9sb2FkRW50cm9weV9pbkREaWN0KFpTVERfRERpY3QgKmRkaWN0KQ0KK3sNCisJZGRp Y3QtPmRpY3RJRCA9IDA7DQorCWRkaWN0LT5lbnRyb3B5UHJlc2VudCA9IDA7DQorCWlmIChkZGlj dC0+ZGljdFNpemUgPCA4KQ0KKwkJcmV0dXJuIDA7DQorCXsNCisJCVUzMiBjb25zdCBtYWdpYyA9 IFpTVERfcmVhZExFMzIoZGRpY3QtPmRpY3RDb250ZW50KTsNCisJCWlmIChtYWdpYyAhPSBaU1RE X0RJQ1RfTUFHSUMpDQorCQkJcmV0dXJuIDA7IC8qIHB1cmUgY29udGVudCBtb2RlICovDQorCX0N CisJZGRpY3QtPmRpY3RJRCA9IFpTVERfcmVhZExFMzIoKGNvbnN0IGNoYXIgKilkZGljdC0+ZGlj dENvbnRlbnQgKyA0KTsNCisNCisJLyogbG9hZCBlbnRyb3B5IHRhYmxlcyAqLw0KKwlDSEVDS19F KFpTVERfbG9hZEVudHJvcHkoJmRkaWN0LT5lbnRyb3B5LCBkZGljdC0+ZGljdENvbnRlbnQsIGRk aWN0LT5kaWN0U2l6ZSksIGRpY3Rpb25hcnlfY29ycnVwdGVkKTsNCisJZGRpY3QtPmVudHJvcHlQ cmVzZW50ID0gMTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBaU1REX0REaWN0ICpaU1RE X2NyZWF0ZUREaWN0X2FkdmFuY2VkKGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwg dW5zaWduZWQgYnlSZWZlcmVuY2UsIFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkNCit7DQorCWlm ICghY3VzdG9tTWVtLmN1c3RvbUFsbG9jIHx8ICFjdXN0b21NZW0uY3VzdG9tRnJlZSkNCisJCXJl dHVybiBOVUxMOw0KKw0KKwl7DQorCQlaU1REX0REaWN0ICpjb25zdCBkZGljdCA9IChaU1REX0RE aWN0ICopWlNURF9tYWxsb2Moc2l6ZW9mKFpTVERfRERpY3QpLCBjdXN0b21NZW0pOw0KKwkJaWYg KCFkZGljdCkNCisJCQlyZXR1cm4gTlVMTDsNCisJCWRkaWN0LT5jTWVtID0gY3VzdG9tTWVtOw0K Kw0KKwkJaWYgKChieVJlZmVyZW5jZSkgfHwgKCFkaWN0KSB8fCAoIWRpY3RTaXplKSkgew0KKwkJ CWRkaWN0LT5kaWN0QnVmZmVyID0gTlVMTDsNCisJCQlkZGljdC0+ZGljdENvbnRlbnQgPSBkaWN0 Ow0KKwkJfSBlbHNlIHsNCisJCQl2b2lkICpjb25zdCBpbnRlcm5hbEJ1ZmZlciA9IFpTVERfbWFs bG9jKGRpY3RTaXplLCBjdXN0b21NZW0pOw0KKwkJCWlmICghaW50ZXJuYWxCdWZmZXIpIHsNCisJ CQkJWlNURF9mcmVlRERpY3QoZGRpY3QpOw0KKwkJCQlyZXR1cm4gTlVMTDsNCisJCQl9DQorCQkJ bWVtY3B5KGludGVybmFsQnVmZmVyLCBkaWN0LCBkaWN0U2l6ZSk7DQorCQkJZGRpY3QtPmRpY3RC dWZmZXIgPSBpbnRlcm5hbEJ1ZmZlcjsNCisJCQlkZGljdC0+ZGljdENvbnRlbnQgPSBpbnRlcm5h bEJ1ZmZlcjsNCisJCX0NCisJCWRkaWN0LT5kaWN0U2l6ZSA9IGRpY3RTaXplOw0KKwkJZGRpY3Qt PmVudHJvcHkuaHVmVGFibGVbMF0gPSAoSFVGX0RUYWJsZSkoKEh1ZkxvZykqMHgxMDAwMDAxKTsg LyogY292ZXIgYm90aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gKi8NCisJCS8qIHBhcnNlIGRpY3Rp b25hcnkgY29udGVudCAqLw0KKwkJew0KKwkJCXNpemVfdCBjb25zdCBlcnJvckNvZGUgPSBaU1RE X2xvYWRFbnRyb3B5X2luRERpY3QoZGRpY3QpOw0KKwkJCWlmIChaU1REX2lzRXJyb3IoZXJyb3JD b2RlKSkgew0KKwkJCQlaU1REX2ZyZWVERGljdChkZGljdCk7DQorCQkJCXJldHVybiBOVUxMOw0K KwkJCX0NCisJCX0NCisNCisJCXJldHVybiBkZGljdDsNCisJfQ0KK30NCisNCisvKiEgWlNURF9p bml0RERpY3QoKSA6DQorKiAgIENyZWF0ZSBhIGRpZ2VzdGVkIGRpY3Rpb25hcnksIHRvIHN0YXJ0 IGRlY29tcHJlc3Npb24gd2l0aG91dCBzdGFydHVwIGRlbGF5Lg0KKyogICBgZGljdGAgY29udGVu dCBpcyBjb3BpZWQgaW5zaWRlIEREaWN0Lg0KKyogICBDb25zZXF1ZW50bHksIGBkaWN0YCBjYW4g YmUgcmVsZWFzZWQgYWZ0ZXIgYFpTVERfRERpY3RgIGNyZWF0aW9uICovDQorWlNURF9ERGljdCAq WlNURF9pbml0RERpY3QoY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplLCB2b2lkICp3 b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3sNCisJWlNURF9jdXN0b21NZW0gY29u c3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0K KwlyZXR1cm4gWlNURF9jcmVhdGVERGljdF9hZHZhbmNlZChkaWN0LCBkaWN0U2l6ZSwgMSwgc3Rh Y2tNZW0pOw0KK30NCisNCitzaXplX3QgWlNURF9mcmVlRERpY3QoWlNURF9ERGljdCAqZGRpY3Qp DQorew0KKwlpZiAoZGRpY3QgPT0gTlVMTCkNCisJCXJldHVybiAwOyAvKiBzdXBwb3J0IGZyZWUg b24gTlVMTCAqLw0KKwl7DQorCQlaU1REX2N1c3RvbU1lbSBjb25zdCBjTWVtID0gZGRpY3QtPmNN ZW07DQorCQlaU1REX2ZyZWUoZGRpY3QtPmRpY3RCdWZmZXIsIGNNZW0pOw0KKwkJWlNURF9mcmVl KGRkaWN0LCBjTWVtKTsNCisJCXJldHVybiAwOw0KKwl9DQorfQ0KKw0KKy8qISBaU1REX2dldERp Y3RJRF9mcm9tRGljdCgpIDoNCisgKiAgUHJvdmlkZXMgdGhlIGRpY3RJRCBzdG9yZWQgd2l0aGlu IGRpY3Rpb25hcnkuDQorICogIGlmIEByZXR1cm4gPT0gMCwgdGhlIGRpY3Rpb25hcnkgaXMgbm90 IGNvbmZvcm1hbnQgd2l0aCBac3RhbmRhcmQgc3BlY2lmaWNhdGlvbi4NCisgKiAgSXQgY2FuIHN0 aWxsIGJlIGxvYWRlZCwgYnV0IGFzIGEgY29udGVudC1vbmx5IGRpY3Rpb25hcnkuICovDQordW5z aWduZWQgWlNURF9nZXREaWN0SURfZnJvbURpY3QoY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRp Y3RTaXplKQ0KK3sNCisJaWYgKGRpY3RTaXplIDwgOCkNCisJCXJldHVybiAwOw0KKwlpZiAoWlNU RF9yZWFkTEUzMihkaWN0KSAhPSBaU1REX0RJQ1RfTUFHSUMpDQorCQlyZXR1cm4gMDsNCisJcmV0 dXJuIFpTVERfcmVhZExFMzIoKGNvbnN0IGNoYXIgKilkaWN0ICsgNCk7DQorfQ0KKw0KKy8qISBa U1REX2dldERpY3RJRF9mcm9tRERpY3QoKSA6DQorICogIFByb3ZpZGVzIHRoZSBkaWN0SUQgb2Yg dGhlIGRpY3Rpb25hcnkgbG9hZGVkIGludG8gYGRkaWN0YC4NCisgKiAgSWYgQHJldHVybiA9PSAw LCB0aGUgZGljdGlvbmFyeSBpcyBub3QgY29uZm9ybWFudCB0byBac3RhbmRhcmQgc3BlY2lmaWNh dGlvbiwgb3IgZW1wdHkuDQorICogIE5vbi1jb25mb3JtYW50IGRpY3Rpb25hcmllcyBjYW4gc3Rp bGwgYmUgbG9hZGVkLCBidXQgYXMgY29udGVudC1vbmx5IGRpY3Rpb25hcmllcy4gKi8NCit1bnNp Z25lZCBaU1REX2dldERpY3RJRF9mcm9tRERpY3QoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpDQor ew0KKwlpZiAoZGRpY3QgPT0gTlVMTCkNCisJCXJldHVybiAwOw0KKwlyZXR1cm4gWlNURF9nZXRE aWN0SURfZnJvbURpY3QoZGRpY3QtPmRpY3RDb250ZW50LCBkZGljdC0+ZGljdFNpemUpOw0KK30N CisNCisvKiEgWlNURF9nZXREaWN0SURfZnJvbUZyYW1lKCkgOg0KKyAqICBQcm92aWRlcyB0aGUg ZGljdElEIHJlcXVpcmVkIHRvIGRlY29tcHJlc3NlZCB0aGUgZnJhbWUgc3RvcmVkIHdpdGhpbiBg c3JjYC4NCisgKiAgSWYgQHJldHVybiA9PSAwLCB0aGUgZGljdElEIGNvdWxkIG5vdCBiZSBkZWNv ZGVkLg0KKyAqICBUaGlzIGNvdWxkIGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zIDoN CisgKiAgLSBUaGUgZnJhbWUgZG9lcyBub3QgcmVxdWlyZSBhIGRpY3Rpb25hcnkgdG8gYmUgZGVj b2RlZCAobW9zdCBjb21tb24gY2FzZSkuDQorICogIC0gVGhlIGZyYW1lIHdhcyBidWlsdCB3aXRo IGRpY3RJRCBpbnRlbnRpb25hbGx5IHJlbW92ZWQuIFdoYXRldmVyIGRpY3Rpb25hcnkgaXMgbmVj ZXNzYXJ5IGlzIGEgaGlkZGVuIGluZm9ybWF0aW9uLg0KKyAqICAgIE5vdGUgOiB0aGlzIHVzZSBj YXNlIGFsc28gaGFwcGVucyB3aGVuIHVzaW5nIGEgbm9uLWNvbmZvcm1hbnQgZGljdGlvbmFyeS4N CisgKiAgLSBgc3JjU2l6ZWAgaXMgdG9vIHNtYWxsLCBhbmQgYXMgYSByZXN1bHQsIHRoZSBmcmFt ZSBoZWFkZXIgY291bGQgbm90IGJlIGRlY29kZWQgKG9ubHkgcG9zc2libGUgaWYgYHNyY1NpemUg PCBaU1REX0ZSQU1FSEVBREVSU0laRV9NQVhgKS4NCisgKiAgLSBUaGlzIGlzIG5vdCBhIFpzdGFu ZGFyZCBmcmFtZS4NCisgKiAgV2hlbiBpZGVudGlmeWluZyB0aGUgZXhhY3QgZmFpbHVyZSBjYXVz ZSwgaXQncyBwb3NzaWJsZSB0byB1c2VkIFpTVERfZ2V0RnJhbWVQYXJhbXMoKSwgd2hpY2ggd2ls bCBwcm92aWRlIGEgbW9yZSBwcmVjaXNlIGVycm9yIGNvZGUuICovDQordW5zaWduZWQgWlNURF9n ZXREaWN0SURfZnJvbUZyYW1lKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQorew0K KwlaU1REX2ZyYW1lUGFyYW1zIHpmcCA9IHswLCAwLCAwLCAwfTsNCisJc2l6ZV90IGNvbnN0IGhF cnJvciA9IFpTVERfZ2V0RnJhbWVQYXJhbXMoJnpmcCwgc3JjLCBzcmNTaXplKTsNCisJaWYgKFpT VERfaXNFcnJvcihoRXJyb3IpKQ0KKwkJcmV0dXJuIDA7DQorCXJldHVybiB6ZnAuZGljdElEOw0K K30NCisNCisvKiEgWlNURF9kZWNvbXByZXNzX3VzaW5nRERpY3QoKSA6DQorKiAgIERlY29tcHJl c3Npb24gdXNpbmcgYSBwcmUtZGlnZXN0ZWQgRGljdGlvbmFyeQ0KKyogICBVc2UgZGljdGlvbmFy eSB3aXRob3V0IHNpZ25pZmljYW50IG92ZXJoZWFkLiAqLw0KK3NpemVfdCBaU1REX2RlY29tcHJl c3NfdXNpbmdERGljdChaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFj aXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBaU1REX0REaWN0ICpk ZGljdCkNCit7DQorCS8qIHBhc3MgY29udGVudCBhbmQgc2l6ZSBpbiBjYXNlIGxlZ2FjeSBmcmFt ZXMgYXJlIGVuY291bnRlcmVkICovDQorCXJldHVybiBaU1REX2RlY29tcHJlc3NNdWx0aUZyYW1l KGRjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSwgTlVMTCwgMCwgZGRpY3QpOw0K K30NCisNCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisqICAgU3Ry ZWFtaW5nIGRlY29tcHJlc3Npb24NCisqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ki8NCisNCit0eXBlZGVmIGVudW0geyB6ZHNzX2luaXQsIHpkc3NfbG9hZEhlYWRlciwgemRz c19yZWFkLCB6ZHNzX2xvYWQsIHpkc3NfZmx1c2ggfSBaU1REX2RTdHJlYW1TdGFnZTsNCisNCisv KiAqKiogUmVzb3VyY2UgbWFuYWdlbWVudCAqKiogKi8NCitzdHJ1Y3QgWlNURF9EU3RyZWFtX3Mg ew0KKwlaU1REX0RDdHggKmRjdHg7DQorCVpTVERfRERpY3QgKmRkaWN0TG9jYWw7DQorCWNvbnN0 IFpTVERfRERpY3QgKmRkaWN0Ow0KKwlaU1REX2ZyYW1lUGFyYW1zIGZQYXJhbXM7DQorCVpTVERf ZFN0cmVhbVN0YWdlIHN0YWdlOw0KKwljaGFyICppbkJ1ZmY7DQorCXNpemVfdCBpbkJ1ZmZTaXpl Ow0KKwlzaXplX3QgaW5Qb3M7DQorCXNpemVfdCBtYXhXaW5kb3dTaXplOw0KKwljaGFyICpvdXRC dWZmOw0KKwlzaXplX3Qgb3V0QnVmZlNpemU7DQorCXNpemVfdCBvdXRTdGFydDsNCisJc2l6ZV90 IG91dEVuZDsNCisJc2l6ZV90IGJsb2NrU2l6ZTsNCisJQllURSBoZWFkZXJCdWZmZXJbWlNURF9G UkFNRUhFQURFUlNJWkVfTUFYXTsgLyogdG1wIGJ1ZmZlciB0byBzdG9yZSBmcmFtZSBoZWFkZXIg Ki8NCisJc2l6ZV90IGxoU2l6ZTsNCisJWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtOw0KKwl2b2lk ICpsZWdhY3lDb250ZXh0Ow0KKwlVMzIgcHJldmlvdXNMZWdhY3lWZXJzaW9uOw0KKwlVMzIgbGVn YWN5VmVyc2lvbjsNCisJVTMyIGhvc3RhZ2VCeXRlOw0KK307IC8qIHR5cGVkZWYnZCB0byBaU1RE X0RTdHJlYW0gd2l0aGluICJ6c3RkLmgiICovDQorDQorc2l6ZV90IFpTVERfRFN0cmVhbVdvcmtz cGFjZUJvdW5kKHNpemVfdCBtYXhXaW5kb3dTaXplKQ0KK3sNCisJc2l6ZV90IGNvbnN0IGJsb2Nr U2l6ZSA9IE1JTihtYXhXaW5kb3dTaXplLCBaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCk7DQor CXNpemVfdCBjb25zdCBpbkJ1ZmZTaXplID0gYmxvY2tTaXplOw0KKwlzaXplX3QgY29uc3Qgb3V0 QnVmZlNpemUgPSBtYXhXaW5kb3dTaXplICsgYmxvY2tTaXplICsgV0lMRENPUFlfT1ZFUkxFTkdU SCAqIDI7DQorCXJldHVybiBaU1REX0RDdHhXb3Jrc3BhY2VCb3VuZCgpICsgWlNURF9BTElHTihz aXplb2YoWlNURF9EU3RyZWFtKSkgKyBaU1REX0FMSUdOKGluQnVmZlNpemUpICsgWlNURF9BTElH TihvdXRCdWZmU2l6ZSk7DQorfQ0KKw0KK3N0YXRpYyBaU1REX0RTdHJlYW0gKlpTVERfY3JlYXRl RFN0cmVhbV9hZHZhbmNlZChaU1REX2N1c3RvbU1lbSBjdXN0b21NZW0pDQorew0KKwlaU1REX0RT dHJlYW0gKnpkczsNCisNCisJaWYgKCFjdXN0b21NZW0uY3VzdG9tQWxsb2MgfHwgIWN1c3RvbU1l bS5jdXN0b21GcmVlKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXpkcyA9IChaU1REX0RTdHJlYW0g KilaU1REX21hbGxvYyhzaXplb2YoWlNURF9EU3RyZWFtKSwgY3VzdG9tTWVtKTsNCisJaWYgKHpk cyA9PSBOVUxMKQ0KKwkJcmV0dXJuIE5VTEw7DQorCW1lbXNldCh6ZHMsIDAsIHNpemVvZihaU1RE X0RTdHJlYW0pKTsNCisJbWVtY3B5KCZ6ZHMtPmN1c3RvbU1lbSwgJmN1c3RvbU1lbSwgc2l6ZW9m KFpTVERfY3VzdG9tTWVtKSk7DQorCXpkcy0+ZGN0eCA9IFpTVERfY3JlYXRlREN0eF9hZHZhbmNl ZChjdXN0b21NZW0pOw0KKwlpZiAoemRzLT5kY3R4ID09IE5VTEwpIHsNCisJCVpTVERfZnJlZURT dHJlYW0oemRzKTsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCXpkcy0+c3RhZ2UgPSB6ZHNzX2lu aXQ7DQorCXpkcy0+bWF4V2luZG93U2l6ZSA9IFpTVERfTUFYV0lORE9XU0laRV9ERUZBVUxUOw0K KwlyZXR1cm4gemRzOw0KK30NCisNCitaU1REX0RTdHJlYW0gKlpTVERfaW5pdERTdHJlYW0oc2l6 ZV90IG1heFdpbmRvd1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUp DQorew0KKwlaU1REX2N1c3RvbU1lbSBjb25zdCBzdGFja01lbSA9IFpTVERfaW5pdFN0YWNrKHdv cmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7DQorCVpTVERfRFN0cmVhbSAqemRzID0gWlNURF9jcmVh dGVEU3RyZWFtX2FkdmFuY2VkKHN0YWNrTWVtKTsNCisJaWYgKCF6ZHMpIHsNCisJCXJldHVybiBO VUxMOw0KKwl9DQorDQorCXpkcy0+bWF4V2luZG93U2l6ZSA9IG1heFdpbmRvd1NpemU7DQorCXpk cy0+c3RhZ2UgPSB6ZHNzX2xvYWRIZWFkZXI7DQorCXpkcy0+bGhTaXplID0gemRzLT5pblBvcyA9 IHpkcy0+b3V0U3RhcnQgPSB6ZHMtPm91dEVuZCA9IDA7DQorCVpTVERfZnJlZUREaWN0KHpkcy0+ ZGRpY3RMb2NhbCk7DQorCXpkcy0+ZGRpY3RMb2NhbCA9IE5VTEw7DQorCXpkcy0+ZGRpY3QgPSB6 ZHMtPmRkaWN0TG9jYWw7DQorCXpkcy0+bGVnYWN5VmVyc2lvbiA9IDA7DQorCXpkcy0+aG9zdGFn ZUJ5dGUgPSAwOw0KKw0KKwl7DQorCQlzaXplX3QgY29uc3QgYmxvY2tTaXplID0gTUlOKHpkcy0+ bWF4V2luZG93U2l6ZSwgWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgpOw0KKwkJc2l6ZV90IGNv bnN0IG5lZWRlZE91dFNpemUgPSB6ZHMtPm1heFdpbmRvd1NpemUgKyBibG9ja1NpemUgKyBXSUxE Q09QWV9PVkVSTEVOR1RIICogMjsNCisNCisJCXpkcy0+aW5CdWZmID0gKGNoYXIgKilaU1REX21h bGxvYyhibG9ja1NpemUsIHpkcy0+Y3VzdG9tTWVtKTsNCisJCXpkcy0+aW5CdWZmU2l6ZSA9IGJs b2NrU2l6ZTsNCisJCXpkcy0+b3V0QnVmZiA9IChjaGFyICopWlNURF9tYWxsb2MobmVlZGVkT3V0 U2l6ZSwgemRzLT5jdXN0b21NZW0pOw0KKwkJemRzLT5vdXRCdWZmU2l6ZSA9IG5lZWRlZE91dFNp emU7DQorCQlpZiAoemRzLT5pbkJ1ZmYgPT0gTlVMTCB8fCB6ZHMtPm91dEJ1ZmYgPT0gTlVMTCkg ew0KKwkJCVpTVERfZnJlZURTdHJlYW0oemRzKTsNCisJCQlyZXR1cm4gTlVMTDsNCisJCX0NCisJ fQ0KKwlyZXR1cm4gemRzOw0KK30NCisNCitaU1REX0RTdHJlYW0gKlpTVERfaW5pdERTdHJlYW1f dXNpbmdERGljdChzaXplX3QgbWF4V2luZG93U2l6ZSwgY29uc3QgWlNURF9ERGljdCAqZGRpY3Qs IHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0KKwlaU1REX0RTdHJl YW0gKnpkcyA9IFpTVERfaW5pdERTdHJlYW0obWF4V2luZG93U2l6ZSwgd29ya3NwYWNlLCB3b3Jr c3BhY2VTaXplKTsNCisJaWYgKHpkcykgew0KKwkJemRzLT5kZGljdCA9IGRkaWN0Ow0KKwl9DQor CXJldHVybiB6ZHM7DQorfQ0KKw0KK3NpemVfdCBaU1REX2ZyZWVEU3RyZWFtKFpTVERfRFN0cmVh bSAqemRzKQ0KK3sNCisJaWYgKHpkcyA9PSBOVUxMKQ0KKwkJcmV0dXJuIDA7IC8qIHN1cHBvcnQg ZnJlZSBvbiBudWxsICovDQorCXsNCisJCVpTVERfY3VzdG9tTWVtIGNvbnN0IGNNZW0gPSB6ZHMt PmN1c3RvbU1lbTsNCisJCVpTVERfZnJlZURDdHgoemRzLT5kY3R4KTsNCisJCXpkcy0+ZGN0eCA9 IE5VTEw7DQorCQlaU1REX2ZyZWVERGljdCh6ZHMtPmRkaWN0TG9jYWwpOw0KKwkJemRzLT5kZGlj dExvY2FsID0gTlVMTDsNCisJCVpTVERfZnJlZSh6ZHMtPmluQnVmZiwgY01lbSk7DQorCQl6ZHMt PmluQnVmZiA9IE5VTEw7DQorCQlaU1REX2ZyZWUoemRzLT5vdXRCdWZmLCBjTWVtKTsNCisJCXpk cy0+b3V0QnVmZiA9IE5VTEw7DQorCQlaU1REX2ZyZWUoemRzLCBjTWVtKTsNCisJCXJldHVybiAw Ow0KKwl9DQorfQ0KKw0KKy8qICoqKiBJbml0aWFsaXphdGlvbiAqKiogKi8NCisNCitzaXplX3Qg WlNURF9EU3RyZWFtSW5TaXplKHZvaWQpIHsgcmV0dXJuIFpTVERfQkxPQ0tTSVpFX0FCU09MVVRF TUFYICsgWlNURF9ibG9ja0hlYWRlclNpemU7IH0NCitzaXplX3QgWlNURF9EU3RyZWFtT3V0U2l6 ZSh2b2lkKSB7IHJldHVybiBaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWDsgfQ0KKw0KK3NpemVf dCBaU1REX3Jlc2V0RFN0cmVhbShaU1REX0RTdHJlYW0gKnpkcykNCit7DQorCXpkcy0+c3RhZ2Ug PSB6ZHNzX2xvYWRIZWFkZXI7DQorCXpkcy0+bGhTaXplID0gemRzLT5pblBvcyA9IHpkcy0+b3V0 U3RhcnQgPSB6ZHMtPm91dEVuZCA9IDA7DQorCXpkcy0+bGVnYWN5VmVyc2lvbiA9IDA7DQorCXpk cy0+aG9zdGFnZUJ5dGUgPSAwOw0KKwlyZXR1cm4gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4 Ow0KK30NCisNCisvKiAqKioqKiAgIERlY29tcHJlc3Npb24gICAqKioqKiAqLw0KKw0KK1pTVERf U1RBVElDIHNpemVfdCBaU1REX2xpbWl0Q29weSh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0 eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCit7DQorCXNpemVfdCBjb25zdCBs ZW5ndGggPSBNSU4oZHN0Q2FwYWNpdHksIHNyY1NpemUpOw0KKwltZW1jcHkoZHN0LCBzcmMsIGxl bmd0aCk7DQorCXJldHVybiBsZW5ndGg7DQorfQ0KKw0KK3NpemVfdCBaU1REX2RlY29tcHJlc3NT dHJlYW0oWlNURF9EU3RyZWFtICp6ZHMsIFpTVERfb3V0QnVmZmVyICpvdXRwdXQsIFpTVERfaW5C dWZmZXIgKmlucHV0KQ0KK3sNCisJY29uc3QgY2hhciAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IGNo YXIgKikoaW5wdXQtPnNyYykgKyBpbnB1dC0+cG9zOw0KKwljb25zdCBjaGFyICpjb25zdCBpZW5k ID0gKGNvbnN0IGNoYXIgKikoaW5wdXQtPnNyYykgKyBpbnB1dC0+c2l6ZTsNCisJY29uc3QgY2hh ciAqaXAgPSBpc3RhcnQ7DQorCWNoYXIgKmNvbnN0IG9zdGFydCA9IChjaGFyICopKG91dHB1dC0+ ZHN0KSArIG91dHB1dC0+cG9zOw0KKwljaGFyICpjb25zdCBvZW5kID0gKGNoYXIgKikob3V0cHV0 LT5kc3QpICsgb3V0cHV0LT5zaXplOw0KKwljaGFyICpvcCA9IG9zdGFydDsNCisJVTMyIHNvbWVN b3JlV29yayA9IDE7DQorDQorCXdoaWxlIChzb21lTW9yZVdvcmspIHsNCisJCXN3aXRjaCAoemRz LT5zdGFnZSkgew0KKwkJY2FzZSB6ZHNzX2luaXQ6DQorCQkJWlNURF9yZXNldERTdHJlYW0oemRz KTsgLyogdHJhbnNwYXJlbnQgcmVzZXQgb24gc3RhcnRpbmcgZGVjb2RpbmcgYSBuZXcgZnJhbWUg Ki8NCisJCQkvKiBmYWxsIHRocm91Z2ggKi8NCisNCisJCWNhc2UgemRzc19sb2FkSGVhZGVyOiB7 DQorCQkJc2l6ZV90IGNvbnN0IGhTaXplID0gWlNURF9nZXRGcmFtZVBhcmFtcygmemRzLT5mUGFy YW1zLCB6ZHMtPmhlYWRlckJ1ZmZlciwgemRzLT5saFNpemUpOw0KKwkJCWlmIChaU1REX2lzRXJy b3IoaFNpemUpKQ0KKwkJCQlyZXR1cm4gaFNpemU7DQorCQkJaWYgKGhTaXplICE9IDApIHsJCQkJ ICAgLyogbmVlZCBtb3JlIGlucHV0ICovDQorCQkJCXNpemVfdCBjb25zdCB0b0xvYWQgPSBoU2l6 ZSAtIHpkcy0+bGhTaXplOyAvKiBpZiBoU2l6ZSE9MCwgaFNpemUgPiB6ZHMtPmxoU2l6ZSAqLw0K KwkJCQlpZiAodG9Mb2FkID4gKHNpemVfdCkoaWVuZCAtIGlwKSkgewkvKiBub3QgZW5vdWdoIGlu cHV0IHRvIGxvYWQgZnVsbCBoZWFkZXIgKi8NCisJCQkJCW1lbWNweSh6ZHMtPmhlYWRlckJ1ZmZl ciArIHpkcy0+bGhTaXplLCBpcCwgaWVuZCAtIGlwKTsNCisJCQkJCXpkcy0+bGhTaXplICs9IGll bmQgLSBpcDsNCisJCQkJCWlucHV0LT5wb3MgPSBpbnB1dC0+c2l6ZTsNCisJCQkJCXJldHVybiAo TUFYKFpTVERfZnJhbWVIZWFkZXJTaXplX21pbiwgaFNpemUpIC0gemRzLT5saFNpemUpICsNCisJ CQkJCSAgICAgICBaU1REX2Jsb2NrSGVhZGVyU2l6ZTsgLyogcmVtYWluaW5nIGhlYWRlciBieXRl cyArIG5leHQgYmxvY2sgaGVhZGVyICovDQorCQkJCX0NCisJCQkJbWVtY3B5KHpkcy0+aGVhZGVy QnVmZmVyICsgemRzLT5saFNpemUsIGlwLCB0b0xvYWQpOw0KKwkJCQl6ZHMtPmxoU2l6ZSA9IGhT aXplOw0KKwkJCQlpcCArPSB0b0xvYWQ7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisNCisJCQkvKiBj aGVjayBmb3Igc2luZ2xlLXBhc3MgbW9kZSBvcHBvcnR1bml0eSAqLw0KKwkJCWlmICh6ZHMtPmZQ YXJhbXMuZnJhbWVDb250ZW50U2l6ZSAmJiB6ZHMtPmZQYXJhbXMud2luZG93U2l6ZSAvKiBza2lw cGFibGUgZnJhbWUgaWYgPT0gMCAqLw0KKwkJCSAgICAmJiAoVTY0KShzaXplX3QpKG9lbmQgLSBv cCkgPj0gemRzLT5mUGFyYW1zLmZyYW1lQ29udGVudFNpemUpIHsNCisJCQkJc2l6ZV90IGNvbnN0 IGNTaXplID0gWlNURF9maW5kRnJhbWVDb21wcmVzc2VkU2l6ZShpc3RhcnQsIGllbmQgLSBpc3Rh cnQpOw0KKwkJCQlpZiAoY1NpemUgPD0gKHNpemVfdCkoaWVuZCAtIGlzdGFydCkpIHsNCisJCQkJ CXNpemVfdCBjb25zdCBkZWNvbXByZXNzZWRTaXplID0gWlNURF9kZWNvbXByZXNzX3VzaW5nRERp Y3QoemRzLT5kY3R4LCBvcCwgb2VuZCAtIG9wLCBpc3RhcnQsIGNTaXplLCB6ZHMtPmRkaWN0KTsN CisJCQkJCWlmIChaU1REX2lzRXJyb3IoZGVjb21wcmVzc2VkU2l6ZSkpDQorCQkJCQkJcmV0dXJu IGRlY29tcHJlc3NlZFNpemU7DQorCQkJCQlpcCA9IGlzdGFydCArIGNTaXplOw0KKwkJCQkJb3Ag Kz0gZGVjb21wcmVzc2VkU2l6ZTsNCisJCQkJCXpkcy0+ZGN0eC0+ZXhwZWN0ZWQgPSAwOw0KKwkJ CQkJemRzLT5zdGFnZSA9IHpkc3NfaW5pdDsNCisJCQkJCXNvbWVNb3JlV29yayA9IDA7DQorCQkJ CQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQkvKiBDb25zdW1lIGhlYWRlciAqLw0KKwkJ CVpTVERfcmVmRERpY3QoemRzLT5kY3R4LCB6ZHMtPmRkaWN0KTsNCisJCQl7DQorCQkJCXNpemVf dCBjb25zdCBoMVNpemUgPSBaU1REX25leHRTcmNTaXplVG9EZWNvbXByZXNzKHpkcy0+ZGN0eCk7 IC8qID09IFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeCAqLw0KKwkJCQlDSEVDS19GKFpTVERf ZGVjb21wcmVzc0NvbnRpbnVlKHpkcy0+ZGN0eCwgTlVMTCwgMCwgemRzLT5oZWFkZXJCdWZmZXIs IGgxU2l6ZSkpOw0KKwkJCQl7DQorCQkJCQlzaXplX3QgY29uc3QgaDJTaXplID0gWlNURF9uZXh0 U3JjU2l6ZVRvRGVjb21wcmVzcyh6ZHMtPmRjdHgpOw0KKwkJCQkJQ0hFQ0tfRihaU1REX2RlY29t cHJlc3NDb250aW51ZSh6ZHMtPmRjdHgsIE5VTEwsIDAsIHpkcy0+aGVhZGVyQnVmZmVyICsgaDFT aXplLCBoMlNpemUpKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQl6ZHMtPmZQYXJhbXMud2luZG93 U2l6ZSA9IE1BWCh6ZHMtPmZQYXJhbXMud2luZG93U2l6ZSwgMVUgPDwgWlNURF9XSU5ET1dMT0df QUJTT0xVVEVNSU4pOw0KKwkJCWlmICh6ZHMtPmZQYXJhbXMud2luZG93U2l6ZSA+IHpkcy0+bWF4 V2luZG93U2l6ZSkNCisJCQkJcmV0dXJuIEVSUk9SKGZyYW1lUGFyYW1ldGVyX3dpbmRvd1Rvb0xh cmdlKTsNCisNCisJCQkvKiBCdWZmZXJzIGFyZSBwcmVhbGxvY2F0ZWQsIGJ1dCBkb3VibGUgY2hl Y2sgKi8NCisJCQl7DQorCQkJCXNpemVfdCBjb25zdCBibG9ja1NpemUgPSBNSU4oemRzLT5tYXhX aW5kb3dTaXplLCBaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCk7DQorCQkJCXNpemVfdCBjb25z dCBuZWVkZWRPdXRTaXplID0gemRzLT5tYXhXaW5kb3dTaXplICsgYmxvY2tTaXplICsgV0lMRENP UFlfT1ZFUkxFTkdUSCAqIDI7DQorCQkJCWlmICh6ZHMtPmluQnVmZlNpemUgPCBibG9ja1NpemUp IHsNCisJCQkJCXJldHVybiBFUlJPUihHRU5FUklDKTsNCisJCQkJfQ0KKwkJCQlpZiAoemRzLT5v dXRCdWZmU2l6ZSA8IG5lZWRlZE91dFNpemUpIHsNCisJCQkJCXJldHVybiBFUlJPUihHRU5FUklD KTsNCisJCQkJfQ0KKwkJCQl6ZHMtPmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsNCisJCQl9DQorCQkJ emRzLT5zdGFnZSA9IHpkc3NfcmVhZDsNCisJCX0NCisJCQkvKiBmYWxsIHRocm91Z2ggKi8NCisN CisJCWNhc2UgemRzc19yZWFkOiB7DQorCQkJc2l6ZV90IGNvbnN0IG5lZWRlZEluU2l6ZSA9IFpT VERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoemRzLT5kY3R4KTsNCisJCQlpZiAobmVlZGVkSW5T aXplID09IDApIHsgLyogZW5kIG9mIGZyYW1lICovDQorCQkJCXpkcy0+c3RhZ2UgPSB6ZHNzX2lu aXQ7DQorCQkJCXNvbWVNb3JlV29yayA9IDA7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQlpZiAo KHNpemVfdCkoaWVuZCAtIGlwKSA+PSBuZWVkZWRJblNpemUpIHsgLyogZGVjb2RlIGRpcmVjdGx5 IGZyb20gc3JjICovDQorCQkJCWNvbnN0IGludCBpc1NraXBGcmFtZSA9IFpTVERfaXNTa2lwRnJh bWUoemRzLT5kY3R4KTsNCisJCQkJc2l6ZV90IGNvbnN0IGRlY29kZWRTaXplID0gWlNURF9kZWNv bXByZXNzQ29udGludWUoemRzLT5kY3R4LCB6ZHMtPm91dEJ1ZmYgKyB6ZHMtPm91dFN0YXJ0LA0K KwkJCQkJCQkJCQkgICAoaXNTa2lwRnJhbWUgPyAwIDogemRzLT5vdXRCdWZmU2l6ZSAtIHpkcy0+ b3V0U3RhcnQpLCBpcCwgbmVlZGVkSW5TaXplKTsNCisJCQkJaWYgKFpTVERfaXNFcnJvcihkZWNv ZGVkU2l6ZSkpDQorCQkJCQlyZXR1cm4gZGVjb2RlZFNpemU7DQorCQkJCWlwICs9IG5lZWRlZElu U2l6ZTsNCisJCQkJaWYgKCFkZWNvZGVkU2l6ZSAmJiAhaXNTa2lwRnJhbWUpDQorCQkJCQlicmVh azsgLyogdGhpcyB3YXMganVzdCBhIGhlYWRlciAqLw0KKwkJCQl6ZHMtPm91dEVuZCA9IHpkcy0+ b3V0U3RhcnQgKyBkZWNvZGVkU2l6ZTsNCisJCQkJemRzLT5zdGFnZSA9IHpkc3NfZmx1c2g7DQor CQkJCWJyZWFrOw0KKwkJCX0NCisJCQlpZiAoaXAgPT0gaWVuZCkgew0KKwkJCQlzb21lTW9yZVdv cmsgPSAwOw0KKwkJCQlicmVhazsNCisJCQl9IC8qIG5vIG1vcmUgaW5wdXQgKi8NCisJCQl6ZHMt PnN0YWdlID0gemRzc19sb2FkOw0KKwkJCS8qIHBhc3MtdGhyb3VnaCAqLw0KKwkJfQ0KKwkJCS8q IGZhbGwgdGhyb3VnaCAqLw0KKw0KKwkJY2FzZSB6ZHNzX2xvYWQ6IHsNCisJCQlzaXplX3QgY29u c3QgbmVlZGVkSW5TaXplID0gWlNURF9uZXh0U3JjU2l6ZVRvRGVjb21wcmVzcyh6ZHMtPmRjdHgp Ow0KKwkJCXNpemVfdCBjb25zdCB0b0xvYWQgPSBuZWVkZWRJblNpemUgLSB6ZHMtPmluUG9zOyAv KiBzaG91bGQgYWx3YXlzIGJlIDw9IHJlbWFpbmluZyBzcGFjZSB3aXRoaW4gaW5CdWZmICovDQor CQkJc2l6ZV90IGxvYWRlZFNpemU7DQorCQkJaWYgKHRvTG9hZCA+IHpkcy0+aW5CdWZmU2l6ZSAt IHpkcy0+aW5Qb3MpDQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyog c2hvdWxkIG5ldmVyIGhhcHBlbiAqLw0KKwkJCWxvYWRlZFNpemUgPSBaU1REX2xpbWl0Q29weSh6 ZHMtPmluQnVmZiArIHpkcy0+aW5Qb3MsIHRvTG9hZCwgaXAsIGllbmQgLSBpcCk7DQorCQkJaXAg Kz0gbG9hZGVkU2l6ZTsNCisJCQl6ZHMtPmluUG9zICs9IGxvYWRlZFNpemU7DQorCQkJaWYgKGxv YWRlZFNpemUgPCB0b0xvYWQpIHsNCisJCQkJc29tZU1vcmVXb3JrID0gMDsNCisJCQkJYnJlYWs7 DQorCQkJfSAvKiBub3QgZW5vdWdoIGlucHV0LCB3YWl0IGZvciBtb3JlICovDQorDQorCQkJLyog ZGVjb2RlIGxvYWRlZCBpbnB1dCAqLw0KKwkJCXsNCisJCQkJY29uc3QgaW50IGlzU2tpcEZyYW1l ID0gWlNURF9pc1NraXBGcmFtZSh6ZHMtPmRjdHgpOw0KKwkJCQlzaXplX3QgY29uc3QgZGVjb2Rl ZFNpemUgPSBaU1REX2RlY29tcHJlc3NDb250aW51ZSh6ZHMtPmRjdHgsIHpkcy0+b3V0QnVmZiAr IHpkcy0+b3V0U3RhcnQsIHpkcy0+b3V0QnVmZlNpemUgLSB6ZHMtPm91dFN0YXJ0LA0KKwkJCQkJ CQkJCQkgICB6ZHMtPmluQnVmZiwgbmVlZGVkSW5TaXplKTsNCisJCQkJaWYgKFpTVERfaXNFcnJv cihkZWNvZGVkU2l6ZSkpDQorCQkJCQlyZXR1cm4gZGVjb2RlZFNpemU7DQorCQkJCXpkcy0+aW5Q b3MgPSAwOyAvKiBpbnB1dCBpcyBjb25zdW1lZCAqLw0KKwkJCQlpZiAoIWRlY29kZWRTaXplICYm ICFpc1NraXBGcmFtZSkgew0KKwkJCQkJemRzLT5zdGFnZSA9IHpkc3NfcmVhZDsNCisJCQkJCWJy ZWFrOw0KKwkJCQl9IC8qIHRoaXMgd2FzIGp1c3QgYSBoZWFkZXIgKi8NCisJCQkJemRzLT5vdXRF bmQgPSB6ZHMtPm91dFN0YXJ0ICsgZGVjb2RlZFNpemU7DQorCQkJCXpkcy0+c3RhZ2UgPSB6ZHNz X2ZsdXNoOw0KKwkJCQkvKiBwYXNzLXRocm91Z2ggKi8NCisJCQl9DQorCQl9DQorCQkJLyogZmFs bCB0aHJvdWdoICovDQorDQorCQljYXNlIHpkc3NfZmx1c2g6IHsNCisJCQlzaXplX3QgY29uc3Qg dG9GbHVzaFNpemUgPSB6ZHMtPm91dEVuZCAtIHpkcy0+b3V0U3RhcnQ7DQorCQkJc2l6ZV90IGNv bnN0IGZsdXNoZWRTaXplID0gWlNURF9saW1pdENvcHkob3AsIG9lbmQgLSBvcCwgemRzLT5vdXRC dWZmICsgemRzLT5vdXRTdGFydCwgdG9GbHVzaFNpemUpOw0KKwkJCW9wICs9IGZsdXNoZWRTaXpl Ow0KKwkJCXpkcy0+b3V0U3RhcnQgKz0gZmx1c2hlZFNpemU7DQorCQkJaWYgKGZsdXNoZWRTaXpl ID09IHRvRmx1c2hTaXplKSB7IC8qIGZsdXNoIGNvbXBsZXRlZCAqLw0KKwkJCQl6ZHMtPnN0YWdl ID0gemRzc19yZWFkOw0KKwkJCQlpZiAoemRzLT5vdXRTdGFydCArIHpkcy0+YmxvY2tTaXplID4g emRzLT5vdXRCdWZmU2l6ZSkNCisJCQkJCXpkcy0+b3V0U3RhcnQgPSB6ZHMtPm91dEVuZCA9IDA7 DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQkvKiBjYW5ub3QgY29tcGxldGUgZmx1c2ggKi8NCisJ CQlzb21lTW9yZVdvcmsgPSAwOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJZGVmYXVsdDoNCisJCQly ZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIGltcG9zc2libGUgKi8NCisJCX0NCisJfQ0KKw0KKwkv KiByZXN1bHQgKi8NCisJaW5wdXQtPnBvcyArPSAoc2l6ZV90KShpcCAtIGlzdGFydCk7DQorCW91 dHB1dC0+cG9zICs9IChzaXplX3QpKG9wIC0gb3N0YXJ0KTsNCisJew0KKwkJc2l6ZV90IG5leHRT cmNTaXplSGludCA9IFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoemRzLT5kY3R4KTsNCisJ CWlmICghbmV4dFNyY1NpemVIaW50KSB7CQkJICAgIC8qIGZyYW1lIGZ1bGx5IGRlY29kZWQgKi8N CisJCQlpZiAoemRzLT5vdXRFbmQgPT0gemRzLT5vdXRTdGFydCkgeyAvKiBvdXRwdXQgZnVsbHkg Zmx1c2hlZCAqLw0KKwkJCQlpZiAoemRzLT5ob3N0YWdlQnl0ZSkgew0KKwkJCQkJaWYgKGlucHV0 LT5wb3MgPj0gaW5wdXQtPnNpemUpIHsNCisJCQkJCQl6ZHMtPnN0YWdlID0gemRzc19yZWFkOw0K KwkJCQkJCXJldHVybiAxOw0KKwkJCQkJfQkgICAgIC8qIGNhbid0IHJlbGVhc2UgaG9zdGFnZSAo bm90IHByZXNlbnQpICovDQorCQkJCQlpbnB1dC0+cG9zKys7IC8qIHJlbGVhc2UgaG9zdGFnZSAq Lw0KKwkJCQl9DQorCQkJCXJldHVybiAwOw0KKwkJCX0NCisJCQlpZiAoIXpkcy0+aG9zdGFnZUJ5 dGUpIHsgLyogb3V0cHV0IG5vdCBmdWxseSBmbHVzaGVkOyBrZWVwIGxhc3QgYnl0ZSBhcyBob3N0 YWdlOyB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gYWxsIG91dHB1dCBpcyBmbHVzaGVkICovDQorCQkJ CWlucHV0LT5wb3MtLTsgICAgLyogbm90ZSA6IHBvcyA+IDAsIG90aGVyd2lzZSwgaW1wb3NzaWJs ZSB0byBmaW5pc2ggcmVhZGluZyBsYXN0IGJsb2NrICovDQorCQkJCXpkcy0+aG9zdGFnZUJ5dGUg PSAxOw0KKwkJCX0NCisJCQlyZXR1cm4gMTsNCisJCX0NCisJCW5leHRTcmNTaXplSGludCArPSBa U1REX2Jsb2NrSGVhZGVyU2l6ZSAqIChaU1REX25leHRJbnB1dFR5cGUoemRzLT5kY3R4KSA9PSBa U1REbml0X2Jsb2NrKTsgLyogcHJlbG9hZCBoZWFkZXIgb2YgbmV4dCBibG9jayAqLw0KKwkJaWYg KHpkcy0+aW5Qb3MgPiBuZXh0U3JjU2l6ZUhpbnQpDQorCQkJcmV0dXJuIEVSUk9SKEdFTkVSSUMp OyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovDQorCQluZXh0U3JjU2l6ZUhpbnQgLT0gemRzLT5p blBvczsgLyogYWxyZWFkeSBsb2FkZWQqLw0KKwkJcmV0dXJuIG5leHRTcmNTaXplSGludDsNCisJ fQ0KK30NCisNCitFWFBPUlRfU1lNQk9MKFpTVERfREN0eFdvcmtzcGFjZUJvdW5kKTsNCitFWFBP UlRfU1lNQk9MKFpTVERfaW5pdERDdHgpOw0KK0VYUE9SVF9TWU1CT0woWlNURF9kZWNvbXByZXNz REN0eCk7DQorRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NfdXNpbmdEaWN0KTsNCisNCitF WFBPUlRfU1lNQk9MKFpTVERfRERpY3RXb3Jrc3BhY2VCb3VuZCk7DQorRVhQT1JUX1NZTUJPTCha U1REX2luaXRERGljdCk7DQorRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NfdXNpbmdERGlj dCk7DQorDQorRVhQT1JUX1NZTUJPTChaU1REX0RTdHJlYW1Xb3Jrc3BhY2VCb3VuZCk7DQorRVhQ T1JUX1NZTUJPTChaU1REX2luaXREU3RyZWFtKTsNCitFWFBPUlRfU1lNQk9MKFpTVERfaW5pdERT dHJlYW1fdXNpbmdERGljdCk7DQorRVhQT1JUX1NZTUJPTChaU1REX3Jlc2V0RFN0cmVhbSk7DQor RVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NTdHJlYW0pOw0KK0VYUE9SVF9TWU1CT0woWlNU RF9EU3RyZWFtSW5TaXplKTsNCitFWFBPUlRfU1lNQk9MKFpTVERfRFN0cmVhbU91dFNpemUpOw0K Kw0KK0VYUE9SVF9TWU1CT0woWlNURF9maW5kRnJhbWVDb21wcmVzc2VkU2l6ZSk7DQorRVhQT1JU X1NZTUJPTChaU1REX2dldEZyYW1lQ29udGVudFNpemUpOw0KK0VYUE9SVF9TWU1CT0woWlNURF9m aW5kRGVjb21wcmVzc2VkU2l6ZSk7DQorDQorRVhQT1JUX1NZTUJPTChaU1REX2lzRnJhbWUpOw0K K0VYUE9SVF9TWU1CT0woWlNURF9nZXREaWN0SURfZnJvbURpY3QpOw0KK0VYUE9SVF9TWU1CT0wo WlNURF9nZXREaWN0SURfZnJvbUREaWN0KTsNCitFWFBPUlRfU1lNQk9MKFpTVERfZ2V0RGljdElE X2Zyb21GcmFtZSk7DQorDQorRVhQT1JUX1NZTUJPTChaU1REX2dldEZyYW1lUGFyYW1zKTsNCitF WFBPUlRfU1lNQk9MKFpTVERfZGVjb21wcmVzc0JlZ2luKTsNCitFWFBPUlRfU1lNQk9MKFpTVERf ZGVjb21wcmVzc0JlZ2luX3VzaW5nRGljdCk7DQorRVhQT1JUX1NZTUJPTChaU1REX2NvcHlEQ3R4 KTsNCitFWFBPUlRfU1lNQk9MKFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MpOw0KK0VYUE9S VF9TWU1CT0woWlNURF9kZWNvbXByZXNzQ29udGludWUpOw0KK0VYUE9SVF9TWU1CT0woWlNURF9u ZXh0SW5wdXRUeXBlKTsNCisNCitFWFBPUlRfU1lNQk9MKFpTVERfZGVjb21wcmVzc0Jsb2NrKTsN CitFWFBPUlRfU1lNQk9MKFpTVERfaW5zZXJ0QmxvY2spOw0KKw0KK01PRFVMRV9MSUNFTlNFKCJE dWFsIEJTRC9HUEwiKTsNCitNT0RVTEVfREVTQ1JJUFRJT04oIlpzdGQgRGVjb21wcmVzc29yIik7 DQpkaWZmIC0tZ2l0IGEveGVuL2NvbW1vbi96c3RkL2VudHJvcHlfY29tbW9uLmMgYi94ZW4vY29t bW9uL3pzdGQvZW50cm9weV9jb21tb24uYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAw MDAwMDAwMDAuLjJiMGE2NDNjMzINCi0tLSAvZGV2L251bGwNCisrKyBiL3hlbi9jb21tb24venN0 ZC9lbnRyb3B5X2NvbW1vbi5jDQpAQCAtMCwwICsxLDI0MyBAQA0KKy8qDQorICogQ29tbW9uIGZ1 bmN0aW9ucyBvZiBOZXcgR2VuZXJhdGlvbiBFbnRyb3B5IGxpYnJhcnkNCisgKiBDb3B5cmlnaHQg KEMpIDIwMTYsIFlhbm4gQ29sbGV0Lg0KKyAqDQorICogQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0 dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQ0KKyAqDQor ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0 aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisgKg0KKyAqICAgKiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly aWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp bmcgZGlzY2xhaW1lci4NCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11 c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisgKiBpbiB0aGUgZG9j dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorICog ZGlzdHJpYnV0aW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIgQU5EIEFOWSBF WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElN SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ VE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisgKiBTUEVDSUFM LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U DQorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW SUNFUzsgTE9TUyBPRiBVU0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhFT1JZIE9GIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyAq IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP VVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICoNCisgKiBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1 bmRlcg0KKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVy c2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24u IFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdA0KKyAqIGVpdGhl ciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3Ig QlNEIGxpY2Vuc2UNCisgKiAoIkJTRCIpLg0KKyAqDQorICogWW91IGNhbiBjb250YWN0IHRoZSBh dXRob3IgYXQgOg0KKyAqIC0gU291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dpdGh1Yi5jb20v Q3lhbjQ5NzMvRmluaXRlU3RhdGVFbnRyb3B5DQorICovDQorDQorLyogKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKg0KKyogIERlcGVuZGVuY2llcw0KKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAiZXJyb3JfcHJpdmF0ZS5oIiAv KiBFUlJfKiwgRVJST1IgKi8NCisjaW5jbHVkZSAiZnNlLmgiDQorI2luY2x1ZGUgImh1Zi5oIg0K KyNpbmNsdWRlICJtZW0uaCINCisNCisvKj09PSAgIFZlcnNpb24gICA9PT0qLw0KK3Vuc2lnbmVk IEZTRV92ZXJzaW9uTnVtYmVyKHZvaWQpIHsgcmV0dXJuIEZTRV9WRVJTSU9OX05VTUJFUjsgfQ0K Kw0KKy8qPT09ICAgRXJyb3IgTWFuYWdlbWVudCAgID09PSovDQordW5zaWduZWQgRlNFX2lzRXJy b3Ioc2l6ZV90IGNvZGUpIHsgcmV0dXJuIEVSUl9pc0Vycm9yKGNvZGUpOyB9DQorDQordW5zaWdu ZWQgSFVGX2lzRXJyb3Ioc2l6ZV90IGNvZGUpIHsgcmV0dXJuIEVSUl9pc0Vycm9yKGNvZGUpOyB9 DQorDQorLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioNCisqICBGU0UgTkNvdW50IGVuY29kaW5nLWRlY29kaW5nDQorKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCitzaXplX3QgRlNFX3JlYWROQ291bnQoc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNp Z25lZCAqbWF4U1ZQdHIsIHVuc2lnbmVkICp0YWJsZUxvZ1B0ciwgY29uc3Qgdm9pZCAqaGVhZGVy QnVmZmVyLCBzaXplX3QgaGJTaXplKQ0KK3sNCisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0g KGNvbnN0IEJZVEUgKiloZWFkZXJCdWZmZXI7DQorCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBp c3RhcnQgKyBoYlNpemU7DQorCWNvbnN0IEJZVEUgKmlwID0gaXN0YXJ0Ow0KKwlpbnQgbmJCaXRz Ow0KKwlpbnQgcmVtYWluaW5nOw0KKwlpbnQgdGhyZXNob2xkOw0KKwlVMzIgYml0U3RyZWFtOw0K KwlpbnQgYml0Q291bnQ7DQorCXVuc2lnbmVkIGNoYXJudW0gPSAwOw0KKwlpbnQgcHJldmlvdXMw ID0gMDsNCisNCisJaWYgKGhiU2l6ZSA8IDQpDQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9u Zyk7DQorCWJpdFN0cmVhbSA9IFpTVERfcmVhZExFMzIoaXApOw0KKwluYkJpdHMgPSAoYml0U3Ry ZWFtICYgMHhGKSArIEZTRV9NSU5fVEFCTEVMT0c7IC8qIGV4dHJhY3QgdGFibGVMb2cgKi8NCisJ aWYgKG5iQml0cyA+IEZTRV9UQUJMRUxPR19BQlNPTFVURV9NQVgpDQorCQlyZXR1cm4gRVJST1Io dGFibGVMb2dfdG9vTGFyZ2UpOw0KKwliaXRTdHJlYW0gPj49IDQ7DQorCWJpdENvdW50ID0gNDsN CisJKnRhYmxlTG9nUHRyID0gbmJCaXRzOw0KKwlyZW1haW5pbmcgPSAoMSA8PCBuYkJpdHMpICsg MTsNCisJdGhyZXNob2xkID0gMSA8PCBuYkJpdHM7DQorCW5iQml0cysrOw0KKw0KKwl3aGlsZSAo KHJlbWFpbmluZyA+IDEpICYgKGNoYXJudW0gPD0gKm1heFNWUHRyKSkgew0KKwkJaWYgKHByZXZp b3VzMCkgew0KKwkJCXVuc2lnbmVkIG4wID0gY2hhcm51bTsNCisJCQl3aGlsZSAoKGJpdFN0cmVh bSAmIDB4RkZGRikgPT0gMHhGRkZGKSB7DQorCQkJCW4wICs9IDI0Ow0KKwkJCQlpZiAoaXAgPCBp ZW5kIC0gNSkgew0KKwkJCQkJaXAgKz0gMjsNCisJCQkJCWJpdFN0cmVhbSA9IFpTVERfcmVhZExF MzIoaXApID4+IGJpdENvdW50Ow0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJYml0U3RyZWFtID4+PSAx NjsNCisJCQkJCWJpdENvdW50ICs9IDE2Ow0KKwkJCQl9DQorCQkJfQ0KKwkJCXdoaWxlICgoYml0 U3RyZWFtICYgMykgPT0gMykgew0KKwkJCQluMCArPSAzOw0KKwkJCQliaXRTdHJlYW0gPj49IDI7 DQorCQkJCWJpdENvdW50ICs9IDI7DQorCQkJfQ0KKwkJCW4wICs9IGJpdFN0cmVhbSAmIDM7DQor CQkJYml0Q291bnQgKz0gMjsNCisJCQlpZiAobjAgPiAqbWF4U1ZQdHIpDQorCQkJCXJldHVybiBF UlJPUihtYXhTeW1ib2xWYWx1ZV90b29TbWFsbCk7DQorCQkJd2hpbGUgKGNoYXJudW0gPCBuMCkN CisJCQkJbm9ybWFsaXplZENvdW50ZXJbY2hhcm51bSsrXSA9IDA7DQorCQkJaWYgKChpcCA8PSBp ZW5kIC0gNykgfHwgKGlwICsgKGJpdENvdW50ID4+IDMpIDw9IGllbmQgLSA0KSkgew0KKwkJCQlp cCArPSBiaXRDb3VudCA+PiAzOw0KKwkJCQliaXRDb3VudCAmPSA3Ow0KKwkJCQliaXRTdHJlYW0g PSBaU1REX3JlYWRMRTMyKGlwKSA+PiBiaXRDb3VudDsNCisJCQl9IGVsc2Ugew0KKwkJCQliaXRT dHJlYW0gPj49IDI7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCWludCBjb25zdCBtYXggPSAoMiAq IHRocmVzaG9sZCAtIDEpIC0gcmVtYWluaW5nOw0KKwkJCWludCBjb3VudDsNCisNCisJCQlpZiAo KGJpdFN0cmVhbSAmICh0aHJlc2hvbGQgLSAxKSkgPCAoVTMyKW1heCkgew0KKwkJCQljb3VudCA9 IGJpdFN0cmVhbSAmICh0aHJlc2hvbGQgLSAxKTsNCisJCQkJYml0Q291bnQgKz0gbmJCaXRzIC0g MTsNCisJCQl9IGVsc2Ugew0KKwkJCQljb3VudCA9IGJpdFN0cmVhbSAmICgyICogdGhyZXNob2xk IC0gMSk7DQorCQkJCWlmIChjb3VudCA+PSB0aHJlc2hvbGQpDQorCQkJCQljb3VudCAtPSBtYXg7 DQorCQkJCWJpdENvdW50ICs9IG5iQml0czsNCisJCQl9DQorDQorCQkJY291bnQtLTsJCQkJIC8q IGV4dHJhIGFjY3VyYWN5ICovDQorCQkJcmVtYWluaW5nIC09IGNvdW50IDwgMCA/IC1jb3VudCA6 IGNvdW50OyAvKiAtMSBtZWFucyArMSAqLw0KKwkJCW5vcm1hbGl6ZWRDb3VudGVyW2NoYXJudW0r K10gPSAoc2hvcnQpY291bnQ7DQorCQkJcHJldmlvdXMwID0gIWNvdW50Ow0KKwkJCXdoaWxlIChy ZW1haW5pbmcgPCB0aHJlc2hvbGQpIHsNCisJCQkJbmJCaXRzLS07DQorCQkJCXRocmVzaG9sZCA+ Pj0gMTsNCisJCQl9DQorDQorCQkJaWYgKChpcCA8PSBpZW5kIC0gNykgfHwgKGlwICsgKGJpdENv dW50ID4+IDMpIDw9IGllbmQgLSA0KSkgew0KKwkJCQlpcCArPSBiaXRDb3VudCA+PiAzOw0KKwkJ CQliaXRDb3VudCAmPSA3Ow0KKwkJCX0gZWxzZSB7DQorCQkJCWJpdENvdW50IC09IChpbnQpKDgg KiAoaWVuZCAtIDQgLSBpcCkpOw0KKwkJCQlpcCA9IGllbmQgLSA0Ow0KKwkJCX0NCisJCQliaXRT dHJlYW0gPSBaU1REX3JlYWRMRTMyKGlwKSA+PiAoYml0Q291bnQgJiAzMSk7DQorCQl9DQorCX0g Lyogd2hpbGUgKChyZW1haW5pbmc+MSkgJiAoY2hhcm51bTw9Km1heFNWUHRyKSkgKi8NCisJaWYg KHJlbWFpbmluZyAhPSAxKQ0KKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0K KwlpZiAoYml0Q291bnQgPiAzMikNCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVk KTsNCisJKm1heFNWUHRyID0gY2hhcm51bSAtIDE7DQorDQorCWlwICs9IChiaXRDb3VudCArIDcp ID4+IDM7DQorCXJldHVybiBpcCAtIGlzdGFydDsNCit9DQorDQorLyohIEhVRl9yZWFkU3RhdHMo KSA6DQorCVJlYWQgY29tcGFjdCBIdWZmbWFuIHRyZWUsIHNhdmVkIGJ5IEhVRl93cml0ZUNUYWJs ZSgpLg0KKwlgaHVmZldlaWdodGAgaXMgZGVzdGluYXRpb24gYnVmZmVyLg0KKwlgcmFua1N0YXRz YCBpcyBhc3N1bWVkIHRvIGJlIGEgdGFibGUgb2YgYXQgbGVhc3QgSFVGX1RBQkxFTE9HX01BWCBV MzIuDQorCUByZXR1cm4gOiBzaXplIHJlYWQgZnJvbSBgc3JjYCAsIG9yIGFuIGVycm9yIENvZGUg Lg0KKwlOb3RlIDogTmVlZGVkIGJ5IEhVRl9yZWFkQ1RhYmxlKCkgYW5kIEhVRl9yZWFkRFRhYmxl WD8oKSAuDQorKi8NCitzaXplX3QgSFVGX3JlYWRTdGF0c193a3NwKEJZVEUgKmh1ZmZXZWlnaHQs IHNpemVfdCBod1NpemUsIFUzMiAqcmFua1N0YXRzLCBVMzIgKm5iU3ltYm9sc1B0ciwgVTMyICp0 YWJsZUxvZ1B0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3Nw YWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCit7DQorCVUzMiB3ZWlnaHRUb3RhbDsNCisJY29u c3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKXNyYzsNCisJc2l6ZV90IGlTaXplOw0KKwlzaXpl X3Qgb1NpemU7DQorDQorCWlmICghc3JjU2l6ZSkNCisJCXJldHVybiBFUlJPUihzcmNTaXplX3dy b25nKTsNCisJaVNpemUgPSBpcFswXTsNCisJLyogbWVtc2V0KGh1ZmZXZWlnaHQsIDAsIGh3U2l6 ZSk7ICAgKi8gLyogaXMgbm90IG5lY2Vzc2FyeSwgZXZlbiB0aG91Z2ggc29tZSBhbmFseXplciBj b21wbGFpbiAuLi4gKi8NCisNCisJaWYgKGlTaXplID49IDEyOCkgeyAvKiBzcGVjaWFsIGhlYWRl ciAqLw0KKwkJb1NpemUgPSBpU2l6ZSAtIDEyNzsNCisJCWlTaXplID0gKChvU2l6ZSArIDEpIC8g Mik7DQorCQlpZiAoaVNpemUgKyAxID4gc3JjU2l6ZSkNCisJCQlyZXR1cm4gRVJST1Ioc3JjU2l6 ZV93cm9uZyk7DQorCQlpZiAob1NpemUgPj0gaHdTaXplKQ0KKwkJCXJldHVybiBFUlJPUihjb3Jy dXB0aW9uX2RldGVjdGVkKTsNCisJCWlwICs9IDE7DQorCQl7DQorCQkJVTMyIG47DQorCQkJZm9y IChuID0gMDsgbiA8IG9TaXplOyBuICs9IDIpIHsNCisJCQkJaHVmZldlaWdodFtuXSA9IGlwW24g LyAyXSA+PiA0Ow0KKwkJCQlodWZmV2VpZ2h0W24gKyAxXSA9IGlwW24gLyAyXSAmIDE1Ow0KKwkJ CX0NCisJCX0NCisJfSBlbHNlIHsJCQkJCQkgLyogaGVhZGVyIGNvbXByZXNzZWQgd2l0aCBGU0Ug KG5vcm1hbCBjYXNlKSAqLw0KKwkJaWYgKGlTaXplICsgMSA+IHNyY1NpemUpDQorCQkJcmV0dXJu IEVSUk9SKHNyY1NpemVfd3JvbmcpOw0KKwkJb1NpemUgPSBGU0VfZGVjb21wcmVzc193a3NwKGh1 ZmZXZWlnaHQsIGh3U2l6ZSAtIDEsIGlwICsgMSwgaVNpemUsIDYsIHdvcmtzcGFjZSwgd29ya3Nw YWNlU2l6ZSk7IC8qIG1heCAoaHdTaXplLTEpIHZhbHVlcyBkZWNvZGVkLCBhcyBsYXN0IG9uZSBp cyBpbXBsaWVkICovDQorCQlpZiAoRlNFX2lzRXJyb3Iob1NpemUpKQ0KKwkJCXJldHVybiBvU2l6 ZTsNCisJfQ0KKw0KKwkvKiBjb2xsZWN0IHdlaWdodCBzdGF0cyAqLw0KKwltZW1zZXQocmFua1N0 YXRzLCAwLCAoSFVGX1RBQkxFTE9HX01BWCArIDEpICogc2l6ZW9mKFUzMikpOw0KKwl3ZWlnaHRU b3RhbCA9IDA7DQorCXsNCisJCVUzMiBuOw0KKwkJZm9yIChuID0gMDsgbiA8IG9TaXplOyBuKysp IHsNCisJCQlpZiAoaHVmZldlaWdodFtuXSA+PSBIVUZfVEFCTEVMT0dfTUFYKQ0KKwkJCQlyZXR1 cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQorCQkJcmFua1N0YXRzW2h1ZmZXZWlnaHRb bl1dKys7DQorCQkJd2VpZ2h0VG90YWwgKz0gKDEgPDwgaHVmZldlaWdodFtuXSkgPj4gMTsNCisJ CX0NCisJfQ0KKwlpZiAod2VpZ2h0VG90YWwgPT0gMCkNCisJCXJldHVybiBFUlJPUihjb3JydXB0 aW9uX2RldGVjdGVkKTsNCisNCisJLyogZ2V0IGxhc3Qgbm9uLW51bGwgc3ltYm9sIHdlaWdodCAo aW1wbGllZCwgdG90YWwgbXVzdCBiZSAyXm4pICovDQorCXsNCisJCVUzMiBjb25zdCB0YWJsZUxv ZyA9IEJJVF9oaWdoYml0MzIod2VpZ2h0VG90YWwpICsgMTsNCisJCWlmICh0YWJsZUxvZyA+IEhV Rl9UQUJMRUxPR19NQVgpDQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0K KwkJKnRhYmxlTG9nUHRyID0gdGFibGVMb2c7DQorCQkvKiBkZXRlcm1pbmUgbGFzdCB3ZWlnaHQg Ki8NCisJCXsNCisJCQlVMzIgY29uc3QgdG90YWwgPSAxIDw8IHRhYmxlTG9nOw0KKwkJCVUzMiBj b25zdCByZXN0ID0gdG90YWwgLSB3ZWlnaHRUb3RhbDsNCisJCQlVMzIgY29uc3QgdmVyaWYgPSAx IDw8IEJJVF9oaWdoYml0MzIocmVzdCk7DQorCQkJVTMyIGNvbnN0IGxhc3RXZWlnaHQgPSBCSVRf aGlnaGJpdDMyKHJlc3QpICsgMTsNCisJCQlpZiAodmVyaWYgIT0gcmVzdCkNCisJCQkJcmV0dXJu IEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBsYXN0IHZhbHVlIG11c3QgYmUgYSBjbGVh biBwb3dlciBvZiAyICovDQorCQkJaHVmZldlaWdodFtvU2l6ZV0gPSAoQllURSlsYXN0V2VpZ2h0 Ow0KKwkJCXJhbmtTdGF0c1tsYXN0V2VpZ2h0XSsrOw0KKwkJfQ0KKwl9DQorDQorCS8qIGNoZWNr IHRyZWUgY29uc3RydWN0aW9uIHZhbGlkaXR5ICovDQorCWlmICgocmFua1N0YXRzWzFdIDwgMikg fHwgKHJhbmtTdGF0c1sxXSAmIDEpKQ0KKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0 ZWQpOyAvKiBieSBjb25zdHJ1Y3Rpb24gOiBhdCBsZWFzdCAyIGVsdHMgb2YgcmFuayAxLCBtdXN0 IGJlIGV2ZW4gKi8NCisNCisJLyogcmVzdWx0cyAqLw0KKwkqbmJTeW1ib2xzUHRyID0gKFUzMiko b1NpemUgKyAxKTsNCisJcmV0dXJuIGlTaXplICsgMTsNCit9DQpkaWZmIC0tZ2l0IGEveGVuL2Nv bW1vbi96c3RkL2Vycm9yX3ByaXZhdGUuaCBiL3hlbi9jb21tb24venN0ZC9lcnJvcl9wcml2YXRl LmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi4xYTYwYjMxZjcwDQot LS0gL2Rldi9udWxsDQorKysgYi94ZW4vY29tbW9uL3pzdGQvZXJyb3JfcHJpdmF0ZS5oDQpAQCAt MCwwICsxLDUzIEBADQorLyoqDQorICogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIFlhbm4g Q29sbGV0LCBGYWNlYm9vaywgSW5jLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisg KiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5z ZSBmb3VuZCBpbiB0aGUNCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9m IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay96c3RkLg0KKyAqIEFuIGFkZGl0aW9uYWwgZ3Jh bnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0 aGUNCisgKiBzYW1lIGRpcmVjdG9yeS4NCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQor ICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIg YXMgcHVibGlzaGVkIGJ5IHRoZQ0KKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBw cm9ncmFtIGlzIGR1YWwtbGljZW5zZWQ7IHlvdSBtYXkgc2VsZWN0DQorICogZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGlj ZW5zZQ0KKyAqICgiQlNEIikuDQorICovDQorDQorLyogTm90ZSA6IHRoaXMgbW9kdWxlIGlzIGV4 cGVjdGVkIHRvIHJlbWFpbiBwcml2YXRlLCBkbyBub3QgZXhwb3NlIGl0ICovDQorDQorI2lmbmRl ZiBFUlJPUl9IX01PRFVMRQ0KKyNkZWZpbmUgRVJST1JfSF9NT0RVTEUNCisNCisvKiAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRGVwZW5kZW5jaWVzDQorKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlIDxsaW51 eC90eXBlcy5oPiAvKiBzaXplX3QgKi8NCisjaW5jbHVkZSA8bGludXgvenN0ZC5oPiAgLyogZW51 bSBsaXN0ICovDQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kg0KKyogIENvbXBpbGVyLXNwZWNpZmljDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqLw0KKyNkZWZpbmUgRVJSX1NUQVRJQyBzdGF0aWMgX19hdHRyaWJ1dGVfXygo dW51c2VkKSkNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq DQorKiAgQ3VzdG9taXphdGlvbiAoZXJyb3JfcHVibGljLmgpDQorKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLw0KK3R5cGVkZWYgWlNURF9FcnJvckNvZGUgRVJSX2Vu dW07DQorI2RlZmluZSBQUkVGSVgobmFtZSkgWlNURF9lcnJvcl8jI25hbWUNCisNCisvKi0qKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRXJyb3IgY29kZXMgaGFu ZGxpbmcNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2Rl ZmluZSBFUlJPUihuYW1lKSAoKHNpemVfdCktUFJFRklYKG5hbWUpKQ0KKw0KK0VSUl9TVEFUSUMg dW5zaWduZWQgRVJSX2lzRXJyb3Ioc2l6ZV90IGNvZGUpIHsgcmV0dXJuIChjb2RlID4gRVJST1Io bWF4Q29kZSkpOyB9DQorDQorRVJSX1NUQVRJQyBFUlJfZW51bSBFUlJfZ2V0RXJyb3JDb2RlKHNp emVfdCBjb2RlKQ0KK3sNCisJaWYgKCFFUlJfaXNFcnJvcihjb2RlKSkNCisJCXJldHVybiAoRVJS X2VudW0pMDsNCisJcmV0dXJuIChFUlJfZW51bSkoMCAtIGNvZGUpOw0KK30NCisNCisjZW5kaWYg LyogRVJST1JfSF9NT0RVTEUgKi8NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvZnNlLmgg Yi94ZW4vY29tbW9uL3pzdGQvZnNlLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAw MDAwMDAwLi43NDYwYWIwNGIxDQotLS0gL2Rldi9udWxsDQorKysgYi94ZW4vY29tbW9uL3pzdGQv ZnNlLmgNCkBAIC0wLDAgKzEsNTc1IEBADQorLyoNCisgKiBGU0UgOiBGaW5pdGUgU3RhdGUgRW50 cm9weSBjb2RlYw0KKyAqIFB1YmxpYyBQcm90b3R5cGVzIGRlY2xhcmF0aW9uDQorICogQ29weXJp Z2h0IChDKSAyMDEzLTIwMTYsIFlhbm4gQ29sbGV0Lg0KKyAqDQorICogQlNEIDItQ2xhdXNlIExp Y2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhw KQ0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm b3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisgKg0K KyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi b3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisgKiBp biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg dGhlDQorICogZGlzdHJpYnV0aW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIg QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U DQorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ VFkgQU5EIEZJVE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05UUklC VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisg KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H LCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhFT1JZ IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig VE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICoNCisgKiBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeSBpdCB1bmRlcg0KKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdA0K KyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgi R1BMIikgb3IgQlNEIGxpY2Vuc2UNCisgKiAoIkJTRCIpLg0KKyAqDQorICogWW91IGNhbiBjb250 YWN0IHRoZSBhdXRob3IgYXQgOg0KKyAqIC0gU291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dp dGh1Yi5jb20vQ3lhbjQ5NzMvRmluaXRlU3RhdGVFbnRyb3B5DQorICovDQorI2lmbmRlZiBGU0Vf SA0KKyNkZWZpbmUgRlNFX0gNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKg0KKyogIERlcGVuZGVuY2llcw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gLyogc2l6ZV90LCBw dHJkaWZmX3QgKi8NCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKg0KKyogIEZTRV9QVUJMSUNfQVBJIDogY29udHJvbCBsaWJyYXJ5IHN5bWJvbHMgdmlzaWJp bGl0eQ0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVm aW5lIEZTRV9QVUJMSUNfQVBJDQorDQorLyotLS0tLS0gICBWZXJzaW9uICAgLS0tLS0tKi8NCisj ZGVmaW5lIEZTRV9WRVJTSU9OX01BSk9SIDANCisjZGVmaW5lIEZTRV9WRVJTSU9OX01JTk9SIDkN CisjZGVmaW5lIEZTRV9WRVJTSU9OX1JFTEVBU0UgMA0KKw0KKyNkZWZpbmUgRlNFX0xJQl9WRVJT SU9OIEZTRV9WRVJTSU9OX01BSk9SLkZTRV9WRVJTSU9OX01JTk9SLkZTRV9WRVJTSU9OX1JFTEVB U0UNCisjZGVmaW5lIEZTRV9RVU9URShzdHIpICNzdHINCisjZGVmaW5lIEZTRV9FWFBBTkRfQU5E X1FVT1RFKHN0cikgRlNFX1FVT1RFKHN0cikNCisjZGVmaW5lIEZTRV9WRVJTSU9OX1NUUklORyBG U0VfRVhQQU5EX0FORF9RVU9URShGU0VfTElCX1ZFUlNJT04pDQorDQorI2RlZmluZSBGU0VfVkVS U0lPTl9OVU1CRVIgKEZTRV9WRVJTSU9OX01BSk9SICogMTAwICogMTAwICsgRlNFX1ZFUlNJT05f TUlOT1IgKiAxMDAgKyBGU0VfVkVSU0lPTl9SRUxFQVNFKQ0KK0ZTRV9QVUJMSUNfQVBJIHVuc2ln bmVkIEZTRV92ZXJzaW9uTnVtYmVyKHZvaWQpOyAvKio8IGxpYnJhcnkgdmVyc2lvbiBudW1iZXI7 IHRvIGJlIHVzZWQgd2hlbiBjaGVja2luZyBkbGwgdmVyc2lvbiAqLw0KKw0KKy8qLSoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgVG9vbCBmdW5jdGlvbnMNCisq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorRlNFX1BVQkxJQ19B UEkgc2l6ZV90IEZTRV9jb21wcmVzc0JvdW5kKHNpemVfdCBzaXplKTsgLyogbWF4aW11bSBjb21w cmVzc2VkIHNpemUgKi8NCisNCisvKiBFcnJvciBNYW5hZ2VtZW50ICovDQorRlNFX1BVQkxJQ19B UEkgdW5zaWduZWQgRlNFX2lzRXJyb3Ioc2l6ZV90IGNvZGUpOyAvKiB0ZWxscyBpZiBhIHJldHVy biB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlICovDQorDQorLyotKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioNCisqICBGU0UgZGV0YWlsZWQgQVBJDQorKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIQ0KK0ZTRV9jb21wcmVzcygpIGRv ZXMgdGhlIGZvbGxvd2luZzoNCisxLiBjb3VudCBzeW1ib2wgb2NjdXJyZW5jZSBmcm9tIHNvdXJj ZVtdIGludG8gdGFibGUgY291bnRbXQ0KKzIuIG5vcm1hbGl6ZSBjb3VudGVycyBzbyB0aGF0IHN1 bShjb3VudFtdKSA9PSBQb3dlcl9vZl8yICgyXnRhYmxlTG9nKQ0KKzMuIHNhdmUgbm9ybWFsaXpl ZCBjb3VudGVycyB0byBtZW1vcnkgYnVmZmVyIHVzaW5nIHdyaXRlTkNvdW50KCkNCis0LiBidWls ZCBlbmNvZGluZyB0YWJsZSAnQ1RhYmxlJyBmcm9tIG5vcm1hbGl6ZWQgY291bnRlcnMNCis1LiBl bmNvZGUgdGhlIGRhdGEgc3RyZWFtIHVzaW5nIGVuY29kaW5nIHRhYmxlICdDVGFibGUnDQorDQor RlNFX2RlY29tcHJlc3MoKSBkb2VzIHRoZSBmb2xsb3dpbmc6DQorMS4gcmVhZCBub3JtYWxpemVk IGNvdW50ZXJzIHdpdGggcmVhZE5Db3VudCgpDQorMi4gYnVpbGQgZGVjb2RpbmcgdGFibGUgJ0RU YWJsZScgZnJvbSBub3JtYWxpemVkIGNvdW50ZXJzDQorMy4gZGVjb2RlIHRoZSBkYXRhIHN0cmVh bSB1c2luZyBkZWNvZGluZyB0YWJsZSAnRFRhYmxlJw0KKw0KK1RoZSBmb2xsb3dpbmcgQVBJIGFs bG93cyB0YXJnZXRpbmcgc3BlY2lmaWMgc3ViLWZ1bmN0aW9ucyBmb3IgYWR2YW5jZWQgdGFza3Mu DQorRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdG8gY29tcHJlc3Mgc2V2ZXJhbCBibG9ja3Mg dXNpbmcgdGhlIHNhbWUgJ0NUYWJsZScsDQorb3IgdG8gc2F2ZSBhbmQgcHJvdmlkZSBub3JtYWxp emVkIGRpc3RyaWJ1dGlvbiB1c2luZyBleHRlcm5hbCBtZXRob2QuDQorKi8NCisNCisvKiAqKiog Q09NUFJFU1NJT04gKioqICovDQorLyohIEZTRV9vcHRpbWFsVGFibGVMb2coKToNCisJZHluYW1p Y2FsbHkgZG93bnNpemUgJ3RhYmxlTG9nJyB3aGVuIGNvbmRpdGlvbnMgYXJlIG1ldC4NCisJSXQg c2F2ZXMgQ1BVIHRpbWUsIGJ5IHVzaW5nIHNtYWxsZXIgdGFibGVzLCB3aGlsZSBwcmVzZXJ2aW5n IG9yIGV2ZW4gaW1wcm92aW5nIGNvbXByZXNzaW9uIHJhdGlvLg0KKwlAcmV0dXJuIDogcmVjb21t ZW5kZWQgdGFibGVMb2cgKG5lY2Vzc2FyaWx5IDw9ICdtYXhUYWJsZUxvZycpICovDQorRlNFX1BV QkxJQ19BUEkgdW5zaWduZWQgRlNFX29wdGltYWxUYWJsZUxvZyh1bnNpZ25lZCBtYXhUYWJsZUxv Zywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlKTsNCisNCisvKiEgRlNF X25vcm1hbGl6ZUNvdW50KCk6DQorCW5vcm1hbGl6ZSBjb3VudHMgc28gdGhhdCBzdW0oY291bnRb XSkgPT0gUG93ZXJfb2ZfMiAoMl50YWJsZUxvZykNCisJJ25vcm1hbGl6ZWRDb3VudGVyJyBpcyBh IHRhYmxlIG9mIHNob3J0LCBvZiBtaW5pbXVtIHNpemUgKG1heFN5bWJvbFZhbHVlKzEpLg0KKwlA cmV0dXJuIDogdGFibGVMb2csDQorCQkJICBvciBhbiBlcnJvckNvZGUsIHdoaWNoIGNhbiBiZSB0 ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSAqLw0KK0ZTRV9QVUJMSUNfQVBJIHNpemVfdCBGU0Vf bm9ybWFsaXplQ291bnQoc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCB0YWJsZUxv ZywgY29uc3QgdW5zaWduZWQgKmNvdW50LCBzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4U3lt Ym9sVmFsdWUpOw0KKw0KKy8qISBGU0VfTkNvdW50V3JpdGVCb3VuZCgpOg0KKwlQcm92aWRlcyB0 aGUgbWF4aW11bSBwb3NzaWJsZSBzaXplIG9mIGFuIEZTRSBub3JtYWxpemVkIHRhYmxlLCBnaXZl biAnbWF4U3ltYm9sVmFsdWUnIGFuZCAndGFibGVMb2cnLg0KKwlUeXBpY2FsbHkgdXNlZnVsIGZv ciBhbGxvY2F0aW9uIHB1cnBvc2UuICovDQorRlNFX1BVQkxJQ19BUEkgc2l6ZV90IEZTRV9OQ291 bnRXcml0ZUJvdW5kKHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZyk7 DQorDQorLyohIEZTRV93cml0ZU5Db3VudCgpOg0KKwlDb21wYWN0bHkgc2F2ZSAnbm9ybWFsaXpl ZENvdW50ZXInIGludG8gJ2J1ZmZlcicuDQorCUByZXR1cm4gOiBzaXplIG9mIHRoZSBjb21wcmVz c2VkIHRhYmxlLA0KKwkJCSAgb3IgYW4gZXJyb3JDb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVz aW5nIEZTRV9pc0Vycm9yKCkuICovDQorRlNFX1BVQkxJQ19BUEkgc2l6ZV90IEZTRV93cml0ZU5D b3VudCh2b2lkICpidWZmZXIsIHNpemVfdCBidWZmZXJTaXplLCBjb25zdCBzaG9ydCAqbm9ybWFs aXplZENvdW50ZXIsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZyk7 DQorDQorLyohIENvbnN0cnVjdG9yIGFuZCBEZXN0cnVjdG9yIG9mIEZTRV9DVGFibGUuDQorCU5v dGUgdGhhdCBGU0VfQ1RhYmxlIHNpemUgZGVwZW5kcyBvbiAndGFibGVMb2cnIGFuZCAnbWF4U3lt Ym9sVmFsdWUnICovDQordHlwZWRlZiB1bnNpZ25lZCBGU0VfQ1RhYmxlOyAvKiBkb24ndCBhbGxv Y2F0ZSB0aGF0LiBJdCdzIG9ubHkgbWVhbnQgdG8gYmUgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHZv aWQqICovDQorDQorLyohIEZTRV9jb21wcmVzc191c2luZ0NUYWJsZSgpOg0KKwlDb21wcmVzcyBg c3JjYCB1c2luZyBgY3RgIGludG8gYGRzdGAgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRl ZC4NCisJQHJldHVybiA6IHNpemUgb2YgY29tcHJlc3NlZCBkYXRhICg8PSBgZHN0Q2FwYWNpdHlg KSwNCisJCQkgIG9yIDAgaWYgY29tcHJlc3NlZCBkYXRhIGNvdWxkIG5vdCBmaXQgaW50byBgZHN0 YCwNCisJCQkgIG9yIGFuIGVycm9yQ29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0Vf aXNFcnJvcigpICovDQorRlNFX1BVQkxJQ19BUEkgc2l6ZV90IEZTRV9jb21wcmVzc191c2luZ0NU YWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXpl X3Qgc3JjU2l6ZSwgY29uc3QgRlNFX0NUYWJsZSAqY3QpOw0KKw0KKy8qIQ0KK1R1dG9yaWFsIDoN CistLS0tLS0tLS0tDQorVGhlIGZpcnN0IHN0ZXAgaXMgdG8gY291bnQgYWxsIHN5bWJvbHMuIEZT RV9jb3VudCgpIGRvZXMgdGhpcyBqb2IgdmVyeSBmYXN0Lg0KK1Jlc3VsdCB3aWxsIGJlIHNhdmVk IGludG8gJ2NvdW50JywgYSB0YWJsZSBvZiB1bnNpZ25lZCBpbnQsIHdoaWNoIG11c3QgYmUgYWxy ZWFkeSBhbGxvY2F0ZWQsIGFuZCBoYXZlICdtYXhTeW1ib2xWYWx1ZVB0clswXSsxJyBjZWxscy4N Cisnc3JjJyBpcyBhIHRhYmxlIG9mIGJ5dGVzIG9mIHNpemUgJ3NyY1NpemUnLiBBbGwgdmFsdWVz IHdpdGhpbiAnc3JjJyBNVVNUIGJlIDw9IG1heFN5bWJvbFZhbHVlUHRyWzBdDQorbWF4U3ltYm9s VmFsdWVQdHJbMF0gd2lsbCBiZSB1cGRhdGVkLCB3aXRoIGl0cyByZWFsIHZhbHVlIChuZWNlc3Nh cmlseSA8PSBvcmlnaW5hbCB2YWx1ZSkNCitGU0VfY291bnQoKSB3aWxsIHJldHVybiB0aGUgbnVt YmVyIG9mIG9jY3VycmVuY2Ugb2YgdGhlIG1vc3QgZnJlcXVlbnQgc3ltYm9sLg0KK1RoaXMgY2Fu IGJlIHVzZWQgdG8ga25vdyBpZiB0aGVyZSBpcyBhIHNpbmdsZSBzeW1ib2wgd2l0aGluICdzcmMn LCBhbmQgdG8gcXVpY2tseSBldmFsdWF0ZSBpdHMgY29tcHJlc3NpYmlsaXR5Lg0KK0lmIHRoZXJl IGlzIGFuIGVycm9yLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gRXJyb3JDb2RlICh3aGlj aCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCkpLg0KKw0KK1RoZSBuZXh0IHN0ZXAg aXMgdG8gbm9ybWFsaXplIHRoZSBmcmVxdWVuY2llcy4NCitGU0Vfbm9ybWFsaXplQ291bnQoKSB3 aWxsIGVuc3VyZSB0aGF0IHN1bSBvZiBmcmVxdWVuY2llcyBpcyA9PSAyIF4ndGFibGVMb2cnLg0K K0l0IGFsc28gZ3VhcmFudGVlcyBhIG1pbmltdW0gb2YgMSB0byBhbnkgU3ltYm9sIHdpdGggZnJl cXVlbmN5ID49IDEuDQorWW91IGNhbiB1c2UgJ3RhYmxlTG9nJz09MCB0byBtZWFuICJ1c2UgZGVm YXVsdCB0YWJsZUxvZyB2YWx1ZSIuDQorSWYgeW91IGFyZSB1bnN1cmUgb2Ygd2hpY2ggdGFibGVM b2cgdmFsdWUgdG8gdXNlLCB5b3UgY2FuIGFzayBGU0Vfb3B0aW1hbFRhYmxlTG9nKCksDQord2hp Y2ggd2lsbCBwcm92aWRlIHRoZSBvcHRpbWFsIHZhbGlkIHRhYmxlTG9nIGdpdmVuIHNvdXJjZVNp emUsIG1heFN5bWJvbFZhbHVlLCBhbmQgYSB1c2VyLWRlZmluZWQgbWF4aW11bSAoMCBtZWFucyAi ZGVmYXVsdCIpLg0KKw0KK1RoZSByZXN1bHQgb2YgRlNFX25vcm1hbGl6ZUNvdW50KCkgd2lsbCBi ZSBzYXZlZCBpbnRvIGEgdGFibGUsDQorY2FsbGVkICdub3JtYWxpemVkQ291bnRlcicsIHdoaWNo IGlzIGEgdGFibGUgb2Ygc2lnbmVkIHNob3J0Lg0KKydub3JtYWxpemVkQ291bnRlcicgbXVzdCBi ZSBhbHJlYWR5IGFsbG9jYXRlZCwgYW5kIGhhdmUgYXQgbGVhc3QgJ21heFN5bWJvbFZhbHVlKzEn IGNlbGxzLg0KK1RoZSByZXR1cm4gdmFsdWUgaXMgdGFibGVMb2cgaWYgZXZlcnl0aGluZyBwcm9j ZWVkZWQgYXMgZXhwZWN0ZWQuDQorSXQgaXMgMCBpZiB0aGVyZSBpcyBhIHNpbmdsZSBzeW1ib2wg d2l0aGluIGRpc3RyaWJ1dGlvbi4NCitJZiB0aGVyZSBpcyBhbiBlcnJvciAoZXg6IGludmFsaWQg dGFibGVMb2cgdmFsdWUpLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gRXJyb3JDb2RlICh3 aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCkpLg0KKw0KKydub3JtYWxpemVk Q291bnRlcicgY2FuIGJlIHNhdmVkIGluIGEgY29tcGFjdCBtYW5uZXIgdG8gYSBtZW1vcnkgYXJl YSB1c2luZyBGU0Vfd3JpdGVOQ291bnQoKS4NCisnYnVmZmVyJyBtdXN0IGJlIGFscmVhZHkgYWxs b2NhdGVkLg0KK0ZvciBndWFyYW50ZWVkIHN1Y2Nlc3MsIGJ1ZmZlciBzaXplIG11c3QgYmUgYXQg bGVhc3QgRlNFX2hlYWRlckJvdW5kKCkuDQorVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMg dGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gJ2J1ZmZlcicuDQorSWYgdGhlcmUgaXMg YW4gZXJyb3IsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBFcnJvckNvZGUgKHdoaWNoIGNh biBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKTsgZXggOiBidWZmZXIgc2l6ZSB0b28gc21h bGwpLg0KKw0KKydub3JtYWxpemVkQ291bnRlcicgY2FuIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUg dGhlIGNvbXByZXNzaW9uIHRhYmxlICdDVGFibGUnLg0KK1RoZSBzcGFjZSByZXF1aXJlZCBieSAn Q1RhYmxlJyBtdXN0IGJlIGFscmVhZHkgYWxsb2NhdGVkLCB1c2luZyBGU0VfY3JlYXRlQ1RhYmxl KCkuDQorWW91IGNhbiB0aGVuIHVzZSBGU0VfYnVpbGRDVGFibGUoKSB0byBmaWxsICdDVGFibGUn Lg0KK0lmIHRoZXJlIGlzIGFuIGVycm9yLCBib3RoIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhbiBF cnJvckNvZGUgKHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSkuDQorDQor J0NUYWJsZScgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wcmVzcyAnc3JjJywgd2l0aCBGU0VfY29t cHJlc3NfdXNpbmdDVGFibGUoKS4NCitTaW1pbGFyIHRvIEZTRV9jb3VudCgpLCB0aGUgY29udmVu dGlvbiBpcyB0aGF0ICdzcmMnIGlzIGFzc3VtZWQgdG8gYmUgYSB0YWJsZSBvZiBjaGFyIG9mIHNp emUgJ3NyY1NpemUnDQorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgb2YgY29tcHJlc3Nl ZCBkYXRhICh3aXRob3V0IGhlYWRlciksIG5lY2Vzc2FyaWx5IDw9IGBkc3RDYXBhY2l0eWAuDQor SWYgaXQgcmV0dXJucyAnMCcsIGNvbXByZXNzZWQgZGF0YSBjb3VsZCBub3QgZml0IGludG8gJ2Rz dCcuDQorSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBF cnJvckNvZGUgKHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSkuDQorKi8N CisNCisvKiAqKiogREVDT01QUkVTU0lPTiAqKiogKi8NCisNCisvKiEgRlNFX3JlYWROQ291bnQo KToNCisJUmVhZCBjb21wYWN0bHkgc2F2ZWQgJ25vcm1hbGl6ZWRDb3VudGVyJyBmcm9tICdyQnVm ZmVyJy4NCisJQHJldHVybiA6IHNpemUgcmVhZCBmcm9tICdyQnVmZmVyJywNCisJCQkgIG9yIGFu IGVycm9yQ29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpLg0KKwkJ CSAgbWF4U3ltYm9sVmFsdWVQdHJbMF0gYW5kIHRhYmxlTG9nUHRyWzBdIHdpbGwgYWxzbyBiZSB1 cGRhdGVkIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMgKi8NCitGU0VfUFVCTElDX0FQSSBz aXplX3QgRlNFX3JlYWROQ291bnQoc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCAq bWF4U3ltYm9sVmFsdWVQdHIsIHVuc2lnbmVkICp0YWJsZUxvZ1B0ciwgY29uc3Qgdm9pZCAqckJ1 ZmZlciwgc2l6ZV90IHJCdWZmU2l6ZSk7DQorDQorLyohIENvbnN0cnVjdG9yIGFuZCBEZXN0cnVj dG9yIG9mIEZTRV9EVGFibGUuDQorCU5vdGUgdGhhdCBpdHMgc2l6ZSBkZXBlbmRzIG9uICd0YWJs ZUxvZycgKi8NCit0eXBlZGVmIHVuc2lnbmVkIEZTRV9EVGFibGU7IC8qIGRvbid0IGFsbG9jYXRl IHRoYXQuIEl0J3MganVzdCBhIHdheSB0byBiZSBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gdm9pZCog Ki8NCisNCisvKiEgRlNFX2J1aWxkRFRhYmxlKCk6DQorCUJ1aWxkcyAnZHQnLCB3aGljaCBtdXN0 IGJlIGFscmVhZHkgYWxsb2NhdGVkLCB1c2luZyBGU0VfY3JlYXRlRFRhYmxlKCkuDQorCXJldHVy biA6IDAsIG9yIGFuIGVycm9yQ29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNF cnJvcigpICovDQorRlNFX1BVQkxJQ19BUEkgc2l6ZV90IEZTRV9idWlsZERUYWJsZV93a3NwKEZT RV9EVGFibGUgKmR0LCBjb25zdCBzaG9ydCAqbm9ybWFsaXplZENvdW50ZXIsIHVuc2lnbmVkIG1h eFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qg d29ya3NwYWNlU2l6ZSk7DQorDQorLyohIEZTRV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlKCk6DQor CURlY29tcHJlc3MgY29tcHJlc3NlZCBzb3VyY2UgYGNTcmNgIG9mIHNpemUgYGNTcmNTaXplYCB1 c2luZyBgZHRgDQorCWludG8gYGRzdGAgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZC4N CisJQHJldHVybiA6IHNpemUgb2YgcmVnZW5lcmF0ZWQgZGF0YSAobmVjZXNzYXJpbHkgPD0gYGRz dENhcGFjaXR5YCksDQorCQkJICBvciBhbiBlcnJvckNvZGUsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQg dXNpbmcgRlNFX2lzRXJyb3IoKSAqLw0KK0ZTRV9QVUJMSUNfQVBJIHNpemVfdCBGU0VfZGVjb21w cmVzc191c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9p ZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBGU0VfRFRhYmxlICpkdCk7DQorDQorLyoh DQorVHV0b3JpYWwgOg0KKy0tLS0tLS0tLS0NCisoTm90ZSA6IHRoZXNlIGZ1bmN0aW9ucyBvbmx5 IGRlY29tcHJlc3MgRlNFLWNvbXByZXNzZWQgYmxvY2tzLg0KKyBJZiBibG9jayBpcyB1bmNvbXBy ZXNzZWQsIHVzZSBtZW1jcHkoKSBpbnN0ZWFkDQorIElmIGJsb2NrIGlzIGEgc2luZ2xlIHJlcGVh dGVkIGJ5dGUsIHVzZSBtZW1zZXQoKSBpbnN0ZWFkICkNCisNCitUaGUgZmlyc3Qgc3RlcCBpcyB0 byBvYnRhaW4gdGhlIG5vcm1hbGl6ZWQgZnJlcXVlbmNpZXMgb2Ygc3ltYm9scy4NCitUaGlzIGNh biBiZSBwZXJmb3JtZWQgYnkgRlNFX3JlYWROQ291bnQoKSBpZiBpdCB3YXMgc2F2ZWQgdXNpbmcg RlNFX3dyaXRlTkNvdW50KCkuDQorJ25vcm1hbGl6ZWRDb3VudGVyJyBtdXN0IGJlIGFscmVhZHkg YWxsb2NhdGVkLCBhbmQgaGF2ZSBhdCBsZWFzdCAnbWF4U3ltYm9sVmFsdWVQdHJbMF0rMScgY2Vs bHMgb2Ygc2lnbmVkIHNob3J0Lg0KK0luIHByYWN0aWNlLCB0aGF0IG1lYW5zIGl0J3MgbmVjZXNz YXJ5IHRvIGtub3cgJ21heFN5bWJvbFZhbHVlJyBiZWZvcmVoYW5kLA0KK29yIHNpemUgdGhlIHRh YmxlIHRvIGhhbmRsZSB3b3JzdCBjYXNlIHNpdHVhdGlvbnMgKHR5cGljYWxseSAyNTYpLg0KK0ZT RV9yZWFkTkNvdW50KCkgd2lsbCBwcm92aWRlICd0YWJsZUxvZycgYW5kICdtYXhTeW1ib2xWYWx1 ZScuDQorVGhlIHJlc3VsdCBvZiBGU0VfcmVhZE5Db3VudCgpIGlzIHRoZSBudW1iZXIgb2YgYnl0 ZXMgcmVhZCBmcm9tICdyQnVmZmVyJy4NCitOb3RlIHRoYXQgJ3JCdWZmZXJTaXplJyBtdXN0IGJl IGF0IGxlYXN0IDQgYnl0ZXMsIGV2ZW4gaWYgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGxlc3MgdGhh biB0aGF0Lg0KK0lmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4g YW4gZXJyb3IgY29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpLg0K Kw0KK1RoZSBuZXh0IHN0ZXAgaXMgdG8gYnVpbGQgdGhlIGRlY29tcHJlc3Npb24gdGFibGVzICdG U0VfRFRhYmxlJyBmcm9tICdub3JtYWxpemVkQ291bnRlcicuDQorVGhpcyBpcyBwZXJmb3JtZWQg YnkgdGhlIGZ1bmN0aW9uIEZTRV9idWlsZERUYWJsZSgpLg0KK1RoZSBzcGFjZSByZXF1aXJlZCBi eSAnRlNFX0RUYWJsZScgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCB1c2luZyBGU0VfY3JlYXRl RFRhYmxlKCkuDQorSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVy biBhbiBlcnJvciBjb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCku DQorDQorYEZTRV9EVGFibGVgIGNhbiB0aGVuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyBgY1NyY2As IHdpdGggRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGUoKS4NCitgY1NyY1NpemVgIG11c3QgYmUg c3RyaWN0bHkgY29ycmVjdCwgb3RoZXJ3aXNlIGRlY29tcHJlc3Npb24gd2lsbCBmYWlsLg0KK0ZT RV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlKCkgcmVzdWx0IHdpbGwgdGVsbCBob3cgbWFueSBieXRl cyB3ZXJlIHJlZ2VuZXJhdGVkICg8PWBkc3RDYXBhY2l0eWApLg0KK0lmIHRoZXJlIGlzIGFuIGVy cm9yLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IgY29kZSwgd2hpY2ggY2FuIGJl IHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpLiAoZXg6IGRzdCBidWZmZXIgdG9vIHNtYWxsKQ0K KyovDQorDQorLyogKioqIERlcGVuZGVuY3kgKioqICovDQorI2luY2x1ZGUgImJpdHN0cmVhbS5o Ig0KKw0KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAg U3RhdGljIGFsbG9jYXRpb24NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLw0KKy8qIEZTRSBidWZmZXIgYm91bmRzICovDQorI2RlZmluZSBGU0VfTkNPVU5UQk9V TkQgNTEyDQorI2RlZmluZSBGU0VfQkxPQ0tCT1VORChzaXplKSAoc2l6ZSArIChzaXplID4+IDcp KQ0KKyNkZWZpbmUgRlNFX0NPTVBSRVNTQk9VTkQoc2l6ZSkgKEZTRV9OQ09VTlRCT1VORCArIEZT RV9CTE9DS0JPVU5EKHNpemUpKSAvKiBNYWNybyB2ZXJzaW9uLCB1c2VmdWwgZm9yIHN0YXRpYyBh bGxvY2F0aW9uICovDQorDQorLyogSXQgaXMgcG9zc2libGUgdG8gc3RhdGljYWxseSBhbGxvY2F0 ZSBGU0UgQ1RhYmxlL0RUYWJsZSBhcyBhIHRhYmxlIG9mIEZTRV9DVGFibGUvRlNFX0RUYWJsZSB1 c2luZyBiZWxvdyBtYWNyb3MgKi8NCisjZGVmaW5lIEZTRV9DVEFCTEVfU0laRV9VMzIobWF4VGFi bGVMb2csIG1heFN5bWJvbFZhbHVlKSAoMSArICgxIDw8IChtYXhUYWJsZUxvZyAtIDEpKSArICgo bWF4U3ltYm9sVmFsdWUgKyAxKSAqIDIpKQ0KKyNkZWZpbmUgRlNFX0RUQUJMRV9TSVpFX1UzMiht YXhUYWJsZUxvZykgKDEgKyAoMSA8PCBtYXhUYWJsZUxvZykpDQorDQorLyogKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBGU0UgYWR2YW5jZWQgQVBJDQorKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBGU0VfY291bnRf d2tzcCgpIDoNCisgKiBTYW1lIGFzIEZTRV9jb3VudCgpLCBidXQgdXNpbmcgYW4gZXh0ZXJuYWxs eSBwcm92aWRlZCBzY3JhdGNoIGJ1ZmZlci4NCisgKiBgd29ya1NwYWNlYCBzaXplIG11c3QgYmUg dGFibGUgb2YgPj0gYDEwMjRgIHVuc2lnbmVkDQorICovDQorc2l6ZV90IEZTRV9jb3VudF93a3Nw KHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgKm1heFN5bWJvbFZhbHVlUHRyLCBjb25zdCB2b2lk ICpzb3VyY2UsIHNpemVfdCBzb3VyY2VTaXplLCB1bnNpZ25lZCAqd29ya1NwYWNlKTsNCisNCisv KiBGU0VfY291bnRGYXN0X3drc3AoKSA6DQorICogU2FtZSBhcyBGU0VfY291bnRGYXN0KCksIGJ1 dCB1c2luZyBhbiBleHRlcm5hbGx5IHByb3ZpZGVkIHNjcmF0Y2ggYnVmZmVyLg0KKyAqIGB3b3Jr U3BhY2VgIG11c3QgYmUgYSB0YWJsZSBvZiBtaW5pbXVtIGAxMDI0YCB1bnNpZ25lZA0KKyAqLw0K K3NpemVfdCBGU0VfY291bnRGYXN0X3drc3AodW5zaWduZWQgKmNvdW50LCB1bnNpZ25lZCAqbWF4 U3ltYm9sVmFsdWVQdHIsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVk ICp3b3JrU3BhY2UpOw0KKw0KKy8qISBGU0VfY291bnRfc2ltcGxlDQorICogU2FtZSBhcyBGU0Vf Y291bnRGYXN0KCksIGJ1dCBkb2VzIG5vdCB1c2UgYW55IGFkZGl0aW9uYWwgbWVtb3J5IChub3Qg ZXZlbiBvbiBzdGFjaykuDQorICogVGhpcyBmdW5jdGlvbiBpcyB1bnNhZmUsIGFuZCB3aWxsIHNl Z2ZhdWx0IGlmIGFueSB2YWx1ZSB3aXRoaW4gYHNyY2AgaXMgYD4gKm1heFN5bWJvbFZhbHVlUHRy YCAocHJlc3VtaW5nIGl0J3MgYWxzbyB0aGUgc2l6ZSBvZiBgY291bnRgKS4NCisqLw0KK3NpemVf dCBGU0VfY291bnRfc2ltcGxlKHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgKm1heFN5bWJvbFZh bHVlUHRyLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKTsNCisNCit1bnNpZ25lZCBG U0Vfb3B0aW1hbFRhYmxlTG9nX2ludGVybmFsKHVuc2lnbmVkIG1heFRhYmxlTG9nLCBzaXplX3Qg c3JjU2l6ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIG1pbnVzKTsNCisvKio8 IHNhbWUgYXMgRlNFX29wdGltYWxUYWJsZUxvZygpLCB3aGljaCB1c2VkIGBtaW51cz09MmAgKi8N CisNCitzaXplX3QgRlNFX2J1aWxkQ1RhYmxlX3JhdyhGU0VfQ1RhYmxlICpjdCwgdW5zaWduZWQg bmJCaXRzKTsNCisvKio8IGJ1aWxkIGEgZmFrZSBGU0VfQ1RhYmxlLCBkZXNpZ25lZCBmb3IgYSBm bGF0IGRpc3RyaWJ1dGlvbiwgd2hlcmUgZWFjaCBzeW1ib2wgdXNlcyBuYkJpdHMgKi8NCisNCitz aXplX3QgRlNFX2J1aWxkQ1RhYmxlX3JsZShGU0VfQ1RhYmxlICpjdCwgdW5zaWduZWQgY2hhciBz eW1ib2xWYWx1ZSk7DQorLyoqPCBidWlsZCBhIGZha2UgRlNFX0NUYWJsZSwgZGVzaWduZWQgdG8g Y29tcHJlc3MgYWx3YXlzIHRoZSBzYW1lIHN5bWJvbFZhbHVlICovDQorDQorLyogRlNFX2J1aWxk Q1RhYmxlX3drc3AoKSA6DQorICogU2FtZSBhcyBGU0VfYnVpbGRDVGFibGUoKSwgYnV0IHVzaW5n IGFuIGV4dGVybmFsbHkgYWxsb2NhdGVkIHNjcmF0Y2ggYnVmZmVyIChgd29ya1NwYWNlYCkuDQor ICogYHdrc3BTaXplYCBtdXN0IGJlID49IGAoMTw8dGFibGVMb2cpYC4NCisgKi8NCitzaXplX3Qg RlNFX2J1aWxkQ1RhYmxlX3drc3AoRlNFX0NUYWJsZSAqY3QsIGNvbnN0IHNob3J0ICpub3JtYWxp emVkQ291bnRlciwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nLCB2 b2lkICp3b3JrU3BhY2UsIHNpemVfdCB3a3NwU2l6ZSk7DQorDQorc2l6ZV90IEZTRV9idWlsZERU YWJsZV9yYXcoRlNFX0RUYWJsZSAqZHQsIHVuc2lnbmVkIG5iQml0cyk7DQorLyoqPCBidWlsZCBh IGZha2UgRlNFX0RUYWJsZSwgZGVzaWduZWQgdG8gcmVhZCBhIGZsYXQgZGlzdHJpYnV0aW9uIHdo ZXJlIGVhY2ggc3ltYm9sIHVzZXMgbmJCaXRzICovDQorDQorc2l6ZV90IEZTRV9idWlsZERUYWJs ZV9ybGUoRlNFX0RUYWJsZSAqZHQsIHVuc2lnbmVkIGNoYXIgc3ltYm9sVmFsdWUpOw0KKy8qKjwg YnVpbGQgYSBmYWtlIEZTRV9EVGFibGUsIGRlc2lnbmVkIHRvIGFsd2F5cyBnZW5lcmF0ZSB0aGUg c2FtZSBzeW1ib2xWYWx1ZSAqLw0KKw0KK3NpemVfdCBGU0VfZGVjb21wcmVzc193a3NwKHZvaWQg KmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1Np emUsIHVuc2lnbmVkIG1heExvZywgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6 ZSk7DQorLyoqPCBzYW1lIGFzIEZTRV9kZWNvbXByZXNzKCksIHVzaW5nIGFuIGV4dGVybmFsbHkg YWxsb2NhdGVkIGB3b3JrU3BhY2VgIHByb2R1Y2VkIHdpdGggYEZTRV9EVEFCTEVfU0laRV9VMzIo bWF4TG9nKWAgKi8NCisNCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKg0KKyogIEZTRSBzeW1ib2wgY29tcHJlc3Npb24gQVBJDQorKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiENCisgICBUaGlzIEFQSSBjb25zaXN0cyBv ZiBzbWFsbCB1bml0YXJ5IGZ1bmN0aW9ucywgd2hpY2ggaGlnaGx5IGJlbmVmaXQgZnJvbSBiZWlu ZyBpbmxpbmVkLg0KKyAgIEhlbmNlIHRoZWlyIGJvZHkgYXJlIGluY2x1ZGVkIGluIG5leHQgc2Vj dGlvbi4NCisqLw0KK3R5cGVkZWYgc3RydWN0IHsNCisJcHRyZGlmZl90IHZhbHVlOw0KKwljb25z dCB2b2lkICpzdGF0ZVRhYmxlOw0KKwljb25zdCB2b2lkICpzeW1ib2xUVDsNCisJdW5zaWduZWQg c3RhdGVMb2c7DQorfSBGU0VfQ1N0YXRlX3Q7DQorDQorc3RhdGljIHZvaWQgRlNFX2luaXRDU3Rh dGUoRlNFX0NTdGF0ZV90ICpDU3RhdGVQdHIsIGNvbnN0IEZTRV9DVGFibGUgKmN0KTsNCisNCitz dGF0aWMgdm9pZCBGU0VfZW5jb2RlU3ltYm9sKEJJVF9DU3RyZWFtX3QgKmJpdEMsIEZTRV9DU3Rh dGVfdCAqQ1N0YXRlUHRyLCB1bnNpZ25lZCBzeW1ib2wpOw0KKw0KK3N0YXRpYyB2b2lkIEZTRV9m bHVzaENTdGF0ZShCSVRfQ1N0cmVhbV90ICpiaXRDLCBjb25zdCBGU0VfQ1N0YXRlX3QgKkNTdGF0 ZVB0cik7DQorDQorLyoqPA0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgaW5uZXIgY29tcG9uZW50cyBv ZiBGU0VfY29tcHJlc3NfdXNpbmdDVGFibGUoKS4NCitUaGV5IGFsbG93IHRoZSBjcmVhdGlvbiBv ZiBjdXN0b20gc3RyZWFtcywgbWl4aW5nIG11bHRpcGxlIHRhYmxlcyBhbmQgYml0IHNvdXJjZXMu DQorDQorQSBrZXkgcHJvcGVydHkgdG8ga2VlcCBpbiBtaW5kIGlzIHRoYXQgZW5jb2RpbmcgYW5k IGRlY29kaW5nIGFyZSBkb25lICoqaW4gcmV2ZXJzZSBkaXJlY3Rpb24qKi4NCitTbyB0aGUgZmly c3Qgc3ltYm9sIHlvdSB3aWxsIGVuY29kZSBpcyB0aGUgbGFzdCB5b3Ugd2lsbCBkZWNvZGUsIGxp a2UgYSBMSUZPIHN0YWNrLg0KKw0KK1lvdSB3aWxsIG5lZWQgYSBmZXcgdmFyaWFibGVzIHRvIHRy YWNrIHlvdXIgQ1N0cmVhbS4gVGhleSBhcmUgOg0KKw0KK0ZTRV9DVGFibGUgICAgY3Q7ICAgICAg ICAgLy8gUHJvdmlkZWQgYnkgRlNFX2J1aWxkQ1RhYmxlKCkNCitCSVRfQ1N0cmVhbV90IGJpdFN0 cmVhbTsgIC8vIGJpdFN0cmVhbSB0cmFja2luZyBzdHJ1Y3R1cmUNCitGU0VfQ1N0YXRlX3QgIHN0 YXRlOyAgICAgIC8vIFN0YXRlIHRyYWNraW5nIHN0cnVjdHVyZSAoY2FuIGhhdmUgc2V2ZXJhbCkN CisNCisNCitUaGUgZmlyc3QgdGhpbmcgdG8gZG8gaXMgdG8gaW5pdCBiaXRTdHJlYW0gYW5kIHN0 YXRlLg0KKwlzaXplX3QgZXJyb3JDb2RlID0gQklUX2luaXRDU3RyZWFtKCZiaXRTdHJlYW0sIGRz dEJ1ZmZlciwgbWF4RHN0U2l6ZSk7DQorCUZTRV9pbml0Q1N0YXRlKCZzdGF0ZSwgY3QpOw0KKw0K K05vdGUgdGhhdCBCSVRfaW5pdENTdHJlYW0oKSBjYW4gcHJvZHVjZSBhbiBlcnJvciBjb2RlLCBz byBpdHMgcmVzdWx0IHNob3VsZCBiZSB0ZXN0ZWQsIHVzaW5nIEZTRV9pc0Vycm9yKCk7DQorWW91 IGNhbiB0aGVuIGVuY29kZSB5b3VyIGlucHV0IGRhdGEsIGJ5dGUgYWZ0ZXIgYnl0ZS4NCitGU0Vf ZW5jb2RlU3ltYm9sKCkgb3V0cHV0cyBhIG1heGltdW0gb2YgJ3RhYmxlTG9nJyBiaXRzIGF0IGEg dGltZS4NCitSZW1lbWJlciBkZWNvZGluZyB3aWxsIGJlIGRvbmUgaW4gcmV2ZXJzZSBkaXJlY3Rp b24uDQorCUZTRV9lbmNvZGVCeXRlKCZiaXRTdHJlYW0sICZzdGF0ZSwgc3ltYm9sKTsNCisNCitB dCBhbnkgdGltZSwgeW91IGNhbiBhbHNvIGFkZCBhbnkgYml0IHNlcXVlbmNlLg0KK05vdGUgOiBt YXhpbXVtIGFsbG93ZWQgbmJCaXRzIGlzIDI1LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDMyLWJp dHMgZGVjb2RlcnMNCisJQklUX2FkZEJpdHMoJmJpdFN0cmVhbSwgYml0RmllbGQsIG5iQml0cyk7 DQorDQorVGhlIGFib3ZlIG1ldGhvZHMgZG9uJ3QgY29tbWl0IGRhdGEgdG8gbWVtb3J5LCB0aGV5 IGp1c3Qgc3RvcmUgaXQgaW50byBsb2NhbCByZWdpc3RlciwgZm9yIHNwZWVkLg0KK0xvY2FsIHJl Z2lzdGVyIHNpemUgaXMgNjQtYml0cyBvbiA2NC1iaXRzIHN5c3RlbXMsIDMyLWJpdHMgb24gMzIt Yml0cyBzeXN0ZW1zIChzaXplX3QpLg0KK1dyaXRpbmcgZGF0YSB0byBtZW1vcnkgaXMgYSBtYW51 YWwgb3BlcmF0aW9uLCBwZXJmb3JtZWQgYnkgdGhlIGZsdXNoQml0cyBmdW5jdGlvbi4NCisJQklU X2ZsdXNoQml0cygmYml0U3RyZWFtKTsNCisNCitZb3VyIGxhc3QgRlNFIGVuY29kaW5nIG9wZXJh dGlvbiBzaGFsbCBiZSB0byBmbHVzaCB5b3VyIGxhc3Qgc3RhdGUgdmFsdWUocykuDQorCUZTRV9m bHVzaFN0YXRlKCZiaXRTdHJlYW0sICZzdGF0ZSk7DQorDQorRmluYWxseSwgeW91IG11c3QgY2xv c2UgdGhlIGJpdFN0cmVhbS4NCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZSBvZiBDU3Ry ZWFtIGluIGJ5dGVzLg0KK0lmIGRhdGEgY291bGRuJ3QgZml0IGludG8gZHN0QnVmZmVyLCBpdCB3 aWxsIHJldHVybiBhIDAgKCA9PSBub3QgY29tcHJlc3NpYmxlKQ0KK0lmIHRoZXJlIGlzIGFuIGVy cm9yLCBpdCByZXR1cm5zIGFuIGVycm9yQ29kZSAod2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBG U0VfaXNFcnJvcigpKS4NCisJc2l6ZV90IHNpemUgPSBCSVRfY2xvc2VDU3RyZWFtKCZiaXRTdHJl YW0pOw0KKyovDQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioNCisqICBGU0Ugc3ltYm9sIGRlY29tcHJlc3Npb24gQVBJDQorKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCit0eXBlZGVmIHN0cnVjdCB7DQorCXNpemVfdCBz dGF0ZTsNCisJY29uc3Qgdm9pZCAqdGFibGU7IC8qIHByZWNpc2UgdGFibGUgbWF5IHZhcnksIGRl cGVuZGluZyBvbiBVMTYgKi8NCit9IEZTRV9EU3RhdGVfdDsNCisNCitzdGF0aWMgdm9pZCBGU0Vf aW5pdERTdGF0ZShGU0VfRFN0YXRlX3QgKkRTdGF0ZVB0ciwgQklUX0RTdHJlYW1fdCAqYml0RCwg Y29uc3QgRlNFX0RUYWJsZSAqZHQpOw0KKw0KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEZTRV9kZWNv ZGVTeW1ib2woRlNFX0RTdGF0ZV90ICpEU3RhdGVQdHIsIEJJVF9EU3RyZWFtX3QgKmJpdEQpOw0K Kw0KK3N0YXRpYyB1bnNpZ25lZCBGU0VfZW5kT2ZEU3RhdGUoY29uc3QgRlNFX0RTdGF0ZV90ICpE U3RhdGVQdHIpOw0KKw0KKy8qKjwNCitMZXQncyBub3cgZGVjb21wb3NlIEZTRV9kZWNvbXByZXNz X3VzaW5nRFRhYmxlKCkgaW50byBpdHMgdW5pdGFyeSBjb21wb25lbnRzLg0KK1lvdSB3aWxsIGRl Y29kZSBGU0UtZW5jb2RlZCBzeW1ib2xzIGZyb20gdGhlIGJpdFN0cmVhbSwNCithbmQgYWxzbyBh bnkgb3RoZXIgYml0RmllbGRzIHlvdSBwdXQgaW4sICoqaW4gcmV2ZXJzZSBvcmRlcioqLg0KKw0K K1lvdSB3aWxsIG5lZWQgYSBmZXcgdmFyaWFibGVzIHRvIHRyYWNrIHlvdXIgYml0U3RyZWFtLiBU aGV5IGFyZSA6DQorDQorQklUX0RTdHJlYW1fdCBEU3RyZWFtOyAgICAvLyBTdHJlYW0gY29udGV4 dA0KK0ZTRV9EU3RhdGVfdCAgRFN0YXRlOyAgICAgLy8gU3RhdGUgY29udGV4dC4gTXVsdGlwbGUg b25lcyBhcmUgcG9zc2libGUNCitGU0VfRFRhYmxlKiAgIERUYWJsZVB0cjsgIC8vIERlY29kaW5n IHRhYmxlLCBwcm92aWRlZCBieSBGU0VfYnVpbGREVGFibGUoKQ0KKw0KK1RoZSBmaXJzdCB0aGlu ZyB0byBkbyBpcyB0byBpbml0IHRoZSBiaXRTdHJlYW0uDQorCWVycm9yQ29kZSA9IEJJVF9pbml0 RFN0cmVhbSgmRFN0cmVhbSwgc3JjQnVmZmVyLCBzcmNTaXplKTsNCisNCitZb3Ugc2hvdWxkIHRo ZW4gcmV0cmlldmUgeW91ciBpbml0aWFsIHN0YXRlKHMpDQorKGluIHJldmVyc2UgZmx1c2hpbmcg b3JkZXIgaWYgeW91IGhhdmUgc2V2ZXJhbCBvbmVzKSA6DQorCWVycm9yQ29kZSA9IEZTRV9pbml0 RFN0YXRlKCZEU3RhdGUsICZEU3RyZWFtLCBEVGFibGVQdHIpOw0KKw0KK1lvdSBjYW4gdGhlbiBk ZWNvZGUgeW91ciBkYXRhLCBzeW1ib2wgYWZ0ZXIgc3ltYm9sLg0KK0ZvciBpbmZvcm1hdGlvbiB0 aGUgbWF4aW11bSBudW1iZXIgb2YgYml0cyByZWFkIGJ5IEZTRV9kZWNvZGVTeW1ib2woKSBpcyAn dGFibGVMb2cnLg0KK0tlZXAgaW4gbWluZCB0aGF0IHN5bWJvbHMgYXJlIGRlY29kZWQgaW4gcmV2 ZXJzZSBvcmRlciwgbGlrZSBhIExJRk8gc3RhY2sgKGxhc3QgaW4sIGZpcnN0IG91dCkuDQorCXVu c2lnbmVkIGNoYXIgc3ltYm9sID0gRlNFX2RlY29kZVN5bWJvbCgmRFN0YXRlLCAmRFN0cmVhbSk7 DQorDQorWW91IGNhbiByZXRyaWV2ZSBhbnkgYml0ZmllbGQgeW91IGV2ZW50dWFsbHkgc3RvcmVk IGludG8gdGhlIGJpdFN0cmVhbSAoaW4gcmV2ZXJzZSBvcmRlcikNCitOb3RlIDogbWF4aW11bSBh bGxvd2VkIG5iQml0cyBpcyAyNSwgZm9yIDMyLWJpdHMgY29tcGF0aWJpbGl0eQ0KKwlzaXplX3Qg Yml0RmllbGQgPSBCSVRfcmVhZEJpdHMoJkRTdHJlYW0sIG5iQml0cyk7DQorDQorQWxsIGFib3Zl IG9wZXJhdGlvbnMgb25seSByZWFkIGZyb20gbG9jYWwgcmVnaXN0ZXIgKHdoaWNoIHNpemUgZGVw ZW5kcyBvbiBzaXplX3QpLg0KK1JlZnVlbGluZyB0aGUgcmVnaXN0ZXIgZnJvbSBtZW1vcnkgaXMg bWFudWFsbHkgcGVyZm9ybWVkIGJ5IHRoZSByZWxvYWQgbWV0aG9kLg0KKwllbmRTaWduYWwgPSBG U0VfcmVsb2FkRFN0cmVhbSgmRFN0cmVhbSk7DQorDQorQklUX3JlbG9hZERTdHJlYW0oKSByZXN1 bHQgdGVsbHMgaWYgdGhlcmUgaXMgc3RpbGwgc29tZSBtb3JlIGRhdGEgdG8gcmVhZCBmcm9tIERT dHJlYW0uDQorQklUX0RTdHJlYW1fdW5maW5pc2hlZCA6IHRoZXJlIGlzIHN0aWxsIHNvbWUgZGF0 YSBsZWZ0IGludG8gdGhlIERTdHJlYW0uDQorQklUX0RTdHJlYW1fZW5kT2ZCdWZmZXIgOiBEc3Ry ZWFtIHJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4gSXRzIGNvbnRhaW5lciBtYXkgbm8gbG9uZ2VyIGJl IGNvbXBsZXRlbHkgZmlsbGVkLg0KK0JJVF9EU3RyZWFtX2NvbXBsZXRlZCA6IERzdHJlYW0gcmVh Y2hlZCBpdHMgZXhhY3QgZW5kLCBjb3JyZXNwb25kaW5nIGluIGdlbmVyYWwgdG8gZGVjb21wcmVz c2lvbiBjb21wbGV0ZWQuDQorQklUX0RTdHJlYW1fdG9vRmFyIDogRHN0cmVhbSB3ZW50IHRvbyBm YXIuIERlY29tcHJlc3Npb24gcmVzdWx0IGlzIGNvcnJ1cHRlZC4NCisNCitXaGVuIHJlYWNoaW5n IGVuZCBvZiBidWZmZXIgKEJJVF9EU3RyZWFtX2VuZE9mQnVmZmVyKSwgcHJvZ3Jlc3Mgc2xvd2x5 LCBub3RhYmx5IGlmIHlvdSBkZWNvZGUgbXVsdGlwbGUgc3ltYm9scyBwZXIgbG9vcCwNCit0byBw cm9wZXJseSBkZXRlY3QgdGhlIGV4YWN0IGVuZCBvZiBzdHJlYW0uDQorQWZ0ZXIgZWFjaCBkZWNv ZGVkIHN5bWJvbCwgY2hlY2sgaWYgRFN0cmVhbSBpcyBmdWxseSBjb25zdW1lZCB1c2luZyB0aGlz IHNpbXBsZSB0ZXN0IDoNCisJQklUX3JlbG9hZERTdHJlYW0oJkRTdHJlYW0pID49IEJJVF9EU3Ry ZWFtX2NvbXBsZXRlZA0KKw0KK1doZW4gaXQncyBkb25lLCB2ZXJpZnkgZGVjb21wcmVzc2lvbiBp cyBmdWxseSBjb21wbGV0ZWQsIGJ5IGNoZWNraW5nIGJvdGggRFN0cmVhbSBhbmQgdGhlIHJlbGV2 YW50IHN0YXRlcy4NCitDaGVja2luZyBpZiBEU3RyZWFtIGhhcyByZWFjaGVkIGl0cyBlbmQgaXMg cGVyZm9ybWVkIGJ5IDoNCisJQklUX2VuZE9mRFN0cmVhbSgmRFN0cmVhbSk7DQorQ2hlY2sgYWxz byB0aGUgc3RhdGVzLiBUaGVyZSBtaWdodCBiZSBzb21lIHN5bWJvbHMgbGVmdCB0aGVyZSwgaWYg c29tZSBoaWdoIHByb2JhYmlsaXR5IG9uZXMgKD41MCUpIGFyZSBwb3NzaWJsZS4NCisJRlNFX2Vu ZE9mRFN0YXRlKCZEU3RhdGUpOw0KKyovDQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCisqICBGU0UgdW5zYWZlIEFQSQ0KKyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHVuc2lnbmVkIGNoYXIgRlNFX2Rl Y29kZVN5bWJvbEZhc3QoRlNFX0RTdGF0ZV90ICpEU3RhdGVQdHIsIEJJVF9EU3RyZWFtX3QgKmJp dEQpOw0KKy8qIGZhc3RlciwgYnV0IHdvcmtzIG9ubHkgaWYgbmJCaXRzIGlzIGFsd2F5cyA+PSAx IChvdGhlcndpc2UsIHJlc3VsdCB3aWxsIGJlIGNvcnJ1cHRlZCkgKi8NCisNCisvKiAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIEltcGxlbWVudGF0aW9uIG9m IGlubGluZWQgZnVuY3Rpb25zDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8NCit0eXBlZGVmIHN0cnVjdCB7DQorCWludCBkZWx0YUZpbmRTdGF0ZTsNCisJVTMy IGRlbHRhTmJCaXRzOw0KK30gRlNFX3N5bWJvbENvbXByZXNzaW9uVHJhbnNmb3JtOyAvKiB0b3Rh bCA4IGJ5dGVzICovDQorDQorWlNURF9TVEFUSUMgdm9pZCBGU0VfaW5pdENTdGF0ZShGU0VfQ1N0 YXRlX3QgKnN0YXRlUHRyLCBjb25zdCBGU0VfQ1RhYmxlICpjdCkNCit7DQorCWNvbnN0IHZvaWQg KnB0ciA9IGN0Ow0KKwljb25zdCBVMTYgKnUxNnB0ciA9IChjb25zdCBVMTYgKilwdHI7DQorCWNv bnN0IFUzMiB0YWJsZUxvZyA9IFpTVERfcmVhZDE2KHB0cik7DQorCXN0YXRlUHRyLT52YWx1ZSA9 IChwdHJkaWZmX3QpMSA8PCB0YWJsZUxvZzsNCisJc3RhdGVQdHItPnN0YXRlVGFibGUgPSB1MTZw dHIgKyAyOw0KKwlzdGF0ZVB0ci0+c3ltYm9sVFQgPSAoKGNvbnN0IFUzMiAqKWN0ICsgMSArICh0 YWJsZUxvZyA/ICgxIDw8ICh0YWJsZUxvZyAtIDEpKSA6IDEpKTsNCisJc3RhdGVQdHItPnN0YXRl TG9nID0gdGFibGVMb2c7DQorfQ0KKw0KKy8qISBGU0VfaW5pdENTdGF0ZTIoKSA6DQorKiAgIFNh bWUgYXMgRlNFX2luaXRDU3RhdGUoKSwgYnV0IHRoZSBmaXJzdCBzeW1ib2wgdG8gaW5jbHVkZSAo d2hpY2ggd2lsbCBiZSB0aGUgbGFzdCB0byBiZSByZWFkKQ0KKyogICB1c2VzIHRoZSBzbWFsbGVz dCBzdGF0ZSB2YWx1ZSBwb3NzaWJsZSwgc2F2aW5nIHRoZSBjb3N0IG9mIHRoaXMgc3ltYm9sICov DQorWlNURF9TVEFUSUMgdm9pZCBGU0VfaW5pdENTdGF0ZTIoRlNFX0NTdGF0ZV90ICpzdGF0ZVB0 ciwgY29uc3QgRlNFX0NUYWJsZSAqY3QsIFUzMiBzeW1ib2wpDQorew0KKwlGU0VfaW5pdENTdGF0 ZShzdGF0ZVB0ciwgY3QpOw0KKwl7DQorCQljb25zdCBGU0Vfc3ltYm9sQ29tcHJlc3Npb25UcmFu c2Zvcm0gc3ltYm9sVFQgPSAoKGNvbnN0IEZTRV9zeW1ib2xDb21wcmVzc2lvblRyYW5zZm9ybSAq KShzdGF0ZVB0ci0+c3ltYm9sVFQpKVtzeW1ib2xdOw0KKwkJY29uc3QgVTE2ICpzdGF0ZVRhYmxl ID0gKGNvbnN0IFUxNiAqKShzdGF0ZVB0ci0+c3RhdGVUYWJsZSk7DQorCQlVMzIgbmJCaXRzT3V0 ID0gKFUzMikoKHN5bWJvbFRULmRlbHRhTmJCaXRzICsgKDEgPDwgMTUpKSA+PiAxNik7DQorCQlz dGF0ZVB0ci0+dmFsdWUgPSAobmJCaXRzT3V0IDw8IDE2KSAtIHN5bWJvbFRULmRlbHRhTmJCaXRz Ow0KKwkJc3RhdGVQdHItPnZhbHVlID0gc3RhdGVUYWJsZVsoc3RhdGVQdHItPnZhbHVlID4+IG5i Qml0c091dCkgKyBzeW1ib2xUVC5kZWx0YUZpbmRTdGF0ZV07DQorCX0NCit9DQorDQorWlNURF9T VEFUSUMgdm9pZCBGU0VfZW5jb2RlU3ltYm9sKEJJVF9DU3RyZWFtX3QgKmJpdEMsIEZTRV9DU3Rh dGVfdCAqc3RhdGVQdHIsIFUzMiBzeW1ib2wpDQorew0KKwljb25zdCBGU0Vfc3ltYm9sQ29tcHJl c3Npb25UcmFuc2Zvcm0gc3ltYm9sVFQgPSAoKGNvbnN0IEZTRV9zeW1ib2xDb21wcmVzc2lvblRy YW5zZm9ybSAqKShzdGF0ZVB0ci0+c3ltYm9sVFQpKVtzeW1ib2xdOw0KKwljb25zdCBVMTYgKmNv bnN0IHN0YXRlVGFibGUgPSAoY29uc3QgVTE2ICopKHN0YXRlUHRyLT5zdGF0ZVRhYmxlKTsNCisJ VTMyIG5iQml0c091dCA9IChVMzIpKChzdGF0ZVB0ci0+dmFsdWUgKyBzeW1ib2xUVC5kZWx0YU5i Qml0cykgPj4gMTYpOw0KKwlCSVRfYWRkQml0cyhiaXRDLCBzdGF0ZVB0ci0+dmFsdWUsIG5iQml0 c091dCk7DQorCXN0YXRlUHRyLT52YWx1ZSA9IHN0YXRlVGFibGVbKHN0YXRlUHRyLT52YWx1ZSA+ PiBuYkJpdHNPdXQpICsgc3ltYm9sVFQuZGVsdGFGaW5kU3RhdGVdOw0KK30NCisNCitaU1REX1NU QVRJQyB2b2lkIEZTRV9mbHVzaENTdGF0ZShCSVRfQ1N0cmVhbV90ICpiaXRDLCBjb25zdCBGU0Vf Q1N0YXRlX3QgKnN0YXRlUHRyKQ0KK3sNCisJQklUX2FkZEJpdHMoYml0Qywgc3RhdGVQdHItPnZh bHVlLCBzdGF0ZVB0ci0+c3RhdGVMb2cpOw0KKwlCSVRfZmx1c2hCaXRzKGJpdEMpOw0KK30NCisN CisvKiA9PT09PT0gICAgRGVjb21wcmVzc2lvbiAgICA9PT09PT0gKi8NCisNCit0eXBlZGVmIHN0 cnVjdCB7DQorCVUxNiB0YWJsZUxvZzsNCisJVTE2IGZhc3RNb2RlOw0KK30gRlNFX0RUYWJsZUhl YWRlcjsgLyogc2l6ZW9mIFUzMiAqLw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisJdW5zaWduZWQg c2hvcnQgbmV3U3RhdGU7DQorCXVuc2lnbmVkIGNoYXIgc3ltYm9sOw0KKwl1bnNpZ25lZCBjaGFy IG5iQml0czsNCit9IEZTRV9kZWNvZGVfdDsgLyogc2l6ZSA9PSBVMzIgKi8NCisNCitaU1REX1NU QVRJQyB2b2lkIEZTRV9pbml0RFN0YXRlKEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRyLCBCSVRfRFN0 cmVhbV90ICpiaXRELCBjb25zdCBGU0VfRFRhYmxlICpkdCkNCit7DQorCWNvbnN0IHZvaWQgKnB0 ciA9IGR0Ow0KKwljb25zdCBGU0VfRFRhYmxlSGVhZGVyICpjb25zdCBEVGFibGVIID0gKGNvbnN0 IEZTRV9EVGFibGVIZWFkZXIgKilwdHI7DQorCURTdGF0ZVB0ci0+c3RhdGUgPSBCSVRfcmVhZEJp dHMoYml0RCwgRFRhYmxlSC0+dGFibGVMb2cpOw0KKwlCSVRfcmVsb2FkRFN0cmVhbShiaXREKTsN CisJRFN0YXRlUHRyLT50YWJsZSA9IGR0ICsgMTsNCit9DQorDQorWlNURF9TVEFUSUMgQllURSBG U0VfcGVla1N5bWJvbChjb25zdCBGU0VfRFN0YXRlX3QgKkRTdGF0ZVB0cikNCit7DQorCUZTRV9k ZWNvZGVfdCBjb25zdCBESW5mbyA9ICgoY29uc3QgRlNFX2RlY29kZV90ICopKERTdGF0ZVB0ci0+ dGFibGUpKVtEU3RhdGVQdHItPnN0YXRlXTsNCisJcmV0dXJuIERJbmZvLnN5bWJvbDsNCit9DQor DQorWlNURF9TVEFUSUMgdm9pZCBGU0VfdXBkYXRlU3RhdGUoRlNFX0RTdGF0ZV90ICpEU3RhdGVQ dHIsIEJJVF9EU3RyZWFtX3QgKmJpdEQpDQorew0KKwlGU0VfZGVjb2RlX3QgY29uc3QgREluZm8g PSAoKGNvbnN0IEZTRV9kZWNvZGVfdCAqKShEU3RhdGVQdHItPnRhYmxlKSlbRFN0YXRlUHRyLT5z dGF0ZV07DQorCVUzMiBjb25zdCBuYkJpdHMgPSBESW5mby5uYkJpdHM7DQorCXNpemVfdCBjb25z dCBsb3dCaXRzID0gQklUX3JlYWRCaXRzKGJpdEQsIG5iQml0cyk7DQorCURTdGF0ZVB0ci0+c3Rh dGUgPSBESW5mby5uZXdTdGF0ZSArIGxvd0JpdHM7DQorfQ0KKw0KK1pTVERfU1RBVElDIEJZVEUg RlNFX2RlY29kZVN5bWJvbChGU0VfRFN0YXRlX3QgKkRTdGF0ZVB0ciwgQklUX0RTdHJlYW1fdCAq Yml0RCkNCit7DQorCUZTRV9kZWNvZGVfdCBjb25zdCBESW5mbyA9ICgoY29uc3QgRlNFX2RlY29k ZV90ICopKERTdGF0ZVB0ci0+dGFibGUpKVtEU3RhdGVQdHItPnN0YXRlXTsNCisJVTMyIGNvbnN0 IG5iQml0cyA9IERJbmZvLm5iQml0czsNCisJQllURSBjb25zdCBzeW1ib2wgPSBESW5mby5zeW1i b2w7DQorCXNpemVfdCBjb25zdCBsb3dCaXRzID0gQklUX3JlYWRCaXRzKGJpdEQsIG5iQml0cyk7 DQorDQorCURTdGF0ZVB0ci0+c3RhdGUgPSBESW5mby5uZXdTdGF0ZSArIGxvd0JpdHM7DQorCXJl dHVybiBzeW1ib2w7DQorfQ0KKw0KKy8qISBGU0VfZGVjb2RlU3ltYm9sRmFzdCgpIDoNCisJdW5z YWZlLCBvbmx5IHdvcmtzIGlmIG5vIHN5bWJvbCBoYXMgYSBwcm9iYWJpbGl0eSA+IDUwJSAqLw0K K1pTVERfU1RBVElDIEJZVEUgRlNFX2RlY29kZVN5bWJvbEZhc3QoRlNFX0RTdGF0ZV90ICpEU3Rh dGVQdHIsIEJJVF9EU3RyZWFtX3QgKmJpdEQpDQorew0KKwlGU0VfZGVjb2RlX3QgY29uc3QgRElu Zm8gPSAoKGNvbnN0IEZTRV9kZWNvZGVfdCAqKShEU3RhdGVQdHItPnRhYmxlKSlbRFN0YXRlUHRy LT5zdGF0ZV07DQorCVUzMiBjb25zdCBuYkJpdHMgPSBESW5mby5uYkJpdHM7DQorCUJZVEUgY29u c3Qgc3ltYm9sID0gREluZm8uc3ltYm9sOw0KKwlzaXplX3QgY29uc3QgbG93Qml0cyA9IEJJVF9y ZWFkQml0c0Zhc3QoYml0RCwgbmJCaXRzKTsNCisNCisJRFN0YXRlUHRyLT5zdGF0ZSA9IERJbmZv Lm5ld1N0YXRlICsgbG93Qml0czsNCisJcmV0dXJuIHN5bWJvbDsNCit9DQorDQorWlNURF9TVEFU SUMgdW5zaWduZWQgRlNFX2VuZE9mRFN0YXRlKGNvbnN0IEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRy KSB7IHJldHVybiBEU3RhdGVQdHItPnN0YXRlID09IDA7IH0NCisNCisvKiAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIFR1 bmluZyBwYXJhbWV0ZXJzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiFNRU1PUllfVVNBR0UgOg0KKyogIE1lbW9y eSB1c2FnZSBmb3JtdWxhIDogTi0+Ml5OIEJ5dGVzIChleGFtcGxlcyA6IDEwIC0+IDFLQjsgMTIg LT4gNEtCIDsgMTYgLT4gNjRLQjsgMjAgLT4gMU1COyBldGMuKQ0KKyogIEluY3JlYXNpbmcgbWVt b3J5IHVzYWdlIGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvDQorKiAgUmVkdWNlZCBtZW1vcnkg dXNhZ2UgY2FuIGltcHJvdmUgc3BlZWQsIGR1ZSB0byBjYWNoZSBlZmZlY3QNCisqICBSZWNvbW1l bmRlZCBtYXggdmFsdWUgaXMgMTQsIGZvciAxNktCLCB3aGljaCBuaWNlbHkgZml0cyBpbnRvIElu dGVsIHg4NiBMMSBjYWNoZSAqLw0KKyNpZm5kZWYgRlNFX01BWF9NRU1PUllfVVNBR0UNCisjZGVm aW5lIEZTRV9NQVhfTUVNT1JZX1VTQUdFIDE0DQorI2VuZGlmDQorI2lmbmRlZiBGU0VfREVGQVVM VF9NRU1PUllfVVNBR0UNCisjZGVmaW5lIEZTRV9ERUZBVUxUX01FTU9SWV9VU0FHRSAxMw0KKyNl bmRpZg0KKw0KKy8qIUZTRV9NQVhfU1lNQk9MX1ZBTFVFIDoNCisqICBNYXhpbXVtIHN5bWJvbCB2 YWx1ZSBhdXRob3JpemVkLg0KKyogIFJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2sgYWxsb2NhdGlv biAqLw0KKyNpZm5kZWYgRlNFX01BWF9TWU1CT0xfVkFMVUUNCisjZGVmaW5lIEZTRV9NQVhfU1lN Qk9MX1ZBTFVFIDI1NQ0KKyNlbmRpZg0KKw0KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgdGVtcGxhdGUgZnVuY3Rp b25zIHR5cGUgJiBzdWZmaXgNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNkZWZpbmUgRlNFX0ZVTkNUSU9OX1RZUEUg QllURQ0KKyNkZWZpbmUgRlNFX0ZVTkNUSU9OX0VYVEVOU0lPTg0KKyNkZWZpbmUgRlNFX0RFQ09E RV9UWVBFIEZTRV9kZWNvZGVfdA0KKw0KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIENvbnN0YW50cw0KKyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLw0KKyNkZWZpbmUgRlNFX01BWF9UQUJMRUxPRyAoRlNFX01BWF9NRU1PUllfVVNBR0UgLSAy KQ0KKyNkZWZpbmUgRlNFX01BWF9UQUJMRVNJWkUgKDFVIDw8IEZTRV9NQVhfVEFCTEVMT0cpDQor I2RlZmluZSBGU0VfTUFYVEFCTEVTSVpFX01BU0sgKEZTRV9NQVhfVEFCTEVTSVpFIC0gMSkNCisj ZGVmaW5lIEZTRV9ERUZBVUxUX1RBQkxFTE9HIChGU0VfREVGQVVMVF9NRU1PUllfVVNBR0UgLSAy KQ0KKyNkZWZpbmUgRlNFX01JTl9UQUJMRUxPRyA1DQorDQorI2RlZmluZSBGU0VfVEFCTEVMT0df QUJTT0xVVEVfTUFYIDE1DQorI2lmIEZTRV9NQVhfVEFCTEVMT0cgPiBGU0VfVEFCTEVMT0dfQUJT T0xVVEVfTUFYDQorI2Vycm9yICJGU0VfTUFYX1RBQkxFTE9HID4gRlNFX1RBQkxFTE9HX0FCU09M VVRFX01BWCBpcyBub3Qgc3VwcG9ydGVkIg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgRlNFX1RBQkxF U1RFUCh0YWJsZVNpemUpICgodGFibGVTaXplID4+IDEpICsgKHRhYmxlU2l6ZSA+PiAzKSArIDMp DQorDQorI2VuZGlmIC8qIEZTRV9IICovDQpkaWZmIC0tZ2l0IGEveGVuL2NvbW1vbi96c3RkL2Zz ZV9kZWNvbXByZXNzLmMgYi94ZW4vY29tbW9uL3pzdGQvZnNlX2RlY29tcHJlc3MuYw0KbmV3IGZp bGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAuLjBiMzUzNTMwZmINCi0tLSAvZGV2L251 bGwNCisrKyBiL3hlbi9jb21tb24venN0ZC9mc2VfZGVjb21wcmVzcy5jDQpAQCAtMCwwICsxLDMy NSBAQA0KKy8qDQorICogRlNFIDogRmluaXRlIFN0YXRlIEVudHJvcHkgZGVjb2Rlcg0KKyAqIENv cHlyaWdodCAoQykgMjAxMy0yMDE1LCBZYW5uIENvbGxldC4NCisgKg0KKyAqIEJTRCAyLUNsYXVz ZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNl LnBocCkNCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisgKiBtZXQ6DQor ICoNCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo ZSBhYm92ZSBjb3B5cmlnaHQNCisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiBjb3B5cmlnaHQgbm90aWNl LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQor ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3 aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1dGlvbi4NCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisgKiAiQVMg SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU IE5PVA0KKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB QklMSVRZIEFORCBGSVRORVNTIEZPUg0KKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorICogT1dORVIgT1IgQ09O VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws DQorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV RElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKyAqIFRI RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks IE9SIFRPUlQNCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqDQorICogVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkgaXQgdW5kZXINCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlDQorICogRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxl Y3QNCisgKiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSAoIkdQTCIpIG9yIEJTRCBsaWNlbnNlDQorICogKCJCU0QiKS4NCisgKg0KKyAqIFlvdSBjYW4g Y29udGFjdCB0aGUgYXV0aG9yIGF0IDoNCisgKiAtIFNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6 Ly9naXRodWIuY29tL0N5YW40OTczL0Zpbml0ZVN0YXRlRW50cm9weQ0KKyAqLw0KKw0KKy8qICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqDQorKiAgQ29tcGlsZXIgc3BlY2lmaWNzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVmaW5lIEZPUkNFX0lO TElORSBzdGF0aWMgX19hbHdheXNfaW5saW5lDQorDQorLyogKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBJbmNsdWRlcw0K KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovDQorI2luY2x1ZGUgImJpdHN0cmVhbS5oIg0KKyNpbmNsdWRlICJmc2UuaCINCisj aW5jbHVkZSAienN0ZF9pbnRlcm5hbC5oIg0KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPg0K KyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8q IG1lbWNweSwgbWVtc2V0ICovDQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBFcnJvciBNYW5hZ2VtZW50DQor KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8NCisjZGVmaW5lIEZTRV9pc0Vycm9yIEVSUl9pc0Vycm9yDQorI2RlZmluZSBGU0Vf U1RBVElDX0FTU0VSVChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwl7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0K KwkJZW51bSB7IEZTRV9zdGF0aWNfYXNzZXJ0ID0gMSAvIChpbnQpKCEhKGMpKSB9OyBcDQorCX0g LyogdXNlIG9ubHkgKmFmdGVyKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgKi8NCisNCisvKiAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kg0KKyogIFRlbXBsYXRlcw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyoNCisgIGRlc2lnbmVkIHRvIGJlIGluY2x1 ZGVkDQorICBmb3IgdHlwZS1zcGVjaWZpYyBmdW5jdGlvbnMgKHRlbXBsYXRlIGVtdWxhdGlvbiBp biBDKQ0KKyAgT2JqZWN0aXZlIGlzIHRvIHdyaXRlIHRoZXNlIGZ1bmN0aW9ucyBvbmx5IG9uY2Us IGZvciBpbXByb3ZlZCBtYWludGVuYW5jZQ0KKyovDQorDQorLyogc2FmZXR5IGNoZWNrcyAqLw0K KyNpZm5kZWYgRlNFX0ZVTkNUSU9OX0VYVEVOU0lPTg0KKyNlcnJvciAiRlNFX0ZVTkNUSU9OX0VY VEVOU0lPTiBtdXN0IGJlIGRlZmluZWQiDQorI2VuZGlmDQorI2lmbmRlZiBGU0VfRlVOQ1RJT05f VFlQRQ0KKyNlcnJvciAiRlNFX0ZVTkNUSU9OX1RZUEUgbXVzdCBiZSBkZWZpbmVkIg0KKyNlbmRp Zg0KKw0KKy8qIEZ1bmN0aW9uIG5hbWVzICovDQorI2RlZmluZSBGU0VfQ0FUKFgsIFkpIFgjI1kN CisjZGVmaW5lIEZTRV9GVU5DVElPTl9OQU1FKFgsIFkpIEZTRV9DQVQoWCwgWSkNCisjZGVmaW5l IEZTRV9UWVBFX05BTUUoWCwgWSkgRlNFX0NBVChYLCBZKQ0KKw0KKy8qIEZ1bmN0aW9uIHRlbXBs YXRlcyAqLw0KKw0KK3NpemVfdCBGU0VfYnVpbGREVGFibGVfd2tzcChGU0VfRFRhYmxlICpkdCwg Y29uc3Qgc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwg dW5zaWduZWQgdGFibGVMb2csIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUp DQorew0KKwl2b2lkICpjb25zdCB0ZFB0ciA9IGR0ICsgMTsgLyogYmVjYXVzZSAqZHQgaXMgdW5z aWduZWQsIDMyLWJpdHMgYWxpZ25lZCBvbiAzMi1iaXRzICovDQorCUZTRV9ERUNPREVfVFlQRSAq Y29uc3QgdGFibGVEZWNvZGUgPSAoRlNFX0RFQ09ERV9UWVBFICopKHRkUHRyKTsNCisJVTE2ICpz eW1ib2xOZXh0ID0gKFUxNiAqKXdvcmtzcGFjZTsNCisNCisJVTMyIGNvbnN0IG1heFNWMSA9IG1h eFN5bWJvbFZhbHVlICsgMTsNCisJVTMyIGNvbnN0IHRhYmxlU2l6ZSA9IDEgPDwgdGFibGVMb2c7 DQorCVUzMiBoaWdoVGhyZXNob2xkID0gdGFibGVTaXplIC0gMTsNCisNCisJLyogU2FuaXR5IENo ZWNrcyAqLw0KKwlpZiAod29ya3NwYWNlU2l6ZSA8IHNpemVvZihVMTYpICogKEZTRV9NQVhfU1lN Qk9MX1ZBTFVFICsgMSkpDQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOw0KKwlp ZiAobWF4U3ltYm9sVmFsdWUgPiBGU0VfTUFYX1NZTUJPTF9WQUxVRSkNCisJCXJldHVybiBFUlJP UihtYXhTeW1ib2xWYWx1ZV90b29MYXJnZSk7DQorCWlmICh0YWJsZUxvZyA+IEZTRV9NQVhfVEFC TEVMT0cpDQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOw0KKw0KKwkvKiBJbml0 LCBsYXkgZG93biBsb3dwcm9iIHN5bWJvbHMgKi8NCisJew0KKwkJRlNFX0RUYWJsZUhlYWRlciBE VGFibGVIOw0KKwkJRFRhYmxlSC50YWJsZUxvZyA9IChVMTYpdGFibGVMb2c7DQorCQlEVGFibGVI LmZhc3RNb2RlID0gMTsNCisJCXsNCisJCQlTMTYgY29uc3QgbGFyZ2VMaW1pdCA9IChTMTYpKDEg PDwgKHRhYmxlTG9nIC0gMSkpOw0KKwkJCVUzMiBzOw0KKwkJCWZvciAocyA9IDA7IHMgPCBtYXhT VjE7IHMrKykgew0KKwkJCQlpZiAobm9ybWFsaXplZENvdW50ZXJbc10gPT0gLTEpIHsNCisJCQkJ CXRhYmxlRGVjb2RlW2hpZ2hUaHJlc2hvbGQtLV0uc3ltYm9sID0gKEZTRV9GVU5DVElPTl9UWVBF KXM7DQorCQkJCQlzeW1ib2xOZXh0W3NdID0gMTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWlmIChu b3JtYWxpemVkQ291bnRlcltzXSA+PSBsYXJnZUxpbWl0KQ0KKwkJCQkJCURUYWJsZUguZmFzdE1v ZGUgPSAwOw0KKwkJCQkJc3ltYm9sTmV4dFtzXSA9IG5vcm1hbGl6ZWRDb3VudGVyW3NdOw0KKwkJ CQl9DQorCQkJfQ0KKwkJfQ0KKwkJbWVtY3B5KGR0LCAmRFRhYmxlSCwgc2l6ZW9mKERUYWJsZUgp KTsNCisJfQ0KKw0KKwkvKiBTcHJlYWQgc3ltYm9scyAqLw0KKwl7DQorCQlVMzIgY29uc3QgdGFi bGVNYXNrID0gdGFibGVTaXplIC0gMTsNCisJCVUzMiBjb25zdCBzdGVwID0gRlNFX1RBQkxFU1RF UCh0YWJsZVNpemUpOw0KKwkJVTMyIHMsIHBvc2l0aW9uID0gMDsNCisJCWZvciAocyA9IDA7IHMg PCBtYXhTVjE7IHMrKykgew0KKwkJCWludCBpOw0KKwkJCWZvciAoaSA9IDA7IGkgPCBub3JtYWxp emVkQ291bnRlcltzXTsgaSsrKSB7DQorCQkJCXRhYmxlRGVjb2RlW3Bvc2l0aW9uXS5zeW1ib2wg PSAoRlNFX0ZVTkNUSU9OX1RZUEUpczsNCisJCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyBzdGVw KSAmIHRhYmxlTWFzazsNCisJCQkJd2hpbGUgKHBvc2l0aW9uID4gaGlnaFRocmVzaG9sZCkNCisJ CQkJCXBvc2l0aW9uID0gKHBvc2l0aW9uICsgc3RlcCkgJiB0YWJsZU1hc2s7IC8qIGxvd3Byb2Ig YXJlYSAqLw0KKwkJCX0NCisJCX0NCisJCWlmIChwb3NpdGlvbiAhPSAwKQ0KKwkJCXJldHVybiBF UlJPUihHRU5FUklDKTsgLyogcG9zaXRpb24gbXVzdCByZWFjaCBhbGwgY2VsbHMgb25jZSwgb3Ro ZXJ3aXNlIG5vcm1hbGl6ZWRDb3VudGVyIGlzIGluY29ycmVjdCAqLw0KKwl9DQorDQorCS8qIEJ1 aWxkIERlY29kaW5nIHRhYmxlICovDQorCXsNCisJCVUzMiB1Ow0KKwkJZm9yICh1ID0gMDsgdSA8 IHRhYmxlU2l6ZTsgdSsrKSB7DQorCQkJRlNFX0ZVTkNUSU9OX1RZUEUgY29uc3Qgc3ltYm9sID0g KEZTRV9GVU5DVElPTl9UWVBFKSh0YWJsZURlY29kZVt1XS5zeW1ib2wpOw0KKwkJCVUxNiBuZXh0 U3RhdGUgPSBzeW1ib2xOZXh0W3N5bWJvbF0rKzsNCisJCQl0YWJsZURlY29kZVt1XS5uYkJpdHMg PSAoQllURSkodGFibGVMb2cgLSBCSVRfaGlnaGJpdDMyKChVMzIpbmV4dFN0YXRlKSk7DQorCQkJ dGFibGVEZWNvZGVbdV0ubmV3U3RhdGUgPSAoVTE2KSgobmV4dFN0YXRlIDw8IHRhYmxlRGVjb2Rl W3VdLm5iQml0cykgLSB0YWJsZVNpemUpOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiAwOw0KK30N CisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqDQorKiAgRGVjb21wcmVzc2lvbiAoQnl0ZSBzeW1ib2xzKQ0KKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitzaXplX3QgRlNF X2J1aWxkRFRhYmxlX3JsZShGU0VfRFRhYmxlICpkdCwgQllURSBzeW1ib2xWYWx1ZSkNCit7DQor CXZvaWQgKnB0ciA9IGR0Ow0KKwlGU0VfRFRhYmxlSGVhZGVyICpjb25zdCBEVGFibGVIID0gKEZT RV9EVGFibGVIZWFkZXIgKilwdHI7DQorCXZvaWQgKmRQdHIgPSBkdCArIDE7DQorCUZTRV9kZWNv ZGVfdCAqY29uc3QgY2VsbCA9IChGU0VfZGVjb2RlX3QgKilkUHRyOw0KKw0KKwlEVGFibGVILT50 YWJsZUxvZyA9IDA7DQorCURUYWJsZUgtPmZhc3RNb2RlID0gMDsNCisNCisJY2VsbC0+bmV3U3Rh dGUgPSAwOw0KKwljZWxsLT5zeW1ib2wgPSBzeW1ib2xWYWx1ZTsNCisJY2VsbC0+bmJCaXRzID0g MDsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3NpemVfdCBGU0VfYnVpbGREVGFibGVfcmF3KEZT RV9EVGFibGUgKmR0LCB1bnNpZ25lZCBuYkJpdHMpDQorew0KKwl2b2lkICpwdHIgPSBkdDsNCisJ RlNFX0RUYWJsZUhlYWRlciAqY29uc3QgRFRhYmxlSCA9IChGU0VfRFRhYmxlSGVhZGVyICopcHRy Ow0KKwl2b2lkICpkUHRyID0gZHQgKyAxOw0KKwlGU0VfZGVjb2RlX3QgKmNvbnN0IGRpbmZvID0g KEZTRV9kZWNvZGVfdCAqKWRQdHI7DQorCWNvbnN0IHVuc2lnbmVkIHRhYmxlU2l6ZSA9IDEgPDwg bmJCaXRzOw0KKwljb25zdCB1bnNpZ25lZCB0YWJsZU1hc2sgPSB0YWJsZVNpemUgLSAxOw0KKwlj b25zdCB1bnNpZ25lZCBtYXhTVjEgPSB0YWJsZU1hc2sgKyAxOw0KKwl1bnNpZ25lZCBzOw0KKw0K KwkvKiBTYW5pdHkgY2hlY2tzICovDQorCWlmIChuYkJpdHMgPCAxKQ0KKwkJcmV0dXJuIEVSUk9S KEdFTkVSSUMpOyAvKiBtaW4gc2l6ZSAqLw0KKw0KKwkvKiBCdWlsZCBEZWNvZGluZyBUYWJsZSAq Lw0KKwlEVGFibGVILT50YWJsZUxvZyA9IChVMTYpbmJCaXRzOw0KKwlEVGFibGVILT5mYXN0TW9k ZSA9IDE7DQorCWZvciAocyA9IDA7IHMgPCBtYXhTVjE7IHMrKykgew0KKwkJZGluZm9bc10ubmV3 U3RhdGUgPSAwOw0KKwkJZGluZm9bc10uc3ltYm9sID0gKEJZVEUpczsNCisJCWRpbmZvW3NdLm5i Qml0cyA9IChCWVRFKW5iQml0czsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorRk9SQ0Vf SU5MSU5FIHNpemVfdCBGU0VfZGVjb21wcmVzc191c2luZ0RUYWJsZV9nZW5lcmljKHZvaWQgKmRz dCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwg Y29uc3QgRlNFX0RUYWJsZSAqZHQsDQorCQkJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGZhc3Qp DQorew0KKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWRzdDsNCisJQllURSAqb3AgPSBv c3RhcnQ7DQorCUJZVEUgKmNvbnN0IG9tYXggPSBvcCArIG1heERzdFNpemU7DQorCUJZVEUgKmNv bnN0IG9saW1pdCA9IG9tYXggLSAzOw0KKw0KKwlCSVRfRFN0cmVhbV90IGJpdEQ7DQorCUZTRV9E U3RhdGVfdCBzdGF0ZTE7DQorCUZTRV9EU3RhdGVfdCBzdGF0ZTI7DQorDQorCS8qIEluaXQgKi8N CisJQ0hFQ0tfRihCSVRfaW5pdERTdHJlYW0oJmJpdEQsIGNTcmMsIGNTcmNTaXplKSk7DQorDQor CUZTRV9pbml0RFN0YXRlKCZzdGF0ZTEsICZiaXRELCBkdCk7DQorCUZTRV9pbml0RFN0YXRlKCZz dGF0ZTIsICZiaXRELCBkdCk7DQorDQorI2RlZmluZSBGU0VfR0VUU1lNQk9MKHN0YXRlUHRyKSBm YXN0ID8gRlNFX2RlY29kZVN5bWJvbEZhc3Qoc3RhdGVQdHIsICZiaXREKSA6IEZTRV9kZWNvZGVT eW1ib2woc3RhdGVQdHIsICZiaXREKQ0KKw0KKwkvKiA0IHN5bWJvbHMgcGVyIGxvb3AgKi8NCisJ Zm9yICg7IChCSVRfcmVsb2FkRFN0cmVhbSgmYml0RCkgPT0gQklUX0RTdHJlYW1fdW5maW5pc2hl ZCkgJiAob3AgPCBvbGltaXQpOyBvcCArPSA0KSB7DQorCQlvcFswXSA9IEZTRV9HRVRTWU1CT0wo JnN0YXRlMSk7DQorDQorCQlpZiAoRlNFX01BWF9UQUJMRUxPRyAqIDIgKyA3ID4gc2l6ZW9mKGJp dEQuYml0Q29udGFpbmVyKSAqIDgpIC8qIFRoaXMgdGVzdCBtdXN0IGJlIHN0YXRpYyAqLw0KKwkJ CUJJVF9yZWxvYWREU3RyZWFtKCZiaXREKTsNCisNCisJCW9wWzFdID0gRlNFX0dFVFNZTUJPTCgm c3RhdGUyKTsNCisNCisJCWlmIChGU0VfTUFYX1RBQkxFTE9HICogNCArIDcgPiBzaXplb2YoYml0 RC5iaXRDb250YWluZXIpICogOCkgLyogVGhpcyB0ZXN0IG11c3QgYmUgc3RhdGljICovDQorCQl7 DQorCQkJaWYgKEJJVF9yZWxvYWREU3RyZWFtKCZiaXREKSA+IEJJVF9EU3RyZWFtX3VuZmluaXNo ZWQpIHsNCisJCQkJb3AgKz0gMjsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJb3Bb Ml0gPSBGU0VfR0VUU1lNQk9MKCZzdGF0ZTEpOw0KKw0KKwkJaWYgKEZTRV9NQVhfVEFCTEVMT0cg KiAyICsgNyA+IHNpemVvZihiaXRELmJpdENvbnRhaW5lcikgKiA4KSAvKiBUaGlzIHRlc3QgbXVz dCBiZSBzdGF0aWMgKi8NCisJCQlCSVRfcmVsb2FkRFN0cmVhbSgmYml0RCk7DQorDQorCQlvcFsz XSA9IEZTRV9HRVRTWU1CT0woJnN0YXRlMik7DQorCX0NCisNCisJLyogdGFpbCAqLw0KKwkvKiBu b3RlIDogQklUX3JlbG9hZERTdHJlYW0oJmJpdEQpID49IEZTRV9EU3RyZWFtX3BhcnRpYWxseUZp bGxlZDsgRW5kcyBhdCBleGFjdGx5IEJJVF9EU3RyZWFtX2NvbXBsZXRlZCAqLw0KKwl3aGlsZSAo MSkgew0KKwkJaWYgKG9wID4gKG9tYXggLSAyKSkNCisJCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90 b29TbWFsbCk7DQorCQkqb3ArKyA9IEZTRV9HRVRTWU1CT0woJnN0YXRlMSk7DQorCQlpZiAoQklU X3JlbG9hZERTdHJlYW0oJmJpdEQpID09IEJJVF9EU3RyZWFtX292ZXJmbG93KSB7DQorCQkJKm9w KysgPSBGU0VfR0VUU1lNQk9MKCZzdGF0ZTIpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJaWYg KG9wID4gKG9tYXggLSAyKSkNCisJCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7DQor CQkqb3ArKyA9IEZTRV9HRVRTWU1CT0woJnN0YXRlMik7DQorCQlpZiAoQklUX3JlbG9hZERTdHJl YW0oJmJpdEQpID09IEJJVF9EU3RyZWFtX292ZXJmbG93KSB7DQorCQkJKm9wKysgPSBGU0VfR0VU U1lNQk9MKCZzdGF0ZTEpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiBvcCAt IG9zdGFydDsNCit9DQorDQorc2l6ZV90IEZTRV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlKHZvaWQg KmRzdCwgc2l6ZV90IG9yaWdpbmFsU2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNT aXplLCBjb25zdCBGU0VfRFRhYmxlICpkdCkNCit7DQorCWNvbnN0IHZvaWQgKnB0ciA9IGR0Ow0K Kwljb25zdCBGU0VfRFRhYmxlSGVhZGVyICpEVGFibGVIID0gKGNvbnN0IEZTRV9EVGFibGVIZWFk ZXIgKilwdHI7DQorCWNvbnN0IFUzMiBmYXN0TW9kZSA9IERUYWJsZUgtPmZhc3RNb2RlOw0KKw0K KwkvKiBzZWxlY3QgZmFzdCBtb2RlIChzdGF0aWMpICovDQorCWlmIChmYXN0TW9kZSkNCisJCXJl dHVybiBGU0VfZGVjb21wcmVzc191c2luZ0RUYWJsZV9nZW5lcmljKGRzdCwgb3JpZ2luYWxTaXpl LCBjU3JjLCBjU3JjU2l6ZSwgZHQsIDEpOw0KKwlyZXR1cm4gRlNFX2RlY29tcHJlc3NfdXNpbmdE VGFibGVfZ2VuZXJpYyhkc3QsIG9yaWdpbmFsU2l6ZSwgY1NyYywgY1NyY1NpemUsIGR0LCAwKTsN Cit9DQorDQorc2l6ZV90IEZTRV9kZWNvbXByZXNzX3drc3Aodm9pZCAqZHN0LCBzaXplX3QgZHN0 Q2FwYWNpdHksIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdW5zaWduZWQgbWF4 TG9nLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3sNCisJY29uc3Qg QllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKiljU3JjOw0KKwljb25zdCBCWVRFICpp cCA9IGlzdGFydDsNCisJdW5zaWduZWQgdGFibGVMb2c7DQorCXVuc2lnbmVkIG1heFN5bWJvbFZh bHVlID0gRlNFX01BWF9TWU1CT0xfVkFMVUU7DQorCXNpemVfdCBOQ291bnRMZW5ndGg7DQorDQor CUZTRV9EVGFibGUgKmR0Ow0KKwlzaG9ydCAqY291bnRpbmc7DQorCXNpemVfdCBzcGFjZVVzZWQz MiA9IDA7DQorDQorCUZTRV9TVEFUSUNfQVNTRVJUKHNpemVvZihGU0VfRFRhYmxlKSA9PSBzaXpl b2YoVTMyKSk7DQorDQorCWR0ID0gKEZTRV9EVGFibGUgKikoKFUzMiAqKXdvcmtzcGFjZSArIHNw YWNlVXNlZDMyKTsNCisJc3BhY2VVc2VkMzIgKz0gRlNFX0RUQUJMRV9TSVpFX1UzMihtYXhMb2cp Ow0KKwljb3VudGluZyA9IChzaG9ydCAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIp Ow0KKwlzcGFjZVVzZWQzMiArPSBBTElHTihzaXplb2Yoc2hvcnQpICogKEZTRV9NQVhfU1lNQk9M X1ZBTFVFICsgMSksIHNpemVvZihVMzIpKSA+PiAyOw0KKw0KKwlpZiAoKHNwYWNlVXNlZDMyIDw8 IDIpID4gd29ya3NwYWNlU2l6ZSkNCisJCXJldHVybiBFUlJPUih0YWJsZUxvZ190b29MYXJnZSk7 DQorCXdvcmtzcGFjZSA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsNCisJd29ya3Nw YWNlU2l6ZSAtPSAoc3BhY2VVc2VkMzIgPDwgMik7DQorDQorCS8qIG5vcm1hbCBGU0UgZGVjb2Rp bmcgbW9kZSAqLw0KKwlOQ291bnRMZW5ndGggPSBGU0VfcmVhZE5Db3VudChjb3VudGluZywgJm1h eFN5bWJvbFZhbHVlLCAmdGFibGVMb2csIGlzdGFydCwgY1NyY1NpemUpOw0KKwlpZiAoRlNFX2lz RXJyb3IoTkNvdW50TGVuZ3RoKSkNCisJCXJldHVybiBOQ291bnRMZW5ndGg7DQorCS8vIGlmIChO Q291bnRMZW5ndGggPj0gY1NyY1NpemUpIHJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsgICAv KiB0b28gc21hbGwgaW5wdXQgc2l6ZTsgc3VwcG9zZWQgdG8gYmUgYWxyZWFkeSBjaGVja2VkIGlu IE5Db3VudExlbmd0aCwgb25seSByZW1haW5pbmcNCisJLy8gY2FzZSA6IE5Db3VudExlbmd0aD09 Y1NyY1NpemUgKi8NCisJaWYgKHRhYmxlTG9nID4gbWF4TG9nKQ0KKwkJcmV0dXJuIEVSUk9SKHRh YmxlTG9nX3Rvb0xhcmdlKTsNCisJaXAgKz0gTkNvdW50TGVuZ3RoOw0KKwljU3JjU2l6ZSAtPSBO Q291bnRMZW5ndGg7DQorDQorCUNIRUNLX0YoRlNFX2J1aWxkRFRhYmxlX3drc3AoZHQsIGNvdW50 aW5nLCBtYXhTeW1ib2xWYWx1ZSwgdGFibGVMb2csIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSkp Ow0KKw0KKwlyZXR1cm4gRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGUoZHN0LCBkc3RDYXBhY2l0 eSwgaXAsIGNTcmNTaXplLCBkdCk7IC8qIGFsd2F5cyByZXR1cm4sIGV2ZW4gaWYgaXQgaXMgYW4g ZXJyb3IgY29kZSAqLw0KK30NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvaHVmLmggYi94 ZW4vY29tbW9uL3pzdGQvaHVmLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAw MDAwLi4yMTQzZGEyOGQ5DQotLS0gL2Rldi9udWxsDQorKysgYi94ZW4vY29tbW9uL3pzdGQvaHVm LmgNCkBAIC0wLDAgKzEsMjEyIEBADQorLyoNCisgKiBIdWZmbWFuIGNvZGVyLCBwYXJ0IG9mIE5l dyBHZW5lcmF0aW9uIEVudHJvcHkgbGlicmFyeQ0KKyAqIGhlYWRlciBmaWxlDQorICogQ29weXJp Z2h0IChDKSAyMDEzLTIwMTYsIFlhbm4gQ29sbGV0Lg0KKyAqDQorICogQlNEIDItQ2xhdXNlIExp Y2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhw KQ0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm b3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisgKg0K KyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi b3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisgKiBp biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg dGhlDQorICogZGlzdHJpYnV0aW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIg QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U DQorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ VFkgQU5EIEZJVE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05UUklC VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwNCisg KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H LCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhFT1JZ IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig VE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICoNCisgKiBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeSBpdCB1bmRlcg0KKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdA0K KyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgi R1BMIikgb3IgQlNEIGxpY2Vuc2UNCisgKiAoIkJTRCIpLg0KKyAqDQorICogWW91IGNhbiBjb250 YWN0IHRoZSBhdXRob3IgYXQgOg0KKyAqIC0gU291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dp dGh1Yi5jb20vQ3lhbjQ5NzMvRmluaXRlU3RhdGVFbnRyb3B5DQorICovDQorI2lmbmRlZiBIVUZf SF8yOTg3MzQyMzQNCisjZGVmaW5lIEhVRl9IXzI5ODczNDIzNA0KKw0KKy8qICoqKiBEZXBlbmRl bmNpZXMgKioqICovDQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+IC8qIHNpemVfdCAqLw0KKw0K Ky8qICoqKiAgIFRvb2wgZnVuY3Rpb25zICoqKiAqLw0KKyNkZWZpbmUgSFVGX0JMT0NLU0laRV9N QVggKDEyOCAqIDEwMjQpIC8qKjwgbWF4aW11bSBpbnB1dCBzaXplIGZvciBhIHNpbmdsZSBibG9j ayBjb21wcmVzc2VkIHdpdGggSFVGX2NvbXByZXNzICovDQorc2l6ZV90IEhVRl9jb21wcmVzc0Jv dW5kKHNpemVfdCBzaXplKTsgLyoqPCBtYXhpbXVtIGNvbXByZXNzZWQgc2l6ZSAod29yc3QgY2Fz ZSkgKi8NCisNCisvKiBFcnJvciBNYW5hZ2VtZW50ICovDQordW5zaWduZWQgSFVGX2lzRXJyb3Io c2l6ZV90IGNvZGUpOyAvKio8IHRlbGxzIGlmIGEgcmV0dXJuIHZhbHVlIGlzIGFuIGVycm9yIGNv ZGUgKi8NCisNCisvKiAqKiogICBBZHZhbmNlZCBmdW5jdGlvbiAgICoqKiAqLw0KKw0KKy8qKiBI VUZfY29tcHJlc3M0WF93a3NwKCkgOg0KKyogICBTYW1lIGFzIEhVRl9jb21wcmVzczIoKSwgYnV0 IHVzZXMgZXh0ZXJuYWxseSBhbGxvY2F0ZWQgYHdvcmtTcGFjZWAsIHdoaWNoIG11c3QgYmUgYSB0 YWJsZSBvZiA+PSAxMDI0IHVuc2lnbmVkICovDQorc2l6ZV90IEhVRl9jb21wcmVzczRYX3drc3Ao dm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6 ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nLCB2b2lkICp3b3Jr U3BhY2UsDQorCQkJICAgc2l6ZV90IHdrc3BTaXplKTsgLyoqPCBgd29ya1NwYWNlYCBtdXN0IGJl IGEgdGFibGUgb2YgYXQgbGVhc3QgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiB1bnNp Z25lZCAqLw0KKw0KKy8qICoqKiBEZXBlbmRlbmNpZXMgKioqICovDQorI2luY2x1ZGUgIm1lbS5o IiAvKiBVMzIgKi8NCisNCisvKiAqKiogQ29uc3RhbnRzICoqKiAqLw0KKyNkZWZpbmUgSFVGX1RB QkxFTE9HX01BWCAxMiAgICAgLyogbWF4IGNvbmZpZ3VyZWQgdGFibGVMb2cgKGZvciBzdGF0aWMg YWxsb2NhdGlvbik7IGNhbiBiZSBtb2RpZmllZCB1cCB0byBIVUZfQUJTT0xVVEVNQVhfVEFCTEVM T0cgKi8NCisjZGVmaW5lIEhVRl9UQUJMRUxPR19ERUZBVUxUIDExIC8qIHRhYmxlTG9nIGJ5IGRl ZmF1bHQsIHdoZW4gbm90IHNwZWNpZmllZCAqLw0KKyNkZWZpbmUgSFVGX1NZTUJPTFZBTFVFX01B WCAyNTUNCisNCisjZGVmaW5lIEhVRl9UQUJMRUxPR19BQlNPTFVURU1BWCAxNSAvKiBhYnNvbHV0 ZSBsaW1pdCBvZiBIVUZfTUFYX1RBQkxFTE9HLiBCZXlvbmQgdGhhdCB2YWx1ZSwgY29kZSBkb2Vz IG5vdCB3b3JrICovDQorI2lmIChIVUZfVEFCTEVMT0dfTUFYID4gSFVGX1RBQkxFTE9HX0FCU09M VVRFTUFYKQ0KKyNlcnJvciAiSFVGX1RBQkxFTE9HX01BWCBpcyB0b28gbGFyZ2UgISINCisjZW5k aWYNCisNCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAg U3RhdGljIGFsbG9jYXRpb24NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovDQorLyogSFVGIGJ1ZmZlciBib3VuZHMgKi8NCisjZGVmaW5lIEhVRl9DVEFCTEVCT1VO RCAxMjkNCisjZGVmaW5lIEhVRl9CTE9DS0JPVU5EKHNpemUpIChzaXplICsgKHNpemUgPj4gOCkg KyA4KQkJCSAvKiBvbmx5IHRydWUgaWYgaW5jb21wcmVzc2libGUgcHJlLWZpbHRlcmVkIHdpdGgg ZmFzdCBoZXVyaXN0aWMgKi8NCisjZGVmaW5lIEhVRl9DT01QUkVTU0JPVU5EKHNpemUpIChIVUZf Q1RBQkxFQk9VTkQgKyBIVUZfQkxPQ0tCT1VORChzaXplKSkgLyogTWFjcm8gdmVyc2lvbiwgdXNl ZnVsIGZvciBzdGF0aWMgYWxsb2NhdGlvbiAqLw0KKw0KKy8qIHN0YXRpYyBhbGxvY2F0aW9uIG9m IEhVRidzIENvbXByZXNzaW9uIFRhYmxlICovDQorI2RlZmluZSBIVUZfQ1JFQVRFX1NUQVRJQ19D VEFCTEUobmFtZSwgbWF4U3ltYm9sVmFsdWUpIFwNCisJVTMyIG5hbWUjI2hiW21heFN5bWJvbFZh bHVlICsgMV07ICAgICAgICAgICAgICBcDQorCXZvaWQgKm5hbWUjI2h2ID0gJihuYW1lIyNoYik7 ICAgICAgICAgICAgICAgICAgXA0KKwlIVUZfQ0VsdCAqbmFtZSA9IChIVUZfQ0VsdCAqKShuYW1l IyNodikgLyogbm8gZmluYWwgOyAqLw0KKw0KKy8qIHN0YXRpYyBhbGxvY2F0aW9uIG9mIEhVRidz IERUYWJsZSAqLw0KK3R5cGVkZWYgVTMyIEhVRl9EVGFibGU7DQorI2RlZmluZSBIVUZfRFRBQkxF X1NJWkUobWF4VGFibGVMb2cpICgxICsgKDEgPDwgKG1heFRhYmxlTG9nKSkpDQorI2RlZmluZSBI VUZfQ1JFQVRFX1NUQVRJQ19EVEFCTEVYMihEVGFibGUsIG1heFRhYmxlTG9nKSBIVUZfRFRhYmxl IERUYWJsZVtIVUZfRFRBQkxFX1NJWkUoKG1heFRhYmxlTG9nKS0xKV0gPSB7KChVMzIpKChtYXhU YWJsZUxvZyktMSkgKiAweDAxMDAwMDAxKX0NCisjZGVmaW5lIEhVRl9DUkVBVEVfU1RBVElDX0RU QUJMRVg0KERUYWJsZSwgbWF4VGFibGVMb2cpIEhVRl9EVGFibGUgRFRhYmxlW0hVRl9EVEFCTEVf U0laRShtYXhUYWJsZUxvZyldID0geygoVTMyKShtYXhUYWJsZUxvZykqMHgwMTAwMDAwMSl9DQor DQorLyogVGhlIHdvcmtzcGFjZSBtdXN0IGhhdmUgYWxpZ25tZW50IGF0IGxlYXN0IDQgYW5kIGJl IGF0IGxlYXN0IHRoaXMgbGFyZ2UgKi8NCisjZGVmaW5lIEhVRl9DT01QUkVTU19XT1JLU1BBQ0Vf U0laRSAoNiA8PCAxMCkNCisjZGVmaW5lIEhVRl9DT01QUkVTU19XT1JLU1BBQ0VfU0laRV9VMzIg KEhVRl9DT01QUkVTU19XT1JLU1BBQ0VfU0laRSAvIHNpemVvZihVMzIpKQ0KKw0KKy8qIFRoZSB3 b3Jrc3BhY2UgbXVzdCBoYXZlIGFsaWdubWVudCBhdCBsZWFzdCA0IGFuZCBiZSBhdCBsZWFzdCB0 aGlzIGxhcmdlICovDQorI2RlZmluZSBIVUZfREVDT01QUkVTU19XT1JLU1BBQ0VfU0laRSAoMyA8 PCAxMCkNCisjZGVmaW5lIEhVRl9ERUNPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiAoSFVGX0RF Q09NUFJFU1NfV09SS1NQQUNFX1NJWkUgLyBzaXplb2YoVTMyKSkNCisNCisvKiAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgQWR2YW5jZWQgZGVjb21wcmVzc2lv biBmdW5jdGlvbnMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov DQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFhfREN0eF93a3NwKEhVRl9EVGFibGUgKmRjdHgsIHZv aWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6 ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7IC8qKjwgZGVjb2RlcyBS TEUgYW5kIHVuY29tcHJlc3NlZCAqLw0KK3NpemVfdCBIVUZfZGVjb21wcmVzczRYX2h1Zk9ubHlf d2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2 b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwNCisJCQkJc2l6ZV90 IHdvcmtzcGFjZVNpemUpOwkJCQkJCQkgICAgICAgLyoqPCBjb25zaWRlcnMgUkxFIGFuZCB1bmNv bXByZXNzZWQgYXMgZXJyb3JzICovDQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFgyX0RDdHhfd2tz cChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lk ICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwNCisJCQkJICAgc2l6ZV90 IHdvcmtzcGFjZVNpemUpOyAvKio8IHNpbmdsZS1zeW1ib2wgZGVjb2RlciAqLw0KK3NpemVfdCBI VUZfZGVjb21wcmVzczRYNF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBz aXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3 b3Jrc3BhY2UsDQorCQkJCSAgIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsgLyoqPCBkb3VibGUtc3lt Ym9scyBkZWNvZGVyICovDQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKg0KKyogIEhVRiBkZXRhaWxlZCBBUEkNCisqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorLyohDQorSFVGX2NvbXByZXNzKCkgZG9lcyB0aGUgZm9sbG93 aW5nOg0KKzEuIGNvdW50IHN5bWJvbCBvY2N1cnJlbmNlIGZyb20gc291cmNlW10gaW50byB0YWJs ZSBjb3VudFtdIHVzaW5nIEZTRV9jb3VudCgpDQorMi4gKG9wdGlvbmFsKSByZWZpbmUgdGFibGVM b2cgdXNpbmcgSFVGX29wdGltYWxUYWJsZUxvZygpDQorMy4gYnVpbGQgSHVmZm1hbiB0YWJsZSBm cm9tIGNvdW50IHVzaW5nIEhVRl9idWlsZENUYWJsZSgpDQorNC4gc2F2ZSBIdWZmbWFuIHRhYmxl IHRvIG1lbW9yeSBidWZmZXIgdXNpbmcgSFVGX3dyaXRlQ1RhYmxlX3drc3AoKQ0KKzUuIGVuY29k ZSB0aGUgZGF0YSBzdHJlYW0gdXNpbmcgSFVGX2NvbXByZXNzNFhfdXNpbmdDVGFibGUoKQ0KKw0K K1RoZSBmb2xsb3dpbmcgQVBJIGFsbG93cyB0YXJnZXRpbmcgc3BlY2lmaWMgc3ViLWZ1bmN0aW9u cyBmb3IgYWR2YW5jZWQgdGFza3MuDQorRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdG8gY29t cHJlc3Mgc2V2ZXJhbCBibG9ja3MgdXNpbmcgdGhlIHNhbWUgJ0NUYWJsZScsDQorb3IgdG8gc2F2 ZSBhbmQgcmVnZW5lcmF0ZSAnQ1RhYmxlJyB1c2luZyBleHRlcm5hbCBtZXRob2RzLg0KKyovDQor LyogRlNFX2NvdW50KCkgOiBmaW5kIGl0IHdpdGhpbiAiZnNlLmgiICovDQordW5zaWduZWQgSFVG X29wdGltYWxUYWJsZUxvZyh1bnNpZ25lZCBtYXhUYWJsZUxvZywgc2l6ZV90IHNyY1NpemUsIHVu c2lnbmVkIG1heFN5bWJvbFZhbHVlKTsNCit0eXBlZGVmIHN0cnVjdCBIVUZfQ0VsdF9zIEhVRl9D RWx0OyAvKiBpbmNvbXBsZXRlIHR5cGUgKi8NCitzaXplX3QgSFVGX3dyaXRlQ1RhYmxlX3drc3Ao dm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3QgSFVGX0NFbHQgKkNUYWJsZSwgdW5z aWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIGh1ZmZMb2csIHZvaWQgKndvcmtzcGFjZSwg c2l6ZV90IHdvcmtzcGFjZVNpemUpOw0KK3NpemVfdCBIVUZfY29tcHJlc3M0WF91c2luZ0NUYWJs ZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNT aXplLCBjb25zdCBIVUZfQ0VsdCAqQ1RhYmxlKTsNCisNCit0eXBlZGVmIGVudW0gew0KKwlIVUZf cmVwZWF0X25vbmUsICAvKio8IENhbm5vdCB1c2UgdGhlIHByZXZpb3VzIHRhYmxlICovDQorCUhV Rl9yZXBlYXRfY2hlY2ssIC8qKjwgQ2FuIHVzZSB0aGUgcHJldmlvdXMgdGFibGUgYnV0IGl0IG11 c3QgYmUgY2hlY2tlZC4gTm90ZSA6IFRoZSBwcmV2aW91cyB0YWJsZSBtdXN0IGhhdmUgYmVlbiBj b25zdHJ1Y3RlZCBieSBIVUZfY29tcHJlc3N7MSwNCisJCQkgICAgIDR9WF9yZXBlYXQgKi8NCisJ SFVGX3JlcGVhdF92YWxpZCAgLyoqPCBDYW4gdXNlIHRoZSBwcmV2aW91cyB0YWJsZSBhbmQgaXQg aXMgYXN1bWVkIHRvIGJlIHZhbGlkICovDQorfSBIVUZfcmVwZWF0Ow0KKy8qKiBIVUZfY29tcHJl c3M0WF9yZXBlYXQoKSA6DQorKiAgIFNhbWUgYXMgSFVGX2NvbXByZXNzNFhfd2tzcCgpLCBidXQg Y29uc2lkZXJzIHVzaW5nIGh1ZlRhYmxlIGlmICpyZXBlYXQgIT0gSFVGX3JlcGVhdF9ub25lLg0K KyogICBJZiBpdCB1c2VzIGh1ZlRhYmxlIGl0IGRvZXMgbm90IG1vZGlmeSBodWZUYWJsZSBvciBy ZXBlYXQuDQorKiAgIElmIGl0IGRvZXNuJ3QsIGl0IHNldHMgKnJlcGVhdCA9IEhVRl9yZXBlYXRf bm9uZSwgYW5kIGl0IHNldHMgaHVmVGFibGUgdG8gdGhlIHRhYmxlIHVzZWQuDQorKiAgIElmIHBy ZWZlclJlcGVhdCB0aGVuIHRoZSBvbGQgdGFibGUgd2lsbCBhbHdheXMgYmUgdXNlZCBpZiB2YWxp ZC4gKi8NCitzaXplX3QgSFVGX2NvbXByZXNzNFhfcmVwZWF0KHZvaWQgKmRzdCwgc2l6ZV90IGRz dFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJv bFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywgdm9pZCAqd29ya1NwYWNlLA0KKwkJCSAgICAgc2l6 ZV90IHdrc3BTaXplLCBIVUZfQ0VsdCAqaHVmVGFibGUsIEhVRl9yZXBlYXQgKnJlcGVhdCwNCisJ CQkgICAgIGludCBwcmVmZXJSZXBlYXQpOyAvKio8IGB3b3JrU3BhY2VgIG11c3QgYmUgYSB0YWJs ZSBvZiBhdCBsZWFzdCBIVUZfQ09NUFJFU1NfV09SS1NQQUNFX1NJWkVfVTMyIHVuc2lnbmVkICov DQorDQorLyoqIEhVRl9idWlsZENUYWJsZV93a3NwKCkgOg0KKyAqICBTYW1lIGFzIEhVRl9idWls ZENUYWJsZSgpLCBidXQgdXNpbmcgZXh0ZXJuYWxseSBhbGxvY2F0ZWQgc2NyYXRjaCBidWZmZXIu DQorICogIGB3b3JrU3BhY2VgIG11c3QgYmUgYWxpZ25lZCBvbiA0LWJ5dGVzIGJvdW5kYXJpZXMs IGFuZCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBhIHRhYmxlIG9mIDEwMjQgdW5zaWduZWQuDQor ICovDQorc2l6ZV90IEhVRl9idWlsZENUYWJsZV93a3NwKEhVRl9DRWx0ICp0cmVlLCBjb25zdCBV MzIgKmNvdW50LCBVMzIgbWF4U3ltYm9sVmFsdWUsIFUzMiBtYXhOYkJpdHMsIHZvaWQgKndvcmtT cGFjZSwgc2l6ZV90IHdrc3BTaXplKTsNCisNCisvKiEgSFVGX3JlYWRTdGF0cygpIDoNCisJUmVh ZCBjb21wYWN0IEh1ZmZtYW4gdHJlZSwgc2F2ZWQgYnkgSFVGX3dyaXRlQ1RhYmxlKCkuDQorCWBo dWZmV2VpZ2h0YCBpcyBkZXN0aW5hdGlvbiBidWZmZXIuDQorCUByZXR1cm4gOiBzaXplIHJlYWQg ZnJvbSBgc3JjYCAsIG9yIGFuIGVycm9yIENvZGUgLg0KKwlOb3RlIDogTmVlZGVkIGJ5IEhVRl9y ZWFkQ1RhYmxlKCkgYW5kIEhVRl9yZWFkRFRhYmxlWG4oKSAuICovDQorc2l6ZV90IEhVRl9yZWFk U3RhdHNfd2tzcChCWVRFICpodWZmV2VpZ2h0LCBzaXplX3QgaHdTaXplLCBVMzIgKnJhbmtTdGF0 cywgVTMyICpuYlN5bWJvbHNQdHIsIFUzMiAqdGFibGVMb2dQdHIsIGNvbnN0IHZvaWQgKnNyYywg c2l6ZV90IHNyY1NpemUsDQorCQkJICB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VT aXplKTsNCisNCisvKiogSFVGX3JlYWRDVGFibGUoKSA6DQorKiAgIExvYWRpbmcgYSBDVGFibGUg c2F2ZWQgd2l0aCBIVUZfd3JpdGVDVGFibGUoKSAqLw0KK3NpemVfdCBIVUZfcmVhZENUYWJsZV93 a3NwKEhVRl9DRWx0ICpDVGFibGUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCBjb25zdCB2b2lk ICpzcmMsIHNpemVfdCBzcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VT aXplKTsNCisNCisvKg0KK0hVRl9kZWNvbXByZXNzKCkgZG9lcyB0aGUgZm9sbG93aW5nOg0KKzEu IHNlbGVjdCB0aGUgZGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKFgyLCBYNCkgYmFzZWQgb24gcHJl LWNvbXB1dGVkIGhldXJpc3RpY3MNCisyLiBidWlsZCBIdWZmbWFuIHRhYmxlIGZyb20gc2F2ZSwg dXNpbmcgSFVGX3JlYWREVGFibGVYbigpDQorMy4gZGVjb2RlIDEgb3IgNCBzZWdtZW50cyBpbiBw YXJhbGxlbCB1c2luZyBIVUZfZGVjb21wcmVzc1NYbl91c2luZ0RUYWJsZQ0KKyovDQorDQorLyoq IEhVRl9zZWxlY3REZWNvZGVyKCkgOg0KKyogICBUZWxscyB3aGljaCBkZWNvZGVyIGlzIGxpa2Vs eSB0byBkZWNvZGUgZmFzdGVyLA0KKyogICBiYXNlZCBvbiBhIHNldCBvZiBwcmUtZGV0ZXJtaW5l ZCBtZXRyaWNzLg0KKyogICBAcmV0dXJuIDogMD09SFVGX2RlY29tcHJlc3M0WDIsIDE9PUhVRl9k ZWNvbXByZXNzNFg0IC4NCisqICAgQXNzdW1wdGlvbiA6IDAgPCBjU3JjU2l6ZSA8IGRzdFNpemUg PD0gMTI4IEtCICovDQorVTMyIEhVRl9zZWxlY3REZWNvZGVyKHNpemVfdCBkc3RTaXplLCBzaXpl X3QgY1NyY1NpemUpOw0KKw0KK3NpemVfdCBIVUZfcmVhZERUYWJsZVgyX3drc3AoSFVGX0RUYWJs ZSAqRFRhYmxlLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCB2b2lkICp3b3Jrc3Bh Y2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsNCitzaXplX3QgSFVGX3JlYWREVGFibGVYNF93a3Nw KEhVRl9EVGFibGUgKkRUYWJsZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9p ZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7DQorDQorc2l6ZV90IEhVRl9kZWNv bXByZXNzNFhfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qg dm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpOw0K K3NpemVfdCBIVUZfZGVjb21wcmVzczRYMl91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBt YXhEc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9E VGFibGUgKkRUYWJsZSk7DQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFg0X3VzaW5nRFRhYmxlKHZv aWQgKmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3Jj U2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKTsNCisNCisvKiBzaW5nbGUgc3RyZWFtIHZh cmlhbnRzICovDQorDQorc2l6ZV90IEhVRl9jb21wcmVzczFYX3drc3Aodm9pZCAqZHN0LCBzaXpl X3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4 U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nLCB2b2lkICp3b3JrU3BhY2UsDQorCQkJICAg c2l6ZV90IHdrc3BTaXplKTsgLyoqPCBgd29ya1NwYWNlYCBtdXN0IGJlIGEgdGFibGUgb2YgYXQg bGVhc3QgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiB1bnNpZ25lZCAqLw0KK3NpemVf dCBIVUZfY29tcHJlc3MxWF91c2luZ0NUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBj b25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBIVUZfQ0VsdCAqQ1RhYmxlKTsN CisvKiogSFVGX2NvbXByZXNzMVhfcmVwZWF0KCkgOg0KKyogICBTYW1lIGFzIEhVRl9jb21wcmVz czFYX3drc3AoKSwgYnV0IGNvbnNpZGVycyB1c2luZyBodWZUYWJsZSBpZiAqcmVwZWF0ICE9IEhV Rl9yZXBlYXRfbm9uZS4NCisqICAgSWYgaXQgdXNlcyBodWZUYWJsZSBpdCBkb2VzIG5vdCBtb2Rp ZnkgaHVmVGFibGUgb3IgcmVwZWF0Lg0KKyogICBJZiBpdCBkb2Vzbid0LCBpdCBzZXRzICpyZXBl YXQgPSBIVUZfcmVwZWF0X25vbmUsIGFuZCBpdCBzZXRzIGh1ZlRhYmxlIHRvIHRoZSB0YWJsZSB1 c2VkLg0KKyogICBJZiBwcmVmZXJSZXBlYXQgdGhlbiB0aGUgb2xkIHRhYmxlIHdpbGwgYWx3YXlz IGJlIHVzZWQgaWYgdmFsaWQuICovDQorc2l6ZV90IEhVRl9jb21wcmVzczFYX3JlcGVhdCh2b2lk ICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCB1 bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwgdW5zaWduZWQgdGFibGVMb2csIHZvaWQgKndvcmtTcGFj ZSwNCisJCQkgICAgIHNpemVfdCB3a3NwU2l6ZSwgSFVGX0NFbHQgKmh1ZlRhYmxlLCBIVUZfcmVw ZWF0ICpyZXBlYXQsDQorCQkJICAgICBpbnQgcHJlZmVyUmVwZWF0KTsgLyoqPCBgd29ya1NwYWNl YCBtdXN0IGJlIGEgdGFibGUgb2YgYXQgbGVhc3QgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpF X1UzMiB1bnNpZ25lZCAqLw0KKw0KK3NpemVfdCBIVUZfZGVjb21wcmVzczFYX0RDdHhfd2tzcChI VUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpj U3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNp emUpOw0KK3NpemVfdCBIVUZfZGVjb21wcmVzczFYMl9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0 eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNT cmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsDQorCQkJCSAgIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsg LyoqPCBzaW5nbGUtc3ltYm9sIGRlY29kZXIgKi8NCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWDRf REN0eF93a3NwKEhVRl9EVGFibGUgKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNv bnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLA0KKwkJCQkg ICBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7IC8qKjwgZG91YmxlLXN5bWJvbHMgZGVjb2RlciAqLw0K Kw0KK3NpemVfdCBIVUZfZGVjb21wcmVzczFYX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90 IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwNCisJCQkJICAg IGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSk7IC8qKjwgYXV0b21hdGljIHNlbGVjdGlvbiBvZiBz aW5nIG9yIGRvdWJsZSBzeW1ib2wgZGVjb2RlciwgYmFzZWQgb24gRFRhYmxlICovDQorc2l6ZV90 IEhVRl9kZWNvbXByZXNzMVgyX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IG1heERzdFNp emUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAq RFRhYmxlKTsNCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWDRfdXNpbmdEVGFibGUodm9pZCAqZHN0 LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBj b25zdCBIVUZfRFRhYmxlICpEVGFibGUpOw0KKw0KKyNlbmRpZiAvKiBIVUZfSF8yOTg3MzQyMzQg Ki8NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvaHVmX2RlY29tcHJlc3MuYyBiL3hlbi9j b21tb24venN0ZC9odWZfZGVjb21wcmVzcy5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXgg MDAwMDAwMDAwMC4uNjUyNjQ4MjA0Nw0KLS0tIC9kZXYvbnVsbA0KKysrIGIveGVuL2NvbW1vbi96 c3RkL2h1Zl9kZWNvbXByZXNzLmMNCkBAIC0wLDAgKzEsOTYwIEBADQorLyoNCisgKiBIdWZmbWFu IGRlY29kZXIsIHBhcnQgb2YgTmV3IEdlbmVyYXRpb24gRW50cm9weSBsaWJyYXJ5DQorICogQ29w eXJpZ2h0IChDKSAyMDEzLTIwMTYsIFlhbm4gQ29sbGV0Lg0KKyAqDQorICogQlNEIDItQ2xhdXNl IExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2Uu cGhwKQ0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisg Kg0KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl IGFib3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJp bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKyAqIGNvcHlyaWdodCBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXINCisg KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp dGggdGhlDQorICogZGlzdHJpYnV0aW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJ UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UDQorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisgKiBPV05FUiBPUiBDT05U UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwN CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE SU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQorICogVEhF T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg T1IgVE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQorICoNCisgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeSBpdCB1bmRlcg0KKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVj dA0KKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl ICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UNCisgKiAoIkJTRCIpLg0KKyAqDQorICogWW91IGNhbiBj b250YWN0IHRoZSBhdXRob3IgYXQgOg0KKyAqIC0gU291cmNlIHJlcG9zaXRvcnkgOiBodHRwczov L2dpdGh1Yi5jb20vQ3lhbjQ5NzMvRmluaXRlU3RhdGVFbnRyb3B5DQorICovDQorDQorLyogKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioNCisqICBDb21waWxlciBzcGVjaWZpY3MNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNkZWZpbmUgRk9SQ0VfSU5M SU5FIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUNCisNCisvKiAqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIERlcGVuZGVuY2ll cw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovDQorI2luY2x1ZGUgImJpdHN0cmVhbS5oIiAvKiBCSVRfKiAqLw0KKyNpbmNs dWRlICJmc2UuaCIgICAgICAgLyogaGVhZGVyIGNvbXByZXNzaW9uICovDQorI2luY2x1ZGUgImh1 Zi5oIg0KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPg0KKyNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4NCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIG1lbWNweSwgbWVtc2V0ICovDQor DQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioNCisqICBFcnJvciBNYW5hZ2VtZW50DQorKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVmaW5lIEhV Rl9TVEFUSUNfQVNTRVJUKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQor CXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc DQorCQllbnVtIHsgSFVGX3N0YXRpY19hc3NlcnQgPSAxIC8gKGludCkoISEoYykpIH07IFwNCisJ fSAvKiB1c2Ugb25seSAqYWZ0ZXIqIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAqLw0KKw0KKy8qLSoq KioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiAgZ2VuZXJpYyBEVGFibGVEZXNjICAgICAg ICovDQorLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3R5cGVkZWYgc3RydWN0 IHsNCisJQllURSBtYXhUYWJsZUxvZzsNCisJQllURSB0YWJsZVR5cGU7DQorCUJZVEUgdGFibGVM b2c7DQorCUJZVEUgcmVzZXJ2ZWQ7DQorfSBEVGFibGVEZXNjOw0KKw0KK3N0YXRpYyBEVGFibGVE ZXNjIEhVRl9nZXREVGFibGVEZXNjKGNvbnN0IEhVRl9EVGFibGUgKnRhYmxlKQ0KK3sNCisJRFRh YmxlRGVzYyBkdGQ7DQorCW1lbWNweSgmZHRkLCB0YWJsZSwgc2l6ZW9mKGR0ZCkpOw0KKwlyZXR1 cm4gZHRkOw0KK30NCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogIHNp bmdsZS1zeW1ib2wgZGVjb2RpbmcgICAqLw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisNCit0eXBlZGVmIHN0cnVjdCB7DQorCUJZVEUgYnl0ZTsNCisJQllURSBuYkJpdHM7DQor fSBIVUZfREVsdFgyOyAvKiBzaW5nbGUtc3ltYm9sIGRlY29kaW5nICovDQorDQorc2l6ZV90IEhV Rl9yZWFkRFRhYmxlWDJfd2tzcChIVUZfRFRhYmxlICpEVGFibGUsIGNvbnN0IHZvaWQgKnNyYywg c2l6ZV90IHNyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQor ew0KKwlVMzIgdGFibGVMb2cgPSAwOw0KKwlVMzIgbmJTeW1ib2xzID0gMDsNCisJc2l6ZV90IGlT aXplOw0KKwl2b2lkICpjb25zdCBkdFB0ciA9IERUYWJsZSArIDE7DQorCUhVRl9ERWx0WDIgKmNv bnN0IGR0ID0gKEhVRl9ERWx0WDIgKilkdFB0cjsNCisNCisJVTMyICpyYW5rVmFsOw0KKwlCWVRF ICpodWZmV2VpZ2h0Ow0KKwlzaXplX3Qgc3BhY2VVc2VkMzIgPSAwOw0KKw0KKwlyYW5rVmFsID0g KFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOw0KKwlzcGFjZVVzZWQzMiArPSBIVUZfVEFC TEVMT0dfQUJTT0xVVEVNQVggKyAxOw0KKwlodWZmV2VpZ2h0ID0gKEJZVEUgKikoKFUzMiAqKXdv cmtzcGFjZSArIHNwYWNlVXNlZDMyKTsNCisJc3BhY2VVc2VkMzIgKz0gQUxJR04oSFVGX1NZTUJP TFZBTFVFX01BWCArIDEsIHNpemVvZihVMzIpKSA+PiAyOw0KKw0KKwlpZiAoKHNwYWNlVXNlZDMy IDw8IDIpID4gd29ya3NwYWNlU2l6ZSkNCisJCXJldHVybiBFUlJPUih0YWJsZUxvZ190b29MYXJn ZSk7DQorCXdvcmtzcGFjZSA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsNCisJd29y a3NwYWNlU2l6ZSAtPSAoc3BhY2VVc2VkMzIgPDwgMik7DQorDQorCUhVRl9TVEFUSUNfQVNTRVJU KHNpemVvZihEVGFibGVEZXNjKSA9PSBzaXplb2YoSFVGX0RUYWJsZSkpOw0KKwkvKiBtZW1zZXQo aHVmZldlaWdodCwgMCwgc2l6ZW9mKGh1ZmZXZWlnaHQpKTsgKi8gLyogaXMgbm90IG5lY2Vzc2Fy eSwgZXZlbiB0aG91Z2ggc29tZSBhbmFseXplciBjb21wbGFpbiAuLi4gKi8NCisNCisJaVNpemUg PSBIVUZfcmVhZFN0YXRzX3drc3AoaHVmZldlaWdodCwgSFVGX1NZTUJPTFZBTFVFX01BWCArIDEs IHJhbmtWYWwsICZuYlN5bWJvbHMsICZ0YWJsZUxvZywgc3JjLCBzcmNTaXplLCB3b3Jrc3BhY2Us IHdvcmtzcGFjZVNpemUpOw0KKwlpZiAoSFVGX2lzRXJyb3IoaVNpemUpKQ0KKwkJcmV0dXJuIGlT aXplOw0KKw0KKwkvKiBUYWJsZSBoZWFkZXIgKi8NCisJew0KKwkJRFRhYmxlRGVzYyBkdGQgPSBI VUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOw0KKwkJaWYgKHRhYmxlTG9nID4gKFUzMikoZHRkLm1h eFRhYmxlTG9nICsgMSkpDQorCQkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsgLyog RFRhYmxlIHRvbyBzbWFsbCwgSHVmZm1hbiB0cmVlIGNhbm5vdCBmaXQgaW4gKi8NCisJCWR0ZC50 YWJsZVR5cGUgPSAwOw0KKwkJZHRkLnRhYmxlTG9nID0gKEJZVEUpdGFibGVMb2c7DQorCQltZW1j cHkoRFRhYmxlLCAmZHRkLCBzaXplb2YoZHRkKSk7DQorCX0NCisNCisJLyogQ2FsY3VsYXRlIHN0 YXJ0aW5nIHZhbHVlIGZvciBlYWNoIHJhbmsgKi8NCisJew0KKwkJVTMyIG4sIG5leHRSYW5rU3Rh cnQgPSAwOw0KKwkJZm9yIChuID0gMTsgbiA8IHRhYmxlTG9nICsgMTsgbisrKSB7DQorCQkJVTMy IGNvbnN0IGN1cnIgPSBuZXh0UmFua1N0YXJ0Ow0KKwkJCW5leHRSYW5rU3RhcnQgKz0gKHJhbmtW YWxbbl0gPDwgKG4gLSAxKSk7DQorCQkJcmFua1ZhbFtuXSA9IGN1cnI7DQorCQl9DQorCX0NCisN CisJLyogZmlsbCBEVGFibGUgKi8NCisJew0KKwkJVTMyIG47DQorCQlmb3IgKG4gPSAwOyBuIDwg bmJTeW1ib2xzOyBuKyspIHsNCisJCQlVMzIgY29uc3QgdyA9IGh1ZmZXZWlnaHRbbl07DQorCQkJ VTMyIGNvbnN0IGxlbmd0aCA9ICgxIDw8IHcpID4+IDE7DQorCQkJVTMyIHU7DQorCQkJSFVGX0RF bHRYMiBEOw0KKwkJCUQuYnl0ZSA9IChCWVRFKW47DQorCQkJRC5uYkJpdHMgPSAoQllURSkodGFi bGVMb2cgKyAxIC0gdyk7DQorCQkJZm9yICh1ID0gcmFua1ZhbFt3XTsgdSA8IHJhbmtWYWxbd10g KyBsZW5ndGg7IHUrKykNCisJCQkJZHRbdV0gPSBEOw0KKwkJCXJhbmtWYWxbd10gKz0gbGVuZ3Ro Ow0KKwkJfQ0KKwl9DQorDQorCXJldHVybiBpU2l6ZTsNCit9DQorDQorc3RhdGljIEJZVEUgSFVG X2RlY29kZVN5bWJvbFgyKEJJVF9EU3RyZWFtX3QgKkRzdHJlYW0sIGNvbnN0IEhVRl9ERWx0WDIg KmR0LCBjb25zdCBVMzIgZHRMb2cpDQorew0KKwlzaXplX3QgY29uc3QgdmFsID0gQklUX2xvb2tC aXRzRmFzdChEc3RyZWFtLCBkdExvZyk7IC8qIG5vdGUgOiBkdExvZyA+PSAxICovDQorCUJZVEUg Y29uc3QgYyA9IGR0W3ZhbF0uYnl0ZTsNCisJQklUX3NraXBCaXRzKERzdHJlYW0sIGR0W3ZhbF0u bmJCaXRzKTsNCisJcmV0dXJuIGM7DQorfQ0KKw0KKyNkZWZpbmUgSFVGX0RFQ09ERV9TWU1CT0xY Ml8wKHB0ciwgRFN0cmVhbVB0cikgKnB0cisrID0gSFVGX2RlY29kZVN5bWJvbFgyKERTdHJlYW1Q dHIsIGR0LCBkdExvZykNCisNCisjZGVmaW5lIEhVRl9ERUNPREVfU1lNQk9MWDJfMShwdHIsIERT dHJlYW1QdHIpICAgICAgICAgXA0KKwlpZiAoWlNURF82NGJpdHMoKSB8fCAoSFVGX1RBQkxFTE9H X01BWCA8PSAxMikpIFwNCisJSFVGX0RFQ09ERV9TWU1CT0xYMl8wKHB0ciwgRFN0cmVhbVB0cikN CisNCisjZGVmaW5lIEhVRl9ERUNPREVfU1lNQk9MWDJfMihwdHIsIERTdHJlYW1QdHIpIFwNCisJ aWYgKFpTVERfNjRiaXRzKCkpICAgICAgICAgICAgICAgICAgICAgXA0KKwlIVUZfREVDT0RFX1NZ TUJPTFgyXzAocHRyLCBEU3RyZWFtUHRyKQ0KKw0KK0ZPUkNFX0lOTElORSBzaXplX3QgSFVGX2Rl Y29kZVN0cmVhbVgyKEJZVEUgKnAsIEJJVF9EU3RyZWFtX3QgKmNvbnN0IGJpdERQdHIsIEJZVEUg KmNvbnN0IHBFbmQsIGNvbnN0IEhVRl9ERWx0WDIgKmNvbnN0IGR0LCBjb25zdCBVMzIgZHRMb2cp DQorew0KKwlCWVRFICpjb25zdCBwU3RhcnQgPSBwOw0KKw0KKwkvKiB1cCB0byA0IHN5bWJvbHMg YXQgYSB0aW1lICovDQorCXdoaWxlICgoQklUX3JlbG9hZERTdHJlYW0oYml0RFB0cikgPT0gQklU X0RTdHJlYW1fdW5maW5pc2hlZCkgJiYgKHAgPD0gcEVuZCAtIDQpKSB7DQorCQlIVUZfREVDT0RF X1NZTUJPTFgyXzIocCwgYml0RFB0cik7DQorCQlIVUZfREVDT0RFX1NZTUJPTFgyXzEocCwgYml0 RFB0cik7DQorCQlIVUZfREVDT0RFX1NZTUJPTFgyXzIocCwgYml0RFB0cik7DQorCQlIVUZfREVD T0RFX1NZTUJPTFgyXzAocCwgYml0RFB0cik7DQorCX0NCisNCisJLyogY2xvc2VyIHRvIHRoZSBl bmQgKi8NCisJd2hpbGUgKChCSVRfcmVsb2FkRFN0cmVhbShiaXREUHRyKSA9PSBCSVRfRFN0cmVh bV91bmZpbmlzaGVkKSAmJiAocCA8IHBFbmQpKQ0KKwkJSFVGX0RFQ09ERV9TWU1CT0xYMl8wKHAs IGJpdERQdHIpOw0KKw0KKwkvKiBubyBtb3JlIGRhdGEgdG8gcmV0cmlldmUgZnJvbSBiaXRzdHJl YW0sIGhlbmNlIG5vIG5lZWQgdG8gcmVsb2FkICovDQorCXdoaWxlIChwIDwgcEVuZCkNCisJCUhV Rl9ERUNPREVfU1lNQk9MWDJfMChwLCBiaXREUHRyKTsNCisNCisJcmV0dXJuIHBFbmQgLSBwU3Rh cnQ7DQorfQ0KKw0KK3N0YXRpYyBzaXplX3QgSFVGX2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGVf aW50ZXJuYWwodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6 ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorew0KKwlCWVRFICpvcCA9 IChCWVRFICopZHN0Ow0KKwlCWVRFICpjb25zdCBvZW5kID0gb3AgKyBkc3RTaXplOw0KKwljb25z dCB2b2lkICpkdFB0ciA9IERUYWJsZSArIDE7DQorCWNvbnN0IEhVRl9ERWx0WDIgKmNvbnN0IGR0 ID0gKGNvbnN0IEhVRl9ERWx0WDIgKilkdFB0cjsNCisJQklUX0RTdHJlYW1fdCBiaXREOw0KKwlE VGFibGVEZXNjIGNvbnN0IGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7DQorCVUzMiBj b25zdCBkdExvZyA9IGR0ZC50YWJsZUxvZzsNCisNCisJew0KKwkJc2l6ZV90IGNvbnN0IGVycm9y Q29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RCwgY1NyYywgY1NyY1NpemUpOw0KKwkJaWYgKEhV Rl9pc0Vycm9yKGVycm9yQ29kZSkpDQorCQkJcmV0dXJuIGVycm9yQ29kZTsNCisJfQ0KKw0KKwlI VUZfZGVjb2RlU3RyZWFtWDIob3AsICZiaXRELCBvZW5kLCBkdCwgZHRMb2cpOw0KKw0KKwkvKiBj aGVjayAqLw0KKwlpZiAoIUJJVF9lbmRPZkRTdHJlYW0oJmJpdEQpKQ0KKwkJcmV0dXJuIEVSUk9S KGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKw0KKwlyZXR1cm4gZHN0U2l6ZTsNCit9DQorDQorc2l6 ZV90IEhVRl9kZWNvbXByZXNzMVgyX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNp emUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAq RFRhYmxlKQ0KK3sNCisJRFRhYmxlRGVzYyBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUp Ow0KKwlpZiAoZHRkLnRhYmxlVHlwZSAhPSAwKQ0KKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOw0K KwlyZXR1cm4gSFVGX2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RT aXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKTsNCit9DQorDQorc2l6ZV90IEhVRl9kZWNvbXBy ZXNzMVgyX0RDdHhfd2tzcChIVUZfRFRhYmxlICpEQ3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RT aXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwg c2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0KKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRF ICopY1NyYzsNCisNCisJc2l6ZV90IGNvbnN0IGhTaXplID0gSFVGX3JlYWREVGFibGVYMl93a3Nw KERDdHgsIGNTcmMsIGNTcmNTaXplLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0KKwlpZiAo SFVGX2lzRXJyb3IoaFNpemUpKQ0KKwkJcmV0dXJuIGhTaXplOw0KKwlpZiAoaFNpemUgPj0gY1Ny Y1NpemUpDQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorCWlwICs9IGhTaXplOw0K KwljU3JjU2l6ZSAtPSBoU2l6ZTsNCisNCisJcmV0dXJuIEhVRl9kZWNvbXByZXNzMVgyX3VzaW5n RFRhYmxlX2ludGVybmFsKGRzdCwgZHN0U2l6ZSwgaXAsIGNTcmNTaXplLCBEQ3R4KTsNCit9DQor DQorc3RhdGljIHNpemVfdCBIVUZfZGVjb21wcmVzczRYMl91c2luZ0RUYWJsZV9pbnRlcm5hbCh2 b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1Np emUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkNCit7DQorCS8qIENoZWNrICovDQorCWlmIChj U3JjU2l6ZSA8IDEwKQ0KKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBz dHJpY3QgbWluaW11bSA6IGp1bXAgdGFibGUgKyAxIGJ5dGUgcGVyIHN0cmVhbSAqLw0KKw0KKwl7 DQorCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAqKWNTcmM7DQorCQlC WVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWRzdDsNCisJCUJZVEUgKmNvbnN0IG9lbmQgPSBv c3RhcnQgKyBkc3RTaXplOw0KKwkJY29uc3Qgdm9pZCAqY29uc3QgZHRQdHIgPSBEVGFibGUgKyAx Ow0KKwkJY29uc3QgSFVGX0RFbHRYMiAqY29uc3QgZHQgPSAoY29uc3QgSFVGX0RFbHRYMiAqKWR0 UHRyOw0KKw0KKwkJLyogSW5pdCAqLw0KKwkJQklUX0RTdHJlYW1fdCBiaXREMTsNCisJCUJJVF9E U3RyZWFtX3QgYml0RDI7DQorCQlCSVRfRFN0cmVhbV90IGJpdEQzOw0KKwkJQklUX0RTdHJlYW1f dCBiaXRENDsNCisJCXNpemVfdCBjb25zdCBsZW5ndGgxID0gWlNURF9yZWFkTEUxNihpc3RhcnQp Ow0KKwkJc2l6ZV90IGNvbnN0IGxlbmd0aDIgPSBaU1REX3JlYWRMRTE2KGlzdGFydCArIDIpOw0K KwkJc2l6ZV90IGNvbnN0IGxlbmd0aDMgPSBaU1REX3JlYWRMRTE2KGlzdGFydCArIDQpOw0KKwkJ c2l6ZV90IGNvbnN0IGxlbmd0aDQgPSBjU3JjU2l6ZSAtIChsZW5ndGgxICsgbGVuZ3RoMiArIGxl bmd0aDMgKyA2KTsNCisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydDEgPSBpc3RhcnQgKyA2OyAv KiBqdW1wVGFibGUgKi8NCisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydDIgPSBpc3RhcnQxICsg bGVuZ3RoMTsNCisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydDMgPSBpc3RhcnQyICsgbGVuZ3Ro MjsNCisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydDQgPSBpc3RhcnQzICsgbGVuZ3RoMzsNCisJ CWNvbnN0IHNpemVfdCBzZWdtZW50U2l6ZSA9IChkc3RTaXplICsgMykgLyA0Ow0KKwkJQllURSAq Y29uc3Qgb3BTdGFydDIgPSBvc3RhcnQgKyBzZWdtZW50U2l6ZTsNCisJCUJZVEUgKmNvbnN0IG9w U3RhcnQzID0gb3BTdGFydDIgKyBzZWdtZW50U2l6ZTsNCisJCUJZVEUgKmNvbnN0IG9wU3RhcnQ0 ID0gb3BTdGFydDMgKyBzZWdtZW50U2l6ZTsNCisJCUJZVEUgKm9wMSA9IG9zdGFydDsNCisJCUJZ VEUgKm9wMiA9IG9wU3RhcnQyOw0KKwkJQllURSAqb3AzID0gb3BTdGFydDM7DQorCQlCWVRFICpv cDQgPSBvcFN0YXJ0NDsNCisJCVUzMiBlbmRTaWduYWw7DQorCQlEVGFibGVEZXNjIGNvbnN0IGR0 ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7DQorCQlVMzIgY29uc3QgZHRMb2cgPSBkdGQu dGFibGVMb2c7DQorDQorCQlpZiAobGVuZ3RoNCA+IGNTcmNTaXplKQ0KKwkJCXJldHVybiBFUlJP Uihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogb3ZlcmZsb3cgKi8NCisJCXsNCisJCQlzaXplX3Qg Y29uc3QgZXJyb3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZiaXREMSwgaXN0YXJ0MSwgbGVuZ3Ro MSk7DQorCQkJaWYgKEhVRl9pc0Vycm9yKGVycm9yQ29kZSkpDQorCQkJCXJldHVybiBlcnJvckNv ZGU7DQorCQl9DQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0 cmVhbSgmYml0RDIsIGlzdGFydDIsIGxlbmd0aDIpOw0KKwkJCWlmIChIVUZfaXNFcnJvcihlcnJv ckNvZGUpKQ0KKwkJCQlyZXR1cm4gZXJyb3JDb2RlOw0KKwkJfQ0KKwkJew0KKwkJCXNpemVfdCBj b25zdCBlcnJvckNvZGUgPSBCSVRfaW5pdERTdHJlYW0oJmJpdEQzLCBpc3RhcnQzLCBsZW5ndGgz KTsNCisJCQlpZiAoSFVGX2lzRXJyb3IoZXJyb3JDb2RlKSkNCisJCQkJcmV0dXJuIGVycm9yQ29k ZTsNCisJCX0NCisJCXsNCisJCQlzaXplX3QgY29uc3QgZXJyb3JDb2RlID0gQklUX2luaXREU3Ry ZWFtKCZiaXRENCwgaXN0YXJ0NCwgbGVuZ3RoNCk7DQorCQkJaWYgKEhVRl9pc0Vycm9yKGVycm9y Q29kZSkpDQorCQkJCXJldHVybiBlcnJvckNvZGU7DQorCQl9DQorDQorCQkvKiAxNi0zMiBzeW1i b2xzIHBlciBsb29wICg0LTggc3ltYm9scyBwZXIgc3RyZWFtKSAqLw0KKwkJZW5kU2lnbmFsID0g QklUX3JlbG9hZERTdHJlYW0oJmJpdEQxKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMikgfCBC SVRfcmVsb2FkRFN0cmVhbSgmYml0RDMpIHwgQklUX3JlbG9hZERTdHJlYW0oJmJpdEQ0KTsNCisJ CWZvciAoOyAoZW5kU2lnbmFsID09IEJJVF9EU3RyZWFtX3VuZmluaXNoZWQpICYmIChvcDQgPCAo b2VuZCAtIDcpKTspIHsNCisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzIob3AxLCAmYml0RDEpOw0K KwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMihvcDIsICZiaXREMik7DQorCQkJSFVGX0RFQ09ERV9T WU1CT0xYMl8yKG9wMywgJmJpdEQzKTsNCisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzIob3A0LCAm Yml0RDQpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMShvcDEsICZiaXREMSk7DQorCQkJSFVG X0RFQ09ERV9TWU1CT0xYMl8xKG9wMiwgJmJpdEQyKTsNCisJCQlIVUZfREVDT0RFX1NZTUJPTFgy XzEob3AzLCAmYml0RDMpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMShvcDQsICZiaXRENCk7 DQorCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8yKG9wMSwgJmJpdEQxKTsNCisJCQlIVUZfREVDT0RF X1NZTUJPTFgyXzIob3AyLCAmYml0RDIpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMihvcDMs ICZiaXREMyk7DQorCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8yKG9wNCwgJmJpdEQ0KTsNCisJCQlI VUZfREVDT0RFX1NZTUJPTFgyXzAob3AxLCAmYml0RDEpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9M WDJfMChvcDIsICZiaXREMik7DQorCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8wKG9wMywgJmJpdEQz KTsNCisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzAob3A0LCAmYml0RDQpOw0KKwkJCWVuZFNpZ25h bCA9IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMSkgfCBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDIp IHwgQklUX3JlbG9hZERTdHJlYW0oJmJpdEQzKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXRENCk7 DQorCQl9DQorDQorCQkvKiBjaGVjayBjb3JydXB0aW9uICovDQorCQlpZiAob3AxID4gb3BTdGFy dDIpDQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKwkJaWYgKG9wMiA+ IG9wU3RhcnQzKQ0KKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisJCWlm IChvcDMgPiBvcFN0YXJ0NCkNCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7 DQorCQkvKiBub3RlIDogb3A0IHN1cHBvc2VkIGFscmVhZHkgdmVyaWZpZWQgd2l0aGluIG1haW4g bG9vcCAqLw0KKw0KKwkJLyogZmluaXNoIGJpdFN0cmVhbXMgb25lIGJ5IG9uZSAqLw0KKwkJSFVG X2RlY29kZVN0cmVhbVgyKG9wMSwgJmJpdEQxLCBvcFN0YXJ0MiwgZHQsIGR0TG9nKTsNCisJCUhV Rl9kZWNvZGVTdHJlYW1YMihvcDIsICZiaXREMiwgb3BTdGFydDMsIGR0LCBkdExvZyk7DQorCQlI VUZfZGVjb2RlU3RyZWFtWDIob3AzLCAmYml0RDMsIG9wU3RhcnQ0LCBkdCwgZHRMb2cpOw0KKwkJ SFVGX2RlY29kZVN0cmVhbVgyKG9wNCwgJmJpdEQ0LCBvZW5kLCBkdCwgZHRMb2cpOw0KKw0KKwkJ LyogY2hlY2sgKi8NCisJCWVuZFNpZ25hbCA9IEJJVF9lbmRPZkRTdHJlYW0oJmJpdEQxKSAmIEJJ VF9lbmRPZkRTdHJlYW0oJmJpdEQyKSAmIEJJVF9lbmRPZkRTdHJlYW0oJmJpdEQzKSAmIEJJVF9l bmRPZkRTdHJlYW0oJmJpdEQ0KTsNCisJCWlmICghZW5kU2lnbmFsKQ0KKwkJCXJldHVybiBFUlJP Uihjb3JydXB0aW9uX2RldGVjdGVkKTsNCisNCisJCS8qIGRlY29kZWQgc2l6ZSAqLw0KKwkJcmV0 dXJuIGRzdFNpemU7DQorCX0NCit9DQorDQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFgyX3VzaW5n RFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVf dCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKQ0KK3sNCisJRFRhYmxlRGVzYyBk dGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOw0KKwlpZiAoZHRkLnRhYmxlVHlwZSAhPSAw KQ0KKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOw0KKwlyZXR1cm4gSFVGX2RlY29tcHJlc3M0WDJf dXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxl KTsNCit9DQorDQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFgyX0RDdHhfd2tzcChIVUZfRFRhYmxl ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXpl X3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0K Kwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopY1NyYzsNCisNCisJc2l6ZV90IGNvbnN0 IGhTaXplID0gSFVGX3JlYWREVGFibGVYMl93a3NwKGRjdHgsIGNTcmMsIGNTcmNTaXplLCB3b3Jr c3BhY2UsIHdvcmtzcGFjZVNpemUpOw0KKwlpZiAoSFVGX2lzRXJyb3IoaFNpemUpKQ0KKwkJcmV0 dXJuIGhTaXplOw0KKwlpZiAoaFNpemUgPj0gY1NyY1NpemUpDQorCQlyZXR1cm4gRVJST1Ioc3Jj U2l6ZV93cm9uZyk7DQorCWlwICs9IGhTaXplOw0KKwljU3JjU2l6ZSAtPSBoU2l6ZTsNCisNCisJ cmV0dXJuIEhVRl9kZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlX2ludGVybmFsKGRzdCwgZHN0U2l6 ZSwgaXAsIGNTcmNTaXplLCBkY3R4KTsNCit9DQorDQorLyogKioqKioqKioqKioqKioqKioqKioq KioqKi8NCisvKiBkb3VibGUtc3ltYm9scyBkZWNvZGluZyAqLw0KKy8qICoqKioqKioqKioqKioq KioqKioqKioqKiovDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlVMTYgc2VxdWVuY2U7DQorCUJZVEUg bmJCaXRzOw0KKwlCWVRFIGxlbmd0aDsNCit9IEhVRl9ERWx0WDQ7IC8qIGRvdWJsZS1zeW1ib2xz IGRlY29kaW5nICovDQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlCWVRFIHN5bWJvbDsNCisJQllU RSB3ZWlnaHQ7DQorfSBzb3J0ZWRTeW1ib2xfdDsNCisNCisvKiBIVUZfZmlsbERUYWJsZVg0TGV2 ZWwyKCkgOg0KKyAqIGByYW5rVmFsT3JpZ2luYCBtdXN0IGJlIGEgdGFibGUgb2YgYXQgbGVhc3Qg KEhVRl9UQUJMRUxPR19NQVggKyAxKSBVMzIgKi8NCitzdGF0aWMgdm9pZCBIVUZfZmlsbERUYWJs ZVg0TGV2ZWwyKEhVRl9ERWx0WDQgKkRUYWJsZSwgVTMyIHNpemVMb2csIGNvbnN0IFUzMiBjb25z dW1lZCwgY29uc3QgVTMyICpyYW5rVmFsT3JpZ2luLCBjb25zdCBpbnQgbWluV2VpZ2h0LA0KKwkJ CQkgICBjb25zdCBzb3J0ZWRTeW1ib2xfdCAqc29ydGVkU3ltYm9scywgY29uc3QgVTMyIHNvcnRl ZExpc3RTaXplLCBVMzIgbmJCaXRzQmFzZWxpbmUsIFUxNiBiYXNlU2VxKQ0KK3sNCisJSFVGX0RF bHRYNCBERWx0Ow0KKwlVMzIgcmFua1ZhbFtIVUZfVEFCTEVMT0dfTUFYICsgMV07DQorDQorCS8q IGdldCBwcmUtY2FsY3VsYXRlZCByYW5rVmFsICovDQorCW1lbWNweShyYW5rVmFsLCByYW5rVmFs T3JpZ2luLCBzaXplb2YocmFua1ZhbCkpOw0KKw0KKwkvKiBmaWxsIHNraXBwZWQgdmFsdWVzICov DQorCWlmIChtaW5XZWlnaHQgPiAxKSB7DQorCQlVMzIgaSwgc2tpcFNpemUgPSByYW5rVmFsW21p bldlaWdodF07DQorCQlaU1REX3dyaXRlTEUxNigmKERFbHQuc2VxdWVuY2UpLCBiYXNlU2VxKTsN CisJCURFbHQubmJCaXRzID0gKEJZVEUpKGNvbnN1bWVkKTsNCisJCURFbHQubGVuZ3RoID0gMTsN CisJCWZvciAoaSA9IDA7IGkgPCBza2lwU2l6ZTsgaSsrKQ0KKwkJCURUYWJsZVtpXSA9IERFbHQ7 DQorCX0NCisNCisJLyogZmlsbCBEVGFibGUgKi8NCisJew0KKwkJVTMyIHM7DQorCQlmb3IgKHMg PSAwOyBzIDwgc29ydGVkTGlzdFNpemU7IHMrKykgeyAvKiBub3RlIDogc29ydGVkU3ltYm9scyBh bHJlYWR5IHNraXBwZWQgKi8NCisJCQljb25zdCBVMzIgc3ltYm9sID0gc29ydGVkU3ltYm9sc1tz XS5zeW1ib2w7DQorCQkJY29uc3QgVTMyIHdlaWdodCA9IHNvcnRlZFN5bWJvbHNbc10ud2VpZ2h0 Ow0KKwkJCWNvbnN0IFUzMiBuYkJpdHMgPSBuYkJpdHNCYXNlbGluZSAtIHdlaWdodDsNCisJCQlj b25zdCBVMzIgbGVuZ3RoID0gMSA8PCAoc2l6ZUxvZyAtIG5iQml0cyk7DQorCQkJY29uc3QgVTMy IHN0YXJ0ID0gcmFua1ZhbFt3ZWlnaHRdOw0KKwkJCVUzMiBpID0gc3RhcnQ7DQorCQkJY29uc3Qg VTMyIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOw0KKw0KKwkJCVpTVERfd3JpdGVMRTE2KCYoREVsdC5z ZXF1ZW5jZSksIChVMTYpKGJhc2VTZXEgKyAoc3ltYm9sIDw8IDgpKSk7DQorCQkJREVsdC5uYkJp dHMgPSAoQllURSkobmJCaXRzICsgY29uc3VtZWQpOw0KKwkJCURFbHQubGVuZ3RoID0gMjsNCisJ CQlkbyB7DQorCQkJCURUYWJsZVtpKytdID0gREVsdDsNCisJCQl9IHdoaWxlIChpIDwgZW5kKTsg Lyogc2luY2UgbGVuZ3RoID49IDEgKi8NCisNCisJCQlyYW5rVmFsW3dlaWdodF0gKz0gbGVuZ3Ro Ow0KKwkJfQ0KKwl9DQorfQ0KKw0KK3R5cGVkZWYgVTMyIHJhbmtWYWxfdFtIVUZfVEFCTEVMT0df TUFYXVtIVUZfVEFCTEVMT0dfTUFYICsgMV07DQordHlwZWRlZiBVMzIgcmFua1ZhbENvbF90W0hV Rl9UQUJMRUxPR19NQVggKyAxXTsNCisNCitzdGF0aWMgdm9pZCBIVUZfZmlsbERUYWJsZVg0KEhV Rl9ERWx0WDQgKkRUYWJsZSwgY29uc3QgVTMyIHRhcmdldExvZywgY29uc3Qgc29ydGVkU3ltYm9s X3QgKnNvcnRlZExpc3QsIGNvbnN0IFUzMiBzb3J0ZWRMaXN0U2l6ZSwgY29uc3QgVTMyICpyYW5r U3RhcnQsDQorCQkJICAgICByYW5rVmFsX3QgcmFua1ZhbE9yaWdpbiwgY29uc3QgVTMyIG1heFdl aWdodCwgY29uc3QgVTMyIG5iQml0c0Jhc2VsaW5lKQ0KK3sNCisJVTMyIHJhbmtWYWxbSFVGX1RB QkxFTE9HX01BWCArIDFdOw0KKwljb25zdCBpbnQgc2NhbGVMb2cgPSBuYkJpdHNCYXNlbGluZSAt IHRhcmdldExvZzsgLyogbm90ZSA6IHRhcmdldExvZyA+PSBzcmNMb2csIGhlbmNlIHNjYWxlTG9n IDw9IDEgKi8NCisJY29uc3QgVTMyIG1pbkJpdHMgPSBuYkJpdHNCYXNlbGluZSAtIG1heFdlaWdo dDsNCisJVTMyIHM7DQorDQorCW1lbWNweShyYW5rVmFsLCByYW5rVmFsT3JpZ2luLCBzaXplb2Yo cmFua1ZhbCkpOw0KKw0KKwkvKiBmaWxsIERUYWJsZSAqLw0KKwlmb3IgKHMgPSAwOyBzIDwgc29y dGVkTGlzdFNpemU7IHMrKykgew0KKwkJY29uc3QgVTE2IHN5bWJvbCA9IHNvcnRlZExpc3Rbc10u c3ltYm9sOw0KKwkJY29uc3QgVTMyIHdlaWdodCA9IHNvcnRlZExpc3Rbc10ud2VpZ2h0Ow0KKwkJ Y29uc3QgVTMyIG5iQml0cyA9IG5iQml0c0Jhc2VsaW5lIC0gd2VpZ2h0Ow0KKwkJY29uc3QgVTMy IHN0YXJ0ID0gcmFua1ZhbFt3ZWlnaHRdOw0KKwkJY29uc3QgVTMyIGxlbmd0aCA9IDEgPDwgKHRh cmdldExvZyAtIG5iQml0cyk7DQorDQorCQlpZiAodGFyZ2V0TG9nIC0gbmJCaXRzID49IG1pbkJp dHMpIHsgLyogZW5vdWdoIHJvb20gZm9yIGEgc2Vjb25kIHN5bWJvbCAqLw0KKwkJCVUzMiBzb3J0 ZWRSYW5rOw0KKwkJCWludCBtaW5XZWlnaHQgPSBuYkJpdHMgKyBzY2FsZUxvZzsNCisJCQlpZiAo bWluV2VpZ2h0IDwgMSkNCisJCQkJbWluV2VpZ2h0ID0gMTsNCisJCQlzb3J0ZWRSYW5rID0gcmFu a1N0YXJ0W21pbldlaWdodF07DQorCQkJSFVGX2ZpbGxEVGFibGVYNExldmVsMihEVGFibGUgKyBz dGFydCwgdGFyZ2V0TG9nIC0gbmJCaXRzLCBuYkJpdHMsIHJhbmtWYWxPcmlnaW5bbmJCaXRzXSwg bWluV2VpZ2h0LCBzb3J0ZWRMaXN0ICsgc29ydGVkUmFuaywNCisJCQkJCSAgICAgICBzb3J0ZWRM aXN0U2l6ZSAtIHNvcnRlZFJhbmssIG5iQml0c0Jhc2VsaW5lLCBzeW1ib2wpOw0KKwkJfSBlbHNl IHsNCisJCQlIVUZfREVsdFg0IERFbHQ7DQorCQkJWlNURF93cml0ZUxFMTYoJihERWx0LnNlcXVl bmNlKSwgc3ltYm9sKTsNCisJCQlERWx0Lm5iQml0cyA9IChCWVRFKShuYkJpdHMpOw0KKwkJCURF bHQubGVuZ3RoID0gMTsNCisJCQl7DQorCQkJCVUzMiBjb25zdCBlbmQgPSBzdGFydCArIGxlbmd0 aDsNCisJCQkJVTMyIHU7DQorCQkJCWZvciAodSA9IHN0YXJ0OyB1IDwgZW5kOyB1KyspDQorCQkJ CQlEVGFibGVbdV0gPSBERWx0Ow0KKwkJCX0NCisJCX0NCisJCXJhbmtWYWxbd2VpZ2h0XSArPSBs ZW5ndGg7DQorCX0NCit9DQorDQorc2l6ZV90IEhVRl9yZWFkRFRhYmxlWDRfd2tzcChIVUZfRFRh YmxlICpEVGFibGUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHZvaWQgKndvcmtz cGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0KKwlVMzIgdGFibGVMb2csIG1heFcsIHNp emVPZlNvcnQsIG5iU3ltYm9sczsNCisJRFRhYmxlRGVzYyBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVz YyhEVGFibGUpOw0KKwlVMzIgY29uc3QgbWF4VGFibGVMb2cgPSBkdGQubWF4VGFibGVMb2c7DQor CXNpemVfdCBpU2l6ZTsNCisJdm9pZCAqZHRQdHIgPSBEVGFibGUgKyAxOyAvKiBmb3JjZSBjb21w aWxlciB0byBhdm9pZCBzdHJpY3QtYWxpYXNpbmcgKi8NCisJSFVGX0RFbHRYNCAqY29uc3QgZHQg PSAoSFVGX0RFbHRYNCAqKWR0UHRyOw0KKwlVMzIgKnJhbmtTdGFydDsNCisNCisJcmFua1ZhbENv bF90ICpyYW5rVmFsOw0KKwlVMzIgKnJhbmtTdGF0czsNCisJVTMyICpyYW5rU3RhcnQwOw0KKwlz b3J0ZWRTeW1ib2xfdCAqc29ydGVkU3ltYm9sOw0KKwlCWVRFICp3ZWlnaHRMaXN0Ow0KKwlzaXpl X3Qgc3BhY2VVc2VkMzIgPSAwOw0KKw0KKwlIVUZfU1RBVElDX0FTU0VSVCgoc2l6ZW9mKHJhbmtW YWxDb2xfdCkgJiAzKSA9PSAwKTsNCisNCisJcmFua1ZhbCA9IChyYW5rVmFsQ29sX3QgKikoKFUz MiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyKTsNCisJc3BhY2VVc2VkMzIgKz0gKHNpemVvZihy YW5rVmFsQ29sX3QpICogSFVGX1RBQkxFTE9HX01BWCkgPj4gMjsNCisJcmFua1N0YXRzID0gKFUz MiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOw0KKwlzcGFjZVVzZWQzMiArPSBIVUZfVEFCTEVM T0dfTUFYICsgMTsNCisJcmFua1N0YXJ0MCA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQz MjsNCisJc3BhY2VVc2VkMzIgKz0gSFVGX1RBQkxFTE9HX01BWCArIDI7DQorCXNvcnRlZFN5bWJv bCA9IChzb3J0ZWRTeW1ib2xfdCAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIpOw0K KwlzcGFjZVVzZWQzMiArPSBBTElHTihzaXplb2Yoc29ydGVkU3ltYm9sX3QpICogKEhVRl9TWU1C T0xWQUxVRV9NQVggKyAxKSwgc2l6ZW9mKFUzMikpID4+IDI7DQorCXdlaWdodExpc3QgPSAoQllU RSAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIpOw0KKwlzcGFjZVVzZWQzMiArPSBB TElHTihIVUZfU1lNQk9MVkFMVUVfTUFYICsgMSwgc2l6ZW9mKFUzMikpID4+IDI7DQorDQorCWlm ICgoc3BhY2VVc2VkMzIgPDwgMikgPiB3b3Jrc3BhY2VTaXplKQ0KKwkJcmV0dXJuIEVSUk9SKHRh YmxlTG9nX3Rvb0xhcmdlKTsNCisJd29ya3NwYWNlID0gKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNl VXNlZDMyOw0KKwl3b3Jrc3BhY2VTaXplIC09IChzcGFjZVVzZWQzMiA8PCAyKTsNCisNCisJcmFu a1N0YXJ0ID0gcmFua1N0YXJ0MCArIDE7DQorCW1lbXNldChyYW5rU3RhdHMsIDAsIHNpemVvZihV MzIpICogKDIgKiBIVUZfVEFCTEVMT0dfTUFYICsgMiArIDEpKTsNCisNCisJSFVGX1NUQVRJQ19B U1NFUlQoc2l6ZW9mKEhVRl9ERWx0WDQpID09IHNpemVvZihIVUZfRFRhYmxlKSk7IC8qIGlmIGNv bXBpbGVyIGZhaWxzIGhlcmUsIGFzc2VydGlvbiBpcyB3cm9uZyAqLw0KKwlpZiAobWF4VGFibGVM b2cgPiBIVUZfVEFCTEVMT0dfTUFYKQ0KKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdl KTsNCisJLyogbWVtc2V0KHdlaWdodExpc3QsIDAsIHNpemVvZih3ZWlnaHRMaXN0KSk7ICovIC8q IGlzIG5vdCBuZWNlc3NhcnksIGV2ZW4gdGhvdWdoIHNvbWUgYW5hbHl6ZXIgY29tcGxhaW4gLi4u ICovDQorDQorCWlTaXplID0gSFVGX3JlYWRTdGF0c193a3NwKHdlaWdodExpc3QsIEhVRl9TWU1C T0xWQUxVRV9NQVggKyAxLCByYW5rU3RhdHMsICZuYlN5bWJvbHMsICZ0YWJsZUxvZywgc3JjLCBz cmNTaXplLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0KKwlpZiAoSFVGX2lzRXJyb3IoaVNp emUpKQ0KKwkJcmV0dXJuIGlTaXplOw0KKw0KKwkvKiBjaGVjayByZXN1bHQgKi8NCisJaWYgKHRh YmxlTG9nID4gbWF4VGFibGVMb2cpDQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2Up OyAvKiBEVGFibGUgY2FuJ3QgZml0IGNvZGUgZGVwdGggKi8NCisNCisJLyogZmluZCBtYXhXZWln aHQgKi8NCisJZm9yIChtYXhXID0gdGFibGVMb2c7IHJhbmtTdGF0c1ttYXhXXSA9PSAwOyBtYXhX LS0pIHsNCisJfSAvKiBuZWNlc3NhcmlseSBmaW5kcyBhIHNvbHV0aW9uIGJlZm9yZSAwICovDQor DQorCS8qIEdldCBzdGFydCBpbmRleCBvZiBlYWNoIHdlaWdodCAqLw0KKwl7DQorCQlVMzIgdywg bmV4dFJhbmtTdGFydCA9IDA7DQorCQlmb3IgKHcgPSAxOyB3IDwgbWF4VyArIDE7IHcrKykgew0K KwkJCVUzMiBjdXJyID0gbmV4dFJhbmtTdGFydDsNCisJCQluZXh0UmFua1N0YXJ0ICs9IHJhbmtT dGF0c1t3XTsNCisJCQlyYW5rU3RhcnRbd10gPSBjdXJyOw0KKwkJfQ0KKwkJcmFua1N0YXJ0WzBd ID0gbmV4dFJhbmtTdGFydDsgLyogcHV0IGFsbCAwdyBzeW1ib2xzIGF0IHRoZSBlbmQgb2Ygc29y dGVkIGxpc3QqLw0KKwkJc2l6ZU9mU29ydCA9IG5leHRSYW5rU3RhcnQ7DQorCX0NCisNCisJLyog c29ydCBzeW1ib2xzIGJ5IHdlaWdodCAqLw0KKwl7DQorCQlVMzIgczsNCisJCWZvciAocyA9IDA7 IHMgPCBuYlN5bWJvbHM7IHMrKykgew0KKwkJCVUzMiBjb25zdCB3ID0gd2VpZ2h0TGlzdFtzXTsN CisJCQlVMzIgY29uc3QgciA9IHJhbmtTdGFydFt3XSsrOw0KKwkJCXNvcnRlZFN5bWJvbFtyXS5z eW1ib2wgPSAoQllURSlzOw0KKwkJCXNvcnRlZFN5bWJvbFtyXS53ZWlnaHQgPSAoQllURSl3Ow0K KwkJfQ0KKwkJcmFua1N0YXJ0WzBdID0gMDsgLyogZm9yZ2V0IDB3IHN5bWJvbHM7IHRoaXMgaXMg YmVnaW5uaW5nIG9mIHdlaWdodCgxKSAqLw0KKwl9DQorDQorCS8qIEJ1aWxkIHJhbmtWYWwgKi8N CisJew0KKwkJVTMyICpjb25zdCByYW5rVmFsMCA9IHJhbmtWYWxbMF07DQorCQl7DQorCQkJaW50 IGNvbnN0IHJlc2NhbGUgPSAobWF4VGFibGVMb2cgLSB0YWJsZUxvZykgLSAxOyAvKiB0YWJsZUxv ZyA8PSBtYXhUYWJsZUxvZyAqLw0KKwkJCVUzMiBuZXh0UmFua1ZhbCA9IDA7DQorCQkJVTMyIHc7 DQorCQkJZm9yICh3ID0gMTsgdyA8IG1heFcgKyAxOyB3KyspIHsNCisJCQkJVTMyIGN1cnIgPSBu ZXh0UmFua1ZhbDsNCisJCQkJbmV4dFJhbmtWYWwgKz0gcmFua1N0YXRzW3ddIDw8ICh3ICsgcmVz Y2FsZSk7DQorCQkJCXJhbmtWYWwwW3ddID0gY3VycjsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJ VTMyIGNvbnN0IG1pbkJpdHMgPSB0YWJsZUxvZyArIDEgLSBtYXhXOw0KKwkJCVUzMiBjb25zdW1l ZDsNCisJCQlmb3IgKGNvbnN1bWVkID0gbWluQml0czsgY29uc3VtZWQgPCBtYXhUYWJsZUxvZyAt IG1pbkJpdHMgKyAxOyBjb25zdW1lZCsrKSB7DQorCQkJCVUzMiAqY29uc3QgcmFua1ZhbFB0ciA9 IHJhbmtWYWxbY29uc3VtZWRdOw0KKwkJCQlVMzIgdzsNCisJCQkJZm9yICh3ID0gMTsgdyA8IG1h eFcgKyAxOyB3KyspIHsNCisJCQkJCXJhbmtWYWxQdHJbd10gPSByYW5rVmFsMFt3XSA+PiBjb25z dW1lZDsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlIVUZfZmlsbERUYWJsZVg0KGR0 LCBtYXhUYWJsZUxvZywgc29ydGVkU3ltYm9sLCBzaXplT2ZTb3J0LCByYW5rU3RhcnQwLCByYW5r VmFsLCBtYXhXLCB0YWJsZUxvZyArIDEpOw0KKw0KKwlkdGQudGFibGVMb2cgPSAoQllURSltYXhU YWJsZUxvZzsNCisJZHRkLnRhYmxlVHlwZSA9IDE7DQorCW1lbWNweShEVGFibGUsICZkdGQsIHNp emVvZihkdGQpKTsNCisJcmV0dXJuIGlTaXplOw0KK30NCisNCitzdGF0aWMgVTMyIEhVRl9kZWNv ZGVTeW1ib2xYNCh2b2lkICpvcCwgQklUX0RTdHJlYW1fdCAqRFN0cmVhbSwgY29uc3QgSFVGX0RF bHRYNCAqZHQsIGNvbnN0IFUzMiBkdExvZykNCit7DQorCXNpemVfdCBjb25zdCB2YWwgPSBCSVRf bG9va0JpdHNGYXN0KERTdHJlYW0sIGR0TG9nKTsgLyogbm90ZSA6IGR0TG9nID49IDEgKi8NCisJ bWVtY3B5KG9wLCBkdCArIHZhbCwgMik7DQorCUJJVF9za2lwQml0cyhEU3RyZWFtLCBkdFt2YWxd Lm5iQml0cyk7DQorCXJldHVybiBkdFt2YWxdLmxlbmd0aDsNCit9DQorDQorc3RhdGljIFUzMiBI VUZfZGVjb2RlTGFzdFN5bWJvbFg0KHZvaWQgKm9wLCBCSVRfRFN0cmVhbV90ICpEU3RyZWFtLCBj b25zdCBIVUZfREVsdFg0ICpkdCwgY29uc3QgVTMyIGR0TG9nKQ0KK3sNCisJc2l6ZV90IGNvbnN0 IHZhbCA9IEJJVF9sb29rQml0c0Zhc3QoRFN0cmVhbSwgZHRMb2cpOyAvKiBub3RlIDogZHRMb2cg Pj0gMSAqLw0KKwltZW1jcHkob3AsIGR0ICsgdmFsLCAxKTsNCisJaWYgKGR0W3ZhbF0ubGVuZ3Ro ID09IDEpDQorCQlCSVRfc2tpcEJpdHMoRFN0cmVhbSwgZHRbdmFsXS5uYkJpdHMpOw0KKwllbHNl IHsNCisJCWlmIChEU3RyZWFtLT5iaXRzQ29uc3VtZWQgPCAoc2l6ZW9mKERTdHJlYW0tPmJpdENv bnRhaW5lcikgKiA4KSkgew0KKwkJCUJJVF9za2lwQml0cyhEU3RyZWFtLCBkdFt2YWxdLm5iQml0 cyk7DQorCQkJaWYgKERTdHJlYW0tPmJpdHNDb25zdW1lZCA+IChzaXplb2YoRFN0cmVhbS0+Yml0 Q29udGFpbmVyKSAqIDgpKQ0KKwkJCQkvKiB1Z2x5IGhhY2s7IHdvcmtzIG9ubHkgYmVjYXVzZSBp dCdzIHRoZSBsYXN0IHN5bWJvbC4gTm90ZSA6IGNhbid0IGVhc2lseSBleHRyYWN0IG5iQml0cyBm cm9tIGp1c3QgdGhpcyBzeW1ib2wgKi8NCisJCQkJRFN0cmVhbS0+Yml0c0NvbnN1bWVkID0gKHNp emVvZihEU3RyZWFtLT5iaXRDb250YWluZXIpICogOCk7DQorCQl9DQorCX0NCisJcmV0dXJuIDE7 DQorfQ0KKw0KKyNkZWZpbmUgSFVGX0RFQ09ERV9TWU1CT0xYNF8wKHB0ciwgRFN0cmVhbVB0cikg cHRyICs9IEhVRl9kZWNvZGVTeW1ib2xYNChwdHIsIERTdHJlYW1QdHIsIGR0LCBkdExvZykNCisN CisjZGVmaW5lIEhVRl9ERUNPREVfU1lNQk9MWDRfMShwdHIsIERTdHJlYW1QdHIpICAgICAgICAg XA0KKwlpZiAoWlNURF82NGJpdHMoKSB8fCAoSFVGX1RBQkxFTE9HX01BWCA8PSAxMikpIFwNCisJ cHRyICs9IEhVRl9kZWNvZGVTeW1ib2xYNChwdHIsIERTdHJlYW1QdHIsIGR0LCBkdExvZykNCisN CisjZGVmaW5lIEhVRl9ERUNPREVfU1lNQk9MWDRfMihwdHIsIERTdHJlYW1QdHIpIFwNCisJaWYg KFpTVERfNjRiaXRzKCkpICAgICAgICAgICAgICAgICAgICAgXA0KKwlwdHIgKz0gSFVGX2RlY29k ZVN5bWJvbFg0KHB0ciwgRFN0cmVhbVB0ciwgZHQsIGR0TG9nKQ0KKw0KK0ZPUkNFX0lOTElORSBz aXplX3QgSFVGX2RlY29kZVN0cmVhbVg0KEJZVEUgKnAsIEJJVF9EU3RyZWFtX3QgKmJpdERQdHIs IEJZVEUgKmNvbnN0IHBFbmQsIGNvbnN0IEhVRl9ERWx0WDQgKmNvbnN0IGR0LCBjb25zdCBVMzIg ZHRMb2cpDQorew0KKwlCWVRFICpjb25zdCBwU3RhcnQgPSBwOw0KKw0KKwkvKiB1cCB0byA4IHN5 bWJvbHMgYXQgYSB0aW1lICovDQorCXdoaWxlICgoQklUX3JlbG9hZERTdHJlYW0oYml0RFB0cikg PT0gQklUX0RTdHJlYW1fdW5maW5pc2hlZCkgJiAocCA8IHBFbmQgLSAoc2l6ZW9mKGJpdERQdHIt PmJpdENvbnRhaW5lcikgLSAxKSkpIHsNCisJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihwLCBiaXRE UHRyKTsNCisJCUhVRl9ERUNPREVfU1lNQk9MWDRfMShwLCBiaXREUHRyKTsNCisJCUhVRl9ERUNP REVfU1lNQk9MWDRfMihwLCBiaXREUHRyKTsNCisJCUhVRl9ERUNPREVfU1lNQk9MWDRfMChwLCBi aXREUHRyKTsNCisJfQ0KKw0KKwkvKiBjbG9zZXIgdG8gZW5kIDogdXAgdG8gMiBzeW1ib2xzIGF0 IGEgdGltZSAqLw0KKwl3aGlsZSAoKEJJVF9yZWxvYWREU3RyZWFtKGJpdERQdHIpID09IEJJVF9E U3RyZWFtX3VuZmluaXNoZWQpICYgKHAgPD0gcEVuZCAtIDIpKQ0KKwkJSFVGX0RFQ09ERV9TWU1C T0xYNF8wKHAsIGJpdERQdHIpOw0KKw0KKwl3aGlsZSAocCA8PSBwRW5kIC0gMikNCisJCUhVRl9E RUNPREVfU1lNQk9MWDRfMChwLCBiaXREUHRyKTsgLyogbm8gbmVlZCB0byByZWxvYWQgOiByZWFj aGVkIHRoZSBlbmQgb2YgRFN0cmVhbSAqLw0KKw0KKwlpZiAocCA8IHBFbmQpDQorCQlwICs9IEhV Rl9kZWNvZGVMYXN0U3ltYm9sWDQocCwgYml0RFB0ciwgZHQsIGR0TG9nKTsNCisNCisJcmV0dXJu IHAgLSBwU3RhcnQ7DQorfQ0KKw0KK3N0YXRpYyBzaXplX3QgSFVGX2RlY29tcHJlc3MxWDRfdXNp bmdEVGFibGVfaW50ZXJuYWwodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAq Y1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorew0KKwlC SVRfRFN0cmVhbV90IGJpdEQ7DQorDQorCS8qIEluaXQgKi8NCisJew0KKwkJc2l6ZV90IGNvbnN0 IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RCwgY1NyYywgY1NyY1NpemUpOw0KKwkJ aWYgKEhVRl9pc0Vycm9yKGVycm9yQ29kZSkpDQorCQkJcmV0dXJuIGVycm9yQ29kZTsNCisJfQ0K Kw0KKwkvKiBkZWNvZGUgKi8NCisJew0KKwkJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilk c3Q7DQorCQlCWVRFICpjb25zdCBvZW5kID0gb3N0YXJ0ICsgZHN0U2l6ZTsNCisJCWNvbnN0IHZv aWQgKmNvbnN0IGR0UHRyID0gRFRhYmxlICsgMTsgLyogZm9yY2UgY29tcGlsZXIgdG8gbm90IHVz ZSBzdHJpY3QtYWxpYXNpbmcgKi8NCisJCWNvbnN0IEhVRl9ERWx0WDQgKmNvbnN0IGR0ID0gKGNv bnN0IEhVRl9ERWx0WDQgKilkdFB0cjsNCisJCURUYWJsZURlc2MgY29uc3QgZHRkID0gSFVGX2dl dERUYWJsZURlc2MoRFRhYmxlKTsNCisJCUhVRl9kZWNvZGVTdHJlYW1YNChvc3RhcnQsICZiaXRE LCBvZW5kLCBkdCwgZHRkLnRhYmxlTG9nKTsNCisJfQ0KKw0KKwkvKiBjaGVjayAqLw0KKwlpZiAo IUJJVF9lbmRPZkRTdHJlYW0oJmJpdEQpKQ0KKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0 ZWN0ZWQpOw0KKw0KKwkvKiBkZWNvZGVkIHNpemUgKi8NCisJcmV0dXJuIGRzdFNpemU7DQorfQ0K Kw0KK3NpemVfdCBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVf dCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9E VGFibGUgKkRUYWJsZSkNCit7DQorCURUYWJsZURlc2MgZHRkID0gSFVGX2dldERUYWJsZURlc2Mo RFRhYmxlKTsNCisJaWYgKGR0ZC50YWJsZVR5cGUgIT0gMSkNCisJCXJldHVybiBFUlJPUihHRU5F UklDKTsNCisJcmV0dXJuIEhVRl9kZWNvbXByZXNzMVg0X3VzaW5nRFRhYmxlX2ludGVybmFsKGRz dCwgZHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIERUYWJsZSk7DQorfQ0KKw0KK3NpemVfdCBIVUZf ZGVjb21wcmVzczFYNF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqREN0eCwgdm9pZCAqZHN0LCBzaXpl X3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jr c3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3sNCisJY29uc3QgQllURSAqaXAgPSAoY29u c3QgQllURSAqKWNTcmM7DQorDQorCXNpemVfdCBjb25zdCBoU2l6ZSA9IEhVRl9yZWFkRFRhYmxl WDRfd2tzcChEQ3R4LCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsN CisJaWYgKEhVRl9pc0Vycm9yKGhTaXplKSkNCisJCXJldHVybiBoU2l6ZTsNCisJaWYgKGhTaXpl ID49IGNTcmNTaXplKQ0KKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOw0KKwlpcCArPSBo U2l6ZTsNCisJY1NyY1NpemUgLT0gaFNpemU7DQorDQorCXJldHVybiBIVUZfZGVjb21wcmVzczFY NF91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIGRzdFNpemUsIGlwLCBjU3JjU2l6ZSwgREN0eCk7 DQorfQ0KKw0KK3N0YXRpYyBzaXplX3QgSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGVfaW50 ZXJuYWwodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90 IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorew0KKwlpZiAoY1NyY1NpemUg PCAxMCkNCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogc3RyaWN0IG1p bmltdW0gOiBqdW1wIHRhYmxlICsgMSBieXRlIHBlciBzdHJlYW0gKi8NCisNCisJew0KKwkJY29u c3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKiljU3JjOw0KKwkJQllURSAqY29u c3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7DQorCQlCWVRFICpjb25zdCBvZW5kID0gb3N0YXJ0ICsg ZHN0U2l6ZTsNCisJCWNvbnN0IHZvaWQgKmNvbnN0IGR0UHRyID0gRFRhYmxlICsgMTsNCisJCWNv bnN0IEhVRl9ERWx0WDQgKmNvbnN0IGR0ID0gKGNvbnN0IEhVRl9ERWx0WDQgKilkdFB0cjsNCisN CisJCS8qIEluaXQgKi8NCisJCUJJVF9EU3RyZWFtX3QgYml0RDE7DQorCQlCSVRfRFN0cmVhbV90 IGJpdEQyOw0KKwkJQklUX0RTdHJlYW1fdCBiaXREMzsNCisJCUJJVF9EU3RyZWFtX3QgYml0RDQ7 DQorCQlzaXplX3QgY29uc3QgbGVuZ3RoMSA9IFpTVERfcmVhZExFMTYoaXN0YXJ0KTsNCisJCXNp emVfdCBjb25zdCBsZW5ndGgyID0gWlNURF9yZWFkTEUxNihpc3RhcnQgKyAyKTsNCisJCXNpemVf dCBjb25zdCBsZW5ndGgzID0gWlNURF9yZWFkTEUxNihpc3RhcnQgKyA0KTsNCisJCXNpemVfdCBj b25zdCBsZW5ndGg0ID0gY1NyY1NpemUgLSAobGVuZ3RoMSArIGxlbmd0aDIgKyBsZW5ndGgzICsg Nik7DQorCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQxID0gaXN0YXJ0ICsgNjsgLyoganVtcFRh YmxlICovDQorCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQyID0gaXN0YXJ0MSArIGxlbmd0aDE7 DQorCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQzID0gaXN0YXJ0MiArIGxlbmd0aDI7DQorCQlj b25zdCBCWVRFICpjb25zdCBpc3RhcnQ0ID0gaXN0YXJ0MyArIGxlbmd0aDM7DQorCQlzaXplX3Qg Y29uc3Qgc2VnbWVudFNpemUgPSAoZHN0U2l6ZSArIDMpIC8gNDsNCisJCUJZVEUgKmNvbnN0IG9w U3RhcnQyID0gb3N0YXJ0ICsgc2VnbWVudFNpemU7DQorCQlCWVRFICpjb25zdCBvcFN0YXJ0MyA9 IG9wU3RhcnQyICsgc2VnbWVudFNpemU7DQorCQlCWVRFICpjb25zdCBvcFN0YXJ0NCA9IG9wU3Rh cnQzICsgc2VnbWVudFNpemU7DQorCQlCWVRFICpvcDEgPSBvc3RhcnQ7DQorCQlCWVRFICpvcDIg PSBvcFN0YXJ0MjsNCisJCUJZVEUgKm9wMyA9IG9wU3RhcnQzOw0KKwkJQllURSAqb3A0ID0gb3BT dGFydDQ7DQorCQlVMzIgZW5kU2lnbmFsOw0KKwkJRFRhYmxlRGVzYyBjb25zdCBkdGQgPSBIVUZf Z2V0RFRhYmxlRGVzYyhEVGFibGUpOw0KKwkJVTMyIGNvbnN0IGR0TG9nID0gZHRkLnRhYmxlTG9n Ow0KKw0KKwkJaWYgKGxlbmd0aDQgPiBjU3JjU2l6ZSkNCisJCQlyZXR1cm4gRVJST1IoY29ycnVw dGlvbl9kZXRlY3RlZCk7IC8qIG92ZXJmbG93ICovDQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IGVy cm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RDEsIGlzdGFydDEsIGxlbmd0aDEpOw0KKwkJ CWlmIChIVUZfaXNFcnJvcihlcnJvckNvZGUpKQ0KKwkJCQlyZXR1cm4gZXJyb3JDb2RlOw0KKwkJ fQ0KKwkJew0KKwkJCXNpemVfdCBjb25zdCBlcnJvckNvZGUgPSBCSVRfaW5pdERTdHJlYW0oJmJp dEQyLCBpc3RhcnQyLCBsZW5ndGgyKTsNCisJCQlpZiAoSFVGX2lzRXJyb3IoZXJyb3JDb2RlKSkN CisJCQkJcmV0dXJuIGVycm9yQ29kZTsNCisJCX0NCisJCXsNCisJCQlzaXplX3QgY29uc3QgZXJy b3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZiaXREMywgaXN0YXJ0MywgbGVuZ3RoMyk7DQorCQkJ aWYgKEhVRl9pc0Vycm9yKGVycm9yQ29kZSkpDQorCQkJCXJldHVybiBlcnJvckNvZGU7DQorCQl9 DQorCQl7DQorCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0 RDQsIGlzdGFydDQsIGxlbmd0aDQpOw0KKwkJCWlmIChIVUZfaXNFcnJvcihlcnJvckNvZGUpKQ0K KwkJCQlyZXR1cm4gZXJyb3JDb2RlOw0KKwkJfQ0KKw0KKwkJLyogMTYtMzIgc3ltYm9scyBwZXIg bG9vcCAoNC04IHN5bWJvbHMgcGVyIHN0cmVhbSkgKi8NCisJCWVuZFNpZ25hbCA9IEJJVF9yZWxv YWREU3RyZWFtKCZiaXREMSkgfCBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDIpIHwgQklUX3JlbG9h ZERTdHJlYW0oJmJpdEQzKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXRENCk7DQorCQlmb3IgKDsg KGVuZFNpZ25hbCA9PSBCSVRfRFN0cmVhbV91bmZpbmlzaGVkKSAmIChvcDQgPCAob2VuZCAtIChz aXplb2YoYml0RDQuYml0Q29udGFpbmVyKSAtIDEpKSk7KSB7DQorCQkJSFVGX0RFQ09ERV9TWU1C T0xYNF8yKG9wMSwgJmJpdEQxKTsNCisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzIob3AyLCAmYml0 RDIpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihvcDMsICZiaXREMyk7DQorCQkJSFVGX0RF Q09ERV9TWU1CT0xYNF8yKG9wNCwgJmJpdEQ0KTsNCisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzEo b3AxLCAmYml0RDEpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMShvcDIsICZiaXREMik7DQor CQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8xKG9wMywgJmJpdEQzKTsNCisJCQlIVUZfREVDT0RFX1NZ TUJPTFg0XzEob3A0LCAmYml0RDQpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihvcDEsICZi aXREMSk7DQorCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8yKG9wMiwgJmJpdEQyKTsNCisJCQlIVUZf REVDT0RFX1NZTUJPTFg0XzIob3AzLCAmYml0RDMpOw0KKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRf MihvcDQsICZiaXRENCk7DQorCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8wKG9wMSwgJmJpdEQxKTsN CisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzAob3AyLCAmYml0RDIpOw0KKwkJCUhVRl9ERUNPREVf U1lNQk9MWDRfMChvcDMsICZiaXREMyk7DQorCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8wKG9wNCwg JmJpdEQ0KTsNCisNCisJCQllbmRTaWduYWwgPSBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDEpIHwg QklUX3JlbG9hZERTdHJlYW0oJmJpdEQyKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMykgfCBC SVRfcmVsb2FkRFN0cmVhbSgmYml0RDQpOw0KKwkJfQ0KKw0KKwkJLyogY2hlY2sgY29ycnVwdGlv biAqLw0KKwkJaWYgKG9wMSA+IG9wU3RhcnQyKQ0KKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9u X2RldGVjdGVkKTsNCisJCWlmIChvcDIgPiBvcFN0YXJ0MykNCisJCQlyZXR1cm4gRVJST1IoY29y cnVwdGlvbl9kZXRlY3RlZCk7DQorCQlpZiAob3AzID4gb3BTdGFydDQpDQorCQkJcmV0dXJuIEVS Uk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOw0KKwkJLyogbm90ZSA6IG9wNCBhbHJlYWR5IHZlcmlm aWVkIHdpdGhpbiBtYWluIGxvb3AgKi8NCisNCisJCS8qIGZpbmlzaCBiaXRTdHJlYW1zIG9uZSBi eSBvbmUgKi8NCisJCUhVRl9kZWNvZGVTdHJlYW1YNChvcDEsICZiaXREMSwgb3BTdGFydDIsIGR0 LCBkdExvZyk7DQorCQlIVUZfZGVjb2RlU3RyZWFtWDQob3AyLCAmYml0RDIsIG9wU3RhcnQzLCBk dCwgZHRMb2cpOw0KKwkJSFVGX2RlY29kZVN0cmVhbVg0KG9wMywgJmJpdEQzLCBvcFN0YXJ0NCwg ZHQsIGR0TG9nKTsNCisJCUhVRl9kZWNvZGVTdHJlYW1YNChvcDQsICZiaXRENCwgb2VuZCwgZHQs IGR0TG9nKTsNCisNCisJCS8qIGNoZWNrICovDQorCQl7DQorCQkJVTMyIGNvbnN0IGVuZENoZWNr ID0gQklUX2VuZE9mRFN0cmVhbSgmYml0RDEpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDIpICYg QklUX2VuZE9mRFN0cmVhbSgmYml0RDMpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDQpOw0KKwkJ CWlmICghZW5kQ2hlY2spDQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsN CisJCX0NCisNCisJCS8qIGRlY29kZWQgc2l6ZSAqLw0KKwkJcmV0dXJuIGRzdFNpemU7DQorCX0N Cit9DQorDQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFg0X3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwg c2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3Qg SFVGX0RUYWJsZSAqRFRhYmxlKQ0KK3sNCisJRFRhYmxlRGVzYyBkdGQgPSBIVUZfZ2V0RFRhYmxl RGVzYyhEVGFibGUpOw0KKwlpZiAoZHRkLnRhYmxlVHlwZSAhPSAxKQ0KKwkJcmV0dXJuIEVSUk9S KEdFTkVSSUMpOw0KKwlyZXR1cm4gSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGVfaW50ZXJu YWwoZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKTsNCit9DQorDQorc2l6ZV90 IEhVRl9kZWNvbXByZXNzNFg0X0RDdHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3Qs IHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQg KndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0KKwljb25zdCBCWVRFICppcCA9 IChjb25zdCBCWVRFICopY1NyYzsNCisNCisJc2l6ZV90IGhTaXplID0gSFVGX3JlYWREVGFibGVY NF93a3NwKGRjdHgsIGNTcmMsIGNTcmNTaXplLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0K KwlpZiAoSFVGX2lzRXJyb3IoaFNpemUpKQ0KKwkJcmV0dXJuIGhTaXplOw0KKwlpZiAoaFNpemUg Pj0gY1NyY1NpemUpDQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7DQorCWlwICs9IGhT aXplOw0KKwljU3JjU2l6ZSAtPSBoU2l6ZTsNCisNCisJcmV0dXJuIEhVRl9kZWNvbXByZXNzNFg0 X3VzaW5nRFRhYmxlX2ludGVybmFsKGRzdCwgZHN0U2l6ZSwgaXAsIGNTcmNTaXplLCBkY3R4KTsN Cit9DQorDQorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogR2VuZXJp YyBkZWNvbXByZXNzaW9uIHNlbGVjdG9yICovDQorLyogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovDQorDQorc2l6ZV90IEhVRl9kZWNvbXByZXNzMVhfdXNpbmdEVGFibGUodm9pZCAq ZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXpl LCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorew0KKwlEVGFibGVEZXNjIGNvbnN0IGR0ZCA9 IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7DQorCXJldHVybiBkdGQudGFibGVUeXBlID8gSFVG X2RlY29tcHJlc3MxWDRfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBtYXhEc3RTaXplLCBjU3Jj LCBjU3JjU2l6ZSwgRFRhYmxlKQ0KKwkJCSAgICAgOiBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RU YWJsZV9pbnRlcm5hbChkc3QsIG1heERzdFNpemUsIGNTcmMsIGNTcmNTaXplLCBEVGFibGUpOw0K K30NCisNCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNp emVfdCBtYXhEc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0 IEhVRl9EVGFibGUgKkRUYWJsZSkNCit7DQorCURUYWJsZURlc2MgY29uc3QgZHRkID0gSFVGX2dl dERUYWJsZURlc2MoRFRhYmxlKTsNCisJcmV0dXJuIGR0ZC50YWJsZVR5cGUgPyBIVUZfZGVjb21w cmVzczRYNF91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIG1heERzdFNpemUsIGNTcmMsIGNTcmNT aXplLCBEVGFibGUpDQorCQkJICAgICA6IEhVRl9kZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlX2lu dGVybmFsKGRzdCwgbWF4RHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIERUYWJsZSk7DQorfQ0KKw0K K3R5cGVkZWYgc3RydWN0IHsNCisJVTMyIHRhYmxlVGltZTsNCisJVTMyIGRlY29kZTI1NlRpbWU7 DQorfSBhbGdvX3RpbWVfdDsNCitzdGF0aWMgY29uc3QgYWxnb190aW1lX3QgYWxnb1RpbWVbMTYg LyogUXVhbnRpemF0aW9uICovXVszIC8qIHNpbmdsZSwgZG91YmxlLCBxdWFkICovXSA9IHsNCisg ICAgLyogc2luZ2xlLCBkb3VibGUsIHF1YWQgKi8NCisgICAge3swLCAwfSwgezEsIDF9LCB7Miwg Mn19LAkJICAgICAvKiBRPT0wIDogaW1wb3NzaWJsZSAqLw0KKyAgICB7ezAsIDB9LCB7MSwgMX0s IHsyLCAyfX0sCQkgICAgIC8qIFE9PTEgOiBpbXBvc3NpYmxlICovDQorICAgIHt7MzgsIDEzMH0s IHsxMzEzLCA3NH0sIHsyMTUxLCAzOH19LCAgICAgLyogUSA9PSAyIDogMTItMTglICovDQorICAg IHt7NDQ4LCAxMjh9LCB7MTM1MywgNzR9LCB7MjIzOCwgNDF9fSwgICAgLyogUSA9PSAzIDogMTgt MjUlICovDQorICAgIHt7NTU2LCAxMjh9LCB7MTM1MywgNzR9LCB7MjIzOCwgNDd9fSwgICAgLyog USA9PSA0IDogMjUtMzIlICovDQorICAgIHt7NzE0LCAxMjh9LCB7MTQxOCwgNzR9LCB7MjQzNiwg NTN9fSwgICAgLyogUSA9PSA1IDogMzItMzglICovDQorICAgIHt7ODgzLCAxMjh9LCB7MTQzNywg NzR9LCB7MjQ2NCwgNjF9fSwgICAgLyogUSA9PSA2IDogMzgtNDQlICovDQorICAgIHt7ODk3LCAx Mjh9LCB7MTUxNSwgNzV9LCB7MjYyMiwgNjh9fSwgICAgLyogUSA9PSA3IDogNDQtNTAlICovDQor ICAgIHt7OTI2LCAxMjh9LCB7MTYxMywgNzV9LCB7MjczMCwgNzV9fSwgICAgLyogUSA9PSA4IDog NTAtNTYlICovDQorICAgIHt7OTQ3LCAxMjh9LCB7MTcyOSwgNzd9LCB7MzM1OSwgNzd9fSwgICAg LyogUSA9PSA5IDogNTYtNjIlICovDQorICAgIHt7MTEwNywgMTI4fSwgezIwODMsIDgxfSwgezQw MDYsIDg0fX0sICAgLyogUSA9PTEwIDogNjItNjklICovDQorICAgIHt7MTE3NywgMTI4fSwgezIz NzksIDg3fSwgezQ3ODUsIDg4fX0sICAgLyogUSA9PTExIDogNjktNzUlICovDQorICAgIHt7MTI0 MiwgMTI4fSwgezI0MTUsIDkzfSwgezUxNTUsIDg0fX0sICAgLyogUSA9PTEyIDogNzUtODElICov DQorICAgIHt7MTM0OSwgMTI4fSwgezI2NDQsIDEwNn0sIHs1MjYwLCAxMDZ9fSwgLyogUSA9PTEz IDogODEtODclICovDQorICAgIHt7MTQ1NSwgMTI4fSwgezI0MjIsIDEyNH0sIHs0MTc0LCAxMjR9 fSwgLyogUSA9PTE0IDogODctOTMlICovDQorICAgIHt7NzIyLCAxMjh9LCB7MTg5MSwgMTQ1fSwg ezE5MzYsIDE0Nn19LCAgLyogUSA9PTE1IDogOTMtOTklICovDQorfTsNCisNCisvKiogSFVGX3Nl bGVjdERlY29kZXIoKSA6DQorKiAgIFRlbGxzIHdoaWNoIGRlY29kZXIgaXMgbGlrZWx5IHRvIGRl Y29kZSBmYXN0ZXIsDQorKiAgIGJhc2VkIG9uIGEgc2V0IG9mIHByZS1kZXRlcm1pbmVkIG1ldHJp Y3MuDQorKiAgIEByZXR1cm4gOiAwPT1IVUZfZGVjb21wcmVzczRYMiwgMT09SFVGX2RlY29tcHJl c3M0WDQgLg0KKyogICBBc3N1bXB0aW9uIDogMCA8IGNTcmNTaXplIDwgZHN0U2l6ZSA8PSAxMjgg S0IgKi8NCitVMzIgSFVGX3NlbGVjdERlY29kZXIoc2l6ZV90IGRzdFNpemUsIHNpemVfdCBjU3Jj U2l6ZSkNCit7DQorCS8qIGRlY29kZXIgdGltaW5nIGV2YWx1YXRpb24gKi8NCisJVTMyIGNvbnN0 IFEgPSAoVTMyKShjU3JjU2l6ZSAqIDE2IC8gZHN0U2l6ZSk7IC8qIFEgPCAxNiBzaW5jZSBkc3RT aXplID4gY1NyY1NpemUgKi8NCisJVTMyIGNvbnN0IEQyNTYgPSAoVTMyKShkc3RTaXplID4+IDgp Ow0KKwlVMzIgY29uc3QgRFRpbWUwID0gYWxnb1RpbWVbUV1bMF0udGFibGVUaW1lICsgKGFsZ29U aW1lW1FdWzBdLmRlY29kZTI1NlRpbWUgKiBEMjU2KTsNCisJVTMyIERUaW1lMSA9IGFsZ29UaW1l W1FdWzFdLnRhYmxlVGltZSArIChhbGdvVGltZVtRXVsxXS5kZWNvZGUyNTZUaW1lICogRDI1Nik7 DQorCURUaW1lMSArPSBEVGltZTEgPj4gMzsgLyogYWR2YW50YWdlIHRvIGFsZ29yaXRobSB1c2lu ZyBsZXNzIG1lbW9yeSwgZm9yIGNhY2hlIGV2aWN0aW9uICovDQorDQorCXJldHVybiBEVGltZTEg PCBEVGltZTA7DQorfQ0KKw0KK3R5cGVkZWYgc2l6ZV90ICgqZGVjb21wcmVzc2lvbkFsZ28pKHZv aWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6 ZSk7DQorDQorc2l6ZV90IEhVRl9kZWNvbXByZXNzNFhfREN0eF93a3NwKEhVRl9EVGFibGUgKmRj dHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBj U3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCit7DQorCS8q IHZhbGlkYXRpb24gY2hlY2tzICovDQorCWlmIChkc3RTaXplID09IDApDQorCQlyZXR1cm4gRVJS T1IoZHN0U2l6ZV90b29TbWFsbCk7DQorCWlmIChjU3JjU2l6ZSA+IGRzdFNpemUpDQorCQlyZXR1 cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIGludmFsaWQgKi8NCisJaWYgKGNTcmNT aXplID09IGRzdFNpemUpIHsNCisJCW1lbWNweShkc3QsIGNTcmMsIGRzdFNpemUpOw0KKwkJcmV0 dXJuIGRzdFNpemU7DQorCX0gLyogbm90IGNvbXByZXNzZWQgKi8NCisJaWYgKGNTcmNTaXplID09 IDEpIHsNCisJCW1lbXNldChkc3QsICooY29uc3QgQllURSAqKWNTcmMsIGRzdFNpemUpOw0KKwkJ cmV0dXJuIGRzdFNpemU7DQorCX0gLyogUkxFICovDQorDQorCXsNCisJCVUzMiBjb25zdCBhbGdv TmIgPSBIVUZfc2VsZWN0RGVjb2Rlcihkc3RTaXplLCBjU3JjU2l6ZSk7DQorCQlyZXR1cm4gYWxn b05iID8gSFVGX2RlY29tcHJlc3M0WDRfREN0eF93a3NwKGRjdHgsIGRzdCwgZHN0U2l6ZSwgY1Ny YywgY1NyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSkNCisJCQkgICAgICA6IEhVRl9k ZWNvbXByZXNzNFgyX0RDdHhfd2tzcChkY3R4LCBkc3QsIGRzdFNpemUsIGNTcmMsIGNTcmNTaXpl LCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0KKwl9DQorfQ0KKw0KK3NpemVfdCBIVUZfZGVj b21wcmVzczRYX2h1Zk9ubHlfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVf dCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtz cGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0KKwkvKiB2YWxpZGF0aW9uIGNoZWNrcyAq Lw0KKwlpZiAoZHN0U2l6ZSA9PSAwKQ0KKwkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwp Ow0KKwlpZiAoKGNTcmNTaXplID49IGRzdFNpemUpIHx8IChjU3JjU2l6ZSA8PSAxKSkNCisJCXJl dHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogaW52YWxpZCAqLw0KKw0KKwl7DQor CQlVMzIgY29uc3QgYWxnb05iID0gSFVGX3NlbGVjdERlY29kZXIoZHN0U2l6ZSwgY1NyY1NpemUp Ow0KKwkJcmV0dXJuIGFsZ29OYiA/IEhVRl9kZWNvbXByZXNzNFg0X0RDdHhfd2tzcChkY3R4LCBk c3QsIGRzdFNpemUsIGNTcmMsIGNTcmNTaXplLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpDQor CQkJICAgICAgOiBIVUZfZGVjb21wcmVzczRYMl9EQ3R4X3drc3AoZGN0eCwgZHN0LCBkc3RTaXpl LCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsNCisJfQ0KK30NCisN CitzaXplX3QgSFVGX2RlY29tcHJlc3MxWF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9p ZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXpl LCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3sNCisJLyogdmFsaWRh dGlvbiBjaGVja3MgKi8NCisJaWYgKGRzdFNpemUgPT0gMCkNCisJCXJldHVybiBFUlJPUihkc3RT aXplX3Rvb1NtYWxsKTsNCisJaWYgKGNTcmNTaXplID4gZHN0U2l6ZSkNCisJCXJldHVybiBFUlJP Uihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogaW52YWxpZCAqLw0KKwlpZiAoY1NyY1NpemUgPT0g ZHN0U2l6ZSkgew0KKwkJbWVtY3B5KGRzdCwgY1NyYywgZHN0U2l6ZSk7DQorCQlyZXR1cm4gZHN0 U2l6ZTsNCisJfSAvKiBub3QgY29tcHJlc3NlZCAqLw0KKwlpZiAoY1NyY1NpemUgPT0gMSkgew0K KwkJbWVtc2V0KGRzdCwgKihjb25zdCBCWVRFICopY1NyYywgZHN0U2l6ZSk7DQorCQlyZXR1cm4g ZHN0U2l6ZTsNCisJfSAvKiBSTEUgKi8NCisNCisJew0KKwkJVTMyIGNvbnN0IGFsZ29OYiA9IEhV Rl9zZWxlY3REZWNvZGVyKGRzdFNpemUsIGNTcmNTaXplKTsNCisJCXJldHVybiBhbGdvTmIgPyBI VUZfZGVjb21wcmVzczFYNF9EQ3R4X3drc3AoZGN0eCwgZHN0LCBkc3RTaXplLCBjU3JjLCBjU3Jj U2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKQ0KKwkJCSAgICAgIDogSFVGX2RlY29tcHJl c3MxWDJfREN0eF93a3NwKGRjdHgsIGRzdCwgZHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIHdvcmtz cGFjZSwgd29ya3NwYWNlU2l6ZSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEveGVuL2NvbW1vbi96 c3RkL21lbS5oIGIveGVuL2NvbW1vbi96c3RkL21lbS5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0K aW5kZXggMDAwMDAwMDAwMC4uOTNkN2EyYzM3Nw0KLS0tIC9kZXYvbnVsbA0KKysrIGIveGVuL2Nv bW1vbi96c3RkL21lbS5oDQpAQCAtMCwwICsxLDE1MSBAQA0KKy8qKg0KKyAqIENvcHlyaWdodCAo YykgMjAxNi1wcmVzZW50LCBZYW5uIENvbGxldCwgRmFjZWJvb2ssIEluYy4NCisgKiBBbGwgcmln aHRzIHJlc2VydmVkLg0KKyAqDQorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlDQorICogTElDRU5TRSBmaWxlIGlu IHRoZSByb290IGRpcmVjdG9yeSBvZiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svenN0ZC4N CisgKiBBbiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGlu IHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlDQorICogc2FtZSBkaXJlY3RvcnkuDQorICoNCisgKiBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeSBpdCB1bmRlcg0KKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUNCisgKiBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNl bGVjdA0KKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UNCisgKiAoIkJTRCIpLg0KKyAqLw0KKw0KKyNpZm5k ZWYgTUVNX0hfTU9EVUxFDQorI2RlZmluZSBNRU1fSF9NT0RVTEUNCisNCisvKi0qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRGVwZW5kZW5jaWVzDQorKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlIDxhc20vdW5h bGlnbmVkLmg+DQorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1jcHkgKi8NCisjaW5j bHVkZSA8bGludXgvdHlwZXMuaD4gIC8qIHNpemVfdCwgcHRyZGlmZl90ICovDQorDQorLyotKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIENvbXBpbGVyIHNwZWNp Zmljcw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVm aW5lIFpTVERfU1RBVElDIHN0YXRpYyBpbmxpbmUNCisNCisvKi0qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIEJhc2ljIFR5 cGVzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQordHlwZWRlZiB1aW50OF90IEJZVEU7DQordHlwZWRlZiB1aW50MTZf dCBVMTY7DQordHlwZWRlZiBpbnQxNl90IFMxNjsNCit0eXBlZGVmIHVpbnQzMl90IFUzMjsNCit0 eXBlZGVmIGludDMyX3QgUzMyOw0KK3R5cGVkZWYgdWludDY0X3QgVTY0Ow0KK3R5cGVkZWYgaW50 NjRfdCBTNjQ7DQordHlwZWRlZiBwdHJkaWZmX3QgaVB0ckRpZmY7DQordHlwZWRlZiB1aW50cHRy X3QgdVB0ckRpZmY7DQorDQorLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBNZW1vcnkgSS9PDQorKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQor WlNURF9TVEFUSUMgdW5zaWduZWQgWlNURF8zMmJpdHModm9pZCkgeyByZXR1cm4gc2l6ZW9mKHNp emVfdCkgPT0gNDsgfQ0KK1pTVERfU1RBVElDIHVuc2lnbmVkIFpTVERfNjRiaXRzKHZvaWQpIHsg cmV0dXJuIHNpemVvZihzaXplX3QpID09IDg7IH0NCisNCisjaWYgZGVmaW5lZChfX0xJVFRMRV9F TkRJQU4pDQorI2RlZmluZSBaU1REX0xJVFRMRV9FTkRJQU4gMQ0KKyNlbHNlDQorI2RlZmluZSBa U1REX0xJVFRMRV9FTkRJQU4gMA0KKyNlbmRpZg0KKw0KK1pTVERfU1RBVElDIHVuc2lnbmVkIFpT VERfaXNMaXR0bGVFbmRpYW4odm9pZCkgeyByZXR1cm4gWlNURF9MSVRUTEVfRU5ESUFOOyB9DQor DQorWlNURF9TVEFUSUMgVTE2IFpTVERfcmVhZDE2KGNvbnN0IHZvaWQgKm1lbVB0cikgeyByZXR1 cm4gZ2V0X3VuYWxpZ25lZCgoY29uc3QgVTE2ICopbWVtUHRyKTsgfQ0KKw0KK1pTVERfU1RBVElD IFUzMiBaU1REX3JlYWQzMihjb25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIGdldF91bmFsaWdu ZWQoKGNvbnN0IFUzMiAqKW1lbVB0cik7IH0NCisNCitaU1REX1NUQVRJQyBVNjQgWlNURF9yZWFk NjQoY29uc3Qgdm9pZCAqbWVtUHRyKSB7IHJldHVybiBnZXRfdW5hbGlnbmVkKChjb25zdCBVNjQg KiltZW1QdHIpOyB9DQorDQorWlNURF9TVEFUSUMgc2l6ZV90IFpTVERfcmVhZFNUKGNvbnN0IHZv aWQgKm1lbVB0cikgeyByZXR1cm4gZ2V0X3VuYWxpZ25lZCgoY29uc3Qgc2l6ZV90ICopbWVtUHRy KTsgfQ0KKw0KK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZTE2KHZvaWQgKm1lbVB0ciwgVTE2 IHZhbHVlKSB7IHB1dF91bmFsaWduZWQodmFsdWUsIChVMTYgKiltZW1QdHIpOyB9DQorDQorWlNU RF9TVEFUSUMgdm9pZCBaU1REX3dyaXRlMzIodm9pZCAqbWVtUHRyLCBVMzIgdmFsdWUpIHsgcHV0 X3VuYWxpZ25lZCh2YWx1ZSwgKFUzMiAqKW1lbVB0cik7IH0NCisNCitaU1REX1NUQVRJQyB2b2lk IFpTVERfd3JpdGU2NCh2b2lkICptZW1QdHIsIFU2NCB2YWx1ZSkgeyBwdXRfdW5hbGlnbmVkKHZh bHVlLCAoVTY0ICopbWVtUHRyKTsgfQ0KKw0KKy8qPT09IExpdHRsZSBlbmRpYW4gci93ID09PSov DQorDQorWlNURF9TVEFUSUMgVTE2IFpTVERfcmVhZExFMTYoY29uc3Qgdm9pZCAqbWVtUHRyKSB7 IHJldHVybiBnZXRfdW5hbGlnbmVkX2xlMTYobWVtUHRyKTsgfQ0KKw0KK1pTVERfU1RBVElDIHZv aWQgWlNURF93cml0ZUxFMTYodm9pZCAqbWVtUHRyLCBVMTYgdmFsKSB7IHB1dF91bmFsaWduZWRf bGUxNih2YWwsIG1lbVB0cik7IH0NCisNCitaU1REX1NUQVRJQyBVMzIgWlNURF9yZWFkTEUyNChj b25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIFpTVERfcmVhZExFMTYobWVtUHRyKSArICgoKGNv bnN0IEJZVEUgKiltZW1QdHIpWzJdIDw8IDE2KTsgfQ0KKw0KK1pTVERfU1RBVElDIHZvaWQgWlNU RF93cml0ZUxFMjQodm9pZCAqbWVtUHRyLCBVMzIgdmFsKQ0KK3sNCisJWlNURF93cml0ZUxFMTYo bWVtUHRyLCAoVTE2KXZhbCk7DQorCSgoQllURSAqKW1lbVB0cilbMl0gPSAoQllURSkodmFsID4+ IDE2KTsNCit9DQorDQorWlNURF9TVEFUSUMgVTMyIFpTVERfcmVhZExFMzIoY29uc3Qgdm9pZCAq bWVtUHRyKSB7IHJldHVybiBnZXRfdW5hbGlnbmVkX2xlMzIobWVtUHRyKTsgfQ0KKw0KK1pTVERf U1RBVElDIHZvaWQgWlNURF93cml0ZUxFMzIodm9pZCAqbWVtUHRyLCBVMzIgdmFsMzIpIHsgcHV0 X3VuYWxpZ25lZF9sZTMyKHZhbDMyLCBtZW1QdHIpOyB9DQorDQorWlNURF9TVEFUSUMgVTY0IFpT VERfcmVhZExFNjQoY29uc3Qgdm9pZCAqbWVtUHRyKSB7IHJldHVybiBnZXRfdW5hbGlnbmVkX2xl NjQobWVtUHRyKTsgfQ0KKw0KK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZUxFNjQodm9pZCAq bWVtUHRyLCBVNjQgdmFsNjQpIHsgcHV0X3VuYWxpZ25lZF9sZTY0KHZhbDY0LCBtZW1QdHIpOyB9 DQorDQorWlNURF9TVEFUSUMgc2l6ZV90IFpTVERfcmVhZExFU1QoY29uc3Qgdm9pZCAqbWVtUHRy KQ0KK3sNCisJaWYgKFpTVERfMzJiaXRzKCkpDQorCQlyZXR1cm4gKHNpemVfdClaU1REX3JlYWRM RTMyKG1lbVB0cik7DQorCWVsc2UNCisJCXJldHVybiAoc2l6ZV90KVpTVERfcmVhZExFNjQobWVt UHRyKTsNCit9DQorDQorWlNURF9TVEFUSUMgdm9pZCBaU1REX3dyaXRlTEVTVCh2b2lkICptZW1Q dHIsIHNpemVfdCB2YWwpDQorew0KKwlpZiAoWlNURF8zMmJpdHMoKSkNCisJCVpTVERfd3JpdGVM RTMyKG1lbVB0ciwgKFUzMil2YWwpOw0KKwllbHNlDQorCQlaU1REX3dyaXRlTEU2NChtZW1QdHIs IChVNjQpdmFsKTsNCit9DQorDQorLyo9PT0gQmlnIGVuZGlhbiByL3cgPT09Ki8NCisNCitaU1RE X1NUQVRJQyBVMzIgWlNURF9yZWFkQkUzMihjb25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIGdl dF91bmFsaWduZWRfYmUzMihtZW1QdHIpOyB9DQorDQorWlNURF9TVEFUSUMgdm9pZCBaU1REX3dy aXRlQkUzMih2b2lkICptZW1QdHIsIFUzMiB2YWwzMikgeyBwdXRfdW5hbGlnbmVkX2JlMzIodmFs MzIsIG1lbVB0cik7IH0NCisNCitaU1REX1NUQVRJQyBVNjQgWlNURF9yZWFkQkU2NChjb25zdCB2 b2lkICptZW1QdHIpIHsgcmV0dXJuIGdldF91bmFsaWduZWRfYmU2NChtZW1QdHIpOyB9DQorDQor WlNURF9TVEFUSUMgdm9pZCBaU1REX3dyaXRlQkU2NCh2b2lkICptZW1QdHIsIFU2NCB2YWw2NCkg eyBwdXRfdW5hbGlnbmVkX2JlNjQodmFsNjQsIG1lbVB0cik7IH0NCisNCitaU1REX1NUQVRJQyBz aXplX3QgWlNURF9yZWFkQkVTVChjb25zdCB2b2lkICptZW1QdHIpDQorew0KKwlpZiAoWlNURF8z MmJpdHMoKSkNCisJCXJldHVybiAoc2l6ZV90KVpTVERfcmVhZEJFMzIobWVtUHRyKTsNCisJZWxz ZQ0KKwkJcmV0dXJuIChzaXplX3QpWlNURF9yZWFkQkU2NChtZW1QdHIpOw0KK30NCisNCitaU1RE X1NUQVRJQyB2b2lkIFpTVERfd3JpdGVCRVNUKHZvaWQgKm1lbVB0ciwgc2l6ZV90IHZhbCkNCit7 DQorCWlmIChaU1REXzMyYml0cygpKQ0KKwkJWlNURF93cml0ZUJFMzIobWVtUHRyLCAoVTMyKXZh bCk7DQorCWVsc2UNCisJCVpTVERfd3JpdGVCRTY0KG1lbVB0ciwgKFU2NCl2YWwpOw0KK30NCisN CisvKiBmdW5jdGlvbiBzYWZlIG9ubHkgZm9yIGNvbXBhcmlzb25zICovDQorWlNURF9TVEFUSUMg VTMyIFpTVERfcmVhZE1JTk1BVENIKGNvbnN0IHZvaWQgKm1lbVB0ciwgVTMyIGxlbmd0aCkNCit7 DQorCXN3aXRjaCAobGVuZ3RoKSB7DQorCWRlZmF1bHQ6DQorCWNhc2UgNDogcmV0dXJuIFpTVERf cmVhZDMyKG1lbVB0cik7DQorCWNhc2UgMzoNCisJCWlmIChaU1REX2lzTGl0dGxlRW5kaWFuKCkp DQorCQkJcmV0dXJuIFpTVERfcmVhZDMyKG1lbVB0cikgPDwgODsNCisJCWVsc2UNCisJCQlyZXR1 cm4gWlNURF9yZWFkMzIobWVtUHRyKSA+PiA4Ow0KKwl9DQorfQ0KKw0KKyNlbmRpZiAvKiBNRU1f SF9NT0RVTEUgKi8NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvenN0ZF9jb21tb24uYyBi L3hlbi9jb21tb24venN0ZC96c3RkX2NvbW1vbi5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5k ZXggMDAwMDAwMDAwMC4uYTI4MjYyNGVlMQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIveGVuL2NvbW1v bi96c3RkL3pzdGRfY29tbW9uLmMNCkBAIC0wLDAgKzEsNzUgQEANCisvKioNCisgKiBDb3B5cmln aHQgKGMpIDIwMTYtcHJlc2VudCwgWWFubiBDb2xsZXQsIEZhY2Vib29rLCBJbmMuDQorICogQWxs IHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQg dW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQ0KKyAqIExJQ0VOU0UgZmls ZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3pz dGQuDQorICogQW4gYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3Vu ZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZQ0KKyAqIHNhbWUgZGlyZWN0b3J5Lg0KKyAqDQor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlDQorICogRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1h eSBzZWxlY3QNCisgKiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSAoIkdQTCIpIG9yIEJTRCBsaWNlbnNlDQorICogKCJCU0QiKS4NCisgKi8NCisNCisv Ki0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRGVwZW5kZW5jaWVz DQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJl cnJvcl9wcml2YXRlLmgiDQorI2luY2x1ZGUgInpzdGRfaW50ZXJuYWwuaCIgLyogZGVjbGFyYXRp b24gb2YgWlNURF9pc0Vycm9yLCBaU1REX2dldEVycm9yTmFtZSwgWlNURF9nZXRFcnJvckNvZGUs IFpTVERfZ2V0RXJyb3JTdHJpbmcsIFpTVERfdmVyc2lvbk51bWJlciAqLw0KKyNpbmNsdWRlIDxs aW51eC9rZXJuZWwuaD4NCisNCisvKj0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIEN1c3RvbSBhbGxvY2F0b3INCisqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLw0KKw0KKyNkZWZpbmUgc3RhY2tfcHVzaChzdGFjaywgc2l6ZSkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcDQorCSh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXA0KKwkJdm9pZCAqY29uc3QgcHRyID0gWlNURF9QVFJfQUxJ R04oKHN0YWNrKS0+cHRyKTsgXA0KKwkJKHN0YWNrKS0+cHRyID0gKGNoYXIgKilwdHIgKyAoc2l6 ZSk7ICAgICAgICAgICAgXA0KKwkJKHN0YWNrKS0+cHRyIDw9IChzdGFjayktPmVuZCA/IHB0ciA6 IE5VTEw7ICAgICAgXA0KKwl9KQ0KKw0KK1pTVERfY3VzdG9tTWVtIFpTVERfaW5pdFN0YWNrKHZv aWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorew0KKwlaU1REX2N1c3RvbU1l bSBzdGFja01lbSA9IHtaU1REX3N0YWNrQWxsb2MsIFpTVERfc3RhY2tGcmVlLCB3b3Jrc3BhY2V9 Ow0KKwlaU1REX3N0YWNrICpzdGFjayA9IChaU1REX3N0YWNrICopd29ya3NwYWNlOw0KKwkvKiBW ZXJpZnkgcHJlY29uZGl0aW9ucyAqLw0KKwlpZiAoIXdvcmtzcGFjZSB8fCB3b3Jrc3BhY2VTaXpl IDwgc2l6ZW9mKFpTVERfc3RhY2spIHx8IHdvcmtzcGFjZSAhPSBaU1REX1BUUl9BTElHTih3b3Jr c3BhY2UpKSB7DQorCQlaU1REX2N1c3RvbU1lbSBlcnJvciA9IHtOVUxMLCBOVUxMLCBOVUxMfTsN CisJCXJldHVybiBlcnJvcjsNCisJfQ0KKwkvKiBJbml0aWFsaXplIHRoZSBzdGFjayAqLw0KKwlz dGFjay0+cHRyID0gd29ya3NwYWNlOw0KKwlzdGFjay0+ZW5kID0gKGNoYXIgKil3b3Jrc3BhY2Ug KyB3b3Jrc3BhY2VTaXplOw0KKwlzdGFja19wdXNoKHN0YWNrLCBzaXplb2YoWlNURF9zdGFjaykp Ow0KKwlyZXR1cm4gc3RhY2tNZW07DQorfQ0KKw0KK3ZvaWQgKlpTVERfc3RhY2tBbGxvY0FsbCh2 b2lkICpvcGFxdWUsIHNpemVfdCAqc2l6ZSkNCit7DQorCVpTVERfc3RhY2sgKnN0YWNrID0gKFpT VERfc3RhY2sgKilvcGFxdWU7DQorCSpzaXplID0gKEJZVEUgY29uc3QgKilzdGFjay0+ZW5kIC0g KEJZVEUgKilaU1REX1BUUl9BTElHTihzdGFjay0+cHRyKTsNCisJcmV0dXJuIHN0YWNrX3B1c2go c3RhY2ssICpzaXplKTsNCit9DQorDQordm9pZCAqWlNURF9zdGFja0FsbG9jKHZvaWQgKm9wYXF1 ZSwgc2l6ZV90IHNpemUpDQorew0KKwlaU1REX3N0YWNrICpzdGFjayA9IChaU1REX3N0YWNrICop b3BhcXVlOw0KKwlyZXR1cm4gc3RhY2tfcHVzaChzdGFjaywgc2l6ZSk7DQorfQ0KK3ZvaWQgWlNU RF9zdGFja0ZyZWUodm9pZCAqb3BhcXVlLCB2b2lkICphZGRyZXNzKQ0KK3sNCisJKHZvaWQpb3Bh cXVlOw0KKwkodm9pZClhZGRyZXNzOw0KK30NCisNCit2b2lkICpaU1REX21hbGxvYyhzaXplX3Qg c2l6ZSwgWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKSB7IHJldHVybiBjdXN0b21NZW0uY3VzdG9t QWxsb2MoY3VzdG9tTWVtLm9wYXF1ZSwgc2l6ZSk7IH0NCisNCit2b2lkIFpTVERfZnJlZSh2b2lk ICpwdHIsIFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkNCit7DQorCWlmIChwdHIgIT0gTlVMTCkN CisJCWN1c3RvbU1lbS5jdXN0b21GcmVlKGN1c3RvbU1lbS5vcGFxdWUsIHB0cik7DQorfQ0KZGlm ZiAtLWdpdCBhL3hlbi9jb21tb24venN0ZC96c3RkX2ludGVybmFsLmggYi94ZW4vY29tbW9uL3pz dGQvenN0ZF9pbnRlcm5hbC5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAw MC4uZGFjNzUzMzk3Zg0KLS0tIC9kZXYvbnVsbA0KKysrIGIveGVuL2NvbW1vbi96c3RkL3pzdGRf aW50ZXJuYWwuaA0KQEAgLTAsMCArMSwyNzMgQEANCisvKioNCisgKiBDb3B5cmlnaHQgKGMpIDIw MTYtcHJlc2VudCwgWWFubiBDb2xsZXQsIEZhY2Vib29rLCBJbmMuDQorICogQWxsIHJpZ2h0cyBy ZXNlcnZlZC4NCisgKg0KKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhl IEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQ0KKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUg cm9vdCBkaXJlY3Rvcnkgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3pzdGQuDQorICog QW4gYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUg UEFURU5UUyBmaWxlIGluIHRoZQ0KKyAqIHNhbWUgZGlyZWN0b3J5Lg0KKyAqDQorICogVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkgaXQgdW5kZXINCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlDQorICogRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QN CisgKiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAo IkdQTCIpIG9yIEJTRCBsaWNlbnNlDQorICogKCJCU0QiKS4NCisgKi8NCisNCisjaWZuZGVmIFpT VERfQ0NPTU1PTl9IX01PRFVMRQ0KKyNkZWZpbmUgWlNURF9DQ09NTU9OX0hfTU9EVUxFDQorDQor LyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kg0KKyogIENvbXBpbGVyIHNwZWNpZmljcw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVmaW5lIEZPUkNFX0lOTElORSBzdGF0 aWMgX19hbHdheXNfaW5saW5lDQorI2RlZmluZSBGT1JDRV9OT0lOTElORSBzdGF0aWMgbm9pbmxp bmUNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRGVw ZW5kZW5jaWVzDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNp bmNsdWRlICJlcnJvcl9wcml2YXRlLmgiDQorI2luY2x1ZGUgIm1lbS5oIg0KKyNpbmNsdWRlIDxs aW51eC9jb21waWxlci5oPg0KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8 bGludXgveHhoYXNoLmg+DQorI2luY2x1ZGUgPGxpbnV4L3pzdGQuaD4NCisNCisvKi0qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgc2hhcmVkIG1hY3Jvcw0KKyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVmaW5lIE1JTihhLCBiKSAo KGEpIDwgKGIpID8gKGEpIDogKGIpKQ0KKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAo YSkgOiAoYikpDQorI2RlZmluZSBDSEVDS19GKGYpICAgICAgICAgICAgICAgICAgICAgICBcDQor CXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisJCXNpemVfdCBjb25zdCBlcnJj b2QgPSBmOyBcDQorCQlpZiAoRVJSX2lzRXJyb3IoZXJyY29kKSkgXA0KKwkJCXJldHVybiBlcnJj b2Q7ICAgXA0KKwl9IC8qIGNoZWNrIGFuZCBGb3J3YXJkIGVycm9yIGNvZGUgKi8NCisjZGVmaW5l IENIRUNLX0UoZiwgZSkgICAgICAgICAgICAgICAgICAgIFwNCisJeyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXA0KKwkJc2l6ZV90IGNvbnN0IGVycmNvZCA9IGY7IFwNCisJCWlmIChF UlJfaXNFcnJvcihlcnJjb2QpKSBcDQorCQkJcmV0dXJuIEVSUk9SKGUpOyBcDQorCX0gLyogY2hl Y2sgYW5kIHNlbmQgRXJyb3IgY29kZSAqLw0KKyNkZWZpbmUgWlNURF9TVEFUSUNfQVNTRVJUKGMp ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorCXsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwkJZW51bSB7IFpTVERf c3RhdGljX2Fzc2VydCA9IDEgLyAoaW50KSghIShjKSkgfTsgXA0KKwl9DQorDQorLyotKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIENvbW1vbiBjb25zdGFudHMNCisq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2RlZmluZSBaU1REX09Q VF9OVU0gKDEgPDwgMTIpDQorI2RlZmluZSBaU1REX0RJQ1RfTUFHSUMgMHhFQzMwQTQzNyAvKiB2 MC43KyAqLw0KKw0KKyNkZWZpbmUgWlNURF9SRVBfTlVNIDMJCSAgICAgIC8qIG51bWJlciBvZiBy ZXBjb2RlcyAqLw0KKyNkZWZpbmUgWlNURF9SRVBfQ0hFQ0sgKFpTVERfUkVQX05VTSkgLyogbnVt YmVyIG9mIHJlcGNvZGVzIHRvIGNoZWNrIGJ5IHRoZSBvcHRpbWFsIHBhcnNlciAqLw0KKyNkZWZp bmUgWlNURF9SRVBfTU9WRSAoWlNURF9SRVBfTlVNIC0gMSkNCisjZGVmaW5lIFpTVERfUkVQX01P VkVfT1BUIChaU1REX1JFUF9OVU0pDQorc3RhdGljIGNvbnN0IFUzMiByZXBTdGFydFZhbHVlW1pT VERfUkVQX05VTV0gPSB7MSwgNCwgOH07DQorDQorI2RlZmluZSBLQiAqKDEgPDwgMTApDQorI2Rl ZmluZSBNQiAqKDEgPDwgMjApDQorI2RlZmluZSBHQiAqKDFVIDw8IDMwKQ0KKw0KKyNkZWZpbmUg QklUNyAxMjgNCisjZGVmaW5lIEJJVDYgNjQNCisjZGVmaW5lIEJJVDUgMzINCisjZGVmaW5lIEJJ VDQgMTYNCisjZGVmaW5lIEJJVDEgMg0KKyNkZWZpbmUgQklUMCAxDQorDQorI2RlZmluZSBaU1RE X1dJTkRPV0xPR19BQlNPTFVURU1JTiAxMA0KK3N0YXRpYyBjb25zdCBzaXplX3QgWlNURF9mY3Nf ZmllbGRTaXplWzRdID0gezAsIDIsIDQsIDh9Ow0KK3N0YXRpYyBjb25zdCBzaXplX3QgWlNURF9k aWRfZmllbGRTaXplWzRdID0gezAsIDEsIDIsIDR9Ow0KKw0KKyNkZWZpbmUgWlNURF9CTE9DS0hF QURFUlNJWkUgMyAvKiBDIHN0YW5kYXJkIGRvZXNuJ3QgYWxsb3cgYHN0YXRpYyBjb25zdGAgdmFy aWFibGUgdG8gYmUgaW5pdCB1c2luZyBhbm90aGVyIGBzdGF0aWMgY29uc3RgIHZhcmlhYmxlICov DQorc3RhdGljIGNvbnN0IHNpemVfdCBaU1REX2Jsb2NrSGVhZGVyU2l6ZSA9IFpTVERfQkxPQ0tI RUFERVJTSVpFOw0KK3R5cGVkZWYgZW51bSB7IGJ0X3JhdywgYnRfcmxlLCBidF9jb21wcmVzc2Vk LCBidF9yZXNlcnZlZCB9IGJsb2NrVHlwZV9lOw0KKw0KKyNkZWZpbmUgTUlOX1NFUVVFTkNFU19T SVpFIDEJCQkJCQkJCQkgIC8qIG5iU2VxPT0wICovDQorI2RlZmluZSBNSU5fQ0JMT0NLX1NJWkUg KDEgLypsaXRDU2l6ZSovICsgMSAvKiBSTEUgb3IgUkFXICovICsgTUlOX1NFUVVFTkNFU19TSVpF IC8qIG5iU2VxPT0wICovKSAvKiBmb3IgYSBub24tbnVsbCBibG9jayAqLw0KKw0KKyNkZWZpbmUg SHVmTG9nIDEyDQordHlwZWRlZiBlbnVtIHsgc2V0X2Jhc2ljLCBzZXRfcmxlLCBzZXRfY29tcHJl c3NlZCwgc2V0X3JlcGVhdCB9IHN5bWJvbEVuY29kaW5nVHlwZV9lOw0KKw0KKyNkZWZpbmUgTE9O R05CU0VRIDB4N0YwMA0KKw0KKyNkZWZpbmUgTUlOTUFUQ0ggMw0KKyNkZWZpbmUgRVFVQUxfUkVB RDMyIDQNCisNCisjZGVmaW5lIExpdGJpdHMgOA0KKyNkZWZpbmUgTWF4TGl0ICgoMSA8PCBMaXRi aXRzKSAtIDEpDQorI2RlZmluZSBNYXhNTCA1Mg0KKyNkZWZpbmUgTWF4TEwgMzUNCisjZGVmaW5l IE1heE9mZiAyOA0KKyNkZWZpbmUgTWF4U2VxIE1BWChNYXhMTCwgTWF4TUwpIC8qIEFzc3VtcHRp b24gOiBNYXhPZmYgPCBNYXhMTCxNYXhNTCAqLw0KKyNkZWZpbmUgTUxGU0VMb2cgOQ0KKyNkZWZp bmUgTExGU0VMb2cgOQ0KKyNkZWZpbmUgT2ZmRlNFTG9nIDgNCisNCitzdGF0aWMgY29uc3QgVTMy IExMX2JpdHNbTWF4TEwgKyAxXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw LCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA2LCA3LCA4LCA5LCAxMCwg MTEsIDEyLCAxMywgMTQsIDE1LCAxNn07DQorc3RhdGljIGNvbnN0IFMxNiBMTF9kZWZhdWx0Tm9y bVtNYXhMTCArIDFdID0gezQsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDEs IDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDIsIDEsIDEsIDEsIDEsIDEsIC0x LCAtMSwgLTEsIC0xfTsNCisjZGVmaW5lIExMX0RFRkFVTFROT1JNTE9HIDYgLyogZm9yIHN0YXRp YyBhbGxvY2F0aW9uICovDQorc3RhdGljIGNvbnN0IFUzMiBMTF9kZWZhdWx0Tm9ybUxvZyA9IExM X0RFRkFVTFROT1JNTE9HOw0KKw0KK3N0YXRpYyBjb25zdCBVMzIgTUxfYml0c1tNYXhNTCArIDFd ID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs IDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsDQorCQkJCSAgICAgICAwLCAwLCAwLCAw LCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA3LCA4LCA5LCAxMCwgMTEsIDEy LCAxMywgMTQsIDE1LCAxNn07DQorc3RhdGljIGNvbnN0IFMxNiBNTF9kZWZhdWx0Tm9ybVtNYXhN TCArIDFdID0gezEsIDQsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEs IDEsIDEsIDEsIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEsDQorCQkJCQkgICAgICAxLCAx LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAtMSwg LTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07DQorI2RlZmluZSBNTF9ERUZBVUxUTk9STUxPRyA2IC8q IGZvciBzdGF0aWMgYWxsb2NhdGlvbiAqLw0KK3N0YXRpYyBjb25zdCBVMzIgTUxfZGVmYXVsdE5v cm1Mb2cgPSBNTF9ERUZBVUxUTk9STUxPRzsNCisNCitzdGF0aWMgY29uc3QgUzE2IE9GX2RlZmF1 bHROb3JtW01heE9mZiArIDFdID0gezEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDEsIDEsIDEs IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMX07 DQorI2RlZmluZSBPRl9ERUZBVUxUTk9STUxPRyA1IC8qIGZvciBzdGF0aWMgYWxsb2NhdGlvbiAq Lw0KK3N0YXRpYyBjb25zdCBVMzIgT0ZfZGVmYXVsdE5vcm1Mb2cgPSBPRl9ERUZBVUxUTk9STUxP RzsNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQor KiAgU2hhcmVkIGZ1bmN0aW9ucyB0byBpbmNsdWRlIGZvciBpbmxpbmluZw0KKyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitaU1REX1NUQVRJQyB2b2lkIFpT VERfY29weTgodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMpIHsNCisJLyoNCisJICogenN0ZCBy ZWxpZXMgaGVhdmlseSBvbiBnY2MgYmVpbmcgYWJsZSB0byBhbmFseXplIGFuZCBpbmxpbmUgdGhp cw0KKwkgKiBtZW1jcHkoKSBjYWxsLCBzaW5jZSBpdCBpcyBjYWxsZWQgaW4gYSB0aWdodCBsb29w LiBQcmVib290IG1vZGUNCisJICogaXMgY29tcGlsZWQgaW4gZnJlZXN0YW5kaW5nIG1vZGUsIHdo aWNoIHN0b3BzIGdjYyBmcm9tIGFuYWx5emluZw0KKwkgKiBtZW1jcHkoKS4gVXNlIF9fYnVpbHRp bl9tZW1jcHkoKSB0byB0ZWxsIGdjYyB0byBhbmFseXplIHRoaXMgYXMgYQ0KKwkgKiByZWd1bGFy IG1lbWNweSgpLg0KKwkgKi8NCisJX19idWlsdGluX21lbWNweShkc3QsIHNyYywgOCk7DQorfQ0K Ky8qISBaU1REX3dpbGRjb3B5KCkgOg0KKyogICBjdXN0b20gdmVyc2lvbiBvZiBtZW1jcHkoKSwg Y2FuIGNvcHkgdXAgdG8gNyBieXRlcyB0b28gbWFueSAoOCBieXRlcyBpZiBsZW5ndGg9PTApICov DQorI2RlZmluZSBXSUxEQ09QWV9PVkVSTEVOR1RIIDgNCitaU1REX1NUQVRJQyB2b2lkIFpTVERf d2lsZGNvcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHB0cmRpZmZfdCBsZW5ndGgpDQor ew0KKwljb25zdCBCWVRFKiBpcCA9IChjb25zdCBCWVRFKilzcmM7DQorCUJZVEUqIG9wID0gKEJZ VEUqKWRzdDsNCisJQllURSogY29uc3Qgb2VuZCA9IG9wICsgbGVuZ3RoOw0KKyNpZiBkZWZpbmVk KEdDQ19WRVJTSU9OKSAmJiBHQ0NfVkVSU0lPTiA+PSA3MDAwMCAmJiBHQ0NfVkVSU0lPTiA8IDcw MjAwDQorCS8qDQorCSAqIFdvcmsgYXJvdW5kIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEv c2hvd19idWcuY2dpP2lkPTgxMzg4Lg0KKwkgKiBBdm9pZCB0aGUgYmFkIGNhc2Ugd2hlcmUgdGhl IGxvb3Agb25seSBydW5zIG9uY2UgYnkgaGFuZGxpbmcgdGhlDQorCSAqIHNwZWNpYWwgY2FzZSBz ZXBhcmF0ZWx5LiBUaGlzIGRvZXNuJ3QgdHJpZ2dlciB0aGUgYnVnIGJlY2F1c2UgaXQNCisJICog ZG9lc24ndCBpbnZvbHZlIHBvaW50ZXIvaW50ZWdlciBvdmVyZmxvdy4NCisJICovDQorCWlmIChs ZW5ndGggPD0gOCkNCisJCXJldHVybiBaU1REX2NvcHk4KGRzdCwgc3JjKTsNCisjZW5kaWYNCisJ ZG8gew0KKwkJWlNURF9jb3B5OChvcCwgaXApOw0KKwkJb3AgKz0gODsNCisJCWlwICs9IDg7DQor CX0gd2hpbGUgKG9wIDwgb2VuZCk7DQorfQ0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioNCisqICBQcml2YXRlIGludGVyZmFjZXMNCisqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordHlwZWRlZiBzdHJ1Y3QgWlNU RF9zdGF0c19zIFpTVERfc3RhdHNfdDsNCisNCit0eXBlZGVmIHN0cnVjdCB7DQorCVUzMiBvZmY7 DQorCVUzMiBsZW47DQorfSBaU1REX21hdGNoX3Q7DQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlV MzIgcHJpY2U7DQorCVUzMiBvZmY7DQorCVUzMiBtbGVuOw0KKwlVMzIgbGl0bGVuOw0KKwlVMzIg cmVwW1pTVERfUkVQX05VTV07DQorfSBaU1REX29wdGltYWxfdDsNCisNCit0eXBlZGVmIHN0cnVj dCBzZXFEZWZfcyB7DQorCVUzMiBvZmZzZXQ7DQorCVUxNiBsaXRMZW5ndGg7DQorCVUxNiBtYXRj aExlbmd0aDsNCit9IHNlcURlZjsNCisNCit0eXBlZGVmIHN0cnVjdCB7DQorCXNlcURlZiAqc2Vx dWVuY2VzU3RhcnQ7DQorCXNlcURlZiAqc2VxdWVuY2VzOw0KKwlCWVRFICpsaXRTdGFydDsNCisJ QllURSAqbGl0Ow0KKwlCWVRFICpsbENvZGU7DQorCUJZVEUgKm1sQ29kZTsNCisJQllURSAqb2ZD b2RlOw0KKwlVMzIgbG9uZ0xlbmd0aElEOyAvKiAwID09IG5vIGxvbmdMZW5ndGg7IDEgPT0gTGl0 LmxvbmdMZW5ndGg7IDIgPT0gTWF0Y2gubG9uZ0xlbmd0aDsgKi8NCisJVTMyIGxvbmdMZW5ndGhQ b3M7DQorCS8qIG9wdCAqLw0KKwlaU1REX29wdGltYWxfdCAqcHJpY2VUYWJsZTsNCisJWlNURF9t YXRjaF90ICptYXRjaFRhYmxlOw0KKwlVMzIgKm1hdGNoTGVuZ3RoRnJlcTsNCisJVTMyICpsaXRM ZW5ndGhGcmVxOw0KKwlVMzIgKmxpdEZyZXE7DQorCVUzMiAqb2ZmQ29kZUZyZXE7DQorCVUzMiBt YXRjaExlbmd0aFN1bTsNCisJVTMyIG1hdGNoU3VtOw0KKwlVMzIgbGl0TGVuZ3RoU3VtOw0KKwlV MzIgbGl0U3VtOw0KKwlVMzIgb2ZmQ29kZVN1bTsNCisJVTMyIGxvZzJtYXRjaExlbmd0aFN1bTsN CisJVTMyIGxvZzJtYXRjaFN1bTsNCisJVTMyIGxvZzJsaXRMZW5ndGhTdW07DQorCVUzMiBsb2cy bGl0U3VtOw0KKwlVMzIgbG9nMm9mZkNvZGVTdW07DQorCVUzMiBmYWN0b3I7DQorCVUzMiBzdGF0 aWNQcmljZXM7DQorCVUzMiBjYWNoZWRQcmljZTsNCisJVTMyIGNhY2hlZExpdExlbmd0aDsNCisJ Y29uc3QgQllURSAqY2FjaGVkTGl0ZXJhbHM7DQorfSBzZXFTdG9yZV90Ow0KKw0KK2NvbnN0IHNl cVN0b3JlX3QgKlpTVERfZ2V0U2VxU3RvcmUoY29uc3QgWlNURF9DQ3R4ICpjdHgpOw0KK3ZvaWQg WlNURF9zZXFUb0NvZGVzKGNvbnN0IHNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyKTsNCitpbnQgWlNU RF9pc1NraXBGcmFtZShaU1REX0RDdHggKmRjdHgpOw0KKw0KKy8qPSBDdXN0b20gbWVtb3J5IGFs bG9jYXRpb24gZnVuY3Rpb25zICovDQordHlwZWRlZiB2b2lkICooKlpTVERfYWxsb2NGdW5jdGlv bikodm9pZCAqb3BhcXVlLCBzaXplX3Qgc2l6ZSk7DQordHlwZWRlZiB2b2lkICgqWlNURF9mcmVl RnVuY3Rpb24pKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYWRkcmVzcyk7DQordHlwZWRlZiBzdHJ1Y3Qg ew0KKwlaU1REX2FsbG9jRnVuY3Rpb24gY3VzdG9tQWxsb2M7DQorCVpTVERfZnJlZUZ1bmN0aW9u IGN1c3RvbUZyZWU7DQorCXZvaWQgKm9wYXF1ZTsNCit9IFpTVERfY3VzdG9tTWVtOw0KKw0KK3Zv aWQgKlpTVERfbWFsbG9jKHNpemVfdCBzaXplLCBaU1REX2N1c3RvbU1lbSBjdXN0b21NZW0pOw0K K3ZvaWQgWlNURF9mcmVlKHZvaWQgKnB0ciwgWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKTsNCisN CisvKj09PT09PSBzdGFjayBhbGxvY2F0aW9uICA9PT09PT0qLw0KKw0KK3R5cGVkZWYgc3RydWN0 IHsNCisJdm9pZCAqcHRyOw0KKwljb25zdCB2b2lkICplbmQ7DQorfSBaU1REX3N0YWNrOw0KKw0K KyNkZWZpbmUgWlNURF9BTElHTih4KSBBTElHTih4LCBzaXplb2Yoc2l6ZV90KSkNCisjZGVmaW5l IFpTVERfUFRSX0FMSUdOKHApIFBUUl9BTElHTihwLCBzaXplb2Yoc2l6ZV90KSkNCisNCitaU1RE X2N1c3RvbU1lbSBaU1REX2luaXRTdGFjayh2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3Bh Y2VTaXplKTsNCisNCit2b2lkICpaU1REX3N0YWNrQWxsb2NBbGwodm9pZCAqb3BhcXVlLCBzaXpl X3QgKnNpemUpOw0KK3ZvaWQgKlpTVERfc3RhY2tBbGxvYyh2b2lkICpvcGFxdWUsIHNpemVfdCBz aXplKTsNCit2b2lkIFpTVERfc3RhY2tGcmVlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYWRkcmVzcyk7 DQorDQorLyo9PT09PT0gIGNvbW1vbiBmdW5jdGlvbiAgPT09PT09Ki8NCisNCitaU1REX1NUQVRJ QyBVMzIgWlNURF9oaWdoYml0MzIoVTMyIHZhbCkgeyByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6 KHZhbCk7IH0NCisNCisvKiBoaWRkZW4gZnVuY3Rpb25zICovDQorDQorLyogWlNURF9pbnZhbGlk YXRlUmVwQ29kZXMoKSA6DQorICogZW5zdXJlcyBuZXh0IGNvbXByZXNzaW9uIHdpbGwgbm90IHVz ZSByZXBjb2RlcyBmcm9tIHByZXZpb3VzIGJsb2NrLg0KKyAqIE5vdGUgOiBvbmx5IHdvcmtzIHdp dGggcmVndWxhciB2YXJpYW50Ow0KKyAqICAgICAgICBkbyBub3QgdXNlIHdpdGggZXh0RGljdCB2 YXJpYW50ICEgKi8NCit2b2lkIFpTVERfaW52YWxpZGF0ZVJlcENvZGVzKFpTVERfQ0N0eCAqY2N0 eCk7DQorDQorc2l6ZV90IFpTVERfZnJlZUNDdHgoWlNURF9DQ3R4ICpjY3R4KTsNCitzaXplX3Qg WlNURF9mcmVlREN0eChaU1REX0RDdHggKmRjdHgpOw0KK3NpemVfdCBaU1REX2ZyZWVDRGljdCha U1REX0NEaWN0ICpjZGljdCk7DQorc2l6ZV90IFpTVERfZnJlZUREaWN0KFpTVERfRERpY3QgKmNk aWN0KTsNCitzaXplX3QgWlNURF9mcmVlQ1N0cmVhbShaU1REX0NTdHJlYW0gKnpjcyk7DQorc2l6 ZV90IFpTVERfZnJlZURTdHJlYW0oWlNURF9EU3RyZWFtICp6ZHMpOw0KKw0KKyNlbmRpZiAvKiBa U1REX0NDT01NT05fSF9NT0RVTEUgKi8NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvenN0 ZF9vcHQuaCBiL3hlbi9jb21tb24venN0ZC96c3RkX29wdC5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0 NA0KaW5kZXggMDAwMDAwMDAwMC4uNTVlMWI0Y2JhOA0KLS0tIC9kZXYvbnVsbA0KKysrIGIveGVu L2NvbW1vbi96c3RkL3pzdGRfb3B0LmgNCkBAIC0wLDAgKzEsMTAxNCBAQA0KKy8qKg0KKyAqIENv cHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBQcnplbXlzbGF3IFNraWJpbnNraSwgWWFubiBDb2xs ZXQsIEZhY2Vib29rLCBJbmMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFRo aXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZv dW5kIGluIHRoZQ0KKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgaHR0 cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3pzdGQuDQorICogQW4gYWRkaXRpb25hbCBncmFudCBv ZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZQ0K KyAqIHNhbWUgZGlyZWN0b3J5Lg0KKyAqDQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCisgKiB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBw dWJsaXNoZWQgYnkgdGhlDQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dy YW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QNCisgKiBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIG9yIEJTRCBsaWNlbnNl DQorICogKCJCU0QiKS4NCisgKi8NCisNCisvKiBOb3RlIDogdGhpcyBmaWxlIGlzIGludGVuZGVk IHRvIGJlIGluY2x1ZGVkIHdpdGhpbiB6c3RkX2NvbXByZXNzLmMgKi8NCisNCisjaWZuZGVmIFpT VERfT1BUX0hfOTE4NDIzOTg3NDMNCisjZGVmaW5lIFpTVERfT1BUX0hfOTE4NDIzOTg3NDMNCisN CisjZGVmaW5lIFpTVERfTElURlJFUV9BREQgMg0KKyNkZWZpbmUgWlNURF9GUkVRX0RJViA0DQor I2RlZmluZSBaU1REX01BWF9QUklDRSAoMSA8PCAzMCkNCisNCisvKi0qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqDQorKiAgUHJpY2UgZnVuY3Rpb25zIGZvciBvcHRpbWFsIHBh cnNlcg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitGT1JDRV9J TkxJTkUgdm9pZCBaU1REX3NldExvZzJQcmljZXMoc2VxU3RvcmVfdCAqc3NQdHIpDQorew0KKwlz c1B0ci0+bG9nMm1hdGNoTGVuZ3RoU3VtID0gWlNURF9oaWdoYml0MzIoc3NQdHItPm1hdGNoTGVu Z3RoU3VtICsgMSk7DQorCXNzUHRyLT5sb2cybGl0TGVuZ3RoU3VtID0gWlNURF9oaWdoYml0MzIo c3NQdHItPmxpdExlbmd0aFN1bSArIDEpOw0KKwlzc1B0ci0+bG9nMmxpdFN1bSA9IFpTVERfaGln aGJpdDMyKHNzUHRyLT5saXRTdW0gKyAxKTsNCisJc3NQdHItPmxvZzJvZmZDb2RlU3VtID0gWlNU RF9oaWdoYml0MzIoc3NQdHItPm9mZkNvZGVTdW0gKyAxKTsNCisJc3NQdHItPmZhY3RvciA9IDEg KyAoKHNzUHRyLT5saXRTdW0gPj4gNSkgLyBzc1B0ci0+bGl0TGVuZ3RoU3VtKSArICgoc3NQdHIt PmxpdFN1bSA8PCAxKSAvIChzc1B0ci0+bGl0U3VtICsgc3NQdHItPm1hdGNoU3VtKSk7DQorfQ0K Kw0KK1pTVERfU1RBVElDIHZvaWQgWlNURF9yZXNjYWxlRnJlcXMoc2VxU3RvcmVfdCAqc3NQdHIs IGNvbnN0IEJZVEUgKnNyYywgc2l6ZV90IHNyY1NpemUpDQorew0KKwl1bnNpZ25lZCB1Ow0KKw0K Kwlzc1B0ci0+Y2FjaGVkTGl0ZXJhbHMgPSBOVUxMOw0KKwlzc1B0ci0+Y2FjaGVkUHJpY2UgPSBz c1B0ci0+Y2FjaGVkTGl0TGVuZ3RoID0gMDsNCisJc3NQdHItPnN0YXRpY1ByaWNlcyA9IDA7DQor DQorCWlmIChzc1B0ci0+bGl0TGVuZ3RoU3VtID09IDApIHsNCisJCWlmIChzcmNTaXplIDw9IDEw MjQpDQorCQkJc3NQdHItPnN0YXRpY1ByaWNlcyA9IDE7DQorDQorCQlmb3IgKHUgPSAwOyB1IDw9 IE1heExpdDsgdSsrKQ0KKwkJCXNzUHRyLT5saXRGcmVxW3VdID0gMDsNCisJCWZvciAodSA9IDA7 IHUgPCBzcmNTaXplOyB1KyspDQorCQkJc3NQdHItPmxpdEZyZXFbc3JjW3VdXSsrOw0KKw0KKwkJ c3NQdHItPmxpdFN1bSA9IDA7DQorCQlzc1B0ci0+bGl0TGVuZ3RoU3VtID0gTWF4TEwgKyAxOw0K KwkJc3NQdHItPm1hdGNoTGVuZ3RoU3VtID0gTWF4TUwgKyAxOw0KKwkJc3NQdHItPm9mZkNvZGVT dW0gPSAoTWF4T2ZmICsgMSk7DQorCQlzc1B0ci0+bWF0Y2hTdW0gPSAoWlNURF9MSVRGUkVRX0FE RCA8PCBMaXRiaXRzKTsNCisNCisJCWZvciAodSA9IDA7IHUgPD0gTWF4TGl0OyB1KyspIHsNCisJ CQlzc1B0ci0+bGl0RnJlcVt1XSA9IDEgKyAoc3NQdHItPmxpdEZyZXFbdV0gPj4gWlNURF9GUkVR X0RJVik7DQorCQkJc3NQdHItPmxpdFN1bSArPSBzc1B0ci0+bGl0RnJlcVt1XTsNCisJCX0NCisJ CWZvciAodSA9IDA7IHUgPD0gTWF4TEw7IHUrKykNCisJCQlzc1B0ci0+bGl0TGVuZ3RoRnJlcVt1 XSA9IDE7DQorCQlmb3IgKHUgPSAwOyB1IDw9IE1heE1MOyB1KyspDQorCQkJc3NQdHItPm1hdGNo TGVuZ3RoRnJlcVt1XSA9IDE7DQorCQlmb3IgKHUgPSAwOyB1IDw9IE1heE9mZjsgdSsrKQ0KKwkJ CXNzUHRyLT5vZmZDb2RlRnJlcVt1XSA9IDE7DQorCX0gZWxzZSB7DQorCQlzc1B0ci0+bWF0Y2hM ZW5ndGhTdW0gPSAwOw0KKwkJc3NQdHItPmxpdExlbmd0aFN1bSA9IDA7DQorCQlzc1B0ci0+b2Zm Q29kZVN1bSA9IDA7DQorCQlzc1B0ci0+bWF0Y2hTdW0gPSAwOw0KKwkJc3NQdHItPmxpdFN1bSA9 IDA7DQorDQorCQlmb3IgKHUgPSAwOyB1IDw9IE1heExpdDsgdSsrKSB7DQorCQkJc3NQdHItPmxp dEZyZXFbdV0gPSAxICsgKHNzUHRyLT5saXRGcmVxW3VdID4+IChaU1REX0ZSRVFfRElWICsgMSkp Ow0KKwkJCXNzUHRyLT5saXRTdW0gKz0gc3NQdHItPmxpdEZyZXFbdV07DQorCQl9DQorCQlmb3Ig KHUgPSAwOyB1IDw9IE1heExMOyB1KyspIHsNCisJCQlzc1B0ci0+bGl0TGVuZ3RoRnJlcVt1XSA9 IDEgKyAoc3NQdHItPmxpdExlbmd0aEZyZXFbdV0gPj4gKFpTVERfRlJFUV9ESVYgKyAxKSk7DQor CQkJc3NQdHItPmxpdExlbmd0aFN1bSArPSBzc1B0ci0+bGl0TGVuZ3RoRnJlcVt1XTsNCisJCX0N CisJCWZvciAodSA9IDA7IHUgPD0gTWF4TUw7IHUrKykgew0KKwkJCXNzUHRyLT5tYXRjaExlbmd0 aEZyZXFbdV0gPSAxICsgKHNzUHRyLT5tYXRjaExlbmd0aEZyZXFbdV0gPj4gWlNURF9GUkVRX0RJ Vik7DQorCQkJc3NQdHItPm1hdGNoTGVuZ3RoU3VtICs9IHNzUHRyLT5tYXRjaExlbmd0aEZyZXFb dV07DQorCQkJc3NQdHItPm1hdGNoU3VtICs9IHNzUHRyLT5tYXRjaExlbmd0aEZyZXFbdV0gKiAo dSArIDMpOw0KKwkJfQ0KKwkJc3NQdHItPm1hdGNoU3VtICo9IFpTVERfTElURlJFUV9BREQ7DQor CQlmb3IgKHUgPSAwOyB1IDw9IE1heE9mZjsgdSsrKSB7DQorCQkJc3NQdHItPm9mZkNvZGVGcmVx W3VdID0gMSArIChzc1B0ci0+b2ZmQ29kZUZyZXFbdV0gPj4gWlNURF9GUkVRX0RJVik7DQorCQkJ c3NQdHItPm9mZkNvZGVTdW0gKz0gc3NQdHItPm9mZkNvZGVGcmVxW3VdOw0KKwkJfQ0KKwl9DQor DQorCVpTVERfc2V0TG9nMlByaWNlcyhzc1B0cik7DQorfQ0KKw0KK0ZPUkNFX0lOTElORSBVMzIg WlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVfdCAqc3NQdHIsIFUzMiBsaXRMZW5ndGgsIGNv bnN0IEJZVEUgKmxpdGVyYWxzKQ0KK3sNCisJVTMyIHByaWNlLCB1Ow0KKw0KKwlpZiAoc3NQdHIt PnN0YXRpY1ByaWNlcykNCisJCXJldHVybiBaU1REX2hpZ2hiaXQzMigoVTMyKWxpdExlbmd0aCAr IDEpICsgKGxpdExlbmd0aCAqIDYpOw0KKw0KKwlpZiAobGl0TGVuZ3RoID09IDApDQorCQlyZXR1 cm4gc3NQdHItPmxvZzJsaXRMZW5ndGhTdW0gLSBaU1REX2hpZ2hiaXQzMihzc1B0ci0+bGl0TGVu Z3RoRnJlcVswXSArIDEpOw0KKw0KKwkvKiBsaXRlcmFscyAqLw0KKwlpZiAoc3NQdHItPmNhY2hl ZExpdGVyYWxzID09IGxpdGVyYWxzKSB7DQorCQlVMzIgY29uc3QgYWRkaXRpb25hbCA9IGxpdExl bmd0aCAtIHNzUHRyLT5jYWNoZWRMaXRMZW5ndGg7DQorCQljb25zdCBCWVRFICpsaXRlcmFsczIg PSBzc1B0ci0+Y2FjaGVkTGl0ZXJhbHMgKyBzc1B0ci0+Y2FjaGVkTGl0TGVuZ3RoOw0KKwkJcHJp Y2UgPSBzc1B0ci0+Y2FjaGVkUHJpY2UgKyBhZGRpdGlvbmFsICogc3NQdHItPmxvZzJsaXRTdW07 DQorCQlmb3IgKHUgPSAwOyB1IDwgYWRkaXRpb25hbDsgdSsrKQ0KKwkJCXByaWNlIC09IFpTVERf aGlnaGJpdDMyKHNzUHRyLT5saXRGcmVxW2xpdGVyYWxzMlt1XV0gKyAxKTsNCisJCXNzUHRyLT5j YWNoZWRQcmljZSA9IHByaWNlOw0KKwkJc3NQdHItPmNhY2hlZExpdExlbmd0aCA9IGxpdExlbmd0 aDsNCisJfSBlbHNlIHsNCisJCXByaWNlID0gbGl0TGVuZ3RoICogc3NQdHItPmxvZzJsaXRTdW07 DQorCQlmb3IgKHUgPSAwOyB1IDwgbGl0TGVuZ3RoOyB1KyspDQorCQkJcHJpY2UgLT0gWlNURF9o aWdoYml0MzIoc3NQdHItPmxpdEZyZXFbbGl0ZXJhbHNbdV1dICsgMSk7DQorDQorCQlpZiAobGl0 TGVuZ3RoID49IDEyKSB7DQorCQkJc3NQdHItPmNhY2hlZExpdGVyYWxzID0gbGl0ZXJhbHM7DQor CQkJc3NQdHItPmNhY2hlZFByaWNlID0gcHJpY2U7DQorCQkJc3NQdHItPmNhY2hlZExpdExlbmd0 aCA9IGxpdExlbmd0aDsNCisJCX0NCisJfQ0KKw0KKwkvKiBsaXRlcmFsIExlbmd0aCAqLw0KKwl7 DQorCQljb25zdCBCWVRFIExMX2RlbHRhQ29kZSA9IDE5Ow0KKwkJY29uc3QgQllURSBsbENvZGUg PSAobGl0TGVuZ3RoID4gNjMpID8gKEJZVEUpWlNURF9oaWdoYml0MzIobGl0TGVuZ3RoKSArIExM X2RlbHRhQ29kZSA6IExMX0NvZGVbbGl0TGVuZ3RoXTsNCisJCXByaWNlICs9IExMX2JpdHNbbGxD b2RlXSArIHNzUHRyLT5sb2cybGl0TGVuZ3RoU3VtIC0gWlNURF9oaWdoYml0MzIoc3NQdHItPmxp dExlbmd0aEZyZXFbbGxDb2RlXSArIDEpOw0KKwl9DQorDQorCXJldHVybiBwcmljZTsNCit9DQor DQorRk9SQ0VfSU5MSU5FIFUzMiBaU1REX2dldFByaWNlKHNlcVN0b3JlX3QgKnNlcVN0b3JlUHRy LCBVMzIgbGl0TGVuZ3RoLCBjb25zdCBCWVRFICpsaXRlcmFscywgVTMyIG9mZnNldCwgVTMyIG1h dGNoTGVuZ3RoLCBjb25zdCBpbnQgdWx0cmEpDQorew0KKwkvKiBvZmZzZXQgKi8NCisJVTMyIHBy aWNlOw0KKwlCWVRFIGNvbnN0IG9mZkNvZGUgPSAoQllURSlaU1REX2hpZ2hiaXQzMihvZmZzZXQg KyAxKTsNCisNCisJaWYgKHNlcVN0b3JlUHRyLT5zdGF0aWNQcmljZXMpDQorCQlyZXR1cm4gWlNU RF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdExlbmd0aCwgbGl0ZXJhbHMpICsgWlNU RF9oaWdoYml0MzIoKFUzMiltYXRjaExlbmd0aCArIDEpICsgMTYgKyBvZmZDb2RlOw0KKw0KKwlw cmljZSA9IG9mZkNvZGUgKyBzZXFTdG9yZVB0ci0+bG9nMm9mZkNvZGVTdW0gLSBaU1REX2hpZ2hi aXQzMihzZXFTdG9yZVB0ci0+b2ZmQ29kZUZyZXFbb2ZmQ29kZV0gKyAxKTsNCisJaWYgKCF1bHRy YSAmJiBvZmZDb2RlID49IDIwKQ0KKwkJcHJpY2UgKz0gKG9mZkNvZGUgLSAxOSkgKiAyOw0KKw0K KwkvKiBtYXRjaCBMZW5ndGggKi8NCisJew0KKwkJY29uc3QgQllURSBNTF9kZWx0YUNvZGUgPSAz NjsNCisJCWNvbnN0IEJZVEUgbWxDb2RlID0gKG1hdGNoTGVuZ3RoID4gMTI3KSA/IChCWVRFKVpT VERfaGlnaGJpdDMyKG1hdGNoTGVuZ3RoKSArIE1MX2RlbHRhQ29kZSA6IE1MX0NvZGVbbWF0Y2hM ZW5ndGhdOw0KKwkJcHJpY2UgKz0gTUxfYml0c1ttbENvZGVdICsgc2VxU3RvcmVQdHItPmxvZzJt YXRjaExlbmd0aFN1bSAtIFpTVERfaGlnaGJpdDMyKHNlcVN0b3JlUHRyLT5tYXRjaExlbmd0aEZy ZXFbbWxDb2RlXSArIDEpOw0KKwl9DQorDQorCXJldHVybiBwcmljZSArIFpTVERfZ2V0TGl0ZXJh bFByaWNlKHNlcVN0b3JlUHRyLCBsaXRMZW5ndGgsIGxpdGVyYWxzKSArIHNlcVN0b3JlUHRyLT5m YWN0b3I7DQorfQ0KKw0KK1pTVERfU1RBVElDIHZvaWQgWlNURF91cGRhdGVQcmljZShzZXFTdG9y ZV90ICpzZXFTdG9yZVB0ciwgVTMyIGxpdExlbmd0aCwgY29uc3QgQllURSAqbGl0ZXJhbHMsIFUz MiBvZmZzZXQsIFUzMiBtYXRjaExlbmd0aCkNCit7DQorCVUzMiB1Ow0KKw0KKwkvKiBsaXRlcmFs cyAqLw0KKwlzZXFTdG9yZVB0ci0+bGl0U3VtICs9IGxpdExlbmd0aCAqIFpTVERfTElURlJFUV9B REQ7DQorCWZvciAodSA9IDA7IHUgPCBsaXRMZW5ndGg7IHUrKykNCisJCXNlcVN0b3JlUHRyLT5s aXRGcmVxW2xpdGVyYWxzW3VdXSArPSBaU1REX0xJVEZSRVFfQUREOw0KKw0KKwkvKiBsaXRlcmFs IExlbmd0aCAqLw0KKwl7DQorCQljb25zdCBCWVRFIExMX2RlbHRhQ29kZSA9IDE5Ow0KKwkJY29u c3QgQllURSBsbENvZGUgPSAobGl0TGVuZ3RoID4gNjMpID8gKEJZVEUpWlNURF9oaWdoYml0MzIo bGl0TGVuZ3RoKSArIExMX2RlbHRhQ29kZSA6IExMX0NvZGVbbGl0TGVuZ3RoXTsNCisJCXNlcVN0 b3JlUHRyLT5saXRMZW5ndGhGcmVxW2xsQ29kZV0rKzsNCisJCXNlcVN0b3JlUHRyLT5saXRMZW5n dGhTdW0rKzsNCisJfQ0KKw0KKwkvKiBtYXRjaCBvZmZzZXQgKi8NCisJew0KKwkJQllURSBjb25z dCBvZmZDb2RlID0gKEJZVEUpWlNURF9oaWdoYml0MzIob2Zmc2V0ICsgMSk7DQorCQlzZXFTdG9y ZVB0ci0+b2ZmQ29kZVN1bSsrOw0KKwkJc2VxU3RvcmVQdHItPm9mZkNvZGVGcmVxW29mZkNvZGVd Kys7DQorCX0NCisNCisJLyogbWF0Y2ggTGVuZ3RoICovDQorCXsNCisJCWNvbnN0IEJZVEUgTUxf ZGVsdGFDb2RlID0gMzY7DQorCQljb25zdCBCWVRFIG1sQ29kZSA9IChtYXRjaExlbmd0aCA+IDEy NykgPyAoQllURSlaU1REX2hpZ2hiaXQzMihtYXRjaExlbmd0aCkgKyBNTF9kZWx0YUNvZGUgOiBN TF9Db2RlW21hdGNoTGVuZ3RoXTsNCisJCXNlcVN0b3JlUHRyLT5tYXRjaExlbmd0aEZyZXFbbWxD b2RlXSsrOw0KKwkJc2VxU3RvcmVQdHItPm1hdGNoTGVuZ3RoU3VtKys7DQorCX0NCisNCisJWlNU RF9zZXRMb2cyUHJpY2VzKHNlcVN0b3JlUHRyKTsNCit9DQorDQorI2RlZmluZSBTRVRfUFJJQ0Uo cG9zLCBtbGVuXywgb2Zmc2V0XywgbGl0bGVuXywgcHJpY2VfKSAgICAgICAgICAgXA0KKwl7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0K KwkJd2hpbGUgKGxhc3RfcG9zIDwgcG9zKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQor CQkJb3B0W2xhc3RfcG9zICsgMV0ucHJpY2UgPSBaU1REX01BWF9QUklDRTsgXA0KKwkJCWxhc3Rf cG9zKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisJCX0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwkJb3B0W3Bvc10ubWxlbiA9 IG1sZW5fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorCQlvcHRbcG9zXS5vZmYgPSBv ZmZzZXRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisJCW9wdFtwb3NdLmxpdGxlbiA9 IGxpdGxlbl87ICAgICAgICAgICAgICAgICAgICAgICAgXA0KKwkJb3B0W3Bvc10ucHJpY2UgPSBw cmljZV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorCX0NCisNCisvKiBVcGRhdGUgaGFz aFRhYmxlMyB1cCB0byBpcCAoZXhjbHVkZWQpDQorICAgQXNzdW1wdGlvbiA6IGFsd2F5cyB3aXRo aW4gcHJlZml4IChpLmUuIG5vdCB3aXRoaW4gZXh0RGljdCkgKi8NCitGT1JDRV9JTkxJTkUNCitV MzIgWlNURF9pbnNlcnRBbmRGaW5kRmlyc3RJbmRleEhhc2gzKFpTVERfQ0N0eCAqemMsIGNvbnN0 IEJZVEUgKmlwKQ0KK3sNCisJVTMyICpjb25zdCBoYXNoVGFibGUzID0gemMtPmhhc2hUYWJsZTM7 DQorCVUzMiBjb25zdCBoYXNoTG9nMyA9IHpjLT5oYXNoTG9nMzsNCisJY29uc3QgQllURSAqY29u c3QgYmFzZSA9IHpjLT5iYXNlOw0KKwlVMzIgaWR4ID0gemMtPm5leHRUb1VwZGF0ZTM7DQorCWNv bnN0IFUzMiB0YXJnZXQgPSB6Yy0+bmV4dFRvVXBkYXRlMyA9IChVMzIpKGlwIC0gYmFzZSk7DQor CWNvbnN0IHNpemVfdCBoYXNoMyA9IFpTVERfaGFzaDNQdHIoaXAsIGhhc2hMb2czKTsNCisNCisJ d2hpbGUgKGlkeCA8IHRhcmdldCkgew0KKwkJaGFzaFRhYmxlM1taU1REX2hhc2gzUHRyKGJhc2Ug KyBpZHgsIGhhc2hMb2czKV0gPSBpZHg7DQorCQlpZHgrKzsNCisJfQ0KKw0KKwlyZXR1cm4gaGFz aFRhYmxlM1toYXNoM107DQorfQ0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioNCisqICBCaW5hcnkgVHJlZSBzZWFyY2gNCisqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorc3RhdGljIFUzMiBaU1REX2luc2VydEJ0QW5kR2V0QWxsTWF0 Y2hlcyhaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29uc3QgQllURSAqY29u c3QgaUxpbWl0LCBVMzIgbmJDb21wYXJlcywgY29uc3QgVTMyIG1scywgVTMyIGV4dERpY3QsDQor CQkJCQkgWlNURF9tYXRjaF90ICptYXRjaGVzLCBjb25zdCBVMzIgbWluTWF0Y2hMZW4pDQorew0K Kwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gemMtPmJhc2U7DQorCWNvbnN0IFUzMiBjdXJyID0g KFUzMikoaXAgLSBiYXNlKTsNCisJY29uc3QgVTMyIGhhc2hMb2cgPSB6Yy0+cGFyYW1zLmNQYXJh bXMuaGFzaExvZzsNCisJY29uc3Qgc2l6ZV90IGggPSBaU1REX2hhc2hQdHIoaXAsIGhhc2hMb2cs IG1scyk7DQorCVUzMiAqY29uc3QgaGFzaFRhYmxlID0gemMtPmhhc2hUYWJsZTsNCisJVTMyIG1h dGNoSW5kZXggPSBoYXNoVGFibGVbaF07DQorCVUzMiAqY29uc3QgYnQgPSB6Yy0+Y2hhaW5UYWJs ZTsNCisJY29uc3QgVTMyIGJ0TG9nID0gemMtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nIC0gMTsN CisJY29uc3QgVTMyIGJ0TWFzayA9ICgxVSA8PCBidExvZykgLSAxOw0KKwlzaXplX3QgY29tbW9u TGVuZ3RoU21hbGxlciA9IDAsIGNvbW1vbkxlbmd0aExhcmdlciA9IDA7DQorCWNvbnN0IEJZVEUg KmNvbnN0IGRpY3RCYXNlID0gemMtPmRpY3RCYXNlOw0KKwljb25zdCBVMzIgZGljdExpbWl0ID0g emMtPmRpY3RMaW1pdDsNCisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RCYXNlICsg ZGljdExpbWl0Ow0KKwljb25zdCBCWVRFICpjb25zdCBwcmVmaXhTdGFydCA9IGJhc2UgKyBkaWN0 TGltaXQ7DQorCWNvbnN0IFUzMiBidExvdyA9IGJ0TWFzayA+PSBjdXJyID8gMCA6IGN1cnIgLSBi dE1hc2s7DQorCWNvbnN0IFUzMiB3aW5kb3dMb3cgPSB6Yy0+bG93TGltaXQ7DQorCVUzMiAqc21h bGxlclB0ciA9IGJ0ICsgMiAqIChjdXJyICYgYnRNYXNrKTsNCisJVTMyICpsYXJnZXJQdHIgPSBi dCArIDIgKiAoY3VyciAmIGJ0TWFzaykgKyAxOw0KKwlVMzIgbWF0Y2hFbmRJZHggPSBjdXJyICsg ODsNCisJVTMyIGR1bW15MzI7IC8qIHRvIGJlIG51bGxpZmllZCBhdCB0aGUgZW5kICovDQorCVUz MiBtbnVtID0gMDsNCisNCisJY29uc3QgVTMyIG1pbk1hdGNoID0gKG1scyA9PSAzKSA/IDMgOiA0 Ow0KKwlzaXplX3QgYmVzdExlbmd0aCA9IG1pbk1hdGNoTGVuIC0gMTsNCisNCisJaWYgKG1pbk1h dGNoID09IDMpIHsgLyogSEMzIG1hdGNoIGZpbmRlciAqLw0KKwkJVTMyIGNvbnN0IG1hdGNoSW5k ZXgzID0gWlNURF9pbnNlcnRBbmRGaW5kRmlyc3RJbmRleEhhc2gzKHpjLCBpcCk7DQorCQlpZiAo bWF0Y2hJbmRleDMgPiB3aW5kb3dMb3cgJiYgKGN1cnIgLSBtYXRjaEluZGV4MyA8ICgxIDw8IDE4 KSkpIHsNCisJCQljb25zdCBCWVRFICptYXRjaDsNCisJCQlzaXplX3QgY3Vyck1sID0gMDsNCisJ CQlpZiAoKCFleHREaWN0KSB8fCBtYXRjaEluZGV4MyA+PSBkaWN0TGltaXQpIHsNCisJCQkJbWF0 Y2ggPSBiYXNlICsgbWF0Y2hJbmRleDM7DQorCQkJCWlmIChtYXRjaFtiZXN0TGVuZ3RoXSA9PSBp cFtiZXN0TGVuZ3RoXSkNCisJCQkJCWN1cnJNbCA9IFpTVERfY291bnQoaXAsIG1hdGNoLCBpTGlt aXQpOw0KKwkJCX0gZWxzZSB7DQorCQkJCW1hdGNoID0gZGljdEJhc2UgKyBtYXRjaEluZGV4MzsN CisJCQkJaWYgKFpTVERfcmVhZE1JTk1BVENIKG1hdGNoLCBNSU5NQVRDSCkgPT0NCisJCQkJICAg IFpTVERfcmVhZE1JTk1BVENIKGlwLCBNSU5NQVRDSCkpIC8qIGFzc3VtcHRpb24gOiBtYXRjaElu ZGV4MyA8PSBkaWN0TGltaXQtNCAoYnkgdGFibGUgY29uc3RydWN0aW9uKSAqLw0KKwkJCQkJY3Vy ck1sID0gWlNURF9jb3VudF8yc2VnbWVudHMoaXAgKyBNSU5NQVRDSCwgbWF0Y2ggKyBNSU5NQVRD SCwgaUxpbWl0LCBkaWN0RW5kLCBwcmVmaXhTdGFydCkgKyBNSU5NQVRDSDsNCisJCQl9DQorDQor CQkJLyogc2F2ZSBiZXN0IHNvbHV0aW9uICovDQorCQkJaWYgKGN1cnJNbCA+IGJlc3RMZW5ndGgp IHsNCisJCQkJYmVzdExlbmd0aCA9IGN1cnJNbDsNCisJCQkJbWF0Y2hlc1ttbnVtXS5vZmYgPSBa U1REX1JFUF9NT1ZFX09QVCArIGN1cnIgLSBtYXRjaEluZGV4MzsNCisJCQkJbWF0Y2hlc1ttbnVt XS5sZW4gPSAoVTMyKWN1cnJNbDsNCisJCQkJbW51bSsrOw0KKwkJCQlpZiAoY3Vyck1sID4gWlNU RF9PUFRfTlVNKQ0KKwkJCQkJZ290byB1cGRhdGU7DQorCQkJCWlmIChpcCArIGN1cnJNbCA9PSBp TGltaXQpDQorCQkJCQlnb3RvIHVwZGF0ZTsgLyogYmVzdCBwb3NzaWJsZSwgYW5kIGF2b2lkIHJl YWQgb3ZlcmZsb3cqLw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwloYXNoVGFibGVbaF0gPSBjdXJy OyAvKiBVcGRhdGUgSGFzaCBUYWJsZSAqLw0KKw0KKwl3aGlsZSAobmJDb21wYXJlcy0tICYmICht YXRjaEluZGV4ID4gd2luZG93TG93KSkgew0KKwkJVTMyICpuZXh0UHRyID0gYnQgKyAyICogKG1h dGNoSW5kZXggJiBidE1hc2spOw0KKwkJc2l6ZV90IG1hdGNoTGVuZ3RoID0gTUlOKGNvbW1vbkxl bmd0aFNtYWxsZXIsIGNvbW1vbkxlbmd0aExhcmdlcik7IC8qIGd1YXJhbnRlZWQgbWluaW11bSBu YiBvZiBjb21tb24gYnl0ZXMgKi8NCisJCWNvbnN0IEJZVEUgKm1hdGNoOw0KKw0KKwkJaWYgKCgh ZXh0RGljdCkgfHwgKG1hdGNoSW5kZXggKyBtYXRjaExlbmd0aCA+PSBkaWN0TGltaXQpKSB7DQor CQkJbWF0Y2ggPSBiYXNlICsgbWF0Y2hJbmRleDsNCisJCQlpZiAobWF0Y2hbbWF0Y2hMZW5ndGhd ID09IGlwW21hdGNoTGVuZ3RoXSkgew0KKwkJCQltYXRjaExlbmd0aCArPSBaU1REX2NvdW50KGlw ICsgbWF0Y2hMZW5ndGggKyAxLCBtYXRjaCArIG1hdGNoTGVuZ3RoICsgMSwgaUxpbWl0KSArIDE7 DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQltYXRjaCA9IGRpY3RCYXNlICsgbWF0Y2hJbmRleDsN CisJCQltYXRjaExlbmd0aCArPSBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIG1hdGNoTGVuZ3Ro LCBtYXRjaCArIG1hdGNoTGVuZ3RoLCBpTGltaXQsIGRpY3RFbmQsIHByZWZpeFN0YXJ0KTsNCisJ CQlpZiAobWF0Y2hJbmRleCArIG1hdGNoTGVuZ3RoID49IGRpY3RMaW1pdCkNCisJCQkJbWF0Y2gg PSBiYXNlICsgbWF0Y2hJbmRleDsgLyogdG8gcHJlcGFyZSBmb3IgbmV4dCB1c2FnZSBvZiBtYXRj aFttYXRjaExlbmd0aF0gKi8NCisJCX0NCisNCisJCWlmIChtYXRjaExlbmd0aCA+IGJlc3RMZW5n dGgpIHsNCisJCQlpZiAobWF0Y2hMZW5ndGggPiBtYXRjaEVuZElkeCAtIG1hdGNoSW5kZXgpDQor CQkJCW1hdGNoRW5kSWR4ID0gbWF0Y2hJbmRleCArIChVMzIpbWF0Y2hMZW5ndGg7DQorCQkJYmVz dExlbmd0aCA9IG1hdGNoTGVuZ3RoOw0KKwkJCW1hdGNoZXNbbW51bV0ub2ZmID0gWlNURF9SRVBf TU9WRV9PUFQgKyBjdXJyIC0gbWF0Y2hJbmRleDsNCisJCQltYXRjaGVzW21udW1dLmxlbiA9IChV MzIpbWF0Y2hMZW5ndGg7DQorCQkJbW51bSsrOw0KKwkJCWlmIChtYXRjaExlbmd0aCA+IFpTVERf T1BUX05VTSkNCisJCQkJYnJlYWs7DQorCQkJaWYgKGlwICsgbWF0Y2hMZW5ndGggPT0gaUxpbWl0 KSAvKiBlcXVhbCA6IG5vIHdheSB0byBrbm93IGlmIGluZiBvciBzdXAgKi8NCisJCQkJYnJlYWs7 CQkJLyogZHJvcCwgdG8gZ3VhcmFudGVlIGNvbnNpc3RlbmN5IChtaXNzIGEgbGl0dGxlIGJpdCBv ZiBjb21wcmVzc2lvbikgKi8NCisJCX0NCisNCisJCWlmIChtYXRjaFttYXRjaExlbmd0aF0gPCBp cFttYXRjaExlbmd0aF0pIHsNCisJCQkvKiBtYXRjaCBpcyBzbWFsbGVyIHRoYW4gY3VyciAqLw0K KwkJCSpzbWFsbGVyUHRyID0gbWF0Y2hJbmRleDsJICAvKiB1cGRhdGUgc21hbGxlciBpZHggKi8N CisJCQljb21tb25MZW5ndGhTbWFsbGVyID0gbWF0Y2hMZW5ndGg7IC8qIGFsbCBzbWFsbGVyIHdp bGwgbm93IGhhdmUgYXQgbGVhc3QgdGhpcyBndWFyYW50ZWVkIGNvbW1vbiBsZW5ndGggKi8NCisJ CQlpZiAobWF0Y2hJbmRleCA8PSBidExvdykgew0KKwkJCQlzbWFsbGVyUHRyID0gJmR1bW15MzI7 DQorCQkJCWJyZWFrOw0KKwkJCX0JCQkgIC8qIGJleW9uZCB0cmVlIHNpemUsIHN0b3AgdGhlIHNl YXJjaCAqLw0KKwkJCXNtYWxsZXJQdHIgPSBuZXh0UHRyICsgMTsgLyogbmV3ICJzbWFsbGVyIiA9 PiBsYXJnZXIgb2YgbWF0Y2ggKi8NCisJCQltYXRjaEluZGV4ID0gbmV4dFB0clsxXTsgIC8qIG5l dyBtYXRjaEluZGV4IGxhcmdlciB0aGFuIHByZXZpb3VzIChjbG9zZXIgdG8gY3VycikgKi8NCisJ CX0gZWxzZSB7DQorCQkJLyogbWF0Y2ggaXMgbGFyZ2VyIHRoYW4gY3VyciAqLw0KKwkJCSpsYXJn ZXJQdHIgPSBtYXRjaEluZGV4Ow0KKwkJCWNvbW1vbkxlbmd0aExhcmdlciA9IG1hdGNoTGVuZ3Ro Ow0KKwkJCWlmIChtYXRjaEluZGV4IDw9IGJ0TG93KSB7DQorCQkJCWxhcmdlclB0ciA9ICZkdW1t eTMyOw0KKwkJCQlicmVhazsNCisJCQl9IC8qIGJleW9uZCB0cmVlIHNpemUsIHN0b3AgdGhlIHNl YXJjaCAqLw0KKwkJCWxhcmdlclB0ciA9IG5leHRQdHI7DQorCQkJbWF0Y2hJbmRleCA9IG5leHRQ dHJbMF07DQorCQl9DQorCX0NCisNCisJKnNtYWxsZXJQdHIgPSAqbGFyZ2VyUHRyID0gMDsNCisN Cit1cGRhdGU6DQorCXpjLT5uZXh0VG9VcGRhdGUgPSAobWF0Y2hFbmRJZHggPiBjdXJyICsgOCkg PyBtYXRjaEVuZElkeCAtIDggOiBjdXJyICsgMTsNCisJcmV0dXJuIG1udW07DQorfQ0KKw0KKy8q KiBUcmVlIHVwZGF0ZXIsIHByb3ZpZGluZyBiZXN0IG1hdGNoICovDQorc3RhdGljIFUzMiBaU1RE X0J0R2V0QWxsTWF0Y2hlcyhaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29u c3QgQllURSAqY29uc3QgaUxpbWl0LCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywgY29uc3QgVTMy IG1scywgWlNURF9tYXRjaF90ICptYXRjaGVzLA0KKwkJCQljb25zdCBVMzIgbWluTWF0Y2hMZW4p DQorew0KKwlpZiAoaXAgPCB6Yy0+YmFzZSArIHpjLT5uZXh0VG9VcGRhdGUpDQorCQlyZXR1cm4g MDsgLyogc2tpcHBlZCBhcmVhICovDQorCVpTVERfdXBkYXRlVHJlZSh6YywgaXAsIGlMaW1pdCwg bWF4TmJBdHRlbXB0cywgbWxzKTsNCisJcmV0dXJuIFpTVERfaW5zZXJ0QnRBbmRHZXRBbGxNYXRj aGVzKHpjLCBpcCwgaUxpbWl0LCBtYXhOYkF0dGVtcHRzLCBtbHMsIDAsIG1hdGNoZXMsIG1pbk1h dGNoTGVuKTsNCit9DQorDQorc3RhdGljIFUzMiBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RN TFMoWlNURF9DQ3R4ICp6YywgLyogSW5kZXggdGFibGUgd2lsbCBiZSB1cGRhdGVkICovDQorCQkJ CQkgIGNvbnN0IEJZVEUgKmlwLCBjb25zdCBCWVRFICpjb25zdCBpSGlnaExpbWl0LCBjb25zdCBV MzIgbWF4TmJBdHRlbXB0cywgY29uc3QgVTMyIG1hdGNoTGVuZ3RoU2VhcmNoLA0KKwkJCQkJICBa U1REX21hdGNoX3QgKm1hdGNoZXMsIGNvbnN0IFUzMiBtaW5NYXRjaExlbikNCit7DQorCXN3aXRj aCAobWF0Y2hMZW5ndGhTZWFyY2gpIHsNCisJY2FzZSAzOiByZXR1cm4gWlNURF9CdEdldEFsbE1h dGNoZXMoemMsIGlwLCBpSGlnaExpbWl0LCBtYXhOYkF0dGVtcHRzLCAzLCBtYXRjaGVzLCBtaW5N YXRjaExlbik7DQorCWRlZmF1bHQ6DQorCWNhc2UgNDogcmV0dXJuIFpTVERfQnRHZXRBbGxNYXRj aGVzKHpjLCBpcCwgaUhpZ2hMaW1pdCwgbWF4TmJBdHRlbXB0cywgNCwgbWF0Y2hlcywgbWluTWF0 Y2hMZW4pOw0KKwljYXNlIDU6IHJldHVybiBaU1REX0J0R2V0QWxsTWF0Y2hlcyh6YywgaXAsIGlI aWdoTGltaXQsIG1heE5iQXR0ZW1wdHMsIDUsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsNCisJY2Fz ZSA3Og0KKwljYXNlIDY6IHJldHVybiBaU1REX0J0R2V0QWxsTWF0Y2hlcyh6YywgaXAsIGlIaWdo TGltaXQsIG1heE5iQXR0ZW1wdHMsIDYsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsNCisJfQ0KK30N CisNCisvKiogVHJlZSB1cGRhdGVyLCBwcm92aWRpbmcgYmVzdCBtYXRjaCAqLw0KK3N0YXRpYyBV MzIgWlNURF9CdEdldEFsbE1hdGNoZXNfZXh0RGljdChaU1REX0NDdHggKnpjLCBjb25zdCBCWVRF ICpjb25zdCBpcCwgY29uc3QgQllURSAqY29uc3QgaUxpbWl0LCBjb25zdCBVMzIgbWF4TmJBdHRl bXB0cywgY29uc3QgVTMyIG1scywNCisJCQkJCVpTVERfbWF0Y2hfdCAqbWF0Y2hlcywgY29uc3Qg VTMyIG1pbk1hdGNoTGVuKQ0KK3sNCisJaWYgKGlwIDwgemMtPmJhc2UgKyB6Yy0+bmV4dFRvVXBk YXRlKQ0KKwkJcmV0dXJuIDA7IC8qIHNraXBwZWQgYXJlYSAqLw0KKwlaU1REX3VwZGF0ZVRyZWVf ZXh0RGljdCh6YywgaXAsIGlMaW1pdCwgbWF4TmJBdHRlbXB0cywgbWxzKTsNCisJcmV0dXJuIFpT VERfaW5zZXJ0QnRBbmRHZXRBbGxNYXRjaGVzKHpjLCBpcCwgaUxpbWl0LCBtYXhOYkF0dGVtcHRz LCBtbHMsIDEsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsNCit9DQorDQorc3RhdGljIFUzMiBaU1RE X0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RNTFNfZXh0RGljdChaU1REX0NDdHggKnpjLCAvKiBJbmRl eCB0YWJsZSB3aWxsIGJlIHVwZGF0ZWQgKi8NCisJCQkJCQkgIGNvbnN0IEJZVEUgKmlwLCBjb25z dCBCWVRFICpjb25zdCBpSGlnaExpbWl0LCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywgY29uc3Qg VTMyIG1hdGNoTGVuZ3RoU2VhcmNoLA0KKwkJCQkJCSAgWlNURF9tYXRjaF90ICptYXRjaGVzLCBj b25zdCBVMzIgbWluTWF0Y2hMZW4pDQorew0KKwlzd2l0Y2ggKG1hdGNoTGVuZ3RoU2VhcmNoKSB7 DQorCWNhc2UgMzogcmV0dXJuIFpTVERfQnRHZXRBbGxNYXRjaGVzX2V4dERpY3QoemMsIGlwLCBp SGlnaExpbWl0LCBtYXhOYkF0dGVtcHRzLCAzLCBtYXRjaGVzLCBtaW5NYXRjaExlbik7DQorCWRl ZmF1bHQ6DQorCWNhc2UgNDogcmV0dXJuIFpTVERfQnRHZXRBbGxNYXRjaGVzX2V4dERpY3QoemMs IGlwLCBpSGlnaExpbWl0LCBtYXhOYkF0dGVtcHRzLCA0LCBtYXRjaGVzLCBtaW5NYXRjaExlbik7 DQorCWNhc2UgNTogcmV0dXJuIFpTVERfQnRHZXRBbGxNYXRjaGVzX2V4dERpY3QoemMsIGlwLCBp SGlnaExpbWl0LCBtYXhOYkF0dGVtcHRzLCA1LCBtYXRjaGVzLCBtaW5NYXRjaExlbik7DQorCWNh c2UgNzoNCisJY2FzZSA2OiByZXR1cm4gWlNURF9CdEdldEFsbE1hdGNoZXNfZXh0RGljdCh6Yywg aXAsIGlIaWdoTGltaXQsIG1heE5iQXR0ZW1wdHMsIDYsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsN CisJfQ0KK30NCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgT3B0 aW1hbCBwYXJzZXINCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorRk9SQ0Vf SU5MSU5FDQordm9pZCBaU1REX2NvbXByZXNzQmxvY2tfb3B0X2dlbmVyaWMoWlNURF9DQ3R4ICpj dHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IGludCB1bHRyYSkNCit7 DQorCXNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyID0gJihjdHgtPnNlcVN0b3JlKTsNCisJY29uc3Qg QllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7DQorCWNvbnN0IEJZVEUgKmlw ID0gaXN0YXJ0Ow0KKwljb25zdCBCWVRFICphbmNob3IgPSBpc3RhcnQ7DQorCWNvbnN0IEJZVEUg KmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOw0KKwljb25zdCBCWVRFICpjb25zdCBpbGlt aXQgPSBpZW5kIC0gODsNCisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IGN0eC0+YmFzZTsNCisJ Y29uc3QgQllURSAqY29uc3QgcHJlZml4U3RhcnQgPSBiYXNlICsgY3R4LT5kaWN0TGltaXQ7DQor DQorCWNvbnN0IFUzMiBtYXhTZWFyY2hlcyA9IDFVIDw8IGN0eC0+cGFyYW1zLmNQYXJhbXMuc2Vh cmNoTG9nOw0KKwljb25zdCBVMzIgc3VmZmljaWVudF9sZW4gPSBjdHgtPnBhcmFtcy5jUGFyYW1z LnRhcmdldExlbmd0aDsNCisJY29uc3QgVTMyIG1scyA9IGN0eC0+cGFyYW1zLmNQYXJhbXMuc2Vh cmNoTGVuZ3RoOw0KKwljb25zdCBVMzIgbWluTWF0Y2ggPSAoY3R4LT5wYXJhbXMuY1BhcmFtcy5z ZWFyY2hMZW5ndGggPT0gMykgPyAzIDogNDsNCisNCisJWlNURF9vcHRpbWFsX3QgKm9wdCA9IHNl cVN0b3JlUHRyLT5wcmljZVRhYmxlOw0KKwlaU1REX21hdGNoX3QgKm1hdGNoZXMgPSBzZXFTdG9y ZVB0ci0+bWF0Y2hUYWJsZTsNCisJY29uc3QgQllURSAqaW5yOw0KKwlVMzIgb2Zmc2V0LCByZXBb WlNURF9SRVBfTlVNXTsNCisNCisJLyogaW5pdCAqLw0KKwljdHgtPm5leHRUb1VwZGF0ZTMgPSBj dHgtPm5leHRUb1VwZGF0ZTsNCisJWlNURF9yZXNjYWxlRnJlcXMoc2VxU3RvcmVQdHIsIChjb25z dCBCWVRFICopc3JjLCBzcmNTaXplKTsNCisJaXAgKz0gKGlwID09IHByZWZpeFN0YXJ0KTsNCisJ ew0KKwkJVTMyIGk7DQorCQlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspDQorCQkJ cmVwW2ldID0gY3R4LT5yZXBbaV07DQorCX0NCisNCisJLyogTWF0Y2ggTG9vcCAqLw0KKwl3aGls ZSAoaXAgPCBpbGltaXQpIHsNCisJCVUzMiBjdXIsIG1hdGNoX251bSwgbGFzdF9wb3MsIGxpdGxl biwgcHJpY2U7DQorCQlVMzIgdSwgbWxlbiwgYmVzdF9tbGVuLCBiZXN0X29mZiwgbGl0TGVuZ3Ro Ow0KKwkJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKFpTVERfb3B0aW1hbF90KSk7DQorCQlsYXN0X3Bv cyA9IDA7DQorCQlsaXRsZW4gPSAoVTMyKShpcCAtIGFuY2hvcik7DQorDQorCQkvKiBjaGVjayBy ZXBDb2RlICovDQorCQl7DQorCQkJVTMyIGksIGxhc3RfaSA9IFpTVERfUkVQX0NIRUNLICsgKGlw ID09IGFuY2hvcik7DQorCQkJZm9yIChpID0gKGlwID09IGFuY2hvcik7IGkgPCBsYXN0X2k7IGkr Kykgew0KKwkJCQljb25zdCBTMzIgcmVwQ3VyID0gKGkgPT0gWlNURF9SRVBfTU9WRV9PUFQpID8g KHJlcFswXSAtIDEpIDogcmVwW2ldOw0KKwkJCQlpZiAoKHJlcEN1ciA+IDApICYmIChyZXBDdXIg PCAoUzMyKShpcCAtIHByZWZpeFN0YXJ0KSkgJiYNCisJCQkJICAgIChaU1REX3JlYWRNSU5NQVRD SChpcCwgbWluTWF0Y2gpID09IFpTVERfcmVhZE1JTk1BVENIKGlwIC0gcmVwQ3VyLCBtaW5NYXRj aCkpKSB7DQorCQkJCQltbGVuID0gKFUzMilaU1REX2NvdW50KGlwICsgbWluTWF0Y2gsIGlwICsg bWluTWF0Y2ggLSByZXBDdXIsIGllbmQpICsgbWluTWF0Y2g7DQorCQkJCQlpZiAobWxlbiA+IHN1 ZmZpY2llbnRfbGVuIHx8IG1sZW4gPj0gWlNURF9PUFRfTlVNKSB7DQorCQkJCQkJYmVzdF9tbGVu ID0gbWxlbjsNCisJCQkJCQliZXN0X29mZiA9IGk7DQorCQkJCQkJY3VyID0gMDsNCisJCQkJCQls YXN0X3BvcyA9IDE7DQorCQkJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsNCisJCQkJCX0NCisJCQkJ CWJlc3Rfb2ZmID0gaSAtIChpcCA9PSBhbmNob3IpOw0KKwkJCQkJZG8gew0KKwkJCQkJCXByaWNl ID0gWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IsIGJlc3Rfb2ZmLCBt bGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsNCisJCQkJCQlpZiAobWxlbiA+IGxhc3RfcG9zIHx8IHBy aWNlIDwgb3B0W21sZW5dLnByaWNlKQ0KKwkJCQkJCQlTRVRfUFJJQ0UobWxlbiwgbWxlbiwgaSwg bGl0bGVuLCBwcmljZSk7IC8qIG5vdGUgOiBtYWNybyBtb2RpZmllcyBsYXN0X3BvcyAqLw0KKwkJ CQkJCW1sZW4tLTsNCisJCQkJCX0gd2hpbGUgKG1sZW4gPj0gbWluTWF0Y2gpOw0KKwkJCQl9DQor CQkJfQ0KKwkJfQ0KKw0KKwkJbWF0Y2hfbnVtID0gWlNURF9CdEdldEFsbE1hdGNoZXNfc2VsZWN0 TUxTKGN0eCwgaXAsIGllbmQsIG1heFNlYXJjaGVzLCBtbHMsIG1hdGNoZXMsIG1pbk1hdGNoKTsN CisNCisJCWlmICghbGFzdF9wb3MgJiYgIW1hdGNoX251bSkgew0KKwkJCWlwKys7DQorCQkJY29u dGludWU7DQorCQl9DQorDQorCQlpZiAobWF0Y2hfbnVtICYmIChtYXRjaGVzW21hdGNoX251bSAt IDFdLmxlbiA+IHN1ZmZpY2llbnRfbGVuIHx8IG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ubGVuID49 IFpTVERfT1BUX05VTSkpIHsNCisJCQliZXN0X21sZW4gPSBtYXRjaGVzW21hdGNoX251bSAtIDFd LmxlbjsNCisJCQliZXN0X29mZiA9IG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ub2ZmOw0KKwkJCWN1 ciA9IDA7DQorCQkJbGFzdF9wb3MgPSAxOw0KKwkJCWdvdG8gX3N0b3JlU2VxdWVuY2U7DQorCQl9 DQorDQorCQkvKiBzZXQgcHJpY2VzIHVzaW5nIG1hdGNoZXMgYXQgcG9zaXRpb24gPSAwICovDQor CQliZXN0X21sZW4gPSAobGFzdF9wb3MpID8gbGFzdF9wb3MgOiBtaW5NYXRjaDsNCisJCWZvciAo dSA9IDA7IHUgPCBtYXRjaF9udW07IHUrKykgew0KKwkJCW1sZW4gPSAodSA+IDApID8gbWF0Y2hl c1t1IC0gMV0ubGVuICsgMSA6IGJlc3RfbWxlbjsNCisJCQliZXN0X21sZW4gPSBtYXRjaGVzW3Vd LmxlbjsNCisJCQl3aGlsZSAobWxlbiA8PSBiZXN0X21sZW4pIHsNCisJCQkJcHJpY2UgPSBaU1RE X2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGFuY2hvciwgbWF0Y2hlc1t1XS5vZmYgLSAx LCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsNCisJCQkJaWYgKG1sZW4gPiBsYXN0X3BvcyB8fCBw cmljZSA8IG9wdFttbGVuXS5wcmljZSkNCisJCQkJCVNFVF9QUklDRShtbGVuLCBtbGVuLCBtYXRj aGVzW3VdLm9mZiwgbGl0bGVuLCBwcmljZSk7IC8qIG5vdGUgOiBtYWNybyBtb2RpZmllcyBsYXN0 X3BvcyAqLw0KKwkJCQltbGVuKys7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaWYgKGxhc3RfcG9zIDwg bWluTWF0Y2gpIHsNCisJCQlpcCsrOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKw0KKwkJLyogaW5p dGlhbGl6ZSBvcHRbMF0gKi8NCisJCXsNCisJCQlVMzIgaTsNCisJCQlmb3IgKGkgPSAwOyBpIDwg WlNURF9SRVBfTlVNOyBpKyspDQorCQkJCW9wdFswXS5yZXBbaV0gPSByZXBbaV07DQorCQl9DQor CQlvcHRbMF0ubWxlbiA9IDE7DQorCQlvcHRbMF0ubGl0bGVuID0gbGl0bGVuOw0KKw0KKwkJLyog Y2hlY2sgZnVydGhlciBwb3NpdGlvbnMgKi8NCisJCWZvciAoY3VyID0gMTsgY3VyIDw9IGxhc3Rf cG9zOyBjdXIrKykgew0KKwkJCWluciA9IGlwICsgY3VyOw0KKw0KKwkJCWlmIChvcHRbY3VyIC0g MV0ubWxlbiA9PSAxKSB7DQorCQkJCWxpdGxlbiA9IG9wdFtjdXIgLSAxXS5saXRsZW4gKyAxOw0K KwkJCQlpZiAoY3VyID4gbGl0bGVuKSB7DQorCQkJCQlwcmljZSA9IG9wdFtjdXIgLSBsaXRsZW5d LnByaWNlICsgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgaW5yIC0g bGl0bGVuKTsNCisJCQkJfSBlbHNlDQorCQkJCQlwcmljZSA9IFpTVERfZ2V0TGl0ZXJhbFByaWNl KHNlcVN0b3JlUHRyLCBsaXRsZW4sIGFuY2hvcik7DQorCQkJfSBlbHNlIHsNCisJCQkJbGl0bGVu ID0gMTsNCisJCQkJcHJpY2UgPSBvcHRbY3VyIC0gMV0ucHJpY2UgKyBaU1REX2dldExpdGVyYWxQ cmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBpbnIgLSAxKTsNCisJCQl9DQorDQorCQkJaWYgKGN1 ciA+IGxhc3RfcG9zIHx8IHByaWNlIDw9IG9wdFtjdXJdLnByaWNlKQ0KKwkJCQlTRVRfUFJJQ0Uo Y3VyLCAxLCAwLCBsaXRsZW4sIHByaWNlKTsNCisNCisJCQlpZiAoY3VyID09IGxhc3RfcG9zKQ0K KwkJCQlicmVhazsNCisNCisJCQlpZiAoaW5yID4gaWxpbWl0KSAvKiBsYXN0IG1hdGNoIG11c3Qg c3RhcnQgYXQgYSBtaW5pbXVtIGRpc3RhbmNlIG9mIDggZnJvbSBvZW5kICovDQorCQkJCWNvbnRp bnVlOw0KKw0KKwkJCW1sZW4gPSBvcHRbY3VyXS5tbGVuOw0KKwkJCWlmIChvcHRbY3VyXS5vZmYg PiBaU1REX1JFUF9NT1ZFX09QVCkgew0KKwkJCQlvcHRbY3VyXS5yZXBbMl0gPSBvcHRbY3VyIC0g bWxlbl0ucmVwWzFdOw0KKwkJCQlvcHRbY3VyXS5yZXBbMV0gPSBvcHRbY3VyIC0gbWxlbl0ucmVw WzBdOw0KKwkJCQlvcHRbY3VyXS5yZXBbMF0gPSBvcHRbY3VyXS5vZmYgLSBaU1REX1JFUF9NT1ZF X09QVDsNCisJCQl9IGVsc2Ugew0KKwkJCQlvcHRbY3VyXS5yZXBbMl0gPSAob3B0W2N1cl0ub2Zm ID4gMSkgPyBvcHRbY3VyIC0gbWxlbl0ucmVwWzFdIDogb3B0W2N1ciAtIG1sZW5dLnJlcFsyXTsN CisJCQkJb3B0W2N1cl0ucmVwWzFdID0gKG9wdFtjdXJdLm9mZiA+IDApID8gb3B0W2N1ciAtIG1s ZW5dLnJlcFswXSA6IG9wdFtjdXIgLSBtbGVuXS5yZXBbMV07DQorCQkJCW9wdFtjdXJdLnJlcFsw XSA9DQorCQkJCSAgICAoKG9wdFtjdXJdLm9mZiA9PSBaU1REX1JFUF9NT1ZFX09QVCkgJiYgKG1s ZW4gIT0gMSkpID8gKG9wdFtjdXIgLSBtbGVuXS5yZXBbMF0gLSAxKSA6IChvcHRbY3VyIC0gbWxl bl0ucmVwW29wdFtjdXJdLm9mZl0pOw0KKwkJCX0NCisNCisJCQliZXN0X21sZW4gPSBtaW5NYXRj aDsNCisJCQl7DQorCQkJCVUzMiBpLCBsYXN0X2kgPSBaU1REX1JFUF9DSEVDSyArIChtbGVuICE9 IDEpOw0KKwkJCQlmb3IgKGkgPSAob3B0W2N1cl0ubWxlbiAhPSAxKTsgaSA8IGxhc3RfaTsgaSsr KSB7IC8qIGNoZWNrIHJlcCAqLw0KKwkJCQkJY29uc3QgUzMyIHJlcEN1ciA9IChpID09IFpTVERf UkVQX01PVkVfT1BUKSA/IChvcHRbY3VyXS5yZXBbMF0gLSAxKSA6IG9wdFtjdXJdLnJlcFtpXTsN CisJCQkJCWlmICgocmVwQ3VyID4gMCkgJiYgKHJlcEN1ciA8IChTMzIpKGluciAtIHByZWZpeFN0 YXJ0KSkgJiYNCisJCQkJCSAgICAoWlNURF9yZWFkTUlOTUFUQ0goaW5yLCBtaW5NYXRjaCkgPT0g WlNURF9yZWFkTUlOTUFUQ0goaW5yIC0gcmVwQ3VyLCBtaW5NYXRjaCkpKSB7DQorCQkJCQkJbWxl biA9IChVMzIpWlNURF9jb3VudChpbnIgKyBtaW5NYXRjaCwgaW5yICsgbWluTWF0Y2ggLSByZXBD dXIsIGllbmQpICsgbWluTWF0Y2g7DQorDQorCQkJCQkJaWYgKG1sZW4gPiBzdWZmaWNpZW50X2xl biB8fCBjdXIgKyBtbGVuID49IFpTVERfT1BUX05VTSkgew0KKwkJCQkJCQliZXN0X21sZW4gPSBt bGVuOw0KKwkJCQkJCQliZXN0X29mZiA9IGk7DQorCQkJCQkJCWxhc3RfcG9zID0gY3VyICsgMTsN CisJCQkJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsNCisJCQkJCQl9DQorDQorCQkJCQkJYmVzdF9v ZmYgPSBpIC0gKG9wdFtjdXJdLm1sZW4gIT0gMSk7DQorCQkJCQkJaWYgKG1sZW4gPiBiZXN0X21s ZW4pDQorCQkJCQkJCWJlc3RfbWxlbiA9IG1sZW47DQorDQorCQkJCQkJZG8gew0KKwkJCQkJCQlp ZiAob3B0W2N1cl0ubWxlbiA9PSAxKSB7DQorCQkJCQkJCQlsaXRsZW4gPSBvcHRbY3VyXS5saXRs ZW47DQorCQkJCQkJCQlpZiAoY3VyID4gbGl0bGVuKSB7DQorCQkJCQkJCQkJcHJpY2UgPSBvcHRb Y3VyIC0gbGl0bGVuXS5wcmljZSArIFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwg aW5yIC0gbGl0bGVuLA0KKwkJCQkJCQkJCQkJCQkJCWJlc3Rfb2ZmLCBtbGVuIC0gTUlOTUFUQ0gs IHVsdHJhKTsNCisJCQkJCQkJCX0gZWxzZQ0KKwkJCQkJCQkJCXByaWNlID0gWlNURF9nZXRQcmlj ZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IsIGJlc3Rfb2ZmLCBtbGVuIC0gTUlOTUFUQ0gs IHVsdHJhKTsNCisJCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJCWxpdGxlbiA9IDA7DQorCQkJCQkJ CQlwcmljZSA9IG9wdFtjdXJdLnByaWNlICsgWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgMCwg TlVMTCwgYmVzdF9vZmYsIG1sZW4gLSBNSU5NQVRDSCwgdWx0cmEpOw0KKwkJCQkJCQl9DQorDQor CQkJCQkJCWlmIChjdXIgKyBtbGVuID4gbGFzdF9wb3MgfHwgcHJpY2UgPD0gb3B0W2N1ciArIG1s ZW5dLnByaWNlKQ0KKwkJCQkJCQkJU0VUX1BSSUNFKGN1ciArIG1sZW4sIG1sZW4sIGksIGxpdGxl biwgcHJpY2UpOw0KKwkJCQkJCQltbGVuLS07DQorCQkJCQkJfSB3aGlsZSAobWxlbiA+PSBtaW5N YXRjaCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJbWF0Y2hfbnVtID0gWlNURF9C dEdldEFsbE1hdGNoZXNfc2VsZWN0TUxTKGN0eCwgaW5yLCBpZW5kLCBtYXhTZWFyY2hlcywgbWxz LCBtYXRjaGVzLCBiZXN0X21sZW4pOw0KKw0KKwkJCWlmIChtYXRjaF9udW0gPiAwICYmIChtYXRj aGVzW21hdGNoX251bSAtIDFdLmxlbiA+IHN1ZmZpY2llbnRfbGVuIHx8IGN1ciArIG1hdGNoZXNb bWF0Y2hfbnVtIC0gMV0ubGVuID49IFpTVERfT1BUX05VTSkpIHsNCisJCQkJYmVzdF9tbGVuID0g bWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5sZW47DQorCQkJCWJlc3Rfb2ZmID0gbWF0Y2hlc1ttYXRj aF9udW0gLSAxXS5vZmY7DQorCQkJCWxhc3RfcG9zID0gY3VyICsgMTsNCisJCQkJZ290byBfc3Rv cmVTZXF1ZW5jZTsNCisJCQl9DQorDQorCQkJLyogc2V0IHByaWNlcyB1c2luZyBtYXRjaGVzIGF0 IHBvc2l0aW9uID0gY3VyICovDQorCQkJZm9yICh1ID0gMDsgdSA8IG1hdGNoX251bTsgdSsrKSB7 DQorCQkJCW1sZW4gPSAodSA+IDApID8gbWF0Y2hlc1t1IC0gMV0ubGVuICsgMSA6IGJlc3RfbWxl bjsNCisJCQkJYmVzdF9tbGVuID0gbWF0Y2hlc1t1XS5sZW47DQorDQorCQkJCXdoaWxlIChtbGVu IDw9IGJlc3RfbWxlbikgew0KKwkJCQkJaWYgKG9wdFtjdXJdLm1sZW4gPT0gMSkgew0KKwkJCQkJ CWxpdGxlbiA9IG9wdFtjdXJdLmxpdGxlbjsNCisJCQkJCQlpZiAoY3VyID4gbGl0bGVuKQ0KKwkJ CQkJCQlwcmljZSA9IG9wdFtjdXIgLSBsaXRsZW5dLnByaWNlICsgWlNURF9nZXRQcmljZShzZXFT dG9yZVB0ciwgbGl0bGVuLCBpcCArIGN1ciAtIGxpdGxlbiwNCisJCQkJCQkJCQkJCQkJbWF0Y2hl c1t1XS5vZmYgLSAxLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsNCisJCQkJCQllbHNlDQorCQkJ CQkJCXByaWNlID0gWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IsIG1h dGNoZXNbdV0ub2ZmIC0gMSwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7DQorCQkJCQl9IGVsc2Ug ew0KKwkJCQkJCWxpdGxlbiA9IDA7DQorCQkJCQkJcHJpY2UgPSBvcHRbY3VyXS5wcmljZSArIFpT VERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIDAsIE5VTEwsIG1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxl biAtIE1JTk1BVENILCB1bHRyYSk7DQorCQkJCQl9DQorDQorCQkJCQlpZiAoY3VyICsgbWxlbiA+ IGxhc3RfcG9zIHx8IChwcmljZSA8IG9wdFtjdXIgKyBtbGVuXS5wcmljZSkpDQorCQkJCQkJU0VU X1BSSUNFKGN1ciArIG1sZW4sIG1sZW4sIG1hdGNoZXNbdV0ub2ZmLCBsaXRsZW4sIHByaWNlKTsN CisNCisJCQkJCW1sZW4rKzsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCWJlc3RfbWxlbiA9 IG9wdFtsYXN0X3Bvc10ubWxlbjsNCisJCWJlc3Rfb2ZmID0gb3B0W2xhc3RfcG9zXS5vZmY7DQor CQljdXIgPSBsYXN0X3BvcyAtIGJlc3RfbWxlbjsNCisNCisJLyogc3RvcmUgc2VxdWVuY2UgKi8N Citfc3RvcmVTZXF1ZW5jZTogLyogY3VyLCBsYXN0X3BvcywgYmVzdF9tbGVuLCBiZXN0X29mZiBo YXZlIHRvIGJlIHNldCAqLw0KKwkJb3B0WzBdLm1sZW4gPSAxOw0KKw0KKwkJd2hpbGUgKDEpIHsN CisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsNCisJCQlvZmZzZXQgPSBvcHRbY3VyXS5vZmY7DQor CQkJb3B0W2N1cl0ubWxlbiA9IGJlc3RfbWxlbjsNCisJCQlvcHRbY3VyXS5vZmYgPSBiZXN0X29m ZjsNCisJCQliZXN0X21sZW4gPSBtbGVuOw0KKwkJCWJlc3Rfb2ZmID0gb2Zmc2V0Ow0KKwkJCWlm IChtbGVuID4gY3VyKQ0KKwkJCQlicmVhazsNCisJCQljdXIgLT0gbWxlbjsNCisJCX0NCisNCisJ CWZvciAodSA9IDA7IHUgPD0gbGFzdF9wb3M7KSB7DQorCQkJdSArPSBvcHRbdV0ubWxlbjsNCisJ CX0NCisNCisJCWZvciAoY3VyID0gMDsgY3VyIDwgbGFzdF9wb3M7KSB7DQorCQkJbWxlbiA9IG9w dFtjdXJdLm1sZW47DQorCQkJaWYgKG1sZW4gPT0gMSkgew0KKwkJCQlpcCsrOw0KKwkJCQljdXIr KzsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCW9mZnNldCA9IG9wdFtjdXJdLm9mZjsNCisJ CQljdXIgKz0gbWxlbjsNCisJCQlsaXRMZW5ndGggPSAoVTMyKShpcCAtIGFuY2hvcik7DQorDQor CQkJaWYgKG9mZnNldCA+IFpTVERfUkVQX01PVkVfT1BUKSB7DQorCQkJCXJlcFsyXSA9IHJlcFsx XTsNCisJCQkJcmVwWzFdID0gcmVwWzBdOw0KKwkJCQlyZXBbMF0gPSBvZmZzZXQgLSBaU1REX1JF UF9NT1ZFX09QVDsNCisJCQkJb2Zmc2V0LS07DQorCQkJfSBlbHNlIHsNCisJCQkJaWYgKG9mZnNl dCAhPSAwKSB7DQorCQkJCQliZXN0X29mZiA9IChvZmZzZXQgPT0gWlNURF9SRVBfTU9WRV9PUFQp ID8gKHJlcFswXSAtIDEpIDogKHJlcFtvZmZzZXRdKTsNCisJCQkJCWlmIChvZmZzZXQgIT0gMSkN CisJCQkJCQlyZXBbMl0gPSByZXBbMV07DQorCQkJCQlyZXBbMV0gPSByZXBbMF07DQorCQkJCQly ZXBbMF0gPSBiZXN0X29mZjsNCisJCQkJfQ0KKwkJCQlpZiAobGl0TGVuZ3RoID09IDApDQorCQkJ CQlvZmZzZXQtLTsNCisJCQl9DQorDQorCQkJWlNURF91cGRhdGVQcmljZShzZXFTdG9yZVB0ciwg bGl0TGVuZ3RoLCBhbmNob3IsIG9mZnNldCwgbWxlbiAtIE1JTk1BVENIKTsNCisJCQlaU1REX3N0 b3JlU2VxKHNlcVN0b3JlUHRyLCBsaXRMZW5ndGgsIGFuY2hvciwgb2Zmc2V0LCBtbGVuIC0gTUlO TUFUQ0gpOw0KKwkJCWFuY2hvciA9IGlwID0gaXAgKyBtbGVuOw0KKwkJfQ0KKwl9IC8qIGZvciAo Y3VyPTA7IGN1ciA8IGxhc3RfcG9zOyApICovDQorDQorCS8qIFNhdmUgcmVwcyBmb3IgbmV4dCBi bG9jayAqLw0KKwl7DQorCQlpbnQgaTsNCisJCWZvciAoaSA9IDA7IGkgPCBaU1REX1JFUF9OVU07 IGkrKykNCisJCQljdHgtPnJlcFRvQ29uZmlybVtpXSA9IHJlcFtpXTsNCisJfQ0KKw0KKwkvKiBM YXN0IExpdGVyYWxzICovDQorCXsNCisJCXNpemVfdCBjb25zdCBsYXN0TExTaXplID0gaWVuZCAt IGFuY2hvcjsNCisJCW1lbWNweShzZXFTdG9yZVB0ci0+bGl0LCBhbmNob3IsIGxhc3RMTFNpemUp Ow0KKwkJc2VxU3RvcmVQdHItPmxpdCArPSBsYXN0TExTaXplOw0KKwl9DQorfQ0KKw0KK0ZPUkNF X0lOTElORQ0KK3ZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX29wdF9leHREaWN0X2dlbmVyaWMoWlNU RF9DQ3R4ICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IGludCB1 bHRyYSkNCit7DQorCXNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyID0gJihjdHgtPnNlcVN0b3JlKTsN CisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7DQorCWNvbnN0 IEJZVEUgKmlwID0gaXN0YXJ0Ow0KKwljb25zdCBCWVRFICphbmNob3IgPSBpc3RhcnQ7DQorCWNv bnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOw0KKwljb25zdCBCWVRFICpj b25zdCBpbGltaXQgPSBpZW5kIC0gODsNCisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IGN0eC0+ YmFzZTsNCisJY29uc3QgVTMyIGxvd2VzdEluZGV4ID0gY3R4LT5sb3dMaW1pdDsNCisJY29uc3Qg VTMyIGRpY3RMaW1pdCA9IGN0eC0+ZGljdExpbWl0Ow0KKwljb25zdCBCWVRFICpjb25zdCBwcmVm aXhTdGFydCA9IGJhc2UgKyBkaWN0TGltaXQ7DQorCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RCYXNl ID0gY3R4LT5kaWN0QmFzZTsNCisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RCYXNl ICsgZGljdExpbWl0Ow0KKw0KKwljb25zdCBVMzIgbWF4U2VhcmNoZXMgPSAxVSA8PCBjdHgtPnBh cmFtcy5jUGFyYW1zLnNlYXJjaExvZzsNCisJY29uc3QgVTMyIHN1ZmZpY2llbnRfbGVuID0gY3R4 LT5wYXJhbXMuY1BhcmFtcy50YXJnZXRMZW5ndGg7DQorCWNvbnN0IFUzMiBtbHMgPSBjdHgtPnBh cmFtcy5jUGFyYW1zLnNlYXJjaExlbmd0aDsNCisJY29uc3QgVTMyIG1pbk1hdGNoID0gKGN0eC0+ cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoID09IDMpID8gMyA6IDQ7DQorDQorCVpTVERfb3B0 aW1hbF90ICpvcHQgPSBzZXFTdG9yZVB0ci0+cHJpY2VUYWJsZTsNCisJWlNURF9tYXRjaF90ICpt YXRjaGVzID0gc2VxU3RvcmVQdHItPm1hdGNoVGFibGU7DQorCWNvbnN0IEJZVEUgKmlucjsNCisN CisJLyogaW5pdCAqLw0KKwlVMzIgb2Zmc2V0LCByZXBbWlNURF9SRVBfTlVNXTsNCisJew0KKwkJ VTMyIGk7DQorCQlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspDQorCQkJcmVwW2ld ID0gY3R4LT5yZXBbaV07DQorCX0NCisNCisJY3R4LT5uZXh0VG9VcGRhdGUzID0gY3R4LT5uZXh0 VG9VcGRhdGU7DQorCVpTVERfcmVzY2FsZUZyZXFzKHNlcVN0b3JlUHRyLCAoY29uc3QgQllURSAq KXNyYywgc3JjU2l6ZSk7DQorCWlwICs9IChpcCA9PSBwcmVmaXhTdGFydCk7DQorDQorCS8qIE1h dGNoIExvb3AgKi8NCisJd2hpbGUgKGlwIDwgaWxpbWl0KSB7DQorCQlVMzIgY3VyLCBtYXRjaF9u dW0sIGxhc3RfcG9zLCBsaXRsZW4sIHByaWNlOw0KKwkJVTMyIHUsIG1sZW4sIGJlc3RfbWxlbiwg YmVzdF9vZmYsIGxpdExlbmd0aDsNCisJCVUzMiBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsNCisJ CW1lbXNldChvcHQsIDAsIHNpemVvZihaU1REX29wdGltYWxfdCkpOw0KKwkJbGFzdF9wb3MgPSAw Ow0KKwkJb3B0WzBdLmxpdGxlbiA9IChVMzIpKGlwIC0gYW5jaG9yKTsNCisNCisJCS8qIGNoZWNr IHJlcENvZGUgKi8NCisJCXsNCisJCQlVMzIgaSwgbGFzdF9pID0gWlNURF9SRVBfQ0hFQ0sgKyAo aXAgPT0gYW5jaG9yKTsNCisJCQlmb3IgKGkgPSAoaXAgPT0gYW5jaG9yKTsgaSA8IGxhc3RfaTsg aSsrKSB7DQorCQkJCWNvbnN0IFMzMiByZXBDdXIgPSAoaSA9PSBaU1REX1JFUF9NT1ZFX09QVCkg PyAocmVwWzBdIC0gMSkgOiByZXBbaV07DQorCQkJCWNvbnN0IFUzMiByZXBJbmRleCA9IChVMzIp KGN1cnIgLSByZXBDdXIpOw0KKwkJCQljb25zdCBCWVRFICpjb25zdCByZXBCYXNlID0gcmVwSW5k ZXggPCBkaWN0TGltaXQgPyBkaWN0QmFzZSA6IGJhc2U7DQorCQkJCWNvbnN0IEJZVEUgKmNvbnN0 IHJlcE1hdGNoID0gcmVwQmFzZSArIHJlcEluZGV4Ow0KKwkJCQlpZiAoKHJlcEN1ciA+IDAgJiYg cmVwQ3VyIDw9IChTMzIpY3VycikgJiYNCisJCQkJICAgICgoKFUzMikoKGRpY3RMaW1pdCAtIDEp IC0gcmVwSW5kZXgpID49IDMpICYgKHJlcEluZGV4ID4gbG93ZXN0SW5kZXgpKSAvKiBpbnRlbnRp b25hbCBvdmVyZmxvdyAqLw0KKwkJCQkgICAgJiYgKFpTVERfcmVhZE1JTk1BVENIKGlwLCBtaW5N YXRjaCkgPT0gWlNURF9yZWFkTUlOTUFUQ0gocmVwTWF0Y2gsIG1pbk1hdGNoKSkpIHsNCisJCQkJ CS8qIHJlcGNvZGUgZGV0ZWN0ZWQgd2Ugc2hvdWxkIHRha2UgaXQgKi8NCisJCQkJCWNvbnN0IEJZ VEUgKmNvbnN0IHJlcEVuZCA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7 DQorCQkJCQltbGVuID0gKFUzMilaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIG1pbk1hdGNoLCBy ZXBNYXRjaCArIG1pbk1hdGNoLCBpZW5kLCByZXBFbmQsIHByZWZpeFN0YXJ0KSArIG1pbk1hdGNo Ow0KKw0KKwkJCQkJaWYgKG1sZW4gPiBzdWZmaWNpZW50X2xlbiB8fCBtbGVuID49IFpTVERfT1BU X05VTSkgew0KKwkJCQkJCWJlc3RfbWxlbiA9IG1sZW47DQorCQkJCQkJYmVzdF9vZmYgPSBpOw0K KwkJCQkJCWN1ciA9IDA7DQorCQkJCQkJbGFzdF9wb3MgPSAxOw0KKwkJCQkJCWdvdG8gX3N0b3Jl U2VxdWVuY2U7DQorCQkJCQl9DQorDQorCQkJCQliZXN0X29mZiA9IGkgLSAoaXAgPT0gYW5jaG9y KTsNCisJCQkJCWxpdGxlbiA9IG9wdFswXS5saXRsZW47DQorCQkJCQlkbyB7DQorCQkJCQkJcHJp Y2UgPSBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGFuY2hvciwgYmVzdF9vZmYs IG1sZW4gLSBNSU5NQVRDSCwgdWx0cmEpOw0KKwkJCQkJCWlmIChtbGVuID4gbGFzdF9wb3MgfHwg cHJpY2UgPCBvcHRbbWxlbl0ucHJpY2UpDQorCQkJCQkJCVNFVF9QUklDRShtbGVuLCBtbGVuLCBp LCBsaXRsZW4sIHByaWNlKTsgLyogbm90ZSA6IG1hY3JvIG1vZGlmaWVzIGxhc3RfcG9zICovDQor CQkJCQkJbWxlbi0tOw0KKwkJCQkJfSB3aGlsZSAobWxlbiA+PSBtaW5NYXRjaCk7DQorCQkJCX0N CisJCQl9DQorCQl9DQorDQorCQltYXRjaF9udW0gPSBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxl Y3RNTFNfZXh0RGljdChjdHgsIGlwLCBpZW5kLCBtYXhTZWFyY2hlcywgbWxzLCBtYXRjaGVzLCBt aW5NYXRjaCk7IC8qIGZpcnN0IHNlYXJjaCAoZGVwdGggMCkgKi8NCisNCisJCWlmICghbGFzdF9w b3MgJiYgIW1hdGNoX251bSkgew0KKwkJCWlwKys7DQorCQkJY29udGludWU7DQorCQl9DQorDQor CQl7DQorCQkJVTMyIGk7DQorCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQ0K KwkJCQlvcHRbMF0ucmVwW2ldID0gcmVwW2ldOw0KKwkJfQ0KKwkJb3B0WzBdLm1sZW4gPSAxOw0K Kw0KKwkJaWYgKG1hdGNoX251bSAmJiAobWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5sZW4gPiBzdWZm aWNpZW50X2xlbiB8fCBtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbiA+PSBaU1REX09QVF9OVU0p KSB7DQorCQkJYmVzdF9tbGVuID0gbWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5sZW47DQorCQkJYmVz dF9vZmYgPSBtYXRjaGVzW21hdGNoX251bSAtIDFdLm9mZjsNCisJCQljdXIgPSAwOw0KKwkJCWxh c3RfcG9zID0gMTsNCisJCQlnb3RvIF9zdG9yZVNlcXVlbmNlOw0KKwkJfQ0KKw0KKwkJYmVzdF9t bGVuID0gKGxhc3RfcG9zKSA/IGxhc3RfcG9zIDogbWluTWF0Y2g7DQorDQorCQkvKiBzZXQgcHJp Y2VzIHVzaW5nIG1hdGNoZXMgYXQgcG9zaXRpb24gPSAwICovDQorCQlmb3IgKHUgPSAwOyB1IDwg bWF0Y2hfbnVtOyB1KyspIHsNCisJCQltbGVuID0gKHUgPiAwKSA/IG1hdGNoZXNbdSAtIDFdLmxl biArIDEgOiBiZXN0X21sZW47DQorCQkJYmVzdF9tbGVuID0gbWF0Y2hlc1t1XS5sZW47DQorCQkJ bGl0bGVuID0gb3B0WzBdLmxpdGxlbjsNCisJCQl3aGlsZSAobWxlbiA8PSBiZXN0X21sZW4pIHsN CisJCQkJcHJpY2UgPSBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGFuY2hvciwg bWF0Y2hlc1t1XS5vZmYgLSAxLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsNCisJCQkJaWYgKG1s ZW4gPiBsYXN0X3BvcyB8fCBwcmljZSA8IG9wdFttbGVuXS5wcmljZSkNCisJCQkJCVNFVF9QUklD RShtbGVuLCBtbGVuLCBtYXRjaGVzW3VdLm9mZiwgbGl0bGVuLCBwcmljZSk7DQorCQkJCW1sZW4r KzsNCisJCQl9DQorCQl9DQorDQorCQlpZiAobGFzdF9wb3MgPCBtaW5NYXRjaCkgew0KKwkJCWlw Kys7DQorCQkJY29udGludWU7DQorCQl9DQorDQorCQkvKiBjaGVjayBmdXJ0aGVyIHBvc2l0aW9u cyAqLw0KKwkJZm9yIChjdXIgPSAxOyBjdXIgPD0gbGFzdF9wb3M7IGN1cisrKSB7DQorCQkJaW5y ID0gaXAgKyBjdXI7DQorDQorCQkJaWYgKG9wdFtjdXIgLSAxXS5tbGVuID09IDEpIHsNCisJCQkJ bGl0bGVuID0gb3B0W2N1ciAtIDFdLmxpdGxlbiArIDE7DQorCQkJCWlmIChjdXIgPiBsaXRsZW4p IHsNCisJCQkJCXByaWNlID0gb3B0W2N1ciAtIGxpdGxlbl0ucHJpY2UgKyBaU1REX2dldExpdGVy YWxQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBpbnIgLSBsaXRsZW4pOw0KKwkJCQl9IGVsc2UN CisJCQkJCXByaWNlID0gWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwg YW5jaG9yKTsNCisJCQl9IGVsc2Ugew0KKwkJCQlsaXRsZW4gPSAxOw0KKwkJCQlwcmljZSA9IG9w dFtjdXIgLSAxXS5wcmljZSArIFpTVERfZ2V0TGl0ZXJhbFByaWNlKHNlcVN0b3JlUHRyLCBsaXRs ZW4sIGluciAtIDEpOw0KKwkJCX0NCisNCisJCQlpZiAoY3VyID4gbGFzdF9wb3MgfHwgcHJpY2Ug PD0gb3B0W2N1cl0ucHJpY2UpDQorCQkJCVNFVF9QUklDRShjdXIsIDEsIDAsIGxpdGxlbiwgcHJp Y2UpOw0KKw0KKwkJCWlmIChjdXIgPT0gbGFzdF9wb3MpDQorCQkJCWJyZWFrOw0KKw0KKwkJCWlm IChpbnIgPiBpbGltaXQpIC8qIGxhc3QgbWF0Y2ggbXVzdCBzdGFydCBhdCBhIG1pbmltdW0gZGlz dGFuY2Ugb2YgOCBmcm9tIG9lbmQgKi8NCisJCQkJY29udGludWU7DQorDQorCQkJbWxlbiA9IG9w dFtjdXJdLm1sZW47DQorCQkJaWYgKG9wdFtjdXJdLm9mZiA+IFpTVERfUkVQX01PVkVfT1BUKSB7 DQorCQkJCW9wdFtjdXJdLnJlcFsyXSA9IG9wdFtjdXIgLSBtbGVuXS5yZXBbMV07DQorCQkJCW9w dFtjdXJdLnJlcFsxXSA9IG9wdFtjdXIgLSBtbGVuXS5yZXBbMF07DQorCQkJCW9wdFtjdXJdLnJl cFswXSA9IG9wdFtjdXJdLm9mZiAtIFpTVERfUkVQX01PVkVfT1BUOw0KKwkJCX0gZWxzZSB7DQor CQkJCW9wdFtjdXJdLnJlcFsyXSA9IChvcHRbY3VyXS5vZmYgPiAxKSA/IG9wdFtjdXIgLSBtbGVu XS5yZXBbMV0gOiBvcHRbY3VyIC0gbWxlbl0ucmVwWzJdOw0KKwkJCQlvcHRbY3VyXS5yZXBbMV0g PSAob3B0W2N1cl0ub2ZmID4gMCkgPyBvcHRbY3VyIC0gbWxlbl0ucmVwWzBdIDogb3B0W2N1ciAt IG1sZW5dLnJlcFsxXTsNCisJCQkJb3B0W2N1cl0ucmVwWzBdID0NCisJCQkJICAgICgob3B0W2N1 cl0ub2ZmID09IFpTVERfUkVQX01PVkVfT1BUKSAmJiAobWxlbiAhPSAxKSkgPyAob3B0W2N1ciAt IG1sZW5dLnJlcFswXSAtIDEpIDogKG9wdFtjdXIgLSBtbGVuXS5yZXBbb3B0W2N1cl0ub2ZmXSk7 DQorCQkJfQ0KKw0KKwkJCWJlc3RfbWxlbiA9IG1pbk1hdGNoOw0KKwkJCXsNCisJCQkJVTMyIGks IGxhc3RfaSA9IFpTVERfUkVQX0NIRUNLICsgKG1sZW4gIT0gMSk7DQorCQkJCWZvciAoaSA9ICht bGVuICE9IDEpOyBpIDwgbGFzdF9pOyBpKyspIHsNCisJCQkJCWNvbnN0IFMzMiByZXBDdXIgPSAo aSA9PSBaU1REX1JFUF9NT1ZFX09QVCkgPyAob3B0W2N1cl0ucmVwWzBdIC0gMSkgOiBvcHRbY3Vy XS5yZXBbaV07DQorCQkJCQljb25zdCBVMzIgcmVwSW5kZXggPSAoVTMyKShjdXJyICsgY3VyIC0g cmVwQ3VyKTsNCisJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcEJhc2UgPSByZXBJbmRleCA8IGRp Y3RMaW1pdCA/IGRpY3RCYXNlIDogYmFzZTsNCisJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcE1h dGNoID0gcmVwQmFzZSArIHJlcEluZGV4Ow0KKwkJCQkJaWYgKChyZXBDdXIgPiAwICYmIHJlcEN1 ciA8PSAoUzMyKShjdXJyICsgY3VyKSkgJiYNCisJCQkJCSAgICAoKChVMzIpKChkaWN0TGltaXQg LSAxKSAtIHJlcEluZGV4KSA+PSAzKSAmIChyZXBJbmRleCA+IGxvd2VzdEluZGV4KSkgLyogaW50 ZW50aW9uYWwgb3ZlcmZsb3cgKi8NCisJCQkJCSAgICAmJiAoWlNURF9yZWFkTUlOTUFUQ0goaW5y LCBtaW5NYXRjaCkgPT0gWlNURF9yZWFkTUlOTUFUQ0gocmVwTWF0Y2gsIG1pbk1hdGNoKSkpIHsN CisJCQkJCQkvKiByZXBjb2RlIGRldGVjdGVkICovDQorCQkJCQkJY29uc3QgQllURSAqY29uc3Qg cmVwRW5kID0gcmVwSW5kZXggPCBkaWN0TGltaXQgPyBkaWN0RW5kIDogaWVuZDsNCisJCQkJCQlt bGVuID0gKFUzMilaU1REX2NvdW50XzJzZWdtZW50cyhpbnIgKyBtaW5NYXRjaCwgcmVwTWF0Y2gg KyBtaW5NYXRjaCwgaWVuZCwgcmVwRW5kLCBwcmVmaXhTdGFydCkgKyBtaW5NYXRjaDsNCisNCisJ CQkJCQlpZiAobWxlbiA+IHN1ZmZpY2llbnRfbGVuIHx8IGN1ciArIG1sZW4gPj0gWlNURF9PUFRf TlVNKSB7DQorCQkJCQkJCWJlc3RfbWxlbiA9IG1sZW47DQorCQkJCQkJCWJlc3Rfb2ZmID0gaTsN CisJCQkJCQkJbGFzdF9wb3MgPSBjdXIgKyAxOw0KKwkJCQkJCQlnb3RvIF9zdG9yZVNlcXVlbmNl Ow0KKwkJCQkJCX0NCisNCisJCQkJCQliZXN0X29mZiA9IGkgLSAob3B0W2N1cl0ubWxlbiAhPSAx KTsNCisJCQkJCQlpZiAobWxlbiA+IGJlc3RfbWxlbikNCisJCQkJCQkJYmVzdF9tbGVuID0gbWxl bjsNCisNCisJCQkJCQlkbyB7DQorCQkJCQkJCWlmIChvcHRbY3VyXS5tbGVuID09IDEpIHsNCisJ CQkJCQkJCWxpdGxlbiA9IG9wdFtjdXJdLmxpdGxlbjsNCisJCQkJCQkJCWlmIChjdXIgPiBsaXRs ZW4pIHsNCisJCQkJCQkJCQlwcmljZSA9IG9wdFtjdXIgLSBsaXRsZW5dLnByaWNlICsgWlNURF9n ZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBpbnIgLSBsaXRsZW4sDQorCQkJCQkJCQkJCQkJ CQkJYmVzdF9vZmYsIG1sZW4gLSBNSU5NQVRDSCwgdWx0cmEpOw0KKwkJCQkJCQkJfSBlbHNlDQor CQkJCQkJCQkJcHJpY2UgPSBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGFuY2hv ciwgYmVzdF9vZmYsIG1sZW4gLSBNSU5NQVRDSCwgdWx0cmEpOw0KKwkJCQkJCQl9IGVsc2Ugew0K KwkJCQkJCQkJbGl0bGVuID0gMDsNCisJCQkJCQkJCXByaWNlID0gb3B0W2N1cl0ucHJpY2UgKyBa U1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCAwLCBOVUxMLCBiZXN0X29mZiwgbWxlbiAtIE1JTk1B VENILCB1bHRyYSk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJaWYgKGN1ciArIG1sZW4gPiBsYXN0 X3BvcyB8fCBwcmljZSA8PSBvcHRbY3VyICsgbWxlbl0ucHJpY2UpDQorCQkJCQkJCQlTRVRfUFJJ Q0UoY3VyICsgbWxlbiwgbWxlbiwgaSwgbGl0bGVuLCBwcmljZSk7DQorCQkJCQkJCW1sZW4tLTsN CisJCQkJCQl9IHdoaWxlIChtbGVuID49IG1pbk1hdGNoKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJ CX0NCisNCisJCQltYXRjaF9udW0gPSBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RNTFNfZXh0 RGljdChjdHgsIGluciwgaWVuZCwgbWF4U2VhcmNoZXMsIG1scywgbWF0Y2hlcywgbWluTWF0Y2gp Ow0KKw0KKwkJCWlmIChtYXRjaF9udW0gPiAwICYmIChtYXRjaGVzW21hdGNoX251bSAtIDFdLmxl biA+IHN1ZmZpY2llbnRfbGVuIHx8IGN1ciArIG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ubGVuID49 IFpTVERfT1BUX05VTSkpIHsNCisJCQkJYmVzdF9tbGVuID0gbWF0Y2hlc1ttYXRjaF9udW0gLSAx XS5sZW47DQorCQkJCWJlc3Rfb2ZmID0gbWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5vZmY7DQorCQkJ CWxhc3RfcG9zID0gY3VyICsgMTsNCisJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsNCisJCQl9DQor DQorCQkJLyogc2V0IHByaWNlcyB1c2luZyBtYXRjaGVzIGF0IHBvc2l0aW9uID0gY3VyICovDQor CQkJZm9yICh1ID0gMDsgdSA8IG1hdGNoX251bTsgdSsrKSB7DQorCQkJCW1sZW4gPSAodSA+IDAp ID8gbWF0Y2hlc1t1IC0gMV0ubGVuICsgMSA6IGJlc3RfbWxlbjsNCisJCQkJYmVzdF9tbGVuID0g bWF0Y2hlc1t1XS5sZW47DQorDQorCQkJCXdoaWxlIChtbGVuIDw9IGJlc3RfbWxlbikgew0KKwkJ CQkJaWYgKG9wdFtjdXJdLm1sZW4gPT0gMSkgew0KKwkJCQkJCWxpdGxlbiA9IG9wdFtjdXJdLmxp dGxlbjsNCisJCQkJCQlpZiAoY3VyID4gbGl0bGVuKQ0KKwkJCQkJCQlwcmljZSA9IG9wdFtjdXIg LSBsaXRsZW5dLnByaWNlICsgWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBpcCAr IGN1ciAtIGxpdGxlbiwNCisJCQkJCQkJCQkJCQkJbWF0Y2hlc1t1XS5vZmYgLSAxLCBtbGVuIC0g TUlOTUFUQ0gsIHVsdHJhKTsNCisJCQkJCQllbHNlDQorCQkJCQkJCXByaWNlID0gWlNURF9nZXRQ cmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IsIG1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxl biAtIE1JTk1BVENILCB1bHRyYSk7DQorCQkJCQl9IGVsc2Ugew0KKwkJCQkJCWxpdGxlbiA9IDA7 DQorCQkJCQkJcHJpY2UgPSBvcHRbY3VyXS5wcmljZSArIFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQ dHIsIDAsIE5VTEwsIG1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7 DQorCQkJCQl9DQorDQorCQkJCQlpZiAoY3VyICsgbWxlbiA+IGxhc3RfcG9zIHx8IChwcmljZSA8 IG9wdFtjdXIgKyBtbGVuXS5wcmljZSkpDQorCQkJCQkJU0VUX1BSSUNFKGN1ciArIG1sZW4sIG1s ZW4sIG1hdGNoZXNbdV0ub2ZmLCBsaXRsZW4sIHByaWNlKTsNCisNCisJCQkJCW1sZW4rKzsNCisJ CQkJfQ0KKwkJCX0NCisJCX0gLyogZm9yIChjdXIgPSAxOyBjdXIgPD0gbGFzdF9wb3M7IGN1cisr KSAqLw0KKw0KKwkJYmVzdF9tbGVuID0gb3B0W2xhc3RfcG9zXS5tbGVuOw0KKwkJYmVzdF9vZmYg PSBvcHRbbGFzdF9wb3NdLm9mZjsNCisJCWN1ciA9IGxhc3RfcG9zIC0gYmVzdF9tbGVuOw0KKw0K KwkvKiBzdG9yZSBzZXF1ZW5jZSAqLw0KK19zdG9yZVNlcXVlbmNlOiAvKiBjdXIsIGxhc3RfcG9z LCBiZXN0X21sZW4sIGJlc3Rfb2ZmIGhhdmUgdG8gYmUgc2V0ICovDQorCQlvcHRbMF0ubWxlbiA9 IDE7DQorDQorCQl3aGlsZSAoMSkgew0KKwkJCW1sZW4gPSBvcHRbY3VyXS5tbGVuOw0KKwkJCW9m ZnNldCA9IG9wdFtjdXJdLm9mZjsNCisJCQlvcHRbY3VyXS5tbGVuID0gYmVzdF9tbGVuOw0KKwkJ CW9wdFtjdXJdLm9mZiA9IGJlc3Rfb2ZmOw0KKwkJCWJlc3RfbWxlbiA9IG1sZW47DQorCQkJYmVz dF9vZmYgPSBvZmZzZXQ7DQorCQkJaWYgKG1sZW4gPiBjdXIpDQorCQkJCWJyZWFrOw0KKwkJCWN1 ciAtPSBtbGVuOw0KKwkJfQ0KKw0KKwkJZm9yICh1ID0gMDsgdSA8PSBsYXN0X3BvczspIHsNCisJ CQl1ICs9IG9wdFt1XS5tbGVuOw0KKwkJfQ0KKw0KKwkJZm9yIChjdXIgPSAwOyBjdXIgPCBsYXN0 X3BvczspIHsNCisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsNCisJCQlpZiAobWxlbiA9PSAxKSB7 DQorCQkJCWlwKys7DQorCQkJCWN1cisrOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJb2Zm c2V0ID0gb3B0W2N1cl0ub2ZmOw0KKwkJCWN1ciArPSBtbGVuOw0KKwkJCWxpdExlbmd0aCA9IChV MzIpKGlwIC0gYW5jaG9yKTsNCisNCisJCQlpZiAob2Zmc2V0ID4gWlNURF9SRVBfTU9WRV9PUFQp IHsNCisJCQkJcmVwWzJdID0gcmVwWzFdOw0KKwkJCQlyZXBbMV0gPSByZXBbMF07DQorCQkJCXJl cFswXSA9IG9mZnNldCAtIFpTVERfUkVQX01PVkVfT1BUOw0KKwkJCQlvZmZzZXQtLTsNCisJCQl9 IGVsc2Ugew0KKwkJCQlpZiAob2Zmc2V0ICE9IDApIHsNCisJCQkJCWJlc3Rfb2ZmID0gKG9mZnNl dCA9PSBaU1REX1JFUF9NT1ZFX09QVCkgPyAocmVwWzBdIC0gMSkgOiAocmVwW29mZnNldF0pOw0K KwkJCQkJaWYgKG9mZnNldCAhPSAxKQ0KKwkJCQkJCXJlcFsyXSA9IHJlcFsxXTsNCisJCQkJCXJl cFsxXSA9IHJlcFswXTsNCisJCQkJCXJlcFswXSA9IGJlc3Rfb2ZmOw0KKwkJCQl9DQorDQorCQkJ CWlmIChsaXRMZW5ndGggPT0gMCkNCisJCQkJCW9mZnNldC0tOw0KKwkJCX0NCisNCisJCQlaU1RE X3VwZGF0ZVByaWNlKHNlcVN0b3JlUHRyLCBsaXRMZW5ndGgsIGFuY2hvciwgb2Zmc2V0LCBtbGVu IC0gTUlOTUFUQ0gpOw0KKwkJCVpTVERfc3RvcmVTZXEoc2VxU3RvcmVQdHIsIGxpdExlbmd0aCwg YW5jaG9yLCBvZmZzZXQsIG1sZW4gLSBNSU5NQVRDSCk7DQorCQkJYW5jaG9yID0gaXAgPSBpcCAr IG1sZW47DQorCQl9DQorCX0gLyogZm9yIChjdXI9MDsgY3VyIDwgbGFzdF9wb3M7ICkgKi8NCisN CisJLyogU2F2ZSByZXBzIGZvciBuZXh0IGJsb2NrICovDQorCXsNCisJCWludCBpOw0KKwkJZm9y IChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQ0KKwkJCWN0eC0+cmVwVG9Db25maXJtW2ld ID0gcmVwW2ldOw0KKwl9DQorDQorCS8qIExhc3QgTGl0ZXJhbHMgKi8NCisJew0KKwkJc2l6ZV90 IGxhc3RMTFNpemUgPSBpZW5kIC0gYW5jaG9yOw0KKwkJbWVtY3B5KHNlcVN0b3JlUHRyLT5saXQs IGFuY2hvciwgbGFzdExMU2l6ZSk7DQorCQlzZXFTdG9yZVB0ci0+bGl0ICs9IGxhc3RMTFNpemU7 DQorCX0NCit9DQorDQorI2VuZGlmIC8qIFpTVERfT1BUX0hfOTE4NDIzOTg3NDMgKi8NCmRpZmYg LS1naXQgYS94ZW4vaW5jbHVkZS94ZW4veHhoYXNoLmggYi94ZW4vaW5jbHVkZS94ZW4veHhoYXNo LmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi5kZjQyNTExNDM4DQot LS0gL2Rldi9udWxsDQorKysgYi94ZW4vaW5jbHVkZS94ZW4veHhoYXNoLmgNCkBAIC0wLDAgKzEs MjU5IEBADQorLyoNCisgKiB4eEhhc2ggLSBFeHRyZW1lbHkgRmFzdCBIYXNoIGFsZ29yaXRobQ0K KyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE2LCBZYW5uIENvbGxldC4NCisgKg0KKyAqIEJTRCAy LUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1s aWNlbnNlLnBocCkNCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCisgKiBt ZXQ6DQorICoNCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgKiBSZWRpc3RyaWJ1 dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorICogICAgIGNv cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n IGRpc2NsYWltZXINCisgKiAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAqICAgICBkaXN0cmlidXRpb24uDQorICoNCisg KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg Q09OVFJJQlVUT1JTDQorICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisgKiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS SUdIVA0KKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs IElORElSRUNULCBJTkNJREVOVEFMLA0KKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBQUk9D VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisg KiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV U0VEIEFORCBPTiBBTlkNCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorICogKElOQ0xVRElORyBORUdMSUdFTkNF IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorICogT0Yg VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI IERBTUFHRS4NCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQorICogdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5 IHRoZQ0KKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBwcm9ncmFtIGlzIGR1YWwt bGljZW5zZWQ7IHlvdSBtYXkgc2VsZWN0DQorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQ0KKyAqICgiQlNE IikuDQorICoNCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdDoNCisgKiAtIHh4SGFz aCBob21lcGFnZTogaHR0cHM6Ly9jeWFuNDk3My5naXRodWIuaW8veHhIYXNoLw0KKyAqIC0geHhI YXNoIHNvdXJjZSByZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vQ3lhbjQ5NzMveHhIYXNo DQorICovDQorDQorLyoNCisgKiBOb3RpY2UgZXh0cmFjdGVkIGZyb20geHhIYXNoIGhvbWVwYWdl Og0KKyAqDQorICogeHhIYXNoIGlzIGFuIGV4dHJlbWVseSBmYXN0IEhhc2ggYWxnb3JpdGhtLCBy dW5uaW5nIGF0IFJBTSBzcGVlZCBsaW1pdHMuDQorICogSXQgYWxzbyBzdWNjZXNzZnVsbHkgcGFz c2VzIGFsbCB0ZXN0cyBmcm9tIHRoZSBTTUhhc2hlciBzdWl0ZS4NCisgKg0KKyAqIENvbXBhcmlz b24gKHNpbmdsZSB0aHJlYWQsIFdpbmRvd3MgU2V2ZW4gMzIgYml0cywgdXNpbmcgU01IYXNoZXIg b24gYSBDb3JlIDINCisgKiBEdW8gQDNHSHopDQorICoNCisgKiBOYW1lICAgICAgICAgICAgU3Bl ZWQgICAgICAgUS5TY29yZSAgIEF1dGhvcg0KKyAqIHh4SGFzaCAgICAgICAgICA1LjQgR0IvcyAg ICAgMTANCisgKiBDcmFwV293ICAgICAgICAgMy4yIEdCL3MgICAgICAyICAgICAgIEFuZHJldw0K KyAqIE11bXVySGFzaCAzYSAgICAyLjcgR0IvcyAgICAgMTAgICAgICAgQXVzdGluIEFwcGxlYnkN CisgKiBTcG9va3lIYXNoICAgICAgMi4wIEdCL3MgICAgIDEwICAgICAgIEJvYiBKZW5raW5zDQor ICogU0JveCAgICAgICAgICAgIDEuNCBHQi9zICAgICAgOSAgICAgICBCcmV0IE11bHZleQ0KKyAq IExvb2t1cDMgICAgICAgICAxLjIgR0IvcyAgICAgIDkgICAgICAgQm9iIEplbmtpbnMNCisgKiBT dXBlckZhc3RIYXNoICAgMS4yIEdCL3MgICAgICAxICAgICAgIFBhdWwgSHNpZWgNCisgKiBDaXR5 SGFzaDY0ICAgICAgMS4wNSBHQi9zICAgIDEwICAgICAgIFBpa2UgJiBBbGFrdWlqYWxhDQorICog Rk5WICAgICAgICAgICAgIDAuNTUgR0IvcyAgICAgNSAgICAgICBGb3dsZXIsIE5vbGwsIFZvDQor ICogQ1JDMzIgICAgICAgICAgIDAuNDMgR0IvcyAgICAgOQ0KKyAqIE1ENS0zMiAgICAgICAgICAw LjMzIEdCL3MgICAgMTAgICAgICAgUm9uYWxkIEwuIFJpdmVzdA0KKyAqIFNIQTEtMzIgICAgICAg ICAwLjI4IEdCL3MgICAgMTANCisgKg0KKyAqIFEuU2NvcmUgaXMgYSBtZWFzdXJlIG9mIHF1YWxp dHkgb2YgdGhlIGhhc2ggZnVuY3Rpb24uDQorICogSXQgZGVwZW5kcyBvbiBzdWNjZXNzZnVsbHkg cGFzc2luZyBTTUhhc2hlciB0ZXN0IHNldC4NCisgKiAxMCBpcyBhIHBlcmZlY3Qgc2NvcmUuDQor ICoNCisgKiBBIDY0LWJpdHMgdmVyc2lvbiwgbmFtZWQgeHhoNjQgb2ZmZXJzIG11Y2ggYmV0dGVy IHNwZWVkLA0KKyAqIGJ1dCBmb3IgNjQtYml0cyBhcHBsaWNhdGlvbnMgb25seS4NCisgKiBOYW1l ICAgICBTcGVlZCBvbiA2NCBiaXRzICAgIFNwZWVkIG9uIDMyIGJpdHMNCisgKiB4eGg2NCAgICAg ICAxMy44IEdCL3MgICAgICAgICAgICAxLjkgR0Ivcw0KKyAqIHh4aDMyICAgICAgICA2LjggR0Iv cyAgICAgICAgICAgIDYuMCBHQi9zDQorICovDQorDQorI2lmbmRlZiBYWEhBU0hfSA0KKyNkZWZp bmUgWFhIQVNIX0gNCisNCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4NCisNCisvKi0qKioqKioq KioqKioqKioqKioqKioqKioqKioqDQorICogU2ltcGxlIEhhc2ggRnVuY3Rpb25zDQorICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qKg0KKyAqIHh4aDMyKCkgLSBjYWxjdWxh dGUgdGhlIDMyLWJpdCBoYXNoIG9mIHRoZSBpbnB1dCB3aXRoIGEgZ2l2ZW4gc2VlZC4NCisgKg0K KyAqIEBpbnB1dDogIFRoZSBkYXRhIHRvIGhhc2guDQorICogQGxlbmd0aDogVGhlIGxlbmd0aCBv ZiB0aGUgZGF0YSB0byBoYXNoLg0KKyAqIEBzZWVkOiAgIFRoZSBzZWVkIGNhbiBiZSB1c2VkIHRv IGFsdGVyIHRoZSByZXN1bHQgcHJlZGljdGFibHkuDQorICoNCisgKiBTcGVlZCBvbiBDb3JlIDIg RHVvIEAgMyBHSHogKHNpbmdsZSB0aHJlYWQsIFNNSGFzaGVyIGJlbmNobWFyaykgOiA1LjQgR0Iv cw0KKyAqDQorICogUmV0dXJuOiAgVGhlIDMyLWJpdCBoYXNoIG9mIHRoZSBkYXRhLg0KKyAqLw0K K3VpbnQzMl90IHh4aDMyKGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3QgbGVuZ3RoLCB1aW50MzJf dCBzZWVkKTsNCisNCisvKioNCisgKiB4eGg2NCgpIC0gY2FsY3VsYXRlIHRoZSA2NC1iaXQgaGFz aCBvZiB0aGUgaW5wdXQgd2l0aCBhIGdpdmVuIHNlZWQuDQorICoNCisgKiBAaW5wdXQ6ICBUaGUg ZGF0YSB0byBoYXNoLg0KKyAqIEBsZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gaGFz aC4NCisgKiBAc2VlZDogICBUaGUgc2VlZCBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGUgcmVzdWx0 IHByZWRpY3RhYmx5Lg0KKyAqDQorICogVGhpcyBmdW5jdGlvbiBydW5zIDJ4IGZhc3RlciBvbiA2 NC1iaXQgc3lzdGVtcywgYnV0IHNsb3dlciBvbiAzMi1iaXQgc3lzdGVtcy4NCisgKg0KKyAqIFJl dHVybjogIFRoZSA2NC1iaXQgaGFzaCBvZiB0aGUgZGF0YS4NCisgKi8NCit1aW50NjRfdCB4eGg2 NChjb25zdCB2b2lkICppbnB1dCwgc2l6ZV90IGxlbmd0aCwgdWludDY0X3Qgc2VlZCk7DQorDQor LyoqDQorICogeHhoYXNoKCkgLSBjYWxjdWxhdGUgd29yZHNpemUgaGFzaCBvZiB0aGUgaW5wdXQg d2l0aCBhIGdpdmVuIHNlZWQNCisgKiBAaW5wdXQ6ICBUaGUgZGF0YSB0byBoYXNoLg0KKyAqIEBs ZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gaGFzaC4NCisgKiBAc2VlZDogICBUaGUg c2VlZCBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGUgcmVzdWx0IHByZWRpY3RhYmx5Lg0KKyAqDQor ICogSWYgdGhlIGhhc2ggZG9lcyBub3QgbmVlZCB0byBiZSBjb21wYXJhYmxlIGJldHdlZW4gbWFj aGluZXMgd2l0aA0KKyAqIGRpZmZlcmVudCB3b3JkIHNpemVzLCB0aGlzIGZ1bmN0aW9uIHdpbGwg Y2FsbCB3aGljaGV2ZXIgb2YgeHhoMzIoKQ0KKyAqIG9yIHh4aDY0KCkgaXMgZmFzdGVyLg0KKyAq DQorICogUmV0dXJuOiAgd29yZHNpemUgaGFzaCBvZiB0aGUgZGF0YS4NCisgKi8NCisNCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgeHhoYXNoKGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3Qg bGVuZ3RoLA0KKwkJCQkgICB1aW50NjRfdCBzZWVkKQ0KK3sNCisjaWYgQklUU19QRVJfTE9ORyA9 PSA2NA0KKyAgICAgICByZXR1cm4geHhoNjQoaW5wdXQsIGxlbmd0aCwgc2VlZCk7DQorI2Vsc2UN CisgICAgICAgcmV0dXJuIHh4aDMyKGlucHV0LCBsZW5ndGgsIHNlZWQpOw0KKyNlbmRpZg0KK30N CisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogU3RyZWFtaW5nIEhhc2gg RnVuY3Rpb25zDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qDQorICog VGhlc2UgZGVmaW5pdGlvbnMgYXJlIG9ubHkgbWVhbnQgdG8gYWxsb3cgYWxsb2NhdGlvbiBvZiBY WEggc3RhdGUNCisgKiBzdGF0aWNhbGx5LCBvbiBzdGFjaywgb3IgaW4gYSBzdHJ1Y3QgZm9yIGV4 YW1wbGUuDQorICogRG8gbm90IHVzZSBtZW1iZXJzIGRpcmVjdGx5Lg0KKyAqLw0KKw0KKy8qKg0K KyAqIHN0cnVjdCB4eGgzMl9zdGF0ZSAtIHByaXZhdGUgeHhoMzIgc3RhdGUsIGRvIG5vdCB1c2Ug bWVtYmVycyBkaXJlY3RseQ0KKyAqLw0KK3N0cnVjdCB4eGgzMl9zdGF0ZSB7DQorCXVpbnQzMl90 IHRvdGFsX2xlbl8zMjsNCisJdWludDMyX3QgbGFyZ2VfbGVuOw0KKwl1aW50MzJfdCB2MTsNCisJ dWludDMyX3QgdjI7DQorCXVpbnQzMl90IHYzOw0KKwl1aW50MzJfdCB2NDsNCisJdWludDMyX3Qg bWVtMzJbNF07DQorCXVpbnQzMl90IG1lbXNpemU7DQorfTsNCisNCisvKioNCisgKiBzdHJ1Y3Qg eHhoMzJfc3RhdGUgLSBwcml2YXRlIHh4aDY0IHN0YXRlLCBkbyBub3QgdXNlIG1lbWJlcnMgZGly ZWN0bHkNCisgKi8NCitzdHJ1Y3QgeHhoNjRfc3RhdGUgew0KKwl1aW50NjRfdCB0b3RhbF9sZW47 DQorCXVpbnQ2NF90IHYxOw0KKwl1aW50NjRfdCB2MjsNCisJdWludDY0X3QgdjM7DQorCXVpbnQ2 NF90IHY0Ow0KKwl1aW50NjRfdCBtZW02NFs0XTsNCisJdWludDMyX3QgbWVtc2l6ZTsNCit9Ow0K Kw0KKy8qKg0KKyAqIHh4aDMyX3Jlc2V0KCkgLSByZXNldCB0aGUgeHhoMzIgc3RhdGUgdG8gc3Rh cnQgYSBuZXcgaGFzaGluZyBvcGVyYXRpb24NCisgKg0KKyAqIEBzdGF0ZTogVGhlIHh4aDMyIHN0 YXRlIHRvIHJlc2V0Lg0KKyAqIEBzZWVkOiAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZSB3aXRo IHRoaXMgc2VlZC4NCisgKg0KKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBvbiBhbnkgeHhoMzJfc3Rh dGUgdG8gcHJlcGFyZSBmb3IgYSBuZXcgaGFzaGluZyBvcGVyYXRpb24uDQorICovDQordm9pZCB4 eGgzMl9yZXNldChzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRlLCB1aW50MzJfdCBzZWVkKTsNCisN CisvKioNCisgKiB4eGgzMl91cGRhdGUoKSAtIGhhc2ggdGhlIGRhdGEgZ2l2ZW4gYW5kIHVwZGF0 ZSB0aGUgeHhoMzIgc3RhdGUNCisgKg0KKyAqIEBzdGF0ZTogIFRoZSB4eGgzMiBzdGF0ZSB0byB1 cGRhdGUuDQorICogQGlucHV0OiAgVGhlIGRhdGEgdG8gaGFzaC4NCisgKiBAbGVuZ3RoOiBUaGUg bGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGhhc2guDQorICoNCisgKiBBZnRlciBjYWxsaW5nIHh4aDMy X3Jlc2V0KCkgY2FsbCB4eGgzMl91cGRhdGUoKSBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeS4N CisgKg0KKyAqIFJldHVybjogIFplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGFuIGVycm9yIGNv ZGUuDQorICovDQoraW50IHh4aDMyX3VwZGF0ZShzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRlLCBj b25zdCB2b2lkICppbnB1dCwgc2l6ZV90IGxlbmd0aCk7DQorDQorLyoqDQorICogeHhoMzJfZGln ZXN0KCkgLSBwcm9kdWNlIHRoZSBjdXJyZW50IHh4aDMyIGhhc2gNCisgKg0KKyAqIEBzdGF0ZTog UHJvZHVjZSB0aGUgY3VycmVudCB4eGgzMiBoYXNoIG9mIHRoaXMgc3RhdGUuDQorICoNCisgKiBB IGhhc2ggdmFsdWUgY2FuIGJlIHByb2R1Y2VkIGF0IGFueSB0aW1lLiBJdCBpcyBzdGlsbCBwb3Nz aWJsZSB0byBjb250aW51ZQ0KKyAqIGluc2VydGluZyBpbnB1dCBpbnRvIHRoZSBoYXNoIHN0YXRl IGFmdGVyIGEgY2FsbCB0byB4eGgzMl9kaWdlc3QoKSwgYW5kDQorICogZ2VuZXJhdGUgbmV3IGhh c2hlcyBsYXRlciBvbiwgYnkgY2FsbGluZyB4eGgzMl9kaWdlc3QoKSBhZ2Fpbi4NCisgKg0KKyAq IFJldHVybjogVGhlIHh4aDMyIGhhc2ggc3RvcmVkIGluIHRoZSBzdGF0ZS4NCisgKi8NCit1aW50 MzJfdCB4eGgzMl9kaWdlc3QoY29uc3Qgc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0ZSk7DQorDQor LyoqDQorICogeHhoNjRfcmVzZXQoKSAtIHJlc2V0IHRoZSB4eGg2NCBzdGF0ZSB0byBzdGFydCBh IG5ldyBoYXNoaW5nIG9wZXJhdGlvbg0KKyAqDQorICogQHN0YXRlOiBUaGUgeHhoNjQgc3RhdGUg dG8gcmVzZXQuDQorICogQHNlZWQ6ICBJbml0aWFsaXplIHRoZSBoYXNoIHN0YXRlIHdpdGggdGhp cyBzZWVkLg0KKyAqLw0KK3ZvaWQgeHhoNjRfcmVzZXQoc3RydWN0IHh4aDY0X3N0YXRlICpzdGF0 ZSwgdWludDY0X3Qgc2VlZCk7DQorDQorLyoqDQorICogeHhoNjRfdXBkYXRlKCkgLSBoYXNoIHRo ZSBkYXRhIGdpdmVuIGFuZCB1cGRhdGUgdGhlIHh4aDY0IHN0YXRlDQorICogQHN0YXRlOiAgVGhl IHh4aDY0IHN0YXRlIHRvIHVwZGF0ZS4NCisgKiBAaW5wdXQ6ICBUaGUgZGF0YSB0byBoYXNoLg0K KyAqIEBsZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gaGFzaC4NCisgKg0KKyAqIEFm dGVyIGNhbGxpbmcgeHhoNjRfcmVzZXQoKSBjYWxsIHh4aDY0X3VwZGF0ZSgpIGFzIG1hbnkgdGlt ZXMgYXMgbmVjZXNzYXJ5Lg0KKyAqDQorICogUmV0dXJuOiAgWmVybyBvbiBzdWNjZXNzLCBvdGhl cndpc2UgYW4gZXJyb3IgY29kZS4NCisgKi8NCitpbnQgeHhoNjRfdXBkYXRlKHN0cnVjdCB4eGg2 NF9zdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmlucHV0LCBzaXplX3QgbGVuZ3RoKTsNCisNCisv KioNCisgKiB4eGg2NF9kaWdlc3QoKSAtIHByb2R1Y2UgdGhlIGN1cnJlbnQgeHhoNjQgaGFzaA0K KyAqDQorICogQHN0YXRlOiBQcm9kdWNlIHRoZSBjdXJyZW50IHh4aDY0IGhhc2ggb2YgdGhpcyBz dGF0ZS4NCisgKg0KKyAqIEEgaGFzaCB2YWx1ZSBjYW4gYmUgcHJvZHVjZWQgYXQgYW55IHRpbWUu IEl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIGNvbnRpbnVlDQorICogaW5zZXJ0aW5nIGlucHV0IGlu dG8gdGhlIGhhc2ggc3RhdGUgYWZ0ZXIgYSBjYWxsIHRvIHh4aDY0X2RpZ2VzdCgpLCBhbmQNCisg KiBnZW5lcmF0ZSBuZXcgaGFzaGVzIGxhdGVyIG9uLCBieSBjYWxsaW5nIHh4aDY0X2RpZ2VzdCgp IGFnYWluLg0KKyAqDQorICogUmV0dXJuOiBUaGUgeHhoNjQgaGFzaCBzdG9yZWQgaW4gdGhlIHN0 YXRlLg0KKyAqLw0KK3VpbnQ2NF90IHh4aDY0X2RpZ2VzdChjb25zdCBzdHJ1Y3QgeHhoNjRfc3Rh dGUgKnN0YXRlKTsNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIFV0aWxz DQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKioNCisgKiB4eGgzMl9jb3B5 X3N0YXRlKCkgLSBjb3B5IHRoZSBzb3VyY2Ugc3RhdGUgaW50byB0aGUgZGVzdGluYXRpb24gc3Rh dGUNCisgKg0KKyAqIEBzcmM6IFRoZSBzb3VyY2UgeHhoMzIgc3RhdGUuDQorICogQGRzdDogVGhl IGRlc3RpbmF0aW9uIHh4aDMyIHN0YXRlLg0KKyAqLw0KK3ZvaWQgeHhoMzJfY29weV9zdGF0ZShz dHJ1Y3QgeHhoMzJfc3RhdGUgKmRzdCwgY29uc3Qgc3RydWN0IHh4aDMyX3N0YXRlICpzcmMpOw0K Kw0KKy8qKg0KKyAqIHh4aDY0X2NvcHlfc3RhdGUoKSAtIGNvcHkgdGhlIHNvdXJjZSBzdGF0ZSBp bnRvIHRoZSBkZXN0aW5hdGlvbiBzdGF0ZQ0KKyAqDQorICogQHNyYzogVGhlIHNvdXJjZSB4eGg2 NCBzdGF0ZS4NCisgKiBAZHN0OiBUaGUgZGVzdGluYXRpb24geHhoNjQgc3RhdGUuDQorICovDQor dm9pZCB4eGg2NF9jb3B5X3N0YXRlKHN0cnVjdCB4eGg2NF9zdGF0ZSAqZHN0LCBjb25zdCBzdHJ1 Y3QgeHhoNjRfc3RhdGUgKnNyYyk7DQorDQorI2VuZGlmIC8qIFhYSEFTSF9IICovDQpkaWZmIC0t Z2l0IGEveGVuL2luY2x1ZGUveGVuL3pzdGQuaCBiL3hlbi9pbmNsdWRlL3hlbi96c3RkLmgNCm5l dyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi4yNDk1NzVlMjQ4DQotLS0gL2Rl di9udWxsDQorKysgYi94ZW4vaW5jbHVkZS94ZW4venN0ZC5oDQpAQCAtMCwwICsxLDExNTcgQEAN CisvKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBZYW5uIENvbGxldCwgRmFjZWJv b2ssIEluYy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogVGhpcyBzb3VyY2Ug Y29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhl DQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBodHRwczovL2dpdGh1 Yi5jb20vZmFjZWJvb2svenN0ZC4NCisgKiBBbiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCBy aWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlDQorICogc2FtZSBk aXJlY3RvcnkuDQorICoNCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KKyAqIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBi eSB0aGUNCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFs LWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdA0KKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UNCisgKiAoIkJT RCIpLg0KKyAqLw0KKw0KKyNpZm5kZWYgWlNURF9IDQorI2RlZmluZSBaU1REX0gNCisNCisvKiA9 PT09PT0gICBEZXBlbmRlbmN5ICAgPT09PT09Ki8NCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4g ICAvKiBzaXplX3QgKi8NCisNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEludHJv ZHVjdGlvbg0KKyAqDQorICogenN0ZCwgc2hvcnQgZm9yIFpzdGFuZGFyZCwgaXMgYSBmYXN0IGxv c3NsZXNzIGNvbXByZXNzaW9uIGFsZ29yaXRobSwNCisgKiB0YXJnZXRpbmcgcmVhbC10aW1lIGNv bXByZXNzaW9uIHNjZW5hcmlvcyBhdCB6bGliLWxldmVsIGFuZCBiZXR0ZXINCisgKiBjb21wcmVz c2lvbiByYXRpb3MuIFRoZSB6c3RkIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVt b3J5DQorICogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBUaGUgbGli cmFyeSBzdXBwb3J0cyBjb21wcmVzc2lvbg0KKyAqIGxldmVscyBmcm9tIDEgdXAgdG8gWlNURF9t YXhDTGV2ZWwoKSB3aGljaCBpcyAyMi4gTGV2ZWxzID49IDIwLCBsYWJlbGVkDQorICogdWx0cmEs IHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbiwgYXMgdGhleSByZXF1aXJlIG1vcmUgbWVtb3J5 Lg0KKyAqIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluOg0KKyAqICAtIGEgc2luZ2xlIHN0ZXAs IHJldXNpbmcgYSBjb250ZXh0IChkZXNjcmliZWQgYXMgRXhwbGljaXQgbWVtb3J5IG1hbmFnZW1l bnQpDQorICogIC0gdW5ib3VuZGVkIG11bHRpcGxlIHN0ZXBzIChkZXNjcmliZWQgYXMgU3RyZWFt aW5nIGNvbXByZXNzaW9uKQ0KKyAqIFRoZSBjb21wcmVzc2lvbiByYXRpbyBhY2hpZXZhYmxlIG9u IHNtYWxsIGRhdGEgY2FuIGJlIGhpZ2hseSBpbXByb3ZlZCB1c2luZw0KKyAqIGNvbXByZXNzaW9u IHdpdGggYSBkaWN0aW9uYXJ5IGluOg0KKyAqICAtIGEgc2luZ2xlIHN0ZXAgKGRlc2NyaWJlZCBh cyBTaW1wbGUgZGljdGlvbmFyeSBBUEkpDQorICogIC0gYSBzaW5nbGUgc3RlcCwgcmV1c2luZyBh IGRpY3Rpb25hcnkgKGRlc2NyaWJlZCBhcyBGYXN0IGRpY3Rpb25hcnkgQVBJKQ0KKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQorDQorLyo9PT09PT0gIEhlbHBlciBmdW5jdGlvbnMgID09PT09PSov DQorDQorLyoqDQorICogZW51bSBaU1REX0Vycm9yQ29kZSAtIHpzdGQgZXJyb3IgY29kZXMNCisg Kg0KKyAqIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBzaXplX3QgY2FuIGJlIGNoZWNrZWQgZm9yIGVy cm9ycyB1c2luZyBaU1REX2lzRXJyb3IoKQ0KKyAqIGFuZCB0aGUgWlNURF9FcnJvckNvZGUgY2Fu IGJlIGV4dHJhY3RlZCB1c2luZyBaU1REX2dldEVycm9yQ29kZSgpLg0KKyAqLw0KK3R5cGVkZWYg ZW51bSB7DQorCVpTVERfZXJyb3Jfbm9fZXJyb3IsDQorCVpTVERfZXJyb3JfR0VORVJJQywNCisJ WlNURF9lcnJvcl9wcmVmaXhfdW5rbm93biwNCisJWlNURF9lcnJvcl92ZXJzaW9uX3Vuc3VwcG9y dGVkLA0KKwlaU1REX2Vycm9yX3BhcmFtZXRlcl91bmtub3duLA0KKwlaU1REX2Vycm9yX2ZyYW1l UGFyYW1ldGVyX3Vuc3VwcG9ydGVkLA0KKwlaU1REX2Vycm9yX2ZyYW1lUGFyYW1ldGVyX3Vuc3Vw cG9ydGVkQnkzMmJpdHMsDQorCVpTVERfZXJyb3JfZnJhbWVQYXJhbWV0ZXJfd2luZG93VG9vTGFy Z2UsDQorCVpTVERfZXJyb3JfY29tcHJlc3Npb25QYXJhbWV0ZXJfdW5zdXBwb3J0ZWQsDQorCVpT VERfZXJyb3JfaW5pdF9taXNzaW5nLA0KKwlaU1REX2Vycm9yX21lbW9yeV9hbGxvY2F0aW9uLA0K KwlaU1REX2Vycm9yX3N0YWdlX3dyb25nLA0KKwlaU1REX2Vycm9yX2RzdFNpemVfdG9vU21hbGws DQorCVpTVERfZXJyb3Jfc3JjU2l6ZV93cm9uZywNCisJWlNURF9lcnJvcl9jb3JydXB0aW9uX2Rl dGVjdGVkLA0KKwlaU1REX2Vycm9yX2NoZWNrc3VtX3dyb25nLA0KKwlaU1REX2Vycm9yX3RhYmxl TG9nX3Rvb0xhcmdlLA0KKwlaU1REX2Vycm9yX21heFN5bWJvbFZhbHVlX3Rvb0xhcmdlLA0KKwla U1REX2Vycm9yX21heFN5bWJvbFZhbHVlX3Rvb1NtYWxsLA0KKwlaU1REX2Vycm9yX2RpY3Rpb25h cnlfY29ycnVwdGVkLA0KKwlaU1REX2Vycm9yX2RpY3Rpb25hcnlfd3JvbmcsDQorCVpTVERfZXJy b3JfZGljdGlvbmFyeUNyZWF0aW9uX2ZhaWxlZCwNCisJWlNURF9lcnJvcl9tYXhDb2RlDQorfSBa U1REX0Vycm9yQ29kZTsNCisNCisvKioNCisgKiBaU1REX21heENMZXZlbCgpIC0gbWF4aW11bSBj b21wcmVzc2lvbiBsZXZlbCBhdmFpbGFibGUNCisgKg0KKyAqIFJldHVybjogTWF4aW11bSBjb21w cmVzc2lvbiBsZXZlbCBhdmFpbGFibGUuDQorICovDQoraW50IFpTVERfbWF4Q0xldmVsKHZvaWQp Ow0KKy8qKg0KKyAqIFpTVERfY29tcHJlc3NCb3VuZCgpIC0gbWF4aW11bSBjb21wcmVzc2VkIHNp emUgaW4gd29yc3QgY2FzZSBzY2VuYXJpbw0KKyAqIEBzcmNTaXplOiBUaGUgc2l6ZSBvZiB0aGUg ZGF0YSB0byBjb21wcmVzcy4NCisgKg0KKyAqIFJldHVybjogICBUaGUgbWF4aW11bSBjb21wcmVz c2VkIHNpemUgaW4gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8uDQorICovDQorc2l6ZV90IFpTVERf Y29tcHJlc3NCb3VuZChzaXplX3Qgc3JjU2l6ZSk7DQorLyoqDQorICogWlNURF9pc0Vycm9yKCkg LSB0ZWxscyBpZiBhIHNpemVfdCBmdW5jdGlvbiByZXN1bHQgaXMgYW4gZXJyb3IgY29kZQ0KKyAq IEBjb2RlOiAgVGhlIGZ1bmN0aW9uIHJlc3VsdCB0byBjaGVjayBmb3IgZXJyb3IuDQorICoNCisg KiBSZXR1cm46IE5vbi16ZXJvIGlmZiB0aGUgY29kZSBpcyBhbiBlcnJvci4NCisgKi8NCitzdGF0 aWMgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgdW5zaWduZWQgaW50IFpTVERfaXNFcnJvcihzaXpl X3QgY29kZSkNCit7DQorCXJldHVybiBjb2RlID4gKHNpemVfdCktWlNURF9lcnJvcl9tYXhDb2Rl Ow0KK30NCisvKioNCisgKiBaU1REX2dldEVycm9yQ29kZSgpIC0gdHJhbnNsYXRlcyBhbiBlcnJv ciBmdW5jdGlvbiByZXN1bHQgdG8gYSBaU1REX0Vycm9yQ29kZQ0KKyAqIEBmdW5jdGlvblJlc3Vs dDogVGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGZvciB3aGljaCBaU1REX2lzRXJyb3IoKSBpcyB0 cnVlLg0KKyAqDQorICogUmV0dXJuOiAgICAgICAgICBUaGUgWlNURF9FcnJvckNvZGUgY29ycmVz cG9uZGluZyB0byB0aGUgZnVuY3Rpb25SZXN1bHQgb3IgMA0KKyAqICAgICAgICAgICAgICAgICAg aWYgdGhlIGZ1bmN0aW9uUmVzdWx0IGlzbid0IGFuIGVycm9yLg0KKyAqLw0KK3N0YXRpYyBfX2F0 dHJpYnV0ZV9fKCh1bnVzZWQpKSBaU1REX0Vycm9yQ29kZSBaU1REX2dldEVycm9yQ29kZSgNCisJ c2l6ZV90IGZ1bmN0aW9uUmVzdWx0KQ0KK3sNCisJaWYgKCFaU1REX2lzRXJyb3IoZnVuY3Rpb25S ZXN1bHQpKQ0KKwkJcmV0dXJuIChaU1REX0Vycm9yQ29kZSkwOw0KKwlyZXR1cm4gKFpTVERfRXJy b3JDb2RlKSgwIC0gZnVuY3Rpb25SZXN1bHQpOw0KK30NCisNCisvKioNCisgKiBlbnVtIFpTVERf c3RyYXRlZ3kgLSB6c3RkIGNvbXByZXNzaW9uIHNlYXJjaCBzdHJhdGVneQ0KKyAqDQorICogRnJv bSBmYXN0ZXIgdG8gc3Ryb25nZXIuDQorICovDQordHlwZWRlZiBlbnVtIHsNCisJWlNURF9mYXN0 LA0KKwlaU1REX2RmYXN0LA0KKwlaU1REX2dyZWVkeSwNCisJWlNURF9sYXp5LA0KKwlaU1REX2xh enkyLA0KKwlaU1REX2J0bGF6eTIsDQorCVpTVERfYnRvcHQsDQorCVpTVERfYnRvcHQyDQorfSBa U1REX3N0cmF0ZWd5Ow0KKw0KKy8qKg0KKyAqIHN0cnVjdCBaU1REX2NvbXByZXNzaW9uUGFyYW1l dGVycyAtIHpzdGQgY29tcHJlc3Npb24gcGFyYW1ldGVycw0KKyAqIEB3aW5kb3dMb2c6ICAgIExv ZyBvZiB0aGUgbGFyZ2VzdCBtYXRjaCBkaXN0YW5jZS4gTGFyZ2VyIG1lYW5zIG1vcmUNCisgKiAg ICAgICAgICAgICAgICBjb21wcmVzc2lvbiwgYW5kIG1vcmUgbWVtb3J5IG5lZWRlZCBkdXJpbmcg ZGVjb21wcmVzc2lvbi4NCisgKiBAY2hhaW5Mb2c6ICAgICBGdWxseSBzZWFyY2hlZCBzZWdtZW50 LiBMYXJnZXIgbWVhbnMgbW9yZSBjb21wcmVzc2lvbiwgc2xvd2VyLA0KKyAqICAgICAgICAgICAg ICAgIGFuZCBtb3JlIG1lbW9yeSAodXNlbGVzcyBmb3IgZmFzdCkuDQorICogQGhhc2hMb2c6ICAg ICAgRGlzcGF0Y2ggdGFibGUuIExhcmdlciBtZWFucyBtb3JlIGNvbXByZXNzaW9uLA0KKyAqICAg ICAgICAgICAgICAgIHNsb3dlciwgYW5kIG1vcmUgbWVtb3J5Lg0KKyAqIEBzZWFyY2hMb2c6ICAg IE51bWJlciBvZiBzZWFyY2hlcy4gTGFyZ2VyIG1lYW5zIG1vcmUgY29tcHJlc3Npb24gYW5kIHNs b3dlci4NCisgKiBAc2VhcmNoTGVuZ3RoOiBNYXRjaCBsZW5ndGggc2VhcmNoZWQuIExhcmdlciBt ZWFucyBmYXN0ZXIgZGVjb21wcmVzc2lvbiwNCisgKiAgICAgICAgICAgICAgICBzb21ldGltZXMg bGVzcyBjb21wcmVzc2lvbi4NCisgKiBAdGFyZ2V0TGVuZ3RoOiBBY2NlcHRhYmxlIG1hdGNoIHNp emUgZm9yIG9wdGltYWwgcGFyc2VyIChvbmx5KS4gTGFyZ2VyIG1lYW5zDQorICogICAgICAgICAg ICAgICAgbW9yZSBjb21wcmVzc2lvbiwgYW5kIHNsb3dlci4NCisgKiBAc3RyYXRlZ3k6ICAgICBU aGUgenN0ZCBjb21wcmVzc2lvbiBzdHJhdGVneS4NCisgKi8NCit0eXBlZGVmIHN0cnVjdCB7DQor CXVuc2lnbmVkIGludCB3aW5kb3dMb2c7DQorCXVuc2lnbmVkIGludCBjaGFpbkxvZzsNCisJdW5z aWduZWQgaW50IGhhc2hMb2c7DQorCXVuc2lnbmVkIGludCBzZWFyY2hMb2c7DQorCXVuc2lnbmVk IGludCBzZWFyY2hMZW5ndGg7DQorCXVuc2lnbmVkIGludCB0YXJnZXRMZW5ndGg7DQorCVpTVERf c3RyYXRlZ3kgc3RyYXRlZ3k7DQorfSBaU1REX2NvbXByZXNzaW9uUGFyYW1ldGVyczsNCisNCisv KioNCisgKiBzdHJ1Y3QgWlNURF9mcmFtZVBhcmFtZXRlcnMgLSB6c3RkIGZyYW1lIHBhcmFtZXRl cnMNCisgKiBAY29udGVudFNpemVGbGFnOiBDb250cm9scyB3aGV0aGVyIGNvbnRlbnQgc2l6ZSB3 aWxsIGJlIHByZXNlbnQgaW4gdGhlIGZyYW1lDQorICogICAgICAgICAgICAgICAgICAgaGVhZGVy ICh3aGVuIGtub3duKS4NCisgKiBAY2hlY2tzdW1GbGFnOiAgICBDb250cm9scyB3aGV0aGVyIGEg MzItYml0IGNoZWNrc3VtIGlzIGdlbmVyYXRlZCBhdCB0aGUgZW5kDQorICogICAgICAgICAgICAg ICAgICAgb2YgdGhlIGZyYW1lIGZvciBlcnJvciBkZXRlY3Rpb24uDQorICogQG5vRGljdElERmxh ZzogICAgQ29udHJvbHMgd2hldGhlciBkaWN0SUQgd2lsbCBiZSBzYXZlZCBpbnRvIHRoZSBmcmFt ZSBoZWFkZXINCisgKiAgICAgICAgICAgICAgICAgICB3aGVuIHVzaW5nIGRpY3Rpb25hcnkgY29t cHJlc3Npb24uDQorICoNCisgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbGwgZmllbGRzIHNldCB0 byAwLg0KKyAqLw0KK3R5cGVkZWYgc3RydWN0IHsNCisJdW5zaWduZWQgaW50IGNvbnRlbnRTaXpl RmxhZzsNCisJdW5zaWduZWQgaW50IGNoZWNrc3VtRmxhZzsNCisJdW5zaWduZWQgaW50IG5vRGlj dElERmxhZzsNCit9IFpTVERfZnJhbWVQYXJhbWV0ZXJzOw0KKw0KKy8qKg0KKyAqIHN0cnVjdCBa U1REX3BhcmFtZXRlcnMgLSB6c3RkIHBhcmFtZXRlcnMNCisgKiBAY1BhcmFtczogVGhlIGNvbXBy ZXNzaW9uIHBhcmFtZXRlcnMuDQorICogQGZQYXJhbXM6IFRoZSBmcmFtZSBwYXJhbWV0ZXJzLg0K KyAqLw0KK3R5cGVkZWYgc3RydWN0IHsNCisJWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgY1Bh cmFtczsNCisJWlNURF9mcmFtZVBhcmFtZXRlcnMgZlBhcmFtczsNCit9IFpTVERfcGFyYW1ldGVy czsNCisNCisvKioNCisgKiBaU1REX2dldENQYXJhbXMoKSAtIHJldHVybnMgWlNURF9jb21wcmVz c2lvblBhcmFtZXRlcnMgZm9yIHNlbGVjdGVkIGxldmVsDQorICogQGNvbXByZXNzaW9uTGV2ZWw6 IFRoZSBjb21wcmVzc2lvbiBsZXZlbCBmcm9tIDEgdG8gWlNURF9tYXhDTGV2ZWwoKS4NCisgKiBA ZXN0aW1hdGVkU3JjU2l6ZTogVGhlIGVzdGltYXRlZCBzb3VyY2Ugc2l6ZSB0byBjb21wcmVzcyBv ciAwIGlmIHVua25vd24uDQorICogQGRpY3RTaXplOiAgICAgICAgIFRoZSBkaWN0aW9uYXJ5IHNp emUgb3IgMCBpZiBhIGRpY3Rpb25hcnkgaXNuJ3QgYmVpbmcgdXNlZC4NCisgKg0KKyAqIFJldHVy bjogICAgICAgICAgICBUaGUgc2VsZWN0ZWQgWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMuDQor ICovDQorWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgWlNURF9nZXRDUGFyYW1zKGludCBjb21w cmVzc2lvbkxldmVsLA0KKwl1bnNpZ25lZCBsb25nIGxvbmcgZXN0aW1hdGVkU3JjU2l6ZSwgc2l6 ZV90IGRpY3RTaXplKTsNCisNCisvKioNCisgKiBaU1REX2dldFBhcmFtcygpIC0gcmV0dXJucyBa U1REX3BhcmFtZXRlcnMgZm9yIHNlbGVjdGVkIGxldmVsDQorICogQGNvbXByZXNzaW9uTGV2ZWw6 IFRoZSBjb21wcmVzc2lvbiBsZXZlbCBmcm9tIDEgdG8gWlNURF9tYXhDTGV2ZWwoKS4NCisgKiBA ZXN0aW1hdGVkU3JjU2l6ZTogVGhlIGVzdGltYXRlZCBzb3VyY2Ugc2l6ZSB0byBjb21wcmVzcyBv ciAwIGlmIHVua25vd24uDQorICogQGRpY3RTaXplOiAgICAgICAgIFRoZSBkaWN0aW9uYXJ5IHNp emUgb3IgMCBpZiBhIGRpY3Rpb25hcnkgaXNuJ3QgYmVpbmcgdXNlZC4NCisgKg0KKyAqIFRoZSBz YW1lIGFzIFpTVERfZ2V0Q1BhcmFtcygpIGV4Y2VwdCBhbHNvIHNlbGVjdHMgdGhlIGRlZmF1bHQg ZnJhbWUNCisgKiBwYXJhbWV0ZXJzIChhbGwgemVybykuDQorICoNCisgKiBSZXR1cm46ICAgICAg ICAgICAgVGhlIHNlbGVjdGVkIFpTVERfcGFyYW1ldGVycy4NCisgKi8NCitaU1REX3BhcmFtZXRl cnMgWlNURF9nZXRQYXJhbXMoaW50IGNvbXByZXNzaW9uTGV2ZWwsDQorCXVuc2lnbmVkIGxvbmcg bG9uZyBlc3RpbWF0ZWRTcmNTaXplLCBzaXplX3QgZGljdFNpemUpOw0KKw0KKy8qLSoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBFeHBsaWNpdCBtZW1vcnkgbWFuYWdl bWVudA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKioN CisgKiBaU1REX0NDdHhXb3Jrc3BhY2VCb3VuZCgpIC0gYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQg dG8gaW5pdGlhbGl6ZSBhIFpTVERfQ0N0eA0KKyAqIEBjUGFyYW1zOiBUaGUgY29tcHJlc3Npb24g cGFyYW1ldGVycyB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lvbi4NCisgKg0KKyAqIElmIG11bHRp cGxlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgbWlnaHQgYmUgdXNlZCwgdGhlIGNhbGxlciBtdXN0 IGNhbGwNCisgKiBaU1REX0NDdHhXb3Jrc3BhY2VCb3VuZCgpIGZvciBlYWNoIHNldCBvZiBwYXJh bWV0ZXJzIGFuZCB1c2UgdGhlIG1heGltdW0NCisgKiBzaXplLg0KKyAqDQorICogUmV0dXJuOiAg IEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIHdvcmtzcGFjZSB0aGF0IGlzIHBhc3Nl ZCB0bw0KKyAqICAgICAgICAgICBaU1REX2luaXRDQ3R4KCkuDQorICovDQorc2l6ZV90IFpTVERf Q0N0eFdvcmtzcGFjZUJvdW5kKFpTVERfY29tcHJlc3Npb25QYXJhbWV0ZXJzIGNQYXJhbXMpOw0K Kw0KKy8qKg0KKyAqIHN0cnVjdCBaU1REX0NDdHggLSB0aGUgenN0ZCBjb21wcmVzc2lvbiBjb250 ZXh0DQorICoNCisgKiBXaGVuIGNvbXByZXNzaW5nIG1hbnkgdGltZXMgaXQgaXMgcmVjb21tZW5k ZWQgdG8gYWxsb2NhdGUgYSBjb250ZXh0IGp1c3Qgb25jZQ0KKyAqIGFuZCByZXVzZSBpdCBmb3Ig ZWFjaCBzdWNjZXNzaXZlIGNvbXByZXNzaW9uIG9wZXJhdGlvbi4NCisgKi8NCit0eXBlZGVmIHN0 cnVjdCBaU1REX0NDdHhfcyBaU1REX0NDdHg7DQorLyoqDQorICogWlNURF9pbml0Q0N0eCgpIC0g aW5pdGlhbGl6ZSBhIHpzdGQgY29tcHJlc3Npb24gY29udGV4dA0KKyAqIEB3b3Jrc3BhY2U6ICAg ICBUaGUgd29ya3NwYWNlIHRvIGVtcGxhY2UgdGhlIGNvbnRleHQgaW50by4gSXQgbXVzdCBvdXRs aXZlDQorICogICAgICAgICAgICAgICAgIHRoZSByZXR1cm5lZCBjb250ZXh0Lg0KKyAqIEB3b3Jr c3BhY2VTaXplOiBUaGUgc2l6ZSBvZiB3b3Jrc3BhY2UuIFVzZSBaU1REX0NDdHhXb3Jrc3BhY2VC b3VuZCgpIHRvDQorICogICAgICAgICAgICAgICAgIGRldGVybWluZSBob3cgbGFyZ2UgdGhlIHdv cmtzcGFjZSBtdXN0IGJlLg0KKyAqDQorICogUmV0dXJuOiAgICAgICAgIEEgY29tcHJlc3Npb24g Y29udGV4dCBlbXBsYWNlZCBpbnRvIHdvcmtzcGFjZS4NCisgKi8NCitaU1REX0NDdHggKlpTVERf aW5pdENDdHgodm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7DQorDQorLyoq DQorICogWlNURF9jb21wcmVzc0NDdHgoKSAtIGNvbXByZXNzIHNyYyBpbnRvIGRzdA0KKyAqIEBj dHg6ICAgICAgICAgVGhlIGNvbnRleHQuIE11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGgg YSB3b3Jrc3BhY2UgYXQNCisgKiAgICAgICAgICAgICAgIGxlYXN0IGFzIGxhcmdlIGFzIFpTVERf Q0N0eFdvcmtzcGFjZUJvdW5kKHBhcmFtcy5jUGFyYW1zKS4NCisgKiBAZHN0OiAgICAgICAgIFRo ZSBidWZmZXIgdG8gY29tcHJlc3Mgc3JjIGludG8uDQorICogQGRzdENhcGFjaXR5OiBUaGUgc2l6 ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBNYXkgYmUgYW55IHNpemUsIGJ1dA0KKyAqICAg ICAgICAgICAgICAgWlNURF9jb21wcmVzc0JvdW5kKHNyY1NpemUpIGlzIGd1YXJhbnRlZWQgdG8g YmUgbGFyZ2UgZW5vdWdoLg0KKyAqIEBzcmM6ICAgICAgICAgVGhlIGRhdGEgdG8gY29tcHJlc3Mu DQorICogQHNyY1NpemU6ICAgICBUaGUgc2l6ZSBvZiB0aGUgZGF0YSB0byBjb21wcmVzcy4NCisg KiBAcGFyYW1zOiAgICAgIFRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgY29tcHJlc3Npb24uIFNl ZSBaU1REX2dldFBhcmFtcygpLg0KKyAqDQorICogUmV0dXJuOiAgICAgICBUaGUgY29tcHJlc3Nl ZCBzaXplIG9yIGFuIGVycm9yLCB3aGljaCBjYW4gYmUgY2hlY2tlZCB1c2luZw0KKyAqICAgICAg ICAgICAgICAgWlNURF9pc0Vycm9yKCkuDQorICovDQorc2l6ZV90IFpTVERfY29tcHJlc3NDQ3R4 KFpTVERfQ0N0eCAqY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwNCisJY29uc3Qg dm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcyk7DQorDQor LyoqDQorICogWlNURF9EQ3R4V29ya3NwYWNlQm91bmQoKSAtIGFtb3VudCBvZiBtZW1vcnkgbmVl ZGVkIHRvIGluaXRpYWxpemUgYSBaU1REX0RDdHgNCisgKg0KKyAqIFJldHVybjogQSBsb3dlciBi b3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgd29ya3NwYWNlIHRoYXQgaXMgcGFzc2VkIHRvDQorICog ICAgICAgICBaU1REX2luaXREQ3R4KCkuDQorICovDQorc2l6ZV90IFpTVERfREN0eFdvcmtzcGFj ZUJvdW5kKHZvaWQpOw0KKw0KKy8qKg0KKyAqIHN0cnVjdCBaU1REX0RDdHggLSB0aGUgenN0ZCBk ZWNvbXByZXNzaW9uIGNvbnRleHQNCisgKg0KKyAqIFdoZW4gZGVjb21wcmVzc2luZyBtYW55IHRp bWVzIGl0IGlzIHJlY29tbWVuZGVkIHRvIGFsbG9jYXRlIGEgY29udGV4dCBqdXN0DQorICogb25j ZSBhbmQgcmV1c2UgaXQgZm9yIGVhY2ggc3VjY2Vzc2l2ZSBkZWNvbXByZXNzaW9uIG9wZXJhdGlv bi4NCisgKi8NCit0eXBlZGVmIHN0cnVjdCBaU1REX0RDdHhfcyBaU1REX0RDdHg7DQorLyoqDQor ICogWlNURF9pbml0REN0eCgpIC0gaW5pdGlhbGl6ZSBhIHpzdGQgZGVjb21wcmVzc2lvbiBjb250 ZXh0DQorICogQHdvcmtzcGFjZTogICAgIFRoZSB3b3Jrc3BhY2UgdG8gZW1wbGFjZSB0aGUgY29u dGV4dCBpbnRvLiBJdCBtdXN0IG91dGxpdmUNCisgKiAgICAgICAgICAgICAgICAgdGhlIHJldHVy bmVkIGNvbnRleHQuDQorICogQHdvcmtzcGFjZVNpemU6IFRoZSBzaXplIG9mIHdvcmtzcGFjZS4g VXNlIFpTVERfREN0eFdvcmtzcGFjZUJvdW5kKCkgdG8NCisgKiAgICAgICAgICAgICAgICAgZGV0 ZXJtaW5lIGhvdyBsYXJnZSB0aGUgd29ya3NwYWNlIG11c3QgYmUuDQorICoNCisgKiBSZXR1cm46 ICAgICAgICAgQSBkZWNvbXByZXNzaW9uIGNvbnRleHQgZW1wbGFjZWQgaW50byB3b3Jrc3BhY2Uu DQorICovDQorWlNURF9EQ3R4ICpaU1REX2luaXREQ3R4KHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90 IHdvcmtzcGFjZVNpemUpOw0KKw0KKy8qKg0KKyAqIFpTVERfZGVjb21wcmVzc0RDdHgoKSAtIGRl Y29tcHJlc3MgenN0ZCBjb21wcmVzc2VkIHNyYyBpbnRvIGRzdA0KKyAqIEBjdHg6ICAgICAgICAg VGhlIGRlY29tcHJlc3Npb24gY29udGV4dC4NCisgKiBAZHN0OiAgICAgICAgIFRoZSBidWZmZXIg dG8gZGVjb21wcmVzcyBzcmMgaW50by4NCisgKiBAZHN0Q2FwYWNpdHk6IFRoZSBzaXplIG9mIHRo ZSBkZXN0aW5hdGlvbiBidWZmZXIuIE11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UNCisgKiAgICAg ICAgICAgICAgIGFzIHRoZSBkZWNvbXByZXNzZWQgc2l6ZS4gSWYgdGhlIGNhbGxlciBjYW5ub3Qg dXBwZXIgYm91bmQgdGhlDQorICogICAgICAgICAgICAgICBkZWNvbXByZXNzZWQgc2l6ZSwgdGhl biBpdCdzIGJldHRlciB0byB1c2UgdGhlIHN0cmVhbWluZyBBUEkuDQorICogQHNyYzogICAgICAg ICBUaGUgenN0ZCBjb21wcmVzc2VkIGRhdGEgdG8gZGVjb21wcmVzcy4gTXVsdGlwbGUgY29uY2F0 ZW5hdGVkDQorICogICAgICAgICAgICAgICBmcmFtZXMgYW5kIHNraXBwYWJsZSBmcmFtZXMgYXJl IGFsbG93ZWQuDQorICogQHNyY1NpemU6ICAgICBUaGUgZXhhY3Qgc2l6ZSBvZiB0aGUgZGF0YSB0 byBkZWNvbXByZXNzLg0KKyAqDQorICogUmV0dXJuOiAgICAgICBUaGUgZGVjb21wcmVzc2VkIHNp emUgb3IgYW4gZXJyb3IsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHVzaW5nDQorICogICAgICAgICAg ICAgICBaU1REX2lzRXJyb3IoKS4NCisgKi8NCitzaXplX3QgWlNURF9kZWNvbXByZXNzREN0eCha U1REX0RDdHggKmN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksDQorCWNvbnN0IHZv aWQgKnNyYywgc2l6ZV90IHNyY1NpemUpOw0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioq Kg0KKyAqIFNpbXBsZSBkaWN0aW9uYXJ5IEFQSQ0KKyAqKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisNCisvKioNCisgKiBaU1REX2NvbXByZXNzX3VzaW5nRGljdCgpIC0gY29tcHJlc3Mgc3Jj IGludG8gZHN0IHVzaW5nIGEgZGljdGlvbmFyeQ0KKyAqIEBjdHg6ICAgICAgICAgVGhlIGNvbnRl eHQuIE11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGggYSB3b3Jrc3BhY2UgYXQNCisgKiAg ICAgICAgICAgICAgIGxlYXN0IGFzIGxhcmdlIGFzIFpTVERfQ0N0eFdvcmtzcGFjZUJvdW5kKHBh cmFtcy5jUGFyYW1zKS4NCisgKiBAZHN0OiAgICAgICAgIFRoZSBidWZmZXIgdG8gY29tcHJlc3Mg c3JjIGludG8uDQorICogQGRzdENhcGFjaXR5OiBUaGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24g YnVmZmVyLiBNYXkgYmUgYW55IHNpemUsIGJ1dA0KKyAqICAgICAgICAgICAgICAgWlNURF9jb21w cmVzc0JvdW5kKHNyY1NpemUpIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2UgZW5vdWdoLg0KKyAq IEBzcmM6ICAgICAgICAgVGhlIGRhdGEgdG8gY29tcHJlc3MuDQorICogQHNyY1NpemU6ICAgICBU aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byBjb21wcmVzcy4NCisgKiBAZGljdDogICAgICAgIFRoZSBk aWN0aW9uYXJ5IHRvIHVzZSBmb3IgY29tcHJlc3Npb24uDQorICogQGRpY3RTaXplOiAgICBUaGUg c2l6ZSBvZiB0aGUgZGljdGlvbmFyeS4NCisgKiBAcGFyYW1zOiAgICAgIFRoZSBwYXJhbWV0ZXJz IHRvIHVzZSBmb3IgY29tcHJlc3Npb24uIFNlZSBaU1REX2dldFBhcmFtcygpLg0KKyAqDQorICog Q29tcHJlc3Npb24gdXNpbmcgYSBwcmVkZWZpbmVkIGRpY3Rpb25hcnkuIFRoZSBzYW1lIGRpY3Rp b25hcnkgbXVzdCBiZSB1c2VkDQorICogZHVyaW5nIGRlY29tcHJlc3Npb24uDQorICoNCisgKiBS ZXR1cm46ICAgICAgIFRoZSBjb21wcmVzc2VkIHNpemUgb3IgYW4gZXJyb3IsIHdoaWNoIGNhbiBi ZSBjaGVja2VkIHVzaW5nDQorICogICAgICAgICAgICAgICBaU1REX2lzRXJyb3IoKS4NCisgKi8N CitzaXplX3QgWlNURF9jb21wcmVzc191c2luZ0RpY3QoWlNURF9DQ3R4ICpjdHgsIHZvaWQgKmRz dCwgc2l6ZV90IGRzdENhcGFjaXR5LA0KKwljb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXpl LCBjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUsDQorCVpTVERfcGFyYW1ldGVycyBw YXJhbXMpOw0KKw0KKy8qKg0KKyAqIFpTVERfZGVjb21wcmVzc191c2luZ0RpY3QoKSAtIGRlY29t cHJlc3Mgc3JjIGludG8gZHN0IHVzaW5nIGEgZGljdGlvbmFyeQ0KKyAqIEBjdHg6ICAgICAgICAg VGhlIGRlY29tcHJlc3Npb24gY29udGV4dC4NCisgKiBAZHN0OiAgICAgICAgIFRoZSBidWZmZXIg dG8gZGVjb21wcmVzcyBzcmMgaW50by4NCisgKiBAZHN0Q2FwYWNpdHk6IFRoZSBzaXplIG9mIHRo ZSBkZXN0aW5hdGlvbiBidWZmZXIuIE11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UNCisgKiAgICAg ICAgICAgICAgIGFzIHRoZSBkZWNvbXByZXNzZWQgc2l6ZS4gSWYgdGhlIGNhbGxlciBjYW5ub3Qg dXBwZXIgYm91bmQgdGhlDQorICogICAgICAgICAgICAgICBkZWNvbXByZXNzZWQgc2l6ZSwgdGhl biBpdCdzIGJldHRlciB0byB1c2UgdGhlIHN0cmVhbWluZyBBUEkuDQorICogQHNyYzogICAgICAg ICBUaGUgenN0ZCBjb21wcmVzc2VkIGRhdGEgdG8gZGVjb21wcmVzcy4gTXVsdGlwbGUgY29uY2F0 ZW5hdGVkDQorICogICAgICAgICAgICAgICBmcmFtZXMgYW5kIHNraXBwYWJsZSBmcmFtZXMgYXJl IGFsbG93ZWQuDQorICogQHNyY1NpemU6ICAgICBUaGUgZXhhY3Qgc2l6ZSBvZiB0aGUgZGF0YSB0 byBkZWNvbXByZXNzLg0KKyAqIEBkaWN0OiAgICAgICAgVGhlIGRpY3Rpb25hcnkgdG8gdXNlIGZv ciBkZWNvbXByZXNzaW9uLiBUaGUgc2FtZSBkaWN0aW9uYXJ5DQorICogICAgICAgICAgICAgICBt dXN0J3ZlIGJlZW4gdXNlZCB0byBjb21wcmVzcyB0aGUgZGF0YS4NCisgKiBAZGljdFNpemU6ICAg IFRoZSBzaXplIG9mIHRoZSBkaWN0aW9uYXJ5Lg0KKyAqDQorICogUmV0dXJuOiAgICAgICBUaGUg ZGVjb21wcmVzc2VkIHNpemUgb3IgYW4gZXJyb3IsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHVzaW5n DQorICogICAgICAgICAgICAgICBaU1REX2lzRXJyb3IoKS4NCisgKi8NCitzaXplX3QgWlNURF9k ZWNvbXByZXNzX3VzaW5nRGljdChaU1REX0RDdHggKmN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0 Q2FwYWNpdHksDQorCWNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IHZvaWQg KmRpY3QsIHNpemVfdCBkaWN0U2l6ZSk7DQorDQorLyotKioqKioqKioqKioqKioqKioqKioqKioq KioNCisgKiBGYXN0IGRpY3Rpb25hcnkgQVBJDQorICoqKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisNCisvKioNCisgKiBaU1REX0NEaWN0V29ya3NwYWNlQm91bmQoKSAtIG1lbW9yeSBuZWVk ZWQgdG8gaW5pdGlhbGl6ZSBhIFpTVERfQ0RpY3QNCisgKiBAY1BhcmFtczogVGhlIGNvbXByZXNz aW9uIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBmb3IgY29tcHJlc3Npb24uDQorICoNCisgKiBSZXR1 cm46ICAgQSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgd29ya3NwYWNlIHRoYXQgaXMg cGFzc2VkIHRvDQorICogICAgICAgICAgIFpTVERfaW5pdENEaWN0KCkuDQorICovDQorc2l6ZV90 IFpTVERfQ0RpY3RXb3Jrc3BhY2VCb3VuZChaU1REX2NvbXByZXNzaW9uUGFyYW1ldGVycyBjUGFy YW1zKTsNCisNCisvKioNCisgKiBzdHJ1Y3QgWlNURF9DRGljdCAtIGEgZGlnZXN0ZWQgZGljdGlv bmFyeSB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lvbg0KKyAqLw0KK3R5cGVkZWYgc3RydWN0IFpT VERfQ0RpY3RfcyBaU1REX0NEaWN0Ow0KKw0KKy8qKg0KKyAqIFpTVERfaW5pdENEaWN0KCkgLSBp bml0aWFsaXplIGEgZGlnZXN0ZWQgZGljdGlvbmFyeSBmb3IgY29tcHJlc3Npb24NCisgKiBAZGlj dEJ1ZmZlcjogICAgVGhlIGRpY3Rpb25hcnkgdG8gZGlnZXN0LiBUaGUgYnVmZmVyIGlzIHJlZmVy ZW5jZWQgYnkgdGhlDQorICogICAgICAgICAgICAgICAgIFpTVERfQ0RpY3Qgc28gaXQgbXVzdCBv dXRsaXZlIHRoZSByZXR1cm5lZCBaU1REX0NEaWN0Lg0KKyAqIEBkaWN0U2l6ZTogICAgICBUaGUg c2l6ZSBvZiB0aGUgZGljdGlvbmFyeS4NCisgKiBAcGFyYW1zOiAgICAgICAgVGhlIHBhcmFtZXRl cnMgdG8gdXNlIGZvciBjb21wcmVzc2lvbi4gU2VlIFpTVERfZ2V0UGFyYW1zKCkuDQorICogQHdv cmtzcGFjZTogICAgIFRoZSB3b3Jrc3BhY2UuIEl0IG11c3Qgb3V0bGl2ZSB0aGUgcmV0dXJuZWQg WlNURF9DRGljdC4NCisgKiBAd29ya3NwYWNlU2l6ZTogVGhlIHdvcmtzcGFjZSBzaXplLiBNdXN0 IGJlIGF0IGxlYXN0DQorICogICAgICAgICAgICAgICAgIFpTVERfQ0RpY3RXb3Jrc3BhY2VCb3Vu ZChwYXJhbXMuY1BhcmFtcykuDQorICoNCisgKiBXaGVuIGNvbXByZXNzaW5nIG11bHRpcGxlIG1l c3NhZ2VzIC8gYmxvY2tzIHdpdGggdGhlIHNhbWUgZGljdGlvbmFyeSBpdCBpcw0KKyAqIHJlY29t bWVuZGVkIHRvIGxvYWQgaXQganVzdCBvbmNlLiBUaGUgWlNURF9DRGljdCBtZXJlbHkgcmVmZXJl bmNlcyB0aGUNCisgKiBkaWN0QnVmZmVyLCBzbyBpdCBtdXN0IG91dGxpdmUgdGhlIHJldHVybmVk IFpTVERfQ0RpY3QuDQorICoNCisgKiBSZXR1cm46ICAgICAgICAgVGhlIGRpZ2VzdGVkIGRpY3Rp b25hcnkgZW1wbGFjZWQgaW50byB3b3Jrc3BhY2UuDQorICovDQorWlNURF9DRGljdCAqWlNURF9p bml0Q0RpY3QoY29uc3Qgdm9pZCAqZGljdEJ1ZmZlciwgc2l6ZV90IGRpY3RTaXplLA0KKwlaU1RE X3BhcmFtZXRlcnMgcGFyYW1zLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXpl KTsNCisNCisvKioNCisgKiBaU1REX2NvbXByZXNzX3VzaW5nQ0RpY3QoKSAtIGNvbXByZXNzIHNy YyBpbnRvIGRzdCB1c2luZyBhIFpTVERfQ0RpY3QNCisgKiBAY3R4OiAgICAgICAgIFRoZSBjb250 ZXh0LiBNdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgd29ya3NwYWNlIGF0DQorICog ICAgICAgICAgICAgICBsZWFzdCBhcyBsYXJnZSBhcyBaU1REX0NDdHhXb3Jrc3BhY2VCb3VuZChj UGFyYW1zKSB3aGVyZQ0KKyAqICAgICAgICAgICAgICAgY1BhcmFtcyBhcmUgdGhlIGNvbXByZXNz aW9uIHBhcmFtZXRlcnMgdXNlZCB0byBpbml0aWFsaXplIHRoZQ0KKyAqICAgICAgICAgICAgICAg Y2RpY3QuDQorICogQGRzdDogICAgICAgICBUaGUgYnVmZmVyIHRvIGNvbXByZXNzIHNyYyBpbnRv Lg0KKyAqIEBkc3RDYXBhY2l0eTogVGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4g TWF5IGJlIGFueSBzaXplLCBidXQNCisgKiAgICAgICAgICAgICAgIFpTVERfY29tcHJlc3NCb3Vu ZChzcmNTaXplKSBpcyBndWFyYW50ZWVkIHRvIGJlIGxhcmdlIGVub3VnaC4NCisgKiBAc3JjOiAg ICAgICAgIFRoZSBkYXRhIHRvIGNvbXByZXNzLg0KKyAqIEBzcmNTaXplOiAgICAgVGhlIHNpemUg b2YgdGhlIGRhdGEgdG8gY29tcHJlc3MuDQorICogQGNkaWN0OiAgICAgICBUaGUgZGlnZXN0ZWQg ZGljdGlvbmFyeSB0byB1c2UgZm9yIGNvbXByZXNzaW9uLg0KKyAqIEBwYXJhbXM6ICAgICAgVGhl IHBhcmFtZXRlcnMgdG8gdXNlIGZvciBjb21wcmVzc2lvbi4gU2VlIFpTVERfZ2V0UGFyYW1zKCku DQorICoNCisgKiBDb21wcmVzc2lvbiB1c2luZyBhIGRpZ2VzdGVkIGRpY3Rpb25hcnkuIFRoZSBz YW1lIGRpY3Rpb25hcnkgbXVzdCBiZSB1c2VkDQorICogZHVyaW5nIGRlY29tcHJlc3Npb24uDQor ICoNCisgKiBSZXR1cm46ICAgICAgIFRoZSBjb21wcmVzc2VkIHNpemUgb3IgYW4gZXJyb3IsIHdo aWNoIGNhbiBiZSBjaGVja2VkIHVzaW5nDQorICogICAgICAgICAgICAgICBaU1REX2lzRXJyb3Io KS4NCisgKi8NCitzaXplX3QgWlNURF9jb21wcmVzc191c2luZ0NEaWN0KFpTVERfQ0N0eCAqY2N0 eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksDQorCWNvbnN0IHZvaWQgKnNyYywgc2l6 ZV90IHNyY1NpemUsIGNvbnN0IFpTVERfQ0RpY3QgKmNkaWN0KTsNCisNCisNCisvKioNCisgKiBa U1REX0REaWN0V29ya3NwYWNlQm91bmQoKSAtIG1lbW9yeSBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBh IFpTVERfRERpY3QNCisgKg0KKyAqIFJldHVybjogIEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUg b2YgdGhlIHdvcmtzcGFjZSB0aGF0IGlzIHBhc3NlZCB0bw0KKyAqICAgICAgICAgIFpTVERfaW5p dEREaWN0KCkuDQorICovDQorc2l6ZV90IFpTVERfRERpY3RXb3Jrc3BhY2VCb3VuZCh2b2lkKTsN CisNCisvKioNCisgKiBzdHJ1Y3QgWlNURF9ERGljdCAtIGEgZGlnZXN0ZWQgZGljdGlvbmFyeSB0 byBiZSB1c2VkIGZvciBkZWNvbXByZXNzaW9uDQorICovDQordHlwZWRlZiBzdHJ1Y3QgWlNURF9E RGljdF9zIFpTVERfRERpY3Q7DQorDQorLyoqDQorICogWlNURF9pbml0RERpY3QoKSAtIGluaXRp YWxpemUgYSBkaWdlc3RlZCBkaWN0aW9uYXJ5IGZvciBkZWNvbXByZXNzaW9uDQorICogQGRpY3RC dWZmZXI6ICAgIFRoZSBkaWN0aW9uYXJ5IHRvIGRpZ2VzdC4gVGhlIGJ1ZmZlciBpcyByZWZlcmVu Y2VkIGJ5IHRoZQ0KKyAqICAgICAgICAgICAgICAgICBaU1REX0REaWN0IHNvIGl0IG11c3Qgb3V0 bGl2ZSB0aGUgcmV0dXJuZWQgWlNURF9ERGljdC4NCisgKiBAZGljdFNpemU6ICAgICAgVGhlIHNp emUgb2YgdGhlIGRpY3Rpb25hcnkuDQorICogQHdvcmtzcGFjZTogICAgIFRoZSB3b3Jrc3BhY2Uu IEl0IG11c3Qgb3V0bGl2ZSB0aGUgcmV0dXJuZWQgWlNURF9ERGljdC4NCisgKiBAd29ya3NwYWNl U2l6ZTogVGhlIHdvcmtzcGFjZSBzaXplLiBNdXN0IGJlIGF0IGxlYXN0DQorICogICAgICAgICAg ICAgICAgIFpTVERfRERpY3RXb3Jrc3BhY2VCb3VuZCgpLg0KKyAqDQorICogV2hlbiBkZWNvbXBy ZXNzaW5nIG11bHRpcGxlIG1lc3NhZ2VzIC8gYmxvY2tzIHdpdGggdGhlIHNhbWUgZGljdGlvbmFy eSBpdCBpcw0KKyAqIHJlY29tbWVuZGVkIHRvIGxvYWQgaXQganVzdCBvbmNlLiBUaGUgWlNURF9E RGljdCBtZXJlbHkgcmVmZXJlbmNlcyB0aGUNCisgKiBkaWN0QnVmZmVyLCBzbyBpdCBtdXN0IG91 dGxpdmUgdGhlIHJldHVybmVkIFpTVERfRERpY3QuDQorICoNCisgKiBSZXR1cm46ICAgICAgICAg VGhlIGRpZ2VzdGVkIGRpY3Rpb25hcnkgZW1wbGFjZWQgaW50byB3b3Jrc3BhY2UuDQorICovDQor WlNURF9ERGljdCAqWlNURF9pbml0RERpY3QoY29uc3Qgdm9pZCAqZGljdEJ1ZmZlciwgc2l6ZV90 IGRpY3RTaXplLA0KKwl2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsNCisN CisvKioNCisgKiBaU1REX2RlY29tcHJlc3NfdXNpbmdERGljdCgpIC0gZGVjb21wcmVzcyBzcmMg aW50byBkc3QgdXNpbmcgYSBaU1REX0REaWN0DQorICogQGN0eDogICAgICAgICBUaGUgZGVjb21w cmVzc2lvbiBjb250ZXh0Lg0KKyAqIEBkc3Q6ICAgICAgICAgVGhlIGJ1ZmZlciB0byBkZWNvbXBy ZXNzIHNyYyBpbnRvLg0KKyAqIEBkc3RDYXBhY2l0eTogVGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0 aW9uIGJ1ZmZlci4gTXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZQ0KKyAqICAgICAgICAgICAgICAg YXMgdGhlIGRlY29tcHJlc3NlZCBzaXplLiBJZiB0aGUgY2FsbGVyIGNhbm5vdCB1cHBlciBib3Vu ZCB0aGUNCisgKiAgICAgICAgICAgICAgIGRlY29tcHJlc3NlZCBzaXplLCB0aGVuIGl0J3MgYmV0 dGVyIHRvIHVzZSB0aGUgc3RyZWFtaW5nIEFQSS4NCisgKiBAc3JjOiAgICAgICAgIFRoZSB6c3Rk IGNvbXByZXNzZWQgZGF0YSB0byBkZWNvbXByZXNzLiBNdWx0aXBsZSBjb25jYXRlbmF0ZWQNCisg KiAgICAgICAgICAgICAgIGZyYW1lcyBhbmQgc2tpcHBhYmxlIGZyYW1lcyBhcmUgYWxsb3dlZC4N CisgKiBAc3JjU2l6ZTogICAgIFRoZSBleGFjdCBzaXplIG9mIHRoZSBkYXRhIHRvIGRlY29tcHJl c3MuDQorICogQGRkaWN0OiAgICAgICBUaGUgZGlnZXN0ZWQgZGljdGlvbmFyeSB0byB1c2UgZm9y IGRlY29tcHJlc3Npb24uIFRoZSBzYW1lDQorICogICAgICAgICAgICAgICBkaWN0aW9uYXJ5IG11 c3QndmUgYmVlbiB1c2VkIHRvIGNvbXByZXNzIHRoZSBkYXRhLg0KKyAqDQorICogUmV0dXJuOiAg ICAgICBUaGUgZGVjb21wcmVzc2VkIHNpemUgb3IgYW4gZXJyb3IsIHdoaWNoIGNhbiBiZSBjaGVj a2VkIHVzaW5nDQorICogICAgICAgICAgICAgICBaU1REX2lzRXJyb3IoKS4NCisgKi8NCitzaXpl X3QgWlNURF9kZWNvbXByZXNzX3VzaW5nRERpY3QoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3Qs DQorCXNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwN CisJY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOw0KKw0KKw0KKy8qLSoqKioqKioqKioqKioqKioq KioqKioqKioqDQorICogU3RyZWFtaW5nDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8N CisNCisvKioNCisgKiBzdHJ1Y3QgWlNURF9pbkJ1ZmZlciAtIGlucHV0IGJ1ZmZlciBmb3Igc3Ry ZWFtaW5nDQorICogQHNyYzogIFN0YXJ0IG9mIHRoZSBpbnB1dCBidWZmZXIuDQorICogQHNpemU6 IFNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci4NCisgKiBAcG9zOiAgUG9zaXRpb24gd2hlcmUgcmVh ZGluZyBzdG9wcGVkLiBXaWxsIGJlIHVwZGF0ZWQuDQorICogICAgICAgIE5lY2Vzc2FyaWx5IDAg PD0gcG9zIDw9IHNpemUuDQorICovDQordHlwZWRlZiBzdHJ1Y3QgWlNURF9pbkJ1ZmZlcl9zIHsN CisJY29uc3Qgdm9pZCAqc3JjOw0KKwlzaXplX3Qgc2l6ZTsNCisJc2l6ZV90IHBvczsNCit9IFpT VERfaW5CdWZmZXI7DQorDQorLyoqDQorICogc3RydWN0IFpTVERfb3V0QnVmZmVyIC0gb3V0cHV0 IGJ1ZmZlciBmb3Igc3RyZWFtaW5nDQorICogQGRzdDogIFN0YXJ0IG9mIHRoZSBvdXRwdXQgYnVm ZmVyLg0KKyAqIEBzaXplOiBTaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLg0KKyAqIEBwb3M6ICBQ b3NpdGlvbiB3aGVyZSB3cml0aW5nIHN0b3BwZWQuIFdpbGwgYmUgdXBkYXRlZC4NCisgKiAgICAg ICAgTmVjZXNzYXJpbHkgMCA8PSBwb3MgPD0gc2l6ZS4NCisgKi8NCit0eXBlZGVmIHN0cnVjdCBa U1REX291dEJ1ZmZlcl9zIHsNCisJdm9pZCAqZHN0Ow0KKwlzaXplX3Qgc2l6ZTsNCisJc2l6ZV90 IHBvczsNCit9IFpTVERfb3V0QnVmZmVyOw0KKw0KKw0KKw0KKy8qLSoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqDQorICogU3RyZWFtaW5nIGNvbXByZXNzaW9uIC0gSG93VG8NCisgKg0KKyAqIEEgWlNURF9D U3RyZWFtIG9iamVjdCBpcyByZXF1aXJlZCB0byB0cmFjayBzdHJlYW1pbmcgb3BlcmF0aW9uLg0K KyAqIFVzZSBaU1REX2luaXRDU3RyZWFtKCkgdG8gaW5pdGlhbGl6ZSBhIFpTVERfQ1N0cmVhbSBv YmplY3QuDQorICogWlNURF9DU3RyZWFtIG9iamVjdHMgY2FuIGJlIHJldXNlZCBtdWx0aXBsZSB0 aW1lcyBvbiBjb25zZWN1dGl2ZSBjb21wcmVzc2lvbg0KKyAqIG9wZXJhdGlvbnMuIEl0IGlzIHJl Y29tbWVuZGVkIHRvIHJlLXVzZSBaU1REX0NTdHJlYW0gaW4gc2l0dWF0aW9ucyB3aGVyZSBtYW55 DQorICogc3RyZWFtaW5nIG9wZXJhdGlvbnMgd2lsbCBiZSBhY2hpZXZlZCBjb25zZWN1dGl2ZWx5 LiBVc2Ugb25lIHNlcGFyYXRlDQorICogWlNURF9DU3RyZWFtIHBlciB0aHJlYWQgZm9yIHBhcmFs bGVsIGV4ZWN1dGlvbi4NCisgKg0KKyAqIFVzZSBaU1REX2NvbXByZXNzU3RyZWFtKCkgcmVwZXRp dGl2ZWx5IHRvIGNvbnN1bWUgaW5wdXQgc3RyZWFtLg0KKyAqIFRoZSBmdW5jdGlvbiB3aWxsIGF1 dG9tYXRpY2FsbHkgdXBkYXRlIGJvdGggYHBvc2AgZmllbGRzLg0KKyAqIE5vdGUgdGhhdCBpdCBt YXkgbm90IGNvbnN1bWUgdGhlIGVudGlyZSBpbnB1dCwgaW4gd2hpY2ggY2FzZSBgcG9zIDwgc2l6 ZWAsDQorICogYW5kIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBwcmVzZW50IGFnYWluIHJlbWFp bmluZyBkYXRhLg0KKyAqIEl0IHJldHVybnMgYSBoaW50IGZvciB0aGUgcHJlZmVycmVkIG51bWJl ciBvZiBieXRlcyB0byB1c2UgYXMgYW4gaW5wdXQgZm9yDQorICogdGhlIG5leHQgZnVuY3Rpb24g Y2FsbC4NCisgKg0KKyAqIEF0IGFueSBtb21lbnQsIGl0J3MgcG9zc2libGUgdG8gZmx1c2ggd2hh dGV2ZXIgZGF0YSByZW1haW5zIHdpdGhpbiBpbnRlcm5hbA0KKyAqIGJ1ZmZlciwgdXNpbmcgWlNU RF9mbHVzaFN0cmVhbSgpLiBgb3V0cHV0LT5wb3NgIHdpbGwgYmUgdXBkYXRlZC4gVGhlcmUgbWln aHQNCisgKiBzdGlsbCBiZSBzb21lIGNvbnRlbnQgbGVmdCB3aXRoaW4gdGhlIGludGVybmFsIGJ1 ZmZlciBpZiBgb3V0cHV0LT5zaXplYCBpcw0KKyAqIHRvbyBzbWFsbC4gSXQgcmV0dXJucyB0aGUg bnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gdGhlIGludGVybmFsIGJ1ZmZlciBhbmQNCisgKiBtdXN0 IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIDAuDQorICoNCisgKiBaU1REX2VuZFN0cmVhbSgp IGluc3RydWN0cyB0byBmaW5pc2ggYSBmcmFtZS4gSXQgd2lsbCBwZXJmb3JtIGEgZmx1c2ggYW5k DQorICogd3JpdGUgZnJhbWUgZXBpbG9ndWUuIFRoZSBlcGlsb2d1ZSBpcyByZXF1aXJlZCBmb3Ig ZGVjb2RlcnMgdG8gY29uc2lkZXIgYQ0KKyAqIGZyYW1lIGNvbXBsZXRlZC4gU2ltaWxhciB0byBa U1REX2ZsdXNoU3RyZWFtKCksIGl0IG1heSBub3QgYmUgYWJsZSB0byBmbHVzaA0KKyAqIHRoZSBm dWxsIGNvbnRlbnQgaWYgYG91dHB1dC0+c2l6ZWAgaXMgdG9vIHNtYWxsLiBJbiB3aGljaCBjYXNl LCBjYWxsIGFnYWluDQorICogWlNURF9lbmRTdHJlYW0oKSB0byBjb21wbGV0ZSB0aGUgZmx1c2gu IEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0DQorICogaW4gdGhlIGludGVybmFs IGJ1ZmZlciBhbmQgbXVzdCBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyAwLg0KKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovDQorDQorLyoqDQorICogWlNURF9DU3RyZWFtV29ya3NwYWNlQm91bmQo KSAtIG1lbW9yeSBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBhIFpTVERfQ1N0cmVhbQ0KKyAqIEBjUGFy YW1zOiBUaGUgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBiZSB1c2VkIGZvciBjb21wcmVzc2lv bi4NCisgKg0KKyAqIFJldHVybjogICBBIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSB3 b3Jrc3BhY2UgdGhhdCBpcyBwYXNzZWQgdG8NCisgKiAgICAgICAgICAgWlNURF9pbml0Q1N0cmVh bSgpIGFuZCBaU1REX2luaXRDU3RyZWFtX3VzaW5nQ0RpY3QoKS4NCisgKi8NCitzaXplX3QgWlNU RF9DU3RyZWFtV29ya3NwYWNlQm91bmQoWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgY1BhcmFt cyk7DQorDQorLyoqDQorICogc3RydWN0IFpTVERfQ1N0cmVhbSAtIHRoZSB6c3RkIHN0cmVhbWlu ZyBjb21wcmVzc2lvbiBjb250ZXh0DQorICovDQordHlwZWRlZiBzdHJ1Y3QgWlNURF9DU3RyZWFt X3MgWlNURF9DU3RyZWFtOw0KKw0KKy8qPT09PT0gWlNURF9DU3RyZWFtIG1hbmFnZW1lbnQgZnVu Y3Rpb25zID09PT09Ki8NCisvKioNCisgKiBaU1REX2luaXRDU3RyZWFtKCkgLSBpbml0aWFsaXpl IGEgenN0ZCBzdHJlYW1pbmcgY29tcHJlc3Npb24gY29udGV4dA0KKyAqIEBwYXJhbXM6ICAgICAg ICAgVGhlIHpzdGQgY29tcHJlc3Npb24gcGFyYW1ldGVycy4NCisgKiBAcGxlZGdlZFNyY1NpemU6 IElmIHBhcmFtcy5mUGFyYW1zLmNvbnRlbnRTaXplRmxhZyA9PSAxIHRoZW4gdGhlIGNhbGxlciBt dXN0DQorICogICAgICAgICAgICAgICAgICBwYXNzIHRoZSBzb3VyY2Ugc2l6ZSAoemVybyBtZWFu cyBlbXB0eSBzb3VyY2UpLiBPdGhlcndpc2UsDQorICogICAgICAgICAgICAgICAgICB0aGUgY2Fs bGVyIG1heSBvcHRpb25hbGx5IHBhc3MgdGhlIHNvdXJjZSBzaXplLCBvciB6ZXJvIGlmDQorICog ICAgICAgICAgICAgICAgICB1bmtub3duLg0KKyAqIEB3b3Jrc3BhY2U6ICAgICAgVGhlIHdvcmtz cGFjZSB0byBlbXBsYWNlIHRoZSBjb250ZXh0IGludG8uIEl0IG11c3Qgb3V0bGl2ZQ0KKyAqICAg ICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIGNvbnRleHQuDQorICogQHdvcmtzcGFjZVNpemU6 ICBUaGUgc2l6ZSBvZiB3b3Jrc3BhY2UuDQorICogICAgICAgICAgICAgICAgICBVc2UgWlNURF9D U3RyZWFtV29ya3NwYWNlQm91bmQocGFyYW1zLmNQYXJhbXMpIHRvIGRldGVybWluZQ0KKyAqICAg ICAgICAgICAgICAgICAgaG93IGxhcmdlIHRoZSB3b3Jrc3BhY2UgbXVzdCBiZS4NCisgKg0KKyAq IFJldHVybjogICAgICAgICAgVGhlIHpzdGQgc3RyZWFtaW5nIGNvbXByZXNzaW9uIGNvbnRleHQu DQorICovDQorWlNURF9DU3RyZWFtICpaU1REX2luaXRDU3RyZWFtKFpTVERfcGFyYW1ldGVycyBw YXJhbXMsDQorCXVuc2lnbmVkIGxvbmcgbG9uZyBwbGVkZ2VkU3JjU2l6ZSwgdm9pZCAqd29ya3Nw YWNlLA0KKwlzaXplX3Qgd29ya3NwYWNlU2l6ZSk7DQorDQorLyoqDQorICogWlNURF9pbml0Q1N0 cmVhbV91c2luZ0NEaWN0KCkgLSBpbml0aWFsaXplIGEgc3RyZWFtaW5nIGNvbXByZXNzaW9uIGNv bnRleHQNCisgKiBAY2RpY3Q6ICAgICAgICAgIFRoZSBkaWdlc3RlZCBkaWN0aW9uYXJ5IHRvIHVz ZSBmb3IgY29tcHJlc3Npb24uDQorICogQHBsZWRnZWRTcmNTaXplOiBPcHRpb25hbGx5IHRoZSBz b3VyY2Ugc2l6ZSwgb3IgemVybyBpZiB1bmtub3duLg0KKyAqIEB3b3Jrc3BhY2U6ICAgICAgVGhl IHdvcmtzcGFjZSB0byBlbXBsYWNlIHRoZSBjb250ZXh0IGludG8uIEl0IG11c3Qgb3V0bGl2ZQ0K KyAqICAgICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIGNvbnRleHQuDQorICogQHdvcmtzcGFj ZVNpemU6ICBUaGUgc2l6ZSBvZiB3b3Jrc3BhY2UuIENhbGwgWlNURF9DU3RyZWFtV29ya3NwYWNl Qm91bmQoKQ0KKyAqICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY1BhcmFtcyB1c2VkIHRvIGlu aXRpYWxpemUgdGhlIGNkaWN0IHRvIGRldGVybWluZQ0KKyAqICAgICAgICAgICAgICAgICAgaG93 IGxhcmdlIHRoZSB3b3Jrc3BhY2UgbXVzdCBiZS4NCisgKg0KKyAqIFJldHVybjogICAgICAgICAg VGhlIHpzdGQgc3RyZWFtaW5nIGNvbXByZXNzaW9uIGNvbnRleHQuDQorICovDQorWlNURF9DU3Ry ZWFtICpaU1REX2luaXRDU3RyZWFtX3VzaW5nQ0RpY3QoY29uc3QgWlNURF9DRGljdCAqY2RpY3Qs DQorCXVuc2lnbmVkIGxvbmcgbG9uZyBwbGVkZ2VkU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLA0K KwlzaXplX3Qgd29ya3NwYWNlU2l6ZSk7DQorDQorLyo9PT09PSBTdHJlYW1pbmcgY29tcHJlc3Np b24gZnVuY3Rpb25zID09PT09Ki8NCisvKioNCisgKiBaU1REX3Jlc2V0Q1N0cmVhbSgpIC0gcmVz ZXQgdGhlIGNvbnRleHQgdXNpbmcgcGFyYW1ldGVycyBmcm9tIGNyZWF0aW9uDQorICogQHpjczog ICAgICAgICAgICBUaGUgenN0ZCBzdHJlYW1pbmcgY29tcHJlc3Npb24gY29udGV4dCB0byByZXNl dC4NCisgKiBAcGxlZGdlZFNyY1NpemU6IE9wdGlvbmFsbHkgdGhlIHNvdXJjZSBzaXplLCBvciB6 ZXJvIGlmIHVua25vd24uDQorICoNCisgKiBSZXNldHMgdGhlIGNvbnRleHQgdXNpbmcgdGhlIHBh cmFtZXRlcnMgZnJvbSBjcmVhdGlvbi4gU2tpcHMgZGljdGlvbmFyeQ0KKyAqIGxvYWRpbmcsIHNp bmNlIGl0IGNhbiBiZSByZXVzZWQuIElmIGBwbGVkZ2VkU3JjU2l6ZWAgaXMgbm9uLXplcm8gdGhl IGZyYW1lDQorICogY29udGVudCBzaXplIGlzIGFsd2F5cyB3cml0dGVuIGludG8gdGhlIGZyYW1l IGhlYWRlci4NCisgKg0KKyAqIFJldHVybjogICAgICAgICAgWmVybyBvciBhbiBlcnJvciwgd2hp Y2ggY2FuIGJlIGNoZWNrZWQgdXNpbmcgWlNURF9pc0Vycm9yKCkuDQorICovDQorc2l6ZV90IFpT VERfcmVzZXRDU3RyZWFtKFpTVERfQ1N0cmVhbSAqemNzLCB1bnNpZ25lZCBsb25nIGxvbmcgcGxl ZGdlZFNyY1NpemUpOw0KKy8qKg0KKyAqIFpTVERfY29tcHJlc3NTdHJlYW0oKSAtIHN0cmVhbWlu ZyBjb21wcmVzcyBzb21lIG9mIGlucHV0IGludG8gb3V0cHV0DQorICogQHpjczogICAgVGhlIHpz dGQgc3RyZWFtaW5nIGNvbXByZXNzaW9uIGNvbnRleHQuDQorICogQG91dHB1dDogRGVzdGluYXRp b24gYnVmZmVyLiBgb3V0cHV0LT5wb3NgIGlzIHVwZGF0ZWQgdG8gaW5kaWNhdGUgaG93IG11Y2gN CisgKiAgICAgICAgICBjb21wcmVzc2VkIGRhdGEgd2FzIHdyaXR0ZW4uDQorICogQGlucHV0OiAg U291cmNlIGJ1ZmZlci4gYGlucHV0LT5wb3NgIGlzIHVwZGF0ZWQgdG8gaW5kaWNhdGUgaG93IG11 Y2ggZGF0YSB3YXMNCisgKiAgICAgICAgICByZWFkLiBOb3RlIHRoYXQgaXQgbWF5IG5vdCBjb25z dW1lIHRoZSBlbnRpcmUgaW5wdXQsIGluIHdoaWNoIGNhc2UNCisgKiAgICAgICAgICBgaW5wdXQt PnBvcyA8IGlucHV0LT5zaXplYCwgYW5kIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBwcmVzZW50 DQorICogICAgICAgICAgcmVtYWluaW5nIGRhdGEgYWdhaW4uDQorICoNCisgKiBUaGUgYGlucHV0 YCBhbmQgYG91dHB1dGAgYnVmZmVycyBtYXkgYmUgYW55IHNpemUuIEd1YXJhbnRlZWQgdG8gbWFr ZSBzb21lDQorICogZm9yd2FyZCBwcm9ncmVzcyBpZiBgaW5wdXRgIGFuZCBgb3V0cHV0YCBhcmUg bm90IGVtcHR5Lg0KKyAqDQorICogUmV0dXJuOiAgQSBoaW50IGZvciB0aGUgbnVtYmVyIG9mIGJ5 dGVzIHRvIHVzZSBhcyB0aGUgaW5wdXQgZm9yIHRoZSBuZXh0DQorICogICAgICAgICAgZnVuY3Rp b24gY2FsbCBvciBhbiBlcnJvciwgd2hpY2ggY2FuIGJlIGNoZWNrZWQgdXNpbmcNCisgKiAgICAg ICAgICBaU1REX2lzRXJyb3IoKS4NCisgKi8NCitzaXplX3QgWlNURF9jb21wcmVzc1N0cmVhbSha U1REX0NTdHJlYW0gKnpjcywgWlNURF9vdXRCdWZmZXIgKm91dHB1dCwNCisJWlNURF9pbkJ1ZmZl ciAqaW5wdXQpOw0KKy8qKg0KKyAqIFpTVERfZmx1c2hTdHJlYW0oKSAtIGZsdXNoIGludGVybmFs IGJ1ZmZlcnMgaW50byBvdXRwdXQNCisgKiBAemNzOiAgICBUaGUgenN0ZCBzdHJlYW1pbmcgY29t cHJlc3Npb24gY29udGV4dC4NCisgKiBAb3V0cHV0OiBEZXN0aW5hdGlvbiBidWZmZXIuIGBvdXRw dXQtPnBvc2AgaXMgdXBkYXRlZCB0byBpbmRpY2F0ZSBob3cgbXVjaA0KKyAqICAgICAgICAgIGNv bXByZXNzZWQgZGF0YSB3YXMgd3JpdHRlbi4NCisgKg0KKyAqIFpTVERfZmx1c2hTdHJlYW0oKSBt dXN0IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIDAsIG1lYW5pbmcgYWxsIHRoZSBkYXRhDQor ICogaGFzIGJlZW4gZmx1c2hlZC4gU2luY2UgWlNURF9mbHVzaFN0cmVhbSgpIGNhdXNlcyBhIGJs b2NrIHRvIGJlIGVuZGVkLA0KKyAqIGNhbGxpbmcgaXQgdG9vIG9mdGVuIHdpbGwgZGVncmFkZSB0 aGUgY29tcHJlc3Npb24gcmF0aW8uDQorICoNCisgKiBSZXR1cm46ICBUaGUgbnVtYmVyIG9mIGJ5 dGVzIHN0aWxsIHByZXNlbnQgd2l0aGluIGludGVybmFsIGJ1ZmZlcnMgb3IgYW4NCisgKiAgICAg ICAgICBlcnJvciwgd2hpY2ggY2FuIGJlIGNoZWNrZWQgdXNpbmcgWlNURF9pc0Vycm9yKCkuDQor ICovDQorc2l6ZV90IFpTVERfZmx1c2hTdHJlYW0oWlNURF9DU3RyZWFtICp6Y3MsIFpTVERfb3V0 QnVmZmVyICpvdXRwdXQpOw0KKy8qKg0KKyAqIFpTVERfZW5kU3RyZWFtKCkgLSBmbHVzaCBpbnRl cm5hbCBidWZmZXJzIGludG8gb3V0cHV0IGFuZCBlbmQgdGhlIGZyYW1lDQorICogQHpjczogICAg VGhlIHpzdGQgc3RyZWFtaW5nIGNvbXByZXNzaW9uIGNvbnRleHQuDQorICogQG91dHB1dDogRGVz dGluYXRpb24gYnVmZmVyLiBgb3V0cHV0LT5wb3NgIGlzIHVwZGF0ZWQgdG8gaW5kaWNhdGUgaG93 IG11Y2gNCisgKiAgICAgICAgICBjb21wcmVzc2VkIGRhdGEgd2FzIHdyaXR0ZW4uDQorICoNCisg KiBaU1REX2VuZFN0cmVhbSgpIG11c3QgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgMCwgbWVh bmluZyBhbGwgdGhlIGRhdGEgaGFzDQorICogYmVlbiBmbHVzaGVkIGFuZCB0aGUgZnJhbWUgZXBp bG9ndWUgaGFzIGJlZW4gd3JpdHRlbi4NCisgKg0KKyAqIFJldHVybjogIFRoZSBudW1iZXIgb2Yg Ynl0ZXMgc3RpbGwgcHJlc2VudCB3aXRoaW4gaW50ZXJuYWwgYnVmZmVycyBvciBhbg0KKyAqICAg ICAgICAgIGVycm9yLCB3aGljaCBjYW4gYmUgY2hlY2tlZCB1c2luZyBaU1REX2lzRXJyb3IoKS4N CisgKi8NCitzaXplX3QgWlNURF9lbmRTdHJlYW0oWlNURF9DU3RyZWFtICp6Y3MsIFpTVERfb3V0 QnVmZmVyICpvdXRwdXQpOw0KKw0KKy8qKg0KKyAqIFpTVERfQ1N0cmVhbUluU2l6ZSgpIC0gcmVj b21tZW5kZWQgc2l6ZSBmb3IgdGhlIGlucHV0IGJ1ZmZlcg0KKyAqDQorICogUmV0dXJuOiBUaGUg cmVjb21tZW5kZWQgc2l6ZSBmb3IgdGhlIGlucHV0IGJ1ZmZlci4NCisgKi8NCitzaXplX3QgWlNU RF9DU3RyZWFtSW5TaXplKHZvaWQpOw0KKy8qKg0KKyAqIFpTVERfQ1N0cmVhbU91dFNpemUoKSAt IHJlY29tbWVuZGVkIHNpemUgZm9yIHRoZSBvdXRwdXQgYnVmZmVyDQorICoNCisgKiBXaGVuIHRo ZSBvdXRwdXQgYnVmZmVyIGlzIGF0IGxlYXN0IHRoaXMgbGFyZ2UsIGl0IGlzIGd1YXJhbnRlZWQg dG8gYmUgbGFyZ2UNCisgKiBlbm91Z2ggdG8gZmx1c2ggYXQgbGVhc3Qgb25lIGNvbXBsZXRlIGNv bXByZXNzZWQgYmxvY2suDQorICoNCisgKiBSZXR1cm46IFRoZSByZWNvbW1lbmRlZCBzaXplIGZv ciB0aGUgb3V0cHV0IGJ1ZmZlci4NCisgKi8NCitzaXplX3QgWlNURF9DU3RyZWFtT3V0U2l6ZSh2 b2lkKTsNCisNCisNCisNCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIFN0cmVhbWluZyBk ZWNvbXByZXNzaW9uIC0gSG93VG8NCisgKg0KKyAqIEEgWlNURF9EU3RyZWFtIG9iamVjdCBpcyBy ZXF1aXJlZCB0byB0cmFjayBzdHJlYW1pbmcgb3BlcmF0aW9ucy4NCisgKiBVc2UgWlNURF9pbml0 RFN0cmVhbSgpIHRvIGluaXRpYWxpemUgYSBaU1REX0RTdHJlYW0gb2JqZWN0Lg0KKyAqIFpTVERf RFN0cmVhbSBvYmplY3RzIGNhbiBiZSByZS11c2VkIG11bHRpcGxlIHRpbWVzLg0KKyAqDQorICog VXNlIFpTVERfZGVjb21wcmVzc1N0cmVhbSgpIHJlcGV0aXRpdmVseSB0byBjb25zdW1lIHlvdXIg aW5wdXQuDQorICogVGhlIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIGJvdGggYHBvc2AgZmllbGRzLg0K KyAqIElmIGBpbnB1dC0+cG9zIDwgaW5wdXQtPnNpemVgLCBzb21lIGlucHV0IGhhcyBub3QgYmVl biBjb25zdW1lZC4NCisgKiBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gcHJlc2VudCBhZ2FpbiBy ZW1haW5pbmcgZGF0YS4NCisgKiBJZiBgb3V0cHV0LT5wb3MgPCBvdXRwdXQtPnNpemVgLCBkZWNv ZGVyIGhhcyBmbHVzaGVkIGV2ZXJ5dGhpbmcgaXQgY291bGQuDQorICogUmV0dXJucyAwIGlmZiBh IGZyYW1lIGlzIGNvbXBsZXRlbHkgZGVjb2RlZCBhbmQgZnVsbHkgZmx1c2hlZC4NCisgKiBPdGhl cndpc2UgaXQgcmV0dXJucyBhIHN1Z2dlc3RlZCBuZXh0IGlucHV0IHNpemUgdGhhdCB3aWxsIG5l dmVyIGxvYWQgbW9yZQ0KKyAqIHRoYW4gdGhlIGN1cnJlbnQgZnJhbWUuDQorICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8NCisNCisvKioNCisgKiBaU1REX0RTdHJlYW1Xb3Jrc3BhY2VCb3VuZCgpIC0g bWVtb3J5IG5lZWRlZCB0byBpbml0aWFsaXplIGEgWlNURF9EU3RyZWFtDQorICogQG1heFdpbmRv d1NpemU6IFRoZSBtYXhpbXVtIHdpbmRvdyBzaXplIGFsbG93ZWQgZm9yIGNvbXByZXNzZWQgZnJh bWVzLg0KKyAqDQorICogUmV0dXJuOiAgICAgICAgIEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUg b2YgdGhlIHdvcmtzcGFjZSB0aGF0IGlzIHBhc3NlZCB0bw0KKyAqICAgICAgICAgICAgICAgICBa U1REX2luaXREU3RyZWFtKCkgYW5kIFpTVERfaW5pdERTdHJlYW1fdXNpbmdERGljdCgpLg0KKyAq Lw0KK3NpemVfdCBaU1REX0RTdHJlYW1Xb3Jrc3BhY2VCb3VuZChzaXplX3QgbWF4V2luZG93U2l6 ZSk7DQorDQorLyoqDQorICogc3RydWN0IFpTVERfRFN0cmVhbSAtIHRoZSB6c3RkIHN0cmVhbWlu ZyBkZWNvbXByZXNzaW9uIGNvbnRleHQNCisgKi8NCit0eXBlZGVmIHN0cnVjdCBaU1REX0RTdHJl YW1fcyBaU1REX0RTdHJlYW07DQorLyo9PT09PSBaU1REX0RTdHJlYW0gbWFuYWdlbWVudCBmdW5j dGlvbnMgPT09PT0qLw0KKy8qKg0KKyAqIFpTVERfaW5pdERTdHJlYW0oKSAtIGluaXRpYWxpemUg YSB6c3RkIHN0cmVhbWluZyBkZWNvbXByZXNzaW9uIGNvbnRleHQNCisgKiBAbWF4V2luZG93U2l6 ZTogVGhlIG1heGltdW0gd2luZG93IHNpemUgYWxsb3dlZCBmb3IgY29tcHJlc3NlZCBmcmFtZXMu DQorICogQHdvcmtzcGFjZTogICAgIFRoZSB3b3Jrc3BhY2UgdG8gZW1wbGFjZSB0aGUgY29udGV4 dCBpbnRvLiBJdCBtdXN0IG91dGxpdmUNCisgKiAgICAgICAgICAgICAgICAgdGhlIHJldHVybmVk IGNvbnRleHQuDQorICogQHdvcmtzcGFjZVNpemU6IFRoZSBzaXplIG9mIHdvcmtzcGFjZS4NCisg KiAgICAgICAgICAgICAgICAgVXNlIFpTVERfRFN0cmVhbVdvcmtzcGFjZUJvdW5kKG1heFdpbmRv d1NpemUpIHRvIGRldGVybWluZQ0KKyAqICAgICAgICAgICAgICAgICBob3cgbGFyZ2UgdGhlIHdv cmtzcGFjZSBtdXN0IGJlLg0KKyAqDQorICogUmV0dXJuOiAgICAgICAgIFRoZSB6c3RkIHN0cmVh bWluZyBkZWNvbXByZXNzaW9uIGNvbnRleHQuDQorICovDQorWlNURF9EU3RyZWFtICpaU1REX2lu aXREU3RyZWFtKHNpemVfdCBtYXhXaW5kb3dTaXplLCB2b2lkICp3b3Jrc3BhY2UsDQorCXNpemVf dCB3b3Jrc3BhY2VTaXplKTsNCisvKioNCisgKiBaU1REX2luaXREU3RyZWFtX3VzaW5nRERpY3Qo KSAtIGluaXRpYWxpemUgc3RyZWFtaW5nIGRlY29tcHJlc3Npb24gY29udGV4dA0KKyAqIEBtYXhX aW5kb3dTaXplOiBUaGUgbWF4aW11bSB3aW5kb3cgc2l6ZSBhbGxvd2VkIGZvciBjb21wcmVzc2Vk IGZyYW1lcy4NCisgKiBAZGRpY3Q6ICAgICAgICAgVGhlIGRpZ2VzdGVkIGRpY3Rpb25hcnkgdG8g dXNlIGZvciBkZWNvbXByZXNzaW9uLg0KKyAqIEB3b3Jrc3BhY2U6ICAgICBUaGUgd29ya3NwYWNl IHRvIGVtcGxhY2UgdGhlIGNvbnRleHQgaW50by4gSXQgbXVzdCBvdXRsaXZlDQorICogICAgICAg ICAgICAgICAgIHRoZSByZXR1cm5lZCBjb250ZXh0Lg0KKyAqIEB3b3Jrc3BhY2VTaXplOiBUaGUg c2l6ZSBvZiB3b3Jrc3BhY2UuDQorICogICAgICAgICAgICAgICAgIFVzZSBaU1REX0RTdHJlYW1X b3Jrc3BhY2VCb3VuZChtYXhXaW5kb3dTaXplKSB0byBkZXRlcm1pbmUNCisgKiAgICAgICAgICAg ICAgICAgaG93IGxhcmdlIHRoZSB3b3Jrc3BhY2UgbXVzdCBiZS4NCisgKg0KKyAqIFJldHVybjog ICAgICAgICBUaGUgenN0ZCBzdHJlYW1pbmcgZGVjb21wcmVzc2lvbiBjb250ZXh0Lg0KKyAqLw0K K1pTVERfRFN0cmVhbSAqWlNURF9pbml0RFN0cmVhbV91c2luZ0REaWN0KHNpemVfdCBtYXhXaW5k b3dTaXplLA0KKwljb25zdCBaU1REX0REaWN0ICpkZGljdCwgdm9pZCAqd29ya3NwYWNlLCBzaXpl X3Qgd29ya3NwYWNlU2l6ZSk7DQorDQorLyo9PT09PSBTdHJlYW1pbmcgZGVjb21wcmVzc2lvbiBm dW5jdGlvbnMgPT09PT0qLw0KKy8qKg0KKyAqIFpTVERfcmVzZXREU3RyZWFtKCkgLSByZXNldCB0 aGUgY29udGV4dCB1c2luZyBwYXJhbWV0ZXJzIGZyb20gY3JlYXRpb24NCisgKiBAemRzOiAgIFRo ZSB6c3RkIHN0cmVhbWluZyBkZWNvbXByZXNzaW9uIGNvbnRleHQgdG8gcmVzZXQuDQorICoNCisg KiBSZXNldHMgdGhlIGNvbnRleHQgdXNpbmcgdGhlIHBhcmFtZXRlcnMgZnJvbSBjcmVhdGlvbi4g U2tpcHMgZGljdGlvbmFyeQ0KKyAqIGxvYWRpbmcsIHNpbmNlIGl0IGNhbiBiZSByZXVzZWQuDQor ICoNCisgKiBSZXR1cm46IFplcm8gb3IgYW4gZXJyb3IsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHVz aW5nIFpTVERfaXNFcnJvcigpLg0KKyAqLw0KK3NpemVfdCBaU1REX3Jlc2V0RFN0cmVhbShaU1RE X0RTdHJlYW0gKnpkcyk7DQorLyoqDQorICogWlNURF9kZWNvbXByZXNzU3RyZWFtKCkgLSBzdHJl YW1pbmcgZGVjb21wcmVzcyBzb21lIG9mIGlucHV0IGludG8gb3V0cHV0DQorICogQHpkczogICAg VGhlIHpzdGQgc3RyZWFtaW5nIGRlY29tcHJlc3Npb24gY29udGV4dC4NCisgKiBAb3V0cHV0OiBE ZXN0aW5hdGlvbiBidWZmZXIuIGBvdXRwdXQucG9zYCBpcyB1cGRhdGVkIHRvIGluZGljYXRlIGhv dyBtdWNoDQorICogICAgICAgICAgZGVjb21wcmVzc2VkIGRhdGEgd2FzIHdyaXR0ZW4uDQorICog QGlucHV0OiAgU291cmNlIGJ1ZmZlci4gYGlucHV0LnBvc2AgaXMgdXBkYXRlZCB0byBpbmRpY2F0 ZSBob3cgbXVjaCBkYXRhIHdhcw0KKyAqICAgICAgICAgIHJlYWQuIE5vdGUgdGhhdCBpdCBtYXkg bm90IGNvbnN1bWUgdGhlIGVudGlyZSBpbnB1dCwgaW4gd2hpY2ggY2FzZQ0KKyAqICAgICAgICAg IGBpbnB1dC5wb3MgPCBpbnB1dC5zaXplYCwgYW5kIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBw cmVzZW50DQorICogICAgICAgICAgcmVtYWluaW5nIGRhdGEgYWdhaW4uDQorICoNCisgKiBUaGUg YGlucHV0YCBhbmQgYG91dHB1dGAgYnVmZmVycyBtYXkgYmUgYW55IHNpemUuIEd1YXJhbnRlZWQg dG8gbWFrZSBzb21lDQorICogZm9yd2FyZCBwcm9ncmVzcyBpZiBgaW5wdXRgIGFuZCBgb3V0cHV0 YCBhcmUgbm90IGVtcHR5Lg0KKyAqIFpTVERfZGVjb21wcmVzc1N0cmVhbSgpIHdpbGwgbm90IGNv bnN1bWUgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZnJhbWUgdW50aWwNCisgKiB0aGUgZW50aXJlIGZy YW1lIGlzIGZsdXNoZWQuDQorICoNCisgKiBSZXR1cm46ICBSZXR1cm5zIDAgaWZmIGEgZnJhbWUg aXMgY29tcGxldGVseSBkZWNvZGVkIGFuZCBmdWxseSBmbHVzaGVkLg0KKyAqICAgICAgICAgIE90 aGVyd2lzZSByZXR1cm5zIGEgaGludCBmb3IgdGhlIG51bWJlciBvZiBieXRlcyB0byB1c2UgYXMg dGhlIGlucHV0DQorICogICAgICAgICAgZm9yIHRoZSBuZXh0IGZ1bmN0aW9uIGNhbGwgb3IgYW4g ZXJyb3IsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHVzaW5nDQorICogICAgICAgICAgWlNURF9pc0Vy cm9yKCkuIFRoZSBzaXplIGhpbnQgd2lsbCBuZXZlciBsb2FkIG1vcmUgdGhhbiB0aGUgZnJhbWUu DQorICovDQorc2l6ZV90IFpTVERfZGVjb21wcmVzc1N0cmVhbShaU1REX0RTdHJlYW0gKnpkcywg WlNURF9vdXRCdWZmZXIgKm91dHB1dCwNCisJWlNURF9pbkJ1ZmZlciAqaW5wdXQpOw0KKw0KKy8q Kg0KKyAqIFpTVERfRFN0cmVhbUluU2l6ZSgpIC0gcmVjb21tZW5kZWQgc2l6ZSBmb3IgdGhlIGlu cHV0IGJ1ZmZlcg0KKyAqDQorICogUmV0dXJuOiBUaGUgcmVjb21tZW5kZWQgc2l6ZSBmb3IgdGhl IGlucHV0IGJ1ZmZlci4NCisgKi8NCitzaXplX3QgWlNURF9EU3RyZWFtSW5TaXplKHZvaWQpOw0K Ky8qKg0KKyAqIFpTVERfRFN0cmVhbU91dFNpemUoKSAtIHJlY29tbWVuZGVkIHNpemUgZm9yIHRo ZSBvdXRwdXQgYnVmZmVyDQorICoNCisgKiBXaGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGF0IGxl YXN0IHRoaXMgbGFyZ2UsIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2UNCisgKiBlbm91Z2gg dG8gZmx1c2ggYXQgbGVhc3Qgb25lIGNvbXBsZXRlIGRlY29tcHJlc3NlZCBibG9jay4NCisgKg0K KyAqIFJldHVybjogVGhlIHJlY29tbWVuZGVkIHNpemUgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLg0K KyAqLw0KK3NpemVfdCBaU1REX0RTdHJlYW1PdXRTaXplKHZvaWQpOw0KKw0KKw0KKy8qIC0tLSBD b25zdGFudHMgLS0tKi8NCisjZGVmaW5lIFpTVERfTUFHSUNOVU1CRVIgICAgICAgICAgICAweEZE MkZCNTI4ICAgLyogPj0gdjAuOC4wICovDQorI2RlZmluZSBaU1REX01BR0lDX1NLSVBQQUJMRV9T VEFSVCAgMHgxODREMkE1MFUNCisNCisjZGVmaW5lIFpTVERfQ09OVEVOVFNJWkVfVU5LTk9XTiAo MFVMTCAtIDEpDQorI2RlZmluZSBaU1REX0NPTlRFTlRTSVpFX0VSUk9SICAgKDBVTEwgLSAyKQ0K Kw0KKyNkZWZpbmUgWlNURF9XSU5ET1dMT0dfTUFYXzMyICAyNw0KKyNkZWZpbmUgWlNURF9XSU5E T1dMT0dfTUFYXzY0ICAyNw0KKyNkZWZpbmUgWlNURF9XSU5ET1dMT0dfTUFYIFwNCisJKCh1bnNp Z25lZCBpbnQpKHNpemVvZihzaXplX3QpID09IDQgXA0KKwkJPyBaU1REX1dJTkRPV0xPR19NQVhf MzIgXA0KKwkJOiBaU1REX1dJTkRPV0xPR19NQVhfNjQpKQ0KKyNkZWZpbmUgWlNURF9XSU5ET1dM T0dfTUlOIDEwDQorI2RlZmluZSBaU1REX0hBU0hMT0dfTUFYIFpTVERfV0lORE9XTE9HX01BWA0K KyNkZWZpbmUgWlNURF9IQVNITE9HX01JTiAgICAgICAgNg0KKyNkZWZpbmUgWlNURF9DSEFJTkxP R19NQVggICAgIChaU1REX1dJTkRPV0xPR19NQVgrMSkNCisjZGVmaW5lIFpTVERfQ0hBSU5MT0df TUlOICAgICAgWlNURF9IQVNITE9HX01JTg0KKyNkZWZpbmUgWlNURF9IQVNITE9HM19NQVggICAg ICAxNw0KKyNkZWZpbmUgWlNURF9TRUFSQ0hMT0dfTUFYICAgIChaU1REX1dJTkRPV0xPR19NQVgt MSkNCisjZGVmaW5lIFpTVERfU0VBUkNITE9HX01JTiAgICAgIDENCisvKiBvbmx5IGZvciBaU1RE X2Zhc3QsIG90aGVyIHN0cmF0ZWdpZXMgYXJlIGxpbWl0ZWQgdG8gNiAqLw0KKyNkZWZpbmUgWlNU RF9TRUFSQ0hMRU5HVEhfTUFYICAgNw0KKy8qIG9ubHkgZm9yIFpTVERfYnRvcHQsIG90aGVyIHN0 cmF0ZWdpZXMgYXJlIGxpbWl0ZWQgdG8gNCAqLw0KKyNkZWZpbmUgWlNURF9TRUFSQ0hMRU5HVEhf TUlOICAgMw0KKyNkZWZpbmUgWlNURF9UQVJHRVRMRU5HVEhfTUlOICAgNA0KKyNkZWZpbmUgWlNU RF9UQVJHRVRMRU5HVEhfTUFYIDk5OQ0KKw0KKy8qIGZvciBzdGF0aWMgYWxsb2NhdGlvbiAqLw0K KyNkZWZpbmUgWlNURF9GUkFNRUhFQURFUlNJWkVfTUFYIDE4DQorI2RlZmluZSBaU1REX0ZSQU1F SEVBREVSU0laRV9NSU4gIDYNCitzdGF0aWMgY29uc3Qgc2l6ZV90IFpTVERfZnJhbWVIZWFkZXJT aXplX3ByZWZpeCA9IDU7DQorc3RhdGljIGNvbnN0IHNpemVfdCBaU1REX2ZyYW1lSGVhZGVyU2l6 ZV9taW4gPSBaU1REX0ZSQU1FSEVBREVSU0laRV9NSU47DQorc3RhdGljIGNvbnN0IHNpemVfdCBa U1REX2ZyYW1lSGVhZGVyU2l6ZV9tYXggPSBaU1REX0ZSQU1FSEVBREVSU0laRV9NQVg7DQorLyog bWFnaWMgbnVtYmVyICsgc2tpcHBhYmxlIGZyYW1lIGxlbmd0aCAqLw0KK3N0YXRpYyBjb25zdCBz aXplX3QgWlNURF9za2lwcGFibGVIZWFkZXJTaXplID0gODsNCisNCisNCisvKi0qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29tcHJlc3NlZCBzaXplIGZ1bmN0aW9u cw0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKioNCisg KiBaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKCkgLSByZXR1cm5zIHRoZSBzaXplIG9mIGEg Y29tcHJlc3NlZCBmcmFtZQ0KKyAqIEBzcmM6ICAgICBTb3VyY2UgYnVmZmVyLiBJdCBzaG91bGQg cG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGEgenN0ZCBlbmNvZGVkIGZyYW1lDQorICogICAgICAgICAg IG9yIGEgc2tpcHBhYmxlIGZyYW1lLg0KKyAqIEBzcmNTaXplOiBUaGUgc2l6ZSBvZiB0aGUgc291 cmNlIGJ1ZmZlci4gSXQgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUNCisgKiAgICAg ICAgICAgc2l6ZSBvZiB0aGUgZnJhbWUuDQorICoNCisgKiBSZXR1cm46ICAgVGhlIGNvbXByZXNz ZWQgc2l6ZSBvZiB0aGUgZnJhbWUgcG9pbnRlZCB0byBieSBgc3JjYCBvciBhbiBlcnJvciwNCisg KiAgICAgICAgICAgd2hpY2ggY2FuIGJlIGNoZWNrIHdpdGggWlNURF9pc0Vycm9yKCkuDQorICog ICAgICAgICAgIFN1aXRhYmxlIHRvIHBhc3MgdG8gWlNURF9kZWNvbXByZXNzKCkgb3Igc2ltaWxh ciBmdW5jdGlvbnMuDQorICovDQorc2l6ZV90IFpTVERfZmluZEZyYW1lQ29tcHJlc3NlZFNpemUo Y29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSk7DQorDQorLyotKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKg0KKyAqIERlY29tcHJlc3NlZCBzaXplIGZ1bmN0aW9ucw0K KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKioNCisgKiBaU1RE X2dldEZyYW1lQ29udGVudFNpemUoKSAtIHJldHVybnMgdGhlIGNvbnRlbnQgc2l6ZSBpbiBhIHpz dGQgZnJhbWUgaGVhZGVyDQorICogQHNyYzogICAgIEl0IHNob3VsZCBwb2ludCB0byB0aGUgc3Rh cnQgb2YgYSB6c3RkIGVuY29kZWQgZnJhbWUuDQorICogQHNyY1NpemU6IFRoZSBzaXplIG9mIHRo ZSBzb3VyY2UgYnVmZmVyLiBJdCBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQ0KKyAq ICAgICAgICAgICBmcmFtZSBoZWFkZXIuIGBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9tYXhgIGlzIGFs d2F5cyBsYXJnZSBlbm91Z2guDQorICoNCisgKiBSZXR1cm46ICAgVGhlIGZyYW1lIGNvbnRlbnQg c2l6ZSBzdG9yZWQgaW4gdGhlIGZyYW1lIGhlYWRlciBpZiBrbm93bi4NCisgKiAgICAgICAgICAg YFpTVERfQ09OVEVOVFNJWkVfVU5LTk9XTmAgaWYgdGhlIGNvbnRlbnQgc2l6ZSBpc24ndCBzdG9y ZWQgaW4gdGhlDQorICogICAgICAgICAgIGZyYW1lIGhlYWRlci4gYFpTVERfQ09OVEVOVFNJWkVf RVJST1JgIG9uIGludmFsaWQgaW5wdXQuDQorICovDQordW5zaWduZWQgbG9uZyBsb25nIFpTVERf Z2V0RnJhbWVDb250ZW50U2l6ZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKTsNCisN CisvKioNCisgKiBaU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKCkgLSByZXR1cm5zIGRlY29tcHJl c3NlZCBzaXplIG9mIGEgc2VyaWVzIG9mIGZyYW1lcw0KKyAqIEBzcmM6ICAgICBJdCBzaG91bGQg cG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGEgc2VyaWVzIG9mIHpzdGQgZW5jb2RlZCBhbmQvb3INCisg KiAgICAgICAgICAgc2tpcHBhYmxlIGZyYW1lcy4NCisgKiBAc3JjU2l6ZTogVGhlIGV4YWN0IHNp emUgb2YgdGhlIHNlcmllcyBvZiBmcmFtZXMuDQorICoNCisgKiBJZiBhbnkgenN0ZCBlbmNvZGVk IGZyYW1lIGluIHRoZSBzZXJpZXMgZG9lc24ndCBoYXZlIHRoZSBmcmFtZSBjb250ZW50IHNpemUN CisgKiBzZXQsIGBaU1REX0NPTlRFTlRTSVpFX1VOS05PV05gIGlzIHJldHVybmVkLiBCdXQgZnJh bWUgY29udGVudCBzaXplIGlzIGFsd2F5cw0KKyAqIHNldCB3aGVuIHVzaW5nIFpTVERfY29tcHJl c3MoKS4gVGhlIGRlY29tcHJlc3NlZCBzaXplIGNhbiBiZSB2ZXJ5IGxhcmdlLg0KKyAqIElmIHRo ZSBzb3VyY2UgaXMgdW50cnVzdGVkLCB0aGUgZGVjb21wcmVzc2VkIHNpemUgY291bGQgYmUgd3Jv bmcgb3INCisgKiBpbnRlbnRpb25hbGx5IG1vZGlmaWVkLiBBbHdheXMgZW5zdXJlIHRoZSByZXN1 bHQgZml0cyB3aXRoaW4gdGhlDQorICogYXBwbGljYXRpb24ncyBhdXRob3JpemVkIGxpbWl0cy4g WlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZSgpIGhhbmRsZXMgbXVsdGlwbGUNCisgKiBmcmFtZXMs IGFuZCBzbyBpdCBtdXN0IHRyYXZlcnNlIHRoZSBpbnB1dCB0byByZWFkIGVhY2ggZnJhbWUgaGVh ZGVyLiBUaGlzIGlzDQorICogZWZmaWNpZW50IGFzIG1vc3Qgb2YgdGhlIGRhdGEgaXMgc2tpcHBl ZCwgaG93ZXZlciBpdCBkb2VzIG1lYW4gdGhhdCBhbGwgZnJhbWUNCisgKiBkYXRhIG11c3QgYmUg cHJlc2VudCBhbmQgdmFsaWQuDQorICoNCisgKiBSZXR1cm46ICAgRGVjb21wcmVzc2VkIHNpemUg b2YgYWxsIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZnJhbWVzIGlmIGtub3duLg0KKyAqICAg ICAgICAgICBgWlNURF9DT05URU5UU0laRV9VTktOT1dOYCBpZiB0aGUgZGVjb21wcmVzc2VkIHNp emUgaXMgdW5rbm93bi4NCisgKiAgICAgICAgICAgYFpTVERfQ09OVEVOVFNJWkVfRVJST1JgIGlm IGFuIGVycm9yIG9jY3VycmVkLg0KKyAqLw0KK3Vuc2lnbmVkIGxvbmcgbG9uZyBaU1REX2ZpbmRE ZWNvbXByZXNzZWRTaXplKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpOw0KKw0KKy8q LSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBZHZhbmNlZCBjb21w cmVzc2lvbiBmdW5jdGlvbnMNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovDQorLyoqDQorICogWlNURF9jaGVja0NQYXJhbXMoKSAtIGVuc3VyZSBwYXJhbWV0ZXIgdmFs dWVzIHJlbWFpbiB3aXRoaW4gYXV0aG9yaXplZCByYW5nZQ0KKyAqIEBjUGFyYW1zOiBUaGUgenN0 ZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLg0KKyAqDQorICogUmV0dXJuOiAgIFplcm8gb3IgYW4g ZXJyb3IsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHVzaW5nIFpTVERfaXNFcnJvcigpLg0KKyAqLw0K K3NpemVfdCBaU1REX2NoZWNrQ1BhcmFtcyhaU1REX2NvbXByZXNzaW9uUGFyYW1ldGVycyBjUGFy YW1zKTsNCisNCisvKioNCisgKiBaU1REX2FkanVzdENQYXJhbXMoKSAtIG9wdGltaXplIHBhcmFt ZXRlcnMgZm9yIGEgZ2l2ZW4gc3JjU2l6ZSBhbmQgZGljdFNpemUNCisgKiBAc3JjU2l6ZTogIE9w dGlvbmFsbHkgdGhlIGVzdGltYXRlZCBzb3VyY2Ugc2l6ZSwgb3IgemVybyBpZiB1bmtub3duLg0K KyAqIEBkaWN0U2l6ZTogT3B0aW9uYWxseSB0aGUgZXN0aW1hdGVkIGRpY3Rpb25hcnkgc2l6ZSwg b3IgemVybyBpZiB1bmtub3duLg0KKyAqDQorICogUmV0dXJuOiAgICBUaGUgb3B0aW1pemVkIHBh cmFtZXRlcnMuDQorICovDQorWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgWlNURF9hZGp1c3RD UGFyYW1zKA0KKwlaU1REX2NvbXByZXNzaW9uUGFyYW1ldGVycyBjUGFyYW1zLCB1bnNpZ25lZCBs b25nIGxvbmcgc3JjU2l6ZSwNCisJc2l6ZV90IGRpY3RTaXplKTsNCisNCisvKi0tLSBBZHZhbmNl ZCBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucyAtLS0qLw0KKw0KKy8qKg0KKyAqIFpTVERfaXNGcmFt ZSgpIC0gcmV0dXJucyB0cnVlIGlmZiB0aGUgYnVmZmVyIHN0YXJ0cyB3aXRoIGEgdmFsaWQgZnJh bWUNCisgKiBAYnVmZmVyOiBUaGUgc291cmNlIGJ1ZmZlciB0byBjaGVjay4NCisgKiBAc2l6ZTog ICBUaGUgc2l6ZSBvZiB0aGUgc291cmNlIGJ1ZmZlciwgbXVzdCBiZSBhdCBsZWFzdCA0IGJ5dGVz Lg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmZiB0aGUgYnVmZmVyIHN0YXJ0cyB3aXRoIGEgenN0 ZCBvciBza2lwcGFibGUgZnJhbWUgaWRlbnRpZmllci4NCisgKi8NCit1bnNpZ25lZCBpbnQgWlNU RF9pc0ZyYW1lKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOw0KKw0KKy8qKg0KKyAq IFpTVERfZ2V0RGljdElEX2Zyb21EaWN0KCkgLSByZXR1cm5zIHRoZSBkaWN0aW9uYXJ5IGlkIHN0 b3JlZCBpbiBhIGRpY3Rpb25hcnkNCisgKiBAZGljdDogICAgIFRoZSBkaWN0aW9uYXJ5IGJ1ZmZl ci4NCisgKiBAZGljdFNpemU6IFRoZSBzaXplIG9mIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlci4NCisg Kg0KKyAqIFJldHVybjogICAgVGhlIGRpY3Rpb25hcnkgaWQgc3RvcmVkIHdpdGhpbiB0aGUgZGlj dGlvbmFyeSBvciAwIGlmIHRoZQ0KKyAqICAgICAgICAgICAgZGljdGlvbmFyeSBpcyBub3QgYSB6 c3RkIGRpY3Rpb25hcnkuIElmIGl0IHJldHVybnMgMCB0aGUNCisgKiAgICAgICAgICAgIGRpY3Rp b25hcnkgY2FuIHN0aWxsIGJlIGxvYWRlZCBhcyBhIGNvbnRlbnQtb25seSBkaWN0aW9uYXJ5Lg0K KyAqLw0KK3Vuc2lnbmVkIGludCBaU1REX2dldERpY3RJRF9mcm9tRGljdChjb25zdCB2b2lkICpk aWN0LCBzaXplX3QgZGljdFNpemUpOw0KKw0KKy8qKg0KKyAqIFpTVERfZ2V0RGljdElEX2Zyb21E RGljdCgpIC0gcmV0dXJucyB0aGUgZGljdGlvbmFyeSBpZCBzdG9yZWQgaW4gYSBaU1REX0REaWN0 DQorICogQGRkaWN0OiBUaGUgZGRpY3QgdG8gZmluZCB0aGUgaWQgb2YuDQorICoNCisgKiBSZXR1 cm46IFRoZSBkaWN0aW9uYXJ5IGlkIHN0b3JlZCB3aXRoaW4gYGRkaWN0YCBvciAwIGlmIHRoZSBk aWN0aW9uYXJ5IGlzIG5vdA0KKyAqICAgICAgICAgYSB6c3RkIGRpY3Rpb25hcnkuIElmIGl0IHJl dHVybnMgMCBgZGRpY3RgIHdpbGwgYmUgbG9hZGVkIGFzIGENCisgKiAgICAgICAgIGNvbnRlbnQt b25seSBkaWN0aW9uYXJ5Lg0KKyAqLw0KK3Vuc2lnbmVkIGludCBaU1REX2dldERpY3RJRF9mcm9t RERpY3QoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOw0KKw0KKy8qKg0KKyAqIFpTVERfZ2V0RGlj dElEX2Zyb21GcmFtZSgpIC0gcmV0dXJucyB0aGUgZGljdGlvbmFyeSBpZCBzdG9yZWQgaW4gYSB6 c3RkIGZyYW1lDQorICogQHNyYzogICAgIFNvdXJjZSBidWZmZXIuIEl0IG11c3QgYmUgYSB6c3Rk IGVuY29kZWQgZnJhbWUuDQorICogQHNyY1NpemU6IFRoZSBzaXplIG9mIHRoZSBzb3VyY2UgYnVm ZmVyLiBJdCBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZQ0KKyAqICAgICAgICAgICBm cmFtZSBoZWFkZXIuIGBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9tYXhgIGlzIGFsd2F5cyBsYXJnZSBl bm91Z2guDQorICoNCisgKiBSZXR1cm46ICAgVGhlIGRpY3Rpb25hcnkgaWQgcmVxdWlyZWQgdG8g ZGVjb21wcmVzcyB0aGUgZnJhbWUgc3RvcmVkIHdpdGhpbg0KKyAqICAgICAgICAgICBgc3JjYCBv ciAwIGlmIHRoZSBkaWN0aW9uYXJ5IGlkIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiBJdCBjYW4gcmV0 dXJuDQorICogICAgICAgICAgIDAgaWYgdGhlIGZyYW1lIGRvZXMgbm90IHJlcXVpcmUgYSBkaWN0 aW9uYXJ5LCB0aGUgZGljdGlvbmFyeSBpZA0KKyAqICAgICAgICAgICB3YXNuJ3Qgc3RvcmVkIGlu IHRoZSBmcmFtZSwgYHNyY2AgaXMgbm90IGEgenN0ZCBmcmFtZSwgb3IgYHNyY1NpemVgDQorICog ICAgICAgICAgIGlzIHRvbyBzbWFsbC4NCisgKi8NCit1bnNpZ25lZCBpbnQgWlNURF9nZXREaWN0 SURfZnJvbUZyYW1lKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpOw0KKw0KKy8qKg0K KyAqIHN0cnVjdCBaU1REX2ZyYW1lUGFyYW1zIC0genN0ZCBmcmFtZSBwYXJhbWV0ZXJzIHN0b3Jl ZCBpbiB0aGUgZnJhbWUgaGVhZGVyDQorICogQGZyYW1lQ29udGVudFNpemU6IFRoZSBmcmFtZSBj b250ZW50IHNpemUsIG9yIDAgaWYgbm90IHByZXNlbnQuDQorICogQHdpbmRvd1NpemU6ICAgICAg IFRoZSB3aW5kb3cgc2l6ZSwgb3IgMCBpZiB0aGUgZnJhbWUgaXMgYSBza2lwcGFibGUgZnJhbWUu DQorICogQGRpY3RJRDogICAgICAgICAgIFRoZSBkaWN0aW9uYXJ5IGlkLCBvciAwIGlmIG5vdCBw cmVzZW50Lg0KKyAqIEBjaGVja3N1bUZsYWc6ICAgICBXaGV0aGVyIGEgY2hlY2tzdW0gd2FzIHVz ZWQuDQorICovDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwl1bnNpZ25lZCBsb25nIGxvbmcgZnJhbWVD b250ZW50U2l6ZTsNCisJdW5zaWduZWQgaW50IHdpbmRvd1NpemU7DQorCXVuc2lnbmVkIGludCBk aWN0SUQ7DQorCXVuc2lnbmVkIGludCBjaGVja3N1bUZsYWc7DQorfSBaU1REX2ZyYW1lUGFyYW1z Ow0KKw0KKy8qKg0KKyAqIFpTVERfZ2V0RnJhbWVQYXJhbXMoKSAtIGV4dHJhY3RzIHBhcmFtZXRl cnMgZnJvbSBhIHpzdGQgb3Igc2tpcHBhYmxlIGZyYW1lDQorICogQGZwYXJhbXNQdHI6IE9uIHN1 Y2Nlc3MgdGhlIGZyYW1lIHBhcmFtZXRlcnMgYXJlIHdyaXR0ZW4gaGVyZS4NCisgKiBAc3JjOiAg ICAgICAgVGhlIHNvdXJjZSBidWZmZXIuIEl0IG11c3QgcG9pbnQgdG8gYSB6c3RkIG9yIHNraXBw YWJsZSBmcmFtZS4NCisgKiBAc3JjU2l6ZTogICAgVGhlIHNpemUgb2YgdGhlIHNvdXJjZSBidWZm ZXIuIGBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9tYXhgIGlzDQorICogICAgICAgICAgICAgIGFsd2F5 cyBsYXJnZSBlbm91Z2ggdG8gc3VjY2VlZC4NCisgKg0KKyAqIFJldHVybjogICAgICAwIG9uIHN1 Y2Nlc3MuIElmIG1vcmUgZGF0YSBpcyByZXF1aXJlZCBpdCByZXR1cm5zIGhvdyBtYW55IGJ5dGVz DQorICogICAgICAgICAgICAgIG11c3QgYmUgcHJvdmlkZWQgdG8gbWFrZSBmb3J3YXJkIHByb2dy ZXNzLiBPdGhlcndpc2UgaXQgcmV0dXJucw0KKyAqICAgICAgICAgICAgICBhbiBlcnJvciwgd2hp Y2ggY2FuIGJlIGNoZWNrZWQgdXNpbmcgWlNURF9pc0Vycm9yKCkuDQorICovDQorc2l6ZV90IFpT VERfZ2V0RnJhbWVQYXJhbXMoWlNURF9mcmFtZVBhcmFtcyAqZnBhcmFtc1B0ciwgY29uc3Qgdm9p ZCAqc3JjLA0KKwlzaXplX3Qgc3JjU2l6ZSk7DQorDQorLyotKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioN CisgKiBCdWZmZXItbGVzcyBhbmQgc3luY2hyb25vdXMgaW5uZXIgc3RyZWFtaW5nIGZ1bmN0aW9u cw0KKyAqDQorICogVGhpcyBpcyBhbiBhZHZhbmNlZCBBUEksIGdpdmluZyBmdWxsIGNvbnRyb2wg b3ZlciBidWZmZXIgbWFuYWdlbWVudCwgZm9yDQorICogdXNlcnMgd2hpY2ggbmVlZCBkaXJlY3Qg Y29udHJvbCBvdmVyIG1lbW9yeS4NCisgKiBCdXQgaXQncyBhbHNvIGEgY29tcGxleCBvbmUsIHdp dGggbWFueSByZXN0cmljdGlvbnMgKGRvY3VtZW50ZWQgYmVsb3cpLg0KKyAqIFByZWZlciB1c2lu ZyBub3JtYWwgc3RyZWFtaW5nIEFQSSBmb3IgYW4gZWFzaWVyIGV4cGVyaWVuY2UNCisgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLw0KKw0KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQnVmZmVy LWxlc3Mgc3RyZWFtaW5nIGNvbXByZXNzaW9uIChzeW5jaHJvbm91cyBtb2RlKQ0KKyAqDQorICog QSBaU1REX0NDdHggb2JqZWN0IGlzIHJlcXVpcmVkIHRvIHRyYWNrIHN0cmVhbWluZyBvcGVyYXRp b25zLg0KKyAqIFVzZSBaU1REX2luaXRDQ3R4KCkgdG8gaW5pdGlhbGl6ZSBhIGNvbnRleHQuDQor ICogWlNURF9DQ3R4IG9iamVjdCBjYW4gYmUgcmUtdXNlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4g c3VjY2Vzc2l2ZSBjb21wcmVzc2lvbg0KKyAqIG9wZXJhdGlvbnMuDQorICoNCisgKiBTdGFydCBi eSBpbml0aWFsaXppbmcgYSBjb250ZXh0Lg0KKyAqIFVzZSBaU1REX2NvbXByZXNzQmVnaW4oKSwg b3IgWlNURF9jb21wcmVzc0JlZ2luX3VzaW5nRGljdCgpIGZvciBkaWN0aW9uYXJ5DQorICogY29t cHJlc3Npb24sDQorICogb3IgWlNURF9jb21wcmVzc0JlZ2luX2FkdmFuY2VkKCksIGZvciBmaW5l ciBwYXJhbWV0ZXIgY29udHJvbC4NCisgKiBJdCdzIGFsc28gcG9zc2libGUgdG8gZHVwbGljYXRl IGEgcmVmZXJlbmNlIGNvbnRleHQgd2hpY2ggaGFzIGFscmVhZHkgYmVlbg0KKyAqIGluaXRpYWxp emVkLCB1c2luZyBaU1REX2NvcHlDQ3R4KCkNCisgKg0KKyAqIFRoZW4sIGNvbnN1bWUgeW91ciBp bnB1dCB1c2luZyBaU1REX2NvbXByZXNzQ29udGludWUoKS4NCisgKiBUaGVyZSBhcmUgc29tZSBp bXBvcnRhbnQgY29uc2lkZXJhdGlvbnMgdG8ga2VlcCBpbiBtaW5kIHdoZW4gdXNpbmcgdGhpcw0K KyAqIGFkdmFuY2VkIGZ1bmN0aW9uIDoNCisgKiAtIFpTVERfY29tcHJlc3NDb250aW51ZSgpIGhh cyBubyBpbnRlcm5hbCBidWZmZXIuIEl0IHVzZXMgZXh0ZXJuYWxseSBwcm92aWRlZA0KKyAqICAg YnVmZmVyIG9ubHkuDQorICogLSBJbnRlcmZhY2UgaXMgc3luY2hyb25vdXMgOiBpbnB1dCBpcyBj b25zdW1lZCBlbnRpcmVseSBhbmQgcHJvZHVjZSAxKw0KKyAqICAgKG9yIG1vcmUpIGNvbXByZXNz ZWQgYmxvY2tzLg0KKyAqIC0gQ2FsbGVyIG11c3QgZW5zdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFj ZSBpbiBgZHN0YCB0byBzdG9yZSBjb21wcmVzc2VkIGRhdGENCisgKiAgIHVuZGVyIHdvcnN0IGNh c2Ugc2NlbmFyaW8uIFdvcnN0IGNhc2UgZXZhbHVhdGlvbiBpcyBwcm92aWRlZCBieQ0KKyAqICAg WlNURF9jb21wcmVzc0JvdW5kKCkuDQorICogICBaU1REX2NvbXByZXNzQ29udGludWUoKSBkb2Vz bid0IGd1YXJhbnRlZSByZWNvdmVyIGFmdGVyIGEgZmFpbGVkDQorICogICBjb21wcmVzc2lvbi4N CisgKiAtIFpTVERfY29tcHJlc3NDb250aW51ZSgpIHByZXN1bWVzIHByaW9yIGlucHV0ICoqKmlz IHN0aWxsIGFjY2Vzc2libGUgYW5kDQorICogICB1bm1vZGlmaWVkKioqICh1cCB0byBtYXhpbXVt IGRpc3RhbmNlIHNpemUsIHNlZSBXaW5kb3dMb2cpLg0KKyAqICAgSXQgcmVtZW1iZXJzIGFsbCBw cmV2aW91cyBjb250aWd1b3VzIGJsb2NrcywgcGx1cyBvbmUgc2VwYXJhdGVkIG1lbW9yeQ0KKyAq ICAgc2VnbWVudCAod2hpY2ggY2FuIGl0c2VsZiBjb25zaXN0cyBvZiBtdWx0aXBsZSBjb250aWd1 b3VzIGJsb2NrcykNCisgKiAtIFpTVERfY29tcHJlc3NDb250aW51ZSgpIGRldGVjdHMgdGhhdCBw cmlvciBpbnB1dCBoYXMgYmVlbiBvdmVyd3JpdHRlbiB3aGVuDQorICogICBgc3JjYCBidWZmZXIg b3ZlcmxhcHMuIEluIHdoaWNoIGNhc2UsIGl0IHdpbGwgImRpc2NhcmQiIHRoZSByZWxldmFudCBt ZW1vcnkNCisgKiAgIHNlY3Rpb24gZnJvbSBpdHMgaGlzdG9yeS4NCisgKg0KKyAqIEZpbmlzaCBh IGZyYW1lIHdpdGggWlNURF9jb21wcmVzc0VuZCgpLCB3aGljaCB3aWxsIHdyaXRlIHRoZSBsYXN0 IGJsb2NrKHMpDQorICogYW5kIG9wdGlvbmFsIGNoZWNrc3VtLiBJdCdzIHBvc3NpYmxlIHRvIHVz ZSBzcmNTaXplPT0wLCBpbiB3aGljaCBjYXNlLCBpdA0KKyAqIHdpbGwgd3JpdGUgYSBmaW5hbCBl bXB0eSBibG9jayB0byBlbmQgdGhlIGZyYW1lLiBXaXRob3V0IGxhc3QgYmxvY2sgbWFyaywNCisg KiBmcmFtZXMgd2lsbCBiZSBjb25zaWRlcmVkIHVuZmluaXNoZWQgKGNvcnJ1cHRlZCkgYnkgZGVj b2RlcnMuDQorICoNCisgKiBgWlNURF9DQ3R4YCBvYmplY3QgY2FuIGJlIHJlLXVzZWQgKFpTVERf Y29tcHJlc3NCZWdpbigpKSB0byBjb21wcmVzcyBzb21lIG5ldw0KKyAqIGZyYW1lLg0KKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovDQorDQorLyo9PT09PSAgIEJ1ZmZlci1sZXNzIHN0cmVhbWluZyBj b21wcmVzc2lvbiBmdW5jdGlvbnMgID09PT09Ki8NCitzaXplX3QgWlNURF9jb21wcmVzc0JlZ2lu KFpTVERfQ0N0eCAqY2N0eCwgaW50IGNvbXByZXNzaW9uTGV2ZWwpOw0KK3NpemVfdCBaU1REX2Nv bXByZXNzQmVnaW5fdXNpbmdEaWN0KFpTVERfQ0N0eCAqY2N0eCwgY29uc3Qgdm9pZCAqZGljdCwN CisJc2l6ZV90IGRpY3RTaXplLCBpbnQgY29tcHJlc3Npb25MZXZlbCk7DQorc2l6ZV90IFpTVERf Y29tcHJlc3NCZWdpbl9hZHZhbmNlZChaU1REX0NDdHggKmNjdHgsIGNvbnN0IHZvaWQgKmRpY3Qs DQorCXNpemVfdCBkaWN0U2l6ZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcywNCisJdW5zaWduZWQg bG9uZyBsb25nIHBsZWRnZWRTcmNTaXplKTsNCitzaXplX3QgWlNURF9jb3B5Q0N0eChaU1REX0ND dHggKmNjdHgsIGNvbnN0IFpTVERfQ0N0eCAqcHJlcGFyZWRDQ3R4LA0KKwl1bnNpZ25lZCBsb25n IGxvbmcgcGxlZGdlZFNyY1NpemUpOw0KK3NpemVfdCBaU1REX2NvbXByZXNzQmVnaW5fdXNpbmdD RGljdChaU1REX0NDdHggKmNjdHgsIGNvbnN0IFpTVERfQ0RpY3QgKmNkaWN0LA0KKwl1bnNpZ25l ZCBsb25nIGxvbmcgcGxlZGdlZFNyY1NpemUpOw0KK3NpemVfdCBaU1REX2NvbXByZXNzQ29udGlu dWUoWlNURF9DQ3R4ICpjY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwNCisJY29u c3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSk7DQorc2l6ZV90IFpTVERfY29tcHJlc3NFbmQo WlNURF9DQ3R4ICpjY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwNCisJY29uc3Qg dm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSk7DQorDQorDQorDQorLyotKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioNCisgKiBCdWZmZXItbGVzcyBzdHJlYW1pbmcgZGVjb21wcmVzc2lvbiAoc3luY2hyb25v dXMgbW9kZSkNCisgKg0KKyAqIEEgWlNURF9EQ3R4IG9iamVjdCBpcyByZXF1aXJlZCB0byB0cmFj ayBzdHJlYW1pbmcgb3BlcmF0aW9ucy4NCisgKiBVc2UgWlNURF9pbml0REN0eCgpIHRvIGluaXRp YWxpemUgYSBjb250ZXh0Lg0KKyAqIEEgWlNURF9EQ3R4IG9iamVjdCBjYW4gYmUgcmUtdXNlZCBt dWx0aXBsZSB0aW1lcy4NCisgKg0KKyAqIEZpcnN0IHR5cGljYWwgb3BlcmF0aW9uIGlzIHRvIHJl dHJpZXZlIGZyYW1lIHBhcmFtZXRlcnMsIHVzaW5nDQorICogWlNURF9nZXRGcmFtZVBhcmFtcygp LiBJdCBmaWxscyBhIFpTVERfZnJhbWVQYXJhbXMgc3RydWN0dXJlIHdoaWNoIHByb3ZpZGUNCisg KiBpbXBvcnRhbnQgaW5mb3JtYXRpb24gdG8gY29ycmVjdGx5IGRlY29kZSB0aGUgZnJhbWUsIHN1 Y2ggYXMgdGhlIG1pbmltdW0NCisgKiByb2xsaW5nIGJ1ZmZlciBzaXplIHRvIGFsbG9jYXRlIHRv IGRlY29tcHJlc3MgZGF0YSAoYHdpbmRvd1NpemVgKSwgYW5kIHRoZQ0KKyAqIGRpY3Rpb25hcnkg SUQgdXNlZC4NCisgKiBOb3RlOiBjb250ZW50IHNpemUgaXMgb3B0aW9uYWwsIGl0IG1heSBub3Qg YmUgcHJlc2VudC4gMCBtZWFucyB1bmtub3duLg0KKyAqIE5vdGUgdGhhdCB0aGVzZSB2YWx1ZXMg Y291bGQgYmUgd3JvbmcsIGVpdGhlciBiZWNhdXNlIG9mIGRhdGEgbWFsZm9ybWF0aW9uLA0KKyAq IG9yIGJlY2F1c2UgYW4gYXR0YWNrZXIgaXMgc3Bvb2ZpbmcgZGVsaWJlcmF0ZSBmYWxzZSBpbmZv cm1hdGlvbi4gQXMgYQ0KKyAqIGNvbnNlcXVlbmNlLCBjaGVjayB0aGF0IHZhbHVlcyByZW1haW4g d2l0aGluIHZhbGlkIGFwcGxpY2F0aW9uIHJhbmdlLA0KKyAqIGVzcGVjaWFsbHkgYHdpbmRvd1Np emVgLCBiZWZvcmUgYWxsb2NhdGlvbi4gRWFjaCBhcHBsaWNhdGlvbiBjYW4gc2V0IGl0cyBvd24N CisgKiBsaW1pdCwgZGVwZW5kaW5nIG9uIGxvY2FsIHJlc3RyaWN0aW9ucy4gRm9yIGV4dGVuZGVk IGludGVyb3BlcmFiaWxpdHksIGl0IGlzDQorICogcmVjb21tZW5kZWQgdG8gc3VwcG9ydCBhdCBs ZWFzdCA4IE1CLg0KKyAqIEZyYW1lIHBhcmFtZXRlcnMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBi ZWdpbm5pbmcgb2YgdGhlIGNvbXByZXNzZWQgZnJhbWUuDQorICogRGF0YSBmcmFnbWVudCBtdXN0 IGJlIGxhcmdlIGVub3VnaCB0byBlbnN1cmUgc3VjY2Vzc2Z1bCBkZWNvZGluZywgdHlwaWNhbGx5 DQorICogYFpTVERfZnJhbWVIZWFkZXJTaXplX21heGAgYnl0ZXMuDQorICogUmVzdWx0OiAwOiBz dWNjZXNzZnVsIGRlY29kaW5nLCB0aGUgYFpTVERfZnJhbWVQYXJhbXNgIHN0cnVjdHVyZSBpcyBm aWxsZWQuDQorICogICAgICAgID4wOiBgc3JjU2l6ZWAgaXMgdG9vIHNtYWxsLCBwcm92aWRlIGF0 IGxlYXN0IHRoaXMgbWFueSBieXRlcy4NCisgKiAgICAgICAgZXJyb3JDb2RlLCB3aGljaCBjYW4g YmUgdGVzdGVkIHVzaW5nIFpTVERfaXNFcnJvcigpLg0KKyAqDQorICogU3RhcnQgZGVjb21wcmVz c2lvbiwgd2l0aCBaU1REX2RlY29tcHJlc3NCZWdpbigpIG9yDQorICogWlNURF9kZWNvbXByZXNz QmVnaW5fdXNpbmdEaWN0KCkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY29weSBhIHByZXBhcmVk DQorICogY29udGV4dCwgdXNpbmcgWlNURF9jb3B5REN0eCgpLg0KKyAqDQorICogVGhlbiB1c2Ug WlNURF9uZXh0U3JjU2l6ZVRvRGVjb21wcmVzcygpIGFuZCBaU1REX2RlY29tcHJlc3NDb250aW51 ZSgpDQorICogYWx0ZXJuYXRpdmVseS4NCisgKiBaU1REX25leHRTcmNTaXplVG9EZWNvbXByZXNz KCkgdGVsbHMgaG93IG1hbnkgYnl0ZXMgdG8gcHJvdmlkZSBhcyAnc3JjU2l6ZScNCisgKiB0byBa U1REX2RlY29tcHJlc3NDb250aW51ZSgpLg0KKyAqIFpTVERfZGVjb21wcmVzc0NvbnRpbnVlKCkg cmVxdWlyZXMgdGhpcyBfZXhhY3RfIGFtb3VudCBvZiBieXRlcywgb3IgaXQgd2lsbA0KKyAqIGZh aWwuDQorICoNCisgKiBUaGUgcmVzdWx0IG9mIFpTVERfZGVjb21wcmVzc0NvbnRpbnVlKCkgaXMg dGhlIG51bWJlciBvZiBieXRlcyByZWdlbmVyYXRlZA0KKyAqIHdpdGhpbiAnZHN0JyAobmVjZXNz YXJpbHkgPD0gZHN0Q2FwYWNpdHkpLiBJdCBjYW4gYmUgemVybywgd2hpY2ggaXMgbm90IGFuDQor ICogZXJyb3I7IGl0IGp1c3QgbWVhbnMgWlNURF9kZWNvbXByZXNzQ29udGludWUoKSBoYXMgZGVj b2RlZCBzb21lIG1ldGFkYXRhDQorICogaXRlbS4gSXQgY2FuIGFsc28gYmUgYW4gZXJyb3IgY29k ZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB3aXRoIFpTVERfaXNFcnJvcigpLg0KKyAqDQorICogWlNU RF9kZWNvbXByZXNzQ29udGludWUoKSBuZWVkcyBwcmV2aW91cyBkYXRhIGJsb2NrcyBkdXJpbmcg ZGVjb21wcmVzc2lvbiwgdXANCisgKiB0byBgd2luZG93U2l6ZWAuIFRoZXkgc2hvdWxkIHByZWZl cmFibHkgYmUgbG9jYXRlZCBjb250aWd1b3VzbHksIHByaW9yIHRvDQorICogY3VycmVudCBibG9j ay4gQWx0ZXJuYXRpdmVseSwgYSByb3VuZCBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIGlzIGFs c28NCisgKiBwb3NzaWJsZS4gU3VmZmljaWVudCBzaXplIGlzIGRldGVybWluZWQgYnkgZnJhbWUg cGFyYW1ldGVycy4NCisgKiBaU1REX2RlY29tcHJlc3NDb250aW51ZSgpIGlzIHZlcnkgc2Vuc2l0 aXZlIHRvIGNvbnRpZ3VpdHksIGlmIDIgYmxvY2tzIGRvbid0DQorICogZm9sbG93IGVhY2ggb3Ro ZXIsIG1ha2Ugc3VyZSB0aGF0IGVpdGhlciB0aGUgY29tcHJlc3NvciBicmVha3MgY29udGlndWl0 eSBhdA0KKyAqIHRoZSBzYW1lIHBsYWNlLCBvciB0aGF0IHByZXZpb3VzIGNvbnRpZ3VvdXMgc2Vn bWVudCBpcyBsYXJnZSBlbm91Z2ggdG8NCisgKiBwcm9wZXJseSBoYW5kbGUgbWF4aW11bSBiYWNr LXJlZmVyZW5jZS4NCisgKg0KKyAqIEEgZnJhbWUgaXMgZnVsbHkgZGVjb2RlZCB3aGVuIFpTVERf bmV4dFNyY1NpemVUb0RlY29tcHJlc3MoKSByZXR1cm5zIHplcm8uDQorICogQ29udGV4dCBjYW4g dGhlbiBiZSByZXNldCB0byBzdGFydCBhIG5ldyBkZWNvbXByZXNzaW9uLg0KKyAqDQorICogTm90 ZTogaXQncyBwb3NzaWJsZSB0byBrbm93IGlmIG5leHQgaW5wdXQgdG8gcHJlc2VudCBpcyBhIGhl YWRlciBvciBhIGJsb2NrLA0KKyAqIHVzaW5nIFpTVERfbmV4dElucHV0VHlwZSgpLiBUaGlzIGlu Zm9ybWF0aW9uIGlzIG5vdCByZXF1aXJlZCB0byBwcm9wZXJseQ0KKyAqIGRlY29kZSBhIGZyYW1l Lg0KKyAqDQorICogPT0gU3BlY2lhbCBjYXNlOiBza2lwcGFibGUgZnJhbWVzID09DQorICoNCisg KiBTa2lwcGFibGUgZnJhbWVzIGFsbG93IGludGVncmF0aW9uIG9mIHVzZXItZGVmaW5lZCBkYXRh IGludG8gYSBmbG93IG9mDQorICogY29uY2F0ZW5hdGVkIGZyYW1lcy4gU2tpcHBhYmxlIGZyYW1l cyB3aWxsIGJlIGlnbm9yZWQgKHNraXBwZWQpIGJ5IGENCisgKiBkZWNvbXByZXNzb3IuIFRoZSBm b3JtYXQgb2Ygc2tpcHBhYmxlIGZyYW1lcyBpcyBhcyBmb2xsb3dzOg0KKyAqIGEpIFNraXBwYWJs ZSBmcmFtZSBJRCAtIDQgQnl0ZXMsIExpdHRsZSBlbmRpYW4gZm9ybWF0LCBhbnkgdmFsdWUgZnJv bQ0KKyAqICAgIDB4MTg0RDJBNTAgdG8gMHgxODREMkE1Rg0KKyAqIGIpIEZyYW1lIFNpemUgLSA0 IEJ5dGVzLCBMaXR0bGUgZW5kaWFuIGZvcm1hdCwgdW5zaWduZWQgMzItYml0cw0KKyAqIGMpIEZy YW1lIENvbnRlbnQgLSBhbnkgY29udGVudCAoVXNlciBEYXRhKSBvZiBsZW5ndGggZXF1YWwgdG8g RnJhbWUgU2l6ZQ0KKyAqIEZvciBza2lwcGFibGUgZnJhbWVzIFpTVERfZGVjb21wcmVzc0NvbnRp bnVlKCkgYWx3YXlzIHJldHVybnMgMC4NCisgKiBGb3Igc2tpcHBhYmxlIGZyYW1lcyBaU1REX2dl dEZyYW1lUGFyYW1zKCkgcmV0dXJucyBmcGFyYW1zUHRyLT53aW5kb3dMb2c9PTANCisgKiB3aGF0 IG1lYW5zIHRoYXQgYSBmcmFtZSBpcyBza2lwcGFibGUuDQorICogTm90ZTogSWYgZnBhcmFtc1B0 ci0+ZnJhbWVDb250ZW50U2l6ZT09MCwgaXQgaXMgYW1iaWd1b3VzOiB0aGUgZnJhbWUgbWlnaHQN CisgKiAgICAgICBhY3R1YWxseSBiZSBhIHpzdGQgZW5jb2RlZCBmcmFtZSB3aXRoIG5vIGNvbnRl bnQuIEZvciBwdXJwb3NlcyBvZg0KKyAqICAgICAgIGRlY29tcHJlc3Npb24sIGl0IGlzIHZhbGlk IGluIGJvdGggY2FzZXMgdG8gc2tpcCB0aGUgZnJhbWUgdXNpbmcNCisgKiAgICAgICBaU1REX2Zp bmRGcmFtZUNvbXByZXNzZWRTaXplKCkgdG8gZmluZCBpdHMgc2l6ZSBpbiBieXRlcy4NCisgKiBJ dCBhbHNvIHJldHVybnMgZnJhbWUgc2l6ZSBhcyBmcGFyYW1zUHRyLT5mcmFtZUNvbnRlbnRTaXpl Lg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorLyo9PT09PSAgIEJ1ZmZlci1sZXNzIHN0 cmVhbWluZyBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucyAgPT09PT0qLw0KK3NpemVfdCBaU1REX2Rl Y29tcHJlc3NCZWdpbihaU1REX0RDdHggKmRjdHgpOw0KK3NpemVfdCBaU1REX2RlY29tcHJlc3NC ZWdpbl91c2luZ0RpY3QoWlNURF9EQ3R4ICpkY3R4LCBjb25zdCB2b2lkICpkaWN0LA0KKwlzaXpl X3QgZGljdFNpemUpOw0KK3ZvaWQgICBaU1REX2NvcHlEQ3R4KFpTVERfREN0eCAqZGN0eCwgY29u c3QgWlNURF9EQ3R4ICpwcmVwYXJlZERDdHgpOw0KK3NpemVfdCBaU1REX25leHRTcmNTaXplVG9E ZWNvbXByZXNzKFpTVERfREN0eCAqZGN0eCk7DQorc2l6ZV90IFpTVERfZGVjb21wcmVzc0NvbnRp bnVlKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksDQorCWNv bnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpOw0KK3R5cGVkZWYgZW51bSB7DQorCVpTVERu aXRfZnJhbWVIZWFkZXIsDQorCVpTVERuaXRfYmxvY2tIZWFkZXIsDQorCVpTVERuaXRfYmxvY2ss DQorCVpTVERuaXRfbGFzdEJsb2NrLA0KKwlaU1REbml0X2NoZWNrc3VtLA0KKwlaU1REbml0X3Nr aXBwYWJsZUZyYW1lDQorfSBaU1REX25leHRJbnB1dFR5cGVfZTsNCitaU1REX25leHRJbnB1dFR5 cGVfZSBaU1REX25leHRJbnB1dFR5cGUoWlNURF9EQ3R4ICpkY3R4KTsNCisNCisvKi0qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KKyAqIEJsb2NrIGZ1bmN0aW9ucw0KKyAqDQorICogQmxvY2sgZnVuY3Rp b25zIHByb2R1Y2UgYW5kIGRlY29kZSByYXcgenN0ZCBibG9ja3MsIHdpdGhvdXQgZnJhbWUgbWV0 YWRhdGEuDQorICogRnJhbWUgbWV0YWRhdGEgY29zdCBpcyB0eXBpY2FsbHkgfjE4IGJ5dGVzLCB3 aGljaCBjYW4gYmUgbm9uLW5lZ2xpZ2libGUgZm9yDQorICogdmVyeSBzbWFsbCBibG9ja3MgKDwg MTAwIGJ5dGVzKS4gVXNlciB3aWxsIGhhdmUgdG8gdGFrZSBpbiBjaGFyZ2UgcmVxdWlyZWQNCisg KiBpbmZvcm1hdGlvbiB0byByZWdlbmVyYXRlIGRhdGEsIHN1Y2ggYXMgY29tcHJlc3NlZCBhbmQg Y29udGVudCBzaXplcy4NCisgKg0KKyAqIEEgZmV3IHJ1bGVzIHRvIHJlc3BlY3Q6DQorICogLSBD b21wcmVzc2luZyBhbmQgZGVjb21wcmVzc2luZyByZXF1aXJlIGEgY29udGV4dCBzdHJ1Y3R1cmUN CisgKiAgICsgVXNlIFpTVERfaW5pdENDdHgoKSBhbmQgWlNURF9pbml0REN0eCgpDQorICogLSBJ dCBpcyBuZWNlc3NhcnkgdG8gaW5pdCBjb250ZXh0IGJlZm9yZSBzdGFydGluZw0KKyAqICAgKyBj b21wcmVzc2lvbiA6IFpTVERfY29tcHJlc3NCZWdpbigpDQorICogICArIGRlY29tcHJlc3Npb24g OiBaU1REX2RlY29tcHJlc3NCZWdpbigpDQorICogICArIHZhcmlhbnRzIF91c2luZ0RpY3QoKSBh cmUgYWxzbyBhbGxvd2VkDQorICogICArIGNvcHlDQ3R4KCkgYW5kIGNvcHlEQ3R4KCkgd29yayB0 b28NCisgKiAtIEJsb2NrIHNpemUgaXMgbGltaXRlZCwgaXQgbXVzdCBiZSA8PSBaU1REX2dldEJs b2NrU2l6ZU1heCgpDQorICogICArIElmIHlvdSBuZWVkIHRvIGNvbXByZXNzIG1vcmUsIGN1dCBk YXRhIGludG8gbXVsdGlwbGUgYmxvY2tzDQorICogICArIENvbnNpZGVyIHVzaW5nIHRoZSByZWd1 bGFyIFpTVERfY29tcHJlc3MoKSBpbnN0ZWFkLCBhcyBmcmFtZSBtZXRhZGF0YQ0KKyAqICAgICBj b3N0cyBiZWNvbWUgbmVnbGlnaWJsZSB3aGVuIHNvdXJjZSBzaXplIGlzIGxhcmdlLg0KKyAqIC0g V2hlbiBhIGJsb2NrIGlzIGNvbnNpZGVyZWQgbm90IGNvbXByZXNzaWJsZSBlbm91Z2gsIFpTVERf Y29tcHJlc3NCbG9jaygpDQorICogICByZXN1bHQgd2lsbCBiZSB6ZXJvLiBJbiB3aGljaCBjYXNl LCBub3RoaW5nIGlzIHByb2R1Y2VkIGludG8gYGRzdGAuDQorICogICArIFVzZXIgbXVzdCB0ZXN0 IGZvciBzdWNoIG91dGNvbWUgYW5kIGRlYWwgZGlyZWN0bHkgd2l0aCB1bmNvbXByZXNzZWQgZGF0 YQ0KKyAqICAgKyBaU1REX2RlY29tcHJlc3NCbG9jaygpIGRvZXNuJ3QgYWNjZXB0IHVuY29tcHJl c3NlZCBkYXRhIGFzIGlucHV0ISEhDQorICogICArIEluIGNhc2Ugb2YgbXVsdGlwbGUgc3VjY2Vz c2l2ZSBibG9ja3MsIGRlY29kZXIgbXVzdCBiZSBpbmZvcm1lZCBvZg0KKyAqICAgICB1bmNvbXBy ZXNzZWQgYmxvY2sgZXhpc3RlbmNlIHRvIGZvbGxvdyBwcm9wZXIgaGlzdG9yeS4gVXNlDQorICog ICAgIFpTVERfaW5zZXJ0QmxvY2soKSBpbiBzdWNoIGEgY2FzZS4NCisgKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLw0KKw0KKy8qIERlZmluZSBmb3Igc3RhdGljIGFsbG9jYXRpb24gKi8NCisjZGVmaW5l IFpTVERfQkxPQ0tTSVpFX0FCU09MVVRFTUFYICgxMjggKiAxMDI0KQ0KKy8qPT09PT0gICBSYXcg enN0ZCBibG9jayBmdW5jdGlvbnMgID09PT09Ki8NCitzaXplX3QgWlNURF9nZXRCbG9ja1NpemVN YXgoWlNURF9DQ3R4ICpjY3R4KTsNCitzaXplX3QgWlNURF9jb21wcmVzc0Jsb2NrKFpTVERfQ0N0 eCAqY2N0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksDQorCWNvbnN0IHZvaWQgKnNy Yywgc2l6ZV90IHNyY1NpemUpOw0KK3NpemVfdCBaU1REX2RlY29tcHJlc3NCbG9jayhaU1REX0RD dHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LA0KKwljb25zdCB2b2lkICpz cmMsIHNpemVfdCBzcmNTaXplKTsNCitzaXplX3QgWlNURF9pbnNlcnRCbG9jayhaU1REX0RDdHgg KmRjdHgsIGNvbnN0IHZvaWQgKmJsb2NrU3RhcnQsDQorCXNpemVfdCBibG9ja1NpemUpOw0KKw0K KyNlbmRpZiAgLyogWlNURF9IICovDQotLSANCjIuMjYuMg0KDQo= --8323328-1543918517-1606172471=:3753 Content-Type: text/plain; charset=US-ASCII; name=0002-adapt-kernel-code-for-use-in-xen-dom0-only-so-far.patch Content-Transfer-Encoding: BASE64 Content-ID: <4062107-ca43-451-b053-683b7bc67bec@austen3.home> Content-Description: Content-Disposition: attachment; filename=0002-adapt-kernel-code-for-use-in-xen-dom0-only-so-far.patch RnJvbSAzMTAyMDQ5OGEwMmY5NzdmM2I1N2VhNWE3NmYyNTFhZDEzM2FmYjQ5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQ0KTWVzc2FnZS1JZDogPDMxMDIwNDk4YTAyZjk3N2YzYjU3ZWE1YTc2ZjI1 MWFkMTMzYWZiNDkuMTYwNjE3MDgzNi5naXQubS5hLnlvdW5nQGR1cmhhbS5hYy51az4NCkluLVJl cGx5LVRvOiA8MWQ0ZDc2YTk5NzFmYmMzNTg4NzVkOTU1NDNkNmFhN2Q4ZTcyN2JhNC4xNjA2MTcw ODM0LmdpdC5tLmEueW91bmdAZHVyaGFtLmFjLnVrPg0KUmVmZXJlbmNlczogPDFkNGQ3NmE5OTcx ZmJjMzU4ODc1ZDk1NTQzZDZhYTdkOGU3MjdiYTQuMTYwNjE3MDgzNC5naXQubS5hLnlvdW5nQGR1 cmhhbS5hYy51az4NCkZyb206IE1pY2hhZWwgWW91bmcgPG0uYS55b3VuZ0BkdXJoYW0uYWMudWs+ DQpEYXRlOiBNb24sIDIzIE5vdiAyMDIwIDE5OjE3OjA3ICswMDAwDQpTdWJqZWN0OiBbWEVOIFBB VENIIDIvMl0gYWRhcHQga2VybmVsIGNvZGUgZm9yIHVzZSBpbiB4ZW4gKGRvbTAgb25seSBzbyBm YXIpDQoNCi0tLQ0KIHhlbi9jb21tb24vTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAyICstDQogeGVuL2NvbW1vbi9kZWNvbXByZXNzLmMgICAgICAgICAgICAgICAgICAgICAg fCAgIDMgKw0KIHhlbi9jb21tb24ve2RlY29tcHJlc3NfdW56c3RkLmMgPT4gdW56c3RkLmN9IHwg IDY5ICsrKy0tLS0NCiB4ZW4vY29tbW9uL3h4aGFzaC5jICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICA1MCArKy0tLS0NCiB4ZW4vY29tbW9uL3pzdGQvZGVjb21wcmVzcy5jICAgICAgICAgICAg ICAgICB8IDE4MCArKysrKysrLS0tLS0tLS0tLS0tDQogeGVuL2NvbW1vbi96c3RkL2VudHJvcHlf Y29tbW9uLmMgICAgICAgICAgICAgfCAgMTAgKy0NCiB4ZW4vY29tbW9uL3pzdGQvZXJyb3JfcHJp dmF0ZS5oICAgICAgICAgICAgICB8ICAgNCArLQ0KIHhlbi9jb21tb24venN0ZC9mc2UuaCAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAyICstDQogeGVuL2NvbW1vbi96c3RkL2ZzZV9kZWNvbXBy ZXNzLmMgICAgICAgICAgICAgfCAgMTYgKy0NCiB4ZW4vY29tbW9uL3pzdGQvaHVmLmggICAgICAg ICAgICAgICAgICAgICAgICB8ICAgMiArLQ0KIHhlbi9jb21tb24venN0ZC9odWZfZGVjb21wcmVz cy5jICAgICAgICAgICAgIHwgIDU4ICsrKy0tLQ0KIHhlbi9jb21tb24venN0ZC9tZW0uaCAgICAg ICAgICAgICAgICAgICAgICAgIHwgICA2ICstDQogeGVuL2NvbW1vbi96c3RkL3ByaXZhdGUuaCAg ICAgICAgICAgICAgICAgICAgfCAxMDUgKysrKysrKysrKysNCiB4ZW4vY29tbW9uL3pzdGQvenN0 ZF9jb21tb24uYyAgICAgICAgICAgICAgICB8ICAxMyArLQ0KIHhlbi9jb21tb24venN0ZC96c3Rk X2ludGVybmFsLmggICAgICAgICAgICAgIHwgIDE0ICstDQogeGVuL2luY2x1ZGUveGVuL2RlY29t cHJlc3MuaCAgICAgICAgICAgICAgICAgfCAgIDIgKy0NCiB4ZW4vaW5jbHVkZS94ZW4veHhoYXNo LmggICAgICAgICAgICAgICAgICAgICB8ICAgMiArLQ0KIHhlbi9pbmNsdWRlL3hlbi96c3RkLmgg ICAgICAgICAgICAgICAgICAgICAgIHwgICAyICstDQogMTggZmlsZXMgY2hhbmdlZCwgMjgyIGlu c2VydGlvbnMoKyksIDI1OCBkZWxldGlvbnMoLSkNCiByZW5hbWUgeGVuL2NvbW1vbi97ZGVjb21w cmVzc191bnpzdGQuYyA9PiB1bnpzdGQuY30gKDg2JSkNCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVu L2NvbW1vbi96c3RkL3ByaXZhdGUuaA0KDQpkaWZmIC0tZ2l0IGEveGVuL2NvbW1vbi9NYWtlZmls ZSBiL3hlbi9jb21tb24vTWFrZWZpbGUNCmluZGV4IGQxMDlmMjc5YTQuLjViYTA5ZjA0YWMgMTAw NjQ0DQotLS0gYS94ZW4vY29tbW9uL01ha2VmaWxlDQorKysgYi94ZW4vY29tbW9uL01ha2VmaWxl DQpAQCAtNTksNyArNTksNyBAQCBvYmotYmluLXkgKz0gd2FybmluZy5pbml0Lm8NCiBvYmotJChD T05GSUdfWEVOT1BST0YpICs9IHhlbm9wcm9mLm8NCiBvYmoteSArPSB4bWFsbG9jX3Rsc2Yubw0K IA0KLW9iai1iaW4tJChDT05GSUdfWDg2KSArPSAkKGZvcmVhY2ggbixkZWNvbXByZXNzIGJ1bnpp cDIgdW54eiB1bmx6bWEgbHpvIHVubHpvIHVubHo0IGVhcmx5Y3BpbywkKG4pLmluaXQubykNCitv YmotYmluLSQoQ09ORklHX1g4NikgKz0gJChmb3JlYWNoIG4sZGVjb21wcmVzcyBidW56aXAyIHVu eHogdW5sem1hIGx6byB1bmx6byB1bmx6NCB1bnpzdGQgZWFybHljcGlvLCQobikuaW5pdC5vKQ0K IA0KIG9iai0kKENPTkZJR19DT01QQVQpICs9ICQoYWRkcHJlZml4IGNvbXBhdC8sZG9tYWluLm8g a2VybmVsLm8gbWVtb3J5Lm8gbXVsdGljYWxsLm8geGxhdC5vKQ0KIA0KZGlmZiAtLWdpdCBhL3hl bi9jb21tb24vZGVjb21wcmVzcy5jIGIveGVuL2NvbW1vbi9kZWNvbXByZXNzLmMNCmluZGV4IDlk NmUwYzRhYjAuLjBkYTI3YjBhYjYgMTAwNjQ0DQotLS0gYS94ZW4vY29tbW9uL2RlY29tcHJlc3Mu Yw0KKysrIGIveGVuL2NvbW1vbi9kZWNvbXByZXNzLmMNCkBAIC0zMSw1ICszMSw4IEBAIGludCBf X2luaXQgZGVjb21wcmVzcyh2b2lkICppbmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdm9pZCAqb3V0 YnVmKQ0KICAgICBpZiAoIGxlbiA+PSAyICYmICFtZW1jbXAoaW5idWYsICJceDAyXHgyMSIsIDIp ICkNCiAJcmV0dXJuIHVubHo0KGluYnVmLCBsZW4sIE5VTEwsIE5VTEwsIG91dGJ1ZiwgTlVMTCwg ZXJyb3IpOw0KIA0KKyAgICBpZiAoIGxlbiA+PSA0ICYmICFtZW1jbXAoaW5idWYsICJcMDUwXDI2 NVwwNTdcMzc1IiwgNCkgKQ0KKwlyZXR1cm4gdW56c3RkKGluYnVmLCBsZW4sIE5VTEwsIE5VTEws IG91dGJ1ZiwgTlVMTCwgZXJyb3IpOw0KKw0KICAgICByZXR1cm4gMTsNCiB9DQpkaWZmIC0tZ2l0 IGEveGVuL2NvbW1vbi9kZWNvbXByZXNzX3VuenN0ZC5jIGIveGVuL2NvbW1vbi91bnpzdGQuYw0K c2ltaWxhcml0eSBpbmRleCA4NiUNCnJlbmFtZSBmcm9tIHhlbi9jb21tb24vZGVjb21wcmVzc191 bnpzdGQuYw0KcmVuYW1lIHRvIHhlbi9jb21tb24vdW56c3RkLmMNCmluZGV4IDBhZDJjMTU0Nzku LmEyYzM4MmZkZGMgMTAwNjQ0DQotLS0gYS94ZW4vY29tbW9uL2RlY29tcHJlc3NfdW56c3RkLmMN CisrKyBiL3hlbi9jb21tb24vdW56c3RkLmMNCkBAIC0xLDUgKzEsMyBAQA0KLS8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQotDQogLyoNCiAgKiBJbXBvcnRhbnQgbm90ZXMgYWJv dXQgaW4tcGxhY2UgZGVjb21wcmVzc2lvbg0KICAqDQpAQCAtNTEsNiArNDksMTAgQEANCiAgKg0K ICAqICAgIHNhZmV0eV9tYXJnaW4gPSAyMiArIHVuY29tcHJlc3NlZF9zaXplICogMyAvIDEzMTA3 MiArIDEzMTA3Mg0KICAqICAgICAgICAgICAgICAgICA8PSAyMiArICh1bmNvbXByZXNzZWRfc2l6 ZSA+PiAxNSkgKyAxMzEwNzINCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorICogaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCisg KiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4NCiAgKi8NCiANCiAv Kg0KQEAgLTY1LDE5ICs2NywxNiBAQA0KICAqIERlZmluZSBfX0RJU0FCTEVfRVhQT1JUUyBpbiBw cmVib290IGVudmlyb25tZW50cyB0byBwcmV2ZW50IHN5bWJvbHMNCiAgKiBmcm9tIHh4aGFzaCBh bmQgenN0ZCBmcm9tIGJlaW5nIGV4cG9ydGVkIGJ5IHRoZSBFWFBPUlRfU1lNQk9MIG1hY3JvLg0K ICAqLw0KLSNpZmRlZiBTVEFUSUMNCi0jIGRlZmluZSBVTlpTVERfUFJFQk9PVA0KLSMgaW5jbHVk ZSAieHhoYXNoLmMiDQotIyBpbmNsdWRlICJ6c3RkL2VudHJvcHlfY29tbW9uLmMiDQotIyBpbmNs dWRlICJ6c3RkL2ZzZV9kZWNvbXByZXNzLmMiDQotIyBpbmNsdWRlICJ6c3RkL2h1Zl9kZWNvbXBy ZXNzLmMiDQotIyBpbmNsdWRlICJ6c3RkL3pzdGRfY29tbW9uLmMiDQotIyBpbmNsdWRlICJ6c3Rk L2RlY29tcHJlc3MuYyINCi0jZW5kaWYNCiANCi0jaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9t bS5oPg0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCi0jaW5jbHVkZSA8bGludXgvenN0ZC5o Pg0KKyNpbmNsdWRlICJkZWNvbXByZXNzLmgiDQorI2luY2x1ZGUgInh4aGFzaC5jIg0KKyNpbmNs dWRlICJ6c3RkL2VudHJvcHlfY29tbW9uLmMiDQorI2luY2x1ZGUgInpzdGQvZnNlX2RlY29tcHJl c3MuYyINCisjaW5jbHVkZSAienN0ZC9odWZfZGVjb21wcmVzcy5jIg0KKyNpbmNsdWRlICJ6c3Rk L3pzdGRfY29tbW9uLmMiDQorI2luY2x1ZGUgInpzdGQvZGVjb21wcmVzcy5jIg0KKw0KKyNpbmNs dWRlIDx4ZW4venN0ZC5oPg0KIA0KIC8qIDEyOE1CIGlzIHRoZSBtYXhpbXVtIHdpbmRvdyBzaXpl IHN1cHBvcnRlZCBieSB6c3RkLiAqLw0KICNkZWZpbmUgWlNURF9XSU5ET1dTSVpFX01BWAkoMSA8 PCBaU1REX1dJTkRPV0xPR19NQVgpDQpAQCAtODksNyArODgsNyBAQA0KICAqLw0KICNkZWZpbmUg WlNURF9JT0JVRl9TSVpFCQkoMSA8PCAxNykNCiANCi1zdGF0aWMgaW50IElOSVQgaGFuZGxlX3pz dGRfZXJyb3Ioc2l6ZV90IHJldCwgdm9pZCAoKmVycm9yKShjaGFyICp4KSkNCitzdGF0aWMgaW50 IElOSVQgaGFuZGxlX3pzdGRfZXJyb3Ioc2l6ZV90IHJldCwgdm9pZCAoKmVycm9yKShjb25zdCBj aGFyICp4KSkNCiB7DQogCWNvbnN0IGludCBlcnIgPSBaU1REX2dldEVycm9yQ29kZShyZXQpOw0K IA0KQEAgLTEyMCw5ICsxMTksOSBAQCBzdGF0aWMgaW50IElOSVQgaGFuZGxlX3pzdGRfZXJyb3Io c2l6ZV90IHJldCwgdm9pZCAoKmVycm9yKShjaGFyICp4KSkNCiAgKiBXZSBjYW4gYWxsb2NhdGUg bGVzcyBtZW1vcnkgKG5vIGNpcmN1bGFyIGJ1ZmZlciBmb3IgdGhlIHNsaWRpbmcgd2luZG93KSwN CiAgKiBhbmQgYXZvaWQgc29tZSBtZW1jcHkoKSBjYWxscy4NCiAgKi8NCi1zdGF0aWMgaW50IElO SVQgZGVjb21wcmVzc19zaW5nbGUoY29uc3QgdTggKmluX2J1ZiwgbG9uZyBpbl9sZW4sIHU4ICpv dXRfYnVmLA0KLQkJCQkgIGxvbmcgb3V0X2xlbiwgbG9uZyAqaW5fcG9zLA0KLQkJCQkgIHZvaWQg KCplcnJvcikoY2hhciAqeCkpDQorc3RhdGljIGludCBJTklUIGRlY29tcHJlc3Nfc2luZ2xlKGNv bnN0IHU4ICppbl9idWYsIHVuc2lnbmVkIGludCBpbl9sZW4sIHU4ICpvdXRfYnVmLA0KKwkJCQkg IGxvbmcgb3V0X2xlbiwgdW5zaWduZWQgaW50ICppbl9wb3MsDQorCQkJCSAgdm9pZCAoKmVycm9y KShjb25zdCBjaGFyICp4KSkNCiB7DQogCWNvbnN0IHNpemVfdCB3a3NwX3NpemUgPSBaU1REX0RD dHhXb3Jrc3BhY2VCb3VuZCgpOw0KIAl2b2lkICp3a3NwID0gbGFyZ2VfbWFsbG9jKHdrc3Bfc2l6 ZSk7DQpAQCAtMTYwLDEyICsxNTksMTIgQEAgb3V0Og0KIAlyZXR1cm4gZXJyOw0KIH0NCiANCi1z dGF0aWMgaW50IElOSVQgX191bnpzdGQodW5zaWduZWQgY2hhciAqaW5fYnVmLCBsb25nIGluX2xl biwNCi0JCQkgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwNCi0JCQkgbG9uZyAo KmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksDQorc3RhdGljIGludCBJTklUIF9fdW56c3Rk KHVuc2lnbmVkIGNoYXIgKmluX2J1ZiwgdW5zaWduZWQgaW50IGluX2xlbiwNCisJCQkgaW50ICgq ZmlsbCkodm9pZCosIHVuc2lnbmVkIGludCksDQorCQkJIGludCAoKmZsdXNoKSh2b2lkKiwgdW5z aWduZWQgaW50KSwNCiAJCQkgdW5zaWduZWQgY2hhciAqb3V0X2J1ZiwgbG9uZyBvdXRfbGVuLA0K LQkJCSBsb25nICppbl9wb3MsDQotCQkJIHZvaWQgKCplcnJvcikoY2hhciAqeCkpDQorCQkJIHVu c2lnbmVkIGludCAqaW5fcG9zLA0KKwkJCSB2b2lkICgqZXJyb3IpKGNvbnN0IGNoYXIgKngpKQ0K IHsNCiAJWlNURF9pbkJ1ZmZlciBpbjsNCiAJWlNURF9vdXRCdWZmZXIgb3V0Ow0KQEAgLTE3OSw3 ICsxNzgsNyBAQCBzdGF0aWMgaW50IElOSVQgX191bnpzdGQodW5zaWduZWQgY2hhciAqaW5fYnVm LCBsb25nIGluX2xlbiwNCiAJc2l6ZV90IHJldDsNCiANCiAJaWYgKG91dF9sZW4gPT0gMCkNCi0J CW91dF9sZW4gPSBMT05HX01BWDsgLyogbm8gbGltaXQgKi8NCisJCW91dF9sZW4gPSBJTlRfTUFY OyAvKiBubyBsaW1pdCAqLw0KIA0KIAlpZiAoZmlsbCA9PSBOVUxMICYmIGZsdXNoID09IE5VTEwp DQogCQkvKg0KQEAgLTMyMiwyNCArMzIxLDEyIEBAIG91dDoNCiAJcmV0dXJuIGVycjsNCiB9DQog DQotI2lmbmRlZiBVTlpTVERfUFJFQk9PVA0KLVNUQVRJQyBpbnQgSU5JVCB1bnpzdGQodW5zaWdu ZWQgY2hhciAqYnVmLCBsb25nIGxlbiwNCi0JCSAgICAgICBsb25nICgqZmlsbCkodm9pZCosIHVu c2lnbmVkIGxvbmcpLA0KLQkJICAgICAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxv bmcpLA0KK1NUQVRJQyBpbnQgSU5JVCB1bnpzdGQodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25l ZCBpbnQgbGVuLA0KKwkJICAgICAgIGludCAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBpbnQpLA0K KwkJICAgICAgIGludCAoKmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgaW50KSwNCiAJCSAgICAgICB1 bnNpZ25lZCBjaGFyICpvdXRfYnVmLA0KLQkJICAgICAgIGxvbmcgKnBvcywNCi0JCSAgICAgICB2 b2lkICgqZXJyb3IpKGNoYXIgKngpKQ0KKwkJICAgICAgIHVuc2lnbmVkIGludCAqcG9zLA0KKwkJ ICAgICAgIHZvaWQgKCplcnJvcikoY29uc3QgY2hhciAqeCkpDQogew0KIAlyZXR1cm4gX191bnpz dGQoYnVmLCBsZW4sIGZpbGwsIGZsdXNoLCBvdXRfYnVmLCAwLCBwb3MsIGVycm9yKTsNCiB9DQot I2Vsc2UNCi1TVEFUSUMgaW50IElOSVQgX19kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmJ1Ziwg bG9uZyBsZW4sDQotCQkJICAgICBsb25nICgqZmlsbCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLA0K LQkJCSAgICAgbG9uZyAoKmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksDQotCQkJICAgICB1 bnNpZ25lZCBjaGFyICpvdXRfYnVmLCBsb25nIG91dF9sZW4sDQotCQkJICAgICBsb25nICpwb3Ms DQotCQkJICAgICB2b2lkICgqZXJyb3IpKGNoYXIgKngpKQ0KLXsNCi0JcmV0dXJuIF9fdW56c3Rk KGJ1ZiwgbGVuLCBmaWxsLCBmbHVzaCwgb3V0X2J1Ziwgb3V0X2xlbiwgcG9zLCBlcnJvcik7DQot fQ0KLSNlbmRpZg0KZGlmZiAtLWdpdCBhL3hlbi9jb21tb24veHhoYXNoLmMgYi94ZW4vY29tbW9u L3h4aGFzaC5jDQppbmRleCBkNWJiOWZmMTA2Li4zYWIzZTAxODU5IDEwMDY0NA0KLS0tIGEveGVu L2NvbW1vbi94eGhhc2guYw0KKysrIGIveGVuL2NvbW1vbi94eGhhc2guYw0KQEAgLTM4LDEzICsz OCwxMCBAQA0KICAqIC0geHhIYXNoIHNvdXJjZSByZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5j b20vQ3lhbjQ5NzMveHhIYXNoDQogICovDQogDQotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4N Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4NCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4N Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0K LSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4NCi0jaW5jbHVkZSA8bGludXgveHhoYXNoLmg+DQor I2luY2x1ZGUgPHhlbi9zdHJpbmcuaD4NCisjaW5jbHVkZSA8eGVuL2Vycm5vLmg+DQorI2luY2x1 ZGUgPHhlbi94eGhhc2guaD4NCisjaW5jbHVkZSAienN0ZC9wcml2YXRlLmgiDQogDQogLyotKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIE1hY3Jvcw0KQEAgLTc2LDIy ICs3MywyMCBAQCBzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF81ID0gIDI4NzAxNzc0NTAw MTI2MDAyNjFVTEw7DQogLyotKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiAgVXRpbHMN CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXZvaWQgeHhoMzJfY29weV9zdGF0ZShz dHJ1Y3QgeHhoMzJfc3RhdGUgKmRzdCwgY29uc3Qgc3RydWN0IHh4aDMyX3N0YXRlICpzcmMpDQor dm9pZCBJTklUIHh4aDMyX2NvcHlfc3RhdGUoc3RydWN0IHh4aDMyX3N0YXRlICpkc3QsIGNvbnN0 IHN0cnVjdCB4eGgzMl9zdGF0ZSAqc3JjKQ0KIHsNCiAJbWVtY3B5KGRzdCwgc3JjLCBzaXplb2Yo KmRzdCkpOw0KIH0NCi1FWFBPUlRfU1lNQk9MKHh4aDMyX2NvcHlfc3RhdGUpOw0KIA0KLXZvaWQg eHhoNjRfY29weV9zdGF0ZShzdHJ1Y3QgeHhoNjRfc3RhdGUgKmRzdCwgY29uc3Qgc3RydWN0IHh4 aDY0X3N0YXRlICpzcmMpDQordm9pZCBJTklUIHh4aDY0X2NvcHlfc3RhdGUoc3RydWN0IHh4aDY0 X3N0YXRlICpkc3QsIGNvbnN0IHN0cnVjdCB4eGg2NF9zdGF0ZSAqc3JjKQ0KIHsNCiAJbWVtY3B5 KGRzdCwgc3JjLCBzaXplb2YoKmRzdCkpOw0KIH0NCi1FWFBPUlRfU1lNQk9MKHh4aDY0X2NvcHlf c3RhdGUpOw0KIA0KIC8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIFNpbXBsZSBI YXNoIEZ1bmN0aW9ucw0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyB1 aW50MzJfdCB4eGgzMl9yb3VuZCh1aW50MzJfdCBzZWVkLCBjb25zdCB1aW50MzJfdCBpbnB1dCkN CitzdGF0aWMgdWludDMyX3QgSU5JVCB4eGgzMl9yb3VuZCh1aW50MzJfdCBzZWVkLCBjb25zdCB1 aW50MzJfdCBpbnB1dCkNCiB7DQogCXNlZWQgKz0gaW5wdXQgKiBQUklNRTMyXzI7DQogCXNlZWQg PSB4eGhfcm90bDMyKHNlZWQsIDEzKTsNCkBAIC05OSw3ICs5NCw3IEBAIHN0YXRpYyB1aW50MzJf dCB4eGgzMl9yb3VuZCh1aW50MzJfdCBzZWVkLCBjb25zdCB1aW50MzJfdCBpbnB1dCkNCiAJcmV0 dXJuIHNlZWQ7DQogfQ0KIA0KLXVpbnQzMl90IHh4aDMyKGNvbnN0IHZvaWQgKmlucHV0LCBjb25z dCBzaXplX3QgbGVuLCBjb25zdCB1aW50MzJfdCBzZWVkKQ0KK3VpbnQzMl90IElOSVQgeHhoMzIo Y29uc3Qgdm9pZCAqaW5wdXQsIGNvbnN0IHNpemVfdCBsZW4sIGNvbnN0IHVpbnQzMl90IHNlZWQp DQogew0KIAljb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilpbnB1dDsNCiAJY29u c3QgdWludDhfdCAqYl9lbmQgPSBwICsgbGVuOw0KQEAgLTE1MSw5ICsxNDYsOCBAQCB1aW50MzJf dCB4eGgzMihjb25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6ZV90IGxlbiwgY29uc3QgdWludDMy X3Qgc2VlZCkNCiANCiAJcmV0dXJuIGgzMjsNCiB9DQotRVhQT1JUX1NZTUJPTCh4eGgzMik7DQog DQotc3RhdGljIHVpbnQ2NF90IHh4aDY0X3JvdW5kKHVpbnQ2NF90IGFjYywgY29uc3QgdWludDY0 X3QgaW5wdXQpDQorc3RhdGljIHVpbnQ2NF90IElOSVQgeHhoNjRfcm91bmQodWludDY0X3QgYWNj LCBjb25zdCB1aW50NjRfdCBpbnB1dCkNCiB7DQogCWFjYyArPSBpbnB1dCAqIFBSSU1FNjRfMjsN CiAJYWNjID0geHhoX3JvdGw2NChhY2MsIDMxKTsNCkBAIC0xNjEsNyArMTU1LDcgQEAgc3RhdGlj IHVpbnQ2NF90IHh4aDY0X3JvdW5kKHVpbnQ2NF90IGFjYywgY29uc3QgdWludDY0X3QgaW5wdXQp DQogCXJldHVybiBhY2M7DQogfQ0KIA0KLXN0YXRpYyB1aW50NjRfdCB4eGg2NF9tZXJnZV9yb3Vu ZCh1aW50NjRfdCBhY2MsIHVpbnQ2NF90IHZhbCkNCitzdGF0aWMgdWludDY0X3QgSU5JVCB4eGg2 NF9tZXJnZV9yb3VuZCh1aW50NjRfdCBhY2MsIHVpbnQ2NF90IHZhbCkNCiB7DQogCXZhbCA9IHh4 aDY0X3JvdW5kKDAsIHZhbCk7DQogCWFjYyBePSB2YWw7DQpAQCAtMTY5LDcgKzE2Myw3IEBAIHN0 YXRpYyB1aW50NjRfdCB4eGg2NF9tZXJnZV9yb3VuZCh1aW50NjRfdCBhY2MsIHVpbnQ2NF90IHZh bCkNCiAJcmV0dXJuIGFjYzsNCiB9DQogDQotdWludDY0X3QgeHhoNjQoY29uc3Qgdm9pZCAqaW5w dXQsIGNvbnN0IHNpemVfdCBsZW4sIGNvbnN0IHVpbnQ2NF90IHNlZWQpDQordWludDY0X3QgSU5J VCB4eGg2NChjb25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6ZV90IGxlbiwgY29uc3QgdWludDY0 X3Qgc2VlZCkNCiB7DQogCWNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWlucHV0 Ow0KIAljb25zdCB1aW50OF90ICpjb25zdCBiX2VuZCA9IHAgKyBsZW47DQpAQCAtMjM0LDEyICsy MjgsMTEgQEAgdWludDY0X3QgeHhoNjQoY29uc3Qgdm9pZCAqaW5wdXQsIGNvbnN0IHNpemVfdCBs ZW4sIGNvbnN0IHVpbnQ2NF90IHNlZWQpDQogDQogCXJldHVybiBoNjQ7DQogfQ0KLUVYUE9SVF9T WU1CT0woeHhoNjQpOw0KIA0KIC8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqDQogICogQWR2YW5jZWQgSGFzaCBGdW5jdGlvbnMNCiAgKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXZvaWQgeHhoMzJf cmVzZXQoc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0ZVB0ciwgY29uc3QgdWludDMyX3Qgc2VlZCkN Cit2b2lkIElOSVQgeHhoMzJfcmVzZXQoc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0ZVB0ciwgY29u c3QgdWludDMyX3Qgc2VlZCkNCiB7DQogCS8qIHVzZSBhIGxvY2FsIHN0YXRlIGZvciBtZW1jcHko KSB0byBhdm9pZCBzdHJpY3QtYWxpYXNpbmcgd2FybmluZ3MgKi8NCiAJc3RydWN0IHh4aDMyX3N0 YXRlIHN0YXRlOw0KQEAgLTI1MSw5ICsyNDQsOCBAQCB2b2lkIHh4aDMyX3Jlc2V0KHN0cnVjdCB4 eGgzMl9zdGF0ZSAqc3RhdGVQdHIsIGNvbnN0IHVpbnQzMl90IHNlZWQpDQogCXN0YXRlLnY0ID0g c2VlZCAtIFBSSU1FMzJfMTsNCiAJbWVtY3B5KHN0YXRlUHRyLCAmc3RhdGUsIHNpemVvZihzdGF0 ZSkpOw0KIH0NCi1FWFBPUlRfU1lNQk9MKHh4aDMyX3Jlc2V0KTsNCiANCi12b2lkIHh4aDY0X3Jl c2V0KHN0cnVjdCB4eGg2NF9zdGF0ZSAqc3RhdGVQdHIsIGNvbnN0IHVpbnQ2NF90IHNlZWQpDQor dm9pZCBJTklUIHh4aDY0X3Jlc2V0KHN0cnVjdCB4eGg2NF9zdGF0ZSAqc3RhdGVQdHIsIGNvbnN0 IHVpbnQ2NF90IHNlZWQpDQogew0KIAkvKiB1c2UgYSBsb2NhbCBzdGF0ZSBmb3IgbWVtY3B5KCkg dG8gYXZvaWQgc3RyaWN0LWFsaWFzaW5nIHdhcm5pbmdzICovDQogCXN0cnVjdCB4eGg2NF9zdGF0 ZSBzdGF0ZTsNCkBAIC0yNjUsOSArMjU3LDggQEAgdm9pZCB4eGg2NF9yZXNldChzdHJ1Y3QgeHho NjRfc3RhdGUgKnN0YXRlUHRyLCBjb25zdCB1aW50NjRfdCBzZWVkKQ0KIAlzdGF0ZS52NCA9IHNl ZWQgLSBQUklNRTY0XzE7DQogCW1lbWNweShzdGF0ZVB0ciwgJnN0YXRlLCBzaXplb2Yoc3RhdGUp KTsNCiB9DQotRVhQT1JUX1NZTUJPTCh4eGg2NF9yZXNldCk7DQogDQotaW50IHh4aDMyX3VwZGF0 ZShzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6 ZV90IGxlbikNCitpbnQgSU5JVCB4eGgzMl91cGRhdGUoc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0 ZSwgY29uc3Qgdm9pZCAqaW5wdXQsIGNvbnN0IHNpemVfdCBsZW4pDQogew0KIAljb25zdCB1aW50 OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilpbnB1dDsNCiAJY29uc3QgdWludDhfdCAqY29uc3Qg Yl9lbmQgPSBwICsgbGVuOw0KQEAgLTMzNCw5ICszMjUsOCBAQCBpbnQgeHhoMzJfdXBkYXRlKHN0 cnVjdCB4eGgzMl9zdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmlucHV0LCBjb25zdCBzaXplX3Qg bGVuKQ0KIA0KIAlyZXR1cm4gMDsNCiB9DQotRVhQT1JUX1NZTUJPTCh4eGgzMl91cGRhdGUpOw0K IA0KLXVpbnQzMl90IHh4aDMyX2RpZ2VzdChjb25zdCBzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRl KQ0KK3VpbnQzMl90IElOSVQgeHhoMzJfZGlnZXN0KGNvbnN0IHN0cnVjdCB4eGgzMl9zdGF0ZSAq c3RhdGUpDQogew0KIAljb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilzdGF0ZS0+ bWVtMzI7DQogCWNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJfZW5kID0gKGNvbnN0IHVpbnQ4X3QgKiko c3RhdGUtPm1lbTMyKSArDQpAQCAtMzcyLDkgKzM2Miw4IEBAIHVpbnQzMl90IHh4aDMyX2RpZ2Vz dChjb25zdCBzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRlKQ0KIA0KIAlyZXR1cm4gaDMyOw0KIH0N Ci1FWFBPUlRfU1lNQk9MKHh4aDMyX2RpZ2VzdCk7DQogDQotaW50IHh4aDY0X3VwZGF0ZShzdHJ1 Y3QgeHhoNjRfc3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6ZV90IGxl bikNCitpbnQgSU5JVCB4eGg2NF91cGRhdGUoc3RydWN0IHh4aDY0X3N0YXRlICpzdGF0ZSwgY29u c3Qgdm9pZCAqaW5wdXQsIGNvbnN0IHNpemVfdCBsZW4pDQogew0KIAljb25zdCB1aW50OF90ICpw ID0gKGNvbnN0IHVpbnQ4X3QgKilpbnB1dDsNCiAJY29uc3QgdWludDhfdCAqY29uc3QgYl9lbmQg PSBwICsgbGVuOw0KQEAgLTQzOSw5ICs0MjgsOCBAQCBpbnQgeHhoNjRfdXBkYXRlKHN0cnVjdCB4 eGg2NF9zdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmlucHV0LCBjb25zdCBzaXplX3QgbGVuKQ0K IA0KIAlyZXR1cm4gMDsNCiB9DQotRVhQT1JUX1NZTUJPTCh4eGg2NF91cGRhdGUpOw0KIA0KLXVp bnQ2NF90IHh4aDY0X2RpZ2VzdChjb25zdCBzdHJ1Y3QgeHhoNjRfc3RhdGUgKnN0YXRlKQ0KK3Vp bnQ2NF90IElOSVQgeHhoNjRfZGlnZXN0KGNvbnN0IHN0cnVjdCB4eGg2NF9zdGF0ZSAqc3RhdGUp DQogew0KIAljb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilzdGF0ZS0+bWVtNjQ7 DQogCWNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJfZW5kID0gKGNvbnN0IHVpbnQ4X3QgKilzdGF0ZS0+ bWVtNjQgKw0KQEAgLTQ5NCw3ICs0ODIsMyBAQCB1aW50NjRfdCB4eGg2NF9kaWdlc3QoY29uc3Qg c3RydWN0IHh4aDY0X3N0YXRlICpzdGF0ZSkNCiANCiAJcmV0dXJuIGg2NDsNCiB9DQotRVhQT1JU X1NZTUJPTCh4eGg2NF9kaWdlc3QpOw0KLQ0KLU1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwi KTsNCi1NT0RVTEVfREVTQ1JJUFRJT04oInh4SGFzaCIpOw0KZGlmZiAtLWdpdCBhL3hlbi9jb21t b24venN0ZC9kZWNvbXByZXNzLmMgYi94ZW4vY29tbW9uL3pzdGQvZGVjb21wcmVzcy5jDQppbmRl eCBkYjY3NjFlYTRkLi44ZTYyN2Q4ODFhIDEwMDY0NA0KLS0tIGEveGVuL2NvbW1vbi96c3RkL2Rl Y29tcHJlc3MuYw0KKysrIGIveGVuL2NvbW1vbi96c3RkL2RlY29tcHJlc3MuYw0KQEAgLTMzLDkg KzMzLDcgQEANCiAjaW5jbHVkZSAiaHVmLmgiDQogI2luY2x1ZGUgIm1lbS5oIiAvKiBsb3cgbGV2 ZWwgbWVtb3J5IHJvdXRpbmVzICovDQogI2luY2x1ZGUgInpzdGRfaW50ZXJuYWwuaCINCi0jaW5j bHVkZSA8bGludXgva2VybmVsLmg+DQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KLSNpbmNs dWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtY3B5LCBtZW1tb3ZlLCBtZW1zZXQgKi8NCisjaW5j bHVkZSA8eGVuL3N0cmluZy5oPiAvKiBtZW1jcHksIG1lbW1vdmUsIG1lbXNldCAqLw0KIA0KICNk ZWZpbmUgWlNURF9QUkVGRVRDSChwdHIpIF9fYnVpbHRpbl9wcmVmZXRjaChwdHIsIDAsIDApDQog DQpAQCAtNDksNyArNDcsNyBAQA0KIC8qXyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioNCiAqICBNZW1vcnkgb3BlcmF0aW9ucw0KICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3Rh dGljIHZvaWQgWlNURF9jb3B5NCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYykgeyBtZW1jcHko ZHN0LCBzcmMsIDQpOyB9DQorc3RhdGljIHZvaWQgSU5JVCBaU1REX2NvcHk0KHZvaWQgKmRzdCwg Y29uc3Qgdm9pZCAqc3JjKSB7IG1lbWNweShkc3QsIHNyYywgNCk7IH0NCiANCiAvKi0qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQog KiAgIENvbnRleHQgbWFuYWdlbWVudA0KQEAgLTEwMSw5ICs5OSw5IEBAIHN0cnVjdCBaU1REX0RD dHhfcyB7DQogCUJZVEUgaGVhZGVyQnVmZmVyW1pTVERfRlJBTUVIRUFERVJTSVpFX01BWF07DQog fTsgLyogdHlwZWRlZidkIHRvIFpTVERfREN0eCB3aXRoaW4gInpzdGQuaCIgKi8NCiANCi1zaXpl X3QgWlNURF9EQ3R4V29ya3NwYWNlQm91bmQodm9pZCkgeyByZXR1cm4gWlNURF9BTElHTihzaXpl b2YoWlNURF9zdGFjaykpICsgWlNURF9BTElHTihzaXplb2YoWlNURF9EQ3R4KSk7IH0NCitzaXpl X3QgSU5JVCBaU1REX0RDdHhXb3Jrc3BhY2VCb3VuZCh2b2lkKSB7IHJldHVybiBaU1REX0FMSUdO KHNpemVvZihaU1REX3N0YWNrKSkgKyBaU1REX0FMSUdOKHNpemVvZihaU1REX0RDdHgpKTsgfQ0K IA0KLXNpemVfdCBaU1REX2RlY29tcHJlc3NCZWdpbihaU1REX0RDdHggKmRjdHgpDQorc2l6ZV90 IElOSVQgWlNURF9kZWNvbXByZXNzQmVnaW4oWlNURF9EQ3R4ICpkY3R4KQ0KIHsNCiAJZGN0eC0+ ZXhwZWN0ZWQgPSBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXg7DQogCWRjdHgtPnN0YWdlID0g WlNURGRzX2dldEZyYW1lSGVhZGVyU2l6ZTsNCkBAIC0xMjMsNyArMTIxLDcgQEAgc2l6ZV90IFpT VERfZGVjb21wcmVzc0JlZ2luKFpTVERfREN0eCAqZGN0eCkNCiAJcmV0dXJuIDA7DQogfQ0KIA0K LVpTVERfREN0eCAqWlNURF9jcmVhdGVEQ3R4X2FkdmFuY2VkKFpTVERfY3VzdG9tTWVtIGN1c3Rv bU1lbSkNCitaU1REX0RDdHggSU5JVCAqWlNURF9jcmVhdGVEQ3R4X2FkdmFuY2VkKFpTVERfY3Vz dG9tTWVtIGN1c3RvbU1lbSkNCiB7DQogCVpTVERfREN0eCAqZGN0eDsNCiANCkBAIC0xMzgsMTMg KzEzNiwxMyBAQCBaU1REX0RDdHggKlpTVERfY3JlYXRlREN0eF9hZHZhbmNlZChaU1REX2N1c3Rv bU1lbSBjdXN0b21NZW0pDQogCXJldHVybiBkY3R4Ow0KIH0NCiANCi1aU1REX0RDdHggKlpTVERf aW5pdERDdHgodm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCitaU1REX0RD dHggSU5JVCAqWlNURF9pbml0REN0eCh2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VT aXplKQ0KIHsNCiAJWlNURF9jdXN0b21NZW0gY29uc3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFj ayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0KIAlyZXR1cm4gWlNURF9jcmVhdGVEQ3R4X2Fk dmFuY2VkKHN0YWNrTWVtKTsNCiB9DQogDQotc2l6ZV90IFpTVERfZnJlZURDdHgoWlNURF9EQ3R4 ICpkY3R4KQ0KK3NpemVfdCBJTklUIFpTVERfZnJlZURDdHgoWlNURF9EQ3R4ICpkY3R4KQ0KIHsN CiAJaWYgKGRjdHggPT0gTlVMTCkNCiAJCXJldHVybiAwOyAvKiBzdXBwb3J0IGZyZWUgb24gTlVM TCAqLw0KQEAgLTE1MiwxMyArMTUwLDEzIEBAIHNpemVfdCBaU1REX2ZyZWVEQ3R4KFpTVERfREN0 eCAqZGN0eCkNCiAJcmV0dXJuIDA7IC8qIHJlc2VydmVkIGFzIGEgcG90ZW50aWFsIGVycm9yIGNv ZGUgaW4gdGhlIGZ1dHVyZSAqLw0KIH0NCiANCi12b2lkIFpTVERfY29weURDdHgoWlNURF9EQ3R4 ICpkc3REQ3R4LCBjb25zdCBaU1REX0RDdHggKnNyY0RDdHgpDQordm9pZCBJTklUIFpTVERfY29w eURDdHgoWlNURF9EQ3R4ICpkc3REQ3R4LCBjb25zdCBaU1REX0RDdHggKnNyY0RDdHgpDQogew0K IAlzaXplX3QgY29uc3Qgd29ya1NwYWNlU2l6ZSA9IChaU1REX0JMT0NLU0laRV9BQlNPTFVURU1B WCArIFdJTERDT1BZX09WRVJMRU5HVEgpICsgWlNURF9mcmFtZUhlYWRlclNpemVfbWF4Ow0KIAlt ZW1jcHkoZHN0REN0eCwgc3JjREN0eCwgc2l6ZW9mKFpTVERfREN0eCkgLSB3b3JrU3BhY2VTaXpl KTsgLyogbm8gbmVlZCB0byBjb3B5IHdvcmtzcGFjZSAqLw0KIH0NCiANCi1zdGF0aWMgdm9pZCBa U1REX3JlZkREaWN0KFpTVERfREN0eCAqZHN0REN0eCwgY29uc3QgWlNURF9ERGljdCAqZGRpY3Qp Ow0KK3N0YXRpYyB2b2lkIElOSVQgWlNURF9yZWZERGljdChaU1REX0RDdHggKmRzdERDdHgsIGNv bnN0IFpTVERfRERpY3QgKmRkaWN0KTsNCiANCiAvKi0qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgIERlY29tcHJlc3Npb24g c2VjdGlvbg0KQEAgLTE2OSw3ICsxNjcsNyBAQCBzdGF0aWMgdm9pZCBaU1REX3JlZkREaWN0KFpT VERfREN0eCAqZHN0REN0eCwgY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOw0KICAqICBOb3RlIDog RnJhbWUgSWRlbnRpZmllciBpcyA0IGJ5dGVzLiBJZiBgc2l6ZSA8IDRgLCBAcmV0dXJuIHdpbGwg YWx3YXlzIGJlIDAuDQogICogIE5vdGUgMiA6IExlZ2FjeSBGcmFtZSBJZGVudGlmaWVycyBhcmUg Y29uc2lkZXJlZCB2YWxpZCBvbmx5IGlmIExlZ2FjeSBTdXBwb3J0IGlzIGVuYWJsZWQuDQogICog IE5vdGUgMyA6IFNraXBwYWJsZSBGcmFtZSBJZGVudGlmaWVycyBhcmUgY29uc2lkZXJlZCB2YWxp ZC4gKi8NCi11bnNpZ25lZCBaU1REX2lzRnJhbWUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qg c2l6ZSkNCit1bnNpZ25lZCBJTklUIFpTVERfaXNGcmFtZShjb25zdCB2b2lkICpidWZmZXIsIHNp emVfdCBzaXplKQ0KIHsNCiAJaWYgKHNpemUgPCA0KQ0KIAkJcmV0dXJuIDA7DQpAQCAtMTg2LDcg KzE4NCw3IEBAIHVuc2lnbmVkIFpTVERfaXNGcmFtZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVf dCBzaXplKQ0KIC8qKiBaU1REX2ZyYW1lSGVhZGVyU2l6ZSgpIDoNCiAqICAgc3JjU2l6ZSBtdXN0 IGJlID49IFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeC4NCiAqICAgQHJldHVybiA6IHNpemUg b2YgdGhlIEZyYW1lIEhlYWRlciAqLw0KLXN0YXRpYyBzaXplX3QgWlNURF9mcmFtZUhlYWRlclNp emUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCitzdGF0aWMgc2l6ZV90IElOSVQg WlNURF9mcmFtZUhlYWRlclNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCiB7 DQogCWlmIChzcmNTaXplIDwgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KQ0KIAkJcmV0dXJu IEVSUk9SKHNyY1NpemVfd3JvbmcpOw0KQEAgLTIwNCw3ICsyMDIsNyBAQCBzdGF0aWMgc2l6ZV90 IFpTVERfZnJhbWVIZWFkZXJTaXplKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQog KiAgIEByZXR1cm4gOiAwLCBgZnBhcmFtc1B0cmAgaXMgY29ycmVjdGx5IGZpbGxlZCwNCiAqICAg ICAgICAgICAgPjAsIGBzcmNTaXplYCBpcyB0b28gc21hbGwsIHJlc3VsdCBpcyBleHBlY3RlZCBg c3JjU2l6ZWAsDQogKiAgICAgICAgICAgICBvciBhbiBlcnJvciBjb2RlLCB3aGljaCBjYW4gYmUg dGVzdGVkIHVzaW5nIFpTVERfaXNFcnJvcigpICovDQotc2l6ZV90IFpTVERfZ2V0RnJhbWVQYXJh bXMoWlNURF9mcmFtZVBhcmFtcyAqZnBhcmFtc1B0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qg c3JjU2l6ZSkNCitzaXplX3QgSU5JVCBaU1REX2dldEZyYW1lUGFyYW1zKFpTVERfZnJhbWVQYXJh bXMgKmZwYXJhbXNQdHIsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQogew0KIAlj b25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc3JjOw0KIA0KQEAgLTI5NCw3ICsyOTIsNyBA QCBzaXplX3QgWlNURF9nZXRGcmFtZVBhcmFtcyhaU1REX2ZyYW1lUGFyYW1zICpmcGFyYW1zUHRy LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdA0KICogICBAcmV0dXJuIDogZGVjb21wcmVzc2VkIHNp emUgb2YgdGhlIHNpbmdsZSBmcmFtZSBwb2ludGVkIHRvIGJlIGBzcmNgIGlmIGtub3duLCBvdGhl cndpc2UNCiAqICAgICAgICAgICAgIC0gWlNURF9DT05URU5UU0laRV9VTktOT1dOIGlmIHRoZSBz aXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkDQogKiAgICAgICAgICAgICAtIFpTVERfQ09OVEVOVFNJ WkVfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKGUuZy4gaW52YWxpZCBtYWdpYyBudW1iZXIs IHNyY1NpemUgdG9vIHNtYWxsKSAqLw0KLXVuc2lnbmVkIGxvbmcgbG9uZyBaU1REX2dldEZyYW1l Q29udGVudFNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCit1bnNpZ25lZCBs b25nIGxvbmcgSU5JVCBaU1REX2dldEZyYW1lQ29udGVudFNpemUoY29uc3Qgdm9pZCAqc3JjLCBz aXplX3Qgc3JjU2l6ZSkNCiB7DQogCXsNCiAJCVpTVERfZnJhbWVQYXJhbXMgZlBhcmFtczsNCkBA IC0zMTYsNyArMzE0LDcgQEAgdW5zaWduZWQgbG9uZyBsb25nIFpTVERfZ2V0RnJhbWVDb250ZW50 U2l6ZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KICAqICBgc3JjU2l6ZWAgbXVz dCBiZSB0aGUgZXhhY3QgbGVuZ3RoIG9mIHNvbWUgbnVtYmVyIG9mIFpTVEQgY29tcHJlc3NlZCBh bmQvb3INCiAgKiAgICAgIHNraXBwYWJsZSBmcmFtZXMNCiAgKiAgQHJldHVybiA6IGRlY29tcHJl c3NlZCBzaXplIG9mIHRoZSBmcmFtZXMgY29udGFpbmVkICovDQotdW5zaWduZWQgbG9uZyBsb25n IFpTVERfZmluZERlY29tcHJlc3NlZFNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6 ZSkNCit1bnNpZ25lZCBsb25nIGxvbmcgSU5JVCBaU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKGNv bnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQogew0KIAl7DQogCQl1bnNpZ25lZCBsb25n IGxvbmcgdG90YWxEc3RTaXplID0gMDsNCkBAIC0zNjksNyArMzY3LDcgQEAgdW5zaWduZWQgbG9u ZyBsb25nIFpTVERfZmluZERlY29tcHJlc3NlZFNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qg c3JjU2l6ZSkNCiAvKiogWlNURF9kZWNvZGVGcmFtZUhlYWRlcigpIDoNCiAqICAgYGhlYWRlclNp emVgIG11c3QgYmUgdGhlIHNpemUgcHJvdmlkZWQgYnkgWlNURF9mcmFtZUhlYWRlclNpemUoKS4N CiAqICAgQHJldHVybiA6IDAgaWYgc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZSwgd2hpY2ggY2Fu IGJlIHRlc3RlZCB1c2luZyBaU1REX2lzRXJyb3IoKSAqLw0KLXN0YXRpYyBzaXplX3QgWlNURF9k ZWNvZGVGcmFtZUhlYWRlcihaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90 IGhlYWRlclNpemUpDQorc3RhdGljIHNpemVfdCBJTklUIFpTVERfZGVjb2RlRnJhbWVIZWFkZXIo WlNURF9EQ3R4ICpkY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBoZWFkZXJTaXplKQ0KIHsN CiAJc2l6ZV90IGNvbnN0IHJlc3VsdCA9IFpTVERfZ2V0RnJhbWVQYXJhbXMoJihkY3R4LT5mUGFy YW1zKSwgc3JjLCBoZWFkZXJTaXplKTsNCiAJaWYgKFpTVERfaXNFcnJvcihyZXN1bHQpKQ0KQEAg LTM5MSw3ICszODksNyBAQCB0eXBlZGVmIHN0cnVjdCB7DQogDQogLyohIFpTVERfZ2V0Y0Jsb2Nr U2l6ZSgpIDoNCiAqICAgUHJvdmlkZXMgdGhlIHNpemUgb2YgY29tcHJlc3NlZCBibG9jayBmcm9t IGJsb2NrIGhlYWRlciBgc3JjYCAqLw0KLXNpemVfdCBaU1REX2dldGNCbG9ja1NpemUoY29uc3Qg dm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgYmxvY2tQcm9wZXJ0aWVzX3QgKmJwUHRyKQ0KK3Np emVfdCBJTklUIFpTVERfZ2V0Y0Jsb2NrU2l6ZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNT aXplLCBibG9ja1Byb3BlcnRpZXNfdCAqYnBQdHIpDQogew0KIAlpZiAoc3JjU2l6ZSA8IFpTVERf YmxvY2tIZWFkZXJTaXplKQ0KIAkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOw0KQEAgLTQw OSw3ICs0MDcsNyBAQCBzaXplX3QgWlNURF9nZXRjQmxvY2tTaXplKGNvbnN0IHZvaWQgKnNyYywg c2l6ZV90IHNyY1NpemUsIGJsb2NrUHJvcGVydGllc190ICpicA0KIAl9DQogfQ0KIA0KLXN0YXRp YyBzaXplX3QgWlNURF9jb3B5UmF3QmxvY2sodm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHks IGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQorc3RhdGljIHNpemVfdCBJTklUIFpT VERfY29weVJhd0Jsb2NrKHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lk ICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KIHsNCiAJaWYgKHNyY1NpemUgPiBkc3RDYXBhY2l0eSkN CiAJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsNCkBAIC00MTcsNyArNDE1LDcgQEAg c3RhdGljIHNpemVfdCBaU1REX2NvcHlSYXdCbG9jayh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBh Y2l0eSwgY29uc3Qgdm9pZCAqc3JjLA0KIAlyZXR1cm4gc3JjU2l6ZTsNCiB9DQogDQotc3RhdGlj IHNpemVfdCBaU1REX3NldFJsZUJsb2NrKHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBj b25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBzaXplX3QgcmVnZW5TaXplKQ0KK3N0YXRp YyBzaXplX3QgSU5JVCBaU1REX3NldFJsZUJsb2NrKHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFj aXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBzaXplX3QgcmVnZW5TaXplKQ0K IHsNCiAJaWYgKHNyY1NpemUgIT0gMSkNCiAJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsN CkBAIC00MjksNyArNDI3LDcgQEAgc3RhdGljIHNpemVfdCBaU1REX3NldFJsZUJsb2NrKHZvaWQg KmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHMNCiANCiAvKiEgWlNU RF9kZWNvZGVMaXRlcmFsc0Jsb2NrKCkgOg0KIAlAcmV0dXJuIDogbmIgb2YgYnl0ZXMgcmVhZCBm cm9tIHNyYyAoPCBzcmNTaXplICkgKi8NCi1zaXplX3QgWlNURF9kZWNvZGVMaXRlcmFsc0Jsb2Nr KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkgLyogbm90 ZSA6IHNyY1NpemUgPCBCTE9DS1NJWkUgKi8NCitzaXplX3QgSU5JVCBaU1REX2RlY29kZUxpdGVy YWxzQmxvY2soWlNURF9EQ3R4ICpkY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXpl KSAvKiBub3RlIDogc3JjU2l6ZSA8IEJMT0NLU0laRSAqLw0KIHsNCiAJaWYgKHNyY1NpemUgPCBN SU5fQ0JMT0NLX1NJWkUpDQogCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7DQpA QCAtNzQ5LDcgKzc0Nyw3IEBAIHN0YXRpYyBjb25zdCBGU0VfZGVjb2RlX3Q0IE9GX2RlZmF1bHRE VGFibGVbKDEgPDwgT0ZfREVGQVVMVE5PUk1MT0cpICsgMV0gPSB7DQogCUByZXR1cm4gOiBuYiBi eXRlcyByZWFkIGZyb20gc3JjLA0KIAkJCSAgb3IgYW4gZXJyb3IgY29kZSBpZiBpdCBmYWlscywg dGVzdGFibGUgd2l0aCBaU1REX2lzRXJyb3IoKQ0KICovDQotc3RhdGljIHNpemVfdCBaU1REX2J1 aWxkU2VxVGFibGUoRlNFX0RUYWJsZSAqRFRhYmxlU3BhY2UsIGNvbnN0IEZTRV9EVGFibGUgKipE VGFibGVQdHIsIHN5bWJvbEVuY29kaW5nVHlwZV9lIHR5cGUsIFUzMiBtYXgsIFUzMiBtYXhMb2cs IGNvbnN0IHZvaWQgKnNyYywNCitzdGF0aWMgc2l6ZV90IElOSVQgWlNURF9idWlsZFNlcVRhYmxl KEZTRV9EVGFibGUgKkRUYWJsZVNwYWNlLCBjb25zdCBGU0VfRFRhYmxlICoqRFRhYmxlUHRyLCBz eW1ib2xFbmNvZGluZ1R5cGVfZSB0eXBlLCBVMzIgbWF4LCBVMzIgbWF4TG9nLCBjb25zdCB2b2lk ICpzcmMsDQogCQkJCSBzaXplX3Qgc3JjU2l6ZSwgY29uc3QgRlNFX2RlY29kZV90NCAqZGVmYXVs dFRhYmxlLCBVMzIgZmxhZ1JlcGVhdFRhYmxlLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jr c3BhY2VTaXplKQ0KIHsNCiAJY29uc3Qgdm9pZCAqY29uc3QgdG1wUHRyID0gZGVmYXVsdFRhYmxl OyAvKiBieXBhc3Mgc3RyaWN0IGFsaWFzaW5nICovDQpAQCAtNzkxLDcgKzc4OSw3IEBAIHN0YXRp YyBzaXplX3QgWlNURF9idWlsZFNlcVRhYmxlKEZTRV9EVGFibGUgKkRUYWJsZVNwYWNlLCBjb25z dCBGU0VfRFRhYmxlICoqRFRhDQogCX0NCiB9DQogDQotc2l6ZV90IFpTVERfZGVjb2RlU2VxSGVh ZGVycyhaU1REX0RDdHggKmRjdHgsIGludCAqbmJTZXFQdHIsIGNvbnN0IHZvaWQgKnNyYywgc2l6 ZV90IHNyY1NpemUpDQorc2l6ZV90IElOSVQgWlNURF9kZWNvZGVTZXFIZWFkZXJzKFpTVERfREN0 eCAqZGN0eCwgaW50ICpuYlNlcVB0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkN CiB7DQogCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICpjb25zdClzcmM7 DQogCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOw0KQEAgLTg3Nyw3 ICs4NzUsNyBAQCB0eXBlZGVmIHN0cnVjdCB7DQogfSBzZXFTdGF0ZV90Ow0KIA0KIEZPUkNFX05P SU5MSU5FDQotc2l6ZV90IFpTVERfZXhlY1NlcXVlbmNlTGFzdDcoQllURSAqb3AsIEJZVEUgKmNv bnN0IG9lbmQsIHNlcV90IHNlcXVlbmNlLCBjb25zdCBCWVRFICoqbGl0UHRyLCBjb25zdCBCWVRF ICpjb25zdCBsaXRMaW1pdCwgY29uc3QgQllURSAqY29uc3QgYmFzZSwNCitzaXplX3QgSU5JVCBa U1REX2V4ZWNTZXF1ZW5jZUxhc3Q3KEJZVEUgKm9wLCBCWVRFICpjb25zdCBvZW5kLCBzZXFfdCBz ZXF1ZW5jZSwgY29uc3QgQllURSAqKmxpdFB0ciwgY29uc3QgQllURSAqY29uc3QgbGl0TGltaXQs IGNvbnN0IEJZVEUgKmNvbnN0IGJhc2UsDQogCQkJICAgICAgY29uc3QgQllURSAqY29uc3QgdkJh c2UsIGNvbnN0IEJZVEUgKmNvbnN0IGRpY3RFbmQpDQogew0KIAlCWVRFICpjb25zdCBvTGl0RW5k ID0gb3AgKyBzZXF1ZW5jZS5saXRMZW5ndGg7DQpAQCAtOTI4LDcgKzkyNiw3IEBAIHNpemVfdCBa U1REX2V4ZWNTZXF1ZW5jZUxhc3Q3KEJZVEUgKm9wLCBCWVRFICpjb25zdCBvZW5kLCBzZXFfdCBz ZXF1ZW5jZSwgY29uc3QNCiAJcmV0dXJuIHNlcXVlbmNlTGVuZ3RoOw0KIH0NCiANCi1zdGF0aWMg c2VxX3QgWlNURF9kZWNvZGVTZXF1ZW5jZShzZXFTdGF0ZV90ICpzZXFTdGF0ZSkNCitzdGF0aWMg c2VxX3QgSU5JVCBaU1REX2RlY29kZVNlcXVlbmNlKHNlcVN0YXRlX3QgKnNlcVN0YXRlKQ0KIHsN CiAJc2VxX3Qgc2VxOw0KIA0KQEAgLTEwOTAsNyArMTA4OCw3IEBAIHNpemVfdCBaU1REX2V4ZWNT ZXF1ZW5jZShCWVRFICpvcCwgQllURSAqY29uc3Qgb2VuZCwgc2VxX3Qgc2VxdWVuY2UsIGNvbnN0 IEJZVEUNCiAJcmV0dXJuIHNlcXVlbmNlTGVuZ3RoOw0KIH0NCiANCi1zdGF0aWMgc2l6ZV90IFpT VERfZGVjb21wcmVzc1NlcXVlbmNlcyhaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90 IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKnNlcVN0YXJ0LCBzaXplX3Qgc2VxU2l6ZSkNCitzdGF0 aWMgc2l6ZV90IElOSVQgWlNURF9kZWNvbXByZXNzU2VxdWVuY2VzKFpTVERfREN0eCAqZGN0eCwg dm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqc2VxU3RhcnQsIHNpemVf dCBzZXFTaXplKQ0KIHsNCiAJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKXNlcVN0YXJ0 Ow0KIAljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXAgKyBzZXFTaXplOw0KQEAgLTExNjAsNyAr MTE1OCw3IEBAIHN0YXRpYyBzaXplX3QgWlNURF9kZWNvbXByZXNzU2VxdWVuY2VzKFpTVERfREN0 eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0DQogCXJldHVybiBvcCAtIG9zdGFydDsN CiB9DQogDQotRk9SQ0VfSU5MSU5FIHNlcV90IFpTVERfZGVjb2RlU2VxdWVuY2VMb25nX2dlbmVy aWMoc2VxU3RhdGVfdCAqc2VxU3RhdGUsIGludCBjb25zdCBsb25nT2Zmc2V0cykNCitGT1JDRV9J TkxJTkUgc2VxX3QgSU5JVCBaU1REX2RlY29kZVNlcXVlbmNlTG9uZ19nZW5lcmljKHNlcVN0YXRl X3QgKnNlcVN0YXRlLCBpbnQgY29uc3QgbG9uZ09mZnNldHMpDQogew0KIAlzZXFfdCBzZXE7DQog DQpAQCAtMTI1MCw3ICsxMjQ4LDcgQEAgRk9SQ0VfSU5MSU5FIHNlcV90IFpTVERfZGVjb2RlU2Vx dWVuY2VMb25nX2dlbmVyaWMoc2VxU3RhdGVfdCAqc2VxU3RhdGUsIGludCBjb24NCiAJcmV0dXJu IHNlcTsNCiB9DQogDQotc3RhdGljIHNlcV90IFpTVERfZGVjb2RlU2VxdWVuY2VMb25nKHNlcVN0 YXRlX3QgKnNlcVN0YXRlLCB1bnNpZ25lZCBjb25zdCB3aW5kb3dTaXplKQ0KK3N0YXRpYyBzZXFf dCBJTklUIFpTVERfZGVjb2RlU2VxdWVuY2VMb25nKHNlcVN0YXRlX3QgKnNlcVN0YXRlLCB1bnNp Z25lZCBjb25zdCB3aW5kb3dTaXplKQ0KIHsNCiAJaWYgKFpTVERfaGlnaGJpdDMyKHdpbmRvd1Np emUpID4gU1RSRUFNX0FDQ1VNVUxBVE9SX01JTikgew0KIAkJcmV0dXJuIFpTVERfZGVjb2RlU2Vx dWVuY2VMb25nX2dlbmVyaWMoc2VxU3RhdGUsIDEpOw0KQEAgLTEzNDUsNyArMTM0Myw3IEBAIHNp emVfdCBaU1REX2V4ZWNTZXF1ZW5jZUxvbmcoQllURSAqb3AsIEJZVEUgKmNvbnN0IG9lbmQsIHNl cV90IHNlcXVlbmNlLCBjb25zdCBCDQogCXJldHVybiBzZXF1ZW5jZUxlbmd0aDsNCiB9DQogDQot c3RhdGljIHNpemVfdCBaU1REX2RlY29tcHJlc3NTZXF1ZW5jZXNMb25nKFpTVERfREN0eCAqZGN0 eCwgdm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqc2VxU3RhcnQsIHNp emVfdCBzZXFTaXplKQ0KK3N0YXRpYyBzaXplX3QgSU5JVCBaU1REX2RlY29tcHJlc3NTZXF1ZW5j ZXNMb25nKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29u c3Qgdm9pZCAqc2VxU3RhcnQsIHNpemVfdCBzZXFTaXplKQ0KIHsNCiAJY29uc3QgQllURSAqaXAg PSAoY29uc3QgQllURSAqKXNlcVN0YXJ0Ow0KIAljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXAg KyBzZXFTaXplOw0KQEAgLTE0NDIsNyArMTQ0MCw3IEBAIHN0YXRpYyBzaXplX3QgWlNURF9kZWNv bXByZXNzU2VxdWVuY2VzTG9uZyhaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IG1h DQogCXJldHVybiBvcCAtIG9zdGFydDsNCiB9DQogDQotc3RhdGljIHNpemVfdCBaU1REX2RlY29t cHJlc3NCbG9ja19pbnRlcm5hbChaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRz dENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KK3N0YXRpYyBzaXpl X3QgSU5JVCBaU1REX2RlY29tcHJlc3NCbG9ja19pbnRlcm5hbChaU1REX0RDdHggKmRjdHgsIHZv aWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNT aXplKQ0KIHsgLyogYmxvY2tUeXBlID09IGJsb2NrQ29tcHJlc3NlZCAqLw0KIAljb25zdCBCWVRF ICppcCA9IChjb25zdCBCWVRFICopc3JjOw0KIA0KQEAgLTE0NjYsNyArMTQ2NCw3IEBAIHN0YXRp YyBzaXplX3QgWlNURF9kZWNvbXByZXNzQmxvY2tfaW50ZXJuYWwoWlNURF9EQ3R4ICpkY3R4LCB2 b2lkICpkc3QsIHNpemVfdCBkDQogCXJldHVybiBaU1REX2RlY29tcHJlc3NTZXF1ZW5jZXMoZGN0 eCwgZHN0LCBkc3RDYXBhY2l0eSwgaXAsIHNyY1NpemUpOw0KIH0NCiANCi1zdGF0aWMgdm9pZCBa U1REX2NoZWNrQ29udGludWl0eShaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKmRzdCkNCitz dGF0aWMgdm9pZCBJTklUIFpTVERfY2hlY2tDb250aW51aXR5KFpTVERfREN0eCAqZGN0eCwgY29u c3Qgdm9pZCAqZHN0KQ0KIHsNCiAJaWYgKGRzdCAhPSBkY3R4LT5wcmV2aW91c0RzdEVuZCkgeyAv KiBub3QgY29udGlndW91cyAqLw0KIAkJZGN0eC0+ZGljdEVuZCA9IGRjdHgtPnByZXZpb3VzRHN0 RW5kOw0KQEAgLTE0NzYsNyArMTQ3NCw3IEBAIHN0YXRpYyB2b2lkIFpTVERfY2hlY2tDb250aW51 aXR5KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqZHN0KQ0KIAl9DQogfQ0KIA0KLXNpemVf dCBaU1REX2RlY29tcHJlc3NCbG9jayhaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90 IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KK3NpemVfdCBJ TklUIFpTVERfZGVjb21wcmVzc0Jsb2NrKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXpl X3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQogew0KIAlz aXplX3QgZFNpemU7DQogCVpTVERfY2hlY2tDb250aW51aXR5KGRjdHgsIGRzdCk7DQpAQCAtMTQ4 NywxNCArMTQ4NSwxNCBAQCBzaXplX3QgWlNURF9kZWNvbXByZXNzQmxvY2soWlNURF9EQ3R4ICpk Y3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29ucw0KIA0KIC8qKiBaU1REX2lu c2VydEJsb2NrKCkgOg0KIAlpbnNlcnQgYHNyY2AgYmxvY2sgaW50byBgZGN0eGAgaGlzdG9yeS4g VXNlZnVsIHRvIHRyYWNrIHVuY29tcHJlc3NlZCBibG9ja3MuICovDQotc2l6ZV90IFpTVERfaW5z ZXJ0QmxvY2soWlNURF9EQ3R4ICpkY3R4LCBjb25zdCB2b2lkICpibG9ja1N0YXJ0LCBzaXplX3Qg YmxvY2tTaXplKQ0KK3NpemVfdCBJTklUIFpTVERfaW5zZXJ0QmxvY2soWlNURF9EQ3R4ICpkY3R4 LCBjb25zdCB2b2lkICpibG9ja1N0YXJ0LCBzaXplX3QgYmxvY2tTaXplKQ0KIHsNCiAJWlNURF9j aGVja0NvbnRpbnVpdHkoZGN0eCwgYmxvY2tTdGFydCk7DQogCWRjdHgtPnByZXZpb3VzRHN0RW5k ID0gKGNvbnN0IGNoYXIgKilibG9ja1N0YXJ0ICsgYmxvY2tTaXplOw0KIAlyZXR1cm4gYmxvY2tT aXplOw0KIH0NCiANCi1zaXplX3QgWlNURF9nZW5lcmF0ZU54Qnl0ZXModm9pZCAqZHN0LCBzaXpl X3QgZHN0Q2FwYWNpdHksIEJZVEUgYnl0ZSwgc2l6ZV90IGxlbmd0aCkNCitzaXplX3QgSU5JVCBa U1REX2dlbmVyYXRlTnhCeXRlcyh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgQllURSBi eXRlLCBzaXplX3QgbGVuZ3RoKQ0KIHsNCiAJaWYgKGxlbmd0aCA+IGRzdENhcGFjaXR5KQ0KIAkJ cmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOw0KQEAgLTE1MDcsNyArMTUwNSw3IEBAIHNp emVfdCBaU1REX2dlbmVyYXRlTnhCeXRlcyh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwg QllURSBieXRlLCBzaXplX3QgbGVuDQogICogIGBzcmNgIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0 IG9mIGEgWlNURCBmcmFtZSwgWlNURCBsZWdhY3kgZnJhbWUsIG9yIHNraXBwYWJsZSBmcmFtZQ0K ICAqICBgc3JjU2l6ZWAgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgZnJhbWUgY29u dGFpbmVkDQogICogIEByZXR1cm4gOiB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBmcmFtZSBz dGFydGluZyBhdCBgc3JjYCAqLw0KLXNpemVfdCBaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXpl KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQorc2l6ZV90IElOSVQgWlNURF9maW5k RnJhbWVDb21wcmVzc2VkU2l6ZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KIHsN CiAJaWYgKHNyY1NpemUgPj0gWlNURF9za2lwcGFibGVIZWFkZXJTaXplICYmIChaU1REX3JlYWRM RTMyKHNyYykgJiAweEZGRkZGRkYwVSkgPT0gWlNURF9NQUdJQ19TS0lQUEFCTEVfU1RBUlQpIHsN CiAJCXJldHVybiBaU1REX3NraXBwYWJsZUhlYWRlclNpemUgKyBaU1REX3JlYWRMRTMyKChjb25z dCBCWVRFICopc3JjICsgNCk7DQpAQCAtMTU2Myw3ICsxNTYxLDcgQEAgc2l6ZV90IFpTVERfZmlu ZEZyYW1lQ29tcHJlc3NlZFNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCiAN CiAvKiEgWlNURF9kZWNvbXByZXNzRnJhbWUoKSA6DQogKiAgIEBkY3R4IG11c3QgYmUgcHJvcGVy bHkgaW5pdGlhbGl6ZWQgKi8NCi1zdGF0aWMgc2l6ZV90IFpTVERfZGVjb21wcmVzc0ZyYW1lKFpT VERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQg KipzcmNQdHIsIHNpemVfdCAqc3JjU2l6ZVB0cikNCitzdGF0aWMgc2l6ZV90IElOSVQgWlNURF9k ZWNvbXByZXNzRnJhbWUoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBh Y2l0eSwgY29uc3Qgdm9pZCAqKnNyY1B0ciwgc2l6ZV90ICpzcmNTaXplUHRyKQ0KIHsNCiAJY29u c3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKSgqc3JjUHRyKTsNCiAJQllURSAqY29uc3Qgb3N0 YXJ0ID0gKEJZVEUgKiBjb25zdClkc3Q7DQpAQCAtMTYzNywxMCArMTYzNSwxMCBAQCBzdGF0aWMg c2l6ZV90IFpTVERfZGVjb21wcmVzc0ZyYW1lKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBz aXplX3QgZHN0Q2FwYWNpdA0KIAlyZXR1cm4gb3AgLSBvc3RhcnQ7DQogfQ0KIA0KLXN0YXRpYyBj b25zdCB2b2lkICpaU1REX0REaWN0RGljdENvbnRlbnQoY29uc3QgWlNURF9ERGljdCAqZGRpY3Qp Ow0KLXN0YXRpYyBzaXplX3QgWlNURF9ERGljdERpY3RTaXplKGNvbnN0IFpTVERfRERpY3QgKmRk aWN0KTsNCitzdGF0aWMgY29uc3Qgdm9pZCBJTklUICpaU1REX0REaWN0RGljdENvbnRlbnQoY29u c3QgWlNURF9ERGljdCAqZGRpY3QpOw0KK3N0YXRpYyBzaXplX3QgSU5JVCBaU1REX0REaWN0RGlj dFNpemUoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOw0KIA0KLXN0YXRpYyBzaXplX3QgWlNURF9k ZWNvbXByZXNzTXVsdGlGcmFtZShaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRz dENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCB2b2lkICpk aWN0LCBzaXplX3QgZGljdFNpemUsDQorc3RhdGljIHNpemVfdCBJTklUIFpTVERfZGVjb21wcmVz c011bHRpRnJhbWUoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0 eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3Qgdm9pZCAqZGljdCwgc2l6 ZV90IGRpY3RTaXplLA0KIAkJCQkJY29uc3QgWlNURF9ERGljdCAqZGRpY3QpDQogew0KIAl2b2lk ICpjb25zdCBkc3RzdGFydCA9IGRzdDsNCkBAIC0xNzA0LDEyICsxNzAyLDEyIEBAIHN0YXRpYyBz aXplX3QgWlNURF9kZWNvbXByZXNzTXVsdGlGcmFtZShaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRz dCwgc2l6ZV90IGRzdENhDQogCXJldHVybiAoQllURSAqKWRzdCAtIChCWVRFICopZHN0c3RhcnQ7 DQogfQ0KIA0KLXNpemVfdCBaU1REX2RlY29tcHJlc3NfdXNpbmdEaWN0KFpTVERfREN0eCAqZGN0 eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90 IHNyY1NpemUsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkNCitzaXplX3QgSU5J VCBaU1REX2RlY29tcHJlc3NfdXNpbmdEaWN0KFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBz aXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0 IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkNCiB7DQogCXJldHVybiBaU1REX2RlY29tcHJl c3NNdWx0aUZyYW1lKGRjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSwgZGljdCwg ZGljdFNpemUsIE5VTEwpOw0KIH0NCiANCi1zaXplX3QgWlNURF9kZWNvbXByZXNzREN0eChaU1RE X0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpz cmMsIHNpemVfdCBzcmNTaXplKQ0KK3NpemVfdCBJTklUIFpTVERfZGVjb21wcmVzc0RDdHgoWlNU RF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAq c3JjLCBzaXplX3Qgc3JjU2l6ZSkNCiB7DQogCXJldHVybiBaU1REX2RlY29tcHJlc3NfdXNpbmdE aWN0KGRjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSwgTlVMTCwgMCk7DQogfQ0K QEAgLTE3MTgsOSArMTcxNiw5IEBAIHNpemVfdCBaU1REX2RlY29tcHJlc3NEQ3R4KFpTVERfREN0 eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0DQogKiAgIEFkdmFu Y2VkIFN0cmVhbWluZyBEZWNvbXByZXNzaW9uIEFQSQ0KICogICBCdWZmZXJsZXNzIGFuZCBzeW5j aHJvbm91cw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc2l6 ZV90IFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoWlNURF9EQ3R4ICpkY3R4KSB7IHJldHVy biBkY3R4LT5leHBlY3RlZDsgfQ0KK3NpemVfdCBJTklUIFpTVERfbmV4dFNyY1NpemVUb0RlY29t cHJlc3MoWlNURF9EQ3R4ICpkY3R4KSB7IHJldHVybiBkY3R4LT5leHBlY3RlZDsgfQ0KIA0KLVpT VERfbmV4dElucHV0VHlwZV9lIFpTVERfbmV4dElucHV0VHlwZShaU1REX0RDdHggKmRjdHgpDQor WlNURF9uZXh0SW5wdXRUeXBlX2UgSU5JVCBaU1REX25leHRJbnB1dFR5cGUoWlNURF9EQ3R4ICpk Y3R4KQ0KIHsNCiAJc3dpdGNoIChkY3R4LT5zdGFnZSkgew0KIAlkZWZhdWx0OiAvKiBzaG91bGQg bm90IGhhcHBlbiAqLw0KQEAgLTE3MzUsMTIgKzE3MzMsMTIgQEAgWlNURF9uZXh0SW5wdXRUeXBl X2UgWlNURF9uZXh0SW5wdXRUeXBlKFpTVERfREN0eCAqZGN0eCkNCiAJfQ0KIH0NCiANCi1pbnQg WlNURF9pc1NraXBGcmFtZShaU1REX0RDdHggKmRjdHgpIHsgcmV0dXJuIGRjdHgtPnN0YWdlID09 IFpTVERkc19za2lwRnJhbWU7IH0gLyogZm9yIHpidWZmICovDQoraW50IElOSVQgWlNURF9pc1Nr aXBGcmFtZShaU1REX0RDdHggKmRjdHgpIHsgcmV0dXJuIGRjdHgtPnN0YWdlID09IFpTVERkc19z a2lwRnJhbWU7IH0gLyogZm9yIHpidWZmICovDQogDQogLyoqIFpTVERfZGVjb21wcmVzc0NvbnRp bnVlKCkgOg0KICogICBAcmV0dXJuIDogbmIgb2YgYnl0ZXMgZ2VuZXJhdGVkIGludG8gYGRzdGAg KG5lY2Vzc2FyaWx5IDw9IGBkc3RDYXBhY2l0eSkNCiAqICAgICAgICAgICAgIG9yIGFuIGVycm9y IGNvZGUsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgWlNURF9pc0Vycm9yKCkgKi8NCi1zaXpl X3QgWlNURF9kZWNvbXByZXNzQ29udGludWUoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNp emVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkNCitzaXpl X3QgSU5JVCBaU1REX2RlY29tcHJlc3NDb250aW51ZShaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRz dCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0K IHsNCiAJLyogU2FuaXR5IGNoZWNrICovDQogCWlmIChzcmNTaXplICE9IGRjdHgtPmV4cGVjdGVk KQ0KQEAgLTE4NTksNyArMTg1Nyw3IEBAIHNpemVfdCBaU1REX2RlY29tcHJlc3NDb250aW51ZSha U1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjDQogCX0NCiB9 DQogDQotc3RhdGljIHNpemVfdCBaU1REX3JlZkRpY3RDb250ZW50KFpTVERfREN0eCAqZGN0eCwg Y29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQ0KK3N0YXRpYyBzaXplX3QgSU5JVCBa U1REX3JlZkRpY3RDb250ZW50KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6 ZV90IGRpY3RTaXplKQ0KIHsNCiAJZGN0eC0+ZGljdEVuZCA9IGRjdHgtPnByZXZpb3VzRHN0RW5k Ow0KIAlkY3R4LT52QmFzZSA9IChjb25zdCBjaGFyICopZGljdCAtICgoY29uc3QgY2hhciAqKShk Y3R4LT5wcmV2aW91c0RzdEVuZCkgLSAoY29uc3QgY2hhciAqKShkY3R4LT5iYXNlKSk7DQpAQCAt MTg3MSw3ICsxODY5LDcgQEAgc3RhdGljIHNpemVfdCBaU1REX3JlZkRpY3RDb250ZW50KFpTVERf REN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3QNCiAvKiBaU1REX2xvYWRF bnRyb3B5KCkgOg0KICAqIGRpY3QgOiBtdXN0IHBvaW50IGF0IGJlZ2lubmluZyBvZiBhIHZhbGlk IHpzdGQgZGljdGlvbmFyeQ0KICAqIEByZXR1cm4gOiBzaXplIG9mIGVudHJvcHkgdGFibGVzIHJl YWQgKi8NCi1zdGF0aWMgc2l6ZV90IFpTVERfbG9hZEVudHJvcHkoWlNURF9lbnRyb3B5VGFibGVz X3QgKmVudHJvcHksIGNvbnN0IHZvaWQgKmNvbnN0IGRpY3QsIHNpemVfdCBjb25zdCBkaWN0U2l6 ZSkNCitzdGF0aWMgc2l6ZV90IElOSVQgWlNURF9sb2FkRW50cm9weShaU1REX2VudHJvcHlUYWJs ZXNfdCAqZW50cm9weSwgY29uc3Qgdm9pZCAqY29uc3QgZGljdCwgc2l6ZV90IGNvbnN0IGRpY3RT aXplKQ0KIHsNCiAJY29uc3QgQllURSAqZGljdFB0ciA9IChjb25zdCBCWVRFICopZGljdDsNCiAJ Y29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RQdHIgKyBkaWN0U2l6ZTsNCkBAIC0xOTQw LDcgKzE5MzgsNyBAQCBzdGF0aWMgc2l6ZV90IFpTVERfbG9hZEVudHJvcHkoWlNURF9lbnRyb3B5 VGFibGVzX3QgKmVudHJvcHksIGNvbnN0IHZvaWQgKmNvbnN0DQogCXJldHVybiBkaWN0UHRyIC0g KGNvbnN0IEJZVEUgKilkaWN0Ow0KIH0NCiANCi1zdGF0aWMgc2l6ZV90IFpTVERfZGVjb21wcmVz c19pbnNlcnREaWN0aW9uYXJ5KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6 ZV90IGRpY3RTaXplKQ0KK3N0YXRpYyBzaXplX3QgSU5JVCBaU1REX2RlY29tcHJlc3NfaW5zZXJ0 RGljdGlvbmFyeShaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0 U2l6ZSkNCiB7DQogCWlmIChkaWN0U2l6ZSA8IDgpDQogCQlyZXR1cm4gWlNURF9yZWZEaWN0Q29u dGVudChkY3R4LCBkaWN0LCBkaWN0U2l6ZSk7DQpAQCAtMTk2Niw3ICsxOTY0LDcgQEAgc3RhdGlj IHNpemVfdCBaU1REX2RlY29tcHJlc3NfaW5zZXJ0RGljdGlvbmFyeShaU1REX0RDdHggKmRjdHgs IGNvbnN0IHZvaWQgKmRpY3QNCiAJcmV0dXJuIFpTVERfcmVmRGljdENvbnRlbnQoZGN0eCwgZGlj dCwgZGljdFNpemUpOw0KIH0NCiANCi1zaXplX3QgWlNURF9kZWNvbXByZXNzQmVnaW5fdXNpbmdE aWN0KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQ0K K3NpemVfdCBJTklUIFpTVERfZGVjb21wcmVzc0JlZ2luX3VzaW5nRGljdChaU1REX0RDdHggKmRj dHgsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkNCiB7DQogCUNIRUNLX0YoWlNU RF9kZWNvbXByZXNzQmVnaW4oZGN0eCkpOw0KIAlpZiAoZGljdCAmJiBkaWN0U2l6ZSkNCkBAIC0x OTg2LDEzICsxOTg0LDEzIEBAIHN0cnVjdCBaU1REX0REaWN0X3Mgew0KIAlaU1REX2N1c3RvbU1l bSBjTWVtOw0KIH07IC8qIHR5cGVkZWYnZCB0byBaU1REX0REaWN0IHdpdGhpbiAienN0ZC5oIiAq Lw0KIA0KLXNpemVfdCBaU1REX0REaWN0V29ya3NwYWNlQm91bmQodm9pZCkgeyByZXR1cm4gWlNU RF9BTElHTihzaXplb2YoWlNURF9zdGFjaykpICsgWlNURF9BTElHTihzaXplb2YoWlNURF9ERGlj dCkpOyB9DQorc2l6ZV90IElOSVQgWlNURF9ERGljdFdvcmtzcGFjZUJvdW5kKHZvaWQpIHsgcmV0 dXJuIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfc3RhY2spKSArIFpTVERfQUxJR04oc2l6ZW9mKFpT VERfRERpY3QpKTsgfQ0KIA0KLXN0YXRpYyBjb25zdCB2b2lkICpaU1REX0REaWN0RGljdENvbnRl bnQoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpIHsgcmV0dXJuIGRkaWN0LT5kaWN0Q29udGVudDsg fQ0KK3N0YXRpYyBjb25zdCB2b2lkIElOSVQgKlpTVERfRERpY3REaWN0Q29udGVudChjb25zdCBa U1REX0REaWN0ICpkZGljdCkgeyByZXR1cm4gZGRpY3QtPmRpY3RDb250ZW50OyB9DQogDQotc3Rh dGljIHNpemVfdCBaU1REX0REaWN0RGljdFNpemUoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpIHsg cmV0dXJuIGRkaWN0LT5kaWN0U2l6ZTsgfQ0KK3N0YXRpYyBzaXplX3QgSU5JVCBaU1REX0REaWN0 RGljdFNpemUoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpIHsgcmV0dXJuIGRkaWN0LT5kaWN0U2l6 ZTsgfQ0KIA0KLXN0YXRpYyB2b2lkIFpTVERfcmVmRERpY3QoWlNURF9EQ3R4ICpkc3REQ3R4LCBj b25zdCBaU1REX0REaWN0ICpkZGljdCkNCitzdGF0aWMgdm9pZCBJTklUIFpTVERfcmVmRERpY3Qo WlNURF9EQ3R4ICpkc3REQ3R4LCBjb25zdCBaU1REX0REaWN0ICpkZGljdCkNCiB7DQogCVpTVERf ZGVjb21wcmVzc0JlZ2luKGRzdERDdHgpOyAvKiBpbml0ICovDQogCWlmIChkZGljdCkgewkJICAg ICAgIC8qIHN1cHBvcnQgcmVmRERpY3Qgb24gTlVMTCAqLw0KQEAgLTIwMTgsNyArMjAxNiw3IEBA IHN0YXRpYyB2b2lkIFpTVERfcmVmRERpY3QoWlNURF9EQ3R4ICpkc3REQ3R4LCBjb25zdCBaU1RE X0REaWN0ICpkZGljdCkNCiAJfQ0KIH0NCiANCi1zdGF0aWMgc2l6ZV90IFpTVERfbG9hZEVudHJv cHlfaW5ERGljdChaU1REX0REaWN0ICpkZGljdCkNCitzdGF0aWMgc2l6ZV90IElOSVQgWlNURF9s b2FkRW50cm9weV9pbkREaWN0KFpTVERfRERpY3QgKmRkaWN0KQ0KIHsNCiAJZGRpY3QtPmRpY3RJ RCA9IDA7DQogCWRkaWN0LT5lbnRyb3B5UHJlc2VudCA9IDA7DQpAQCAtMjAzNyw3ICsyMDM1LDcg QEAgc3RhdGljIHNpemVfdCBaU1REX2xvYWRFbnRyb3B5X2luRERpY3QoWlNURF9ERGljdCAqZGRp Y3QpDQogCXJldHVybiAwOw0KIH0NCiANCi1zdGF0aWMgWlNURF9ERGljdCAqWlNURF9jcmVhdGVE RGljdF9hZHZhbmNlZChjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUsIHVuc2lnbmVk IGJ5UmVmZXJlbmNlLCBaU1REX2N1c3RvbU1lbSBjdXN0b21NZW0pDQorc3RhdGljIFpTVERfRERp Y3QgSU5JVCAqWlNURF9jcmVhdGVERGljdF9hZHZhbmNlZChjb25zdCB2b2lkICpkaWN0LCBzaXpl X3QgZGljdFNpemUsIHVuc2lnbmVkIGJ5UmVmZXJlbmNlLCBaU1REX2N1c3RvbU1lbSBjdXN0b21N ZW0pDQogew0KIAlpZiAoIWN1c3RvbU1lbS5jdXN0b21BbGxvYyB8fCAhY3VzdG9tTWVtLmN1c3Rv bUZyZWUpDQogCQlyZXR1cm4gTlVMTDsNCkBAIC0yMDgwLDEzICsyMDc4LDEzIEBAIHN0YXRpYyBa U1REX0REaWN0ICpaU1REX2NyZWF0ZUREaWN0X2FkdmFuY2VkKGNvbnN0IHZvaWQgKmRpY3QsIHNp emVfdCBkaWN0U2l6ZSwNCiAqICAgQ3JlYXRlIGEgZGlnZXN0ZWQgZGljdGlvbmFyeSwgdG8gc3Rh cnQgZGVjb21wcmVzc2lvbiB3aXRob3V0IHN0YXJ0dXAgZGVsYXkuDQogKiAgIGBkaWN0YCBjb250 ZW50IGlzIGNvcGllZCBpbnNpZGUgRERpY3QuDQogKiAgIENvbnNlcXVlbnRseSwgYGRpY3RgIGNh biBiZSByZWxlYXNlZCBhZnRlciBgWlNURF9ERGljdGAgY3JlYXRpb24gKi8NCi1aU1REX0REaWN0 ICpaU1REX2luaXRERGljdChjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUsIHZvaWQg KndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorWlNURF9ERGljdCBJTklUICpaU1RE X2luaXRERGljdChjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUsIHZvaWQgKndvcmtz cGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQogew0KIAlaU1REX2N1c3RvbU1lbSBjb25zdCBz dGFja01lbSA9IFpTVERfaW5pdFN0YWNrKHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7DQogCXJl dHVybiBaU1REX2NyZWF0ZUREaWN0X2FkdmFuY2VkKGRpY3QsIGRpY3RTaXplLCAxLCBzdGFja01l bSk7DQogfQ0KIA0KLXNpemVfdCBaU1REX2ZyZWVERGljdChaU1REX0REaWN0ICpkZGljdCkNCitz aXplX3QgSU5JVCBaU1REX2ZyZWVERGljdChaU1REX0REaWN0ICpkZGljdCkNCiB7DQogCWlmIChk ZGljdCA9PSBOVUxMKQ0KIAkJcmV0dXJuIDA7IC8qIHN1cHBvcnQgZnJlZSBvbiBOVUxMICovDQpA QCAtMjEwMiw3ICsyMTAwLDcgQEAgc2l6ZV90IFpTVERfZnJlZUREaWN0KFpTVERfRERpY3QgKmRk aWN0KQ0KICAqICBQcm92aWRlcyB0aGUgZGljdElEIHN0b3JlZCB3aXRoaW4gZGljdGlvbmFyeS4N CiAgKiAgaWYgQHJldHVybiA9PSAwLCB0aGUgZGljdGlvbmFyeSBpcyBub3QgY29uZm9ybWFudCB3 aXRoIFpzdGFuZGFyZCBzcGVjaWZpY2F0aW9uLg0KICAqICBJdCBjYW4gc3RpbGwgYmUgbG9hZGVk LCBidXQgYXMgYSBjb250ZW50LW9ubHkgZGljdGlvbmFyeS4gKi8NCi11bnNpZ25lZCBaU1REX2dl dERpY3RJRF9mcm9tRGljdChjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUpDQordW5z aWduZWQgSU5JVCBaU1REX2dldERpY3RJRF9mcm9tRGljdChjb25zdCB2b2lkICpkaWN0LCBzaXpl X3QgZGljdFNpemUpDQogew0KIAlpZiAoZGljdFNpemUgPCA4KQ0KIAkJcmV0dXJuIDA7DQpAQCAt MjExNSw3ICsyMTEzLDcgQEAgdW5zaWduZWQgWlNURF9nZXREaWN0SURfZnJvbURpY3QoY29uc3Qg dm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQ0KICAqICBQcm92aWRlcyB0aGUgZGljdElEIG9m IHRoZSBkaWN0aW9uYXJ5IGxvYWRlZCBpbnRvIGBkZGljdGAuDQogICogIElmIEByZXR1cm4gPT0g MCwgdGhlIGRpY3Rpb25hcnkgaXMgbm90IGNvbmZvcm1hbnQgdG8gWnN0YW5kYXJkIHNwZWNpZmlj YXRpb24sIG9yIGVtcHR5Lg0KICAqICBOb24tY29uZm9ybWFudCBkaWN0aW9uYXJpZXMgY2FuIHN0 aWxsIGJlIGxvYWRlZCwgYnV0IGFzIGNvbnRlbnQtb25seSBkaWN0aW9uYXJpZXMuICovDQotdW5z aWduZWQgWlNURF9nZXREaWN0SURfZnJvbUREaWN0KGNvbnN0IFpTVERfRERpY3QgKmRkaWN0KQ0K K3Vuc2lnbmVkIElOSVQgWlNURF9nZXREaWN0SURfZnJvbUREaWN0KGNvbnN0IFpTVERfRERpY3Qg KmRkaWN0KQ0KIHsNCiAJaWYgKGRkaWN0ID09IE5VTEwpDQogCQlyZXR1cm4gMDsNCkBAIC0yMTMy LDcgKzIxMzAsNyBAQCB1bnNpZ25lZCBaU1REX2dldERpY3RJRF9mcm9tRERpY3QoY29uc3QgWlNU RF9ERGljdCAqZGRpY3QpDQogICogIC0gYHNyY1NpemVgIGlzIHRvbyBzbWFsbCwgYW5kIGFzIGEg cmVzdWx0LCB0aGUgZnJhbWUgaGVhZGVyIGNvdWxkIG5vdCBiZSBkZWNvZGVkIChvbmx5IHBvc3Np YmxlIGlmIGBzcmNTaXplIDwgWlNURF9GUkFNRUhFQURFUlNJWkVfTUFYYCkuDQogICogIC0gVGhp cyBpcyBub3QgYSBac3RhbmRhcmQgZnJhbWUuDQogICogIFdoZW4gaWRlbnRpZnlpbmcgdGhlIGV4 YWN0IGZhaWx1cmUgY2F1c2UsIGl0J3MgcG9zc2libGUgdG8gdXNlZCBaU1REX2dldEZyYW1lUGFy YW1zKCksIHdoaWNoIHdpbGwgcHJvdmlkZSBhIG1vcmUgcHJlY2lzZSBlcnJvciBjb2RlLiAqLw0K LXVuc2lnbmVkIFpTVERfZ2V0RGljdElEX2Zyb21GcmFtZShjb25zdCB2b2lkICpzcmMsIHNpemVf dCBzcmNTaXplKQ0KK3Vuc2lnbmVkIElOSVQgWlNURF9nZXREaWN0SURfZnJvbUZyYW1lKGNvbnN0 IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpDQogew0KIAlaU1REX2ZyYW1lUGFyYW1zIHpmcCA9 IHswLCAwLCAwLCAwfTsNCiAJc2l6ZV90IGNvbnN0IGhFcnJvciA9IFpTVERfZ2V0RnJhbWVQYXJh bXMoJnpmcCwgc3JjLCBzcmNTaXplKTsNCkBAIC0yMTQ0LDcgKzIxNDIsNyBAQCB1bnNpZ25lZCBa U1REX2dldERpY3RJRF9mcm9tRnJhbWUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkN CiAvKiEgWlNURF9kZWNvbXByZXNzX3VzaW5nRERpY3QoKSA6DQogKiAgIERlY29tcHJlc3Npb24g dXNpbmcgYSBwcmUtZGlnZXN0ZWQgRGljdGlvbmFyeQ0KICogICBVc2UgZGljdGlvbmFyeSB3aXRo b3V0IHNpZ25pZmljYW50IG92ZXJoZWFkLiAqLw0KLXNpemVfdCBaU1REX2RlY29tcHJlc3NfdXNp bmdERGljdChaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBj b25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBaU1REX0REaWN0ICpkZGljdCkN CitzaXplX3QgSU5JVCBaU1REX2RlY29tcHJlc3NfdXNpbmdERGljdChaU1REX0RDdHggKmRjdHgs IHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBz cmNTaXplLCBjb25zdCBaU1REX0REaWN0ICpkZGljdCkNCiB7DQogCS8qIHBhc3MgY29udGVudCBh bmQgc2l6ZSBpbiBjYXNlIGxlZ2FjeSBmcmFtZXMgYXJlIGVuY291bnRlcmVkICovDQogCXJldHVy biBaU1REX2RlY29tcHJlc3NNdWx0aUZyYW1lKGRjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywg c3JjU2l6ZSwgTlVMTCwgMCwgZGRpY3QpOw0KQEAgLTIxODEsNyArMjE3OSw3IEBAIHN0cnVjdCBa U1REX0RTdHJlYW1fcyB7DQogCVUzMiBob3N0YWdlQnl0ZTsNCiB9OyAvKiB0eXBlZGVmJ2QgdG8g WlNURF9EU3RyZWFtIHdpdGhpbiAienN0ZC5oIiAqLw0KIA0KLXNpemVfdCBaU1REX0RTdHJlYW1X b3Jrc3BhY2VCb3VuZChzaXplX3QgbWF4V2luZG93U2l6ZSkNCitzaXplX3QgSU5JVCBaU1REX0RT dHJlYW1Xb3Jrc3BhY2VCb3VuZChzaXplX3QgbWF4V2luZG93U2l6ZSkNCiB7DQogCXNpemVfdCBj b25zdCBibG9ja1NpemUgPSBNSU4obWF4V2luZG93U2l6ZSwgWlNURF9CTE9DS1NJWkVfQUJTT0xV VEVNQVgpOw0KIAlzaXplX3QgY29uc3QgaW5CdWZmU2l6ZSA9IGJsb2NrU2l6ZTsNCkBAIC0yMTg5 LDcgKzIxODcsNyBAQCBzaXplX3QgWlNURF9EU3RyZWFtV29ya3NwYWNlQm91bmQoc2l6ZV90IG1h eFdpbmRvd1NpemUpDQogCXJldHVybiBaU1REX0RDdHhXb3Jrc3BhY2VCb3VuZCgpICsgWlNURF9B TElHTihzaXplb2YoWlNURF9EU3RyZWFtKSkgKyBaU1REX0FMSUdOKGluQnVmZlNpemUpICsgWlNU RF9BTElHTihvdXRCdWZmU2l6ZSk7DQogfQ0KIA0KLXN0YXRpYyBaU1REX0RTdHJlYW0gKlpTVERf Y3JlYXRlRFN0cmVhbV9hZHZhbmNlZChaU1REX2N1c3RvbU1lbSBjdXN0b21NZW0pDQorc3RhdGlj IFpTVERfRFN0cmVhbSBJTklUICpaU1REX2NyZWF0ZURTdHJlYW1fYWR2YW5jZWQoWlNURF9jdXN0 b21NZW0gY3VzdG9tTWVtKQ0KIHsNCiAJWlNURF9EU3RyZWFtICp6ZHM7DQogDQpAQCAtMjIxMSw3 ICsyMjA5LDcgQEAgc3RhdGljIFpTVERfRFN0cmVhbSAqWlNURF9jcmVhdGVEU3RyZWFtX2FkdmFu Y2VkKFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkNCiAJcmV0dXJuIHpkczsNCiB9DQogDQotWlNU RF9EU3RyZWFtICpaU1REX2luaXREU3RyZWFtKHNpemVfdCBtYXhXaW5kb3dTaXplLCB2b2lkICp3 b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK1pTVERfRFN0cmVhbSBJTklUICpaU1RE X2luaXREU3RyZWFtKHNpemVfdCBtYXhXaW5kb3dTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVf dCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJWlNURF9jdXN0b21NZW0gY29uc3Qgc3RhY2tNZW0gPSBa U1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOw0KIAlaU1REX0RTdHJlYW0g KnpkcyA9IFpTVERfY3JlYXRlRFN0cmVhbV9hZHZhbmNlZChzdGFja01lbSk7DQpAQCAtMjI0NCw3 ICsyMjQyLDcgQEAgWlNURF9EU3RyZWFtICpaU1REX2luaXREU3RyZWFtKHNpemVfdCBtYXhXaW5k b3dTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3INCiAJcmV0dXJuIHpkczsNCiB9DQog DQotWlNURF9EU3RyZWFtICpaU1REX2luaXREU3RyZWFtX3VzaW5nRERpY3Qoc2l6ZV90IG1heFdp bmRvd1NpemUsIGNvbnN0IFpTVERfRERpY3QgKmRkaWN0LCB2b2lkICp3b3Jrc3BhY2UsIHNpemVf dCB3b3Jrc3BhY2VTaXplKQ0KK1pTVERfRFN0cmVhbSBJTklUICpaU1REX2luaXREU3RyZWFtX3Vz aW5nRERpY3Qoc2l6ZV90IG1heFdpbmRvd1NpemUsIGNvbnN0IFpTVERfRERpY3QgKmRkaWN0LCB2 b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJWlNURF9EU3RyZWFt ICp6ZHMgPSBaU1REX2luaXREU3RyZWFtKG1heFdpbmRvd1NpemUsIHdvcmtzcGFjZSwgd29ya3Nw YWNlU2l6ZSk7DQogCWlmICh6ZHMpIHsNCkBAIC0yMjUzLDcgKzIyNTEsNyBAQCBaU1REX0RTdHJl YW0gKlpTVERfaW5pdERTdHJlYW1fdXNpbmdERGljdChzaXplX3QgbWF4V2luZG93U2l6ZSwgY29u c3QgWlNURF9ERGljdA0KIAlyZXR1cm4gemRzOw0KIH0NCiANCi1zaXplX3QgWlNURF9mcmVlRFN0 cmVhbShaU1REX0RTdHJlYW0gKnpkcykNCitzaXplX3QgSU5JVCBaU1REX2ZyZWVEU3RyZWFtKFpT VERfRFN0cmVhbSAqemRzKQ0KIHsNCiAJaWYgKHpkcyA9PSBOVUxMKQ0KIAkJcmV0dXJuIDA7IC8q IHN1cHBvcnQgZnJlZSBvbiBudWxsICovDQpAQCAtMjI3NCwxMCArMjI3MiwxMCBAQCBzaXplX3Qg WlNURF9mcmVlRFN0cmVhbShaU1REX0RTdHJlYW0gKnpkcykNCiANCiAvKiAqKiogSW5pdGlhbGl6 YXRpb24gKioqICovDQogDQotc2l6ZV90IFpTVERfRFN0cmVhbUluU2l6ZSh2b2lkKSB7IHJldHVy biBaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCArIFpTVERfYmxvY2tIZWFkZXJTaXplOyB9DQot c2l6ZV90IFpTVERfRFN0cmVhbU91dFNpemUodm9pZCkgeyByZXR1cm4gWlNURF9CTE9DS1NJWkVf QUJTT0xVVEVNQVg7IH0NCitzaXplX3QgSU5JVCBaU1REX0RTdHJlYW1JblNpemUodm9pZCkgeyBy ZXR1cm4gWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVggKyBaU1REX2Jsb2NrSGVhZGVyU2l6ZTsg fQ0KK3NpemVfdCBJTklUIFpTVERfRFN0cmVhbU91dFNpemUodm9pZCkgeyByZXR1cm4gWlNURF9C TE9DS1NJWkVfQUJTT0xVVEVNQVg7IH0NCiANCi1zaXplX3QgWlNURF9yZXNldERTdHJlYW0oWlNU RF9EU3RyZWFtICp6ZHMpDQorc2l6ZV90IElOSVQgWlNURF9yZXNldERTdHJlYW0oWlNURF9EU3Ry ZWFtICp6ZHMpDQogew0KIAl6ZHMtPnN0YWdlID0gemRzc19sb2FkSGVhZGVyOw0KIAl6ZHMtPmxo U2l6ZSA9IHpkcy0+aW5Qb3MgPSB6ZHMtPm91dFN0YXJ0ID0gemRzLT5vdXRFbmQgPSAwOw0KQEAg LTIyODgsMTQgKzIyODYsMTQgQEAgc2l6ZV90IFpTVERfcmVzZXREU3RyZWFtKFpTVERfRFN0cmVh bSAqemRzKQ0KIA0KIC8qICoqKioqICAgRGVjb21wcmVzc2lvbiAgICoqKioqICovDQogDQotWlNU RF9TVEFUSUMgc2l6ZV90IFpTVERfbGltaXRDb3B5KHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFj aXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KK1pTVERfU1RBVElDIHNpemVf dCBJTklUIFpTVERfbGltaXRDb3B5KHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25z dCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQ0KIHsNCiAJc2l6ZV90IGNvbnN0IGxlbmd0aCA9 IE1JTihkc3RDYXBhY2l0eSwgc3JjU2l6ZSk7DQogCW1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsN CiAJcmV0dXJuIGxlbmd0aDsNCiB9DQogDQotc2l6ZV90IFpTVERfZGVjb21wcmVzc1N0cmVhbSha U1REX0RTdHJlYW0gKnpkcywgWlNURF9vdXRCdWZmZXIgKm91dHB1dCwgWlNURF9pbkJ1ZmZlciAq aW5wdXQpDQorc2l6ZV90IElOSVQgWlNURF9kZWNvbXByZXNzU3RyZWFtKFpTVERfRFN0cmVhbSAq emRzLCBaU1REX291dEJ1ZmZlciAqb3V0cHV0LCBaU1REX2luQnVmZmVyICppbnB1dCkNCiB7DQog CWNvbnN0IGNoYXIgKmNvbnN0IGlzdGFydCA9IChjb25zdCBjaGFyICopKGlucHV0LT5zcmMpICsg aW5wdXQtPnBvczsNCiAJY29uc3QgY2hhciAqY29uc3QgaWVuZCA9IChjb25zdCBjaGFyICopKGlu cHV0LT5zcmMpICsgaW5wdXQtPnNpemU7DQpAQCAtMjQ4OSw0MyArMjQ4NywzIEBAIHNpemVfdCBa U1REX2RlY29tcHJlc3NTdHJlYW0oWlNURF9EU3RyZWFtICp6ZHMsIFpTVERfb3V0QnVmZmVyICpv dXRwdXQsIFpTVERfaW5CDQogCQlyZXR1cm4gbmV4dFNyY1NpemVIaW50Ow0KIAl9DQogfQ0KLQ0K LUVYUE9SVF9TWU1CT0woWlNURF9EQ3R4V29ya3NwYWNlQm91bmQpOw0KLUVYUE9SVF9TWU1CT0wo WlNURF9pbml0REN0eCk7DQotRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NEQ3R4KTsNCi1F WFBPUlRfU1lNQk9MKFpTVERfZGVjb21wcmVzc191c2luZ0RpY3QpOw0KLQ0KLUVYUE9SVF9TWU1C T0woWlNURF9ERGljdFdvcmtzcGFjZUJvdW5kKTsNCi1FWFBPUlRfU1lNQk9MKFpTVERfaW5pdERE aWN0KTsNCi1FWFBPUlRfU1lNQk9MKFpTVERfZGVjb21wcmVzc191c2luZ0REaWN0KTsNCi0NCi1F WFBPUlRfU1lNQk9MKFpTVERfRFN0cmVhbVdvcmtzcGFjZUJvdW5kKTsNCi1FWFBPUlRfU1lNQk9M KFpTVERfaW5pdERTdHJlYW0pOw0KLUVYUE9SVF9TWU1CT0woWlNURF9pbml0RFN0cmVhbV91c2lu Z0REaWN0KTsNCi1FWFBPUlRfU1lNQk9MKFpTVERfcmVzZXREU3RyZWFtKTsNCi1FWFBPUlRfU1lN Qk9MKFpTVERfZGVjb21wcmVzc1N0cmVhbSk7DQotRVhQT1JUX1NZTUJPTChaU1REX0RTdHJlYW1J blNpemUpOw0KLUVYUE9SVF9TWU1CT0woWlNURF9EU3RyZWFtT3V0U2l6ZSk7DQotDQotRVhQT1JU X1NZTUJPTChaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKTsNCi1FWFBPUlRfU1lNQk9MKFpT VERfZ2V0RnJhbWVDb250ZW50U2l6ZSk7DQotRVhQT1JUX1NZTUJPTChaU1REX2ZpbmREZWNvbXBy ZXNzZWRTaXplKTsNCi0NCi1FWFBPUlRfU1lNQk9MKFpTVERfaXNGcmFtZSk7DQotRVhQT1JUX1NZ TUJPTChaU1REX2dldERpY3RJRF9mcm9tRGljdCk7DQotRVhQT1JUX1NZTUJPTChaU1REX2dldERp Y3RJRF9mcm9tRERpY3QpOw0KLUVYUE9SVF9TWU1CT0woWlNURF9nZXREaWN0SURfZnJvbUZyYW1l KTsNCi0NCi1FWFBPUlRfU1lNQk9MKFpTVERfZ2V0RnJhbWVQYXJhbXMpOw0KLUVYUE9SVF9TWU1C T0woWlNURF9kZWNvbXByZXNzQmVnaW4pOw0KLUVYUE9SVF9TWU1CT0woWlNURF9kZWNvbXByZXNz QmVnaW5fdXNpbmdEaWN0KTsNCi1FWFBPUlRfU1lNQk9MKFpTVERfY29weURDdHgpOw0KLUVYUE9S VF9TWU1CT0woWlNURF9uZXh0U3JjU2l6ZVRvRGVjb21wcmVzcyk7DQotRVhQT1JUX1NZTUJPTCha U1REX2RlY29tcHJlc3NDb250aW51ZSk7DQotRVhQT1JUX1NZTUJPTChaU1REX25leHRJbnB1dFR5 cGUpOw0KLQ0KLUVYUE9SVF9TWU1CT0woWlNURF9kZWNvbXByZXNzQmxvY2spOw0KLUVYUE9SVF9T WU1CT0woWlNURF9pbnNlcnRCbG9jayk7DQotDQotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQ TCIpOw0KLU1PRFVMRV9ERVNDUklQVElPTigiWnN0ZCBEZWNvbXByZXNzb3IiKTsNCmRpZmYgLS1n aXQgYS94ZW4vY29tbW9uL3pzdGQvZW50cm9weV9jb21tb24uYyBiL3hlbi9jb21tb24venN0ZC9l bnRyb3B5X2NvbW1vbi5jDQppbmRleCAyYjBhNjQzYzMyLi5iY2RiNTc5ODJiIDEwMDY0NA0KLS0t IGEveGVuL2NvbW1vbi96c3RkL2VudHJvcHlfY29tbW9uLmMNCisrKyBiL3hlbi9jb21tb24venN0 ZC9lbnRyb3B5X2NvbW1vbi5jDQpAQCAtNDYsMTcgKzQ2LDE3IEBADQogI2luY2x1ZGUgIm1lbS5o Ig0KIA0KIC8qPT09ICAgVmVyc2lvbiAgID09PSovDQotdW5zaWduZWQgRlNFX3ZlcnNpb25OdW1i ZXIodm9pZCkgeyByZXR1cm4gRlNFX1ZFUlNJT05fTlVNQkVSOyB9DQordW5zaWduZWQgSU5JVCBG U0VfdmVyc2lvbk51bWJlcih2b2lkKSB7IHJldHVybiBGU0VfVkVSU0lPTl9OVU1CRVI7IH0NCiAN CiAvKj09PSAgIEVycm9yIE1hbmFnZW1lbnQgICA9PT0qLw0KLXVuc2lnbmVkIEZTRV9pc0Vycm9y KHNpemVfdCBjb2RlKSB7IHJldHVybiBFUlJfaXNFcnJvcihjb2RlKTsgfQ0KK3Vuc2lnbmVkIElO SVQgRlNFX2lzRXJyb3Ioc2l6ZV90IGNvZGUpIHsgcmV0dXJuIEVSUl9pc0Vycm9yKGNvZGUpOyB9 DQogDQotdW5zaWduZWQgSFVGX2lzRXJyb3Ioc2l6ZV90IGNvZGUpIHsgcmV0dXJuIEVSUl9pc0Vy cm9yKGNvZGUpOyB9DQordW5zaWduZWQgSU5JVCBIVUZfaXNFcnJvcihzaXplX3QgY29kZSkgeyBy ZXR1cm4gRVJSX2lzRXJyb3IoY29kZSk7IH0NCiANCiAvKi0qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogIEZTRSBOQ291bnQg ZW5jb2RpbmctZGVjb2RpbmcNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXNpemVfdCBGU0VfcmVhZE5Db3VudChzaG9y dCAqbm9ybWFsaXplZENvdW50ZXIsIHVuc2lnbmVkICptYXhTVlB0ciwgdW5zaWduZWQgKnRhYmxl TG9nUHRyLCBjb25zdCB2b2lkICpoZWFkZXJCdWZmZXIsIHNpemVfdCBoYlNpemUpDQorc2l6ZV90 IElOSVQgRlNFX3JlYWROQ291bnQoc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCAq bWF4U1ZQdHIsIHVuc2lnbmVkICp0YWJsZUxvZ1B0ciwgY29uc3Qgdm9pZCAqaGVhZGVyQnVmZmVy LCBzaXplX3QgaGJTaXplKQ0KIHsNCiAJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0 IEJZVEUgKiloZWFkZXJCdWZmZXI7DQogCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQg KyBoYlNpemU7DQpAQCAtMTY0LDcgKzE2NCw3IEBAIHNpemVfdCBGU0VfcmVhZE5Db3VudChzaG9y dCAqbm9ybWFsaXplZENvdW50ZXIsIHVuc2lnbmVkICptYXhTVlB0ciwgdW5zaWduZWQgKnRhDQog CUByZXR1cm4gOiBzaXplIHJlYWQgZnJvbSBgc3JjYCAsIG9yIGFuIGVycm9yIENvZGUgLg0KIAlO b3RlIDogTmVlZGVkIGJ5IEhVRl9yZWFkQ1RhYmxlKCkgYW5kIEhVRl9yZWFkRFRhYmxlWD8oKSAu DQogKi8NCi1zaXplX3QgSFVGX3JlYWRTdGF0c193a3NwKEJZVEUgKmh1ZmZXZWlnaHQsIHNpemVf dCBod1NpemUsIFUzMiAqcmFua1N0YXRzLCBVMzIgKm5iU3ltYm9sc1B0ciwgVTMyICp0YWJsZUxv Z1B0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBz aXplX3Qgd29ya3NwYWNlU2l6ZSkNCitzaXplX3QgSU5JVCBIVUZfcmVhZFN0YXRzX3drc3AoQllU RSAqaHVmZldlaWdodCwgc2l6ZV90IGh3U2l6ZSwgVTMyICpyYW5rU3RhdHMsIFUzMiAqbmJTeW1i b2xzUHRyLCBVMzIgKnRhYmxlTG9nUHRyLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXpl LCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJVTMyIHdlaWdo dFRvdGFsOw0KIAljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc3JjOw0KZGlmZiAtLWdp dCBhL3hlbi9jb21tb24venN0ZC9lcnJvcl9wcml2YXRlLmggYi94ZW4vY29tbW9uL3pzdGQvZXJy b3JfcHJpdmF0ZS5oDQppbmRleCAxYTYwYjMxZjcwLi5lY2JmZTUxZGZiIDEwMDY0NA0KLS0tIGEv eGVuL2NvbW1vbi96c3RkL2Vycm9yX3ByaXZhdGUuaA0KKysrIGIveGVuL2NvbW1vbi96c3RkL2Vy cm9yX3ByaXZhdGUuaA0KQEAgLTIyLDggKzIyLDggQEANCiAvKiAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqDQogKiAgRGVwZW5kZW5jaWVzDQogKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAv KiBzaXplX3QgKi8NCi0jaW5jbHVkZSA8bGludXgvenN0ZC5oPiAgLyogZW51bSBsaXN0ICovDQor I2luY2x1ZGUgPHhlbi90eXBlcy5oPiAvKiBzaXplX3QgKi8NCisjaW5jbHVkZSA8eGVuL3pzdGQu aD4gIC8qIGVudW0gbGlzdCAqLw0KIA0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioNCiAqICBDb21waWxlci1zcGVjaWZpYw0KZGlmZiAtLWdpdCBhL3hlbi9jb21t b24venN0ZC9mc2UuaCBiL3hlbi9jb21tb24venN0ZC9mc2UuaA0KaW5kZXggNzQ2MGFiMDRiMS4u Yjg2NzE3YzM0ZCAxMDA2NDQNCi0tLSBhL3hlbi9jb21tb24venN0ZC9mc2UuaA0KKysrIGIveGVu L2NvbW1vbi96c3RkL2ZzZS5oDQpAQCAtNDMsNyArNDMsNyBAQA0KIC8qLSoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgRGVwZW5kZW5jaWVzDQogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpbmNsdWRlIDxsaW51eC90eXBl cy5oPiAvKiBzaXplX3QsIHB0cmRpZmZfdCAqLw0KKyNpbmNsdWRlIDx4ZW4vdHlwZXMuaD4gLyog c2l6ZV90LCBwdHJkaWZmX3QgKi8NCiANCiAvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKg0KICogIEZTRV9QVUJMSUNfQVBJIDogY29udHJvbCBsaWJyYXJ5IHN5bWJv bHMgdmlzaWJpbGl0eQ0KZGlmZiAtLWdpdCBhL3hlbi9jb21tb24venN0ZC9mc2VfZGVjb21wcmVz cy5jIGIveGVuL2NvbW1vbi96c3RkL2ZzZV9kZWNvbXByZXNzLmMNCmluZGV4IDBiMzUzNTMwZmIu LjA0MWE1YTFmMGEgMTAwNjQ0DQotLS0gYS94ZW4vY29tbW9uL3pzdGQvZnNlX2RlY29tcHJlc3Mu Yw0KKysrIGIveGVuL2NvbW1vbi96c3RkL2ZzZV9kZWNvbXByZXNzLmMNCkBAIC00MCw3ICs0MCw3 IEBADQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioNCiAqICBDb21waWxlciBzcGVjaWZpY3MNCiAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZp bmUgRk9SQ0VfSU5MSU5FIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUNCisjZGVmaW5lIEZPUkNFX0lO TElORSBzdGF0aWMgYWx3YXlzX2lubGluZQ0KIA0KIC8qICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgSW5jbHVkZXMNCkBA IC00OCw5ICs0OCw3IEBADQogI2luY2x1ZGUgImJpdHN0cmVhbS5oIg0KICNpbmNsdWRlICJmc2Uu aCINCiAjaW5jbHVkZSAienN0ZF9pbnRlcm5hbC5oIg0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxl ci5oPg0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCi0jaW5jbHVkZSA8bGludXgvc3RyaW5n Lmg+IC8qIG1lbWNweSwgbWVtc2V0ICovDQorI2luY2x1ZGUgPHhlbi9zdHJpbmcuaD4gLyogbWVt Y3B5LCBtZW1zZXQgKi8NCiANCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogIEVycm9yIE1hbmFnZW1lbnQNCkBAIC04 NSw3ICs4Myw3IEBADQogDQogLyogRnVuY3Rpb24gdGVtcGxhdGVzICovDQogDQotc2l6ZV90IEZT RV9idWlsZERUYWJsZV93a3NwKEZTRV9EVGFibGUgKmR0LCBjb25zdCBzaG9ydCAqbm9ybWFsaXpl ZENvdW50ZXIsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywgdm9p ZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCitzaXplX3QgSU5JVCBGU0VfYnVp bGREVGFibGVfd2tzcChGU0VfRFRhYmxlICpkdCwgY29uc3Qgc2hvcnQgKm5vcm1hbGl6ZWRDb3Vu dGVyLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwgdW5zaWduZWQgdGFibGVMb2csIHZvaWQgKndv cmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQogew0KIAl2b2lkICpjb25zdCB0ZFB0ciA9 IGR0ICsgMTsgLyogYmVjYXVzZSAqZHQgaXMgdW5zaWduZWQsIDMyLWJpdHMgYWxpZ25lZCBvbiAz Mi1iaXRzICovDQogCUZTRV9ERUNPREVfVFlQRSAqY29uc3QgdGFibGVEZWNvZGUgPSAoRlNFX0RF Q09ERV9UWVBFICopKHRkUHRyKTsNCkBAIC0xNjAsNyArMTU4LDcgQEAgc2l6ZV90IEZTRV9idWls ZERUYWJsZV93a3NwKEZTRV9EVGFibGUgKmR0LCBjb25zdCBzaG9ydCAqbm9ybWFsaXplZENvdW50 ZXIsIHVuc2kNCiAvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqDQogKiAgRGVjb21wcmVzc2lvbiAoQnl0ZSBzeW1ib2xzKQ0KICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zaXpl X3QgRlNFX2J1aWxkRFRhYmxlX3JsZShGU0VfRFRhYmxlICpkdCwgQllURSBzeW1ib2xWYWx1ZSkN CitzaXplX3QgSU5JVCBGU0VfYnVpbGREVGFibGVfcmxlKEZTRV9EVGFibGUgKmR0LCBCWVRFIHN5 bWJvbFZhbHVlKQ0KIHsNCiAJdm9pZCAqcHRyID0gZHQ7DQogCUZTRV9EVGFibGVIZWFkZXIgKmNv bnN0IERUYWJsZUggPSAoRlNFX0RUYWJsZUhlYWRlciAqKXB0cjsNCkBAIC0xNzcsNyArMTc1LDcg QEAgc2l6ZV90IEZTRV9idWlsZERUYWJsZV9ybGUoRlNFX0RUYWJsZSAqZHQsIEJZVEUgc3ltYm9s VmFsdWUpDQogCXJldHVybiAwOw0KIH0NCiANCi1zaXplX3QgRlNFX2J1aWxkRFRhYmxlX3JhdyhG U0VfRFRhYmxlICpkdCwgdW5zaWduZWQgbmJCaXRzKQ0KK3NpemVfdCBJTklUIEZTRV9idWlsZERU YWJsZV9yYXcoRlNFX0RUYWJsZSAqZHQsIHVuc2lnbmVkIG5iQml0cykNCiB7DQogCXZvaWQgKnB0 ciA9IGR0Ow0KIAlGU0VfRFRhYmxlSGVhZGVyICpjb25zdCBEVGFibGVIID0gKEZTRV9EVGFibGVI ZWFkZXIgKilwdHI7DQpAQCAtMjcyLDcgKzI3MCw3IEBAIEZPUkNFX0lOTElORSBzaXplX3QgRlNF X2RlY29tcHJlc3NfdXNpbmdEVGFibGVfZ2VuZXJpYyh2b2lkICpkc3QsIHNpemVfdCBtYXhEc3RT DQogCXJldHVybiBvcCAtIG9zdGFydDsNCiB9DQogDQotc2l6ZV90IEZTRV9kZWNvbXByZXNzX3Vz aW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IG9yaWdpbmFsU2l6ZSwgY29uc3Qgdm9pZCAqY1Ny Yywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBGU0VfRFRhYmxlICpkdCkNCitzaXplX3QgSU5JVCBG U0VfZGVjb21wcmVzc191c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBvcmlnaW5hbFNpemUs IGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgRlNFX0RUYWJsZSAqZHQp DQogew0KIAljb25zdCB2b2lkICpwdHIgPSBkdDsNCiAJY29uc3QgRlNFX0RUYWJsZUhlYWRlciAq RFRhYmxlSCA9IChjb25zdCBGU0VfRFRhYmxlSGVhZGVyICopcHRyOw0KQEAgLTI4NCw3ICsyODIs NyBAQCBzaXplX3QgRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3Qg b3JpZ2luYWxTaXplLCBjb25zdCB2b2lkICpjUw0KIAlyZXR1cm4gRlNFX2RlY29tcHJlc3NfdXNp bmdEVGFibGVfZ2VuZXJpYyhkc3QsIG9yaWdpbmFsU2l6ZSwgY1NyYywgY1NyY1NpemUsIGR0LCAw KTsNCiB9DQogDQotc2l6ZV90IEZTRV9kZWNvbXByZXNzX3drc3Aodm9pZCAqZHN0LCBzaXplX3Qg ZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdW5zaWduZWQg bWF4TG9nLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3NpemVfdCBJ TklUIEZTRV9kZWNvbXByZXNzX3drc3Aodm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNv bnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdW5zaWduZWQgbWF4TG9nLCB2b2lkICp3 b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJY29uc3QgQllURSAqY29uc3Qg aXN0YXJ0ID0gKGNvbnN0IEJZVEUgKiljU3JjOw0KIAljb25zdCBCWVRFICppcCA9IGlzdGFydDsN CmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvaHVmLmggYi94ZW4vY29tbW9uL3pzdGQvaHVm LmgNCmluZGV4IDIxNDNkYTI4ZDkuLmE5ZDUyMmM3YmIgMTAwNjQ0DQotLS0gYS94ZW4vY29tbW9u L3pzdGQvaHVmLmgNCisrKyBiL3hlbi9jb21tb24venN0ZC9odWYuaA0KQEAgLTQxLDcgKzQxLDcg QEANCiAjZGVmaW5lIEhVRl9IXzI5ODczNDIzNA0KIA0KIC8qICoqKiBEZXBlbmRlbmNpZXMgKioq ICovDQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+IC8qIHNpemVfdCAqLw0KKyNpbmNsdWRlIDx4 ZW4vdHlwZXMuaD4gLyogc2l6ZV90ICovDQogDQogLyogKioqICAgVG9vbCBmdW5jdGlvbnMgKioq ICovDQogI2RlZmluZSBIVUZfQkxPQ0tTSVpFX01BWCAoMTI4ICogMTAyNCkgLyoqPCBtYXhpbXVt IGlucHV0IHNpemUgZm9yIGEgc2luZ2xlIGJsb2NrIGNvbXByZXNzZWQgd2l0aCBIVUZfY29tcHJl c3MgKi8NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvaHVmX2RlY29tcHJlc3MuYyBiL3hl bi9jb21tb24venN0ZC9odWZfZGVjb21wcmVzcy5jDQppbmRleCA2NTI2NDgyMDQ3Li5mNzk2MDNh MTJmIDEwMDY0NA0KLS0tIGEveGVuL2NvbW1vbi96c3RkL2h1Zl9kZWNvbXByZXNzLmMNCisrKyBi L3hlbi9jb21tb24venN0ZC9odWZfZGVjb21wcmVzcy5jDQpAQCAtNDAsNyArNDAsNyBAQA0KIC8q ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqDQogKiAgQ29tcGlsZXIgc3BlY2lmaWNzDQogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jZGVmaW5lIEZPUkNF X0lOTElORSBzdGF0aWMgX19hbHdheXNfaW5saW5lDQorI2RlZmluZSBGT1JDRV9JTkxJTkUgc3Rh dGljIGFsd2F5c19pbmxpbmUNCiANCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogIERlcGVuZGVuY2llcw0KQEAgLTQ4 LDkgKzQ4LDcgQEANCiAjaW5jbHVkZSAiYml0c3RyZWFtLmgiIC8qIEJJVF8qICovDQogI2luY2x1 ZGUgImZzZS5oIiAgICAgICAvKiBoZWFkZXIgY29tcHJlc3Npb24gKi8NCiAjaW5jbHVkZSAiaHVm LmgiDQotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+DQotI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPg0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtY3B5LCBtZW1zZXQgKi8NCisj aW5jbHVkZSA8eGVuL3N0cmluZy5oPiAvKiBtZW1jcHksIG1lbXNldCAqLw0KIA0KIC8qICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq DQogKiAgRXJyb3IgTWFuYWdlbWVudA0KQEAgLTcxLDcgKzY5LDcgQEAgdHlwZWRlZiBzdHJ1Y3Qg ew0KIAlCWVRFIHJlc2VydmVkOw0KIH0gRFRhYmxlRGVzYzsNCiANCi1zdGF0aWMgRFRhYmxlRGVz YyBIVUZfZ2V0RFRhYmxlRGVzYyhjb25zdCBIVUZfRFRhYmxlICp0YWJsZSkNCitzdGF0aWMgRFRh YmxlRGVzYyBJTklUIEhVRl9nZXREVGFibGVEZXNjKGNvbnN0IEhVRl9EVGFibGUgKnRhYmxlKQ0K IHsNCiAJRFRhYmxlRGVzYyBkdGQ7DQogCW1lbWNweSgmZHRkLCB0YWJsZSwgc2l6ZW9mKGR0ZCkp Ow0KQEAgLTg3LDcgKzg1LDcgQEAgdHlwZWRlZiBzdHJ1Y3Qgew0KIAlCWVRFIG5iQml0czsNCiB9 IEhVRl9ERWx0WDI7IC8qIHNpbmdsZS1zeW1ib2wgZGVjb2RpbmcgKi8NCiANCi1zaXplX3QgSFVG X3JlYWREVGFibGVYMl93a3NwKEhVRl9EVGFibGUgKkRUYWJsZSwgY29uc3Qgdm9pZCAqc3JjLCBz aXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCitz aXplX3QgSU5JVCBIVUZfcmVhZERUYWJsZVgyX3drc3AoSFVGX0RUYWJsZSAqRFRhYmxlLCBjb25z dCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jr c3BhY2VTaXplKQ0KIHsNCiAJVTMyIHRhYmxlTG9nID0gMDsNCiAJVTMyIG5iU3ltYm9scyA9IDA7 DQpAQCAtMTU1LDcgKzE1Myw3IEBAIHNpemVfdCBIVUZfcmVhZERUYWJsZVgyX3drc3AoSFVGX0RU YWJsZSAqRFRhYmxlLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplDQogCXJldHVybiBp U2l6ZTsNCiB9DQogDQotc3RhdGljIEJZVEUgSFVGX2RlY29kZVN5bWJvbFgyKEJJVF9EU3RyZWFt X3QgKkRzdHJlYW0sIGNvbnN0IEhVRl9ERWx0WDIgKmR0LCBjb25zdCBVMzIgZHRMb2cpDQorc3Rh dGljIEJZVEUgSU5JVCBIVUZfZGVjb2RlU3ltYm9sWDIoQklUX0RTdHJlYW1fdCAqRHN0cmVhbSwg Y29uc3QgSFVGX0RFbHRYMiAqZHQsIGNvbnN0IFUzMiBkdExvZykNCiB7DQogCXNpemVfdCBjb25z dCB2YWwgPSBCSVRfbG9va0JpdHNGYXN0KERzdHJlYW0sIGR0TG9nKTsgLyogbm90ZSA6IGR0TG9n ID49IDEgKi8NCiAJQllURSBjb25zdCBjID0gZHRbdmFsXS5ieXRlOw0KQEAgLTE5Niw3ICsxOTQs NyBAQCBGT1JDRV9JTkxJTkUgc2l6ZV90IEhVRl9kZWNvZGVTdHJlYW1YMihCWVRFICpwLCBCSVRf RFN0cmVhbV90ICpjb25zdCBiaXREUHRyLCBCWQ0KIAlyZXR1cm4gcEVuZCAtIHBTdGFydDsNCiB9 DQogDQotc3RhdGljIHNpemVfdCBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZV9pbnRlcm5h bCh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1Ny Y1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkNCitzdGF0aWMgc2l6ZV90IElOSVQgSFVG X2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGVfaW50ZXJuYWwodm9pZCAqZHN0LCBzaXplX3QgZHN0 U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxl ICpEVGFibGUpDQogew0KIAlCWVRFICpvcCA9IChCWVRFICopZHN0Ow0KIAlCWVRFICpjb25zdCBv ZW5kID0gb3AgKyBkc3RTaXplOw0KQEAgLTIyMSw3ICsyMTksNyBAQCBzdGF0aWMgc2l6ZV90IEhV Rl9kZWNvbXByZXNzMVgyX3VzaW5nRFRhYmxlX2ludGVybmFsKHZvaWQgKmRzdCwgc2l6ZV90IGRz dFNpemUsDQogCXJldHVybiBkc3RTaXplOw0KIH0NCiANCi1zaXplX3QgSFVGX2RlY29tcHJlc3Mx WDJfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1Ny Yywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorc2l6ZV90IElO SVQgSFVGX2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6 ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpE VGFibGUpDQogew0KIAlEVGFibGVEZXNjIGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7 DQogCWlmIChkdGQudGFibGVUeXBlICE9IDApDQpAQCAtMjI5LDcgKzIyNyw3IEBAIHNpemVfdCBI VUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBj b25zdCB2b2lkICpjU3JjDQogCXJldHVybiBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZV9p bnRlcm5hbChkc3QsIGRzdFNpemUsIGNTcmMsIGNTcmNTaXplLCBEVGFibGUpOw0KIH0NCiANCi1z aXplX3QgSFVGX2RlY29tcHJlc3MxWDJfREN0eF93a3NwKEhVRl9EVGFibGUgKkRDdHgsIHZvaWQg KmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwg dm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCitzaXplX3QgSU5JVCBIVUZf ZGVjb21wcmVzczFYMl9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqREN0eCwgdm9pZCAqZHN0LCBzaXpl X3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jr c3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJY29uc3QgQllURSAqaXAgPSAoY29u c3QgQllURSAqKWNTcmM7DQogDQpAQCAtMjQ0LDcgKzI0Miw3IEBAIHNpemVfdCBIVUZfZGVjb21w cmVzczFYMl9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqREN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0 U2l6ZSwNCiAJcmV0dXJuIEhVRl9kZWNvbXByZXNzMVgyX3VzaW5nRFRhYmxlX2ludGVybmFsKGRz dCwgZHN0U2l6ZSwgaXAsIGNTcmNTaXplLCBEQ3R4KTsNCiB9DQogDQotc3RhdGljIHNpemVfdCBI VUZfZGVjb21wcmVzczRYMl91c2luZ0RUYWJsZV9pbnRlcm5hbCh2b2lkICpkc3QsIHNpemVfdCBk c3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFi bGUgKkRUYWJsZSkNCitzdGF0aWMgc2l6ZV90IElOSVQgSFVGX2RlY29tcHJlc3M0WDJfdXNpbmdE VGFibGVfaW50ZXJuYWwodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1Ny Yywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQogew0KIAkvKiBD aGVjayAqLw0KIAlpZiAoY1NyY1NpemUgPCAxMCkNCkBAIC0zNTIsNyArMzUwLDcgQEAgc3RhdGlj IHNpemVfdCBIVUZfZGVjb21wcmVzczRYMl91c2luZ0RUYWJsZV9pbnRlcm5hbCh2b2lkICpkc3Qs IHNpemVfdCBkc3RTaXplLA0KIAl9DQogfQ0KIA0KLXNpemVfdCBIVUZfZGVjb21wcmVzczRYMl91 c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBz aXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkNCitzaXplX3QgSU5JVCBI VUZfZGVjb21wcmVzczRYMl91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBj b25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJs ZSkNCiB7DQogCURUYWJsZURlc2MgZHRkID0gSFVGX2dldERUYWJsZURlc2MoRFRhYmxlKTsNCiAJ aWYgKGR0ZC50YWJsZVR5cGUgIT0gMCkNCkBAIC0zNjAsNyArMzU4LDcgQEAgc2l6ZV90IEhVRl9k ZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0 IHZvaWQgKmNTcmMNCiAJcmV0dXJuIEhVRl9kZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlX2ludGVy bmFsKGRzdCwgZHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIERUYWJsZSk7DQogfQ0KIA0KLXNpemVf dCBIVUZfZGVjb21wcmVzczRYMl9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0 LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lk ICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3NpemVfdCBJTklUIEhVRl9kZWNv bXByZXNzNFgyX0RDdHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBk c3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFj ZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQogew0KIAljb25zdCBCWVRFICppcCA9IChjb25zdCBC WVRFICopY1NyYzsNCiANCkBAIC0zOTEsNyArMzg5LDcgQEAgdHlwZWRlZiBzdHJ1Y3Qgew0KIA0K IC8qIEhVRl9maWxsRFRhYmxlWDRMZXZlbDIoKSA6DQogICogYHJhbmtWYWxPcmlnaW5gIG11c3Qg YmUgYSB0YWJsZSBvZiBhdCBsZWFzdCAoSFVGX1RBQkxFTE9HX01BWCArIDEpIFUzMiAqLw0KLXN0 YXRpYyB2b2lkIEhVRl9maWxsRFRhYmxlWDRMZXZlbDIoSFVGX0RFbHRYNCAqRFRhYmxlLCBVMzIg c2l6ZUxvZywgY29uc3QgVTMyIGNvbnN1bWVkLCBjb25zdCBVMzIgKnJhbmtWYWxPcmlnaW4sIGNv bnN0IGludCBtaW5XZWlnaHQsDQorc3RhdGljIHZvaWQgSU5JVCBIVUZfZmlsbERUYWJsZVg0TGV2 ZWwyKEhVRl9ERWx0WDQgKkRUYWJsZSwgVTMyIHNpemVMb2csIGNvbnN0IFUzMiBjb25zdW1lZCwg Y29uc3QgVTMyICpyYW5rVmFsT3JpZ2luLCBjb25zdCBpbnQgbWluV2VpZ2h0LA0KIAkJCQkgICBj b25zdCBzb3J0ZWRTeW1ib2xfdCAqc29ydGVkU3ltYm9scywgY29uc3QgVTMyIHNvcnRlZExpc3RT aXplLCBVMzIgbmJCaXRzQmFzZWxpbmUsIFUxNiBiYXNlU2VxKQ0KIHsNCiAJSFVGX0RFbHRYNCBE RWx0Ow0KQEAgLTQzNyw3ICs0MzUsNyBAQCBzdGF0aWMgdm9pZCBIVUZfZmlsbERUYWJsZVg0TGV2 ZWwyKEhVRl9ERWx0WDQgKkRUYWJsZSwgVTMyIHNpemVMb2csIGNvbnN0IFUzMiBjbw0KIHR5cGVk ZWYgVTMyIHJhbmtWYWxfdFtIVUZfVEFCTEVMT0dfTUFYXVtIVUZfVEFCTEVMT0dfTUFYICsgMV07 DQogdHlwZWRlZiBVMzIgcmFua1ZhbENvbF90W0hVRl9UQUJMRUxPR19NQVggKyAxXTsNCiANCi1z dGF0aWMgdm9pZCBIVUZfZmlsbERUYWJsZVg0KEhVRl9ERWx0WDQgKkRUYWJsZSwgY29uc3QgVTMy IHRhcmdldExvZywgY29uc3Qgc29ydGVkU3ltYm9sX3QgKnNvcnRlZExpc3QsIGNvbnN0IFUzMiBz b3J0ZWRMaXN0U2l6ZSwgY29uc3QgVTMyICpyYW5rU3RhcnQsDQorc3RhdGljIHZvaWQgSU5JVCBI VUZfZmlsbERUYWJsZVg0KEhVRl9ERWx0WDQgKkRUYWJsZSwgY29uc3QgVTMyIHRhcmdldExvZywg Y29uc3Qgc29ydGVkU3ltYm9sX3QgKnNvcnRlZExpc3QsIGNvbnN0IFUzMiBzb3J0ZWRMaXN0U2l6 ZSwgY29uc3QgVTMyICpyYW5rU3RhcnQsDQogCQkJICAgICByYW5rVmFsX3QgcmFua1ZhbE9yaWdp biwgY29uc3QgVTMyIG1heFdlaWdodCwgY29uc3QgVTMyIG5iQml0c0Jhc2VsaW5lKQ0KIHsNCiAJ VTMyIHJhbmtWYWxbSFVGX1RBQkxFTE9HX01BWCArIDFdOw0KQEAgLTQ3OSw3ICs0NzcsNyBAQCBz dGF0aWMgdm9pZCBIVUZfZmlsbERUYWJsZVg0KEhVRl9ERWx0WDQgKkRUYWJsZSwgY29uc3QgVTMy IHRhcmdldExvZywgY29uc3Qgc29ydA0KIAl9DQogfQ0KIA0KLXNpemVfdCBIVUZfcmVhZERUYWJs ZVg0X3drc3AoSFVGX0RUYWJsZSAqRFRhYmxlLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNT aXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3NpemVfdCBJTklU IEhVRl9yZWFkRFRhYmxlWDRfd2tzcChIVUZfRFRhYmxlICpEVGFibGUsIGNvbnN0IHZvaWQgKnNy Yywgc2l6ZV90IHNyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUp DQogew0KIAlVMzIgdGFibGVMb2csIG1heFcsIHNpemVPZlNvcnQsIG5iU3ltYm9sczsNCiAJRFRh YmxlRGVzYyBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOw0KQEAgLTU5Miw3ICs1OTAs NyBAQCBzaXplX3QgSFVGX3JlYWREVGFibGVYNF93a3NwKEhVRl9EVGFibGUgKkRUYWJsZSwgY29u c3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZQ0KIAlyZXR1cm4gaVNpemU7DQogfQ0KIA0KLXN0 YXRpYyBVMzIgSFVGX2RlY29kZVN5bWJvbFg0KHZvaWQgKm9wLCBCSVRfRFN0cmVhbV90ICpEU3Ry ZWFtLCBjb25zdCBIVUZfREVsdFg0ICpkdCwgY29uc3QgVTMyIGR0TG9nKQ0KK3N0YXRpYyBVMzIg SU5JVCBIVUZfZGVjb2RlU3ltYm9sWDQodm9pZCAqb3AsIEJJVF9EU3RyZWFtX3QgKkRTdHJlYW0s IGNvbnN0IEhVRl9ERWx0WDQgKmR0LCBjb25zdCBVMzIgZHRMb2cpDQogew0KIAlzaXplX3QgY29u c3QgdmFsID0gQklUX2xvb2tCaXRzRmFzdChEU3RyZWFtLCBkdExvZyk7IC8qIG5vdGUgOiBkdExv ZyA+PSAxICovDQogCW1lbWNweShvcCwgZHQgKyB2YWwsIDIpOw0KQEAgLTYwMCw3ICs1OTgsNyBA QCBzdGF0aWMgVTMyIEhVRl9kZWNvZGVTeW1ib2xYNCh2b2lkICpvcCwgQklUX0RTdHJlYW1fdCAq RFN0cmVhbSwgY29uc3QgSFVGX0RFbHRYNA0KIAlyZXR1cm4gZHRbdmFsXS5sZW5ndGg7DQogfQ0K IA0KLXN0YXRpYyBVMzIgSFVGX2RlY29kZUxhc3RTeW1ib2xYNCh2b2lkICpvcCwgQklUX0RTdHJl YW1fdCAqRFN0cmVhbSwgY29uc3QgSFVGX0RFbHRYNCAqZHQsIGNvbnN0IFUzMiBkdExvZykNCitz dGF0aWMgVTMyIElOSVQgSFVGX2RlY29kZUxhc3RTeW1ib2xYNCh2b2lkICpvcCwgQklUX0RTdHJl YW1fdCAqRFN0cmVhbSwgY29uc3QgSFVGX0RFbHRYNCAqZHQsIGNvbnN0IFUzMiBkdExvZykNCiB7 DQogCXNpemVfdCBjb25zdCB2YWwgPSBCSVRfbG9va0JpdHNGYXN0KERTdHJlYW0sIGR0TG9nKTsg Lyogbm90ZSA6IGR0TG9nID49IDEgKi8NCiAJbWVtY3B5KG9wLCBkdCArIHZhbCwgMSk7DQpAQCAt NjUyLDcgKzY1MCw3IEBAIEZPUkNFX0lOTElORSBzaXplX3QgSFVGX2RlY29kZVN0cmVhbVg0KEJZ VEUgKnAsIEJJVF9EU3RyZWFtX3QgKmJpdERQdHIsIEJZVEUgKmNvDQogCXJldHVybiBwIC0gcFN0 YXJ0Ow0KIH0NCiANCi1zdGF0aWMgc2l6ZV90IEhVRl9kZWNvbXByZXNzMVg0X3VzaW5nRFRhYmxl X2ludGVybmFsKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNp emVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKQ0KK3N0YXRpYyBzaXplX3Qg SU5JVCBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZV9pbnRlcm5hbCh2b2lkICpkc3QsIHNp emVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhV Rl9EVGFibGUgKkRUYWJsZSkNCiB7DQogCUJJVF9EU3RyZWFtX3QgYml0RDsNCiANCkBAIC02ODEs NyArNjc5LDcgQEAgc3RhdGljIHNpemVfdCBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZV9p bnRlcm5hbCh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLA0KIAlyZXR1cm4gZHN0U2l6ZTsNCiB9 DQogDQotc2l6ZV90IEhVRl9kZWNvbXByZXNzMVg0X3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6 ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVG X0RUYWJsZSAqRFRhYmxlKQ0KK3NpemVfdCBJTklUIEhVRl9kZWNvbXByZXNzMVg0X3VzaW5nRFRh YmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBj U3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKQ0KIHsNCiAJRFRhYmxlRGVzYyBkdGQg PSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOw0KIAlpZiAoZHRkLnRhYmxlVHlwZSAhPSAxKQ0K QEAgLTY4OSw3ICs2ODcsNyBAQCBzaXplX3QgSFVGX2RlY29tcHJlc3MxWDRfdXNpbmdEVGFibGUo dm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYw0KIAlyZXR1cm4gSFVG X2RlY29tcHJlc3MxWDRfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RTaXplLCBjU3JjLCBj U3JjU2l6ZSwgRFRhYmxlKTsNCiB9DQogDQotc2l6ZV90IEhVRl9kZWNvbXByZXNzMVg0X0RDdHhf d2tzcChIVUZfRFRhYmxlICpEQ3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2 b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtz cGFjZVNpemUpDQorc2l6ZV90IElOSVQgSFVGX2RlY29tcHJlc3MxWDRfREN0eF93a3NwKEhVRl9E VGFibGUgKkRDdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMs IHNpemVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkN CiB7DQogCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKiljU3JjOw0KIA0KQEAgLTcwNCw3 ICs3MDIsNyBAQCBzaXplX3QgSFVGX2RlY29tcHJlc3MxWDRfREN0eF93a3NwKEhVRl9EVGFibGUg KkRDdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsDQogCXJldHVybiBIVUZfZGVjb21wcmVz czFYNF91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIGRzdFNpemUsIGlwLCBjU3JjU2l6ZSwgREN0 eCk7DQogfQ0KIA0KLXN0YXRpYyBzaXplX3QgSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGVf aW50ZXJuYWwodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6 ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorc3RhdGljIHNpemVfdCBJ TklUIEhVRl9kZWNvbXByZXNzNFg0X3VzaW5nRFRhYmxlX2ludGVybmFsKHZvaWQgKmRzdCwgc2l6 ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVG X0RUYWJsZSAqRFRhYmxlKQ0KIHsNCiAJaWYgKGNTcmNTaXplIDwgMTApDQogCQlyZXR1cm4gRVJS T1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIHN0cmljdCBtaW5pbXVtIDoganVtcCB0YWJsZSAr IDEgYnl0ZSBwZXIgc3RyZWFtICovDQpAQCAtODE0LDcgKzgxMiw3IEBAIHN0YXRpYyBzaXplX3Qg SFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGVfaW50ZXJuYWwodm9pZCAqZHN0LCBzaXplX3Qg ZHN0U2l6ZSwNCiAJfQ0KIH0NCiANCi1zaXplX3QgSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFi bGUodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNT cmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQorc2l6ZV90IElOSVQgSFVGX2RlY29t cHJlc3M0WDRfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9p ZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQogew0K IAlEVGFibGVEZXNjIGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7DQogCWlmIChkdGQu dGFibGVUeXBlICE9IDEpDQpAQCAtODIyLDcgKzgyMCw3IEBAIHNpemVfdCBIVUZfZGVjb21wcmVz czRYNF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpj U3JjDQogCXJldHVybiBIVUZfZGVjb21wcmVzczRYNF91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3Qs IGRzdFNpemUsIGNTcmMsIGNTcmNTaXplLCBEVGFibGUpOw0KIH0NCiANCi1zaXplX3QgSFVGX2Rl Y29tcHJlc3M0WDRfREN0eF93a3NwKEhVRl9EVGFibGUgKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90 IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3Nw YWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCitzaXplX3QgSU5JVCBIVUZfZGVjb21wcmVzczRY NF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwg Y29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVf dCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKWNT cmM7DQogDQpAQCAtODQxLDE0ICs4MzksMTQgQEAgc2l6ZV90IEhVRl9kZWNvbXByZXNzNFg0X0RD dHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLA0KIC8q IEdlbmVyaWMgZGVjb21wcmVzc2lvbiBzZWxlY3RvciAqLw0KIC8qICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLw0KIA0KLXNpemVfdCBIVUZfZGVjb21wcmVzczFYX3VzaW5nRFRhYmxl KHZvaWQgKmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBj U3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKQ0KK3NpemVfdCBJTklUIEhVRl9kZWNv bXByZXNzMVhfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qg dm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpDQog ew0KIAlEVGFibGVEZXNjIGNvbnN0IGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7DQog CXJldHVybiBkdGQudGFibGVUeXBlID8gSFVGX2RlY29tcHJlc3MxWDRfdXNpbmdEVGFibGVfaW50 ZXJuYWwoZHN0LCBtYXhEc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKQ0KIAkJCSAgICAg OiBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIG1heERzdFNpemUs IGNTcmMsIGNTcmNTaXplLCBEVGFibGUpOw0KIH0NCiANCi1zaXplX3QgSFVGX2RlY29tcHJlc3M0 WF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBtYXhEc3RTaXplLCBjb25zdCB2b2lkICpj U3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkNCitzaXplX3Qg SU5JVCBIVUZfZGVjb21wcmVzczRYX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IG1heERz dFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJs ZSAqRFRhYmxlKQ0KIHsNCiAJRFRhYmxlRGVzYyBjb25zdCBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVz YyhEVGFibGUpOw0KIAlyZXR1cm4gZHRkLnRhYmxlVHlwZSA/IEhVRl9kZWNvbXByZXNzNFg0X3Vz aW5nRFRhYmxlX2ludGVybmFsKGRzdCwgbWF4RHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIERUYWJs ZSkNCkBAIC04ODQsNyArODgyLDcgQEAgc3RhdGljIGNvbnN0IGFsZ29fdGltZV90IGFsZ29UaW1l WzE2IC8qIFF1YW50aXphdGlvbiAqL11bMyAvKiBzaW5nbGUsIGRvdWJsZSwgcXUNCiAqICAgYmFz ZWQgb24gYSBzZXQgb2YgcHJlLWRldGVybWluZWQgbWV0cmljcy4NCiAqICAgQHJldHVybiA6IDA9 PUhVRl9kZWNvbXByZXNzNFgyLCAxPT1IVUZfZGVjb21wcmVzczRYNCAuDQogKiAgIEFzc3VtcHRp b24gOiAwIDwgY1NyY1NpemUgPCBkc3RTaXplIDw9IDEyOCBLQiAqLw0KLVUzMiBIVUZfc2VsZWN0 RGVjb2RlcihzaXplX3QgZHN0U2l6ZSwgc2l6ZV90IGNTcmNTaXplKQ0KK1UzMiBJTklUIEhVRl9z ZWxlY3REZWNvZGVyKHNpemVfdCBkc3RTaXplLCBzaXplX3QgY1NyY1NpemUpDQogew0KIAkvKiBk ZWNvZGVyIHRpbWluZyBldmFsdWF0aW9uICovDQogCVUzMiBjb25zdCBRID0gKFUzMikoY1NyY1Np emUgKiAxNiAvIGRzdFNpemUpOyAvKiBRIDwgMTYgc2luY2UgZHN0U2l6ZSA+IGNTcmNTaXplICov DQpAQCAtODk4LDcgKzg5Niw3IEBAIFUzMiBIVUZfc2VsZWN0RGVjb2RlcihzaXplX3QgZHN0U2l6 ZSwgc2l6ZV90IGNTcmNTaXplKQ0KIA0KIHR5cGVkZWYgc2l6ZV90ICgqZGVjb21wcmVzc2lvbkFs Z28pKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBj U3JjU2l6ZSk7DQogDQotc2l6ZV90IEhVRl9kZWNvbXByZXNzNFhfREN0eF93a3NwKEhVRl9EVGFi bGUgKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNp emVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCitz aXplX3QgSU5JVCBIVUZfZGVjb21wcmVzczRYX0RDdHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2 b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1Np emUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQogew0KIAkvKiB2YWxp ZGF0aW9uIGNoZWNrcyAqLw0KIAlpZiAoZHN0U2l6ZSA9PSAwKQ0KQEAgLTkyMSw3ICs5MTksNyBA QCBzaXplX3QgSFVGX2RlY29tcHJlc3M0WF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9p ZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgYw0KIAl9DQogfQ0KIA0KLXNpemVfdCBIVUZfZGVjb21w cmVzczRYX2h1Zk9ubHlfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBk c3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFj ZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorc2l6ZV90IElOSVQgSFVGX2RlY29tcHJlc3M0WF9o dWZPbmx5X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwg Y29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVf dCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJLyogdmFsaWRhdGlvbiBjaGVja3MgKi8NCiAJaWYgKGRz dFNpemUgPT0gMCkNCkBAIC05MzYsNyArOTM0LDcgQEAgc2l6ZV90IEhVRl9kZWNvbXByZXNzNFhf aHVmT25seV93a3NwKEhVRl9EVGFibGUgKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUN CiAJfQ0KIH0NCiANCi1zaXplX3QgSFVGX2RlY29tcHJlc3MxWF9EQ3R4X3drc3AoSFVGX0RUYWJs ZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6 ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KK3Np emVfdCBJTklUIEhVRl9kZWNvbXByZXNzMVhfREN0eF93a3NwKEhVRl9EVGFibGUgKmRjdHgsIHZv aWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6 ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCiB7DQogCS8qIHZhbGlk YXRpb24gY2hlY2tzICovDQogCWlmIChkc3RTaXplID09IDApDQpkaWZmIC0tZ2l0IGEveGVuL2Nv bW1vbi96c3RkL21lbS5oIGIveGVuL2NvbW1vbi96c3RkL21lbS5oDQppbmRleCA5M2Q3YTJjMzc3 Li5kMmZhNDQ0Njg3IDEwMDY0NA0KLS0tIGEveGVuL2NvbW1vbi96c3RkL21lbS5oDQorKysgYi94 ZW4vY29tbW9uL3pzdGQvbWVtLmgNCkBAIC0yMCw5ICsyMCw5IEBADQogLyotKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogIERlcGVuZGVuY2llcw0KICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaW5jbHVkZSA8YXNtL3VuYWxp Z25lZC5oPg0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtY3B5ICovDQotI2luY2x1 ZGUgPGxpbnV4L3R5cGVzLmg+ICAvKiBzaXplX3QsIHB0cmRpZmZfdCAqLw0KKyNpbmNsdWRlIDx4 ZW4vc3RyaW5nLmg+IC8qIG1lbWNweSAqLw0KKyNpbmNsdWRlIDx4ZW4vdHlwZXMuaD4gIC8qIHNp emVfdCwgcHRyZGlmZl90ICovDQorI2luY2x1ZGUgInByaXZhdGUuaCINCiANCiAvKi0qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgQ29tcGlsZXIgc3BlY2lmaWNz DQpkaWZmIC0tZ2l0IGEveGVuL2NvbW1vbi96c3RkL3ByaXZhdGUuaCBiL3hlbi9jb21tb24venN0 ZC9wcml2YXRlLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi5mYWM0 ZDNjMDk1DQotLS0gL2Rldi9udWxsDQorKysgYi94ZW4vY29tbW9uL3pzdGQvcHJpdmF0ZS5oDQpA QCAtMCwwICsxLDEwNSBAQA0KKyNpZm5kZWYgWlNURF9QUklWQVRFX0gNCisjZGVmaW5lIFpTVERf UFJJVkFURV9IDQorDQorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4NCisjaW5jbHVkZSA8eGVu L2tlcm5lbC5oPg0KKyNpbmNsdWRlIDx4ZW4vdHlwZXMuaD4NCisNCit0eXBlZGVmIHNzaXplX3Qg X19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19wb2ludGVyX18pKSkgcHRyZGlmZl90Ow0KKw0KKy8q IGZyb20ga2VybmVsIGluY2x1ZGUvbGludXgvdW5hbGlnbmVkL2FjY2Vzc19vay5oICovDQorDQor c3RhdGljIGFsd2F5c19pbmxpbmUgdTE2IGdldF91bmFsaWduZWRfbGUxNihjb25zdCB2b2lkICpw KQ0KK3sNCisJcmV0dXJuIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopcCk7DQorfQ0KKw0KK3N0YXRp YyBhbHdheXNfaW5saW5lIHUzMiBnZXRfdW5hbGlnbmVkX2xlMzIoY29uc3Qgdm9pZCAqcCkNCit7 DQorCXJldHVybiBsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKXApOw0KK30NCisNCitzdGF0aWMgYWx3 YXlzX2lubGluZSB1NjQgZ2V0X3VuYWxpZ25lZF9sZTY0KGNvbnN0IHZvaWQgKnApDQorew0KKwly ZXR1cm4gbGU2NF90b19jcHVwKChfX2xlNjQgKilwKTsNCit9DQorDQorc3RhdGljIGFsd2F5c19p bmxpbmUgdTMyIGdldF91bmFsaWduZWRfYmUzMihjb25zdCB2b2lkICpwKQ0KK3sNCisgICAgICAg IHJldHVybiBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApOw0KK30NCisNCitzdGF0aWMgYWx3YXlz X2lubGluZSB1NjQgZ2V0X3VuYWxpZ25lZF9iZTY0KGNvbnN0IHZvaWQgKnApDQorew0KKyAgICAg ICAgcmV0dXJuIGJlNjRfdG9fY3B1cCgoX19iZTY0ICopcCk7DQorfQ0KKw0KK3N0YXRpYyBhbHdh eXNfaW5saW5lIHZvaWQgcHV0X3VuYWxpZ25lZF9sZTE2KHUxNiB2YWwsIHZvaWQgKnApDQorew0K KwkqKChfX2xlMTYgKilwKSA9IGNwdV90b19sZTE2KHZhbCk7DQorfQ0KKw0KK3N0YXRpYyBhbHdh eXNfaW5saW5lIHZvaWQgcHV0X3VuYWxpZ25lZF9sZTMyKHUzMiB2YWwsIHZvaWQgKnApDQorew0K KwkqKChfX2xlMzIgKilwKSA9IGNwdV90b19sZTMyKHZhbCk7DQorfQ0KKw0KK3N0YXRpYyBhbHdh eXNfaW5saW5lIHZvaWQgcHV0X3VuYWxpZ25lZF9sZTY0KHU2NCB2YWwsIHZvaWQgKnApDQorew0K KwkqKChfX2xlNjQgKilwKSA9IGNwdV90b19sZTY0KHZhbCk7DQorfQ0KKw0KK3N0YXRpYyBhbHdh eXNfaW5saW5lIHZvaWQgcHV0X3VuYWxpZ25lZF9iZTMyKHUzMiB2YWwsIHZvaWQgKnApDQorew0K KyAgICAgICAgKigoX19iZTMyICopcCkgPSBjcHVfdG9fYmUzMih2YWwpOw0KK30NCisNCitzdGF0 aWMgYWx3YXlzX2lubGluZSB2b2lkIHB1dF91bmFsaWduZWRfYmU2NCh1NjQgdmFsLCB2b2lkICpw KQ0KK3sNCisgICAgICAgICooKF9fYmU2NCAqKXApID0gY3B1X3RvX2JlNjQodmFsKTsNCit9DQor DQorDQorLyogZnJvbSBrZXJuZWwgaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaCB3aXRo IGxpbnV4L3VuYWxpZ25lZC9nZW5lcmljLmgNCisgICBhc3N1bWluZyBsaXR0bGUgZW5kaWFuICov DQorDQorZXh0ZXJuIHZvaWQgX19iYWRfdW5hbGlnbmVkX2FjY2Vzc19zaXplKHZvaWQpOw0KKw0K KyNkZWZpbmUgZ2V0X3VuYWxpZ25lZChwdHIpICgoX19mb3JjZSB0eXBlb2YoKihwdHIpKSkoeyAg ICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgIF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXpl b2YoKihwdHIpKSA9PSAxLCAqKHB0ciksICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAg IF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YoKihwdHIpKSA9PSAyLCBnZXRfdW5hbGlnbmVk X2xlMTYoKHB0cikpLCAgIFwNCisgICAgICAgIF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2Yo KihwdHIpKSA9PSA0LCBnZXRfdW5hbGlnbmVkX2xlMzIoKHB0cikpLCAgIFwNCisgICAgICAgIF9f YnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YoKihwdHIpKSA9PSA4LCBnZXRfdW5hbGlnbmVkX2xl NjQoKHB0cikpLCAgIFwNCisgICAgICAgIF9fYmFkX3VuYWxpZ25lZF9hY2Nlc3Nfc2l6ZSgpKSkp KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgIH0pKQ0K Kw0KKyNkZWZpbmUgcHV0X3VuYWxpZ25lZCh2YWwsIHB0cikgKHsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICB2b2lkICpfX2d1X3AgPSAocHRyKTsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgc3dpdGNoIChzaXpl b2YoKihwdHIpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisg ICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgICoodTggKilfX2d1X3AgPSAoX19mb3Jj ZSB1OCkodmFsKTsgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICBicmVh azsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisg ICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgIHB1dF91bmFsaWduZWRfbGUxNigoX19m b3JjZSB1MTYpKHZhbCksIF9fZ3VfcCk7ICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICBicmVh azsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisg ICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgIHB1dF91bmFsaWduZWRfbGUzMigoX19m b3JjZSB1MzIpKHZhbCksIF9fZ3VfcCk7ICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICBicmVh azsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisg ICAgICAgIGNhc2UgODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgIHB1dF91bmFsaWduZWRfbGU2NCgoX19m b3JjZSB1NjQpKHZhbCksIF9fZ3VfcCk7ICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICBicmVh azsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisg ICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgIF9fYmFkX3VuYWxpZ25lZF9hY2Nlc3Nf c2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICBicmVh azsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisg ICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcDQorICAgICAgICAodm9pZCkwOyB9KQ0KKw0KKw0KKy8qIGZyb20ga2Vy bmVsIGxpbnV4L2tlcm5lbC5oIGFuZCB1YXBpL2xpbnV4L2tlcm5lbC5oICovDQorDQorI2RlZmlu ZSBfX0FMSUdOX0tFUk5FTCh4LCBhKQkJX19BTElHTl9LRVJORUxfTUFTSyh4LCAodHlwZW9mKHgp KShhKSAtIDEpDQorI2RlZmluZSBfX0FMSUdOX0tFUk5FTF9NQVNLKHgsIG1hc2spCSgoKHgpICsg KG1hc2spKSAmIH4obWFzaykpDQorI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICBfX0FM SUdOX0tFUk5FTCgoeCksIChhKSkNCisjZGVmaW5lIFBUUl9BTElHTihwLCBhKSAgICAgICAgICgo dHlwZW9mKHApKUFMSUdOKCh1bnNpZ25lZCBsb25nKShwKSwgKGEpKSkNCisNCisjZW5kaWYgLyog WlNURF9QUklWQVRFX0ggKi8NCmRpZmYgLS1naXQgYS94ZW4vY29tbW9uL3pzdGQvenN0ZF9jb21t b24uYyBiL3hlbi9jb21tb24venN0ZC96c3RkX2NvbW1vbi5jDQppbmRleCBhMjgyNjI0ZWUxLi4x YjEzOTAzNTM4IDEwMDY0NA0KLS0tIGEveGVuL2NvbW1vbi96c3RkL3pzdGRfY29tbW9uLmMNCisr KyBiL3hlbi9jb21tb24venN0ZC96c3RkX2NvbW1vbi5jDQpAQCAtMTksNyArMTksNiBAQA0KICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAjaW5jbHVkZSAiZXJyb3Jf cHJpdmF0ZS5oIg0KICNpbmNsdWRlICJ6c3RkX2ludGVybmFsLmgiIC8qIGRlY2xhcmF0aW9uIG9m IFpTVERfaXNFcnJvciwgWlNURF9nZXRFcnJvck5hbWUsIFpTVERfZ2V0RXJyb3JDb2RlLCBaU1RE X2dldEVycm9yU3RyaW5nLCBaU1REX3ZlcnNpb25OdW1iZXIgKi8NCi0jaW5jbHVkZSA8bGludXgv a2VybmVsLmg+DQogDQogLyo9KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioNCiAqICBDdXN0b20gYWxsb2NhdG9yDQpAQCAtMzIsNyAr MzEsNyBAQA0KIAkJKHN0YWNrKS0+cHRyIDw9IChzdGFjayktPmVuZCA/IHB0ciA6IE5VTEw7ICAg ICAgXA0KIAl9KQ0KIA0KLVpTVERfY3VzdG9tTWVtIFpTVERfaW5pdFN0YWNrKHZvaWQgKndvcmtz cGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpDQorWlNURF9jdXN0b21NZW0gSU5JVCBaU1REX2lu aXRTdGFjayh2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQ0KIHsNCiAJWlNU RF9jdXN0b21NZW0gc3RhY2tNZW0gPSB7WlNURF9zdGFja0FsbG9jLCBaU1REX3N0YWNrRnJlZSwg d29ya3NwYWNlfTsNCiAJWlNURF9zdGFjayAqc3RhY2sgPSAoWlNURF9zdGFjayAqKXdvcmtzcGFj ZTsNCkBAIC00OCwyNyArNDcsMjcgQEAgWlNURF9jdXN0b21NZW0gWlNURF9pbml0U3RhY2sodm9p ZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkNCiAJcmV0dXJuIHN0YWNrTWVtOw0K IH0NCiANCi12b2lkICpaU1REX3N0YWNrQWxsb2NBbGwodm9pZCAqb3BhcXVlLCBzaXplX3QgKnNp emUpDQordm9pZCBJTklUICpaU1REX3N0YWNrQWxsb2NBbGwodm9pZCAqb3BhcXVlLCBzaXplX3Qg KnNpemUpDQogew0KIAlaU1REX3N0YWNrICpzdGFjayA9IChaU1REX3N0YWNrICopb3BhcXVlOw0K IAkqc2l6ZSA9IChCWVRFIGNvbnN0ICopc3RhY2stPmVuZCAtIChCWVRFICopWlNURF9QVFJfQUxJ R04oc3RhY2stPnB0cik7DQogCXJldHVybiBzdGFja19wdXNoKHN0YWNrLCAqc2l6ZSk7DQogfQ0K IA0KLXZvaWQgKlpTVERfc3RhY2tBbGxvYyh2b2lkICpvcGFxdWUsIHNpemVfdCBzaXplKQ0KK3Zv aWQgSU5JVCAqWlNURF9zdGFja0FsbG9jKHZvaWQgKm9wYXF1ZSwgc2l6ZV90IHNpemUpDQogew0K IAlaU1REX3N0YWNrICpzdGFjayA9IChaU1REX3N0YWNrICopb3BhcXVlOw0KIAlyZXR1cm4gc3Rh Y2tfcHVzaChzdGFjaywgc2l6ZSk7DQogfQ0KLXZvaWQgWlNURF9zdGFja0ZyZWUodm9pZCAqb3Bh cXVlLCB2b2lkICphZGRyZXNzKQ0KK3ZvaWQgSU5JVCBaU1REX3N0YWNrRnJlZSh2b2lkICpvcGFx dWUsIHZvaWQgKmFkZHJlc3MpDQogew0KIAkodm9pZClvcGFxdWU7DQogCSh2b2lkKWFkZHJlc3M7 DQogfQ0KIA0KLXZvaWQgKlpTVERfbWFsbG9jKHNpemVfdCBzaXplLCBaU1REX2N1c3RvbU1lbSBj dXN0b21NZW0pIHsgcmV0dXJuIGN1c3RvbU1lbS5jdXN0b21BbGxvYyhjdXN0b21NZW0ub3BhcXVl LCBzaXplKTsgfQ0KK3ZvaWQgSU5JVCAqWlNURF9tYWxsb2Moc2l6ZV90IHNpemUsIFpTVERfY3Vz dG9tTWVtIGN1c3RvbU1lbSkgeyByZXR1cm4gY3VzdG9tTWVtLmN1c3RvbUFsbG9jKGN1c3RvbU1l bS5vcGFxdWUsIHNpemUpOyB9DQogDQotdm9pZCBaU1REX2ZyZWUodm9pZCAqcHRyLCBaU1REX2N1 c3RvbU1lbSBjdXN0b21NZW0pDQordm9pZCBJTklUIFpTVERfZnJlZSh2b2lkICpwdHIsIFpTVERf Y3VzdG9tTWVtIGN1c3RvbU1lbSkNCiB7DQogCWlmIChwdHIgIT0gTlVMTCkNCiAJCWN1c3RvbU1l bS5jdXN0b21GcmVlKGN1c3RvbU1lbS5vcGFxdWUsIHB0cik7DQpkaWZmIC0tZ2l0IGEveGVuL2Nv bW1vbi96c3RkL3pzdGRfaW50ZXJuYWwuaCBiL3hlbi9jb21tb24venN0ZC96c3RkX2ludGVybmFs LmgNCmluZGV4IGRhYzc1MzM5N2YuLjFiMTM4NDBjNDQgMTAwNjQ0DQotLS0gYS94ZW4vY29tbW9u L3pzdGQvenN0ZF9pbnRlcm5hbC5oDQorKysgYi94ZW4vY29tbW9uL3pzdGQvenN0ZF9pbnRlcm5h bC5oDQpAQCAtMjAsNyArMjAsNyBAQA0KIC8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICBDb21waWxlciBzcGVjaWZpY3MNCiAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQot I2RlZmluZSBGT1JDRV9JTkxJTkUgc3RhdGljIF9fYWx3YXlzX2lubGluZQ0KKyNkZWZpbmUgRk9S Q0VfSU5MSU5FIHN0YXRpYyBhbHdheXNfaW5saW5lDQogI2RlZmluZSBGT1JDRV9OT0lOTElORSBz dGF0aWMgbm9pbmxpbmUNCiANCiAvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqDQpAQCAtMjgsMTYgKzI4LDEyIEBADQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLw0KICNpbmNsdWRlICJlcnJvcl9wcml2YXRlLmgiDQogI2luY2x1ZGUgIm1lbS5o Ig0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPg0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwu aD4NCi0jaW5jbHVkZSA8bGludXgveHhoYXNoLmg+DQotI2luY2x1ZGUgPGxpbnV4L3pzdGQuaD4N CisjaW5jbHVkZSA8eGVuL3h4aGFzaC5oPg0KKyNpbmNsdWRlIDx4ZW4venN0ZC5oPg0KIA0KIC8q LSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICBzaGFyZWQgbWFjcm9z DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZpbmUgTUlO KGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpDQotI2RlZmluZSBNQVgoYSwgYikgKChhKSA+ IChiKSA/IChhKSA6IChiKSkNCiAjZGVmaW5lIENIRUNLX0YoZikgICAgICAgICAgICAgICAgICAg ICAgIFwNCiAJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KIAkJc2l6ZV90IGNv bnN0IGVycmNvZCA9IGY7IFwNCkBAIC02NywxMCArNjMsNiBAQA0KICNkZWZpbmUgWlNURF9SRVBf TU9WRV9PUFQgKFpTVERfUkVQX05VTSkNCiBzdGF0aWMgY29uc3QgVTMyIHJlcFN0YXJ0VmFsdWVb WlNURF9SRVBfTlVNXSA9IHsxLCA0LCA4fTsNCiANCi0jZGVmaW5lIEtCICooMSA8PCAxMCkNCi0j ZGVmaW5lIE1CICooMSA8PCAyMCkNCi0jZGVmaW5lIEdCICooMVUgPDwgMzApDQotDQogI2RlZmlu ZSBCSVQ3IDEyOA0KICNkZWZpbmUgQklUNiA2NA0KICNkZWZpbmUgQklUNSAzMg0KZGlmZiAtLWdp dCBhL3hlbi9pbmNsdWRlL3hlbi9kZWNvbXByZXNzLmggYi94ZW4vaW5jbHVkZS94ZW4vZGVjb21w cmVzcy5oDQppbmRleCBiMjk1NWZhYTRiLi5mNWJjMTdmMmI2IDEwMDY0NA0KLS0tIGEveGVuL2lu Y2x1ZGUveGVuL2RlY29tcHJlc3MuaA0KKysrIGIveGVuL2luY2x1ZGUveGVuL2RlY29tcHJlc3Mu aA0KQEAgLTMxLDcgKzMxLDcgQEAgdHlwZWRlZiBpbnQgZGVjb21wcmVzc19mbih1bnNpZ25lZCBj aGFyICppbmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwNCiAgKiBkZXBlbmRlbnQpLg0KICAqLw0KIA0K LWRlY29tcHJlc3NfZm4gYnVuemlwMiwgdW54eiwgdW5sem1hLCB1bmx6bywgdW5sejQ7DQorZGVj b21wcmVzc19mbiBidW56aXAyLCB1bnh6LCB1bmx6bWEsIHVubHpvLCB1bmx6NCwgdW56c3RkOw0K IA0KIGludCBkZWNvbXByZXNzKHZvaWQgKmluYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpv dXRidWYpOw0KIA0KZGlmZiAtLWdpdCBhL3hlbi9pbmNsdWRlL3hlbi94eGhhc2guaCBiL3hlbi9p bmNsdWRlL3hlbi94eGhhc2guaA0KaW5kZXggZGY0MjUxMTQzOC4uMTNkZGM2MTZkMSAxMDA2NDQN Ci0tLSBhL3hlbi9pbmNsdWRlL3hlbi94eGhhc2guaA0KKysrIGIveGVuL2luY2x1ZGUveGVuL3h4 aGFzaC5oDQpAQCAtNzUsNyArNzUsNyBAQA0KICNpZm5kZWYgWFhIQVNIX0gNCiAjZGVmaW5lIFhY SEFTSF9IDQogDQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQorI2luY2x1ZGUgPHhlbi90eXBl cy5oPg0KIA0KIC8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBTaW1wbGUgSGFz aCBGdW5jdGlvbnMNCmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS94ZW4venN0ZC5oIGIveGVuL2lu Y2x1ZGUveGVuL3pzdGQuaA0KaW5kZXggMjQ5NTc1ZTI0OC4uZWIzMzU4MmExOCAxMDA2NDQNCi0t LSBhL3hlbi9pbmNsdWRlL3hlbi96c3RkLmgNCisrKyBiL3hlbi9pbmNsdWRlL3hlbi96c3RkLmgN CkBAIC0xOCw3ICsxOCw3IEBADQogI2RlZmluZSBaU1REX0gNCiANCiAvKiA9PT09PT0gICBEZXBl bmRlbmN5ICAgPT09PT09Ki8NCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gICAvKiBzaXplX3Qg Ki8NCisjaW5jbHVkZSA8eGVuL3R5cGVzLmg+ICAgLyogc2l6ZV90ICovDQogDQogDQogLyotKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioNCi0tIA0KMi4yNi4yDQoNCg== --8323328-1543918517-1606172471=:3753--