From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id CD29A481A0 for ; Sun, 12 Nov 2023 10:37:31 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 493DD68CC40; Sun, 12 Nov 2023 12:36:24 +0200 (EET) Received: from APC01-PSA-obe.outbound.protection.outlook.com (mail-psaapc01olkn2037.outbound.protection.outlook.com [40.92.52.37]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 91EC168CC50 for ; Sun, 12 Nov 2023 12:36:19 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MXvdLu7QDhlSctG7wKZDWXfdsZzELmALBf4FuKHVO/wCgqOqzmQP5YAM/qbi0H8e2YwqFCcoIj/mzs8YIG68fPHKio6hCLUdILdiYSM0U0Ky/CK7ugrk9nK++djOyKfVxqqwtznEJvvRbHA0ZY+RuvDIfWkNjZPboC/ALZbaa6j4s45yQ3hLp0YpB1MQvFdaaMyOEioKPCCYblvBKfAwjilydFy/oXw1C7pSJek/Wz6Au1XCwr1KsbM3bDN/NmVC2SXTx64sITRytXdtppv9sx8YwS8MJksfI5pygTAjpUQY5Y+VCQ9THquQs+jsF76Gh1l/d2brc1z1tuI24YW4Hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GFXSDEqKT235EXXj9u3LNBjBvjxKoLN94sGNgJ2PEWQ=; b=ZfRig6YkH4S8cWCZ1cr6j9SPM9xVYr9LEfZdb26kIRY9zFQOFoMrRol7AJSTe/PQdBp59yUQuT0nxjVi3/mkzqONXBBqL3kJYn7oWcUYQkJYIjGJUFVfEt4uj8KiB9T65k/bvI13kgLfF1s2a4P8UxgJ230jd2CeiQr0raNZ8vlcuZifrKPhsL1t+xDuIcMmrLmlwLAeJaFt3UYlpqXBtOxS51nannxuHks+mIhCzKVeTCEVDn0WCKelPXLp/k/CnUD3auJr7SLjps+YG4wLLIjR9/NAnySMSByStxS/B/XQuPjUPrBLK55FMTEY3lL+9vTVqDkSCSL1xbtU6nRCOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GFXSDEqKT235EXXj9u3LNBjBvjxKoLN94sGNgJ2PEWQ=; b=a+XqEkXLbxsDye1ek028t0fNGlqBvLJaAaP6hmCRNTW/+YP0vW40rcZIcBvahCrkcUuU2MDpuB4o3LTT7ffOWX/UDV0kO1ID+qivxWVY6RrrMziIbUpYfa6xIEyHVFzpaiMj0KoG+6vgDyhHoyrrDacBdc4IDviVlCX2em6eVqLL7BhEk2nWaczjOsU7zup9GxZQaQC1nYC4zLYisNAf13sZqEzfzMKer3dpLjXeB4/oGrklZyCTHXV2bDw370mg+u7di4Pe4vLdcPU7t21r4Rxvuw+kfDzeI16/QAW3RrBZrlFv95x8f05Iau0OiIjl+l/ztsBsZS6kINJmiGl12A== Received: from TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) by TYSPR06MB6768.apcprd06.prod.outlook.com (2603:1096:400:475::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.29; Sun, 12 Nov 2023 10:36:00 +0000 Received: from TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::80b3:be24:949c:e49f]) by TYSPR06MB6433.apcprd06.prod.outlook.com ([fe80::80b3:be24:949c:e49f%4]) with mapi id 15.20.6954.028; Sun, 12 Nov 2023 10:36:00 +0000 From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sun, 12 Nov 2023 18:35:21 +0800 Message-ID: X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231112103526.11245-1-nuomi2021@gmail.com> References: <20231112103526.11245-1-nuomi2021@gmail.com> X-TMN: [m4K2jnhcWM26fc28EbPXp1q+JXTm5iO1] X-ClientProxiedBy: TYWP286CA0030.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:262::20) To TYSPR06MB6433.apcprd06.prod.outlook.com (2603:1096:400:47a::6) X-Microsoft-Original-Message-ID: <20231112103526.11245-9-nuomi2021@gmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 2 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TYSPR06MB6433:EE_|TYSPR06MB6768:EE_ X-MS-Office365-Filtering-Correlation-Id: 1f913a7e-edc2-44ec-d7ee-08dbe36b2993 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: MPlKKQWWKYZhCRtf0fzpHZeduXjzoM/MBFv3kzXteICvLN74RmEQAgMfl/KvUm/cx2jarlxIfU+tXHkYMCxmeW9r+TKgF0Jm2CAdJ76tzLlJwuENpRl4of9eiaT+sgQxdVriRzm43DKJMmBbX2TCWfkyqbv01Y3C2ZWzvUAb2V00nxdZjLk44FbUDxtv+CGIMlexTTYEWnrWD1OlV73mSMK1XQNftRDo8G9wJN84R6Rx6FCtSmVlUXlbKQ4xtZEo1yFiIZmwdui+8Qu4efSwUfQf2eITN3mx7TR2qAKZBB9k3ayT6FPcpYvqx6Epz9QGbvvxK9SuQX/HtmG3XiX2qoCS5EmdP8y9p8JF67ffpLoy2lS0FyRPrXeQ+jyHbFIyeE3VoEgNpLJQ8np8NUR8WL7wmcEVUjurs270/Epps+3+xAdFpFTe4+Pvc9iun0YRiglLbOBuGZmUuw+5Lf+3rggtXDL6iZlKCZ3nJqbfYOefC3HmzZ30h3hPN+US5MDMY2Sa+Jg5wFxQDmQ+K6Ah+ncE0V5ZO/Gqrxp4wE6p1eICKMJ7dBFjngLL2kcajkZK4rjcRufxoT3otfyr6qjYoXu1VpjpT4Mt8DNtyvgML6JcwEG6GmExdlX0nXzmjN1n X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bzlhQVpFd2pwNDZpb0lVaGRWUE1PL2JjbmY2ZHREWmcrcG5YY0ZZU0xnemEv?= =?utf-8?B?OWlxYndiZWlvWHQ3ZUpDaU9vOU5HV29zVDFHRmhJWHZpcEVWcTNZRTFsaFpT?= =?utf-8?B?L3lsWUJ1U3lxdUFMNmxuZDhjMUt3YjlwOHpndTNjNkgzSzZrVWxqc1pWa0ZY?= =?utf-8?B?My9lbU1mK0xJL2k4RHhSOU44V1FJOWFQOTRTbzRBWER4MWlkTjBncVNHclor?= =?utf-8?B?UWU0VTBXeTJJZWlMZ0JVcmcyQm5DMlZJTG1vVjYzTkJJYzRGSndqSXpYTGxY?= =?utf-8?B?aUhKQ2tCUjc1VHlBbVhKRy9zK1M5S1o3bzAveFA3Z2xvZlQ0R1VXM3JLcHA2?= =?utf-8?B?cy85UkQvc2lFZitCcVVrUnlpdGRLdVA0R0xlUmI2aVpsTnFxRlhhRXVoRitn?= =?utf-8?B?Q0Q2MlFNa3BJQW1acE8wRk80ZmE5cEtLb0t3SzJHaVl2ZmRzcGkvYTMrbjNO?= =?utf-8?B?RWVUOXdvVHFQTWFlWVMzSkF0c2hTZ1Y1RjBjZXlXSy9kSFEyVDh3bDFVbVJu?= =?utf-8?B?Sk0wajNnek02T2ZaRjNkRm1udC9DcUg5S1BncG5FVm5zTUZBWGlIb1E5cWVT?= =?utf-8?B?b2xESGNpQXp0NVZXeEdkd2Q4RGdUSnNpVGNuV2tXL0YyYmtaVktWS3lRcmw0?= =?utf-8?B?N2w2aUNtNjFWVEp0eU9RN3lINVcxeE5xaDhLRDlKQkpiWEJLT3FmV1lwZE0w?= =?utf-8?B?T04yRkhxajg2MFc3ZlBjUEptYUt6YVlEMC9SUlI3NkhQdU9NbFpYWnRWNk9a?= =?utf-8?B?ZkxkMUh6SDFHSkVPcFRubFd2aTFLRVJKcFJLc01mWTVFVmVOdDlLSmVpbmhp?= =?utf-8?B?cDdzcHV2ZnY4QnFnZ09oS3Nna0tlQTNzQXlnU2VySEw2Nnc1SzQ2eEpza0tv?= =?utf-8?B?SFpjemo4V2VEQmhzdlhsb015b2hldG8rS0Y3TWpEMC9KWk5pZE95MElzNDgz?= =?utf-8?B?RzhRc0Y4bURTQUhldWhEU2NDdUVvd3FKK21mWVZmQTVqVmhLSWtLZjhLZkds?= =?utf-8?B?Z2lYWXJDVk1GbFhucjk1SUZtTG1xdW1qK2xCOUtNckZ1S3dTT0VKMnRkV012?= =?utf-8?B?QmRjR0xZU2RLTVVvcFZVbUVpY1JzQ2FlN2xVRGlabU9CMDFBVXJlNGtsc0ZS?= =?utf-8?B?SjBMYnZlUnVPbFJ1SXhXTXQ5OEk0UEZlMEdyVVhwa0ozU0xBUTBTK0NwWmVR?= =?utf-8?B?Y0VXcDFpSERCbjJWQVFBR0pOWjNFeE85UTJnYk16MHBFVmtPRkEwNUJ1RUlZ?= =?utf-8?B?dFcvTC9SdlpiYXVOM3hSQlROL0lYWG5DN1Ftenk3SDVYZWRISlR0UnRDOXJ2?= =?utf-8?B?V2tHbEdFYktQbXp5M1JWQmdRVXd6MVhIVWZ4RnpJSzFCT3NudjhJTWtBV1hY?= =?utf-8?B?OTQ1UUdyU08wWXl6OElCOTdqblRBQTNEZkZINk9FU3RrWk12dEREaUZjbi9n?= =?utf-8?B?SWxpZG5oUkFRNHI0RFM4Z1g3dzQ1M21yYUtBcGYxcVh2ZlR4WFJ1YWlVdHVO?= =?utf-8?B?SHNuUUI2TG9FVWNaY0lkUlQrS29tdVBLYXVqb016SFVaTGF6QTVHU0M3dFJx?= =?utf-8?B?dkRmWCtaOXJJVGVCcW5mUkhCQXlaODZza3VSMHFEbXpRazBOOWd4K0ZKWWdk?= =?utf-8?B?VHVzZDVLOEFJQm0reFQyTTEzcTN3OGI4a0xXUVR0OXl3SVBmNzBieml5SnVX?= =?utf-8?Q?ITEOdkyltwPpk+Wm47NZ?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1f913a7e-edc2-44ec-d7ee-08dbe36b2993 X-MS-Exchange-CrossTenant-AuthSource: TYSPR06MB6433.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Nov 2023 10:36:00.5026 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYSPR06MB6768 Subject: [FFmpeg-devel] [PATCH v5 09/14] vvcdec: add intra prediction X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Nuo Mi Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: LS0tCiBsaWJhdmNvZGVjL3Z2Yy9NYWtlZmlsZSAgICAgICAgICAgICB8ICAgIDEgKwogbGliYXZj b2RlYy92dmMvdnZjX2N0dS5jICAgICAgICAgICAgfCAgIDUwICsrCiBsaWJhdmNvZGVjL3Z2Yy92 dmNfY3R1LmggICAgICAgICAgICB8ICAgIDIgKwogbGliYXZjb2RlYy92dmMvdnZjX2ludHJhLmMg ICAgICAgICAgfCAgNzY5ICsrKysrKysrKysrKysrKysrKysrCiBsaWJhdmNvZGVjL3Z2Yy92dmNf aW50cmEuaCAgICAgICAgICB8ICAgNDkgKysKIGxpYmF2Y29kZWMvdnZjL3Z2Y19pbnRyYV90ZW1w bGF0ZS5jIHwgMTAxNSArKysrKysrKysrKysrKysrKysrKysrKysrKysKIDYgZmlsZXMgY2hhbmdl ZCwgMTg4NiBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliYXZjb2RlYy92dmMv dnZjX2ludHJhLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmNvZGVjL3Z2Yy92dmNfaW50cmEu aAogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYmF2Y29kZWMvdnZjL3Z2Y19pbnRyYV90ZW1wbGF0ZS5j CgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92dmMvTWFrZWZpbGUgYi9saWJhdmNvZGVjL3Z2Yy9N YWtlZmlsZQppbmRleCA1Nzk2ZjlhZDQyLi4zYjFhYzcyMDI5IDEwMDY0NAotLS0gYS9saWJhdmNv ZGVjL3Z2Yy9NYWtlZmlsZQorKysgYi9saWJhdmNvZGVjL3Z2Yy9NYWtlZmlsZQpAQCAtNiw2ICs2 LDcgQEAgT0JKUy0kKENPTkZJR19WVkNfREVDT0RFUikgICAgICAgICAgKz0gIHZ2Yy92dmNkZWMu byAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2 dmMvdnZjX2N0dS5vICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdnZjL3Z2Y19kYXRhLm8gICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHZ2Yy92dmNfaW50ZXIubyAgICAgICAgIFwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dmMvdnZjX2ludHJhLm8gICAgICAgICBcCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnZjL3Z2Y19pdHhfMWQubyAg ICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ2Yy92dmNf bXZzLm8gICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB2dmMvdnZjX3BzLm8gICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Z2Yy92 dmNfY3R1LmMgYi9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmMKaW5kZXggM2QzMWI4NjJhZS4uNjEz OGQyZmM5ZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92dmMvdnZjX2N0dS5jCisrKyBiL2xpYmF2 Y29kZWMvdnZjL3Z2Y19jdHUuYwpAQCAtMjAsMTAgKzIwLDQxIEBACiAgKiBGb3VuZGF0aW9uLCBJ bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEz MDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2Y29kZWMvcmVmc3RydWN0LmgiCisKICNpbmNs dWRlICJ2dmNfY2FiYWMuaCIKICNpbmNsdWRlICJ2dmNfY3R1LmgiCiAjaW5jbHVkZSAidnZjX212 cy5oIgogCit2b2lkIGZmX3Z2Y19kZWNvZGVfbmVpZ2hib3VyKFZWQ0xvY2FsQ29udGV4dCAqbGMs IGNvbnN0IGludCB4X2N0YiwgY29uc3QgaW50IHlfY3RiLAorICAgIGNvbnN0IGludCByeCwgY29u c3QgaW50IHJ5LCBjb25zdCBpbnQgcnMpCit7CisgICAgVlZDRnJhbWVDb250ZXh0ICpmYyA9IGxj LT5mYzsKKyAgICBjb25zdCBpbnQgY3RiX3NpemUgICAgICAgICA9IGZjLT5wcy5zcHMtPmN0Yl9z aXplX3k7CisKKyAgICBsYy0+ZW5kX29mX3RpbGVzX3ggPSBmYy0+cHMuc3BzLT53aWR0aDsKKyAg ICBsYy0+ZW5kX29mX3RpbGVzX3kgPSBmYy0+cHMuc3BzLT5oZWlnaHQ7CisgICAgaWYgKGZjLT5w cy5wcHMtPmN0Yl90b19jb2xfYmRbcnhdICE9IGZjLT5wcy5wcHMtPmN0Yl90b19jb2xfYmRbcngg KyAxXSkKKyAgICAgICAgbGMtPmVuZF9vZl90aWxlc194ID0gRkZNSU4oeF9jdGIgKyBjdGJfc2l6 ZSwgbGMtPmVuZF9vZl90aWxlc194KTsKKyAgICBpZiAoZmMtPnBzLnBwcy0+Y3RiX3RvX3Jvd19i ZFtyeV0gIT0gZmMtPnBzLnBwcy0+Y3RiX3RvX3Jvd19iZFtyeSArIDFdKQorICAgICAgICBsYy0+ ZW5kX29mX3RpbGVzX3kgPSBGRk1JTih5X2N0YiArIGN0Yl9zaXplLCBsYy0+ZW5kX29mX3RpbGVz X3kpOworCisgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzID0gMDsKKyAgICBpZiAocnggPiAwICYmIGZj LT5wcy5wcHMtPmN0Yl90b19jb2xfYmRbcnhdICE9IGZjLT5wcy5wcHMtPmN0Yl90b19jb2xfYmRb cnggLSAxXSkKKyAgICAgICAgbGMtPmJvdW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX0xFRlRfVElM RTsKKyAgICBpZiAocnggPiAwICYmIGZjLT50YWIuc2xpY2VfaWR4W3JzXSAhPSBmYy0+dGFiLnNs aWNlX2lkeFtycyAtIDFdKQorICAgICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgfD0gQk9VTkRBUllf TEVGVF9TTElDRTsKKyAgICBpZiAocnkgPiAwICYmIGZjLT5wcy5wcHMtPmN0Yl90b19yb3dfYmRb cnldICE9IGZjLT5wcy5wcHMtPmN0Yl90b19yb3dfYmRbcnkgLSAxXSkKKyAgICAgICAgbGMtPmJv dW5kYXJ5X2ZsYWdzIHw9IEJPVU5EQVJZX1VQUEVSX1RJTEU7CisgICAgaWYgKHJ5ID4gMCAmJiBm Yy0+dGFiLnNsaWNlX2lkeFtyc10gIT0gZmMtPnRhYi5zbGljZV9pZHhbcnMgLSBmYy0+cHMucHBz LT5jdGJfd2lkdGhdKQorICAgICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgfD0gQk9VTkRBUllfVVBQ RVJfU0xJQ0U7CisgICAgbGMtPmN0Yl9sZWZ0X2ZsYWcgPSByeCA+IDAgJiYgIShsYy0+Ym91bmRh cnlfZmxhZ3MgJiBCT1VOREFSWV9MRUZUX1RJTEUpOworICAgIGxjLT5jdGJfdXBfZmxhZyAgID0g cnkgPiAwICYmICEobGMtPmJvdW5kYXJ5X2ZsYWdzICYgQk9VTkRBUllfVVBQRVJfVElMRSkgJiYg IShsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9VUFBFUl9TTElDRSk7CisgICAgbGMtPmN0 Yl91cF9yaWdodF9mbGFnID0gbGMtPmN0Yl91cF9mbGFnICYmIChmYy0+cHMucHBzLT5jdGJfdG9f Y29sX2JkW3J4XSA9PSBmYy0+cHMucHBzLT5jdGJfdG9fY29sX2JkW3J4ICsgMV0pICYmCisgICAg ICAgIChmYy0+cHMucHBzLT5jdGJfdG9fcm93X2JkW3J5XSA9PSBmYy0+cHMucHBzLT5jdGJfdG9f cm93X2JkW3J5IC0gMV0pOworICAgIGxjLT5jdGJfdXBfbGVmdF9mbGFnID0gbGMtPmN0Yl9sZWZ0 X2ZsYWcgJiYgbGMtPmN0Yl91cF9mbGFnOworfQorCiB2b2lkIGZmX3Z2Y19zZXRfbmVpZ2hib3Vy X2F2YWlsYWJsZShWVkNMb2NhbENvbnRleHQgKmxjLAogICAgIGNvbnN0IGludCB4MCwgY29uc3Qg aW50IHkwLCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgpCiB7CkBAIC0zOSw2ICs3MCwyNSBAQCB2 b2lkIGZmX3Z2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShWVkNMb2NhbENvbnRleHQgKmxjLAog ICAgIGxjLT5uYS5jYW5kX3VwX3JpZ2h0ID0gbGMtPm5hLmNhbmRfdXBfcmlnaHRfc2FwICYmICh4 MCArIHcpIDwgbGMtPmVuZF9vZl90aWxlc194OwogfQogCit2b2lkIGZmX3Z2Y19jdHVfZnJlZV9j dXMoQ1RVICpjdHUpCit7CisgICAgQ29kaW5nVW5pdCAqKmN1cyAgPSAmY3R1LT5jdXM7CisgICAg d2hpbGUgKCpjdXMpIHsKKyAgICAgICAgQ29kaW5nVW5pdCAqY3UgICAgICAgICAgPSAqY3VzOwor ICAgICAgICBUcmFuc2Zvcm1Vbml0ICoqaGVhZCAgICA9ICZjdS0+dHVzLmhlYWQ7CisKKyAgICAg ICAgKmN1cyA9IGN1LT5uZXh0OworCisgICAgICAgIHdoaWxlICgqaGVhZCkgeworICAgICAgICAg ICAgVHJhbnNmb3JtVW5pdCAqdHUgPSAqaGVhZDsKKyAgICAgICAgICAgICpoZWFkID0gdHUtPm5l eHQ7CisgICAgICAgICAgICBmZl9yZWZzdHJ1Y3RfdW5yZWYoJnR1KTsKKyAgICAgICAgfQorICAg ICAgICBjdS0+dHVzLnRhaWwgPSBOVUxMOworCisgICAgICAgIGZmX3JlZnN0cnVjdF91bnJlZigm Y3UpOworICAgIH0KK30KIAogdm9pZCBmZl92dmNfZXBfaW5pdF9zdGF0X2NvZWZmKEVudHJ5UG9p bnQgKmVwLAogCWNvbnN0IGludCBiaXRfZGVwdGgsIGNvbnN0IGludCBwZXJzaXN0ZW50X3JpY2Vf YWRhcHRhdGlvbl9lbmFibGVkX2ZsYWcpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Z2Yy92dmNf Y3R1LmggYi9saWJhdmNvZGVjL3Z2Yy92dmNfY3R1LmgKaW5kZXggMzdkYTVmMGRmNC4uNjkyNWI2 MjFhNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92dmMvdnZjX2N0dS5oCisrKyBiL2xpYmF2Y29k ZWMvdnZjL3Z2Y19jdHUuaApAQCAtNDYwLDYgKzQ2MCw4IEBAIHR5cGVkZWYgc3RydWN0IEFMRlBh cmFtcyB7CiAKIC8vdXRpbHMKIHZvaWQgZmZfdnZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKFZW Q0xvY2FsQ29udGV4dCAqbGMsIGludCB4MCwgaW50IHkwLCBpbnQgdywgaW50IGgpOwordm9pZCBm Zl92dmNfZGVjb2RlX25laWdoYm91cihWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgeF9jdGIsIGlu dCB5X2N0YiwgaW50IHJ4LCBpbnQgcnksIGludCBycyk7Cit2b2lkIGZmX3Z2Y19jdHVfZnJlZV9j dXMoQ1RVICpjdHUpOwogdm9pZCBmZl92dmNfZXBfaW5pdF9zdGF0X2NvZWZmKEVudHJ5UG9pbnQg KmVwLCBpbnQgYml0X2RlcHRoLCBpbnQgcGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxl ZF9mbGFnKTsKIAogI2VuZGlmIC8vIEFWQ09ERUNfVlZDX0NUVV9ICmRpZmYgLS1naXQgYS9saWJh dmNvZGVjL3Z2Yy92dmNfaW50cmEuYyBiL2xpYmF2Y29kZWMvdnZjL3Z2Y19pbnRyYS5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjc4MWYwNGY0MTkKLS0tIC9kZXYvbnVs bAorKysgYi9saWJhdmNvZGVjL3Z2Yy92dmNfaW50cmEuYwpAQCAtMCwwICsxLDc2OSBAQAorLyoK KyAqIFZWQyBpbnRyYSBwcmVkaWN0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIE51byBN aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs aWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm dGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgImxpYmF2 dXRpbC9mcmFtZS5oIgorCisjaW5jbHVkZSAidnZjX2RhdGEuaCIKKyNpbmNsdWRlICJ2dmNfaW50 ZXIuaCIKKyNpbmNsdWRlICJ2dmNfaW50cmEuaCIKKyNpbmNsdWRlICJ2dmNfaXR4XzFkLmgiCisK K3N0YXRpYyBpbnQgaXNfY2NsbShlbnVtIEludHJhUHJlZE1vZGUgbW9kZSkKK3sKKyAgICByZXR1 cm4gbW9kZSA9PSBJTlRSQV9MVF9DQ0xNIHx8IG1vZGUgPT0gSU5UUkFfTF9DQ0xNIHx8IG1vZGUg PT0gSU5UUkFfVF9DQ0xNOworfQorCitzdGF0aWMgaW50IGRlcml2ZV9pbGZuc3RfcHJlZF9tb2Rl X2ludHJhKGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IFRyYW5zZm9ybUJsb2NrICp0 YikKK3sKKyAgICBjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0 IFZWQ1NQUyAqc3BzID0gZmMtPnBzLnNwczsKKyAgICBjb25zdCBDb2RpbmdVbml0ICpjdSAgICAg ICAgICA9IGxjLT5jdTsKKyAgICBjb25zdCBpbnQgeF90YiAgICAgICAgICAgICAgICA9IHRiLT54 MCA+PiBmYy0+cHMuc3BzLT5taW5fY2JfbG9nMl9zaXplX3k7CisgICAgY29uc3QgaW50IHlfdGIg ICAgICAgICAgICAgICAgPSB0Yi0+eTAgPj4gZmMtPnBzLnNwcy0+bWluX2NiX2xvZzJfc2l6ZV95 OworICAgIGNvbnN0IGludCB4X2MgICAgICAgICAgICAgICAgID0gKHRiLT54MCArICh0Yi0+dGJf d2lkdGggPDwgc3BzLT5oc2hpZnRbMV0gPj4gMSkgKSA+PiBmYy0+cHMuc3BzLT5taW5fY2JfbG9n Ml9zaXplX3k7CisgICAgY29uc3QgaW50IHlfYyAgICAgICAgICAgICAgICAgPSAodGItPnkwICsg KHRiLT50Yl9oZWlnaHQgPDwgc3BzLT52c2hpZnRbMV0gPj4gMSkpID4+IGZjLT5wcy5zcHMtPm1p bl9jYl9sb2cyX3NpemVfeTsKKyAgICBjb25zdCBpbnQgbWluX2NiX3dpZHRoICAgICAgICA9IGZj LT5wcy5wcHMtPm1pbl9jYl93aWR0aDsKKyAgICBjb25zdCBpbnQgaW50cmFfbWlwX2ZsYWcgICAg ICA9IFNBTVBMRV9DVEIoZmMtPnRhYi5pbWYsIHhfdGIsIHlfdGIpOworICAgIGludCBwcmVkX21v ZGVfaW50cmEgPSB0Yi0+Y19pZHggPT0gMCA/IGN1LT5pbnRyYV9wcmVkX21vZGVfeSA6IGN1LT5p bnRyYV9wcmVkX21vZGVfYzsKKyAgICBpZiAoaW50cmFfbWlwX2ZsYWcgJiYgIXRiLT5jX2lkeCkg eworICAgICAgICBwcmVkX21vZGVfaW50cmEgPSBJTlRSQV9QTEFOQVI7CisgICAgfSBlbHNlIGlm IChpc19jY2xtKHByZWRfbW9kZV9pbnRyYSkpIHsKKyAgICAgICAgaW50IGludHJhX21pcF9mbGFn X2MgPSBTQU1QTEVfQ1RCKGZjLT50YWIuaW1mLCB4X2MsIHlfYyk7CisgICAgICAgIGludCBjdV9w cmVkX21vZGUgPSBTQU1QTEVfQ1RCKGZjLT50YWIuY3BtWzBdLCB4X2MsIHlfYyk7CisgICAgICAg IGlmIChpbnRyYV9taXBfZmxhZ19jKSB7CisgICAgICAgICAgICBwcmVkX21vZGVfaW50cmEgPSBJ TlRSQV9QTEFOQVI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VfcHJlZF9tb2RlID09IE1PREVfSUJD IHx8IGN1X3ByZWRfbW9kZSA9PSBNT0RFX1BMVCkgeworICAgICAgICAgICAgcHJlZF9tb2RlX2lu dHJhID0gSU5UUkFfREM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmVkX21vZGVf aW50cmEgPSBTQU1QTEVfQ1RCKGZjLT50YWIuaXBtLCB4X2MsIHlfYyk7CisgICAgICAgIH0KKyAg ICB9CisgICAgcHJlZF9tb2RlX2ludHJhID0gZmZfdnZjX3dpZGVfYW5nbGVfbW9kZV9tYXBwaW5n KGN1LCB0Yi0+dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQsIHRiLT5jX2lkeCwgcHJlZF9tb2RlX2lu dHJhKTsKKworICAgIHJldHVybiBwcmVkX21vZGVfaW50cmE7Cit9CisKKy8vOC43LjQgVHJhbnNm b3JtYXRpb24gcHJvY2VzcyBmb3Igc2NhbGVkIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKK3N0YXRp YyB2b2lkIGlsZm5zdF90cmFuc2Zvcm0oY29uc3QgVlZDTG9jYWxDb250ZXh0ICpsYywgVHJhbnNm b3JtQmxvY2sgKnRiKQoreworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgICAgICAgICA9IGxjLT5m Yy0+cHMuc3BzOworICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ICAgICAgICA9IGxjLT5jdTsKKyAg ICBjb25zdCBpbnQgdyAgICAgICAgICAgICAgICAgPSB0Yi0+dGJfd2lkdGg7CisgICAgY29uc3Qg aW50IGggICAgICAgICAgICAgICAgID0gdGItPnRiX2hlaWdodDsKKyAgICBjb25zdCBpbnQgbl9s Zm5zdF9vdXRfc2l6ZSAgPSAodyA+PSA4ICYmIGggPj0gOCkgPyA0OCA6IDE2OyAgICAgICAgICAg ICAgICAgICAgICAgICAvLy88IG5MZm5zdE91dFNpemUKKyAgICBjb25zdCBpbnQgbG9nMl9sZm5z dF9zaXplICAgPSAodyA+PSA4ICYmIGggPj0gOCkgPyAzIDogMjsgICAgICAgICAgICAgICAgICAg ICAgICAgICAvLy88IGxvZzJMZm5zdFNpemUKKyAgICBjb25zdCBpbnQgbl9sZm5zdF9zaXplICAg ICAgPSAxIDw8IGxvZzJfbGZuc3Rfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAvLy88IG5MZm5zdFNpemUKKyAgICBjb25zdCBpbnQgbm9uX3plcm9fc2l6ZSAgICAgPSAoKHcg PT0gOCAmJiBoID09IDgpIHx8ICh3ID09IDQgJiYgaCA9PSA0KSkgPyA4IDogMTY7ICAvLy88IG5v blplcm9TaXplCisgICAgY29uc3QgaW50IHByZWRfbW9kZV9pbnRyYSAgID0gZGVyaXZlX2lsZm5z dF9wcmVkX21vZGVfaW50cmEobGMsIHRiKTsKKyAgICBjb25zdCBpbnQgdHJhbnNwb3NlICAgICAg ICAgPSBwcmVkX21vZGVfaW50cmEgPiAzNDsKKyAgICBpbnQgdVsxNl0sIHZbNDhdOworCisgICAg Zm9yIChpbnQgeCA9IDA7IHggPCBub25femVyb19zaXplOyB4KyspIHsKKyAgICAgICAgaW50IHhj ID0gZmZfdnZjX2RpYWdfc2Nhbl94WzJdWzJdW3hdOworICAgICAgICBpbnQgeWMgPSBmZl92dmNf ZGlhZ19zY2FuX3lbMl1bMl1beF07CisgICAgICAgIHVbeF0gPSB0Yi0+Y29lZmZzW3cgKiB5YyAr IHhjXTsKKyAgICB9CisgICAgZmZfdnZjX2ludl9sZm5zdF8xZCh2LCB1LCBub25femVyb19zaXpl LCBuX2xmbnN0X291dF9zaXplLCBwcmVkX21vZGVfaW50cmEsCisgICAgICAgICAgICAgICAgICAg ICAgICBjdS0+bGZuc3RfaWR4LCBzcHMtPmxvZzJfdHJhbnNmb3JtX3JhbmdlKTsKKyAgICBpZiAo dHJhbnNwb3NlKSB7CisgICAgICAgIGludCAqZHN0ID0gdGItPmNvZWZmczsKKyAgICAgICAgY29u c3QgaW50ICpzcmMgPSB2OworICAgICAgICBpZiAobl9sZm5zdF9zaXplID09IDQpIHsKKyAgICAg ICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZHN0 WzBdID0gc3JjWzBdOworICAgICAgICAgICAgICAgIGRzdFsxXSA9IHNyY1s0XTsKKyAgICAgICAg ICAgICAgICBkc3RbMl0gPSBzcmNbOF07CisgICAgICAgICAgICAgICAgZHN0WzNdID0gc3JjWzEy XTsKKyAgICAgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgICAgICBkc3QgKz0gdzsKKyAg ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IHkgPSAw OyB5IDwgODsgeSsrKSB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAg ICAgICAgICAgIGRzdFsxXSA9IHNyY1s4XTsKKyAgICAgICAgICAgICAgICBkc3RbMl0gPSBzcmNb MTZdOworICAgICAgICAgICAgICAgIGRzdFszXSA9IHNyY1syNF07CisgICAgICAgICAgICAgICAg aWYgKHkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFs0XSA9IHNyY1szMl07CisgICAg ICAgICAgICAgICAgICAgIGRzdFs1XSA9IHNyY1szNl07CisgICAgICAgICAgICAgICAgICAgIGRz dFs2XSA9IHNyY1s0MF07CisgICAgICAgICAgICAgICAgICAgIGRzdFs3XSA9IHNyY1s0NF07Cisg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAg IGRzdCArPSB3OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAg ICAgICBpbnQgKmRzdCA9IHRiLT5jb2VmZnM7CisgICAgICAgIGNvbnN0IGludCAqc3JjID0gdjsK KyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBuX2xmbnN0X3NpemU7IHkrKykgeworICAgICAg ICAgICAgaW50IHNpemUgPSAoeSA8IDQpID8gbl9sZm5zdF9zaXplIDogNDsKKyAgICAgICAgICAg IG1lbWNweShkc3QsIHNyYywgc2l6ZSAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIHNyYyAr PSBzaXplOworICAgICAgICAgICAgZHN0ICs9IHc7CisgICAgICAgIH0KKyAgICB9CisgICAgdGIt Pm1heF9zY2FuX3ggPSBuX2xmbnN0X3NpemUgLSAxOworICAgIHRiLT5tYXhfc2Nhbl95ID0gbl9s Zm5zdF9zaXplIC0gMTsKK30KKworLy9wYXJ0IG9mIDguNy40IFRyYW5zZm9ybWF0aW9uIHByb2Nl c3MgZm9yIHNjYWxlZCB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCitzdGF0aWMgdm9pZCBkZXJpdmVf dHJhbnNmb3JtX3R5cGUoY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYywgY29uc3QgVlZDTG9jYWxD b250ZXh0ICpsYywgY29uc3QgVHJhbnNmb3JtQmxvY2sgKnRiLCBlbnVtIFR4VHlwZSAqdHJoLCBl bnVtIFR4VHlwZSAqdHJ2KQoreworICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ID0gbGMtPmN1Owor ICAgIHN0YXRpYyBjb25zdCBlbnVtIFR4VHlwZSBtdHNfdG9fdHJoW10gPSB7RENUMiwgRFNUNywg RENUOCwgRFNUNywgRENUOH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gVHhUeXBlIG10c190b190 cnZbXSA9IHtEQ1QyLCBEU1Q3LCBEU1Q3LCBEQ1Q4LCBEQ1Q4fTsKKyAgICBjb25zdCBWVkNTUFMg KnNwcyAgICAgICA9IGZjLT5wcy5zcHM7CisgICAgaW50IGltcGxpY2l0X210c19lbmFibGVkID0g MDsKKyAgICBpZiAodGItPmNfaWR4IHx8IChjdS0+aXNwX3NwbGl0X3R5cGUgIT0gSVNQX05PX1NQ TElUICYmIGN1LT5sZm5zdF9pZHgpKSB7CisgICAgICAgICp0cmggPSAqdHJ2ID0gRENUMjsKKyAg ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzcHMtPnItPnNwc19tdHNfZW5hYmxlZF9m bGFnKSB7CisgICAgICAgIGlmIChjdS0+aXNwX3NwbGl0X3R5cGUgIT0gSVNQX05PX1NQTElUIHx8 CisgICAgICAgICAgICAoY3UtPnNidF9mbGFnICYmIEZGTUFYKHRiLT50Yl93aWR0aCwgdGItPnRi X2hlaWdodCkgPD0gMzIpIHx8CisgICAgICAgICAgICAoIXNwcy0+ci0+c3BzX2V4cGxpY2l0X210 c19pbnRyYV9lbmFibGVkX2ZsYWcgJiYgY3UtPnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBICYmCisg ICAgICAgICAgICAhY3UtPmxmbnN0X2lkeCAmJiAhY3UtPmludHJhX21pcF9mbGFnKSkgeworICAg ICAgICAgICAgaW1wbGljaXRfbXRzX2VuYWJsZWQgPSAxOworICAgICAgICB9CisgICAgfQorICAg IGlmIChpbXBsaWNpdF9tdHNfZW5hYmxlZCkgeworICAgICAgICBjb25zdCBpbnQgdyA9IHRiLT50 Yl93aWR0aDsKKyAgICAgICAgY29uc3QgaW50IGggPSB0Yi0+dGJfaGVpZ2h0OworICAgICAgICBp ZiAoY3UtPnNidF9mbGFnKSB7CisgICAgICAgICAgICAqdHJoID0gKGN1LT5zYnRfaG9yaXpvbnRh bF9mbGFnICB8fCBjdS0+c2J0X3Bvc19mbGFnKSA/IERTVDcgOiBEQ1Q4OworICAgICAgICAgICAg KnRydiA9ICghY3UtPnNidF9ob3Jpem9udGFsX2ZsYWcgfHwgY3UtPnNidF9wb3NfZmxhZykgPyBE U1Q3IDogRENUODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp0cmggPSAodyA+PSA0 ICYmIHcgPD0gMTYpID8gRFNUNyA6IERDVDI7CisgICAgICAgICAgICAqdHJ2ID0gKGggPj0gNCAm JiBoIDw9IDE2KSA/IERTVDcgOiBEQ1QyOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAg ICB9CisgICAgKnRyaCA9IG10c190b190cmhbY3UtPm10c19pZHhdOworICAgICp0cnYgPSBtdHNf dG9fdHJ2W2N1LT5tdHNfaWR4XTsKK30KKworc3RhdGljIHZvaWQgYWRkX3Jlc2lkdWFsX2Zvcl9q b2ludF9jb2RpbmdfY2hyb21hKFZWQ0xvY2FsQ29udGV4dCAqbGMsCisgICAgY29uc3QgVHJhbnNm b3JtVW5pdCAqdHUsIFRyYW5zZm9ybUJsb2NrICp0YiwgY29uc3QgaW50IGNocm9tYV9zY2FsZSkK K3sKKyAgICBjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjICA9IGxjLT5mYzsKKyAgICBjb25zdCBD b2RpbmdVbml0ICpjdSA9IGxjLT5jdTsKKyAgICBjb25zdCBpbnQgY19zaWduID0gMSAtIDIgKiBm Yy0+cHMucGguci0+cGhfam9pbnRfY2Jjcl9zaWduX2ZsYWc7CisgICAgY29uc3QgaW50IHNoaWZ0 ICA9IHR1LT5jb2RlZF9mbGFnWzFdIF4gdHUtPmNvZGVkX2ZsYWdbMl07CisgICAgY29uc3QgaW50 IGNfaWR4ICA9IDEgKyB0dS0+Y29kZWRfZmxhZ1sxXTsKKyAgICBjb25zdCBwdHJkaWZmX3Qgc3Ry aWRlID0gZmMtPmZyYW1lLT5saW5lc2l6ZVtjX2lkeF07CisgICAgY29uc3QgaW50IGhzID0gZmMt PnBzLnNwcy0+aHNoaWZ0W2NfaWR4XTsKKyAgICBjb25zdCBpbnQgdnMgPSBmYy0+cHMuc3BzLT52 c2hpZnRbY19pZHhdOworICAgIHVpbnQ4X3QgKmRzdCA9ICZmYy0+ZnJhbWUtPmRhdGFbY19pZHhd Wyh0Yi0+eTAgPj4gdnMpICogc3RyaWRlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICgodGItPngwID4+IGhzKSA8PCBmYy0+cHMuc3BzLT5waXhlbF9zaGlmdCld OworICAgIGlmIChjaHJvbWFfc2NhbGUpIHsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pdHgucHJlZF9y ZXNpZHVhbF9qb2ludCh0Yi0+Y29lZmZzLCB0Yi0+dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQsIGNf c2lnbiwgc2hpZnQpOworICAgICAgICBmYy0+dnZjZHNwLmludHJhLmxtY3Nfc2NhbGVfY2hyb21h KGxjLCB0Yi0+Y29lZmZzLCB0Yi0+Y29lZmZzLCB0Yi0+dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQs IGN1LT54MCwgY3UtPnkwKTsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pdHguYWRkX3Jlc2lkdWFsKGRz dCwgdGItPmNvZWZmcywgdGItPnRiX3dpZHRoLCB0Yi0+dGJfaGVpZ2h0LCBzdHJpZGUpOworICAg IH0gZWxzZSB7CisgICAgICAgIGZjLT52dmNkc3AuaXR4LmFkZF9yZXNpZHVhbF9qb2ludChkc3Qs IHRiLT5jb2VmZnMsIHRiLT50Yl93aWR0aCwgdGItPnRiX2hlaWdodCwgc3RyaWRlLCBjX3NpZ24s IHNoaWZ0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JlY29uc3RydWN0ZWRfYXJlYShW VkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBpbnQgY2hfdHlwZSwgY29uc3QgaW50IHgwLCBjb25z dCBpbnQgeTAsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCkKK3sKKyAgICBjb25zdCBWVkNTUFMg KnNwcyAgICAgICA9IGxjLT5mYy0+cHMuc3BzOworICAgIGNvbnN0IGludCBocyA9IHNwcy0+aHNo aWZ0W2NoX3R5cGVdOworICAgIGNvbnN0IGludCB2cyA9IHNwcy0+dnNoaWZ0W2NoX3R5cGVdOwor ICAgIFJlY29uc3RydWN0ZWRBcmVhICphOworCisgICAgaWYgKGxjLT5udW1fcmFzW2NoX3R5cGVd ID49IEZGX0FSUkFZX0VMRU1TKGxjLT5yYXNbY2hfdHlwZV0pKQorICAgICAgICByZXR1cm4gQVZF UlJPUl9JTlZBTElEREFUQTsKKworICAgIGEgPSAmbGMtPnJhc1tjaF90eXBlXVtsYy0+bnVtX3Jh c1tjaF90eXBlXV07CisgICAgYS0+eCA9IHgwID4+IGhzOworICAgIGEtPnkgPSB5MCA+PiB2czsK KyAgICBhLT53ID0gdyA+PiBoczsKKyAgICBhLT5oID0gaCA+PiB2czsKKyAgICBsYy0+bnVtX3Jh c1tjaF90eXBlXSsrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF90dV9h cmVhKGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBpbnQgKngwLCBpbnQgKnkwLCBpbnQgKncsIGlu dCAqaCkKK3sKKyAgICAqeDAgPSB0dS0+eDA7CisgICAgKnkwID0gdHUtPnkwOworICAgICp3ID0g dHUtPndpZHRoOworICAgICpoID0gdHUtPmhlaWdodDsKK30KKworI2RlZmluZSBNSU5fSVNQX1BS RURfV0lEVEggNAorc3RhdGljIGludCBnZXRfbHVtYV9wcmVkaWN0X3VuaXQoY29uc3QgQ29kaW5n VW5pdCAqY3UsIGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBjb25zdCBpbnQgaWR4LCBpbnQgKngw LCBpbnQgKnkwLCBpbnQgKncsIGludCAqaCkKK3sKKyAgICBpbnQgaGFzX2x1bWEgPSAxOworICAg IGFkZF90dV9hcmVhKHR1LCB4MCwgeTAsIHcsIGgpOworICAgIGlmIChjdS0+aXNwX3NwbGl0X3R5 cGUgPT0gSVNQX1ZFUl9TUExJVCAmJiB0dS0+d2lkdGggPCBNSU5fSVNQX1BSRURfV0lEVEgpIHsK KyAgICAgICAgKncgPSBNSU5fSVNQX1BSRURfV0lEVEg7CisgICAgICAgIGhhc19sdW1hID0gIShp ZHggJSAoTUlOX0lTUF9QUkVEX1dJRFRIIC8gdHUtPndpZHRoKSk7CisgICAgfQorICAgIHJldHVy biBoYXNfbHVtYTsKK30KKworc3RhdGljIGludCBnZXRfY2hyb21hX3ByZWRpY3RfdW5pdChjb25z dCBDb2RpbmdVbml0ICpjdSwgY29uc3QgVHJhbnNmb3JtVW5pdCAqdHUsIGNvbnN0IGludCBpZHgs IGludCAqeDAsIGludCAqeTAsIGludCAqdywgaW50ICpoKQoreworICAgIGlmIChjdS0+aXNwX3Nw bGl0X3R5cGUgPT0gSVNQX05PX1NQTElUKSB7CisgICAgICAgIGFkZF90dV9hcmVhKHR1LCB4MCwg eTAsIHcsIGgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGlkeCA9PSBjdS0+ bnVtX2ludHJhX3N1YnBhcnRpdGlvbnMgLSAxKSB7CisgICAgICAgICp4MCA9IGN1LT54MDsKKyAg ICAgICAgKnkwID0gY3UtPnkwOworICAgICAgICAqdyA9IGN1LT5jYl93aWR0aDsKKyAgICAgICAg KmggPSBjdS0+Y2JfaGVpZ2h0OworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJu IDA7Cit9CisKKy8vOC40LjUuMSBHZW5lcmFsIGRlY29kaW5nIHByb2Nlc3MgZm9yIGludHJhIGJs b2Nrcworc3RhdGljIHZvaWQgcHJlZGljdF9pbnRyYShWVkNMb2NhbENvbnRleHQgKmxjLCBjb25z dCBUcmFuc2Zvcm1Vbml0ICp0dSwgY29uc3QgaW50IGlkeCwgY29uc3QgaW50IHRhcmdldF9jaF90 eXBlKQoreworICAgIGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMgICAgICAgICA9IGxjLT5mYzsK KyAgICBjb25zdCBDb2RpbmdVbml0ICpjdSAgICAgICAgPSBsYy0+Y3U7CisgICAgY29uc3QgVlZD VHJlZVR5cGUgdHJlZV90eXBlID0gY3UtPnRyZWVfdHlwZTsKKyAgICBpbnQgeDAsIHkwLCB3LCBo OworICAgIGlmIChjdS0+cHJlZF9tb2RlICE9IE1PREVfSU5UUkEpIHsKKyAgICAgICAgYWRkX3Jl Y29uc3RydWN0ZWRfYXJlYShsYywgdGFyZ2V0X2NoX3R5cGUsIHR1LT54MCwgdHUtPnkwLCB0dS0+ d2lkdGgsIHR1LT5oZWlnaHQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghdGFy Z2V0X2NoX3R5cGUgJiYgdHJlZV90eXBlICE9IERVQUxfVFJFRV9DSFJPTUEpIHsKKyAgICAgICAg aWYgKGdldF9sdW1hX3ByZWRpY3RfdW5pdChjdSwgdHUsIGlkeCwgJngwLCAmeTAsICZ3LCAmaCkp IHsKKyAgICAgICAgICAgIGZmX3Z2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShsYywgeDAsIHkw LCB3LCBoKTsKKyAgICAgICAgICAgIGZjLT52dmNkc3AuaW50cmEuaW50cmFfcHJlZChsYywgeDAs IHkwLCB3LCBoLCAwKTsKKyAgICAgICAgICAgIGFkZF9yZWNvbnN0cnVjdGVkX2FyZWEobGMsIDAs IHgwLCB5MCwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRhcmdldF9jaF90eXBl ICYmIHRyZWVfdHlwZSAhPSBEVUFMX1RSRUVfTFVNQSkgeworICAgICAgICBpZiAoZ2V0X2Nocm9t YV9wcmVkaWN0X3VuaXQoY3UsIHR1LCBpZHgsICZ4MCwgJnkwLCAmdywgJmgpKXsKKyAgICAgICAg ICAgIGZmX3Z2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShsYywgeDAsIHkwLCB3LCBoKTsKKyAg ICAgICAgICAgIGlmIChpc19jY2xtKGN1LT5pbnRyYV9wcmVkX21vZGVfYykpIHsKKyAgICAgICAg ICAgICAgICBmYy0+dnZjZHNwLmludHJhLmludHJhX2NjbG1fcHJlZChsYywgeDAsIHkwLCB3LCBo KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmMtPnZ2Y2RzcC5pbnRy YS5pbnRyYV9wcmVkKGxjLCB4MCwgeTAsIHcsIGgsIDEpOworICAgICAgICAgICAgICAgIGZjLT52 dmNkc3AuaW50cmEuaW50cmFfcHJlZChsYywgeDAsIHkwLCB3LCBoLCAyKTsKKyAgICAgICAgICAg IH0KKyAgICAgICAgICAgIGFkZF9yZWNvbnN0cnVjdGVkX2FyZWEobGMsIDEsIHgwLCB5MCwgdywg aCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNjYWxlX2NsaXAoaW50ICpj b2VmZiwgY29uc3QgaW50IG56dywgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLAorICAgIGNvbnN0 IGludCBzaGlmdCwgY29uc3QgaW50IGxvZzJfdHJhbnNmb3JtX3JhbmdlKQoreworICAgIGNvbnN0 IGludCBhZGQgPSAxIDw8IChzaGlmdCAtIDEpOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsg eSsrKSB7CisgICAgICAgIGludCAqcCA9IGNvZWZmICsgeSAqIHc7CisgICAgICAgIGZvciAoaW50 IHggPSAwOyB4IDwgbnp3OyB4KyspIHsKKyAgICAgICAgICAgICpwID0gYXZfY2xpcF9pbnRwMigo KnAgKyBhZGQpID4+IHNoaWZ0LCBsb2cyX3RyYW5zZm9ybV9yYW5nZSk7CisgICAgICAgICAgICBw Kys7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHAsIDAsIHNpemVvZigqcCkgKiAodyAtIG56 dykpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2NhbGUoaW50ICpvdXQsIGNvbnN0IGludCAq aW4sIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgaW50IHNoaWZ0KQoreworICAgIGNv bnN0IGludCBhZGQgPSAxIDw8IChzaGlmdCAtIDEpOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwg aDsgeSsrKSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAg ICAgICBpbnQgKm8gPSBvdXQgKyB5ICogdyArIHg7CisgICAgICAgICAgICBjb25zdCBpbnQgKmkg PSBpbiArIHkgKiB3ICsgeDsKKyAgICAgICAgICAgICpvID0gKCppICsgYWRkKSA+PiBzaGlmdDsK KyAgICAgICAgfQorICAgIH0KK30KKworLy8gcGFydCBvZiA4LjcuMyBTY2FsaW5nIHByb2Nlc3Mg Zm9yIHRyYW5zZm9ybSBjb2VmZmljaWVudHMKK3N0YXRpYyB2b2lkIGRlcml2ZV9xcChjb25zdCBW VkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBUcmFuc2Zvcm1Vbml0ICp0dSwgVHJhbnNmb3JtQmxv Y2sgKnRiKQoreworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgICAgICAgICAgICAgPSBsYy0+ZmMt PnBzLnNwczsKKyAgICBjb25zdCBIMjY2UmF3U2xpY2VIZWFkZXIgKnJzaCAgID0gbGMtPnNjLT5z aC5yOworICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ICAgICAgICAgICAgPSBsYy0+Y3U7CisgICAg aW50IHFwLCBxcF9hY3Rfb2Zmc2V0OworCisgICAgaWYgKHRiLT5jX2lkeCA9PSAwKSB7CisgICAg ICAgIC8vZml4IG1lCisgICAgICAgIHFwID0gY3UtPnFwW0xVTUFdICsgc3BzLT5xcF9iZF9vZmZz ZXQ7CisgICAgICAgIHFwX2FjdF9vZmZzZXQgPSBjdS0+YWN0X2VuYWJsZWRfZmxhZyA/IC01IDog MDsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgaXNfamNiY3IgPSB0dS0+am9pbnRf Y2Jjcl9yZXNpZHVhbF9mbGFnICYmIHR1LT5jb2RlZF9mbGFnW0NCXSAmJiB0dS0+Y29kZWRfZmxh Z1tDUl07CisgICAgICAgIGNvbnN0IGludCBpZHggPSBpc19qY2JjciA/IEpDQkNSIDogdGItPmNf aWR4OworICAgICAgICBxcCA9IGN1LT5xcFtpZHhdOworICAgICAgICBxcF9hY3Rfb2Zmc2V0ID0g Y3UtPmFjdF9lbmFibGVkX2ZsYWcgPyAxIDogMDsKKyAgICB9CisgICAgaWYgKHRiLT50cykgewor ICAgICAgICBjb25zdCBpbnQgcXBfcHJpbWVfdHNfbWluID0gNCArIDYgKiBzcHMtPnItPnNwc19t aW5fcXBfcHJpbWVfdHM7CisKKyAgICAgICAgdGItPnFwID0gYXZfY2xpcChxcCArIHFwX2FjdF9v ZmZzZXQsIHFwX3ByaW1lX3RzX21pbiwgNjMgKyBzcHMtPnFwX2JkX29mZnNldCk7CisgICAgICAg IHRiLT5yZWN0X25vbl90c19mbGFnID0gMDsKKyAgICAgICAgdGItPmJkX3NoaWZ0ID0gMTA7Cisg ICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IGxvZ19zdW0gPSB0Yi0+bG9nMl90Yl93aWR0 aCArIHRiLT5sb2cyX3RiX2hlaWdodDsKKyAgICAgICAgY29uc3QgaW50IHJlY3Rfbm9uX3RzX2Zs YWcgPSBsb2dfc3VtICYgMTsKKworICAgICAgICB0Yi0+cXAgPSBhdl9jbGlwKHFwICsgcXBfYWN0 X29mZnNldCwgMCwgNjMgKyBzcHMtPnFwX2JkX29mZnNldCk7CisgICAgICAgIHRiLT5yZWN0X25v bl90c19mbGFnID0gcmVjdF9ub25fdHNfZmxhZzsKKyAgICAgICAgdGItPmJkX3NoaWZ0ID0gc3Bz LT5iaXRfZGVwdGggKyByZWN0X25vbl90c19mbGFnICsgKGxvZ19zdW0gLyAyKQorICAgICAgICAg ICAgICAgICAgICAgKyAxMCAtIHNwcy0+bG9nMl90cmFuc2Zvcm1fcmFuZ2UgKyByc2gtPnNoX2Rl cF9xdWFudF91c2VkX2ZsYWc7CisgICAgfQorICAgIHRiLT5iZF9vZmZzZXQgPSAoMSA8PCB0Yi0+ YmRfc2hpZnQpID4+IDE7Cit9CisKKy8vOC43LjMgU2NhbGluZyBwcm9jZXNzIGZvciB0cmFuc2Zv cm0gY29lZmZpY2llbnRzCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGVyaXZlX3NjYWxl KGNvbnN0IFRyYW5zZm9ybUJsb2NrICp0YiwgY29uc3QgaW50IHNoX2RlcF9xdWFudF91c2VkX2Zs YWcpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmVtNls2MyArIDIgKiA2ICsgMV0gPSB7 CisgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMs IDQsIDUsIDAsIDEsIDIsCisgICAgICAgIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEs IDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsCisgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUs IDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsCisgICAgICAg IDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMKKyAgICB9OworCisgICAgc3RhdGlj IGNvbnN0IHVpbnQ4X3QgZGl2Nls2MyArIDIgKiA2ICsgMV0gPSB7CisgICAgICAgIDAsIDAsIDAs IDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDMsICAzLCAgMywK KyAgICAgICAgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNiwg NiwgNiwgNiwgIDYsICA2LAorICAgICAgICA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4 LCA4LCA5LCA5LCA5LCA5LCA5LCA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAgICAgMTAsIDEwLCAx MSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMgorICAgIH07CisKKyAgICBjb25z dCBzdGF0aWMgaW50IGxldmVsX3NjYWxlWzJdWzZdID0geworICAgICAgICB7IDQwLCA0NSwgNTEs IDU3LCA2NCwgNzIgfSwKKyAgICAgICAgeyA1NywgNjQsIDcyLCA4MCwgOTAsIDEwMiB9CisgICAg fTsKKyAgICBjb25zdCBpbnQgYWRkaW4gPSBzaF9kZXBfcXVhbnRfdXNlZF9mbGFnICYmICF0Yi0+ dHM7CisgICAgY29uc3QgaW50IHFwICAgID0gdGItPnFwICsgYWRkaW47CisKKyAgICByZXR1cm4g bGV2ZWxfc2NhbGVbdGItPnJlY3Rfbm9uX3RzX2ZsYWddW3JlbTZbcXBdXSA8PCBkaXY2W3FwXTsK K30KKworLy84LjcuMyBTY2FsaW5nIHByb2Nlc3MgZm9yIHRyYW5zZm9ybSBjb2VmZmljaWVudHMK K3N0YXRpYyBjb25zdCB1aW50OF90KiBkZXJpdmVfc2NhbGVfbShjb25zdCBWVkNMb2NhbENvbnRl eHQgKmxjLCBjb25zdCBUcmFuc2Zvcm1CbG9jayAqdGIsIHVpbnQ4X3QgKnNjYWxlX20pCit7Cisg ICAgLy9UYWJsZSAzOCDigJMgU3BlY2lmaWNhdGlvbiBvZiB0aGUgc2NhbGluZyBtYXRyaXggaWRl bnRpZmllciB2YXJpYWJsZSBpZCBhY2NvcmRpbmcgdG8gcHJlZE1vZGUsIGNJZHgsIG5UYlcsIGFu ZCBuVGJICisgICAgY29uc3QgaW50IGlkc1syXVszXVs2XSA9IHsKKyAgICAgICAgeworICAgICAg ICAgICAgeyAgMCwgIDIsICA4LCAxNCwgMjAsIDI2IH0sCisgICAgICAgICAgICB7ICAwLCAgMywg IDksIDE1LCAyMSwgMjEgfSwKKyAgICAgICAgICAgIHsgIDAsICA0LCAxMCwgMTYsIDIyLCAyMiB9 CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIHsgIDAsICA1LCAxMSwgMTcsIDIz LCAyNyB9LAorICAgICAgICAgICAgeyAgMCwgIDYsIDEyLCAxOCwgMjQsIDI0IH0sCisgICAgICAg ICAgICB7ICAxLCAgNywgMTMsIDE5LCAyNSwgMjUgfSwKKyAgICAgICAgfQorICAgIH07CisgICAg Y29uc3QgVlZDRnJhbWVQYXJhbVNldHMgKnBzICAgICA9ICZsYy0+ZmMtPnBzOworICAgIGNvbnN0 IFZWQ1NQUyAqc3BzICAgICAgICAgICAgICAgPSBwcy0+c3BzOworICAgIGNvbnN0IEgyNjZSYXdT bGljZUhlYWRlciAqcnNoICAgPSBsYy0+c2MtPnNoLnI7CisgICAgY29uc3QgQ29kaW5nVW5pdCAq Y3UgICAgICAgICAgICA9IGxjLT5jdTsKKyAgICBjb25zdCBWVkNTY2FsaW5nTGlzdCAqc2wgICAg ICAgID0gcHMtPnNsOworICAgIGNvbnN0IGludCBpZCA9IGlkc1tjdS0+cHJlZF9tb2RlICE9IE1P REVfSU5UUkFdW3RiLT5jX2lkeF1bRkZNQVgodGItPmxvZzJfdGJfaGVpZ2h0LCB0Yi0+bG9nMl90 Yl93aWR0aCkgLSAxXTsKKyAgICBjb25zdCBpbnQgbG9nMl9tYXRyaXhfc2l6ZSA9IChpZCA8IDIp ID8gMSA6IChpZCA8IDgpID8gMiA6IDM7CisgICAgdWludDhfdCAqcCA9IHNjYWxlX207CisKKyAg ICBhdl9hc3NlcnQwKCFzcHMtPnItPnNwc19zY2FsaW5nX21hdHJpeF9mb3JfYWx0ZXJuYXRpdmVf Y29sb3VyX3NwYWNlX2Rpc2FibGVkX2ZsYWcpOworCisgICAgaWYgKCFyc2gtPnNoX2V4cGxpY2l0 X3NjYWxpbmdfbGlzdF91c2VkX2ZsYWcgfHwgdGItPnRzIHx8CisgICAgICAgIHNwcy0+ci0+c3Bz X3NjYWxpbmdfbWF0cml4X2Zvcl9sZm5zdF9kaXNhYmxlZF9mbGFnICYmIGN1LT5hcHBseV9sZm5z dF9mbGFnW3RiLT5jX2lkeF0pCisgICAgICAgIHJldHVybiBmZl92dmNfZGVmYXVsdF9zY2FsZV9t OworCisgICAgaWYgKCFzbCkgeworICAgICAgICBhdl9sb2cobGMtPmZjLT5hdmN0eCwgQVZfTE9H X1dBUk5JTkcsICJidWc6IG5vIHNjYWxpbmcgbGlzdCBhcHMsIGlkID0gJWQiLCBwcy0+cGguci0+ cGhfc2NhbGluZ19saXN0X2Fwc19pZCk7CisgICAgICAgIHJldHVybiBmZl92dmNfZGVmYXVsdF9z Y2FsZV9tOworICAgIH0KKworICAgIGZvciAoaW50IHkgPSB0Yi0+bWluX3NjYW5feTsgeSA8PSB0 Yi0+bWF4X3NjYW5feTsgeSsrKSB7CisgICAgICAgIGNvbnN0IGludCBvZmYgPSB5IDw8IGxvZzJf bWF0cml4X3NpemUgPj4gdGItPmxvZzJfdGJfaGVpZ2h0IDw8IGxvZzJfbWF0cml4X3NpemU7Cisg ICAgICAgIGNvbnN0IHVpbnQ4X3QgKm0gPSAmc2wtPnNjYWxpbmdfbWF0cml4X3JlY1tpZF1bb2Zm XTsKKworICAgICAgICBmb3IgKGludCB4ID0gdGItPm1pbl9zY2FuX3g7IHggPD0gdGItPm1heF9z Y2FuX3g7IHgrKykKKyAgICAgICAgICAgICpwKysgPSBtW3ggPDwgbG9nMl9tYXRyaXhfc2l6ZSA+ PiB0Yi0+bG9nMl90Yl93aWR0aF07CisgICAgfQorICAgIGlmIChpZCA+PSBTTF9TVEFSVF8xNngx NiAmJiAhdGItPm1pbl9zY2FuX3ggJiYgIXRiLT5taW5fc2Nhbl95KQorICAgICAgICAqc2NhbGVf bSA9IHNsLT5zY2FsaW5nX21hdHJpeF9kY19yZWNbaWQgLSBTTF9TVEFSVF8xNngxNl07CisKKyAg ICByZXR1cm4gc2NhbGVfbTsKK30KKworLy84LjcuMyBTY2FsaW5nIHByb2Nlc3MgZm9yIHRyYW5z Zm9ybSBjb2VmZmljaWVudHMKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBzY2FsZV9jb2Vm Zihjb25zdCBUcmFuc2Zvcm1CbG9jayAqdGIsIGludCBjb2VmZiwKKyAgICBjb25zdCBpbnQgc2Nh bGUsIGNvbnN0IGludCBzY2FsZV9tLCBjb25zdCBpbnQgbG9nMl90cmFuc2Zvcm1fcmFuZ2UpCit7 CisgICAgY29lZmYgPSAoY29lZmYgKiBzY2FsZSAqIHNjYWxlX20gKyB0Yi0+YmRfb2Zmc2V0KSA+ PiB0Yi0+YmRfc2hpZnQ7CisgICAgY29lZmYgPSBhdl9jbGlwX2ludHAyKGNvZWZmLCBsb2cyX3Ry YW5zZm9ybV9yYW5nZSk7CisgICAgcmV0dXJuIGNvZWZmOworfQorCitzdGF0aWMgdm9pZCBkZXF1 YW50KGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IFRyYW5zZm9ybVVuaXQgKnR1LCBU cmFuc2Zvcm1CbG9jayAqdGIpCit7CisgICAgdWludDhfdCB0bXBbTUFYX1RCX1NJWkUgKiBNQVhf VEJfU0laRV07CisgICAgY29uc3QgSDI2NlJhd1NsaWNlSGVhZGVyICpyc2ggICA9IGxjLT5zYy0+ c2gucjsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgICAgICAgICAgICAgID0gbGMtPmZjLT5wcy5z cHM7CisgICAgY29uc3QgdWludDhfdCAqc2NhbGVfbSAgICAgICAgICA9IGRlcml2ZV9zY2FsZV9t KGxjLCB0YiwgdG1wKTsKKyAgICBpbnQgc2NhbGU7CisKKyAgICBkZXJpdmVfcXAobGMsIHR1LCB0 Yik7CisgICAgc2NhbGUgPSBkZXJpdmVfc2NhbGUodGIsIHJzaC0+c2hfZGVwX3F1YW50X3VzZWRf ZmxhZyk7CisKKyAgICBmb3IgKGludCB5ID0gdGItPm1pbl9zY2FuX3k7IHkgPD0gdGItPm1heF9z Y2FuX3k7IHkrKykgeworICAgICAgICBmb3IgKGludCB4ID0gdGItPm1pbl9zY2FuX3g7IHggPD0g dGItPm1heF9zY2FuX3g7IHgrKykgeworICAgICAgICAgICAgaW50ICpjb2VmZiA9IHRiLT5jb2Vm ZnMgKyB5ICogdGItPnRiX3dpZHRoICsgeDsKKworICAgICAgICAgICAgaWYgKCpjb2VmZikKKyAg ICAgICAgICAgICAgICAqY29lZmYgPSBzY2FsZV9jb2VmZih0YiwgKmNvZWZmLCBzY2FsZSwgKnNj YWxlX20sIHNwcy0+bG9nMl90cmFuc2Zvcm1fcmFuZ2UpOworICAgICAgICAgICAgc2NhbGVfbSsr OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpdHhfMmQoY29uc3QgVlZDRnJh bWVDb250ZXh0ICpmYywgVHJhbnNmb3JtQmxvY2sgKnRiLCBjb25zdCBlbnVtIFR4VHlwZSB0cmgs IGNvbnN0IGVudW0gVHhUeXBlIHRydiwgaW50ICp0ZW1wKQoreworICAgIGNvbnN0IFZWQ1NQUyAq c3BzICAgPSBmYy0+cHMuc3BzOworICAgIGNvbnN0IGludCB3ICAgICAgICAgPSB0Yi0+dGJfd2lk dGg7CisgICAgY29uc3QgaW50IGggICAgICAgICA9IHRiLT50Yl9oZWlnaHQ7CisgICAgY29uc3Qg aW50IG56dyAgICAgICA9IHRiLT5tYXhfc2Nhbl94ICsgMTsKKworICAgIGZvciAoaW50IHggPSAw OyB4IDwgbnp3OyB4KyspCisgICAgICAgIGZjLT52dmNkc3AuaXR4Lml0eFt0cnZdW3RiLT5sb2cy X3RiX2hlaWdodCAtIDFdKHRlbXAgKyB4LCB3LCB0Yi0+Y29lZmZzICsgeCwgdyk7CisgICAgc2Nh bGVfY2xpcCh0ZW1wLCBuencsIHcsIGgsIDcsIHNwcy0+bG9nMl90cmFuc2Zvcm1fcmFuZ2UpOwor CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgIGZjLT52dmNkc3AuaXR4 Lml0eFt0cmhdW3RiLT5sb2cyX3RiX3dpZHRoIC0gMV0odGItPmNvZWZmcyArIHkgKiB3LCAxLCB0 ZW1wICsgeSAqIHcsIDEpOworICAgIHNjYWxlKHRiLT5jb2VmZnMsIHRiLT5jb2VmZnMsIHcsIGgs IDUgKyBzcHMtPmxvZzJfdHJhbnNmb3JtX3JhbmdlIC0gc3BzLT5iaXRfZGVwdGgpOworfQorCitz dGF0aWMgdm9pZCBpdHhfMWQoY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYywgVHJhbnNmb3JtQmxv Y2sgKnRiLCBjb25zdCBlbnVtIFR4VHlwZSB0cmgsIGNvbnN0IGVudW0gVHhUeXBlIHRydiwgaW50 ICAqdGVtcCkKK3sKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgID0gZmMtPnBzLnNwczsKKyAgICBj b25zdCBpbnQgdyAgICAgICAgID0gdGItPnRiX3dpZHRoOworICAgIGNvbnN0IGludCBoICAgICAg ICAgPSB0Yi0+dGJfaGVpZ2h0OworCisgICAgaWYgKHcgPiAxKQorICAgICAgICBmYy0+dnZjZHNw Lml0eC5pdHhbdHJoXVt0Yi0+bG9nMl90Yl93aWR0aCAtIDFdKHRlbXAsIDEsIHRiLT5jb2VmZnMs IDEpOworICAgIGVsc2UKKyAgICAgICAgZmMtPnZ2Y2RzcC5pdHguaXR4W3Rydl1bdGItPmxvZzJf dGJfaGVpZ2h0IC0gMV0odGVtcCwgMSwgdGItPmNvZWZmcywgMSk7CisgICAgc2NhbGUodGItPmNv ZWZmcywgdGVtcCwgdywgaCwgNiArIHNwcy0+bG9nMl90cmFuc2Zvcm1fcmFuZ2UgLSBzcHMtPmJp dF9kZXB0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zZm9ybV9iZHBjbShUcmFuc2Zvcm1CbG9j ayAqdGIsIGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IENvZGluZ1VuaXQgKmN1KQor eworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgICAgICA9IGxjLT5mYy0+cHMuc3BzOworICAgIGNv bnN0IEludHJhUHJlZE1vZGUgbW9kZSA9IHRiLT5jX2lkeCA/IGN1LT5pbnRyYV9wcmVkX21vZGVf YyA6IGN1LT5pbnRyYV9wcmVkX21vZGVfeTsKKyAgICBjb25zdCBpbnQgdmVydGljYWwgICAgICAg PSBtb2RlID09IElOVFJBX1ZFUlQ7CisgICAgbGMtPmZjLT52dmNkc3AuaXR4LnRyYW5zZm9ybV9i ZHBjbSh0Yi0+Y29lZmZzLCB0Yi0+dGJfd2lkdGgsIHRiLT50Yl9oZWlnaHQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCwgc3BzLT5sb2cyX3RyYW5zZm9y bV9yYW5nZSk7CisgICAgaWYgKHZlcnRpY2FsKQorICAgICAgICB0Yi0+bWF4X3NjYW5feSA9IHRi LT50Yl9oZWlnaHQgLSAxOworICAgIGVsc2UKKyAgICAgICAgdGItPm1heF9zY2FuX3ggPSB0Yi0+ dGJfd2lkdGggLSAxOworfQorCitzdGF0aWMgdm9pZCBpdHJhbnNmb3JtKFZWQ0xvY2FsQ29udGV4 dCAqbGMsIFRyYW5zZm9ybVVuaXQgKnR1LCBjb25zdCBpbnQgdHVfaWR4LCBjb25zdCBpbnQgdGFy Z2V0X2NoX3R5cGUpCit7CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYyAgID0gbGMtPmZj OworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgICAgICAgICA9IGZjLT5wcy5zcHM7CisgICAgY29u c3QgVlZDU0ggKnNoICAgICAgICAgICAgID0gJmxjLT5zYy0+c2g7CisgICAgY29uc3QgQ29kaW5n VW5pdCAqY3UgICAgICAgID0gbGMtPmN1OworICAgIGNvbnN0IGludCBwcyAgICAgICAgICAgICAg ICA9IGZjLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50 LCB0ZW1wKVtNQVhfVEJfU0laRSAqIE1BWF9UQl9TSVpFXTsKKworICAgIGZvciAoaW50IGkgPSAw OyBpIDwgdHUtPm5iX3RiczsgaSsrKSB7CisgICAgICAgIFRyYW5zZm9ybUJsb2NrICp0YiAgPSAm dHUtPnRic1tpXTsKKyAgICAgICAgY29uc3QgaW50IGNfaWR4ICAgICA9IHRiLT5jX2lkeDsKKyAg ICAgICAgY29uc3QgaW50IGNoX3R5cGUgICA9IGNfaWR4ID4gMDsKKworICAgICAgICBpZiAoY2hf dHlwZSA9PSB0YXJnZXRfY2hfdHlwZSAmJiB0Yi0+aGFzX2NvZWZmcykgeworICAgICAgICAgICAg Y29uc3QgaW50IHcgICAgICAgICAgICAgPSB0Yi0+dGJfd2lkdGg7CisgICAgICAgICAgICBjb25z dCBpbnQgaCAgICAgICAgICAgICA9IHRiLT50Yl9oZWlnaHQ7CisgICAgICAgICAgICBjb25zdCBp bnQgY2hyb21hX3NjYWxlICA9IGNoX3R5cGUgJiYgc2gtPnItPnNoX2xtY3NfdXNlZF9mbGFnICYm IGZjLT5wcy5waC5yLT5waF9jaHJvbWFfcmVzaWR1YWxfc2NhbGVfZmxhZyAmJiAodyAqIGggPiA0 KTsKKyAgICAgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgID0gZmMtPmZyYW1lLT5saW5l c2l6ZVtjX2lkeF07CisgICAgICAgICAgICBjb25zdCBpbnQgaHMgICAgICAgICAgICA9IHNwcy0+ aHNoaWZ0W2NfaWR4XTsKKyAgICAgICAgICAgIGNvbnN0IGludCB2cyAgICAgICAgICAgID0gc3Bz LT52c2hpZnRbY19pZHhdOworICAgICAgICAgICAgdWludDhfdCAqZHN0ICAgICAgICAgICAgPSAm ZmMtPmZyYW1lLT5kYXRhW2NfaWR4XVsodGItPnkwID4+IHZzKSAqIHN0cmlkZSArICgodGItPngw ID4+IGhzKSA8PCBwcyldOworCisgICAgICAgICAgICBpZiAoY3UtPmJkcGNtX2ZsYWdbdGItPmNf aWR4XSkKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fYmRwY20odGIsIGxjLCBjdSk7CisgICAg ICAgICAgICBkZXF1YW50KGxjLCB0dSwgdGIpOworICAgICAgICAgICAgaWYgKCF0Yi0+dHMpIHsK KyAgICAgICAgICAgICAgICBlbnVtIFR4VHlwZSB0cmgsIHRydjsKKworICAgICAgICAgICAgICAg IGlmIChjdS0+YXBwbHlfbGZuc3RfZmxhZ1tjX2lkeF0pCisgICAgICAgICAgICAgICAgICAgIGls Zm5zdF90cmFuc2Zvcm0obGMsIHRiKTsKKyAgICAgICAgICAgICAgICBkZXJpdmVfdHJhbnNmb3Jt X3R5cGUoZmMsIGxjLCB0YiwgJnRyaCwgJnRydik7CisgICAgICAgICAgICAgICAgaWYgKHcgPiAx ICYmIGggPiAxKQorICAgICAgICAgICAgICAgICAgICBpdHhfMmQoZmMsIHRiLCB0cmgsIHRydiwg dGVtcCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpdHhfMWQo ZmMsIHRiLCB0cmgsIHRydiwgdGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm IChjaHJvbWFfc2NhbGUpCisgICAgICAgICAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5sbWNzX3Nj YWxlX2Nocm9tYShsYywgdGVtcCwgdGItPmNvZWZmcywgdywgaCwgY3UtPngwLCBjdS0+eTApOwor ICAgICAgICAgICAgZmMtPnZ2Y2RzcC5pdHguYWRkX3Jlc2lkdWFsKGRzdCwgY2hyb21hX3NjYWxl ID8gdGVtcCA6IHRiLT5jb2VmZnMsIHcsIGgsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIGlmICh0 dS0+am9pbnRfY2Jjcl9yZXNpZHVhbF9mbGFnICYmIHRiLT5jX2lkeCkKKyAgICAgICAgICAgICAg ICBhZGRfcmVzaWR1YWxfZm9yX2pvaW50X2NvZGluZ19jaHJvbWEobGMsIHR1LCB0YiwgY2hyb21h X3NjYWxlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCByZWNvbnN0cnVjdChW VkNMb2NhbENvbnRleHQgKmxjKQoreworICAgIFZWQ0ZyYW1lQ29udGV4dCAqZmMgPSBsYy0+ZmM7 CisgICAgQ29kaW5nVW5pdCAqY3UgICAgICA9IGxjLT5jdTsKKyAgICBjb25zdCBpbnQgc3RhcnQg ICAgID0gY3UtPnRyZWVfdHlwZSA9PSBEVUFMX1RSRUVfQ0hST01BOworICAgIGNvbnN0IGludCBl bmQgICAgICAgPSBmYy0+cHMuc3BzLT5yLT5zcHNfY2hyb21hX2Zvcm1hdF9pZGMgJiYgKGN1LT50 cmVlX3R5cGUgIT0gRFVBTF9UUkVFX0xVTUEpOworCisgICAgZm9yIChpbnQgY2hfdHlwZSA9IHN0 YXJ0OyBjaF90eXBlIDw9IGVuZDsgY2hfdHlwZSsrKSB7CisgICAgICAgIFRyYW5zZm9ybVVuaXQg KnR1ID0gY3UtPnR1cy5oZWFkOworICAgICAgICBmb3IgKGludCBpID0gMDsgdHU7IGkrKykgewor ICAgICAgICAgICAgcHJlZGljdF9pbnRyYShsYywgdHUsIGksIGNoX3R5cGUpOworICAgICAgICAg ICAgaXRyYW5zZm9ybShsYywgdHUsIGksIGNoX3R5cGUpOworICAgICAgICAgICAgdHUgPSB0dS0+ bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3Z2Y19y ZWNvbnN0cnVjdChWVkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBpbnQgcnMsIGNvbnN0IGludCBy eCwgY29uc3QgaW50IHJ5KQoreworICAgIGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMgICA9IGxj LT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNwcyAgICAgICAgICAgPSBmYy0+cHMuc3BzOworICAg IGNvbnN0IGludCB4X2N0YiAgICAgICAgICAgICA9IHJ4IDw8IHNwcy0+Y3RiX2xvZzJfc2l6ZV95 OworICAgIGNvbnN0IGludCB5X2N0YiAgICAgICAgICAgICA9IHJ5IDw8IHNwcy0+Y3RiX2xvZzJf c2l6ZV95OworICAgIENUVSAqY3R1ICAgICAgICAgICAgICAgICAgICA9IGZjLT50YWIuY3R1cyAr IHJzOworICAgIENvZGluZ1VuaXQgKmN1ICAgICAgICAgICAgICA9IGN0dS0+Y3VzOworICAgIGlu dCByZXQgICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICBsYy0+bnVtX3Jhc1swXSA9IGxj LT5udW1fcmFzWzFdID0gMDsKKyAgICBsYy0+bG1jcy54X3ZwZHUgPSAtMTsKKyAgICBsYy0+bG1j cy55X3ZwZHUgPSAtMTsKKyAgICBmZl92dmNfZGVjb2RlX25laWdoYm91cihsYywgeF9jdGIsIHlf Y3RiLCByeCwgcnksIHJzKTsKKyAgICB3aGlsZSAoY3UpIHsKKyAgICAgICAgbGMtPmN1ID0gY3U7 CisKKyAgICAgICAgaWYgKGN1LT5jaWlwX2ZsYWcpCisgICAgICAgICAgICBmZl92dmNfcHJlZGlj dF9jaWlwKGxjKTsKKyAgICAgICAgaWYgKGN1LT5jb2RlZF9mbGFnKSB7CisgICAgICAgICAgICBy ZXQgPSByZWNvbnN0cnVjdChsYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRf cmVjb25zdHJ1Y3RlZF9hcmVhKGxjLCBMVU1BLCBjdS0+eDAsIGN1LT55MCwgY3UtPmNiX3dpZHRo LCBjdS0+Y2JfaGVpZ2h0KTsKKyAgICAgICAgICAgIGFkZF9yZWNvbnN0cnVjdGVkX2FyZWEobGMs IENIUk9NQSwgY3UtPngwLCBjdS0+eTAsIGN1LT5jYl93aWR0aCwgY3UtPmNiX2hlaWdodCk7Cisg ICAgICAgIH0KKyAgICAgICAgY3UgPSBjdS0+bmV4dDsKKyAgICB9CisgICAgZmZfdnZjX2N0dV9m cmVlX2N1cyhjdHUpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl92dmNfZ2V0X21pcF9z aXplX2lkKGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCkKK3sKKyAgICBpZiAodyA9PSA0ICYmIGgg PT0gNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCh3ID09IDQgfHwgaCA9PSA0KSB8fCAo dyA9PSA4ICYmIGggPT0gOCkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAyOworfQor CitpbnQgZmZfdnZjX25zY2FsZV9kZXJpdmUoY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25z dCBpbnQgbW9kZSkKK3sKKyAgICBpbnQgc2lkZV9zaXplLCBuc2NhbGU7CisgICAgYXZfYXNzZXJ0 MChtb2RlIDwgSU5UUkFfTFRfQ0NMTSAmJiAhKG1vZGUgPiBJTlRSQV9IT1JaICYmIG1vZGUgPCBJ TlRSQV9WRVJUKSk7CisgICAgaWYgKG1vZGUgPT0gSU5UUkFfUExBTkFSIHx8IG1vZGUgPT0gSU5U UkFfREMgfHwKKyAgICAgICAgbW9kZSA9PSBJTlRSQV9IT1JaIHx8IG1vZGUgPT0gSU5UUkFfVkVS VCkgeworICAgICAgICBuc2NhbGUgPSAoYXZfbG9nMih3KSArIGF2X2xvZzIoaCkgLSAyKSA+PiAy OworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBpbnRyYV9wcmVkX2FuZ2xlID0gZmZf dnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKG1vZGUpOworICAgICAgICBjb25zdCBpbnQgaW52 X2FuZ2xlICAgICAgICA9IGZmX3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGludHJhX3ByZWRf YW5nbGUpOworICAgICAgICBpZiAobW9kZSA+PSBJTlRSQV9WRVJUKQorICAgICAgICAgICAgc2lk ZV9zaXplID0gaDsKKyAgICAgICAgaWYgKG1vZGUgPD0gSU5UUkFfSE9SWikKKyAgICAgICAgICAg IHNpZGVfc2l6ZSA9IHc7CisgICAgICAgIG5zY2FsZSA9IEZGTUlOKDIsIGF2X2xvZzIoc2lkZV9z aXplKSAtIGF2X2xvZzIoMyAqIGludl9hbmdsZSAtIDIpICsgOCk7CisgICAgfQorICAgIHJldHVy biBuc2NhbGU7Cit9CisKK2ludCBmZl92dmNfbmVlZF9wZHBjKGNvbnN0IGludCB3LCBjb25zdCBp bnQgaCwgY29uc3QgdWludDhfdCBiZHBjbV9mbGFnLCBjb25zdCBpbnQgbW9kZSwgY29uc3QgaW50 IHJlZl9pZHgpCit7CisgICAgYXZfYXNzZXJ0MChtb2RlIDwgSU5UUkFfTFRfQ0NMTSk7CisgICAg aWYgKCh3ID49IDQgJiYgaCA+PSA0KSAmJiAhcmVmX2lkeCAmJiAhYmRwY21fZmxhZykgeworICAg ICAgICBpbnQgbnNjYWxlOworICAgICAgICBpZiAobW9kZSA9PSBJTlRSQV9QTEFOQVIgfHwgbW9k ZSA9PSBJTlRSQV9EQyB8fAorICAgICAgICAgICAgbW9kZSA9PSBJTlRSQV9IT1JaIHx8IG1vZGUg PT0gSU5UUkFfVkVSVCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBpZiAobW9kZSA+ IElOVFJBX0hPUlogJiYgbW9kZSA8IElOVFJBX1ZFUlQpCisgICAgICAgICAgICByZXR1cm4gMDsK KyAgICAgICAgbnNjYWxlID0gZmZfdnZjX25zY2FsZV9kZXJpdmUodywgaCwgbW9kZSk7CisgICAg ICAgIHJldHVybiBuc2NhbGUgPj0gMDsKKworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3Rh dGljIGNvbnN0IFJlY29uc3RydWN0ZWRBcmVhKiBnZXRfcmVjb25zdHJ1Y3RlZF9hcmVhKGNvbnN0 IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0IGludCB4LCBjb25zdCBpbnQgeSwgY29uc3QgaW50 IGNfaWR4KQoreworICAgIGNvbnN0IGludCBjaF90eXBlID0gY19pZHggPiAwOworICAgIGZvciAo aW50IGkgPSBsYy0+bnVtX3Jhc1tjaF90eXBlXSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAg IGNvbnN0IFJlY29uc3RydWN0ZWRBcmVhKiBhID0gJmxjLT5yYXNbY2hfdHlwZV1baV07CisgICAg ICAgIGNvbnN0IGludCByID0gKGEtPnggKyBhLT53KTsKKyAgICAgICAgY29uc3QgaW50IGIgPSAo YS0+eSArIGEtPmgpOworICAgICAgICBpZiAoYS0+eCA8PSB4ICYmIHggPCByICYmIGEtPnkgPD0g eSAmJiB5IDwgYikKKyAgICAgICAgICAgIHJldHVybiBhOworCisgICAgICAgIC8vaXQncyB0b28g ZmFyIGF3YXksIG5vIG5lZWQgY2hlY2sgaXQ7CisgICAgICAgIGlmICh4ID49IHIgJiYgeSA+PSBi KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitpbnQg ZmZfdnZjX2dldF90b3BfYXZhaWxhYmxlKGNvbnN0IFZWQ0xvY2FsQ29udGV4dCAqbGMsIGNvbnN0 IGludCB4LCBjb25zdCBpbnQgeSwgaW50IHRhcmdldF9zaXplLCBjb25zdCBpbnQgY19pZHgpCit7 CisgICAgY29uc3QgVlZDRnJhbWVDb250ZXh0ICpmYyA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNT UFMgKnNwcyA9IGZjLT5wcy5zcHM7CisgICAgY29uc3QgaW50IGhzID0gc3BzLT5oc2hpZnRbY19p ZHhdOworICAgIGNvbnN0IGludCB2cyA9IHNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICBjb25zdCBp bnQgbG9nMl9jdGJfc2l6ZV92ICAgPSBzcHMtPmN0Yl9sb2cyX3NpemVfeSAtIHZzOworICAgIGNv bnN0IGludCBlbmRfb2ZfY3RiX3ggICAgICA9ICgobGMtPmN1LT54MCA+PiBzcHMtPmN0Yl9sb2cy X3NpemVfeSkgKyAxKSA8PCBzcHMtPmN0Yl9sb2cyX3NpemVfeTsKKyAgICBjb25zdCBpbnQgeTBi ICAgICAgICAgICAgICAgPSBhdl9tb2RfdWludHAyKHksIGxvZzJfY3RiX3NpemVfdik7CisgICAg Y29uc3QgaW50IG1heF94ICAgICAgICAgICAgID0gRkZNSU4oZmMtPnBzLnBwcy0+d2lkdGgsIGVu ZF9vZl9jdGJfeCkgPj4gaHM7CisgICAgY29uc3QgUmVjb25zdHJ1Y3RlZEFyZWEgKmE7CisgICAg aW50IHB4ID0geDsKKworICAgIGlmICgheTBiKSB7CisgICAgICAgIGlmICghbGMtPmN0Yl91cF9m bGFnKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHRhcmdldF9zaXplID0gRkZNSU4o dGFyZ2V0X3NpemUsIChsYy0+ZW5kX29mX3RpbGVzX3ggPj4gaHMpIC0geCk7CisgICAgICAgIGlm IChzcHMtPnItPnNwc19lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykKKyAgICAgICAg ICAgIHRhcmdldF9zaXplID0gRkZNSU4odGFyZ2V0X3NpemUsIChlbmRfb2ZfY3RiX3ggPj4gaHMp IC0geCk7CisgICAgICAgIHJldHVybiB0YXJnZXRfc2l6ZTsKKyAgICB9CisKKyAgICB0YXJnZXRf c2l6ZSA9IEZGTUFYKDAsIEZGTUlOKHRhcmdldF9zaXplLCBtYXhfeCAtIHgpKTsKKyAgICB3aGls ZSAodGFyZ2V0X3NpemUgPiAwICYmIChhID0gZ2V0X3JlY29uc3RydWN0ZWRfYXJlYShsYywgcHgs IHkgLSAxLCBjX2lkeCkpKSB7CisgICAgICAgIGNvbnN0IGludCBzeiA9IEZGTUlOKHRhcmdldF9z aXplLCBhLT54ICsgYS0+dyAtIHB4KTsKKyAgICAgICAgcHggKz0gc3o7CisgICAgICAgIHRhcmdl dF9zaXplIC09IHN6OworICAgIH0KKyAgICByZXR1cm4gcHggLSB4OworfQorCitpbnQgZmZfdnZj X2dldF9sZWZ0X2F2YWlsYWJsZShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBpbnQg eCwgY29uc3QgaW50IHksIGludCB0YXJnZXRfc2l6ZSwgY29uc3QgaW50IGNfaWR4KQoreworICAg IGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMgPSBsYy0+ZmM7CisgICAgY29uc3QgVlZDU1BTICpz cHMgPSBmYy0+cHMuc3BzOworICAgIGNvbnN0IGludCBocyA9IHNwcy0+aHNoaWZ0W2NfaWR4XTsK KyAgICBjb25zdCBpbnQgdnMgPSBzcHMtPnZzaGlmdFtjX2lkeF07CisgICAgY29uc3QgaW50IGxv ZzJfY3RiX3NpemVfaCAgID0gIHNwcy0+Y3RiX2xvZzJfc2l6ZV95IC0gaHM7CisgICAgY29uc3Qg aW50IHgwYiAgICAgICAgICAgICAgID0gYXZfbW9kX3VpbnRwMih4LCBsb2cyX2N0Yl9zaXplX2gp OworICAgIGNvbnN0IGludCBlbmRfb2ZfY3RiX3kgICAgICA9ICgobGMtPmN1LT55MCA+PiBzcHMt PmN0Yl9sb2cyX3NpemVfeSkgKyAxKSA8PCBzcHMtPmN0Yl9sb2cyX3NpemVfeTsKKyAgICBjb25z dCBpbnQgbWF4X3kgICAgICAgICAgICAgPSBGRk1JTihmYy0+cHMucHBzLT5oZWlnaHQsIGVuZF9v Zl9jdGJfeSkgPj4gdnM7CisgICAgY29uc3QgUmVjb25zdHJ1Y3RlZEFyZWEgKmE7CisgICAgaW50 ICBweSA9IHk7CisKKyAgICBpZiAoIXgwYiAmJiAhbGMtPmN0Yl9sZWZ0X2ZsYWcpCisgICAgICAg IHJldHVybiAwOworCisgICAgdGFyZ2V0X3NpemUgPSBGRk1BWCgwLCBGRk1JTih0YXJnZXRfc2l6 ZSwgbWF4X3kgLSB5KSk7CisgICAgaWYgKCF4MGIpCisgICAgICAgIHJldHVybiB0YXJnZXRfc2l6 ZTsKKworICAgIHdoaWxlICh0YXJnZXRfc2l6ZSA+IDAgJiYgKGEgPSBnZXRfcmVjb25zdHJ1Y3Rl ZF9hcmVhKGxjLCB4IC0gMSwgcHksIGNfaWR4KSkpIHsKKyAgICAgICAgY29uc3QgaW50IHN6ID0g RkZNSU4odGFyZ2V0X3NpemUsIGEtPnkgKyBhLT5oIC0gcHkpOworICAgICAgICBweSArPSBzejsK KyAgICAgICAgdGFyZ2V0X3NpemUgLT0gc3o7CisgICAgfQorICAgIHJldHVybiBweSAtIHk7Cit9 CisKK3N0YXRpYyBpbnQgbGVzcyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAg IHJldHVybiAqKGNvbnN0IGludCopYSAtICooY29uc3QgaW50KiliOworfQorCitpbnQgZmZfdnZj X3JlZl9maWx0ZXJfZmxhZ19kZXJpdmUoY29uc3QgaW50IG1vZGUpCit7CisgICAgc3RhdGljIGNv bnN0IGludCBtb2Rlc1tdID0geyAtMTQsIC0xMiwgLTEwLCAtNiwgSU5UUkFfUExBTkFSLCAyLCAz NCwgNjYsIDcyLCA3NiwgNzgsIDgwfTsKKyAgICByZXR1cm4gYnNlYXJjaCgmbW9kZSwgbW9kZXMs IEZGX0FSUkFZX0VMRU1TKG1vZGVzKSwgc2l6ZW9mKGludCksIGxlc3MpICE9IE5VTEw7Cit9CisK K2ludCBmZl92dmNfaW50cmFfcHJlZF9hbmdsZV9kZXJpdmUoY29uc3QgaW50IHByZWRfbW9kZSkK K3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGFuZ2xlc1tdID0geworICAgICAgICAgIDAsICAgMSwg ICAyLCAgIDMsICAgNCwgICA2LCAgIDgsICAxMCwgIDEyLCAgMTQsICAxNiwgIDE4LCAgMjAsICAy MywgIDI2LCAyOSwKKyAgICAgICAgIDMyLCAgMzUsICAzOSwgIDQ1LCAgNTEsICA1NywgIDY0LCAg NzMsICA4NiwgMTAyLCAxMjgsIDE3MSwgMjU2LCAzNDEsIDUxMgorICAgIH07CisgICAgaW50IHNp Z24gPSAxLCBpZHgsIGludHJhX3ByZWRfYW5nbGU7CisgICAgaWYgKHByZWRfbW9kZSA+IElOVFJB X0RJQUcpIHsKKyAgICAgICAgaWR4ID0gcHJlZF9tb2RlIC0gSU5UUkFfVkVSVDsKKyAgICB9IGVs c2UgaWYgKHByZWRfbW9kZSA+IDApIHsKKyAgICAgICAgaWR4ID0gSU5UUkFfSE9SWiAtIHByZWRf bW9kZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZHggPSBJTlRSQV9IT1JaIC0gMiAtIHByZWRf bW9kZTsKKyAgICB9CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgaWR4ID0gLWlkeDsKKyAg ICAgICAgc2lnbiA9IC0xOworICAgIH0KKyAgICBpbnRyYV9wcmVkX2FuZ2xlID0gc2lnbiAqIGFu Z2xlc1tpZHhdOworICAgIHJldHVybiBpbnRyYV9wcmVkX2FuZ2xlOworfQorCisjZGVmaW5lIFJP VU5EKGYpIChpbnQpKGYgPCAwID8gLSgtZiArIDAuNSkgOiAoZiArIDAuNSkpCitpbnQgZmZfdnZj X2ludHJhX2ludl9hbmdsZV9kZXJpdmUoY29uc3QgaW50IGludHJhX3ByZWRfYW5nbGUpCit7Cisg ICAgZmxvYXQgaW52X2FuZ2xlOworICAgIGF2X2Fzc2VydDAoaW50cmFfcHJlZF9hbmdsZSk7Cisg ICAgaW52X2FuZ2xlID0gMzIgKiA1MTIuMCAvIGludHJhX3ByZWRfYW5nbGU7CisgICAgcmV0dXJu IFJPVU5EKGludl9hbmdsZSk7Cit9CisKKy8vOC40LjUuMi43IFdpZGUgYW5nbGUgaW50cmEgcHJl ZGljdGlvbiBtb2RlIG1hcHBpbmcgcHJvY2VzCitpbnQgZmZfdnZjX3dpZGVfYW5nbGVfbW9kZV9t YXBwaW5nKGNvbnN0IENvZGluZ1VuaXQgKmN1LAorICAgIGNvbnN0IGludCB0Yl93aWR0aCwgY29u c3QgaW50IHRiX2hlaWdodCwgY29uc3QgaW50IGNfaWR4LCBpbnQgcHJlZF9tb2RlX2ludHJhKQor eworICAgIGludCBudywgbmgsIHdoX3JhdGlvLCBtaW4sIG1heDsKKworICAgIGlmIChjdS0+aXNw X3NwbGl0X3R5cGUgPT0gSVNQX05PX1NQTElUIHx8IGNfaWR4KSB7CisgICAgICAgIG53ID0gdGJf d2lkdGg7CisgICAgICAgIG5oID0gdGJfaGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIG53 ID0gY3UtPmNiX3dpZHRoOworICAgICAgICBuaCA9IGN1LT5jYl9oZWlnaHQ7CisgICAgfQorICAg IHdoX3JhdGlvICAgID0gRkZBQlMoZmZfbG9nMihudykgLSBmZl9sb2cyKG5oKSk7CisgICAgbWF4 ICAgICAgICAgPSAod2hfcmF0aW8gPiAxKSA/ICg4ICArIDIgKiB3aF9yYXRpbykgOiA4OworICAg IG1pbiAgICAgICAgID0gKHdoX3JhdGlvID4gMSkgPyAoNjAgLSAyICogd2hfcmF0aW8pIDogNjA7 CisKKyAgICBpZiAobncgPiBuaCAmJiBwcmVkX21vZGVfaW50cmEgPj0yICYmIHByZWRfbW9kZV9p bnRyYSA8IG1heCkKKyAgICAgICAgcHJlZF9tb2RlX2ludHJhICs9IDY1OworICAgIGVsc2UgaWYg KG5oID4gbncgJiYgcHJlZF9tb2RlX2ludHJhIDw9IDY2ICYmIHByZWRfbW9kZV9pbnRyYSA+IG1p bikKKyAgICAgICAgcHJlZF9tb2RlX2ludHJhIC09IDY3OworICAgIHJldHVybiBwcmVkX21vZGVf aW50cmE7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Z2Yy92dmNfaW50cmEuaCBiL2xpYmF2 Y29kZWMvdnZjL3Z2Y19pbnRyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAuLjEyZDBkYWU4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Z2Yy92dmNfaW50 cmEuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogVlZDIGludHJhIHByZWRpY3Rpb24KKyAqCisg KiBDb3B5cmlnaHQgKEMpIDIwMjEgTnVvIE1pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2Yg RkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVn IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBl ZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAx IFVTQQorICovCisjaWZuZGVmIEFWQ09ERUNfVlZDX0lOVFJBX0gKKyNkZWZpbmUgQVZDT0RFQ19W VkNfSU5UUkFfSAorCisjaW5jbHVkZSAidnZjX2N0dS5oIgorCisvKioKKyAqIHJlY29uc3RydWN0 IGEgQ1RVCisgKiBAcGFyYW0gbGMgbG9jYWwgY29udGV4dCBmb3IgQ1RVCisgKiBAcGFyYW0gcnMg cmFzdGVyIG9yZGVyIGZvciB0aGUgQ1RVLgorICogQHBhcmFtIHJ4IHJhc3RlciBvcmRlciB4IGZv ciB0aGUgQ1RVLgorICogQHBhcmFtIHJ5IHJhc3RlciBvcmRlciB5IGZvciB0aGUgQ1RVLgorICog QHJldHVybiBBVkVSUk9SCisgKi8KK2ludCBmZl92dmNfcmVjb25zdHJ1Y3QoVlZDTG9jYWxDb250 ZXh0ICpsYywgY29uc3QgaW50IHJzLCBjb25zdCBpbnQgcngsIGNvbnN0IGludCByeSk7CisKKy8v dXRpbHMgZm9yIHZ2Y19pbnRyYV90ZW1wbGF0ZQoraW50IGZmX3Z2Y19nZXRfdG9wX2F2YWlsYWJs ZShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgeDAsIGludCB5MCwgaW50IHRhcmdldF9z aXplLCBpbnQgY19pZHgpOworaW50IGZmX3Z2Y19nZXRfbGVmdF9hdmFpbGFibGUoY29uc3QgVlZD TG9jYWxDb250ZXh0ICpsYywgaW50IHgwLCBpbnQgeTAsIGludCB0YXJnZXRfc2l6ZSwgaW50IGNf aWR4KTsKK2ludCBmZl92dmNfZ2V0X21pcF9zaXplX2lkKGludCB3LCBpbnQgaCk7CitpbnQgZmZf dnZjX25lZWRfcGRwYyhpbnQgdywgaW50IGgsIHVpbnQ4X3QgYmRwY21fZmxhZywgaW50IG1vZGUs IGludCByZWZfaWR4KTsKK2ludCBmZl92dmNfbnNjYWxlX2Rlcml2ZShpbnQgdywgaW50IGgsIGlu dCBtb2RlKTsKK2ludCBmZl92dmNfcmVmX2ZpbHRlcl9mbGFnX2Rlcml2ZShpbnQgbW9kZSk7Citp bnQgZmZfdnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKGludCBwcmVkX21vZGUpOworaW50IGZm X3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGludCBwcmVkX21vZGUpOworaW50IGZmX3Z2Y193 aWRlX2FuZ2xlX21vZGVfbWFwcGluZyhjb25zdCBDb2RpbmdVbml0ICpjdSwKKyAgICBpbnQgdGJf d2lkdGgsIGludCB0Yl9oZWlnaHQsIGludCBjX2lkeCwgaW50IHByZWRfbW9kZV9pbnRyYSk7CisK KyNlbmRpZiAvLyBBVkNPREVDX1ZWQ19JTlRSQV9ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Z2 Yy92dmNfaW50cmFfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvdnZjL3Z2Y19pbnRyYV90ZW1wbGF0 ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjlmYjQ3NTQ5ZDUKLS0t IC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Z2Yy92dmNfaW50cmFfdGVtcGxhdGUuYwpAQCAt MCwwICsxLDEwMTUgQEAKKy8qCisgKiBWVkMgaW50cmEgcHJlZGljdGlvbiBEU1AKKyAqCisgKiBD b3B5cmlnaHQgKEMpIDIwMjEtMjAyMyBOdW9taQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBl ZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1w ZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMw MSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9iaXRfZGVwdGhfdGVtcGxhdGUuYyIK KworI2luY2x1ZGUgInZ2Y19pbnRyYS5oIgorCisjZGVmaW5lIFBPUyh4LCB5KSBzcmNbKHgpICsg c3RyaWRlICogKHkpXQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2NsbV9s aW5lYXJfcHJlZCkoVlZDRnJhbWVDb250ZXh0ICpmYywgY29uc3QgaW50IHgwLCBjb25zdCBpbnQg eTAsCisgICAgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBwaXhlbCogcGRzeSwgY29u c3QgaW50ICphLCBjb25zdCBpbnQgKmIsIGNvbnN0IGludCAqaykKK3sKKyAgICBjb25zdCBWVkNT UFMgKnNwcyA9IGZjLT5wcy5zcHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWVkNfTUFYX1NB TVBMRV9BUlJBWVMgLSAxOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IGNfaWR4ID0gaSArIDE7 CisgICAgICAgIGNvbnN0IGludCB4ID0geDAgPj4gc3BzLT5oc2hpZnRbY19pZHhdOworICAgICAg ICBjb25zdCBpbnQgeSA9IHkwID4+IHNwcy0+dnNoaWZ0W2NfaWR4XTsKKyAgICAgICAgY29uc3Qg cHRyZGlmZl90IHN0cmlkZSA9IGZjLT5mcmFtZS0+bGluZXNpemVbY19pZHhdIC8gc2l6ZW9mKHBp eGVsKTsKKyAgICAgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopZmMtPmZyYW1lLT5kYXRhW2NfaWR4 XSArIHggKyB5ICogc3RyaWRlOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykg eworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAg ICAgICBjb25zdCBpbnQgZHN5ID0gcGRzeVt5ICogdyArIHhdOworICAgICAgICAgICAgICAgIGNv bnN0IGludCBwcmVkID0gKChkc3kgKiBhW2ldKSA+PiBrW2ldKSArIGJbaV07CisgICAgICAgICAg ICAgICAgUE9TKHgsIHkpID0gQ0xJUChwcmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor ICAgIH0KK30KKworI2RlZmluZSBNQVhfUElDS19QT1MgNAorI2RlZmluZSBUT1AgIDAKKyNkZWZp bmUgTEVGVCAxCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhjY2xtX2dldF9w YXJhbXNfZGVmYXVsdCkoaW50ICphLCBpbnQgKmIsIGludCAqaykKK3sKKyAgICBmb3IgKGludCBp ID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBhW2ldID0ga1tpXSA9IDA7CisgICAgICAgIGJb aV0gPSAxIDw8IChCSVRfREVQVEggLSAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNf aW5saW5lIGludCBGVU5DKGNjbG1fZ2V0X3NlbGVjdF9wb3MpKGNvbnN0IFZWQ0xvY2FsQ29udGV4 dCAqbGMsCisgICAgY29uc3QgaW50IHgsIGNvbnN0IGludCB5LCBjb25zdCBpbnQgdywgY29uc3Qg aW50IGgsIGNvbnN0IGludCBhdmFpbF90LCBjb25zdCBpbnQgYXZhaWxfbCwKKyAgICBpbnQgY250 WzJdLCBpbnQgcG9zWzJdW01BWF9QSUNLX1BPU10pCit7CisgICAgY29uc3QgZW51bSBJbnRyYVBy ZWRNb2RlIG1vZGUgPSBsYy0+Y3UtPmludHJhX3ByZWRfbW9kZV9jOworICAgIGNvbnN0IGludCBu dW1faXM0ID0gIWF2YWlsX3QgfHwgIWF2YWlsX2wgfHwgbW9kZSAhPSBJTlRSQV9MVF9DQ0xNOwor ICAgIGludCBudW1fc2FtcFsyXTsKKworICAgIGlmIChtb2RlID09IElOVFJBX0xUX0NDTE0pIHsK KyAgICAgICAgbnVtX3NhbXBbVE9QXSAgPSBhdmFpbF90ID8gdyA6IDA7CisgICAgICAgIG51bV9z YW1wW0xFRlRdID0gYXZhaWxfbCA/IGggOiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bV9z YW1wW1RPUF0gPSAoYXZhaWxfdCAmJiBtb2RlID09IElOVFJBX1RfQ0NMTSkgPyBmZl92dmNfZ2V0 X3RvcF9hdmFpbGFibGUobGMsICB4LCB5LCB3ICsgRkZNSU4odywgaCksIDEpIDogMDsKKyAgICAg ICAgbnVtX3NhbXBbTEVGVF0gPSAoYXZhaWxfbCAmJiBtb2RlID09IElOVFJBX0xfQ0NMTSkgPyBm Zl92dmNfZ2V0X2xlZnRfYXZhaWxhYmxlKGxjLCB4LCB5LCBoICsgRkZNSU4odywgaCksIDEpIDog MDsKKyAgICB9CisgICAgaWYgKCFudW1fc2FtcFtUT1BdICYmICFudW1fc2FtcFtMRUZUXSkgewor ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IFRPUDsgaSA8PSBMRUZU OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHN0YXJ0ID0gbnVtX3NhbXBbaV0gPj4gKDIgKyBu dW1faXM0KTsKKyAgICAgICAgY29uc3QgaW50IHN0ZXAgID0gRkZNQVgoMSwgbnVtX3NhbXBbaV0g Pj4gKDEgKyBudW1faXM0KSkgOworICAgICAgICBjbnRbaV0gPSBGRk1JTihudW1fc2FtcFtpXSwg KDEgKyBudW1faXM0KSA8PCAxKTsKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjbnRbaV07 IGMrKykKKyAgICAgICAgICAgIHBvc1tpXVtjXSA9IHN0YXJ0ICsgYyAqIHN0ZXA7CisgICAgfQor ICAgIHJldHVybiAxOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2Ns bV9zZWxlY3RfbHVtYV80NDQpKGNvbnN0IHBpeGVsICpzcmMsIGNvbnN0IGludCBzdGVwLAorICAg IGNvbnN0IGludCBjbnQsIGNvbnN0IGludCBwb3NbTUFYX1BJQ0tfUE9TXSwgIHBpeGVsICpzZWxf bHVtYSkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudDsgaSsrKQorICAgICAgICBzZWxf bHVtYVtpXSA9IHNyY1twb3NbaV0gKiBzdGVwXTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxp bmUgdm9pZCBGVU5DKGNjbG1fc2VsZWN0X2x1bWEpKGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMs CisgICAgY29uc3QgaW50IHgwLCBjb25zdCBpbnQgeTAsIGNvbnN0IGludCBhdmFpbF90LCBjb25z dCBpbnQgYXZhaWxfbCwgY29uc3QgaW50IGNudFsyXSwgY29uc3QgaW50IHBvc1syXVtNQVhfUElD S19QT1NdLAorICAgIHBpeGVsICpzZWxfbHVtYSkKK3sKKyAgICBjb25zdCBWVkNTUFMgKnNwcyA9 IGZjLT5wcy5zcHM7CisKKyAgICBjb25zdCBpbnQgYl9jdHVfYm91bmRhcnkgPSAhYXZfbW9kX3Vp bnRwMih5MCwgc3BzLT5jdGJfbG9nMl9zaXplX3kpOworICAgIGNvbnN0IGludCBocyA9IHNwcy0+ aHNoaWZ0WzFdOworICAgIGNvbnN0IGludCB2cyA9IHNwcy0+dnNoaWZ0WzFdOworICAgIGNvbnN0 IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplWzBdIC8gc2l6ZW9mKHBpeGVs KTsKKworICAgIGlmICghaHMgJiYgIXZzKSB7CisgICAgICAgIGNvbnN0IHBpeGVsKiBzcmMgPSAo cGl4ZWwqKWZjLT5mcmFtZS0+ZGF0YVswXSArIHgwICsgeTAgKiBzdHJpZGU7CisgICAgICAgIEZV TkMoY2NsbV9zZWxlY3RfbHVtYV80NDQpKHNyYyAtIGF2YWlsX3QgKiBzdHJpZGUsIDEsIGNudFtU T1BdLCBwb3NbVE9QXSwgc2VsX2x1bWEpOworICAgICAgICBGVU5DKGNjbG1fc2VsZWN0X2x1bWFf NDQ0KShzcmMgLSBhdmFpbF9sLCBzdHJpZGUsIGNudFtMRUZUXSwgcG9zW0xFRlRdLCBzZWxfbHVt YSArIGNudFtUT1BdKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB0b3AKKyAgICAgICAgaWYg KHZzICYmICFiX2N0dV9ib3VuZGFyeSkgeworICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnNvdXJj ZSA9IChwaXhlbCAqKWZjLT5mcmFtZS0+ZGF0YVswXSArIHgwICsgKHkwIC0gMikgKiBzdHJpZGU7 CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudFtUT1BdOyBpKyspIHsKKyAgICAg ICAgICAgICAgICBjb25zdCBpbnQgeCA9IHBvc1tUT1BdW2ldIDw8IGhzOworICAgICAgICAgICAg ICAgIGNvbnN0IHBpeGVsICpzcmMgPSBzb3VyY2UgKyB4OworICAgICAgICAgICAgICAgIGNvbnN0 IGludCBoYXNfbGVmdCA9IHggfHwgYXZhaWxfbDsKKyAgICAgICAgICAgICAgICBjb25zdCBwaXhl bCBsID0gaGFzX2xlZnQgPyBQT1MoLTEsIDApIDogUE9TKDAsIDApOworICAgICAgICAgICAgICAg IGlmIChzcHMtPnItPnNwc19jaHJvbWFfdmVydGljYWxfY29sbG9jYXRlZF9mbGFnKSB7CisgICAg ICAgICAgICAgICAgICAgIHNlbF9sdW1hW2ldID0gKFBPUygwLCAtMSkgKyBsICsgNCAqIFBPUygw LCAwKSArIFBPUygxLCAwKSArIFBPUygwLCAxKSArIDQpID4+IDM7CisgICAgICAgICAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgbDEgPSBoYXNfbGVmdCA/ IFBPUygtMSwgMSkgOiBQT1MoMCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHNlbF9sdW1hW2ld ID0gKGwgKyBsMSArIDIgKiAoUE9TKDAsIDApICsgUE9TKDAsIDEpKSArIFBPUygxLCAwKSArIFBP UygxLCAxKSArIDQpID4+IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnNvdXJjZSA9IChwaXhlbCop ZmMtPmZyYW1lLT5kYXRhWzBdICsgeDAgKyAoeTAgLSAxKSAqIHN0cmlkZTsKKyAgICAgICAgICAg IGZvciAoaW50IGkgPSAwOyBpIDwgY250W1RPUF07IGkrKykgeworICAgICAgICAgICAgICAgIGNv bnN0IGludCB4ID0gcG9zW1RPUF1baV0gPDwgaHM7CisgICAgICAgICAgICAgICAgY29uc3QgcGl4 ZWwgKnNyYyA9IHNvdXJjZSArIHg7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGhhc19sZWZ0 ID0geCB8fCBhdmFpbF9sOworICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsIGwgPSBoYXNfbGVm dCA/IFBPUygtMSwgMCkgOiBQT1MoMCwgMCk7CisgICAgICAgICAgICAgICAgc2VsX2x1bWFbaV0g PSAobCArIDIgKiBQT1MoMCwgMCkgKyBQT1MoMSwgMCkgKyAyKSA+PiAyOworICAgICAgICAgICAg fQorICAgICAgICB9CisKKyAgICAgICAgLy8gbGVmdAorICAgICAgICB7CisgICAgICAgICAgICBj b25zdCBwaXhlbCAqbGVmdDsKKyAgICAgICAgICAgIGNvbnN0IHBpeGVsICpzb3VyY2UgPSAocGl4 ZWwgKilmYy0+ZnJhbWUtPmRhdGFbMF0gKyB4MCArIHkwICogc3RyaWRlIC0gKDEgKyBocykgKiBh dmFpbF9sOworICAgICAgICAgICAgbGVmdCA9IHNvdXJjZSAtIGF2YWlsX2w7CisKKyAgICAgICAg ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250W0xFRlRdOyBpKyspIHsKKyAgICAgICAgICAgICAg ICBjb25zdCBpbnQgeSA9IHBvc1tMRUZUXVtpXSA8PCB2czsKKyAgICAgICAgICAgICAgICBjb25z dCBpbnQgb2Zmc2V0ID0geSAqIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCAq bCAgID0gbGVmdCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCAqc3JjID0g c291cmNlICsgb2Zmc2V0OworICAgICAgICAgICAgICAgIHBpeGVsIHByZWQ7CisgICAgICAgICAg ICAgICAgaWYgKCF2cykgeworICAgICAgICAgICAgICAgICAgICBwcmVkID0gKCpsICsgMiAqIFBP UygwLCAwKSArIFBPUygxLCAwKSArIDIpID4+IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsK KyAgICAgICAgICAgICAgICAgICAgaWYgKHNwcy0+ci0+c3BzX2Nocm9tYV92ZXJ0aWNhbF9jb2xs b2NhdGVkX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBoYXNfdG9w ID0geSB8fCBhdmFpbF90OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgdCA9 IGhhc190b3AgPyBQT1MoMCwgLTEpIDogUE9TKDAsIDApOworICAgICAgICAgICAgICAgICAgICAg ICAgcHJlZCA9ICgqbCArIHQgKyA0ICogUE9TKDAsIDApICsgUE9TKDEsIDApICsgUE9TKDAsIDEp ICsgNCkgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg ICAgICAgICAgIHByZWQgPSAoKmwgKyAqKGwgKyBzdHJpZGUpICsgMiAqIFBPUygwLCAwKSArIDIg KiBQT1MoMCwgMSkgKyBQT1MoMSwgMCkgKyBQT1MoMSwgMSkgKyA0KSA+PiAzOworICAgICAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbF9sdW1h W2kgKyBjbnRbVE9QXV0gPSBwcmVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor fQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2NsbV9zZWxlY3RfY2hyb21h KShjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZjLAorICAgIGNvbnN0IGludCB4LCBjb25zdCBpbnQg eSwgY29uc3QgaW50IGNudFsyXSwgY29uc3QgaW50IHBvc1syXVtNQVhfUElDS19QT1NdLAorICAg IHBpeGVsIHNlbFtdW01BWF9QSUNLX1BPUyAqIDJdKQoreworICAgIGZvciAoaW50IGNfaWR4ID0g MTsgY19pZHggPCBWVkNfTUFYX1NBTVBMRV9BUlJBWVM7IGNfaWR4KyspIHsKKyAgICAgICAgY29u c3QgcHRyZGlmZl90IHN0cmlkZSA9IGZjLT5mcmFtZS0+bGluZXNpemVbY19pZHhdIC8gc2l6ZW9m KHBpeGVsKTsKKworICAgICAgICAvL3RvcAorICAgICAgICBjb25zdCBwaXhlbCAqc3JjID0gKHBp eGVsKilmYy0+ZnJhbWUtPmRhdGFbY19pZHhdICsgeCArICh5IC0gMSkqIHN0cmlkZTsKKyAgICAg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnRbVE9QXTsgaSsrKSB7CisgICAgICAgICAgICBzZWxb Y19pZHhdW2ldID0gc3JjW3Bvc1tUT1BdW2ldXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vbGVm dAorICAgICAgICBzcmMgPSAocGl4ZWwqKWZjLT5mcmFtZS0+ZGF0YVtjX2lkeF0gKyB4IC0gMSAr IHkgKiBzdHJpZGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250W0xFRlRdOyBpKysp IHsKKyAgICAgICAgICAgIHNlbFtjX2lkeF1baSArIGNudFtUT1BdXSA9IHNyY1twb3NbTEVGVF1b aV0gKiBzdHJpZGVdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lu bGluZSBpbnQgRlVOQyhjY2xtX3NlbGVjdF9zYW1wbGVzKShjb25zdCBWVkNMb2NhbENvbnRleHQg KmxjLAorICAgIGNvbnN0IGludCB4MCwgY29uc3QgaW50IHkwLCBjb25zdCBpbnQgdywgY29uc3Qg aW50IGgsIGNvbnN0IGludCBhdmFpbF90LCBjb25zdCBpbnQgYXZhaWxfbCwKKyAgICBwaXhlbCBz ZWxbXVtNQVhfUElDS19QT1MgKiAyXSkKK3sKKyAgICBjb25zdCBWVkNGcmFtZUNvbnRleHQgKmZj ID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAqc3BzICAgPSBmYy0+cHMuc3BzOworICAgIGNv bnN0IGludCB4ICA9IHgwID4+IHNwcy0+aHNoaWZ0WzFdOworICAgIGNvbnN0IGludCB5ICA9IHkw ID4+IHNwcy0+dnNoaWZ0WzFdOworICAgIGludCBjbnRbMl0sIHBvc1syXVtNQVhfUElDS19QT1Nd OworCisgICAgaWYgKCFGVU5DKGNjbG1fZ2V0X3NlbGVjdF9wb3MpKGxjLCB4LCB5LCB3LCBoLCBh dmFpbF90LCBhdmFpbF9sLCBjbnQsIHBvcykpCisgICAgICAgIHJldHVybiAwOworCisgICAgRlVO QyhjY2xtX3NlbGVjdF9sdW1hKShmYywgeDAsIHkwLCBhdmFpbF90LCBhdmFpbF9sLCBjbnQsIHBv cywgc2VsW0xVTUFdKTsKKyAgICBGVU5DKGNjbG1fc2VsZWN0X2Nocm9tYSkoZmMsIHgsIHksIGNu dCwgcG9zLCBzZWwpOworCisgICAgaWYgKGNudFtUT1BdICsgY250W0xFRlRdID09IDIpIHsKKyAg ICAgICAgZm9yIChpbnQgY19pZHggPSAwOyBjX2lkeCA8IFZWQ19NQVhfU0FNUExFX0FSUkFZUzsg Y19pZHgrKykgeworICAgICAgICAgICAgc2VsW2NfaWR4XVszXSA9IHNlbFtjX2lkeF1bMF07Cisg ICAgICAgICAgICBzZWxbY19pZHhdWzJdID0gc2VsW2NfaWR4XVsxXTsKKyAgICAgICAgICAgIHNl bFtjX2lkeF1bMF0gPSBzZWxbY19pZHhdWzFdOworICAgICAgICAgICAgc2VsW2NfaWR4XVsxXSA9 IHNlbFtjX2lkeF1bM107CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0 YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhjY2xtX2dldF9taW5fbWF4KSgKKyAgICBj b25zdCBwaXhlbCBzZWxbXVtNQVhfUElDS19QT1MgKiAyXSwgaW50ICptaW4sIGludCAqbWF4KQor eworICAgIGludCBtaW5fZ3JwX2lkeFtdID0geyAwLCAyIH07CisgICAgaW50IG1heF9ncnBfaWR4 W10gPSB7IDEsIDMgfTsKKworICAgIGlmIChzZWxbTFVNQV1bbWluX2dycF9pZHhbMF1dID4gc2Vs W0xVTUFdW21pbl9ncnBfaWR4WzFdXSkKKyAgICAgICAgRkZTV0FQKGludCwgbWluX2dycF9pZHhb MF0sIG1pbl9ncnBfaWR4WzFdKTsKKyAgICBpZiAoc2VsW0xVTUFdW21heF9ncnBfaWR4WzBdXSA+ IHNlbFtMVU1BXVttYXhfZ3JwX2lkeFsxXV0pCisgICAgICAgIEZGU1dBUChpbnQsIG1heF9ncnBf aWR4WzBdLCBtYXhfZ3JwX2lkeFsxXSk7CisgICAgaWYgKHNlbFtMVU1BXVttaW5fZ3JwX2lkeFsw XV0gPiBzZWxbTFVNQV1bbWF4X2dycF9pZHhbMV1dKSB7CisgICAgICAgIEZGU1dBUChpbnQsIG1p bl9ncnBfaWR4WzBdLCBtYXhfZ3JwX2lkeFswXSk7CisgICAgICAgIEZGU1dBUChpbnQsIG1pbl9n cnBfaWR4WzFdLCBtYXhfZ3JwX2lkeFsxXSk7CisgICAgfQorICAgIGlmIChzZWxbTFVNQV1bbWlu X2dycF9pZHhbMV1dID4gc2VsW0xVTUFdW21heF9ncnBfaWR4WzBdXSkKKyAgICAgICAgRkZTV0FQ KGludCwgbWluX2dycF9pZHhbMV0sIG1heF9ncnBfaWR4WzBdKTsKKyAgICBmb3IgKGludCBjX2lk eCA9IDA7IGNfaWR4IDwgVlZDX01BWF9TQU1QTEVfQVJSQVlTOyBjX2lkeCsrKSB7CisgICAgICAg IG1heFtjX2lkeF0gPSAoc2VsW2NfaWR4XVttYXhfZ3JwX2lkeFswXV0gKyBzZWxbY19pZHhdW21h eF9ncnBfaWR4WzFdXSArIDEpID4+IDE7CisgICAgICAgIG1pbltjX2lkeF0gPSAoc2VsW2NfaWR4 XVttaW5fZ3JwX2lkeFswXV0gKyBzZWxbY19pZHhdW21pbl9ncnBfaWR4WzFdXSArIDEpID4+IDE7 CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMoY2NsbV9nZXRf cGFyYW1zKShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLAorICAgIGNvbnN0IGludCB4MCwgY29u c3QgaW50IHkwLCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IGludCBhdmFpbF90LCBj b25zdCBpbnQgYXZhaWxfbCwKKyAgICBpbnQgKmEsIGludCAqYiwgaW50ICprKQoreworICAgIHBp eGVsIHNlbFtWVkNfTUFYX1NBTVBMRV9BUlJBWVNdW01BWF9QSUNLX1BPUyAqIDJdOworICAgIGlu dCBtYXhbVlZDX01BWF9TQU1QTEVfQVJSQVlTXSwgbWluW1ZWQ19NQVhfU0FNUExFX0FSUkFZU107 CisgICAgaW50IGRpZmY7CisKKyAgICBpZiAoIUZVTkMoY2NsbV9zZWxlY3Rfc2FtcGxlcykobGMs IHgwLCB5MCwgdywgaCwgYXZhaWxfdCwgYXZhaWxfbCwgc2VsKSkgeworICAgICAgICBGVU5DKGNj bG1fZ2V0X3BhcmFtc19kZWZhdWx0KShhLCBiLCBrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K KworICAgIEZVTkMoY2NsbV9nZXRfbWluX21heCkoc2VsLCBtaW4sIG1heCk7CisKKyAgICBkaWZm ID0gbWF4W0xVTUFdIC0gbWluW0xVTUFdOworICAgIGlmIChkaWZmID09IDApIHsKKyAgICAgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGFbaV0gPSBrW2ldID0g MDsKKyAgICAgICAgICAgIGJbaV0gPSBtaW5baSArIDFdOworICAgICAgICB9CisgICAgICAgIHJl dHVybjsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAg Y29uc3Qgc3RhdGljIGludCBkaXZfc2lnX3RhYmxlW10gPSB7MCwgNywgNiwgNSwgNSwgNCwgNCwg MywgMywgMiwgMiwgMSwgMSwgMSwgMSwgMH07CisgICAgICAgIGNvbnN0IGludCBkaWZmYyA9IG1h eFtpICsgMV0gLSBtaW5baSArIDFdOworICAgICAgICBpbnQgIHggPSBhdl9sb2cyKGRpZmYpOwor ICAgICAgICBpbnQgIHksIHYsIHNpZ24sIGFkZDsKKyAgICAgICAgY29uc3QgaW50IG5vcm1fZGlm ZiA9ICgoZGlmZiA8PCA0KSA+PiB4KSAmIDE1OworICAgICAgICB4ICs9IChub3JtX2RpZmYpID8g MSA6IDA7CisgICAgICAgIHkgPSBhYnMoZGlmZmMpID4gMCA/IGF2X2xvZzIoYWJzKGRpZmZjKSkg KyAxIDogMDsKKyAgICAgICAgdiA9IGRpdl9zaWdfdGFibGVbbm9ybV9kaWZmXSB8IDg7CisgICAg ICAgIGFkZCA9ICgxIDw8IHkgPj4gMSk7CisgICAgICAgIGFbaV0gPSAoZGlmZmMgKiB2ICsgYWRk KSA+PiB5OworICAgICAgICBrW2ldID0gRkZNQVgoMSwgMyArIHggLXkpOworICAgICAgICBzaWdu ID0gYVtpXSA8IDAgPyAtMSA6IChhW2ldID4gMCk7CisgICAgICAgIGFbaV0gPSAoKDMgKyB4IC0g eSkgPCAxKSA/ICBzaWduICogMTUgOiBhW2ldOworICAgICAgICBiW2ldID0gbWluW2kgKyAxXSAt ICgoYVtpXSAqIG1pblswXSkgPj4ga1tpXSk7CisgICAgfQorCit9CisKKyN1bmRlZiBUT1AKKyN1 bmRlZiBMRUZUCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhjY2xtX2dldF9s dW1hX3JlY19waXhlbHMpKGNvbnN0IFZWQ0ZyYW1lQ29udGV4dCAqZmMsCisgICAgY29uc3QgaW50 IHgwLCBjb25zdCBpbnQgeTAsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgaW50IGF2 YWlsX3QsIGNvbnN0IGludCBhdmFpbF9sLAorICAgIHBpeGVsICpwZHN5KQoreworICAgIGNvbnN0 IGludCBocyAgICAgICAgICAgID0gZmMtPnBzLnNwcy0+aHNoaWZ0WzFdOworICAgIGNvbnN0IGlu dCB2cyAgICAgICAgICAgID0gZmMtPnBzLnNwcy0+dnNoaWZ0WzFdOworICAgIGNvbnN0IHB0cmRp ZmZfdCBzdHJpZGUgID0gZmMtPmZyYW1lLT5saW5lc2l6ZVswXSAvIHNpemVvZihwaXhlbCk7Cisg ICAgY29uc3QgcGl4ZWwgKnNvdXJjZSAgICAgPSAocGl4ZWwqKWZjLT5mcmFtZS0+ZGF0YVswXSAr IHgwICsgeTAgKiBzdHJpZGU7CisgICAgY29uc3QgcGl4ZWwgKmxlZnQgICAgICAgPSBzb3VyY2Ug LSBhdmFpbF9sOworICAgIGNvbnN0IHBpeGVsICp0b3AgICAgICAgID0gc291cmNlIC0gYXZhaWxf dCAqIHN0cmlkZTsKKworICAgIGNvbnN0IFZWQ1NQUyAqc3BzID0gZmMtPnBzLnNwczsKKyAgICBp ZiAoIWhzICYmICF2cykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykKKyAg ICAgICAgICAgIG1lbWNweShwZHN5ICsgaSAqIHcsIHNvdXJjZSArIGkgKiBzdHJpZGUsIHcgKiBz aXplb2YocGl4ZWwpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBpID0g MDsgaSA8IGg7IGkrKykgeworICAgICAgICBjb25zdCBwaXhlbCAqc3JjICA9IHNvdXJjZTsKKyAg ICAgICAgY29uc3QgcGl4ZWwgKmwgPSBsZWZ0OworICAgICAgICBjb25zdCBwaXhlbCAqdCA9IHRv cDsKKyAgICAgICAgaWYgKCF2cykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3 OyBqKyspIHsKKyAgICAgICAgICAgICAgICBwaXhlbCBwcmVkICA9ICgqbCArIDIgKiBQT1MoMCwg MCkgKyBQT1MoMSwgMCkgKyAyKSA+PiAyOworICAgICAgICAgICAgICAgIHBkc3lbaSAqIHcgKyBq XSA9IHByZWQ7CisgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAgICAgbCA9 IHNyYyAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg IGlmIChzcHMtPnItPnNwc19jaHJvbWFfdmVydGljYWxfY29sbG9jYXRlZF9mbGFnKSAgeworICAg ICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgICAgICAg ICAgICAgIHBpeGVsIHByZWQgID0gKCpsICsgKnQgKyA0ICogUE9TKDAsIDApICsgUE9TKDEsIDAp ICsgUE9TKDAsIDEpICsgNCkgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgcGRzeVtpICogdyAr IGpdID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAg ICAgICAgIHQgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgbCA9IHNyYyAtIDE7CisgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlu dCBqID0gMDsgaiA8IHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICBwaXhlbCBwcmVkICA9 ICgqbCArICoobCArIHN0cmlkZSkgKyAyICogUE9TKDAsIDApICsgMiAqIFBPUygwLCAxKSArIFBP UygxLCAwKSArIFBPUygxLCAxKSArIDQpID4+IDM7CisKKyAgICAgICAgICAgICAgICAgICAgcGRz eVtpICogdyArIGpdID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAg ICAgICAgICAgICAgICAgIGwgPSBzcmMgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIH0KKyAgICAgICAgfQorICAgICAgICBzb3VyY2UgKz0gKHN0cmlkZSA8PCB2cyk7CisgICAg ICAgIGxlZnQgICArPSAoc3RyaWRlIDw8IHZzKTsKKyAgICAgICAgdG9wICAgID0gc291cmNlIC0g c3RyaWRlOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGNj bG1fcHJlZF9kZWZhdWx0KShWVkNGcmFtZUNvbnRleHQgKmZjLAorICAgIGNvbnN0IGludCB4LCBj b25zdCBpbnQgeSwgY29uc3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBpbnQgYXZhaWxfdCwg Y29uc3QgaW50IGF2YWlsX2wpCit7CisgICAgZm9yIChpbnQgY19pZHggPSAxOyBjX2lkeCA8IFZW Q19NQVhfU0FNUExFX0FSUkFZUzsgY19pZHgrKykgeworICAgICAgICBjb25zdCBwdHJkaWZmX3Qg c3RyaWRlID0gZmMtPmZyYW1lLT5saW5lc2l6ZVtjX2lkeF0gLyBzaXplb2YocGl4ZWwpOworICAg ICAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilmYy0+ZnJhbWUtPmRhdGFbY19pZHhdICsgeCArIHkg KiBzdHJpZGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAg ICAgICBmb3IgKGludCBqID0gMDsgaiA8IHc7IGorKykgeworICAgICAgICAgICAgICAgIGRzdFtq XSA9IDEgPDwgKEJJVF9ERVBUSCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0 ICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy84LjQuNS4yLjE0IFNwZWNpZmlj YXRpb24gb2YgSU5UUkFfTFRfQ0NMTSwgSU5UUkFfTF9DQ0xNIGFuZCBJTlRSQV9UX0NDTE0gaW50 cmEgcHJlZGljdGlvbiBtb2RlCitzdGF0aWMgdm9pZCBGVU5DKGludHJhX2NjbG1fcHJlZCkoY29u c3QgVlZDTG9jYWxDb250ZXh0ICpsYywgY29uc3QgaW50IHgwLCBjb25zdCBpbnQgeTAsCisgICAg Y29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0KQoreworICAgIFZWQ0ZyYW1lQ29udGV4 dCAqZmMgICAgID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ1NQUyAqc3BzID0gZmMtPnBzLnNwczsK KyAgICBjb25zdCBpbnQgYXZhaWxfdCA9IGZmX3Z2Y19nZXRfdG9wX2F2YWlsYWJsZShsYywgeDAs IHkwLCAxLCAwKTsKKyAgICBjb25zdCBpbnQgYXZhaWxfbCA9IGZmX3Z2Y19nZXRfbGVmdF9hdmFp bGFibGUobGMsIHgwLCB5MCwgMSwgMCk7CisgICAgY29uc3QgaW50IGhzID0gc3BzLT5oc2hpZnRb MV07CisgICAgY29uc3QgaW50IHZzID0gc3BzLT52c2hpZnRbMV07CisgICAgY29uc3QgaW50IHgg ID0geDAgPj4gaHM7CisgICAgY29uc3QgaW50IHkgID0geTAgPj4gdnM7CisgICAgY29uc3QgaW50 IHcgID0gd2lkdGggPj4gaHM7CisgICAgY29uc3QgaW50IGggID0gaGVpZ2h0ID4+IHZzOworICAg IGludCBhWzJdLCBiWzJdLCBrWzJdOworCisgICAgcGl4ZWwgZHN5W01BWF9UQl9TSVpFICogTUFY X1RCX1NJWkVdOworICAgIGlmICghYXZhaWxfdCAmJiAhYXZhaWxfbCkgeworICAgICAgICBGVU5D KGNjbG1fcHJlZF9kZWZhdWx0KShmYywgeCwgeSwgdywgaCwgYXZhaWxfdCwgYXZhaWxfbCk7Cisg ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlVOQyhjY2xtX2dldF9sdW1hX3JlY19waXhlbHMp KGZjLCB4MCwgeTAsIHcsIGgsIGF2YWlsX3QsIGF2YWlsX2wsIGRzeSk7CisgICAgRlVOQyhjY2xt X2dldF9wYXJhbXMpIChsYywgeDAsIHkwLCB3LCBoLCBhdmFpbF90LCBhdmFpbF9sLCBhLCBiLCBr KTsKKyAgICBGVU5DKGNjbG1fbGluZWFyX3ByZWQpKGZjLCB4MCwgeTAsIHcsIGgsIGRzeSwgYSwg Yiwgayk7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhsbWNzX3N1bV9zYW1wbGVzKShjb25zdCBwaXhl bCAqc3RhcnQsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IGludCBhdmFpbCwgY29uc3QgaW50IHRh cmdldF9zaXplKQoreworICAgIGNvbnN0IGludCBzaXplID0gRkZNSU4oYXZhaWwsIHRhcmdldF9z aXplKTsKKyAgICBpbnQgc3VtID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkr KykgeworICAgICAgICBzdW0gKz0gKnN0YXJ0OworICAgICAgICBzdGFydCArPSBzdHJpZGU7Cisg ICAgfQorICAgIHN1bSArPSAqKHN0YXJ0IC0gc3RyaWRlKSAqICh0YXJnZXRfc2l6ZSAtIHNpemUp OworICAgIHJldHVybiBzdW07Cit9CisKKy8vIDguNy41LjMgUGljdHVyZSByZWNvbnN0cnVjdGlv biB3aXRoIGx1bWEgZGVwZW5kZW50IGNocm9tYSByZXNpZHVhbCBzY2FsaW5nIHByb2Nlc3MgZm9y IGNocm9tYSBzYW1wbGVzCitzdGF0aWMgaW50IEZVTkMobG1jc19kZXJpdmVfY2hyb21hX3NjYWxl KShWVkNMb2NhbENvbnRleHQgKmxjLCBjb25zdCBpbnQgeDAsIGNvbnN0IGludCB5MCkKK3sKKyAg ICBWVkNGcmFtZUNvbnRleHQgKmZjID0gbGMtPmZjOworICAgIGNvbnN0IFZWQ0xNQ1MgKmxtY3Mg PSAmZmMtPnBzLmxtY3M7CisgICAgY29uc3QgaW50IHNpemVfeSAgICA9IEZGTUlOKGZjLT5wcy5z cHMtPmN0Yl9zaXplX3ksIDY0KTsKKworICAgIGNvbnN0IGludCB4ID0geDAgJiB+KHNpemVfeSAt IDEpOworICAgIGNvbnN0IGludCB5ID0geTAgJiB+KHNpemVfeSAtIDEpOworICAgIGlmIChsYy0+ bG1jcy54X3ZwZHUgIT0geCB8fCBsYy0+bG1jcy55X3ZwZHUgIT0geSkgeworICAgICAgICBpbnQg Y250ID0gMCwgbHVtYSA9IDAsIGk7CisgICAgICAgIGNvbnN0IHBpeGVsICpzcmMgPSAoY29uc3Qg cGl4ZWwgKikoZmMtPmZyYW1lLT5kYXRhW0xVTUFdICsgeSAqIGZjLT5mcmFtZS0+bGluZXNpemVb TFVNQV0gKyAoeCA8PCBmYy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOworICAgICAgICBjb25zdCBw dHJkaWZmX3Qgc3RyaWRlID0gZmMtPmZyYW1lLT5saW5lc2l6ZVtMVU1BXSAvIHNpemVvZihwaXhl bCk7CisgICAgICAgIGNvbnN0IGludCBhdmFpbF90ID0gZmZfdnZjX2dldF90b3BfYXZhaWxhYmxl IChsYywgeCwgeSwgMSwgMCk7CisgICAgICAgIGNvbnN0IGludCBhdmFpbF9sID0gZmZfdnZjX2dl dF9sZWZ0X2F2YWlsYWJsZShsYywgeCwgeSwgMSwgMCk7CisgICAgICAgIGlmIChhdmFpbF9sKSB7 CisgICAgICAgICAgICBsdW1hICs9IEZVTkMobG1jc19zdW1fc2FtcGxlcykoc3JjIC0gMSwgc3Ry aWRlLCBmYy0+cHMucHBzLT5oZWlnaHQgLSB5LCBzaXplX3kpOworICAgICAgICAgICAgY250ID0g c2l6ZV95OworICAgICAgICB9CisgICAgICAgIGlmIChhdmFpbF90KSB7CisgICAgICAgICAgICBs dW1hICs9IEZVTkMobG1jc19zdW1fc2FtcGxlcykoc3JjIC0gc3RyaWRlLCAxLCBmYy0+cHMucHBz LT53aWR0aCAtIHgsIHNpemVfeSk7CisgICAgICAgICAgICBjbnQgKz0gc2l6ZV95OworICAgICAg ICB9CisgICAgICAgIGlmIChjbnQpCisgICAgICAgICAgICBsdW1hID0gKGx1bWEgKyAoY250ID4+ IDEpKSA+PiBhdl9sb2cyKGNudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGx1bWEgPSAx IDw8IChCSVRfREVQVEggLSAxKTsKKworICAgICAgICBmb3IgKGkgPSBsbWNzLT5taW5fYmluX2lk eDsgaSA8PSBsbWNzLT5tYXhfYmluX2lkeDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobHVtYSA8 IGxtY3MtPnBpdm90W2kgKyAxXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor ICAgICAgICBpID0gRkZNSU4oaSwgTE1DU19NQVhfQklOX1NJWkUgLSAxKTsKKworICAgICAgICBs Yy0+bG1jcy5jaHJvbWFfc2NhbGUgPSBsbWNzLT5jaHJvbWFfc2NhbGVfY29lZmZbaV07CisgICAg ICAgIGxjLT5sbWNzLnhfdnBkdSA9IHg7CisgICAgICAgIGxjLT5sbWNzLnlfdnBkdSA9IHk7Cisg ICAgfQorICAgIHJldHVybiBsYy0+bG1jcy5jaHJvbWFfc2NhbGU7Cit9CisKKy8vIDguNy41LjMg UGljdHVyZSByZWNvbnN0cnVjdGlvbiB3aXRoIGx1bWEgZGVwZW5kZW50IGNocm9tYSByZXNpZHVh bCBzY2FsaW5nIHByb2Nlc3MgZm9yIGNocm9tYSBzYW1wbGVzCitzdGF0aWMgdm9pZCBGVU5DKGxt Y3Nfc2NhbGVfY2hyb21hKShWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgKmRzdCwgY29uc3QgaW50 ICpjb2VmZiwKKyAgICBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsIGNvbnN0IGlu dCB4MF9jdSwgY29uc3QgaW50IHkwX2N1KQoreworICAgIGNvbnN0IGludCBjaHJvbWFfc2NhbGUg PSBGVU5DKGxtY3NfZGVyaXZlX2Nocm9tYV9zY2FsZSkobGMsIHgwX2N1LCB5MF9jdSk7CisKKyAg ICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoaW50IHgg PSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgY29uc3QgaW50IGMgPSBhdl9jbGlw X2ludHAyKCpjb2VmZiwgQklUX0RFUFRIKTsKKworICAgICAgICAgICAgaWYgKGMgPiAwKQorICAg ICAgICAgICAgICAgICpkc3QgPSAoYyAqIGNocm9tYV9zY2FsZSArICgxIDw8IDEwKSkgPj4gMTE7 CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmRzdCA9IC0oKC1jICogY2hyb21h X3NjYWxlICsgKDEgPDwgMTApKSA+PiAxMSk7CisgICAgICAgICAgICBjb2VmZisrOworICAgICAg ICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5s aW5lIHZvaWQgRlVOQyhyZWZfZmlsdGVyKShjb25zdCBwaXhlbCAqbGVmdCwgY29uc3QgcGl4ZWwg KnRvcCwKKyAgICBwaXhlbCAqZmlsdGVyZWRfbGVmdCwgcGl4ZWwgKmZpbHRlcmVkX3RvcCwgY29u c3QgaW50IGxlZnRfc2l6ZSwgY29uc3QgaW50IHRvcF9zaXplLAorICAgIGNvbnN0IGludCB1bmZp bHRlcl9sYXN0X29uZSkKK3sKKyAgICBmaWx0ZXJlZF9sZWZ0Wy0xXSA9IGZpbHRlcmVkX3RvcFst MV0gPSAobGVmdFswXSArICAyICogbGVmdFstMV0gKyB0b3BbMF0gKyAyICkgPj4gMjsKKyAgICBm b3IgKGludCBpID0gMDsgaSA8IGxlZnRfc2l6ZSAtIHVuZmlsdGVyX2xhc3Rfb25lOyBpKyspIHsK KyAgICAgICAgZmlsdGVyZWRfbGVmdFtpXSA9IChsZWZ0W2ktIDFdICsgMiAqIGxlZnRbaV0gKyBs ZWZ0W2kgKyAxXSArIDIpID4+IDI7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9w X3NpemUgLSB1bmZpbHRlcl9sYXN0X29uZTsgaSsrKSB7CisgICAgICAgIGZpbHRlcmVkX3RvcFtp XSA9ICh0b3BbaS0xXSArIDIgKiB0b3BbaV0gKyB0b3BbaSArIDFdICsgMikgPj4gMjsKKyAgICB9 CisgICAgaWYgKHVuZmlsdGVyX2xhc3Rfb25lKSB7CisgICAgICAgIGZpbHRlcmVkX3RvcFt0b3Bf c2l6ZSAtIDFdID0gdG9wW3RvcF9zaXplIC0gMV07CisgICAgICAgIGZpbHRlcmVkX2xlZnRbbGVm dF9zaXplIC0gMV0gPSBsZWZ0W2xlZnRfc2l6ZSAtIDFdOworICAgIH0KK30KKworc3RhdGljIGF2 X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHByZXBhcmVfaW50cmFfZWRnZV9wYXJhbXMpKGNvbnN0 IFZWQ0xvY2FsQ29udGV4dCAqbGMsCisgICAgSW50cmFFZGdlUGFyYW1zKiBlZGdlLCBjb25zdCBw aXhlbCAqc3JjLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgIGNvbnN0IGludCB4LCBpbnQg eSwgaW50IHcsIGludCBoLCBpbnQgY19pZHgsIGNvbnN0IGludCBpc19pbnRyYV9taXAsCisgICAg Y29uc3QgaW50IG1vZGUsIGNvbnN0IGludCByZWZfaWR4LCBjb25zdCBpbnQgbmVlZF9wZHBjKQor eworI2RlZmluZSBFWFRFTkQocHRyLCB2YWwsIGxlbikgICAgICAgICBcCitkbyB7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbik7IGkr KykgICAgICAgXAorICAgICAgICAqKHB0ciArIGkpID0gdmFsOyAgICAgICAgICAgICBcCit9IHdo aWxlICgwKQorICAgIGNvbnN0IENvZGluZ1VuaXQgKmN1ID0gbGMtPmN1OworICAgIGNvbnN0IGlu dCByZWZfZmlsdGVyX2ZsYWcgPSBpc19pbnRyYV9taXAgPyAwIDogZmZfdnZjX3JlZl9maWx0ZXJf ZmxhZ19kZXJpdmUobW9kZSk7CisgICAgY29uc3QgaW50IGZpbHRlcl9mbGFnID0gIXJlZl9pZHgg JiYgdyAqIGggPiAzMiAmJiAhY19pZHggJiYKKyAgICAgICAgY3UtPmlzcF9zcGxpdF90eXBlID09 IElTUF9OT19TUExJVCAmJiByZWZfZmlsdGVyX2ZsYWc7CisgICAgaW50IGNhbmRfdXBfbGVmdCAg ICAgID0gbGMtPm5hLmNhbmRfdXBfbGVmdDsKKyAgICBwaXhlbCAgKmxlZnQgICAgICAgICAgPSAo cGl4ZWwqKWVkZ2UtPmxlZnRfYXJyYXkgKyBNQVhfVEJfU0laRSArIDM7CisgICAgcGl4ZWwgICp0 b3AgICAgICAgICAgID0gKHBpeGVsKillZGdlLT50b3BfYXJyYXkgICsgTUFYX1RCX1NJWkUgKyAz OworICAgIHBpeGVsICAqZmlsdGVyZWRfbGVmdCA9IChwaXhlbCopZWRnZS0+ZmlsdGVyZWRfbGVm dF9hcnJheSArIE1BWF9UQl9TSVpFICsgMzsKKyAgICBwaXhlbCAgKmZpbHRlcmVkX3RvcCAgPSAo cGl4ZWwqKWVkZ2UtPmZpbHRlcmVkX3RvcF9hcnJheSAgKyBNQVhfVEJfU0laRSArIDM7CisgICAg Y29uc3QgaW50IHJlZl9saW5lID0gcmVmX2lkeCA9PSAzID8gLTQgOiAoLTEgLSByZWZfaWR4KTsK KyAgICBpbnQgbGVmdF9zaXplLCB0b3Bfc2l6ZSwgdW5maWx0ZXJfbGVmdF9zaXplLCB1bmZpbHRl cl90b3Bfc2l6ZTsKKyAgICBpbnQgbGVmdF9hdmFpbGFibGUsIHRvcF9hdmFpbGFibGU7CisgICAg aW50IHJlZncsIHJlZmg7CisgICAgaW50IGludHJhX3ByZWRfYW5nbGUsIGludl9hbmdsZTsKKyAg ICBpbnQgaTsKKworICAgIGlmIChpc19pbnRyYV9taXAgfHwgbW9kZSA9PSBJTlRSQV9QTEFOQVIp IHsKKyAgICAgICAgbGVmdF9zaXplID0gaCArIDE7CisgICAgICAgIHRvcF9zaXplICA9IHcgKyAx OworICAgICAgICB1bmZpbHRlcl9sZWZ0X3NpemUgPSBsZWZ0X3NpemUgKyBmaWx0ZXJfZmxhZzsK KyAgICAgICAgdW5maWx0ZXJfdG9wX3NpemUgID0gdG9wX3NpemUgICsgZmlsdGVyX2ZsYWc7Cisg ICAgfSBlbHNlIGlmIChtb2RlID09IElOVFJBX0RDKSB7CisgICAgICAgIHVuZmlsdGVyX2xlZnRf c2l6ZSA9IGxlZnRfc2l6ZSA9IGg7CisgICAgICAgIHVuZmlsdGVyX3RvcF9zaXplID0gdG9wX3Np emUgID0gdzsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gSU5UUkFfVkVSVCkgeworICAgICAgICAv L3dlIG1heSBuZWVkIDEgcGl4ZWwgdG8gcHJlZGljdCB0aGUgdG9wIGxlZnQuCisgICAgICAgIHVu ZmlsdGVyX2xlZnRfc2l6ZSA9IGxlZnRfc2l6ZSA9IG5lZWRfcGRwYyA/IGggOiAxOworICAgICAg ICB1bmZpbHRlcl90b3Bfc2l6ZSA9IHRvcF9zaXplICA9IHc7CisgICAgfSBlbHNlIGlmIChtb2Rl ID09IElOVFJBX0hPUlopIHsKKyAgICAgICAgdW5maWx0ZXJfbGVmdF9zaXplID0gbGVmdF9zaXpl ID0gaDsKKyAgICAgICAgLy9ldmVuIG5lZWRfcGRwYyA9PSAwLCB3ZSBtYXkgbmVlZCAxIHBpeGVs IHRvIHByZWRpY3QgdGhlIHRvcCBsZWZ0LgorICAgICAgICB1bmZpbHRlcl90b3Bfc2l6ZSA9IHRv cF9zaXplID0gbmVlZF9wZHBjID8gdyA6IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN1 LT5pc3Bfc3BsaXRfdHlwZSA9PSBJU1BfTk9fU1BMSVQgfHwgY19pZHgpIHsKKyAgICAgICAgICAg IHJlZncgPSB3ICogMjsKKyAgICAgICAgICAgIHJlZmggPSBoICogMjsKKyAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgIHJlZncgPSBjdS0+Y2Jfd2lkdGggKyB3OworICAgICAgICAgICAgcmVm aCA9IGN1LT5jYl9oZWlnaHQgKyBoOworICAgICAgICB9CisgICAgICAgIGludHJhX3ByZWRfYW5n bGUgPSBmZl92dmNfaW50cmFfcHJlZF9hbmdsZV9kZXJpdmUobW9kZSk7CisgICAgICAgIGludl9h bmdsZSA9IGZmX3Z2Y19pbnRyYV9pbnZfYW5nbGVfZGVyaXZlKGludHJhX3ByZWRfYW5nbGUpOwor ICAgICAgICB1bmZpbHRlcl90b3Bfc2l6ZSA9IHRvcF9zaXplICA9IHJlZnc7CisgICAgICAgIHVu ZmlsdGVyX2xlZnRfc2l6ZSA9IGxlZnRfc2l6ZSA9IHJlZmg7CisgICAgfQorCisgICAgbGVmdF9h dmFpbGFibGUgPSBmZl92dmNfZ2V0X2xlZnRfYXZhaWxhYmxlKGxjLCB4LCB5LCB1bmZpbHRlcl9s ZWZ0X3NpemUsIGNfaWR4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVmdF9hdmFpbGFibGU7IGkr KykKKyAgICAgICAgbGVmdFtpXSA9IFBPUyhyZWZfbGluZSwgaSk7CisKKyAgICB0b3BfYXZhaWxh YmxlID0gZmZfdnZjX2dldF90b3BfYXZhaWxhYmxlKGxjLCB4LCB5LCB1bmZpbHRlcl90b3Bfc2l6 ZSwgY19pZHgpOworICAgIG1lbWNweSh0b3AsIHNyYyArIHJlZl9saW5lICogc3RyaWRlLCB0b3Bf YXZhaWxhYmxlICogc2l6ZW9mKHBpeGVsKSk7CisKKyAgICBmb3IgKGludCBpID0gLTE7IGkgPj0g cmVmX2xpbmU7IGktLSkgeworICAgICAgICBpZiAoY2FuZF91cF9sZWZ0KSB7CisgICAgICAgICAg ICBsZWZ0W2ldID0gUE9TKHJlZl9saW5lLCBpKTsKKyAgICAgICAgICAgIHRvcFtpXSAgPSBQT1Mo aSwgcmVmX2xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGxlZnRfYXZhaWxhYmxlKSB7CisgICAg ICAgICAgICBsZWZ0W2ldID0gdG9wW2ldID0gbGVmdFswXTsKKyAgICAgICAgfSBlbHNlIGlmICh0 b3BfYXZhaWxhYmxlKSB7CisgICAgICAgICAgICBsZWZ0W2ldID0gdG9wW2ldID0gdG9wWzBdOwor ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdFtpXSA9IHRvcFtpXSA9IDEgPDwgKEJJ VF9ERVBUSCAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgRVhURU5EKHRvcCArIHRvcF9h dmFpbGFibGUsIHRvcFt0b3BfYXZhaWxhYmxlLTFdLCB1bmZpbHRlcl90b3Bfc2l6ZSAtIHRvcF9h dmFpbGFibGUpOworICAgIEVYVEVORChsZWZ0ICsgbGVmdF9hdmFpbGFibGUsIGxlZnRbbGVmdF9h dmFpbGFibGUtMV0sIHVuZmlsdGVyX2xlZnRfc2l6ZSAtIGxlZnRfYXZhaWxhYmxlKTsKKworICAg IGlmIChyZWZfZmlsdGVyX2ZsYWcpIHsKKyAgICAgICAgaWYgKCFyZWZfaWR4ICYmIHcgKiBoID4g MzIgJiYgIWNfaWR4ICYmIGN1LT5pc3Bfc3BsaXRfdHlwZSA9PSBJU1BfTk9fU1BMSVQgKSB7Cisg ICAgICAgICAgICBjb25zdCBpbnQgdW5maWx0ZXJfbGFzdF9vbmUgPSBsZWZ0X3NpemUgPT0gdW5m aWx0ZXJfbGVmdF9zaXplOworICAgICAgICAgICAgRlVOQyhyZWZfZmlsdGVyKShsZWZ0LCB0b3As IGZpbHRlcmVkX2xlZnQsIGZpbHRlcmVkX3RvcCwgdW5maWx0ZXJfbGVmdF9zaXplLCB1bmZpbHRl cl90b3Bfc2l6ZSwgdW5maWx0ZXJfbGFzdF9vbmUpOworICAgICAgICAgICAgbGVmdCA9IGZpbHRl cmVkX2xlZnQ7CisgICAgICAgICAgICB0b3AgID0gZmlsdGVyZWRfdG9wOworICAgICAgICB9Cisg ICAgfQorICAgIGlmICghaXNfaW50cmFfbWlwICYmIG1vZGUgIT0gSU5UUkFfUExBTkFSICYmIG1v ZGUgIT0gSU5UUkFfREMpIHsKKyAgICAgICAgaWYgKHJlZl9maWx0ZXJfZmxhZyB8fCByZWZfaWR4 IHx8IGN1LT5pc3Bfc3BsaXRfdHlwZSAhPSBJU1BfTk9fU1BMSVQpIHsKKyAgICAgICAgICAgIGVk Z2UtPmZpbHRlcl9mbGFnID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0 IGludCBtaW5fZGlzdF92ZXJfaG9yID0gRkZNSU4oYWJzKG1vZGUgLSA1MCksIGFicyhtb2RlIC0g MTgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbnRyYV9ob3JfdmVyX2Rpc3RfdGhyZXNbXSA9 IHsyNCwgMTQsIDIsIDAsIDB9OworICAgICAgICAgICAgY29uc3QgaW50IG50YnMgPSAoYXZfbG9n Mih3KSArIGF2X2xvZzIoaCkpID4+IDE7CisgICAgICAgICAgICBlZGdlLT5maWx0ZXJfZmxhZyA9 IG1pbl9kaXN0X3Zlcl9ob3IgPiBpbnRyYV9ob3JfdmVyX2Rpc3RfdGhyZXNbbnRicyAtIDJdOwor ICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGUgIT0gSU5UUkFfVkVSVCAmJiBtb2RlICE9IElO VFJBX0hPUlopIHsKKyAgICAgICAgICAgIGlmIChtb2RlID49IElOVFJBX0RJQUcpIHsKKyAgICAg ICAgICAgICAgICBpZiAoaW50cmFfcHJlZF9hbmdsZSA8IDApIHsKKyAgICAgICAgICAgICAgICAg ICAgcGl4ZWwgKnAgPSB0b3AgLSAocmVmX2lkeCArIDEpOworICAgICAgICAgICAgICAgICAgICBm b3IgKGludCB4ID0gLWg7IHggPCAwOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IGludCBpZHggPSAtMSAtIHJlZl9pZHggKyBGRk1JTigoeCppbnZfYW5nbGUgKyAyNTYpID4+ IDksIGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcFt4XSA9IGxlZnRbaWR4XTsKKyAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg ICAgICAgIGZvciAoaW50IGkgPSByZWZ3OyBpIDw9IHJlZncgKyBGRk1BWCgxLCB3L2gpICogcmVm X2lkeCArIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcFtpXSA9IHRvcFtyZWZ3 IC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg ICAgICAgICBpZiAoaW50cmFfcHJlZF9hbmdsZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAg cGl4ZWwgKnAgPSBsZWZ0IC0gKHJlZl9pZHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgZm9y IChpbnQgeCA9IC13OyB4IDwgMDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBpbnQgaWR4ID0gLTEgLSByZWZfaWR4ICsgRkZNSU4oKHgqaW52X2FuZ2xlICsgMjU2KSA+PiA5 LCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbeF0gPSB0b3BbaWR4XTsKKyAgICAgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg ICAgIGZvciAoaW50IGkgPSByZWZoOyBpIDw9IHJlZmggKyBGRk1BWCgxLCBoL3cpICogcmVmX2lk eCArIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRbaV0gPSBsZWZ0W3JlZmgg LSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9 CisgICAgZWRnZS0+bGVmdCA9ICh1aW50OF90KilsZWZ0OworICAgIGVkZ2UtPnRvcCAgPSAodWlu dDhfdCopdG9wOworfQorCisvLzguNC4xIEdlbmVyYWwgZGVjb2RpbmcgcHJvY2VzcyBmb3IgY29k aW5nIHVuaXRzIGNvZGVkIGluIGludHJhIHByZWRpY3Rpb24gbW9kZQorc3RhdGljIHZvaWQgRlVO QyhpbnRyYV9wcmVkKShjb25zdCBWVkNMb2NhbENvbnRleHQgKmxjLCBpbnQgeDAsIGludCB5MCwK KyAgICBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsIGludCBjX2lkeCkKK3sKKyAg ICBWVkNGcmFtZUNvbnRleHQgKmZjICAgICA9IGxjLT5mYzsKKyAgICBjb25zdCBWVkNTUFMgKnNw cyA9IGZjLT5wcy5zcHM7CisgICAgY29uc3QgVlZDUFBTICpwcHMgPSBmYy0+cHMucHBzOworICAg IGNvbnN0IENvZGluZ1VuaXQgKmN1ID0gbGMtPmN1OworICAgIGNvbnN0IGludCBsb2cyX21pbl9j Yl9zaXplICAgID0gc3BzLT5taW5fY2JfbG9nMl9zaXplX3k7CisgICAgY29uc3QgaW50IG1pbl9j Yl93aWR0aCAgICAgICAgPSBwcHMtPm1pbl9jYl93aWR0aDsKKyAgICBjb25zdCBpbnQgeF9jYiAg ICAgICAgICAgICAgICA9IHgwID4+IGxvZzJfbWluX2NiX3NpemU7CisgICAgY29uc3QgaW50IHlf Y2IgICAgICAgICAgICAgICAgPSB5MCA+PiBsb2cyX21pbl9jYl9zaXplOworCisgICAgY29uc3Qg aW50IGhzaGlmdCA9IGZjLT5wcy5zcHMtPmhzaGlmdFtjX2lkeF07CisgICAgY29uc3QgaW50IHZz aGlmdCA9IGZjLT5wcy5zcHMtPnZzaGlmdFtjX2lkeF07CisgICAgY29uc3QgaW50IHggPSB4MCA+ PiBoc2hpZnQ7CisgICAgY29uc3QgaW50IHkgPSB5MCA+PiB2c2hpZnQ7CisgICAgY29uc3QgaW50 IHcgPSB3aWR0aCA+PiBoc2hpZnQ7CisgICAgY29uc3QgaW50IGggPSBoZWlnaHQgPj4gdnNoaWZ0 OworICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUgPSBmYy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4 XSAvIHNpemVvZihwaXhlbCk7CisKKyAgICBjb25zdCBpbnQgcHJlZF9tb2RlID0gY19pZHggPyBj dS0+aW50cmFfcHJlZF9tb2RlX2MgOiBjdS0+aW50cmFfcHJlZF9tb2RlX3k7CisgICAgY29uc3Qg aW50IG1vZGUgPSBmZl92dmNfd2lkZV9hbmdsZV9tb2RlX21hcHBpbmcoY3UsIHcsIGgsIGNfaWR4 LCBwcmVkX21vZGUpOworCisgICAgY29uc3QgaW50IGludHJhX21pcF9mbGFnICA9IFNBTVBMRV9D VEIoZmMtPnRhYi5pbWYsIHhfY2IsIHlfY2IpOworICAgIGNvbnN0IGludCBpc19pbnRyYV9taXAg ICAgPSBpbnRyYV9taXBfZmxhZyAmJiAoIWNfaWR4IHx8IGN1LT5taXBfY2hyb21hX2RpcmVjdF9m bGFnKTsKKyAgICBjb25zdCBpbnQgcmVmX2lkeCA9IGNfaWR4ID8gMCA6IGN1LT5pbnRyYV9sdW1h X3JlZl9pZHg7CisgICAgY29uc3QgaW50IG5lZWRfcGRwYyA9IGZmX3Z2Y19uZWVkX3BkcGModywg aCwgY3UtPmJkcGNtX2ZsYWdbY19pZHhdLCBtb2RlLCByZWZfaWR4KTsKKworCisgICAgcGl4ZWwg KnNyYyA9IChwaXhlbCopZmMtPmZyYW1lLT5kYXRhW2NfaWR4XSArIHggKyB5ICogc3RyaWRlOwor ICAgIEludHJhRWRnZVBhcmFtcyBlZGdlOworCisgICAgRlVOQyhwcmVwYXJlX2ludHJhX2VkZ2Vf cGFyYW1zKShsYywgJmVkZ2UsIHNyYywgc3RyaWRlLCB4LCB5LCB3LCBoLCBjX2lkeCwgaXNfaW50 cmFfbWlwLCBtb2RlLCByZWZfaWR4LCBuZWVkX3BkcGMpOworCisgICAgaWYgKGlzX2ludHJhX21p cCkgeworICAgICAgICBpbnQgaW50cmFfbWlwX3RyYW5zcG9zZWRfZmxhZyA9IFNBTVBMRV9DVEIo ZmMtPnRhYi5pbXRmLCB4X2NiLCB5X2NiKTsKKyAgICAgICAgaW50IGludHJhX21pcF9tb2RlID0g U0FNUExFX0NUQihmYy0+dGFiLmltbSwgeF9jYiwgeV9jYik7CisKKyAgICAgICAgZmMtPnZ2Y2Rz cC5pbnRyYS5wcmVkX21pcCgodWludDhfdCAqKXNyYywgZWRnZS50b3AsIGVkZ2UubGVmdCwKKyAg ICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIHN0cmlkZSwgaW50cmFfbWlwX21vZGUsIGludHJh X21pcF90cmFuc3Bvc2VkX2ZsYWcpOworICAgIH0gZWxzZSBpZiAobW9kZSA9PSBJTlRSQV9QTEFO QVIpIHsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5wcmVkX3BsYW5hcigodWludDhfdCAqKXNy YywgZWRnZS50b3AsIGVkZ2UubGVmdCwgdywgaCwgc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKG1v ZGUgPT0gSU5UUkFfREMpIHsKKyAgICAgICAgZmMtPnZ2Y2RzcC5pbnRyYS5wcmVkX2RjKCh1aW50 OF90ICopc3JjLCBlZGdlLnRvcCwgZWRnZS5sZWZ0LCB3LCBoLCBzdHJpZGUpOworICAgIH0gZWxz ZSBpZiAobW9kZSA9PSBJTlRSQV9WRVJUKSB7CisgICAgICAgIGZjLT52dmNkc3AuaW50cmEucHJl ZF92KCh1aW50OF90ICopc3JjLCBlZGdlLnRvcCwgdywgaCwgc3RyaWRlKTsKKyAgICB9IGVsc2Ug aWYgKG1vZGUgPT0gSU5UUkFfSE9SWikgeworICAgICAgICBmYy0+dnZjZHNwLmludHJhLnByZWRf aCgodWludDhfdCAqKXNyYywgZWRnZS5sZWZ0LCB3LCBoLCBzdHJpZGUpOworICAgIH0gZWxzZSB7 CisgICAgICAgIGlmIChtb2RlID49IElOVFJBX0RJQUcpIHsKKyAgICAgICAgICAgIGZjLT52dmNk c3AuaW50cmEucHJlZF9hbmd1bGFyX3YoKHVpbnQ4X3QgKilzcmMsIGVkZ2UudG9wLCBlZGdlLmxl ZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgc3RyaWRlLCBjX2lk eCwgbW9kZSwgcmVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdl LmZpbHRlcl9mbGFnLCBuZWVkX3BkcGMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg ZmMtPnZ2Y2RzcC5pbnRyYS5wcmVkX2FuZ3VsYXJfaCgodWludDhfdCAqKXNyYywgZWRnZS50b3As IGVkZ2UubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBzdHJp ZGUsIGNfaWR4LCBtb2RlLCByZWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGVkZ2UuZmlsdGVyX2ZsYWcsIG5lZWRfcGRwYyk7CisgICAgICAgIH0KKyAgICB9CisgICAg aWYgKG5lZWRfcGRwYykgeworICAgICAgICAvLzguNC41LjIuMTUgUG9zaXRpb24tZGVwZW5kZW50 IGludHJhIHByZWRpY3Rpb24gc2FtcGxlIGZpbHRlcmluZyBwcm9jZXNzCisgICAgICAgIGlmICgh aXNfaW50cmFfbWlwICYmIChtb2RlID09IElOVFJBX1BMQU5BUiB8fCBtb2RlID09IElOVFJBX0RD IHx8CisgICAgICAgICAgICBtb2RlID09IElOVFJBX1ZFUlQgfHwgbW9kZSA9PSBJTlRSQV9IT1Ja KSkgeworICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlID0gKGF2X2xvZzIodykgKyBhdl9sb2cy KGgpIC0gMikgPj4gMjsKKyAgICAgICAgICAgIGNvbnN0IHBpeGVsICpsZWZ0ID0gKHBpeGVsKill ZGdlLmxlZnQ7CisgICAgICAgICAgICBjb25zdCBwaXhlbCAqdG9wICA9IChwaXhlbCopZWRnZS50 b3A7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAg ICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAg IGludCBsLCB0LCB3bCwgd3QsIHByZWQ7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsIHZhbDsK KyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gSU5UUkFfUExBTkFSIHx8IG1vZGUgPT0g SU5UUkFfREMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwgID0gbGVmdFt5XTsKKyAgICAg ICAgICAgICAgICAgICAgICAgIHQgPSB0b3BbeF07CisgICAgICAgICAgICAgICAgICAgICAgICB3 bCA9IDMyID4+IEZGTUlOKCh4IDw8IDEpID4+IHNjYWxlLCAzMSk7CisgICAgICAgICAgICAgICAg ICAgICAgICB3dCA9IDMyID4+IEZGTUlOKCh5IDw8IDEpID4+IHNjYWxlLCAzMSk7CisgICAgICAg ICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsICA9IGxlZnRb eV0gLSBsZWZ0Wy0xXSArIFBPUyh4LHkpOworICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHRv cFt4XSAtIHRvcFstMV0gKyBQT1MoeCx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdsID0g KG1vZGUgPT0gSU5UUkFfVkVSVCkgPyAgKDMyID4+IEZGTUlOKCh4IDw8IDEpID4+IHNjYWxlLCAz MSkpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHd0ID0gKG1vZGUgPT0gSU5UUkFfSE9S WikgPyAgKDMyID4+IEZGTUlOKCh5IDw8IDEpID4+IHNjYWxlLCAzMSkpIDogMDsKKyAgICAgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBQT1MoeCwgeSk7CisgICAg ICAgICAgICAgICAgICAgIHByZWQgID0gdmFsICsgKCh3bCAqIChsIC0gdmFsKSArIHd0ICogKHQg LSB2YWwpICsgMzIpID4+IDYpOworICAgICAgICAgICAgICAgICAgICBQT1MoeCwgeSkgPSBDTElQ KHByZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg IH0KK30KKworLy84LjQuNS4yLjExIFNwZWNpZmljYXRpb24gb2YgSU5UUkFfUExBTkFSIGludHJh IHByZWRpY3Rpb24gbW9kZQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHByZWRf cGxhbmFyKSh1aW50OF90ICpfc3JjLCBjb25zdCB1aW50OF90ICpfdG9wLAorICAgIGNvbnN0IHVp bnQ4X3QgKl9sZWZ0LCBjb25zdCBpbnQgdywgY29uc3QgaW50IGgsIGNvbnN0IHB0cmRpZmZfdCBz dHJpZGUpCit7CisgICAgaW50IHgsIHk7CisgICAgcGl4ZWwgKnNyYyAgICAgICAgPSAocGl4ZWwg Kilfc3JjOworICAgIGNvbnN0IHBpeGVsICp0b3AgID0gKGNvbnN0IHBpeGVsICopX3RvcDsKKyAg ICBjb25zdCBwaXhlbCAqbGVmdCA9IChjb25zdCBwaXhlbCAqKV9sZWZ0OworICAgIGNvbnN0IGlu dCBsb2d3ICA9IGF2X2xvZzIodyk7CisgICAgY29uc3QgaW50IGxvZ2ggID0gYXZfbG9nMihoKTsK KyAgICBjb25zdCBpbnQgc2l6ZSAgPSAgdyAqIGg7CisgICAgY29uc3QgaW50IHNoaWZ0ID0gKGxv Z3cgKyBsb2doICsgMSk7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBm b3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcHJlZF92ID0g KChoIC0gMSAtIHkpICogdG9wW3hdICArICh5ICsgMSkgKiBsZWZ0W2hdKSA8PCBsb2d3OworICAg ICAgICAgICAgY29uc3QgaW50IHByZWRfaCA9ICgodyAtIDEgLSB4KSAqIGxlZnRbeV0gKyAoeCAr IDEpICogdG9wW3ddKSA8PCBsb2doOworICAgICAgICAgICAgY29uc3QgaW50IHByZWQgPSAocHJl ZF92ICsgcHJlZF9oICsgc2l6ZSkgPj4gc2hpZnQ7CisgICAgICAgICAgICBQT1MoeCwgeSkgPSBw cmVkOworICAgICAgICB9CisgICAgfQorfQorCisvLzguNC41LjIuMyBNSVAgYm91bmRhcnkgc2Ft cGxlIGRvd25zYW1wbGluZyBwcm9jZXNzCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZV TkMobWlwX2Rvd25zYW1wbGluZykoaW50ICpyZWR1Y2VkLCBjb25zdCBpbnQgYm91bmRhcnlfc2l6 ZSwKKyAgICBjb25zdCBwaXhlbCAqcmVmLCBjb25zdCBpbnQgbl90Yl9zKQoreworICAgIGNvbnN0 IGludCBiX2R3biA9IG5fdGJfcyAvIGJvdW5kYXJ5X3NpemU7CisgICAgY29uc3QgaW50IGxvZzIg PSBhdl9sb2cyKGJfZHduKTsKKworICAgIGlmIChib3VuZGFyeV9zaXplID09IG5fdGJfcykgewor ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5fdGJfczsgaSsrKQorICAgICAgICAgICAgcmVk dWNlZFtpXSA9IHJlZltpXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBp ID0gMDsgaSA8IGJvdW5kYXJ5X3NpemU7IGkrKykgeworICAgICAgICBpbnQgcjsKKyAgICAgICAg ciA9ICpyZWYrKzsKKyAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBiX2R3bjsgaisrKQorICAg ICAgICAgICAgciArPSAqcmVmKys7CisgICAgICAgIHJlZHVjZWRbaV0gPSAociArICgxIDw8IChs b2cyIC0gMSkpKSA+PiBsb2cyOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUg dm9pZCBGVU5DKG1pcF9yZWR1Y2VkX3ByZWQpKHBpeGVsICpzcmMsIGNvbnN0IHB0cmRpZmZfdCBz dHJpZGUsCisgICAgY29uc3QgaW50IHVwX2hvciwgY29uc3QgaW50IHVwX3ZlciwgY29uc3QgaW50 IHByZWRfc2l6ZSwgY29uc3QgaW50ICpyZWR1Y2VkLCBjb25zdCBpbnQgcmVkdWNlZF9zaXplLAor ICAgIGNvbnN0IGludCBvdywgY29uc3QgaW50IHRlbXAwLCBjb25zdCB1aW50OF90ICptYXRyaXgs IGludCBpc190cmFuc3Bvc2VkKQoreworICAgIHNyYyA9ICZQT1ModXBfaG9yIC0gMSwgdXBfdmVy IC0gMSk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBwcmVkX3NpemU7IHkrKykgeworICAgICAg ICBmb3IgKGludCB4ID0gMDsgeCA8IHByZWRfc2l6ZTsgeCsrKSB7CisgICAgICAgICAgICBpbnQg cHJlZCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZHVjZWRfc2l6ZTsg aSsrKQorICAgICAgICAgICAgICAgIHByZWQgKz0gcmVkdWNlZFtpXSAqIG1hdHJpeFtpXTsKKyAg ICAgICAgICAgIG1hdHJpeCArPSByZWR1Y2VkX3NpemU7CisgICAgICAgICAgICBwcmVkID0gKChw cmVkICsgb3cpID4+IDYpICsgdGVtcDA7CisgICAgICAgICAgICBwcmVkID0gYXZfY2xpcChwcmVk LCAwLCAoMTw8QklUX0RFUFRIKSAtIDEpOworICAgICAgICAgICAgaWYgKGlzX3RyYW5zcG9zZWQp CisgICAgICAgICAgICAgICAgUE9TKHkgKiB1cF9ob3IsIHggKiB1cF92ZXIpID0gcHJlZDsKKyAg ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQT1MoeCAqIHVwX2hvciwgeSAqIHVwX3Zl cikgPSBwcmVkOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGlu ZSB2b2lkIEZVTkMobWlwX3Vwc2FtcGxpbmdfMWQpKHBpeGVsICpkc3QsIGNvbnN0IGludCBkc3Rf c3RlcCwgY29uc3QgaW50IGRzdF9zdHJpZGUsIGNvbnN0IGludCBkc3RfaGVpZ2h0LCBjb25zdCBp bnQgZmFjdG9yLAorICAgIGNvbnN0IHBpeGVsICpib3VuZGFyeSwgY29uc3QgaW50IGJvdW5kYXJ5 X3N0ZXAsICBjb25zdCBpbnQgcHJlZF9zaXplKQoreworCisgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBkc3RfaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgY29uc3QgcGl4ZWwgKmJlZm9yZSA9IGJvdW5k YXJ5OworICAgICAgICBjb25zdCBwaXhlbCAqYWZ0ZXIgID0gZHN0IC0gZHN0X3N0ZXA7CisgICAg ICAgIHBpeGVsICpkID0gZHN0OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByZWRfc2l6 ZTsgaisrKSB7CisgICAgICAgICAgICBhZnRlciArPSBkc3Rfc3RlcCAqIGZhY3RvcjsKKyAgICAg ICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgZmFjdG9yOyBrKyspIHsKKyAgICAgICAgICAgICAg ICBpbnQgbWlkID0gKGZhY3RvciAtIGspICogKCpiZWZvcmUpICsgayAqICgqYWZ0ZXIpOworICAg ICAgICAgICAgICAgICpkID0gKG1pZCArIGZhY3RvciAvIDIpIC8gZmFjdG9yOworICAgICAgICAg ICAgICAgIGQgKz0gZHN0X3N0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiZWZvcmUg PSBhZnRlcjsKKyAgICAgICAgICAgIGQgKz0gZHN0X3N0ZXA7CisgICAgICAgIH0KKyAgICAgICAg Ym91bmRhcnkgKz0gYm91bmRhcnlfc3RlcDsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Cisg ICAgfQorfQorCisvLzguNC41LjIuMiBNYXRyaXgtYmFzZWQgaW50cmEgc2FtcGxlIHByZWRpY3Rp b24KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgRlVOQyhwcmVkX21pcCkodWludDhfdCAq X3NyYywgY29uc3QgdWludDhfdCAqX3RvcCwKKyAgICBjb25zdCB1aW50OF90ICpfbGVmdCwgY29u c3QgaW50IHcsIGNvbnN0IGludCBoLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgIGludCBt b2RlX2lkLCBpbnQgaXNfdHJhbnNwb3NlZCkKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICA9IChw aXhlbCAqKV9zcmM7CisgICAgY29uc3QgcGl4ZWwgKnRvcCAgPSAoY29uc3QgcGl4ZWwgKilfdG9w OworICAgIGNvbnN0IHBpeGVsICpsZWZ0ID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisKKyAgICBj b25zdCBpbnQgc2l6ZV9pZCA9IGZmX3Z2Y19nZXRfbWlwX3NpemVfaWQodywgaCk7CisgICAgc3Rh dGljIGNvbnN0IGludCBib3VuZGFyeV9zaXplc1tdID0gezIsIDQsIDR9OworICAgIHN0YXRpYyBj b25zdCBpbnQgcHJlZF9zaXplc1tdID0gezQsIDQsIDh9OworICAgIGNvbnN0IGludCBib3VuZGFy eV9zaXplID0gYm91bmRhcnlfc2l6ZXNbc2l6ZV9pZF07CisgICAgY29uc3QgaW50IHByZWRfc2l6 ZSAgICAgPSBwcmVkX3NpemVzW3NpemVfaWRdOworICAgIGNvbnN0IGludCBpbl9zaXplID0gMiAq IGJvdW5kYXJ5X3NpemUgLSAoKHNpemVfaWQgPT0gMikgPyAxIDogMCk7CisgICAgY29uc3QgdWlu dDhfdCAqbWF0cml4ID0gZmZfdnZjX2dldF9taXBfbWF0cml4KHNpemVfaWQsIG1vZGVfaWQpOwor ICAgIGNvbnN0IGludCB1cF9ob3IgPSB3IC8gcHJlZF9zaXplOworICAgIGNvbnN0IGludCB1cF92 ZXIgPSBoIC8gcHJlZF9zaXplOworCisgICAgaW50IHJlZHVjZWRbMTZdOworICAgIGludCAqcmVk X3QgID0gcmVkdWNlZDsKKyAgICBpbnQgKnJlZF9sICA9IHJlZHVjZWQgKyBib3VuZGFyeV9zaXpl OworICAgIGludCBvZmYgPSAxLCBvdyA9IDA7CisgICAgaW50IHRlbXAwOworCisgICAgaWYgKGlz X3RyYW5zcG9zZWQpIHsKKyAgICAgICAgRkZTV0FQKGludCosIHJlZF90LCByZWRfbCk7CisgICAg fQorICAgIEZVTkMobWlwX2Rvd25zYW1wbGluZykocmVkX3QsIGJvdW5kYXJ5X3NpemUsIHRvcCwg dyk7CisgICAgRlVOQyhtaXBfZG93bnNhbXBsaW5nKShyZWRfbCwgYm91bmRhcnlfc2l6ZSwgbGVm dCwgaCk7CisKKyAgICB0ZW1wMCA9IHJlZHVjZWRbMF07CisgICAgaWYgKHNpemVfaWQgIT0gMikg eworICAgICAgICBvZmYgPSAwOworICAgICAgICBvdyA9ICgxIDw8IChCSVRfREVQVEggLSAxKSkg LSB0ZW1wMDsKKyAgICB9IGVsc2UgeworICAgICAgICBvdyA9IHJlZHVjZWRbMV0gLSB0ZW1wMDsK KyAgICB9CisgICAgcmVkdWNlZFswXSA9IG93OworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaW5f c2l6ZTsgaSsrKSB7CisgICAgICAgIHJlZHVjZWRbaV0gPSByZWR1Y2VkW2kgKyBvZmZdIC0gdGVt cDA7CisgICAgICAgIG93ICs9IHJlZHVjZWRbaV07CisgICAgfQorICAgIG93ID0gMzIgLSAzMiAq IG93OworCisgICAgRlVOQyhtaXBfcmVkdWNlZF9wcmVkKShzcmMsIHN0cmlkZSwgdXBfaG9yLCB1 cF92ZXIsIHByZWRfc2l6ZSwgcmVkdWNlZCwgaW5fc2l6ZSwgb3csIHRlbXAwLCBtYXRyaXgsIGlz X3RyYW5zcG9zZWQpOworICAgIGlmICh1cF9ob3IgPiAxIHx8IHVwX3ZlciA+IDEpIHsKKyAgICAg ICAgaWYgKHVwX2hvciA+IDEpCisgICAgICAgICAgICBGVU5DKG1pcF91cHNhbXBsaW5nXzFkKSgm UE9TKDAsIHVwX3ZlciAtIDEpLCAxLCB1cF92ZXIgKiBzdHJpZGUsIHByZWRfc2l6ZSwgdXBfaG9y LCBsZWZ0ICsgdXBfdmVyIC0gMSwgdXBfdmVyLCBwcmVkX3NpemUpOworICAgICAgICBpZiAodXBf dmVyID4gMSkKKyAgICAgICAgICAgIEZVTkMobWlwX3Vwc2FtcGxpbmdfMWQpKHNyYywgc3RyaWRl LCAxLCB3LCB1cF92ZXIsIHRvcCwgMSwgcHJlZF9zaXplKTsKKyAgICB9Cit9CisKK3N0YXRpYyBh dl9hbHdheXNfaW5saW5lIHBpeGVsIEZVTkMocHJlZF9kY192YWwpKGNvbnN0IHBpeGVsICp0b3As IGNvbnN0IHBpeGVsICpsZWZ0LAorICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCkKK3sKKyAg ICBwaXhlbCBkY192YWw7CisgICAgaW50IHN1bSA9IDA7CisgICAgdW5zaWduZWQgaW50IG9mZnNl dCA9ICh3ID09IGgpID8gKHcgPDwgMSkgOiBGRk1BWCh3LCBoKTsKKyAgICBjb25zdCBpbnQgc2hp ZnQgPSBhdl9sb2cyKG9mZnNldCk7CisgICAgb2Zmc2V0ID4+PSAxOworICAgIGlmICh3ID49IGgp IHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3OyBpKyspCisgICAgICAgICAgICBzdW0g Kz0gdG9wW2ldOworICAgIH0KKyAgICBpZiAodyA8PSBoKSB7CisgICAgICAgIGZvciAoaW50IGkg PSAwOyBpIDwgaDsgaSsrKQorICAgICAgICAgICAgc3VtICs9IGxlZnRbaV07CisgICAgfQorICAg IGRjX3ZhbCA9IChzdW0gKyBvZmZzZXQpID4+IHNoaWZ0OworICAgIHJldHVybiBkY192YWw7Cit9 CisKKy8vOC40LjUuMi4xMiBTcGVjaWZpY2F0aW9uIG9mIElOVFJBX0RDIGludHJhIHByZWRpY3Rp b24gbW9kZQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHByZWRfZGMpKHVpbnQ4 X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKl90b3AsCisgICAgY29uc3QgdWludDhfdCAqX2xlZnQs IGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAg ICBpbnQgeCwgeTsKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3NyYzsKKyAg ICBjb25zdCBwaXhlbCAqdG9wICAgID0gKGNvbnN0IHBpeGVsICopX3RvcDsKKyAgICBjb25zdCBw aXhlbCAqbGVmdCAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisgICAgY29uc3QgcGl4ZWwgZGMg ICAgICA9IEZVTkMocHJlZF9kY192YWwpKHRvcCwgbGVmdCwgdywgaCk7CisgICAgY29uc3QgcGl4 ZWw0IGEgICAgICA9IFBJWEVMX1NQTEFUX1g0KGRjKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsg eSsrKSB7CisgICAgICAgIHBpeGVsICpzID0gc3JjOworICAgICAgICBmb3IgKHggPSAwOyB4IDwg dzsgeCArPSA0KSB7CisgICAgICAgICAgICBBVl9XTjRQKHMsIGEpOworICAgICAgICAgICAgcyAr PSA0OworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0 aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIEZVTkMocHJlZF92KSh1aW50OF90ICpfc3JjLCBjb25z dCB1aW50OF90ICpfdG9wLAorICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29uc3QgcHRy ZGlmZl90IHN0cmlkZSkKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVsICopX3Ny YzsKKyAgICBjb25zdCBwaXhlbCAqdG9wICAgID0gKGNvbnN0IHBpeGVsICopX3RvcDsKKyAgICBm b3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBtZW1jcHkoc3JjLCB0b3AsIHNp emVvZihwaXhlbCkgICogdyk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitz dGF0aWMgdm9pZCBGVU5DKHByZWRfaCkodWludDhfdCAqX3NyYywgY29uc3QgdWludDhfdCAqX2xl ZnQsIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwKKyAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRl KQoreworICAgIHBpeGVsICpzcmMgICAgICAgICAgPSAocGl4ZWwgKilfc3JjOworICAgIGNvbnN0 IHBpeGVsICpsZWZ0ICAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQ7CisgICAgZm9yIChpbnQgeSA9 IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgY29uc3QgcGl4ZWw0IGEgPSBQSVhFTF9TUExBVF9Y NChsZWZ0W3ldKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4ICs9IDQpIHsKKyAg ICAgICAgICAgIEFWX1dONFAoJlBPUyh4LCB5KSwgYSk7CisgICAgICAgIH0KKyAgICB9Cit9CisK KyNkZWZpbmUgSU5UUkFfTFVNQV9GSUxURVIocCkgICAgQ0xJUCgocFswXSAqIGZbMF0gKyBwWzFd ICogZlsxXSArIHBbMl0gKiBmWzJdICsgcFszXSAqIGZbM10gKyAzMikgPj4gNikKKyNkZWZpbmUg SU5UUkFfQ0hST01BX0ZJTFRFUihwKSAgKCgoMzIgLSBmYWN0KSAqIHBbMV0gKyBmYWN0ICogcFsy XSArIDE2KSA+PiA1KQorCisvLzguNC41LjIuMTMgU3BlY2lmaWNhdGlvbiBvZiBJTlRSQV9BTkdV TEFSMi4uSU5UUkFfQU5HVUxBUjY2IGludHJhIHByZWRpY3Rpb24gbW9kZXMKK3N0YXRpYyB2b2lk IEZVTkMocHJlZF9hbmd1bGFyX3YpKHVpbnQ4X3QgKl9zcmMsIGNvbnN0IHVpbnQ4X3QgKl90b3As IGNvbnN0IHVpbnQ4X3QgKl9sZWZ0LAorICAgIGNvbnN0IGludCB3LCBjb25zdCBpbnQgaCwgY29u c3QgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgaW50IGNfaWR4LCBjb25zdCBpbnQgbW9kZSwKKyAg ICBjb25zdCBpbnQgcmVmX2lkeCwgY29uc3QgaW50IGZpbHRlcl9mbGFnLCBjb25zdCBpbnQgbmVl ZF9wZHBjKQoreworICAgIHBpeGVsICpzcmMgICAgICAgICAgPSAocGl4ZWwgKilfc3JjOworICAg IGNvbnN0IHBpeGVsICpsZWZ0ICAgPSAoY29uc3QgcGl4ZWwgKilfbGVmdDsKKyAgICBjb25zdCBw aXhlbCAqdG9wICAgID0gKGNvbnN0IHBpeGVsICopX3RvcCAtICgxICsgcmVmX2lkeCk7CisgICAg Y29uc3QgaW50IGludHJhX3ByZWRfYW5nbGUgPSBmZl92dmNfaW50cmFfcHJlZF9hbmdsZV9kZXJp dmUobW9kZSk7CisgICAgaW50IHBvcyA9ICgxICsgcmVmX2lkeCkgKiBpbnRyYV9wcmVkX2FuZ2xl OworICAgIGNvbnN0IGludCBkcCA9IGludHJhX3ByZWRfYW5nbGU7CisgICAgY29uc3QgaW50IGlz X2x1bWEgPSAhY19pZHg7CisgICAgaW50IG5zY2FsZSwgaW52X2FuZ2xlOworCisgICAgaWYgKG5l ZWRfcGRwYykgeworICAgICAgICBpbnZfYW5nbGUgPSBmZl92dmNfaW50cmFfaW52X2FuZ2xlX2Rl cml2ZShpbnRyYV9wcmVkX2FuZ2xlKTsKKyAgICAgICAgbnNjYWxlID0gZmZfdnZjX25zY2FsZV9k ZXJpdmUodywgaCwgbW9kZSk7CisgICAgfQorCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5 KyspIHsKKyAgICAgICAgY29uc3QgaW50IGlkeCAgID0gKHBvcyA+PiA1KSArIHJlZl9pZHg7Cisg ICAgICAgIGNvbnN0IGludCBmYWN0ID0gcG9zICYgMzE7CisgICAgICAgIGlmICghZmFjdCAmJiAo IWlzX2x1bWEgfHwgIWZpbHRlcl9mbGFnKSkgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7 IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCAqcCA9IHRvcCArIHgg KyBpZHggKyAxOworICAgICAgICAgICAgICAgIFBPUyh4LCB5KSA9ICpwOworICAgICAgICAgICAg fQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFjX2lkeCkgeworICAgICAgICAg ICAgICAgIGNvbnN0IGludDhfdCAqZiA9IGZmX3Z2Y19pbnRyYV9sdW1hX2ZpbHRlcltmaWx0ZXJf ZmxhZ11bZmFjdF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4Kysp IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnAgPSB0b3AgKyB4ICsgaWR4Owor ICAgICAgICAgICAgICAgICAgICBQT1MoeCwgeSkgPSBJTlRSQV9MVU1BX0ZJTFRFUihwKTsKKyAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZv ciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBp eGVsICpwID0gdG9wICsgeCArIGlkeDsKKyAgICAgICAgICAgICAgICAgICAgUE9TKHgsIHkpID0g SU5UUkFfQ0hST01BX0ZJTFRFUihwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9 CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRfcGRwYykgeworICAgICAgICAgICAgaW50IGlu dl9hbmdsZV9zdW0gPSAyNTYgKyBpbnZfYW5nbGU7CisgICAgICAgICAgICBmb3IgKGludCB4ID0g MDsgeCA8IEZGTUlOKHcsIDMgPDwgbnNjYWxlKTsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29u c3QgcGl4ZWwgbCAgID0gbGVmdFt5ICsgKGludl9hbmdsZV9zdW0gPj4gOSldOworICAgICAgICAg ICAgICAgIGNvbnN0IHBpeGVsIHZhbCA9IFBPUyh4LCB5KTsKKyAgICAgICAgICAgICAgICBjb25z dCBpbnQgd2wgICAgPSAzMiA+PiAoKHggPDwgMSkgPj4gbnNjYWxlKTsKKyAgICAgICAgICAgICAg ICBjb25zdCBpbnQgcHJlZCAgPSB2YWwgKyAoKChsIC0gdmFsKSAqIHdsICsgMzIpID4+IDYpOwor ICAgICAgICAgICAgICAgIFBPUyh4LCB5KSA9IENMSVAocHJlZCk7CisgICAgICAgICAgICAgICAg aW52X2FuZ2xlX3N1bSArPSBpbnZfYW5nbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg ICAgICAgcG9zICs9IGRwOworICAgIH0KK30KKworLy84LjQuNS4yLjEzIFNwZWNpZmljYXRpb24g b2YgSU5UUkFfQU5HVUxBUjIuLklOVFJBX0FOR1VMQVI2NiBpbnRyYSBwcmVkaWN0aW9uIG1vZGVz CitzdGF0aWMgdm9pZCBGVU5DKHByZWRfYW5ndWxhcl9oKSh1aW50OF90ICpfc3JjLCBjb25zdCB1 aW50OF90ICpfdG9wLCBjb25zdCB1aW50OF90ICpfbGVmdCwKKyAgICBjb25zdCBpbnQgdywgY29u c3QgaW50IGgsIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IGludCBjX2lkeCwgY29uc3Qg aW50IG1vZGUsCisgICAgY29uc3QgaW50IHJlZl9pZHgsIGNvbnN0IGludCBmaWx0ZXJfZmxhZywg Y29uc3QgaW50IG5lZWRfcGRwYykKK3sKKyAgICBwaXhlbCAqc3JjICAgICAgICAgID0gKHBpeGVs ICopX3NyYzsKKyAgICBjb25zdCBwaXhlbCAqbGVmdCAgID0gKGNvbnN0IHBpeGVsICopX2xlZnQg LSAoMSArIHJlZl9pZHgpOworICAgIGNvbnN0IHBpeGVsICp0b3AgICAgPSAoY29uc3QgcGl4ZWwg KilfdG9wOworICAgIGNvbnN0IGludCBpc19sdW1hID0gIWNfaWR4OworICAgIGNvbnN0IGludCBp bnRyYV9wcmVkX2FuZ2xlID0gZmZfdnZjX2ludHJhX3ByZWRfYW5nbGVfZGVyaXZlKG1vZGUpOwor ICAgIGNvbnN0IGludCBkcCA9IGludHJhX3ByZWRfYW5nbGU7CisgICAgaW50IG5zY2FsZSA9IDAs IGludl9hbmdsZSwgaW52X2FuZ2xlX3N1bTsKKworICAgIGlmIChuZWVkX3BkcGMpIHsKKyAgICAg ICAgaW52X2FuZ2xlID0gZmZfdnZjX2ludHJhX2ludl9hbmdsZV9kZXJpdmUoaW50cmFfcHJlZF9h bmdsZSk7CisgICAgICAgIGludl9hbmdsZV9zdW0gPSAyNTYgKyBpbnZfYW5nbGU7CisgICAgICAg IG5zY2FsZSA9IGZmX3Z2Y19uc2NhbGVfZGVyaXZlKHcsIGgsIG1vZGUpOworICAgIH0KKworICAg IGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGludCBwb3MgPSAoMSArIHJl Zl9pZHgpICogaW50cmFfcHJlZF9hbmdsZTsKKyAgICAgICAgaW50IHd0OworICAgICAgICBpZiAo bmVlZF9wZHBjKQorICAgICAgICAgICAgd3QgPSAoMzIgPj4gKCh5ICogMikgPj4gbnNjYWxlKSk7 CisKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGNv bnN0IGludCBpZHggID0gKHBvcyA+PiA1KSArIHJlZl9pZHg7CisgICAgICAgICAgICBjb25zdCBp bnQgZmFjdCA9IHBvcyAmIDMxOworICAgICAgICAgICAgY29uc3QgcGl4ZWwgKnAgPSBsZWZ0ICsg eSArIGlkeDsKKyAgICAgICAgICAgIGludCBwcmVkOworICAgICAgICAgICAgaWYgKCFmYWN0ICYm ICghaXNfbHVtYSB8fCAhZmlsdGVyX2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgcHJlZCA9IHBb MV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghY19pZHgpIHsK KyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmID0gZmZfdnZjX2ludHJhX2x1bWFf ZmlsdGVyW2ZpbHRlcl9mbGFnXVtmYWN0XTsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IElO VFJBX0xVTUFfRklMVEVSKHApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg ICAgICAgICAgIHByZWQgPSBJTlRSQV9DSFJPTUFfRklMVEVSKHApOworICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZWVkX3BkcGMpIHsKKyAgICAgICAg ICAgICAgICBpZiAoeSA8ICgzIDw8IG5zY2FsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29u c3QgcGl4ZWwgdCA9IHRvcFt4ICsgKGludl9hbmdsZV9zdW0gPj4gOSldOworICAgICAgICAgICAg ICAgICAgICBwcmVkID0gQ0xJUChwcmVkICsgKCgodCAtIHByZWQpICogd3QgKyAzMikgPj4gNikp OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBPUyh4LCB5 KSA9IHByZWQ7CisgICAgICAgICAgICBwb3MgKz0gZHA7CisgICAgICAgIH0KKyAgICAgICAgaWYg KG5lZWRfcGRwYykKKyAgICAgICAgICAgIGludl9hbmdsZV9zdW0gKz0gaW52X2FuZ2xlOworICAg IH0KK30KKworc3RhdGljIHZvaWQgRlVOQyhmZl92dmNfaW50cmFfZHNwX2luaXQpKFZWQ0ludHJh RFNQQ29udGV4dCAqY29uc3QgaW50cmEpCit7CisgICAgaW50cmEtPmxtY3Nfc2NhbGVfY2hyb21h ICA9IEZVTkMobG1jc19zY2FsZV9jaHJvbWEpOworICAgIGludHJhLT5pbnRyYV9jY2xtX3ByZWQg ICAgPSBGVU5DKGludHJhX2NjbG1fcHJlZCk7CisgICAgaW50cmEtPmludHJhX3ByZWQgICAgICAg ICA9IEZVTkMoaW50cmFfcHJlZCk7CisgICAgaW50cmEtPnByZWRfcGxhbmFyICAgICAgICA9IEZV TkMocHJlZF9wbGFuYXIpOworICAgIGludHJhLT5wcmVkX21pcCAgICAgICAgICAgPSBGVU5DKHBy ZWRfbWlwKTsKKyAgICBpbnRyYS0+cHJlZF9kYyAgICAgICAgICAgID0gRlVOQyhwcmVkX2RjKTsK KyAgICBpbnRyYS0+cHJlZF92ICAgICAgICAgICAgID0gRlVOQyhwcmVkX3YpOworICAgIGludHJh LT5wcmVkX2ggICAgICAgICAgICAgPSBGVU5DKHByZWRfaCk7CisgICAgaW50cmEtPnByZWRfYW5n dWxhcl92ICAgICA9IEZVTkMocHJlZF9hbmd1bGFyX3YpOworICAgIGludHJhLT5wcmVkX2FuZ3Vs YXJfaCAgICAgPSBGVU5DKHByZWRfYW5ndWxhcl9oKTsKK30KLS0gCjIuMjUuMQoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZmZtcGVnLWRldmVsIG1haWxp bmcgbGlzdApmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZwpodHRwczovL2ZmbXBlZy5vcmcvbWFpbG1h bi9saXN0aW5mby9mZm1wZWctZGV2ZWwKClRvIHVuc3Vic2NyaWJlLCB2aXNpdCBsaW5rIGFib3Zl LCBvciBlbWFpbApmZm1wZWctZGV2ZWwtcmVxdWVzdEBmZm1wZWcub3JnIHdpdGggc3ViamVjdCAi dW5zdWJzY3JpYmUiLgo=