Received: by 2002:a05:6602:2086:0:0:0:0 with SMTP id a6csp4364340ioa; Wed, 27 Apr 2022 02:02:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwAK8UIy9czrv7dKbCLAQWnHIsTf/MqJ6gpQS9lMHGXhIY+Exiq9LJPCEkcu94Mih8dF8oE X-Received: by 2002:a63:79c4:0:b0:3aa:36aa:9658 with SMTP id u187-20020a6379c4000000b003aa36aa9658mr23419595pgc.257.1651050119542; Wed, 27 Apr 2022 02:01:59 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1651050119; cv=pass; d=google.com; s=arc-20160816; b=zAYzv3by64AaqRSCFQxEPeH4vsGIHmK2Y9COW8biuqKyd4IGvigAH2AmAx1mClnT97 +cgTbtdrA+GG0XA2Pt6n2KLxVU17rqKwAvOzlNsuhrpIev2Qo1VSBWXMC61TAVYJEs5m d8SrnkIb2TcWerCHiL1j+eP3uIcVXVjiDVj4HnqdvinG0ztodu4/GTnMzRIcWgr/rQhC Vx1nqPJtaQl0hAspc+axaYfsVaZ1QJbWPn7jEI0RfGYyBJ16Tt8CfZr8PVL5cEofy4r0 keTjqxxw6IQG2+XAiaIkW2yaS7C6LhRohTxmS3WMbzRx2bJfHa9hutCJ0EZFhkRkMY6K YwkQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :content-id:content-language:accept-language:in-reply-to:references :message-id:date:thread-index:thread-topic:subject:to:from :dkim-signature:dkim-signature; bh=O4C1rp5oaoAv0d4CCtVdHVcRoC/p1hBqQxvwZn4Qhso=; b=iA//pzl7Y3u1W/qfHxDcG/5aIuS0kKfF762Sz8RVbhlemv4UrRsRmDPfNKaUkQfWS5 MPsfg7h3Np5ip35ui8XVXqPmEtkGMZPdoPvWSMYcSgXVCImIyR4vzxdL/y49q772nugF AD3UXHGzz9/prDdaoyc/5X5tZJsZ3ihxm5AXoo2AHt8h1JFkmVO7ryrHPQaGo61lRl4n cAkPzC7pYIW33f2GD3JBhBiS7R7oN/sWwXun87bnqVtidOAJSi4Ankcu8+LaB7EapA46 8ag29AxEZJ92lYkxU0+b15nHW2sS9zpslm/2gplgzbg2twjy7qsn+uDObAEuZkyWtklD Afhg== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2021-07-09 header.b=WmD4qoqo; dkim=pass header.i=@oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=sZRS3ffY; arc=pass (i=1 spf=pass spfdomain=oracle.com dkim=pass dkdomain=oracle.com dmarc=pass fromdomain=oracle.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id h4-20020a170902704400b00153b2d16643si946341plt.587.2022.04.27.02.01.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Apr 2022 02:01:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2021-07-09 header.b=WmD4qoqo; dkim=pass header.i=@oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=sZRS3ffY; arc=pass (i=1 spf=pass spfdomain=oracle.com dkim=pass dkdomain=oracle.com dmarc=pass fromdomain=oracle.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 138FB5FF4; Wed, 27 Apr 2022 01:55:12 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352025AbiDZPPZ (ORCPT + 99 others); Tue, 26 Apr 2022 11:15:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45512 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352041AbiDZPKI (ORCPT ); Tue, 26 Apr 2022 11:10:08 -0400 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 29122156E2B for ; Tue, 26 Apr 2022 08:06:57 -0700 (PDT) Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 23QDT5PC025808; Tue, 26 Apr 2022 15:06:37 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2021-07-09; bh=O4C1rp5oaoAv0d4CCtVdHVcRoC/p1hBqQxvwZn4Qhso=; b=WmD4qoqovI74a0+EYCadtgx+/6TL9TEVXErNaGkGzRMUlBCEWezQf2dgfOmr2JRbbTWi udtpeSB07KyhriXpJw3T7j8hZdSbDhDA4BjATfXII4BzfA/EkhmB0/LxsYOEDH2TZkaU aR2MnXmRbQp+xs6rkTwrwLHa3o27PJnGRnRErzp8ziY+QH3ZwuRND0xgTJMU/qpep175 Fo1/S9fruXrTz04TtjWgWVVSxbqmyO1OUXeBFhpmCE2zEwDDpct+4A8QnMEm29GtsvvU 7iRkuf44C2UzgpbcYLRUSBJjLRTztOcaL4NRVTuGXJmRmpZMUdLbDy2tIAiEsJssFzE+ Ug== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3fmb1mpdbe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Apr 2022 15:06:34 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 23QF55Nn019220; Tue, 26 Apr 2022 15:06:32 GMT Received: from nam04-bn8-obe.outbound.protection.outlook.com (mail-bn8nam08lp2049.outbound.protection.outlook.com [104.47.74.49]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com with ESMTP id 3fm7w3fdte-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Apr 2022 15:06:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dBIMyjXjmtn+Jf9gOw/9WHs8g4VFFtgh0EsPHBztCoZKahCCtMCXqsw7WqqfmqPoW/flNceJuW1U38hnwHqRwk+keSj+1MS2b0x78kklxjl4WPy6mACTPCWGX7xsWBK/Nz7JPTInaz8uSc5w08jflGkod/YEz5ozlbfB6ExVrti8qyRwpjPpa6ZJ8iZNxiy40B60xbMz2ZEhlp32ediP+OEMrbZx8RAvlBEvbXQ0H+B05xdBqwzm/EHPVoYZLJrSOV8jjbbGLRMtbwCNk6qtCYInu6dd9yigvviVI4U5csR9j8diLvEWo8dnVdeoea6IgflECugk4CoGoF8BxCw7ag== 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=O4C1rp5oaoAv0d4CCtVdHVcRoC/p1hBqQxvwZn4Qhso=; b=h3OC5CWqMyjsdkGExNH7PdmPkwTk1riC881LG/9YVWI/PvRbSOX2ixUyyGZcxCbK5canDzJfcUnoMz/9XL+ts0odDiSSZMSfwMhFBE3lq5rAwc+RSCI8qhEr6n93qL6juGjvT8aqditMSTWSfmeX9SkXBKEGEY/n+qqOsuZMD27AjUp03mY7KYbmXzguIM/rEmPzj5vIKOn5swcQEKQpzOorWTRCP1f8+BaYaroplfz1UJjTgjlkfA32Vie0G1Yv3i27HhKPsLaVhWAbjBBP/gaJkgrDa9XnrkldWMxj0SDGx+Fem7squaKPjc5p5wCGPTr+tWSfi6BGTthT0IAoDw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=O4C1rp5oaoAv0d4CCtVdHVcRoC/p1hBqQxvwZn4Qhso=; b=sZRS3ffY6MepgGbM0qwizWnr7oN96EGCxxEJP+B+VNSQ+LzzCeCFLgRD00ps1Mb04O6s2L7iiOTpdpzqPkAvd1xb6D9H4m2fxeaKdp8B6XTAD5R3yGyrG7AHqDCAGXYux2HWr2DMXoz/jowRV6IP5sSL+bW2AOKA89zBTIn34xY= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by CO1PR10MB4659.namprd10.prod.outlook.com (2603:10b6:303:6c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5186.13; Tue, 26 Apr 2022 15:06:24 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::318c:d02:2280:c2c]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::318c:d02:2280:c2c%7]) with mapi id 15.20.5186.021; Tue, 26 Apr 2022 15:06:24 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton , Yu Zhao Subject: [PATCH v8 07/70] Maple Tree: add new data structure Thread-Topic: [PATCH v8 07/70] Maple Tree: add new data structure Thread-Index: AQHYWX8xSSM1+tzOcEyFIm1CLlcAkw== Date: Tue, 26 Apr 2022 15:06:24 +0000 Message-ID: <20220426150616.3937571-8-Liam.Howlett@oracle.com> References: <20220426150616.3937571-1-Liam.Howlett@oracle.com> In-Reply-To: <20220426150616.3937571-1-Liam.Howlett@oracle.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.35.1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 2d60cc03-99fe-4f1b-cab3-08da2796548d x-ms-traffictypediagnostic: CO1PR10MB4659:EE_ x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Z1szrpaGzv1wyfTab6QITrU4NYfy1TYHMIKKh/UGbFFPpxOfQd7wDJWjXqI0sN+9Ewrab7OgZCRSGKeZSXvsIEpbZgnSe5Ck/7GEgSA71Gnn2jkpMMkNH2aF4X1nHm7Cuw2B9xCntdgbKrwH/AXg0qTR80dtXVLG6rkPi/xK3SMYn8TuGPFlVP845jqpkSKkkNe4uOLLGQIu/d3R21HqEDWCvwgREnF5soeuPyQueEBU7QMf8pU20i03JJgE8kvX16MO+Akx1roO23YBQRJNNc2le4f3w9w/kFgmcKF8HpaQtpDwzLzwNpHF0HPqDkKu3hsMDaQKQbcDjuUyf3v7HrG4NAcQGfec5IcgnG30aoJ9GLRcspL31R5r8u0lfSyI8NCHB7xBndv9GIRQLzDZwejCvr82of/XheDL/Zx8NObmtLEi5yz1MUH7QteMbs6dlBVEcO0NorFrQBciZR66PyJ9m2Cay52BtN4X3vW+t/KsHPgWPu1nmrsyr+n/2gXwWD5sFeqNemhHiYUEHc0RMbFn4w7q/CRDJNjFfWZPWxUeySTy9c4vpdvd6gAIvd8YMWMaaY1I97hZTFJYjng/+wf4r8T43n85O22iSXJ/u35K9KTzGV8AZYQOBgtGaQXD1gTOo+/7sHCxlceTm0Bi95m4sOrmWKp36VkIv12KiFpOiLrtzzb6aXuib4NCySETYlDxjOPGJMz06vs1MtTe5Y0JrzPXaJS2WOQzp++yjA6zgbL8d92Wfqv6EYzkZ1EuKZcL5/BNumTzD+uZMXBQrjrqZqjGgcaLCsqqRH0G5ApYoTZXHK6vXuBXavhRo4NA x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN6PR10MB3022.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(91956017)(66946007)(66446008)(2906002)(76116006)(508600001)(966005)(122000001)(316002)(30864003)(8676002)(71200400001)(5660300002)(110136005)(44832011)(8936002)(64756008)(86362001)(66476007)(66556008)(38070700005)(38100700002)(6486002)(1076003)(186003)(6512007)(36756003)(26005)(83380400001)(2616005)(6506007)(579004)(559001)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?Yk9CUmlDaFArVU96MGoydUFFVTFxYlppYTlYUFRxSG93bExieVAxaFJtSE9V?= =?utf-8?B?MWZzOTNadmx1UUNQdkQrNHZ1aXoyWHJrS0tTYmlpOE1FTjlwcDVmSjJFSjlJ?= =?utf-8?B?TytyMm1ibG9iQWVjYVlySElLL0xObnZCb2NSZFVRMTQvV2xNU1M1MWFlYVlR?= =?utf-8?B?N3dSblc1V2VuaStKelhWUWhUcWxkYUR5N1JneXZxcWkxUG1iUVNNVlA0Q3Zo?= =?utf-8?B?aklNWnA5eFF5VWJKZEs0ZkdZWUNmZ05TM0R6Z2R4NHAyai9FZ25qSkRSVDJj?= =?utf-8?B?RVB4eVp0cGlLV1ZNRytoZlVVUitUTTZQaEl6NGorZmdoRWIya3NlQ2FWTTBy?= =?utf-8?B?U2p5Ry9WQW1ZTERrNEN6TmtnNStFVHI4dHQvL0M1NU9hT2FXS1ZzL01NTEEx?= =?utf-8?B?cS80RFlxOU96TnV2RFp5aFhUVjc0cXZXSE5MTUQwTTlhZ254bVhlYlJ2eksx?= =?utf-8?B?WlljWGlxQVp0T0o3Sytib3I1ZG80bzcrNDZWd1ZFaFVPUVlXNW9TTkFGcmFQ?= =?utf-8?B?VzB3dFZwa3FVSzU3UmJ6aHRzM0kxU3R5RGxMYW0rQzNsOFNtcFI0eXAvMU53?= =?utf-8?B?T2NkM0dGK09mY0hvaFRQR1JnKzZuWGVvVGNhY3ZiYmkxWkxQeXdWWDRHekIw?= =?utf-8?B?QVUyVE5qY2JiR0dSaHdQWGdBV3drV1l6dXJXZ1NqTmdUTUM3dFVnNGxCYzlO?= =?utf-8?B?VFg1Tk9yZ3JXNVloVVVoT1VISDhsbWlSaXcvNkg4UldsYTU5VFhoV3dHeDg4?= =?utf-8?B?V2dRY05ZWHV4ZE9vbXZXeG5RYVlEajVETUpBdXhUTjRsbW05ZlhKUVkwMFMr?= =?utf-8?B?RXBzWHptSGtWcUJmQUpPY3dWOVg4dnNHNGlaMEF0MzFBS3hDVFcyTStRQlRs?= =?utf-8?B?U1RuZlEyb1lzcGxRd2dmNGNaV1dOVEFoUUtkYjlBK0QwbmZsOVNwNGo2TDE0?= =?utf-8?B?aXFhc25xS2pESlZmZWxvU3VkMnNzSmZCSkpOcGkraTIyMDdnaFk1R0ZyblZN?= =?utf-8?B?YTNKdGFtUXNFb044WXdaS01XSjhWNy9SU2pvTSt6K2FxM0NMZFhnUDJYYjBq?= =?utf-8?B?SkR1eGY1RTRVamd6TlVXUWFSV3VNQ1ljeEI2YVkzS0pKS01Jb3JEMFdGZW5U?= =?utf-8?B?b1N0d2NKSmRFeGlSUldDNVhmT3V1bnVXWFF4akN6dDFPM20yNDB5MDFwYUlo?= =?utf-8?B?akNTMW5ZT1pvT3VsUGt2eklmTE15Ulkwd3RrN3JkSDVZR3VreXljaHpBYitF?= =?utf-8?B?Yi9GZE9peW83VGdURUMwNFNnMi80S2pFNXRXc1hYQjR4VU8zc3FpVGZOU09w?= =?utf-8?B?R1ZDUVRBUWRHY29GWnZRMkozU3dBUEd2TzdRMnppT2QrS2tYTnlxc0duM085?= =?utf-8?B?bGhsREF4WHpCL0F0Nm9BQmNNYm1WdHg1dXlDYmw2aWpEQjRvKytmVjI4MDFM?= =?utf-8?B?K1U3NDZscHUzKzFqMXVCc2V1bnpzczdYc1RQRTlUVEQrN3NSNXRnQWpjTGJq?= =?utf-8?B?QkVEQVN4ZHhMNHVGcTAzNFZNSWZJY1VpYmtlWWIyUjZ5Z1hFSFpZbHhuUTds?= =?utf-8?B?WVdBK0RmQ3V1a2NVZVJiMTZFbFRFSlBEeTViUjlPUnFZU2NSWjlqRUFoWlor?= =?utf-8?B?aVN0V2xOZkRpOHRLTTYxK2U2c2tFWTdBNWU2NmhmTjRUc085amxtRVhGbHJx?= =?utf-8?B?RExFU1AwSmIxYkZmOGM3NFJHR0FNL0N5V2xuazBRTHR0V3N1a2hOSXVNUVo2?= =?utf-8?B?c0N1Ni9MMndHSGxmbTNPNk1xNzB0OVRHRmpsbWFXUTRqWEpSSUczZWw0ZXVP?= =?utf-8?B?VnQ1T3d3SlhMQW1Sa3ozSzhVL25SeU9mTVZ4YW96NlBndjRBK3ArNnExMFdR?= =?utf-8?B?M1FPazJLUHJpMG54Q1d3aUlaUCtiU3BncFRiREhsaW5zYjBpTTVEbGhHWHpX?= =?utf-8?B?M1NRbkRRQTNOLzJmUm5rZmY1M3ZUOXhGVStXQnB4Z0xJV0ZnVktDeEU5NFYx?= =?utf-8?B?aDRyQkRtOWdlaWVvcVU2aWV3UEdSaVJ4dkRPOG5BRHlmdFQzV0ZFNDdxMWFm?= =?utf-8?B?cG4vOFBIUGVtMUpvL0RaaXNlcGdmMWhNazY5MjI3ckFJS1JBZGYzRGdIWjZs?= =?utf-8?B?amdtYzZGMlphRm40SjIzZ25mNDBseC9rQU1YaThPc0NlbGMwSGM2c1VNSC96?= =?utf-8?B?M25zdmxVV0MwVTluOXREbUlFaHdLdzZNcUl4eFp5T3Ard2RPMTNBalZEYjdX?= =?utf-8?B?Z1o2aHJEdFFRRXVHYzQxNHJyOU4zRHJ1RFF0SFc5L1kzOHVCL3ZpUXQ1RU53?= =?utf-8?B?eSsyNGpZT0RvbGFPZnAvK1BuQU4xbFlGWTVnNk9DS212OXlHYW5UWGNWaTFE?= =?utf-8?Q?aJXgD3FL17kU+dps=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <6F038B5F3937A34F8BFBCB1CEF73B8EE@namprd10.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR10MB3022.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2d60cc03-99fe-4f1b-cab3-08da2796548d X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Apr 2022 15:06:24.2096 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Iy62yQr5jpCtDDj/vhzoYz1UtrYL4WjoA7+kGbbve9ddQQshlOrIEoLod3lgOlXhWrXnKZxZE9ABdTQEOeo8QQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR10MB4659 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.486,18.0.858 definitions=2022-04-26_04:2022-04-26,2022-04-26 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 spamscore=0 adultscore=0 mlxscore=0 bulkscore=0 suspectscore=0 malwarescore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2204260096 X-Proofpoint-GUID: OgrQ0UQAY50_XtoQgJKrWrvP54cLS_IN X-Proofpoint-ORIG-GUID: OgrQ0UQAY50_XtoQgJKrWrvP54cLS_IN X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpUaGUg bWFwbGUgdHJlZSBpcyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8g dXNlIG1vZGVybg0KcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVt YmVyIG9mIHBsYWNlcyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdl LWJhc2VkIHRyZWUgd291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBz aW1wbGUgaW50ZXJmYWNlLiAgVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMg cGF0Y2gNCnNldCBpcyB0aGUgdm1fYXJlYV9zdHJ1Y3QsIHdoZXJlIHRocmVlIGRhdGEgc3RydWN0 dXJlcyBhcmUgcmVwbGFjZWQgYnkgdGhlDQptYXBsZSB0cmVlOiB0aGUgYXVnbWVudGVkIHJidHJl ZSwgdGhlIHZtYSBjYWNoZSwgYW5kIHRoZSBsaW5rZWQgbGlzdCBvZg0KVk1BcyBpbiB0aGUgbW1f c3RydWN0LiAgVGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZSBvciByZW1vdmUgdGhlDQpt bWFwX3NlbSBjb250ZW50aW9uLg0KDQpUaGUgdHJlZSBoYXMgYSBicmFuY2hpbmcgZmFjdG9yIG9m IDEwIGZvciBub24tbGVhZiBub2RlcyBhbmQgMTYgZm9yIGxlYWYNCm5vZGVzLiAgV2l0aCB0aGUg aW5jcmVhc2VkIGJyYW5jaGluZyBmYWN0b3IsIGl0IGlzIHNpZ25pZmljYW50bHkgc2hvcnRlcg0K dGhhbiB0aGUgcmJ0cmVlIHNvIGl0IGhhcyBmZXdlciBjYWNoZSBtaXNzZXMuICBUaGUgcmVtb3Zh bCBvZiB0aGUgbGlua2VkDQpsaXN0IGJldHdlZW4gc3Vic2VxdWVudCBlbnRyaWVzIGFsc28gcmVk dWNlcyB0aGUgY2FjaGUgbWlzc2VzIGFuZCB0aGUgbmVlZA0KdG8gcHVsbCBpbiB0aGUgcHJldmlv dXMgYW5kIG5leHQgVk1BIGR1cmluZyBtYW55IHRyZWUgYWx0ZXJhdGlvbnMuDQoNClNpZ25lZC1v ZmYtYnk6IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20+DQpTaWduZWQt b2ZmLWJ5OiBNYXR0aGV3IFdpbGNveCAoT3JhY2xlKSA8d2lsbHlAaW5mcmFkZWFkLm9yZz4NClRl c3RlZC1ieTogRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4NCi0tLQ0KIERvY3Vt ZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0ICAgICAgICAgICAgICB8ICAgIDEgKw0KIERvY3Vt ZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgICAgICAgICB8ICAyMTggKw0KIE1BSU5U QUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTIgKw0KIGluY2x1 ZGUvbGludXgvbWFwbGVfdHJlZS5oICAgICAgICAgICAgICAgICAgICB8ICA2ODUgKysNCiBpbmNs dWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggICAgICAgICAgICAgfCAgMTIzICsNCiBpbml0 L21haW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyICsNCiBsaWIv S2NvbmZpZy5kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE1ICsNCiBsaWIv TWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzICstDQogbGli L21hcGxlX3RyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjk2NCArKysrKysr KysrKysrKysrKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8uZ2l0aWdub3JlICAgICAgICAg ICB8ICAgIDIgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5lcmF0ZWQvYXV0b2NvbmYu aCB8ICAgIDEgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgg ICB8ICAgIDcgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tYXBsZS5jICAgICAgICAgICAg ICB8ICAgNTkgKw0KIC4uLi9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggICAg ICB8ICAgIDMgKw0KIDE0IGZpbGVzIGNoYW5nZWQsIDgwOTQgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQ0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL21hcGxl X3RyZWUucnN0DQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5o DQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0K IGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvbWFwbGVfdHJlZS5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0 IHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgNCiBjcmVhdGUgbW9k ZSAxMDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMNCiBjcmVhdGUgbW9kZSAx MDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgN Cg0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0IGIvRG9jdW1l bnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCmluZGV4IDk3MmQ0NmE1ZGRmNi4uMWRkZjM3ZGNh NWZkIDEwMDY0NA0KLS0tIGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCisrKyBi L0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0DQpAQCAtMzQsNiArMzQsNyBAQCBMaWJy YXJ5IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4NCiAg ICBrcmVmDQogICAgYXNzb2NfYXJyYXkNCiAgICB4YXJyYXkNCisgICBtYXBsZV90cmVlDQogICAg aWRyDQogICAgY2lyY3VsYXItYnVmZmVycw0KICAgIHJidHJlZQ0KZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBp L21hcGxlX3RyZWUucnN0DQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAw Li5jOTUxNmEyZTAzMjQNCi0tLSAvZGV2L251bGwNCisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1h cGkvbWFwbGVfdHJlZS5yc3QNCkBAIC0wLDAgKzEsMjE4IEBADQorLi4gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjArDQorDQorDQorPT09PT09PT09PQ0KK01hcGxlIFRyZWUNCis9PT09 PT09PT09DQorDQorOkF1dGhvcjogTGlhbSBSLiBIb3dsZXR0DQorDQorT3ZlcnZpZXcNCis9PT09 PT09PQ0KKw0KK1RoZSBNYXBsZSBUcmVlIGlzIGEgQi1UcmVlIGRhdGEgdHlwZSB3aGljaCBpcyBv cHRpbWl6ZWQgZm9yIHN0b3JpbmcNCitub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLCBpbmNsdWRpbmcg cmFuZ2VzIG9mIHNpemUgMS4gIFRoZSB0cmVlIHdhcyBkZXNpZ25lZCB0bw0KK2JlIHNpbXBsZSB0 byB1c2UgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSB1c2VyIHdyaXR0ZW4gc2VhcmNoIG1ldGhvZC4g IEl0DQorc3VwcG9ydHMgaXRlcmF0aW5nIG92ZXIgYSByYW5nZSBvZiBlbnRyaWVzIGFuZCBnb2lu ZyB0byB0aGUgcHJldmlvdXMgb3IgbmV4dA0KK2VudHJ5IGluIGEgY2FjaGUtZWZmaWNpZW50IG1h bm5lci4gIFRoZSB0cmVlIGNhbiBhbHNvIGJlIHB1dCBpbnRvIGFuIFJDVS1zYWZlDQorbW9kZSBv ZiBvcGVyYXRpb24gd2hpY2ggYWxsb3dzIHJlYWRpbmcgYW5kIHdyaXRpbmcgY29uY3VycmVudGx5 LiAgV3JpdGVycyBtdXN0DQorc3luY2hyb25pemUgb24gYSBsb2NrLCB3aGljaCBjYW4gYmUgdGhl IGRlZmF1bHQgc3BpbmxvY2ssIG9yIHRoZSB1c2VyIGNhbiBzZXQNCit0aGUgbG9jayB0byBhbiBl eHRlcm5hbCBsb2NrIG9mIGEgZGlmZmVyZW50IHR5cGUuDQorDQorVGhlIE1hcGxlIFRyZWUgbWFp bnRhaW5zIGEgc21hbGwgbWVtb3J5IGZvb3RwcmludCBhbmQgd2FzIGRlc2lnbmVkIHRvIHVzZQ0K K21vZGVybiBwcm9jZXNzb3IgY2FjaGUgZWZmaWNpZW50bHkuICBUaGUgbWFqb3JpdHkgb2YgdGhl IHVzZXJzIHdpbGwgYmUgYWJsZSB0bw0KK3VzZSB0aGUgbm9ybWFsIEFQSS4gIEFuIDpyZWY6YG1h cGxlLXRyZWUtYWR2YW5jZWQtYXBpYCBleGlzdHMgZm9yIG1vcmUgY29tcGxleA0KK3NjZW5hcmlv cy4gIFRoZSBtb3N0IGltcG9ydGFudCB1c2FnZSBvZiB0aGUgTWFwbGUgVHJlZSBpcyB0aGUgdHJh Y2tpbmcgb2YgdGhlDQordmlydHVhbCBtZW1vcnkgYXJlYXMuDQorDQorVGhlIE1hcGxlIFRyZWUg Y2FuIHN0b3JlIHZhbHVlcyBiZXR3ZWVuIGBgMGBgIGFuZCBgYFVMT05HX01BWGBgLiAgVGhlIE1h cGxlDQorVHJlZSByZXNlcnZlcyB2YWx1ZXMgd2l0aCB0aGUgYm90dG9tIHR3byBiaXRzIHNldCB0 byAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0MDk2DQorKGllIDIsIDYsIDEwIC4uIDQwOTQpIGZvciBp bnRlcm5hbCB1c2UuICBJZiB0aGUgZW50cmllcyBtYXkgdXNlIHJlc2VydmVkDQorZW50cmllcyB0 aGVuIHRoZSB1c2VycyBjYW4gY29udmVydCB0aGUgZW50cmllcyB1c2luZyB4YV9ta192YWx1ZSgp IGFuZCBjb252ZXJ0DQordGhlbSBiYWNrIGJ5IGNhbGxpbmcgeGFfdG9fdmFsdWUoKS4gIElmIHRo ZSB1c2VyIG5lZWRzIHRvIHVzZSBhIHJlc2VydmVkDQordmFsdWUsIHRoZW4gdGhlIHVzZXIgY2Fu IGNvbnZlcnQgdGhlIHZhbHVlIHdoZW4gdXNpbmcgdGhlDQorOnJlZjpgbWFwbGUtdHJlZS1hZHZh bmNlZC1hcGlgLCBidXQgYXJlIGJsb2NrZWQgYnkgdGhlIG5vcm1hbCBBUEkuDQorDQorVGhlIE1h cGxlIFRyZWUgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IHNlYXJjaGluZyBmb3Ig YSBnYXAgb2YgYSBnaXZlbg0KK3NpemUgKG9yIGxhcmdlcikuDQorDQorUHJlLWFsbG9jYXRpbmcg b2Ygbm9kZXMgaXMgYWxzbyBzdXBwb3J0ZWQgdXNpbmcgdGhlDQorOnJlZjpgbWFwbGUtdHJlZS1h ZHZhbmNlZC1hcGlgLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHVzZXJzIHdobyBtdXN0IGd1YXJhbnRl ZSBhDQorc3VjY2Vzc2Z1bCBzdG9yZSBvcGVyYXRpb24gd2l0aGluIGEgZ2l2ZW4NCitjb2RlIHNl Z21lbnQgd2hlbiBhbGxvY2F0aW5nIGNhbm5vdCBiZSBkb25lLiAgQWxsb2NhdGlvbnMgb2Ygbm9k ZXMgYXJlDQorcmVsYXRpdmVseSBzbWFsbCBhdCBhcm91bmQgMjU2IGJ5dGVzLg0KKw0KKy4uIF9t YXBsZS10cmVlLW5vcm1hbC1hcGk6DQorDQorTm9ybWFsIEFQSQ0KKz09PT09PT09PT0NCisNCitT dGFydCBieSBpbml0aWFsaXNpbmcgYSBtYXBsZSB0cmVlLCBlaXRoZXIgd2l0aCBERUZJTkVfTVRS RUUoKSBmb3Igc3RhdGljYWxseQ0KK2FsbG9jYXRlZCBtYXBsZSB0cmVlcyBvciBtdF9pbml0KCkg Zm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmVzLiAgQQ0KK2ZyZXNobHktaW5pdGlhbGlzZWQg bWFwbGUgdHJlZSBjb250YWlucyBhIGBgTlVMTGBgIHBvaW50ZXIgZm9yIHRoZSByYW5nZSBgYDBg YA0KKy0gYGBVTE9OR19NQVhgYC4gIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIHR5cGVzIG9mIG1h cGxlIHRyZWVzIHN1cHBvcnRlZDogdGhlDQorYWxsb2NhdGlvbiB0cmVlIGFuZCB0aGUgcmVndWxh ciB0cmVlLiAgVGhlIHJlZ3VsYXIgdHJlZSBoYXMgYSBoaWdoZXIgYnJhbmNoaW5nDQorZmFjdG9y IGZvciBpbnRlcm5hbCBub2Rlcy4gIFRoZSBhbGxvY2F0aW9uIHRyZWUgaGFzIGEgbG93ZXIgYnJh bmNoaW5nIGZhY3Rvcg0KK2J1dCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VhcmNoIGZvciBhIGdhcCBv ZiBhIGdpdmVuIHNpemUgb3IgbGFyZ2VyIGZyb20gZWl0aGVyDQorYGAwYGAgdXB3YXJkcyBvciBg YFVMT05HX01BWGBgIGRvd24uICBBbiBhbGxvY2F0aW9uIHRyZWUgY2FuIGJlIHVzZWQgYnkNCitw YXNzaW5nIGluIHRoZSBgYE1UX0ZMQUdTX0FMTE9DX1JBTkdFYGAgZmxhZyB3aGVuIGluaXRpYWxp c2luZyB0aGUgdHJlZS4NCisNCitZb3UgY2FuIHRoZW4gc2V0IGVudHJpZXMgdXNpbmcgbXRyZWVf c3RvcmUoKSBvciBtdHJlZV9zdG9yZV9yYW5nZSgpLg0KK210cmVlX3N0b3JlKCkgd2lsbCBvdmVy d3JpdGUgYW55IGVudHJ5IHdpdGggdGhlIG5ldyBlbnRyeSBhbmQgcmV0dXJuIDAgb24NCitzdWNj ZXNzIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLiAgbXRyZWVfc3RvcmVfcmFuZ2UoKSB3b3Jr cyBpbiB0aGUgc2FtZSB3YXkNCitidXQgdGFrZXMgYSByYW5nZS4gIG10cmVlX2xvYWQoKSBpcyB1 c2VkIHRvIHJldHJpZXZlIHRoZSBlbnRyeSBzdG9yZWQgYXQgYQ0KK2dpdmVuIGluZGV4LiAgWW91 IGNhbiB1c2UgbXRyZWVfZXJhc2UoKSB0byBlcmFzZSBhbiBlbnRpcmUgcmFuZ2UgYnkgb25seQ0K K2tub3dpbmcgb25lIHZhbHVlIHdpdGhpbiB0aGF0IHJhbmdlLCBvciBtdHJlZV9zdG9yZSgpIGNh bGwgd2l0aCBhbiBlbnRyeSBvZg0KK05VTEwgbWF5IGJlIHVzZWQgdG8gcGFydGlhbGx5IGVyYXNl IGEgcmFuZ2Ugb3IgbWFueSByYW5nZXMgYXQgb25jZS4NCisNCitJZiB5b3Ugd2FudCB0byBvbmx5 IHN0b3JlIGEgbmV3IGVudHJ5IHRvIGEgcmFuZ2UgKG9yIGluZGV4KSBpZiB0aGF0IHJhbmdlIGlz DQorY3VycmVudGx5IGBgTlVMTGBgLCB5b3UgY2FuIHVzZSBtdHJlZV9pbnNlcnRfcmFuZ2UoKSBv ciBtdHJlZV9pbnNlcnQoKSB3aGljaA0KK3JldHVybiAtRUVYSVNUIGlmIHRoZSByYW5nZSBpcyBu b3QgZW1wdHkuDQorDQorWW91IGNhbiBzZWFyY2ggZm9yIGFuIGVudHJ5IGZyb20gYW4gaW5kZXgg dXB3YXJkcyBieSB1c2luZyBtdF9maW5kKCkuDQorDQorWW91IGNhbiB3YWxrIGVhY2ggZW50cnkg d2l0aGluIGEgcmFuZ2UgYnkgY2FsbGluZyBtdF9mb3JfZWFjaCgpLiAgWW91IG11c3QNCitwcm92 aWRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIHN0b3JlIGEgY3Vyc29yLiAgSWYgeW91IHdhbnQg dG8gd2FsayBlYWNoDQorZWxlbWVudCBvZiB0aGUgdHJlZSB0aGVuIGBgMGBgIGFuZCBgYFVMT05H X01BWGBgIG1heSBiZSB1c2VkIGFzIHRoZSByYW5nZS4gIElmDQordGhlIGNhbGxlciBpcyBnb2lu ZyB0byBob2xkIHRoZSBsb2NrIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdhbGsgdGhlbiBpdCBp cw0KK3dvcnRoIGxvb2tpbmcgYXQgdGhlIG1hc19mb3JfZWFjaCgpIEFQSSBpbiB0aGUgOnJlZjpg bWFwbGUtdHJlZS1hZHZhbmNlZC1hcGlgDQorc2VjdGlvbi4NCisNCitTb21ldGltZXMgaXQgaXMg bmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgbmV4dCBjYWxsIHRvIHN0b3JlIHRvIGEgbWFwbGUgdHJl ZSBkb2VzDQorbm90IGFsbG9jYXRlIG1lbW9yeSwgcGxlYXNlIHNlZSA6cmVmOmBtYXBsZS10cmVl LWFkdmFuY2VkLWFwaWAgZm9yIHRoaXMgdXNlIGNhc2UuDQorDQorRmluYWxseSwgeW91IGNhbiBy ZW1vdmUgYWxsIGVudHJpZXMgZnJvbSBhIG1hcGxlIHRyZWUgYnkgY2FsbGluZw0KK210cmVlX2Rl c3Ryb3koKS4gIElmIHRoZSBtYXBsZSB0cmVlIGVudHJpZXMgYXJlIHBvaW50ZXJzLCB5b3UgbWF5 IHdpc2ggdG8gZnJlZQ0KK3RoZSBlbnRyaWVzIGZpcnN0Lg0KKw0KK0FsbG9jYXRpbmcgTm9kZXMN CistLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIGFsbG9jYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRo ZSBpbnRlcm5hbCB0cmVlIGNvZGUuICBTZWUNCis6cmVmOmBtYXBsZS10cmVlLWFkdmFuY2VkLWFs bG9jYCBmb3Igb3RoZXIgb3B0aW9ucy4NCisNCitMb2NraW5nDQorLS0tLS0tLQ0KKw0KK1lvdSBk byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBsb2NraW5nLiAgU2VlIDpyZWY6YG1hcGxlLXRyZWUt YWR2YW5jZWQtbG9ja3NgDQorZm9yIG90aGVyIG9wdGlvbnMuDQorDQorVGhlIE1hcGxlIFRyZWUg dXNlcyBSQ1UgYW5kIGFuIGludGVybmFsIHNwaW5sb2NrIHRvIHN5bmNocm9uaXNlIGFjY2VzczoN CisNCitUYWtlcyBSQ1UgcmVhZCBsb2NrOg0KKyAqIG10cmVlX2xvYWQoKQ0KKyAqIG10X2ZpbmQo KQ0KKyAqIG10X2Zvcl9lYWNoKCkNCisgKiBtdF9uZXh0KCkNCisgKiBtdF9wcmV2KCkNCisNCitU YWtlcyBtYV9sb2NrIGludGVybmFsbHk6DQorICogbXRyZWVfc3RvcmUoKQ0KKyAqIG10cmVlX3N0 b3JlX3JhbmdlKCkNCisgKiBtdHJlZV9pbnNlcnQoKQ0KKyAqIG10cmVlX2luc2VydF9yYW5nZSgp DQorICogbXRyZWVfZXJhc2UoKQ0KKyAqIG10cmVlX2Rlc3Ryb3koKQ0KKyAqIG10X3NldF9pbl9y Y3UoKQ0KKyAqIG10X2NsZWFyX2luX3JjdSgpDQorDQorSWYgeW91IHdhbnQgdG8gdGFrZSBhZHZh bnRhZ2Ugb2YgdGhlIGludGVybmFsIGxvY2sgdG8gcHJvdGVjdCB0aGUgZGF0YQ0KK3N0cnVjdHVy ZXMgdGhhdCB5b3UgYXJlIHN0b3JpbmcgaW4gdGhlIE1hcGxlIFRyZWUsIHlvdSBjYW4gY2FsbCBt dHJlZV9sb2NrKCkNCitiZWZvcmUgY2FsbGluZyBtdHJlZV9sb2FkKCksIHRoZW4gdGFrZSBhIHJl ZmVyZW5jZSBjb3VudCBvbiB0aGUgb2JqZWN0IHlvdQ0KK2hhdmUgZm91bmQgYmVmb3JlIGNhbGxp bmcgbXRyZWVfdW5sb2NrKCkuICBUaGlzIHdpbGwgcHJldmVudCBzdG9yZXMgZnJvbQ0KK3JlbW92 aW5nIHRoZSBvYmplY3QgZnJvbSB0aGUgdHJlZSBiZXR3ZWVuIGxvb2tpbmcgdXAgdGhlIG9iamVj dCBhbmQNCitpbmNyZW1lbnRpbmcgdGhlIHJlZmNvdW50LiAgWW91IGNhbiBhbHNvIHVzZSBSQ1Ug dG8gYXZvaWQgZGVyZWZlcmVuY2luZw0KK2ZyZWVkIG1lbW9yeSwgYnV0IGFuIGV4cGxhbmF0aW9u IG9mIHRoYXQgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzDQorZG9jdW1lbnQuDQorDQorLi4g X21hcGxlLXRyZWUtYWR2YW5jZWQtYXBpOg0KKw0KK0FkdmFuY2VkIEFQSQ0KKz09PT09PT09PT09 PQ0KKw0KK1RoZSBhZHZhbmNlZCBBUEkgb2ZmZXJzIG1vcmUgZmxleGliaWxpdHkgYW5kIGJldHRl ciBwZXJmb3JtYW5jZSBhdCB0aGUNCitjb3N0IG9mIGFuIGludGVyZmFjZSB3aGljaCBjYW4gYmUg aGFyZGVyIHRvIHVzZSBhbmQgaGFzIGZld2VyIHNhZmVndWFyZHMuDQorWW91IG11c3QgdGFrZSBj YXJlIG9mIHlvdXIgb3duIGxvY2tpbmcgd2hpbGUgdXNpbmcgdGhlIGFkdmFuY2VkIEFQSS4NCitZ b3UgY2FuIHVzZSB0aGUgbWFfbG9jaywgUkNVIG9yIGFuIGV4dGVybmFsIGxvY2sgZm9yIHByb3Rl Y3Rpb24uDQorWW91IGNhbiBtaXggYWR2YW5jZWQgYW5kIG5vcm1hbCBvcGVyYXRpb25zIG9uIHRo ZSBzYW1lIGFycmF5LCBhcyBsb25nDQorYXMgdGhlIGxvY2tpbmcgaXMgY29tcGF0aWJsZS4gIFRo ZSA6cmVmOmBtYXBsZS10cmVlLW5vcm1hbC1hcGlgIGlzIGltcGxlbWVudGVkDQoraW4gdGVybXMg b2YgdGhlIGFkdmFuY2VkIEFQSS4NCisNCitUaGUgYWR2YW5jZWQgQVBJIGlzIGJhc2VkIGFyb3Vu ZCB0aGUgbWFfc3RhdGUsIHRoaXMgaXMgd2hlcmUgdGhlICdtYXMnDQorcHJlZml4IG9yaWdpbmF0 ZXMuICBUaGUgbWFfc3RhdGUgc3RydWN0IGtlZXBzIHRyYWNrIG9mIHRyZWUgb3BlcmF0aW9ucyB0 byBtYWtlDQorbGlmZSBlYXNpZXIgZm9yIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsIHRyZWUg dXNlcnMuDQorDQorSW5pdGlhbGlzaW5nIHRoZSBtYXBsZSB0cmVlIGlzIHRoZSBzYW1lIGFzIGlu IHRoZSA6cmVmOmBtYXBsZS10cmVlLW5vcm1hbC1hcGlgLg0KK1BsZWFzZSBzZWUgYWJvdmUuDQor DQorVGhlIG1hcGxlIHN0YXRlIGtlZXBzIHRyYWNrIG9mIHRoZSByYW5nZSBzdGFydCBhbmQgZW5k IGluIG1hcy0+aW5kZXggYW5kDQorbWFzLT5sYXN0LCByZXNwZWN0aXZlbHkuDQorDQorbWFzX3dh bGsoKSB3aWxsIHdhbGsgdGhlIHRyZWUgdG8gdGhlIGxvY2F0aW9uIG9mIG1hcy0+aW5kZXggYW5k IHNldCB0aGUNCittYXMtPmluZGV4IGFuZCBtYXMtPmxhc3QgYWNjb3JkaW5nIHRvIHRoZSByYW5n ZSBmb3IgdGhlIGVudHJ5Lg0KKw0KK1lvdSBjYW4gc2V0IGVudHJpZXMgdXNpbmcgbWFzX3N0b3Jl KCkuICBtYXNfc3RvcmUoKSB3aWxsIG92ZXJ3cml0ZSBhbnkgZW50cnkNCit3aXRoIHRoZSBuZXcg ZW50cnkgYW5kIHJldHVybiB0aGUgZmlyc3QgZXhpc3RpbmcgZW50cnkgdGhhdCBpcyBvdmVyd3Jp dHRlbi4NCitUaGUgcmFuZ2UgaXMgcGFzc2VkIGluIGFzIG1lbWJlcnMgb2YgdGhlIG1hcGxlIHN0 YXRlOiBpbmRleCBhbmQgbGFzdC4NCisNCitZb3UgY2FuIHVzZSBtYXNfZXJhc2UoKSB0byBlcmFz ZSBhbiBlbnRpcmUgcmFuZ2UgYnkgc2V0dGluZyBpbmRleCBhbmQNCitsYXN0IG9mIHRoZSBtYXBs ZSBzdGF0ZSB0byB0aGUgZGVzaXJlZCByYW5nZSB0byBlcmFzZS4gIFRoaXMgd2lsbCBlcmFzZQ0K K3RoZSBmaXJzdCByYW5nZSB0aGF0IGlzIGZvdW5kIGluIHRoYXQgcmFuZ2UsIHNldCB0aGUgbWFw bGUgc3RhdGUgaW5kZXgNCithbmQgbGFzdCBhcyB0aGUgcmFuZ2UgdGhhdCB3YXMgZXJhc2VkIGFu ZCByZXR1cm4gdGhlIGVudHJ5IHRoYXQgZXhpc3RlZA0KK2F0IHRoYXQgbG9jYXRpb24uDQorDQor WW91IGNhbiB3YWxrIGVhY2ggZW50cnkgd2l0aGluIGEgcmFuZ2UgYnkgdXNpbmcgbWFzX2Zvcl9l YWNoKCkuICBJZiB5b3Ugd2FudA0KK3RvIHdhbGsgZWFjaCBlbGVtZW50IG9mIHRoZSB0cmVlIHRo ZW4gYGAwYGAgYW5kIGBgVUxPTkdfTUFYYGAgbWF5IGJlIHVzZWQgYXMNCit0aGUgcmFuZ2UuICBJ ZiB0aGUgbG9jayBuZWVkcyB0byBiZSBwZXJpb2RpY2FsbHkgZHJvcHBlZCwgc2VlIHRoZSBsb2Nr aW5nDQorc2VjdGlvbiBtYXNfcGF1c2UoKS4NCisNCitVc2luZyBhIG1hcGxlIHN0YXRlIGFsbG93 cyBtYXNfbmV4dCgpIGFuZCBtYXNfcHJldigpIHRvIGZ1bmN0aW9uIGFzIGlmIHRoZQ0KK3RyZWUg d2FzIGEgbGlua2VkIGxpc3QuICBXaXRoIHN1Y2ggYSBoaWdoIGJyYW5jaGluZyBmYWN0b3IgdGhl IGFtb3J0aXplZA0KK3BlcmZvcm1hbmNlIHBlbmFsdHkgaXMgb3V0d2VpZ2hlZCBieSBjYWNoZSBv cHRpbWl6YXRpb24uICBtYXNfbmV4dCgpIHdpbGwNCityZXR1cm4gdGhlIG5leHQgZW50cnkgd2hp Y2ggb2NjdXJzIGFmdGVyIHRoZSBlbnRyeSBhdCBpbmRleC4gIG1hc19wcmV2KCkNCit3aWxsIHJl dHVybiB0aGUgcHJldmlvdXMgZW50cnkgd2hpY2ggb2NjdXJzIGJlZm9yZSB0aGUgZW50cnkgYXQg aW5kZXguDQorDQorbWFzX2ZpbmQoKSB3aWxsIGZpbmQgdGhlIGZpcnN0IGVudHJ5IHdoaWNoIGV4 aXN0cyBhdCBvciBhYm92ZSBpbmRleCBvbg0KK3RoZSBmaXJzdCBjYWxsLCBhbmQgdGhlIG5leHQg ZW50cnkgZnJvbSBldmVyeSBzdWJzZXF1ZW50IGNhbGxzLg0KKw0KK21hc19maW5kX3JldigpIHdp bGwgZmluZCB0aGUgZmlzdCBlbnRyeSB3aGljaCBleGlzdHMgYXQgb3IgYmVsb3cgdGhlIGxhc3Qg b24NCit0aGUgZmlyc3QgY2FsbCwgYW5kIHRoZSBwcmV2aW91cyBlbnRyeSBmcm9tIGV2ZXJ5IHN1 YnNlcXVlbnQgY2FsbHMuDQorDQorSWYgdGhlIHVzZXIgbmVlZHMgdG8geWllbGQgdGhlIGxvY2sg ZHVyaW5nIGFuIG9wZXJhdGlvbiwgdGhlbiB0aGUgbWFwbGUgc3RhdGUNCittdXN0IGJlIHBhdXNl ZCB1c2luZyBtYXNfcGF1c2UoKS4NCisNCitUaGVyZSBhcmUgYSBmZXcgZXh0cmEgaW50ZXJmYWNl cyBwcm92aWRlZCB3aGVuIHVzaW5nIGFuIGFsbG9jYXRpb24gdHJlZS4NCitJZiB5b3Ugd2lzaCB0 byBzZWFyY2ggZm9yIGEgZ2FwIHdpdGhpbiBhIHJhbmdlLCB0aGVuIG1hc19lbXB0eV9hcmVhKCkN CitvciBtYXNfZW1wdHlfYXJlYV9yZXYoKSBjYW4gYmUgdXNlZC4gIG1hc19lbXB0eV9hcmVhKCkg c2VhcmNoZXMgZm9yIGEgZ2FwDQorc3RhcnRpbmcgYXQgdGhlIGxvd2VzdCBpbmRleCBnaXZlbiB1 cCB0byB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UuDQorbWFzX2VtcHR5X2FyZWFfcmV2KCkgc2Vh cmNoZXMgZm9yIGEgZ2FwIHN0YXJ0aW5nIGF0IHRoZSBoaWdoZXN0IGluZGV4IGdpdmVuDQorYW5k IGNvbnRpbnVlcyBkb3dud2FyZCB0byB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLg0KKw0K Ky4uIF9tYXBsZS10cmVlLWFkdmFuY2VkLWFsbG9jOg0KKw0KK0FkdmFuY2VkIEFsbG9jYXRpbmcg Tm9kZXMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorQWxsb2NhdGlvbnMgYXJlIHVz dWFsbHkgaGFuZGxlZCBpbnRlcm5hbGx5IHRvIHRoZSB0cmVlLCBob3dldmVyIGlmIGFsbG9jYXRp b25zDQorbmVlZCB0byBvY2N1ciBiZWZvcmUgYSB3cml0ZSBvY2N1cnMgdGhlbiBjYWxsaW5nIG1h c19leHBlY3RlZF9lbnRyaWVzKCkgd2lsbA0KK2FsbG9jYXRlIHRoZSB3b3JzdC1jYXNlIG51bWJl ciBvZiBuZWVkZWQgbm9kZXMgdG8gaW5zZXJ0IHRoZSBwcm92aWRlZCBudW1iZXIgb2YNCityYW5n ZXMuICBUaGlzIGFsc28gY2F1c2VzIHRoZSB0cmVlIHRvIGVudGVyIG1hc3MgaW5zZXJ0aW9uIG1v ZGUuICBPbmNlDQoraW5zZXJ0aW9ucyBhcmUgY29tcGxldGUgY2FsbGluZyBtYXNfZGVzdHJveSgp IG9uIHRoZSBtYXBsZSBzdGF0ZSB3aWxsIGZyZWUgdGhlDQordW51c2VkIGFsbG9jYXRpb25zLg0K Kw0KKy4uIF9tYXBsZS10cmVlLWFkdmFuY2VkLWxvY2tzOg0KKw0KK0FkdmFuY2VkIExvY2tpbmcN CistLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIG1hcGxlIHRyZWUgdXNlcyBhIHNwaW5sb2NrIGJ5 IGRlZmF1bHQsIGJ1dCBleHRlcm5hbCBsb2NrcyBjYW4gYmUgdXNlZCBmb3INCit0cmVlIHVwZGF0 ZXMgYXMgd2VsbC4gIFRvIHVzZSBhbiBleHRlcm5hbCBsb2NrLCB0aGUgdHJlZSBtdXN0IGJlIGlu aXRpYWxpemVkDQord2l0aCB0aGUgYGBNVF9GTEFHU19MT0NLX0VYVEVSTiBmbGFnYGAsIHRoaXMg aXMgdXN1YWxseSBkb25lIHdpdGggdGhlDQorTVRSRUVfSU5JVF9FWFQoKSAjZGVmaW5lLCB3aGlj aCB0YWtlcyBhbiBleHRlcm5hbCBsb2NrIGFzIGFuIGFyZ3VtZW50Lg0KKw0KK0Z1bmN0aW9ucyBh bmQgc3RydWN0dXJlcw0KKz09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKy4uIGtlcm5lbC1k b2M6OiBpbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KKy4uIGtlcm5lbC1kb2M6OiBsaWIvbWFw bGVfdHJlZS5jDQorDQpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUw0KaW5k ZXggNGE1ZDk2ZjYwNmRhLi45ZDIwYjFkODg0MzggMTAwNjQ0DQotLS0gYS9NQUlOVEFJTkVSUw0K KysrIGIvTUFJTlRBSU5FUlMNCkBAIC0xMTY1OSw2ICsxMTY1OSwxOCBAQCBMOglsaW51eC1tYW5A dmdlci5rZXJuZWwub3JnDQogUzoJTWFpbnRhaW5lZA0KIFc6CWh0dHA6Ly93d3cua2VybmVsLm9y Zy9kb2MvbWFuLXBhZ2VzDQogDQorTUFQTEUgVFJFRQ0KK006CUxpYW0gUi4gSG93bGV0dCA8TGlh bS5Ib3dsZXR0QG9yYWNsZS5jb20+DQorTDoJbGludXgtbW1Aa3ZhY2sub3JnDQorUzoJU3VwcG9y dGVkDQorRjoJRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdA0KK0Y6CWluY2x1 ZGUvbGludXgvbWFwbGVfdHJlZS5oDQorRjoJaW5jbHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJl ZS5oDQorRjoJbGliL21hcGxlX3RyZWUuYw0KK0Y6CWxpYi90ZXN0X21hcGxlX3RyZWUuYw0KK0Y6 CXRvb2xzL3Rlc3RpbmcvX2FkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgNCitGOgl0b29scy90 ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KKw0KIE1BUkRVSyAoQ1JFQVRPUiBDSTQwKSBERVZJ Q0UgVFJFRSBTVVBQT1JUDQogTToJUmFodWwgQmVkYXJrYXIgPHJhaHVsYmVkYXJrYXI4OUBnbWFp bC5jb20+DQogTDoJbGludXgtbWlwc0B2Z2VyLmtlcm5lbC5vcmcNCmRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L21hcGxlX3RyZWUuaCBiL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQpuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi5mYjY4OWQ2MjhjZjcNCi0tLSAv ZGV2L251bGwNCisrKyBiL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDY4 NSBAQA0KKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKyAqLw0KKyNpZm5kZWYg X0xJTlVYX01BUExFX1RSRUVfSA0KKyNkZWZpbmUgX0xJTlVYX01BUExFX1RSRUVfSA0KKy8qDQor ICogTWFwbGUgVHJlZSAtIEFuIFJDVS1zYWZlIGFkYXB0aXZlIHRyZWUgZm9yIHN0b3JpbmcgcmFu Z2VzDQorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgT3JhY2xlDQorICogQXV0aG9yczogICAg IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQorICogICAgICAgICAg ICAgIE1hdHRoZXcgV2lsY294IDx3aWxseUBpbmZyYWRlYWQub3JnPg0KKyAqLw0KKw0KKyNpbmNs dWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4NCisjaW5j bHVkZSA8bGludXgvc3BpbmxvY2suaD4NCisvKiAjZGVmaW5lIENPTkZJR19NQVBMRV9SQ1VfRElT QUJMRUQgKi8NCisvKiAjZGVmaW5lIENPTkZJR19ERUJVR19NQVBMRV9UUkVFX1ZFUkJPU0UgKi8N CisNCisvKg0KKyAqIEFsbG9jYXRlZCBub2RlcyBhcmUgbXV0YWJsZSB1bnRpbCB0aGV5IGhhdmUg YmVlbiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLA0KKyAqIGF0IHdoaWNoIHRpbWUgdGhleSBjYW5u b3QgY2hhbmdlIHRoZWlyIHR5cGUgdW50aWwgdGhleSBoYXZlIGJlZW4gcmVtb3ZlZA0KKyAqIGZy b20gdGhlIHRyZWUgYW5kIGFuIFJDVSBncmFjZSBwZXJpb2QgaGFzIHBhc3NlZC4NCisgKg0KKyAq IFJlbW92ZWQgbm9kZXMgaGF2ZSB0aGVpciAtPnBhcmVudCBzZXQgdG8gcG9pbnQgdG8gdGhlbXNl bHZlcy4gIFJDVSByZWFkZXJzDQorICogY2hlY2sgLT5wYXJlbnQgYmVmb3JlIHJlbHlpbmcgb24g dGhlIHZhbHVlIHRoYXQgdGhleSBsb2FkZWQgZnJvbSB0aGUNCisgKiBzbG90cyBhcnJheS4gIFRo aXMgbGV0cyB1cyByZXVzZSB0aGUgc2xvdHMgYXJyYXkgZm9yIHRoZSBSQ1UgaGVhZC4NCisgKg0K KyAqIE5vZGVzIGluIHRoZSB0cmVlIHBvaW50IHRvIHRoZWlyIHBhcmVudCB1bmxlc3MgYml0IDAg aXMgc2V0Lg0KKyAqLw0KKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChCVUlM RF9WRFNPMzJfNjQpDQorLyogNjRiaXQgc2l6ZXMgKi8NCisjZGVmaW5lIE1BUExFX05PREVfU0xP VFMJMzEJLyogMjU2IGJ5dGVzIGluY2x1ZGluZyAtPnBhcmVudCAqLw0KKyNkZWZpbmUgTUFQTEVf UkFOR0U2NF9TTE9UUwkxNgkvKiAyNTYgYnl0ZXMgKi8NCisjZGVmaW5lIE1BUExFX0FSQU5HRTY0 X1NMT1RTCTEwCS8qIDI0MCBieXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJBTkdFNjRfTUVUQV9N QVgJMTUJLyogT3V0IG9mIHJhbmdlIGZvciBtZXRhZGF0YSAqLw0KKyNkZWZpbmUgTUFQTEVfQUxM T0NfU0xPVFMJKE1BUExFX05PREVfU0xPVFMgLSAxKQ0KKyNlbHNlDQorLyogMzJiaXQgc2l6ZXMg Ki8NCisjZGVmaW5lIE1BUExFX05PREVfU0xPVFMJNjMJLyogMjU2IGJ5dGVzIGluY2x1ZGluZyAt PnBhcmVudCAqLw0KKyNkZWZpbmUgTUFQTEVfUkFOR0U2NF9TTE9UUwkzMgkvKiAyNTYgYnl0ZXMg Ki8NCisjZGVmaW5lIE1BUExFX0FSQU5HRTY0X1NMT1RTCTIxCS8qIDI0MCBieXRlcyAqLw0KKyNk ZWZpbmUgTUFQTEVfQVJBTkdFNjRfTUVUQV9NQVgJMjIJLyogT3V0IG9mIHJhbmdlIGZvciBtZXRh ZGF0YSAqLw0KKyNkZWZpbmUgTUFQTEVfQUxMT0NfU0xPVFMJKE1BUExFX05PREVfU0xPVFMgLSAy KQ0KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChCVUlMRF9WRFNP MzJfNjQpICovDQorDQorI2RlZmluZSBNQVBMRV9OT0RFX01BU0sJCTI1NVVMDQorDQorLyoNCisg KiBUaGUgbm9kZS0+cGFyZW50IG9mIHRoZSByb290IG5vZGUgaGFzIGJpdCAwIHNldCBhbmQgdGhl IHJlc3Qgb2YgdGhlIHBvaW50ZXINCisgKiBpcyBhIHBvaW50ZXIgdG8gdGhlIHRyZWUgaXRzZWxm LiAgTm8gbW9yZSBiaXRzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBwb2ludGVyDQorICogKG9uIG02 OGssIHRoZSBkYXRhIHN0cnVjdHVyZSBtYXkgb25seSBiZSAyLWJ5dGUgYWxpZ25lZCkuDQorICoN CisgKiBJbnRlcm5hbCBub24tcm9vdCBub2RlcyBjYW4gb25seSBoYXZlIG1hcGxlX3JhbmdlXyog bm9kZXMgYXMgcGFyZW50cy4gIFRoZQ0KKyAqIHBhcmVudCBwb2ludGVyIGlzIDI1NkIgYWxpZ25l ZCBsaWtlIGFsbCBvdGhlciB0cmVlIG5vZGVzLiAgV2hlbiBzdG9yaW5nIGEgMzINCisgKiBvciA2 NCBiaXQgdmFsdWVzLCB0aGUgb2Zmc2V0IGNhbiBmaXQgaW50byA0IGJpdHMuICBUaGUgMTYgYml0 IHZhbHVlcyBuZWVkIGFuDQorICogZXh0cmEgYml0IHRvIHN0b3JlIHRoZSBvZmZzZXQuICBUaGlz IGV4dHJhIGJpdCBjb21lcyBmcm9tIGEgcmV1c2Ugb2YgdGhlIGxhc3QNCisgKiBiaXQgaW4gdGhl IG5vZGUgdHlwZS4gIFRoaXMgaXMgcG9zc2libGUgYnkgdXNpbmcgYml0IDEgdG8gaW5kaWNhdGUg aWYgYml0IDINCisgKiBpcyBwYXJ0IG9mIHRoZSB0eXBlIG9yIHRoZSBzbG90Lg0KKyAqDQorICog T25jZSB0aGUgdHlwZSBpcyBkZWNpZGVkLCB0aGUgZGVjaXNpb24gb2YgYW4gYWxsb2NhdGlvbiBy YW5nZSB0eXBlIG9yIGEgcmFuZ2UNCisgKiB0eXBlIGlzIGRvbmUgYnkgZXhhbWluaW5nIHRoZSBp bW11dGFibGUgdHJlZSBmbGFnIGZvciB0aGUgTUFQTEVfQUxMT0NfUkFOR0UNCisgKiBmbGFnLg0K KyAqDQorICogIE5vZGUgdHlwZXM6DQorICogICAweD8/MSA9IFJvb3QNCisgKiAgIDB4PzAwID0g MTYgYml0IG5vZGVzDQorICogICAweDAxMCA9IDMyIGJpdCBub2Rlcw0KKyAqICAgMHgxMTAgPSA2 NCBiaXQgbm9kZXMNCisgKg0KKyAqICBTbG90IHNpemUgYW5kIGxvY2F0aW9uIGluIHRoZSBwYXJl bnQgcG9pbnRlcjoNCisgKiAgIHR5cGUgIDogc2xvdCBsb2NhdGlvbg0KKyAqICAgMHg/PzEgOiBS b290DQorICogICAweD8wMCA6IDE2IGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0xLCBzbG90IGluIDIt Ng0KKyAqICAgMHgwMTAgOiAzMiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTYN CisgKiAgIDB4MTEwIDogNjQgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQor ICovDQordHlwZWRlZiBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1hcGxlX2Vub2RlOyAvKiBlbmNvZGVk IG5vZGUgKi8NCit0eXBlZGVmIHN0cnVjdCBtYXBsZV9wbm9kZSAqbWFwbGVfcG5vZGU7IC8qIHBh cmVudCBub2RlICovDQorDQorLyoNCisgKiBUaGlzIG1ldGFkYXRhIGlzIHVzZWQgdG8gb3B0aW1p emUgdGhlIGdhcCB1cGRhdGluZyBjb2RlIGFuZCBpbiByZXZlcnNlDQorICogc2VhcmNoaW5nIGZv ciBnYXBzIG9yIGFueSBvdGhlciBjb2RlIHRoYXQgbmVlZHMgdG8gZmluZCB0aGUgZW5kIG9mIHRo ZSBkYXRhLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV9tZXRhZGF0YSB7DQorCXVuc2lnbmVkIGNoYXIg ZW5kOw0KKwl1bnNpZ25lZCBjaGFyIGdhcDsNCit9Ow0KKw0KKy8qDQorICogTGVhZiBub2RlcyBk byBub3Qgc3RvcmUgcG9pbnRlcnMgdG8gbm9kZXMsIHRoZXkgc3RvcmUgdXNlciBkYXRhLiAgVXNl cnMgbWF5DQorICogc3RvcmUgYWxtb3N0IGFueSBiaXQgcGF0dGVybi4gIEFzIG5vdGVkIGFib3Zl LCB0aGUgb3B0aW1pc2F0aW9uIG9mIHN0b3JpbmcgYW4NCisgKiBlbnRyeSBhdCAwIGluIHRoZSBy b290IHBvaW50ZXIgY2Fubm90IGJlIGRvbmUgZm9yIGRhdGEgd2hpY2ggaGF2ZSB0aGUgYm90dG9t DQorICogdHdvIGJpdHMgc2V0IHRvICcxMCcuICBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdpdGgg dGhlIGJvdHRvbSB0d28gYml0cyBzZXQgdG8NCisgKiAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0MDk2 IChpZSAyLCA2LCAxMCAuLiA0MDk0KSBmb3IgaW50ZXJuYWwgdXNlLiAgU29tZSBBUElzDQorICog cmV0dXJuIGVycm5vcyBhcyBhIG5lZ2F0aXZlIGVycm5vIHNoaWZ0ZWQgcmlnaHQgYnkgdHdvIGJp dHMgYW5kIHRoZSBib3R0b20NCisgKiB0d28gYml0cyBzZXQgdG8gJzEwJywgYW5kIHdoaWxlIGNo b29zaW5nIHRvIHN0b3JlIHRoZXNlIHZhbHVlcyBpbiB0aGUgYXJyYXkNCisgKiBpcyBub3QgYW4g ZXJyb3IsIGl0IG1heSBsZWFkIHRvIGNvbmZ1c2lvbiBpZiB5b3UncmUgdGVzdGluZyBmb3IgYW4g ZXJyb3Igd2l0aA0KKyAqIG1hc19pc19lcnIoKS4NCisgKg0KKyAqIE5vbi1sZWFmIG5vZGVzIHN0 b3JlIHRoZSB0eXBlIG9mIHRoZSBub2RlIHBvaW50ZWQgdG8gKGVudW0gbWFwbGVfdHlwZSBpbiBi aXRzDQorICogMy02KSwgYml0IDIgaXMgcmVzZXJ2ZWQuICBUaGF0IGxlYXZlcyBiaXRzIDAtMSB1 bnVzZWQgZm9yIG5vdy4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZvdHMg YXJlIGNhbGxlZCBrZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGljYXRl IHRoYXQgdGhlIHRyZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVhciBp biB0aGUNCisgKiBzdWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVlIHdo ZXJlYXMga2V5cyBhcmUgdW5pcXVlIHRvIGENCisgKiBzcGVjaWZpYyBwb3NpdGlvbiBvZiBhIEIt dHJlZS4gIFBpdm90IHZhbHVlcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBzbG90IHdpdGgNCisgKiB0 aGUgc2FtZSBpbmRleC4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgew0KKwlzdHJ1 Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9SQU5H RTY0X1NMT1RTIC0gMV07DQorCXVuaW9uIHsNCisJCXZvaWQgX19yY3UgKnNsb3RbTUFQTEVfUkFO R0U2NF9TTE9UU107DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgX19yY3UgKnBhZFtNQVBMRV9SQU5H RTY0X1NMT1RTIC0gMV07DQorCQkJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorCQl9Ow0K Kwl9Ow0KK307DQorDQorLyoNCisgKiBBdCB0cmVlIGNyZWF0aW9uIHRpbWUsIHRoZSB1c2VyIGNh biBzcGVjaWZ5IHRoYXQgdGhleSdyZSB3aWxsaW5nIHRvIHRyYWRlIG9mZg0KKyAqIHN0b3Jpbmcg ZmV3ZXIgZW50cmllcyBpbiBhIHRyZWUgaW4gcmV0dXJuIGZvciBzdG9yaW5nIG1vcmUgaW5mb3Jt YXRpb24gaW4NCisgKiBlYWNoIG5vZGUuDQorICoNCisgKiBUaGUgbWFwbGUgdHJlZSBzdXBwb3J0 cyByZWNvcmRpbmcgdGhlIGxhcmdlc3QgcmFuZ2Ugb2YgTlVMTCBlbnRyaWVzIGF2YWlsYWJsZQ0K KyAqIGluIHRoaXMgbm9kZSwgYWxzbyBjYWxsZWQgZ2Fwcy4gIFRoaXMgb3B0aW1pc2VzIHRoZSB0 cmVlIGZvciBhbGxvY2F0aW5nIGENCisgKiByYW5nZS4NCisgKi8NCitzdHJ1Y3QgbWFwbGVfYXJh bmdlXzY0IHsNCisJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcg cGl2b3RbTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxXTsNCisJdm9pZCBfX3JjdSAqc2xvdFtNQVBM RV9BUkFOR0U2NF9TTE9UU107DQorCXVuc2lnbmVkIGxvbmcgZ2FwW01BUExFX0FSQU5HRTY0X1NM T1RTXTsNCisJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorfTsNCisNCitzdHJ1Y3QgbWFw bGVfYWxsb2Mgew0KKwl1bnNpZ25lZCBsb25nIHRvdGFsOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVf Y291bnQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0X2NvdW50Ow0KKwlzdHJ1Y3QgbWFwbGVfYWxs b2MgKnNsb3RbTUFQTEVfQUxMT0NfU0xPVFNdOw0KK307DQorDQorc3RydWN0IG1hcGxlX3RvcGlh cnkgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpuZXh0OyAvKiBPdmVybGFwcyB0aGUgcGl2b3QgKi8NCit9Ow0KKw0KK2VudW0gbWFwbGVfdHlw ZSB7DQorCW1hcGxlX2RlbnNlLA0KKwltYXBsZV9sZWFmXzY0LA0KKwltYXBsZV9yYW5nZV82NCwN CisJbWFwbGVfYXJhbmdlXzY0LA0KK307DQorDQorDQorLyoqDQorICogRE9DOiBNYXBsZSB0cmVl IGZsYWdzDQorICoNCisgKiAqIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCS0gVHJhY2sgZ2FwcyBpbiB0 aGlzIHRyZWUNCisgKiAqIE1UX0ZMQUdTX1VTRV9SQ1UJCS0gT3BlcmF0ZSBpbiBSQ1UgbW9kZQ0K KyAqICogTVRfRkxBR1NfSEVJR0hUX09GRlNFVAktIFRoZSBwb3NpdGlvbiBvZiB0aGUgdHJlZSBo ZWlnaHQgaW4gdGhlIGZsYWdzDQorICogKiBNVF9GTEFHU19IRUlHSFRfTUFTSwktIFRoZSBtYXNr IGZvciB0aGUgbWFwbGUgdHJlZSBoZWlnaHQgdmFsdWUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfTUFT SwkJLSBIb3cgdGhlIG10X2xvY2sgaXMgdXNlZA0KKyAqICogTVRfRkxBR1NfTE9DS19JUlEJCS0g QWNxdWlyZWQgaXJxLXNhZmUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfQkgJCS0gQWNxdWlyZWQgYmgt c2FmZQ0KKyAqICogTVRfRkxBR1NfTE9DS19FWFRFUk4JLSBtdF9sb2NrIGlzIG5vdCB1c2VkDQor ICoNCisgKiBNQVBMRV9IRUlHSFRfTUFYCVRoZSBsYXJnZXN0IGhlaWdodCB0aGF0IGNhbiBiZSBz dG9yZWQNCisgKi8NCisjZGVmaW5lIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCTB4MDENCisjZGVmaW5l IE1UX0ZMQUdTX1VTRV9SQ1UJMHgwMg0KKyNkZWZpbmUgTVRfRkxBR1NfSEVJR0hUX09GRlNFVAkw eDAyDQorI2RlZmluZSBNVF9GTEFHU19IRUlHSFRfTUFTSwkweDdDDQorI2RlZmluZSBNVF9GTEFH U19MT0NLX01BU0sJMHgzMDANCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfSVJRCTB4MTAwDQorI2Rl ZmluZSBNVF9GTEFHU19MT0NLX0JICTB4MjAwDQorI2RlZmluZSBNVF9GTEFHU19MT0NLX0VYVEVS TgkweDMwMA0KKw0KKyNkZWZpbmUgTUFQTEVfSEVJR0hUX01BWAkzMQ0KKw0KKw0KKyNkZWZpbmUg TUFQTEVfTk9ERV9UWVBFX01BU0sJMHgwRg0KKyNkZWZpbmUgTUFQTEVfTk9ERV9UWVBFX1NISUZU CTB4MDMNCisNCisjZGVmaW5lIE1BUExFX1JFU0VSVkVEX1JBTkdFCTQwOTYNCisNCisjaWZkZWYg Q09ORklHX0xPQ0tERVANCit0eXBlZGVmIHN0cnVjdCBsb2NrZGVwX21hcCAqbG9ja2RlcF9tYXBf cDsNCisjZGVmaW5lIG10X2xvY2tfaXNfaGVsZChtdCkJbG9ja19pc19oZWxkKG10LT5tYV9leHRl cm5hbF9sb2NrKQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQsIGxvY2spCQkJCQlc DQorCShtdCktPm1hX2V4dGVybmFsX2xvY2sgPSAmKGxvY2spLT5kZXBfbWFwOw0KKyNlbHNlDQor dHlwZWRlZiBzdHJ1Y3QgeyAvKiBub3RoaW5nICovIH0gbG9ja2RlcF9tYXBfcDsNCisjZGVmaW5l IG10X2xvY2tfaXNfaGVsZChtdCkJMQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQs IGxvY2spCWRvIHsgfSB3aGlsZSAoMCkNCisjZW5kaWYNCisNCisvKg0KKyAqIElmIHRoZSB0cmVl IGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5IGF0IGluZGV4IDAsIGl0IGlzIHVzdWFsbHkgc3RvcmVk IGluDQorICogdHJlZS0+bWFfcm9vdC4gIFRvIG9wdGltaXNlIGZvciB0aGUgcGFnZSBjYWNoZSwg YW4gZW50cnkgd2hpY2ggZW5kcyBpbiAnMDAnLA0KKyAqICcwMScgb3IgJzExJyBpcyBzdG9yZWQg aW4gdGhlIHJvb3QsIGJ1dCBhbiBlbnRyeSB3aGljaCBlbmRzIGluICcxMCcgd2lsbCBiZQ0KKyAq IHN0b3JlZCBpbiBhIG5vZGUuICBCaXRzIDMtNiBhcmUgdXNlZCB0byBzdG9yZSBlbnVtIG1hcGxl X3R5cGUuDQorICoNCisgKiBUaGUgZmxhZ3MgYXJlIHVzZWQgYm90aCB0byBzdG9yZSBzb21lIGlt bXV0YWJsZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRyZWUNCisgKiAoc2V0IGF0IHRyZWUgY3Jl YXRpb24gdGltZSkgYW5kIGR5bmFtaWMgaW5mb3JtYXRpb24gc2V0IHVuZGVyIHRoZSBzcGlubG9j ay4NCisgKg0KKyAqIEFub3RoZXIgdXNlIG9mIGZsYWdzIGFyZSB0byBpbmRpY2F0ZSBnbG9iYWwg c3RhdGVzIG9mIHRoZSB0cmVlLiAgVGhpcyBpcyB0aGUNCisgKiBjYXNlIHdpdGggdGhlIE1BUExF X1VTRV9SQ1UgZmxhZywgd2hpY2ggaW5kaWNhdGVzIHRoZSB0cmVlIGlzIGN1cnJlbnRseSBpbg0K KyAqIFJDVSBtb2RlLiAgVGhpcyBtb2RlIHdhcyBhZGRlZCB0byBhbGxvdyB0aGUgdHJlZSB0byBy ZXVzZSBub2RlcyBpbnN0ZWFkIG9mDQorICogcmUtYWxsb2NhdGluZyBhbmQgUkNVIGZyZWVpbmcg bm9kZXMgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB1c2VyLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV90 cmVlIHsNCisJdW5pb24gew0KKwkJc3BpbmxvY2tfdAltYV9sb2NrOw0KKwkJbG9ja2RlcF9tYXBf cAltYV9leHRlcm5hbF9sb2NrOw0KKwl9Ow0KKwl2b2lkIF9fcmN1ICAgICAgKm1hX3Jvb3Q7DQor CXVuc2lnbmVkIGludAltYV9mbGFnczsNCit9Ow0KKw0KKy8qKg0KKyAqIE1UUkVFX0lOSVQoKSAt IEluaXRpYWxpemUgYSBtYXBsZSB0cmVlDQorICogQG5hbWU6IFRoZSBtYXBsZSB0cmVlIG5hbWUN CisgKiBAZmxhZ3M6IFRoZSBtYXBsZSB0cmVlIGZsYWdzDQorICoNCisgKi8NCisjZGVmaW5lIE1U UkVFX0lOSVQobmFtZSwgZmxhZ3MpIHsJCQkJCVwNCisJLm1hX2xvY2sgPSBfX1NQSU5fTE9DS19V TkxPQ0tFRChuYW1lLm1hX2xvY2spLAkJCVwNCisJLm1hX2ZsYWdzID0gZmxhZ3MsCQkJCQkJXA0K KwkubWFfcm9vdCA9IE5VTEwsCQkJCQkJXA0KK30NCisNCisvKioNCisgKiBNVFJFRV9JTklUX0VY VCgpIC0gSW5pdGlhbGl6ZSBhIG1hcGxlIHRyZWUgd2l0aCBhbiBleHRlcm5hbCBsb2NrLg0KKyAq IEBuYW1lOiBUaGUgdHJlZSBuYW1lDQorICogQGZsYWdzOiBUaGUgbWFwbGUgdHJlZSBmbGFncw0K KyAqIEBsb2NrOiBUaGUgZXh0ZXJuYWwgbG9jaw0KKyAqLw0KKyNpZmRlZiBDT05GSUdfTE9DS0RF UA0KKyNkZWZpbmUgTVRSRUVfSU5JVF9FWFQobmFtZSwgZmxhZ3MsIGxvY2spIHsJCQkJXA0KKwku bWFfZXh0ZXJuYWxfbG9jayA9ICYobG9jaykuZGVwX21hcCwJCQkJXA0KKwkubWFfZmxhZ3MgPSBm bGFncywJCQkJCQlcDQorCS5tYV9yb290ID0gTlVMTCwJCQkJCQlcDQorfQ0KKyNlbHNlDQorI2Rl ZmluZSBNVFJFRV9JTklUX0VYVChuYW1lLCBmbGFncywgbG9jaykJTVRSRUVfSU5JVChuYW1lLCBm bGFncykNCisjZW5kaWYNCisNCisjZGVmaW5lIERFRklORV9NVFJFRShuYW1lKQkJCQkJCVwNCisJ c3RydWN0IG1hcGxlX3RyZWUgbmFtZSA9IE1UUkVFX0lOSVQobmFtZSwgMCkNCisNCisjZGVmaW5l IG10cmVlX2xvY2sobXQpCQlzcGluX2xvY2soKCYobXQpLT5tYV9sb2NrKSkNCisjZGVmaW5lIG10 cmVlX3VubG9jayhtdCkJc3Bpbl91bmxvY2soKCYobXQpLT5tYV9sb2NrKSkNCisNCisvKg0KKyAq IFRoZSBNYXBsZSBUcmVlIHNxdWVlemVzIHZhcmlvdXMgYml0cyBpbiBhdCB2YXJpb3VzIHBvaW50 cyB3aGljaCBhcmVuJ3QNCisgKiBuZWNlc3NhcmlseSBvYnZpb3VzLiAgVXN1YWxseSwgdGhpcyBp cyBkb25lIGJ5IG9ic2VydmluZyB0aGF0IHBvaW50ZXJzIGFyZQ0KKyAqIE4tYnl0ZSBhbGlnbmVk IGFuZCB0aHVzIHRoZSBib3R0b20gbG9nXzIoTikgYml0cyBhcmUgYXZhaWxhYmxlIGZvciB1c2Uu ICBXZQ0KKyAqIGRvbid0IHVzZSB0aGUgaGlnaCBiaXRzIG9mIHBvaW50ZXJzIHRvIHN0b3JlIGFk ZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVjYXVzZQ0KKyAqIHdlIGRvbid0IGtub3cgd2hhdCBiaXRz IGFyZSB1bnVzZWQgb24gYW55IGdpdmVuIGFyY2hpdGVjdHVyZS4NCisgKg0KKyAqIE5vZGVzIGFy ZSAyNTYgYnl0ZXMgaW4gc2l6ZSBhbmQgYXJlIGFsc28gYWxpZ25lZCB0byAyNTYgYnl0ZXMsIGdp dmluZyB1cyA4DQorICogbG93IGJpdHMgZm9yIG91ciBvd24gcHVycG9zZXMuICBOb2RlcyBhcmUg Y3VycmVudGx5IG9mIDQgdHlwZXM6DQorICogMS4gU2luZ2xlIHBvaW50ZXIgKFJhbmdlIGlzIDAt MCkNCisgKiAyLiBOb24tbGVhZiBBbGxvY2F0aW9uIFJhbmdlIG5vZGVzDQorICogMy4gTm9uLWxl YWYgUmFuZ2Ugbm9kZXMNCisgKiA0LiBMZWFmIFJhbmdlIG5vZGVzIEFsbCBub2RlcyBjb25zaXN0 IG9mIGEgbnVtYmVyIG9mIG5vZGUgc2xvdHMsDQorICogICAgcGl2b3RzLCBhbmQgYSBwYXJlbnQg cG9pbnRlci4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfbm9kZSB7DQorCXVuaW9uIHsNCisJCXN0 cnVjdCB7DQorCQkJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCQkJdm9pZCBfX3JjdSAq c2xvdFtNQVBMRV9OT0RFX1NMT1RTXTsNCisJCX07DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgKnBh ZDsNCisJCQlzdHJ1Y3QgcmN1X2hlYWQgcmN1Ow0KKwkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGl2 X3BhcmVudDsNCisJCQl1bnNpZ25lZCBjaGFyIHBhcmVudF9zbG90Ow0KKwkJCWVudW0gbWFwbGVf dHlwZSB0eXBlOw0KKwkJCXVuc2lnbmVkIGNoYXIgc2xvdF9sZW47DQorCQkJdW5zaWduZWQgaW50 IG1hX2ZsYWdzOw0KKwkJfTsNCisJCXN0cnVjdCBtYXBsZV9yYW5nZV82NCBtcjY0Ow0KKwkJc3Ry dWN0IG1hcGxlX2FyYW5nZV82NCBtYTY0Ow0KKwkJc3RydWN0IG1hcGxlX2FsbG9jIGFsbG9jOw0K Kwl9Ow0KK307DQorDQorLyoNCisgKiBNb3JlIGNvbXBsaWNhdGVkIHN0b3JlcyBjYW4gY2F1c2Ug dHdvIG5vZGVzIHRvIGJlY29tZSBvbmUgb3IgdGhyZWUgYW5kDQorICogcG90ZW50aWFsbHkgYWx0 ZXIgdGhlIGhlaWdodCBvZiB0aGUgdHJlZS4gIEVpdGhlciBoYWxmIG9mIHRoZSB0cmVlIG1heSBu ZWVkDQorICogdG8gYmUgcmViYWxhbmNlZCBhZ2FpbnN0IHRoZSBvdGhlci4gIFRoZSBtYV90b3Bp YXJ5IHN0cnVjdCBpcyB1c2VkIHRvIHRyYWNrDQorICogd2hpY2ggbm9kZXMgaGF2ZSBiZWVuICdj dXQnIGZyb20gdGhlIHRyZWUgc28gdGhhdCB0aGUgY2hhbmdlIGNhbiBiZSBkb25lDQorICogc2Fm ZWx5IGF0IGEgbGF0ZXIgZGF0ZS4gIFRoaXMgaXMgZG9uZSB0byBzdXBwb3J0IFJDVS4NCisgKi8N CitzdHJ1Y3QgbWFfdG9waWFyeSB7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqaGVhZDsNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICp0YWlsOw0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSAqbXRyZWU7DQorfTsN CisNCit2b2lkICptdHJlZV9sb2FkKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyBpbmRleCk7DQorDQoraW50IG10cmVlX2luc2VydChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVu c2lnbmVkIGxvbmcgaW5kZXgsDQorCQl2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRy ZWVfaW5zZXJ0X3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBmaXJz dCwNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCwgdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQoraW50 IG10cmVlX2FsbG9jX3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAq c3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9u ZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRyZWVfYWxs b2NfcnJhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqc3RhcnRwLA0K KwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBtaW4sDQor CQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKTsNCisNCitpbnQgbXRyZWVfc3RvcmVfcmFu Z2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJICAgICAg dW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRyZWVf c3RvcmUoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LA0KKwkJdm9p ZCAqZW50cnksIGdmcF90IGdmcCk7DQordm9pZCAqbXRyZWVfZXJhc2Uoc3RydWN0IG1hcGxlX3Ry ZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCit2b2lkIG10cmVlX2Rlc3Ryb3koc3Ry dWN0IG1hcGxlX3RyZWUgKm10KTsNCit2b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2VtcHR5KCkgLSBEZXRlcm1pbmUgaWYgYSB0cmVl IGhhcyBhbnkgcHJlc2VudCBlbnRyaWVzLg0KKyAqIEBtdDogTWFwbGUgVHJlZS4NCisgKg0KKyAq IENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqIFJldHVybjogJXRydWUgaWYgdGhlIHRyZWUgY29u dGFpbnMgb25seSBOVUxMIHBvaW50ZXJzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdHJl ZV9lbXB0eShjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4gbXQtPm1h X3Jvb3QgPT0gTlVMTDsNCit9DQorDQorLyogQWR2YW5jZWQgQVBJICovDQorDQorLyoNCisgKiBU aGUgbWFwbGUgc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgc3RydWN0IG1hX3N0YXRlIGFuZCBpcyB1 c2VkIHRvIGtlZXAgdHJhY2sNCisgKiBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgb3BlcmF0aW9ucywg YW5kIGV2ZW4gYmV0d2VlbiBvcGVyYXRpb25zIHdoZW4gdXNpbmcgdGhlDQorICogYWR2YW5jZWQg QVBJLg0KKyAqDQorICogSWYgc3RhdGUtPm5vZGUgaGFzIGJpdCAwIHNldCB0aGVuIGl0IHJlZmVy ZW5jZXMgYSB0cmVlIGxvY2F0aW9uIHdoaWNoIGlzIG5vdA0KKyAqIGEgbm9kZSAoZWcgdGhlIHJv b3QpLiAgSWYgYml0IDEgaXMgc2V0LCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgYSBuZWdhdGl2 ZQ0KKyAqIGVycm5vLiAgQml0IDIgKHRoZSAndW5hbGxvY2F0ZWQgc2xvdHMnIGJpdCkgaXMgY2xl YXIuICBCaXRzIDMtNiBpbmRpY2F0ZSB0aGUNCisgKiBub2RlIHR5cGUuDQorICoNCisgKiBzdGF0 ZS0+YWxsb2MgZWl0aGVyIGhhcyBhIHJlcXVlc3QgbnVtYmVyIG9mIG5vZGVzIG9yIGFuIGFsbG9j YXRlZCBub2RlLiAgSWYNCisgKiBzdGF0LT5hbGxvYyBoYXMgYSByZXF1ZXN0ZWQgbnVtYmVyIG9m IG5vZGVzLCB0aGUgZmlyc3QgYml0IHdpbGwgYmUgc2V0ICgweDEpDQorICogYW5kIHRoZSByZW1h aW5pbmcgYml0cyBhcmUgdGhlIHZhbHVlLiAgSWYgc3RhdGUtPmFsbG9jIGlzIGEgbm9kZSwgdGhl biB0aGUNCisgKiBub2RlIHdpbGwgYmUgb2YgdHlwZSBtYXBsZV9hbGxvYy4gIG1hcGxlX2FsbG9j IGhhcyBNQVBMRV9OT0RFX1NMT1RTIC0gMSBmb3INCisgKiBzdG9yaW5nIG1vcmUgYWxsb2NhdGVk IG5vZGVzLCBhIHRvdGFsIG51bWJlciBvZiBub2RlcyBhbGxvY2F0ZWQsIGFuZCB0aGUNCisgKiBu b2RlX2NvdW50IGluIHRoaXMgbm9kZS4gIG5vZGVfY291bnQgaXMgdGhlIG51bWJlciBvZiBhbGxv Y2F0ZWQgbm9kZXMgaW4gdGhpcw0KKyAqIG5vZGUuICBUaGUgc2NhbGluZyBiZXlvbmQgTUFQTEVf Tk9ERV9TTE9UUyAtIDEgaXMgaGFuZGxlZCBieSBzdG9yaW5nIGZ1cnRoZXINCisgKiBub2RlcyBp bnRvIHN0YXRlLT5hbGxvYy0+c2xvdFswXSdzIG5vZGUuICBOb2RlcyBhcmUgdGFrZW4gZnJvbSBz dGF0ZS0+YWxsb2MNCisgKiBieSByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgc3RhdGUtPmFsbG9j IG5vZGUgdW50aWwgc3RhdGUtPmFsbG9jLT5ub2RlX2NvdW50DQorICogaXMgMSwgd2hlbiBzdGF0 ZS0+YWxsb2MgaXMgcmV0dXJuZWQgYW5kIHRoZSBzdGF0ZS0+YWxsb2MtPnNsb3RbMF0gaXMgcHJv bW90ZWQNCisgKiB0byBzdGF0ZS0+YWxsb2MuICBOb2RlcyBhcmUgcHVzaGVkIG9udG8gc3RhdGUt PmFsbG9jIGJ5IHB1dHRpbmcgdGhlIGN1cnJlbnQNCisgKiBzdGF0ZS0+YWxsb2MgaW50byB0aGUg cHVzaGVkIG5vZGUncyBzbG90WzBdLg0KKyAqDQorICogVGhlIHN0YXRlIGFsc28gY29udGFpbnMg dGhlIGltcGxpZWQgbWluL21heCBvZiB0aGUgc3RhdGUtPm5vZGUsIHRoZSBkZXB0aCBvZg0KKyAq IHRoaXMgc2VhcmNoLCBhbmQgdGhlIG9mZnNldC4gVGhlIGltcGxpZWQgbWluL21heCBhcmUgZWl0 aGVyIGZyb20gdGhlIHBhcmVudA0KKyAqIG5vZGUgb3IgYXJlIDAtb28gZm9yIHRoZSByb290IG5v ZGUuICBUaGUgZGVwdGggaXMgaW5jcmVtZW50ZWQgb3IgZGVjcmVtZW50ZWQNCisgKiBldmVyeSB0 aW1lIGEgbm9kZSBpcyB3YWxrZWQgZG93biBvciB1cC4gIFRoZSBvZmZzZXQgaXMgdGhlIHNsb3Qv cGl2b3Qgb2YNCisgKiBpbnRlcmVzdCBpbiB0aGUgbm9kZSAtIGVpdGhlciBmb3IgcmVhZGluZyBv ciB3cml0aW5nLg0KKyAqDQorICogV2hlbiByZXR1cm5pbmcgYSB2YWx1ZSB0aGUgbWFwbGUgc3Rh dGUgaW5kZXggYW5kIGxhc3QgcmVzcGVjdGl2ZWx5IGNvbnRhaW4NCisgKiB0aGUgc3RhcnQgYW5k IGVuZCBvZiB0aGUgcmFuZ2UgZm9yIHRoZSBlbnRyeS4gIFJhbmdlcyBhcmUgaW5jbHVzaXZlIGlu IHRoZQ0KKyAqIE1hcGxlIFRyZWUuDQorICovDQorc3RydWN0IG1hX3N0YXRlIHsNCisJc3RydWN0 IG1hcGxlX3RyZWUgKnRyZWU7CS8qIFRoZSB0cmVlIHdlJ3JlIG9wZXJhdGluZyBpbiAqLw0KKwl1 bnNpZ25lZCBsb25nIGluZGV4OwkJLyogVGhlIGluZGV4IHdlJ3JlIG9wZXJhdGluZyBvbiAtIHJh bmdlIHN0YXJ0ICovDQorCXVuc2lnbmVkIGxvbmcgbGFzdDsJCS8qIFRoZSBsYXN0IGluZGV4IHdl J3JlIG9wZXJhdGluZyBvbiAtIHJhbmdlIGVuZCAqLw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5v ZGU7CS8qIFRoZSBub2RlIGNvbnRhaW5pbmcgdGhpcyBlbnRyeSAqLw0KKwl1bnNpZ25lZCBsb25n IG1pbjsJCS8qIFRoZSBtaW5pbXVtIGluZGV4IG9mIHRoaXMgbm9kZSAtIGltcGxpZWQgcGl2b3Qg bWluICovDQorCXVuc2lnbmVkIGxvbmcgbWF4OwkJLyogVGhlIG1heGltdW0gaW5kZXggb2YgdGhp cyBub2RlIC0gaW1wbGllZCBwaXZvdCBtYXggKi8NCisJc3RydWN0IG1hcGxlX2FsbG9jICphbGxv YzsJLyogQWxsb2NhdGVkIG5vZGVzIGZvciB0aGlzIG9wZXJhdGlvbiAqLw0KKwl1bnNpZ25lZCBj aGFyIGRlcHRoOwkJLyogZGVwdGggb2YgdHJlZSBkZXNjZW50IGR1cmluZyB3cml0ZSAqLw0KKwl1 bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgY2hhciBtYXNfZmxhZ3M7DQorfTsNCisN CitzdHJ1Y3QgbWFfd3Jfc3RhdGUgew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hczsNCisJc3RydWN0 IG1hcGxlX25vZGUgKm5vZGU7CS8qIERlY29kZWQgbWFzLT5ub2RlICovDQorCXVuc2lnbmVkIGxv bmcgcl9taW47CQkvKiByYW5nZSBtaW4gKi8NCisJdW5zaWduZWQgbG9uZyByX21heDsJCS8qIHJh bmdlIG1heCAqLw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsJCS8qIG1hcy0+bm9kZSB0eXBlICov DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0X2VuZDsJLyogVGhlIG9mZnNldCB3aGVyZSB0aGUgd3Jp dGUgZW5kcyAqLw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfZW5kOwkJLyogbWFzLT5ub2RlIGVuZCAq Lw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7CQkvKiBtYXMtPm5vZGUtPnBpdm90cyBwb2ludGVy ICovDQorCXVuc2lnbmVkIGxvbmcgZW5kX3BpdjsJCS8qIFRoZSBwaXZvdCBhdCB0aGUgb2Zmc2V0 IGVuZCAqLw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7CQkvKiBtYXMtPm5vZGUtPnNsb3RzIHBvaW50 ZXIgKi8NCisJdm9pZCAqZW50cnk7CQkJLyogVGhlIGVudHJ5IHRvIHdyaXRlICovDQorCXZvaWQg KmNvbnRlbnQ7CQkJLyogVGhlIGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgYmVpbmcgb3ZlcndyaXR0 ZW4gKi8NCit9Ow0KKw0KKyNkZWZpbmUgbWFzX2xvY2sobWFzKSAgICAgICAgICAgc3Bpbl9sb2Nr KCYoKG1hcyktPnRyZWUtPm1hX2xvY2spKQ0KKyNkZWZpbmUgbWFzX3VubG9jayhtYXMpICAgICAg ICAgc3Bpbl91bmxvY2soJigobWFzKS0+dHJlZS0+bWFfbG9jaykpDQorDQorDQorLyoNCisgKiBT cGVjaWFsIHZhbHVlcyBmb3IgbWFfc3RhdGUubm9kZS4NCisgKiBNQVNfU1RBUlQgbWVhbnMgd2Ug aGF2ZSBub3Qgc2VhcmNoZWQgdGhlIHRyZWUuDQorICogTUFTX1JPT1QgbWVhbnMgd2UgaGF2ZSBz ZWFyY2hlZCB0aGUgdHJlZSBhbmQgdGhlIGVudHJ5IHdlIGZvdW5kIGxpdmVzIGluDQorICogdGhl IHJvb3Qgb2YgdGhlIHRyZWUgKGllIGl0IGhhcyBpbmRleCAwLCBsZW5ndGggMSBhbmQgaXMgdGhl IG9ubHkgZW50cnkgaW4NCisgKiB0aGUgdHJlZSkuDQorICogTUFTX05PTkUgbWVhbnMgd2UgaGF2 ZSBzZWFyY2hlZCB0aGUgdHJlZSBhbmQgdGhlcmUgaXMgbm8gbm9kZSBpbiB0aGUNCisgKiB0cmVl IGZvciB0aGlzIGVudHJ5LiAgRm9yIGV4YW1wbGUsIHdlIHNlYXJjaGVkIGZvciBpbmRleCAxIGlu IGFuIGVtcHR5DQorICogdHJlZS4gIE9yIHdlIGhhdmUgYSB0cmVlIHdoaWNoIHBvaW50cyB0byBh IGZ1bGwgbGVhZiBub2RlIGFuZCB3ZQ0KKyAqIHNlYXJjaGVkIGZvciBhbiBlbnRyeSB3aGljaCBp cyBsYXJnZXIgdGhhbiBjYW4gYmUgY29udGFpbmVkIGluIHRoYXQNCisgKiBsZWFmIG5vZGUuDQor ICogTUFfRVJST1IgcmVwcmVzZW50cyBhbiBlcnJuby4gIEFmdGVyIGRyb3BwaW5nIHRoZSBsb2Nr IGFuZCBhdHRlbXB0aW5nDQorICogdG8gcmVzb2x2ZSB0aGUgZXJyb3IsIHRoZSB3YWxrIHdvdWxk IGhhdmUgdG8gYmUgcmVzdGFydGVkIGZyb20gdGhlDQorICogdG9wIG9mIHRoZSB0cmVlIGFzIHRo ZSB0cmVlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQuDQorICovDQorI2RlZmluZSBNQVNfU1RBUlQJ KChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikxVUwpDQorI2RlZmluZSBNQVNfUk9PVAkoKHN0cnVjdCBt YXBsZV9lbm9kZSAqKTVVTCkNCisjZGVmaW5lIE1BU19OT05FCSgoc3RydWN0IG1hcGxlX2Vub2Rl ICopOVVMKQ0KKyNkZWZpbmUgTUFTX1BBVVNFCSgoc3RydWN0IG1hcGxlX2Vub2RlICopMTdVTCkN CisjZGVmaW5lIE1BX0VSUk9SKGVycikgXA0KKwkJKChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikoKCh1 bnNpZ25lZCBsb25nKWVyciA8PCAyKSB8IDJVTCkpDQorDQorI2RlZmluZSBNQV9TVEFURShuYW1l LCBtdCwgZmlyc3QsIGVuZCkJCQkJCVwNCisJc3RydWN0IG1hX3N0YXRlIG5hbWUgPSB7CQkJCQlc DQorCQkudHJlZSA9IG10LAkJCQkJCVwNCisJCS5pbmRleCA9IGZpcnN0LAkJCQkJCVwNCisJCS5s YXN0ID0gZW5kLAkJCQkJCVwNCisJCS5ub2RlID0gTUFTX1NUQVJULAkJCQkJXA0KKwkJLm1pbiA9 IDAsCQkJCQkJXA0KKwkJLm1heCA9IFVMT05HX01BWCwJCQkJCVwNCisJfQ0KKw0KKyNkZWZpbmUg TUFfV1JfU1RBVEUobmFtZSwgbWFfc3RhdGUsIHdyX2VudHJ5KQkJCQlcDQorCXN0cnVjdCBtYV93 cl9zdGF0ZSBuYW1lID0gewkJCQkJXA0KKwkJLm1hcyA9IG1hX3N0YXRlLAkJCQkJXA0KKwkJLmNv bnRlbnQgPSBOVUxMLAkJCQkJXA0KKwkJLmVudHJ5ID0gd3JfZW50cnksCQkJCQlcDQorCX0NCisN CisjZGVmaW5lIE1BX1RPUElBUlkobmFtZSwgdHJlZSkJCQkJCQlcDQorCXN0cnVjdCBtYV90b3Bp YXJ5IG5hbWUgPSB7CQkJCQlcDQorCQkuaGVhZCA9IE5VTEwsCQkJCQkJXA0KKwkJLnRhaWwgPSBO VUxMLAkJCQkJCVwNCisJCS5tdHJlZSA9IHRyZWUsCQkJCQkJXA0KKwl9DQorDQordm9pZCAqbWFz X3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpOw0KK3ZvaWQgKm1hc19zdG9yZShzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdm9pZCAqZW50cnkpOw0KK3ZvaWQgKm1hc19lcmFzZShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcyk7DQoraW50IG1hc19zdG9yZV9nZnAoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQg KmVudHJ5LCBnZnBfdCBnZnApOw0KK3ZvaWQgbWFzX3N0b3JlX3ByZWFsbG9jKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB2b2lkICplbnRyeSk7DQordm9pZCAqbWFzX2ZpbmQoc3RydWN0IG1hX3N0YXRl ICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KTsNCit2b2lkICptYXNfZmluZF9yZXYoc3RydWN0IG1h X3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKTsNCitpbnQgbWFzX3ByZWFsbG9jYXRlKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCisNCitib29sIG1h c19ub21lbShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgZ2ZwX3QgZ2ZwKTsNCit2b2lkIG1hc19wYXVz ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQordm9pZCBtYXBsZV90cmVlX2luaXQodm9pZCk7DQor dm9pZCBtYXNfZGVzdHJveShzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQoraW50IG1hc19leHBlY3Rl ZF9lbnRyaWVzKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG5yX2VudHJpZXMp Ow0KKw0KK3ZvaWQgKm1hc19wcmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25n IG1pbik7DQordm9pZCAqbWFzX25leHQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxv bmcgbWF4KTsNCisNCitpbnQgbWFzX2VtcHR5X2FyZWEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVu c2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwNCisJCSAgIHVuc2lnbmVkIGxvbmcg c2l6ZSk7DQorDQorLyogQ2hlY2tzIGlmIGEgbWFzIGhhcyBub3QgZm91bmQgYW55dGhpbmcgKi8N CitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX2lzX25vbmUoc3RydWN0IG1hX3N0YXRlICptYXMpDQor ew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19OT05FOw0KK30NCisNCisvKiBDaGVja3MgaWYg YSBtYXMgaGFzIGJlZW4gcGF1c2VkICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19wYXVz ZWQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19Q QVVTRTsNCit9DQorDQordm9pZCBtYXNfZHVwX3RyZWUoc3RydWN0IG1hX3N0YXRlICpvbGRtYXMs IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCit2b2lkIG1hc19kdXBfc3RvcmUoc3RydWN0IG1hX3N0 YXRlICptYXMsIHZvaWQgKmVudHJ5KTsNCisNCisvKg0KKyAqIFRoaXMgZmluZHMgYW4gZW1wdHkg YXJlYSBmcm9tIHRoZSBoaWdoZXN0IGFkZHJlc3MgdG8gdGhlIGxvd2VzdC4NCisgKiBBS0EgIlRv cGRvd24iIHZlcnNpb24sDQorICovDQoraW50IG1hc19lbXB0eV9hcmVhX3JldihzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQkgICAgICAgdW5zaWduZWQgbG9uZyBt YXgsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7DQorLyoqDQorICogbWFzX3Jlc2V0KCkgLSBSZXNldCBh IE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlLg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0 aW9uIHN0YXRlLg0KKyAqDQorICogUmVzZXRzIHRoZSBlcnJvciBvciB3YWxrIHN0YXRlIG9mIHRo ZSBAbWFzIHNvIGZ1dHVyZSB3YWxrcyBvZiB0aGUNCisgKiBhcnJheSB3aWxsIHN0YXJ0IGZyb20g dGhlIHJvb3QuICBVc2UgdGhpcyBpZiB5b3UgaGF2ZSBkcm9wcGVkIHRoZQ0KKyAqIGxvY2sgYW5k IHdhbnQgdG8gcmV1c2UgdGhlIG1hX3N0YXRlLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRl eHQuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19yZXNldChzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCit9DQorDQorLyoqDQorICogbWFz X2Zvcl9lYWNoKCkgLSBJdGVyYXRlIG92ZXIgYSByYW5nZSBvZiB0aGUgbWFwbGUgdHJlZS4NCisg KiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZSAobWFwbGVfc3RhdGUpDQorICogQGVu dHJ5OiBFbnRyeSByZXRyaWV2ZWQgZnJvbSB0aGUgdHJlZQ0KKyAqIEBtYXg6IG1heGltdW0gaW5k ZXggdG8gcmV0cmlldmUgZnJvbSB0aGUgdHJlZQ0KKyAqDQorICogV2hlbiByZXR1cm5lZCwgbWFz LT5pbmRleCBhbmQgbWFzLT5sYXN0IHdpbGwgaG9sZCB0aGUgZW50aXJlIHJhbmdlIGZvciB0aGUN CisgKiBlbnRyeS4NCisgKg0KKyAqIE5vdGU6IG1heSByZXR1cm4gdGhlIHplcm8gZW50cnkuDQor ICoNCisgKi8NCisjZGVmaW5lIG1hc19mb3JfZWFjaChtYXMsIGVudHJ5LCBtYXgpIFwNCisJd2hp bGUgKCgoZW50cnkpID0gbWFzX2ZpbmQoKG1hcyksIChtYXgpKSkgIT0gTlVMTCkNCisNCisNCisv KioNCisgKiBtYXNfc2V0X3JhbmdlKCkgLSBTZXQgdXAgTWFwbGUgVHJlZSBvcGVyYXRpb24gc3Rh dGUgZm9yIGEgZGlmZmVyZW50IGluZGV4Lg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9u IHN0YXRlLg0KKyAqIEBzdGFydDogTmV3IHN0YXJ0IG9mIHJhbmdlIGluIHRoZSBNYXBsZSBUcmVl Lg0KKyAqIEBsYXN0OiBOZXcgZW5kIG9mIHJhbmdlIGluIHRoZSBNYXBsZSBUcmVlLg0KKyAqDQor ICogTW92ZSB0aGUgb3BlcmF0aW9uIHN0YXRlIHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IHJhbmdl LiAgVGhpcyB3aWxsDQorICogaGF2ZSB0aGUgZWZmZWN0IG9mIHN0YXJ0aW5nIGEgd2FsayBmcm9t IHRoZSB0b3A7IHNlZSBtYXNfbmV4dCgpDQorICogdG8gbW92ZSB0byBhbiBhZGphY2VudCBpbmRl eC4NCisgKi8NCitzdGF0aWMgaW5saW5lDQordm9pZCBtYXNfc2V0X3JhbmdlKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxhc3QpDQorew0K KwkgICAgICAgbWFzLT5pbmRleCA9IHN0YXJ0Ow0KKwkgICAgICAgbWFzLT5sYXN0ID0gbGFzdDsN CisJICAgICAgIG1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCit9DQorDQorLyoqDQorICogbWFzX3Nl dCgpIC0gU2V0IHVwIE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlIGZvciBhIGRpZmZlcmVudCBp bmRleC4NCisgKiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAaW5kZXg6 IE5ldyBpbmRleCBpbnRvIHRoZSBNYXBsZSBUcmVlLg0KKyAqDQorICogTW92ZSB0aGUgb3BlcmF0 aW9uIHN0YXRlIHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IGluZGV4LiAgVGhpcyB3aWxsDQorICog aGF2ZSB0aGUgZWZmZWN0IG9mIHN0YXJ0aW5nIGEgd2FsayBmcm9tIHRoZSB0b3A7IHNlZSBtYXNf bmV4dCgpDQorICogdG8gbW92ZSB0byBhbiBhZGphY2VudCBpbmRleC4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgbWFzX3NldChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBp bmRleCkNCit7DQorDQorCW1hc19zZXRfcmFuZ2UobWFzLCBpbmRleCwgaW5kZXgpOw0KK30NCisN CitzdGF0aWMgaW5saW5lIGJvb2wgbXRfZXh0ZXJuYWxfbG9jayhjb25zdCBzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQpDQorew0KKwlyZXR1cm4gKG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX0xPQ0tfTUFT SykgPT0gTVRfRkxBR1NfTE9DS19FWFRFUk47DQorfQ0KKw0KKy8qKg0KKyAqIG10X2luaXRfZmxh Z3MoKSAtIEluaXRpYWxpc2UgYW4gZW1wdHkgbWFwbGUgdHJlZSB3aXRoIGZsYWdzLg0KKyAqIEBt dDogTWFwbGUgVHJlZQ0KKyAqIEBmbGFnczogbWFwbGUgdHJlZSBmbGFncy4NCisgKg0KKyAqIElm IHlvdSBuZWVkIHRvIGluaXRpYWxpc2UgYSBNYXBsZSBUcmVlIHdpdGggc3BlY2lhbCBmbGFncyAo ZWcsIGFuDQorICogYWxsb2NhdGlvbiB0cmVlKSwgdXNlIHRoaXMgZnVuY3Rpb24uDQorICoNCisg KiBDb250ZXh0OiBBbnkgY29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfaW5p dF9mbGFncyhzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGludCBmbGFncykNCit7DQor CW10LT5tYV9mbGFncyA9IGZsYWdzOw0KKwlpZiAoIW10X2V4dGVybmFsX2xvY2sobXQpKQ0KKwkJ c3Bpbl9sb2NrX2luaXQoJm10LT5tYV9sb2NrKTsNCisJcmN1X2Fzc2lnbl9wb2ludGVyKG10LT5t YV9yb290LCBOVUxMKTsNCit9DQorDQorLyoqDQorICogbXRfaW5pdCgpIC0gSW5pdGlhbGlzZSBh biBlbXB0eSBtYXBsZSB0cmVlLg0KKyAqIEBtdDogTWFwbGUgVHJlZQ0KKyAqDQorICogQW4gZW1w dHkgTWFwbGUgVHJlZS4NCisgKg0KKyAqIENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtdF9pbml0KHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCW10 X2luaXRfZmxhZ3MobXQsIDApOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRfaW5fcmN1 KHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorI2lmZGVmIENPTkZJR19NQVBMRV9SQ1VfRElT QUJMRUQNCisJcmV0dXJuIGZhbHNlOw0KKyNlbmRpZg0KKwlyZXR1cm4gbXQtPm1hX2ZsYWdzICYg TVRfRkxBR1NfVVNFX1JDVTsNCit9DQorDQorLyoqDQorICogbXRfY2xlYXJfaW5fcmN1KCkgLSBT d2l0Y2ggdGhlIHRyZWUgdG8gbm9uLVJDVSBtb2RlLg0KKyAqIEBtdDogVGhlIE1hcGxlIFRyZWUN CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfY2xlYXJfaW5fcmN1KHN0cnVjdCBtYXBsZV90 cmVlICptdCkNCit7DQorCWlmICghbXRfaW5fcmN1KG10KSkNCisJCXJldHVybjsNCisNCisJaWYg KG10X2V4dGVybmFsX2xvY2sobXQpKSB7DQorCQlCVUdfT04oIW10X2xvY2tfaXNfaGVsZChtdCkp Ow0KKwkJbXQtPm1hX2ZsYWdzICY9IH5NVF9GTEFHU19VU0VfUkNVOw0KKwl9IGVsc2Ugew0KKwkJ bXRyZWVfbG9jayhtdCk7DQorCQltdC0+bWFfZmxhZ3MgJj0gfk1UX0ZMQUdTX1VTRV9SQ1U7DQor CQltdHJlZV91bmxvY2sobXQpOw0KKwl9DQorfQ0KKw0KKy8qKg0KKyAqIG10X3NldF9pbl9yY3Uo KSAtIFN3aXRjaCB0aGUgdHJlZSB0byBSQ1Ugc2FmZSBtb2RlLg0KKyAqIEBtdDogVGhlIE1hcGxl IFRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfc2V0X2luX3JjdShzdHJ1Y3QgbWFw bGVfdHJlZSAqbXQpDQorew0KKwlpZiAobXRfaW5fcmN1KG10KSkNCisJCXJldHVybjsNCisNCisJ aWYgKG10X2V4dGVybmFsX2xvY2sobXQpKSB7DQorCQlCVUdfT04oIW10X2xvY2tfaXNfaGVsZCht dCkpOw0KKwkJbXQtPm1hX2ZsYWdzIHw9IE1UX0ZMQUdTX1VTRV9SQ1U7DQorCX0gZWxzZSB7DQor CQltdHJlZV9sb2NrKG10KTsNCisJCW10LT5tYV9mbGFncyB8PSBNVF9GTEFHU19VU0VfUkNVOw0K KwkJbXRyZWVfdW5sb2NrKG10KTsNCisJfQ0KK30NCisNCit2b2lkICptdF9maW5kKHN0cnVjdCBt YXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KTsN Cit2b2lkICptdF9maW5kX2FmdGVyKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyAqaW5kZXgsDQorCQkgICAgdW5zaWduZWQgbG9uZyBtYXgpOw0KK3ZvaWQgKm10X3ByZXYoc3Ry dWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCAgdW5zaWduZWQgbG9uZyBt aW4pOw0KK3ZvaWQgKm10X25leHQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25n IGluZGV4LCB1bnNpZ25lZCBsb25nIG1heCk7DQorDQorLyoqDQorICogbXRfZm9yX2VhY2ggLSBJ dGVyYXRlIG92ZXIgZWFjaCBlbnRyeSBzdGFydGluZyBhdCBpbmRleCB1bnRpbCBtYXguDQorICog QHRyZWU6IFRoZSBNYXBsZSBUcmVlDQorICogQGVudHJ5OiBUaGUgY3VycmVudCBlbnRyeQ0KKyAq IEBpbmRleDogVGhlIGluZGV4IHRvIHVwZGF0ZSB0byB0cmFjayB0aGUgbG9jYXRpb24gaW4gdGhl IHRyZWUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBsaW1pdCBmb3IgQGluZGV4DQorICoNCisgKiBO b3RlOiBXaWxsIG5vdCByZXR1cm4gdGhlIHplcm8gZW50cnkuDQorICovDQorI2RlZmluZSBtdF9m b3JfZWFjaCh0cmVlLCBlbnRyeSwgaW5kZXgsIG1heCkgXA0KKwlmb3IgKGVudHJ5ID0gbXRfZmlu ZCh0cmVlLCAmKGluZGV4KSwgbWF4KTsgXA0KKwkJZW50cnk7IGVudHJ5ID0gbXRfZmluZF9hZnRl cih0cmVlLCAmKGluZGV4KSwgbWF4KSkNCisNCisNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExF X1RSRUUNCitleHRlcm4gYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19ydW47DQorZXh0ZXJuIGF0 b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkOw0KKw0KK3ZvaWQgbXRfZHVtcChjb25zdCBz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQpOw0KK3ZvaWQgbXRfdmFsaWRhdGUoc3RydWN0IG1hcGxlX3Ry ZWUgKm10KTsNCisjZGVmaW5lIE1UX0JVR19PTih0cmVlLCB4KSBkbyB7CQkJCQkJXA0KKwlhdG9t aWNfaW5jKCZtYXBsZV90cmVlX3Rlc3RzX3J1bik7CQkJCVwNCisJaWYgKHgpIHsJCQkJCQkJXA0K KwkJcHJfaW5mbygiQlVHIGF0ICVzOiVkICgldSlcbiIsCQkJCVwNCisJCV9fZnVuY19fLCBfX0xJ TkVfXywgeCk7CQkJCQlcDQorCQltdF9kdW1wKHRyZWUpOwkJCQkJCVwNCisJCXByX2luZm8oIlBh c3M6ICV1IFJ1bjoldVxuIiwJCQkJXA0KKwkJCWF0b21pY19yZWFkKCZtYXBsZV90cmVlX3Rlc3Rz X3Bhc3NlZCksCQlcDQorCQkJYXRvbWljX3JlYWQoJm1hcGxlX3RyZWVfdGVzdHNfcnVuKSk7CQlc DQorCQlkdW1wX3N0YWNrKCk7CQkJCQkJXA0KKwl9IGVsc2UgewkJCQkJCQlcDQorCQlhdG9taWNf aW5jKCZtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCk7CQkJXA0KKwl9CQkJCQkJCQlcDQorfSB3aGls ZSAoMCkNCisjZWxzZQ0KKyNkZWZpbmUgTVRfQlVHX09OKHRyZWUsIHgpIEJVR19PTih4KQ0KKyNl bmRpZiAvKiBDT05GSUdfREVCVUdfTUFQTEVfVFJFRSAqLw0KKw0KKyNlbmRpZiAvKl9MSU5VWF9N QVBMRV9UUkVFX0ggKi8NCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90 cmVlLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUg MTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmZiZDE1ODM5ZjlhYQ0KLS0tIC9kZXYvbnVsbA0K KysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDEyMyBA QA0KKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovDQorI3VuZGVmIFRSQUNF X1NZU1RFTQ0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIG1hcGxlX3RyZWUNCisNCisjaWYgIWRlZmlu ZWQoX1RSQUNFX01NX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpDQorI2Rl ZmluZSBfVFJBQ0VfTU1fSA0KKw0KKw0KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+DQor DQorc3RydWN0IG1hX3N0YXRlOw0KKw0KK1RSQUNFX0VWRU5UKG1hX29wLA0KKw0KKwlUUF9QUk9U Tyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRlICptYXMpLA0KKw0KKwlUUF9BUkdTKGZu LCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmllbGQoY29uc3QgY2hhciAq LCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJCQlfX2ZpZWxkKHVuc2ln bmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJCV9f ZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJ KSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19l bnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJ CQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFz LT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlUUF9w cmludGsoIiVzXHROb2RlOiAlcHggKCVsdSAlbHUpIHJhbmdlOiAlbHUtJWx1IiwNCisJCSAgX19l bnRyeS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBs b25nKSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQor CQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcp IF9fZW50cnktPmxhc3QNCisJKQ0KKykNCitUUkFDRV9FVkVOVChtYV9yZWFkLA0KKw0KKwlUUF9Q Uk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRlICptYXMpLA0KKw0KKwlUUF9BUkdT KGZuLCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmllbGQoY29uc3QgY2hh ciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJCQlfX2ZpZWxkKHVu c2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJ CV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkN CisJKSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJ X19lbnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsN CisJCQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0g bWFzLT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlU UF9wcmludGsoIiVzXHROb2RlOiAlcHggKCVsdSAlbHUpIHJhbmdlOiAlbHUtJWx1IiwNCisJCSAg X19lbnRyeS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25l ZCBsb25nKSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgs DQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxv bmcpIF9fZW50cnktPmxhc3QNCisJKQ0KKykNCisNCitUUkFDRV9FVkVOVChtYV93cml0ZSwNCisN CisJVFBfUFJPVE8oY29uc3QgY2hhciAqZm4sIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25l ZCBsb25nIHBpdiwNCisJCSB2b2lkICp2YWwpLA0KKw0KKwlUUF9BUkdTKGZuLCBtYXMsIHBpdiwg dmFsKSwNCisNCisJVFBfU1RSVUNUX19lbnRyeSgNCisJCQlfX2ZpZWxkKGNvbnN0IGNoYXIgKiwg Zm4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBtaW4pDQorCQkJX19maWVsZCh1bnNpZ25l ZCBsb25nLCBtYXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBpbmRleCkNCisJCQlfX2Zp ZWxkKHVuc2lnbmVkIGxvbmcsIGxhc3QpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBwaXYp DQorCQkJX19maWVsZCh2b2lkICosIHZhbCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJ KSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19l bnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJ CQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFz LT5sYXN0Ow0KKwkJCV9fZW50cnktPnBpdgkJPSBwaXY7DQorCQkJX19lbnRyeS0+dmFsCQk9IHZh bDsNCisJCQlfX2VudHJ5LT5ub2RlCQk9IG1hcy0+bm9kZTsNCisJKSwNCisNCisJVFBfcHJpbnRr KCIlc1x0Tm9kZSAlcHggKCVsdSAlbHUpIHJhbmdlOiVsdS0lbHUgcGl2ICglbHUpIHZhbCAlcHgi LA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+bm9kZSwNCisJCSAg KHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50 cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LA0KKwkJICAodW5z aWduZWQgbG9uZykgX19lbnRyeS0+bGFzdCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnkt PnBpdiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+dmFsDQorCSkNCispDQorI2VuZGlmIC8qIF9U UkFDRV9NTV9IICovDQorDQorLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9u ICovDQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPg0KZGlmZiAtLWdpdCBhL2luaXQv bWFpbi5jIGIvaW5pdC9tYWluLmMNCmluZGV4IDk4MTgyYzNjMmM0Yi4uMjU0MWE2ZTlmYTQxIDEw MDY0NA0KLS0tIGEvaW5pdC9tYWluLmMNCisrKyBiL2luaXQvbWFpbi5jDQpAQCAtMTE2LDYgKzEx Niw3IEBAIHN0YXRpYyBpbnQga2VybmVsX2luaXQodm9pZCAqKTsNCiANCiBleHRlcm4gdm9pZCBp bml0X0lSUSh2b2lkKTsNCiBleHRlcm4gdm9pZCByYWRpeF90cmVlX2luaXQodm9pZCk7DQorZXh0 ZXJuIHZvaWQgbWFwbGVfdHJlZV9pbml0KHZvaWQpOw0KIA0KIC8qDQogICogRGVidWcgaGVscGVy OiB2aWEgdGhpcyBmbGFnIHdlIGtub3cgdGhhdCB3ZSBhcmUgaW4gJ2Vhcmx5IGJvb3R1cCBjb2Rl Jw0KQEAgLTEwMDEsNiArMTAwMiw3IEBAIGFzbWxpbmthZ2UgX192aXNpYmxlIHZvaWQgX19pbml0 IF9fbm9fc2FuaXRpemVfYWRkcmVzcyBzdGFydF9rZXJuZWwodm9pZCkNCiAJCSAiSW50ZXJydXB0 cyB3ZXJlIGVuYWJsZWQgKnZlcnkqIGVhcmx5LCBmaXhpbmcgaXRcbiIpKQ0KIAkJbG9jYWxfaXJx X2Rpc2FibGUoKTsNCiAJcmFkaXhfdHJlZV9pbml0KCk7DQorCW1hcGxlX3RyZWVfaW5pdCgpOw0K IA0KIAkvKg0KIAkgKiBTZXQgdXAgaG91c2VrZWVwaW5nIGJlZm9yZSBzZXR0aW5nIHVwIHdvcmtx dWV1ZXMgdG8gYWxsb3cgdGhlIHVuYm91bmQNCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1 ZyBiL2xpYi9LY29uZmlnLmRlYnVnDQppbmRleCAwNzVjZDI1MzYzYWMuLjNkOTM2NjA3NTE1MyAx MDA2NDQNCi0tLSBhL2xpYi9LY29uZmlnLmRlYnVnDQorKysgYi9saWIvS2NvbmZpZy5kZWJ1Zw0K QEAgLTg0NSw2ICs4NDUsMTMgQEAgY29uZmlnIERFQlVHX1ZNX1ZNQUNBQ0hFDQogCSAgY2FuIGNh dXNlIHNpZ25pZmljYW50IG92ZXJoZWFkLCBzbyBvbmx5IGVuYWJsZSBpdCBpbiBub24tcHJvZHVj dGlvbg0KIAkgIGVudmlyb25tZW50cy4NCiANCitjb25maWcgREVCVUdfVk1fTUFQTEVfVFJFRQ0K Kwlib29sICJEZWJ1ZyBWTSBtYXBsZSB0cmVlcyINCisJZGVwZW5kcyBvbiBERUJVR19WTQ0KKwlz ZWxlY3QgREVCVUdfTUFQTEVfVFJFRQ0KKwloZWxwDQorCSAgRW5hYmxlIFZNIG1hcGxlIHRyZWUg ZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBleHRyYSB2YWxpZGF0aW9ucy4NCisNCiAJICBJZiB1 bnN1cmUsIHNheSBOLg0KIA0KIGNvbmZpZyBERUJVR19WTV9SQg0KQEAgLTE3MDUsNiArMTcxMiwx NCBAQCBjb25maWcgQlVHX09OX0RBVEFfQ09SUlVQVElPTg0KIA0KIAkgIElmIHVuc3VyZSwgc2F5 IE4uDQogDQorY29uZmlnIERFQlVHX01BUExFX1RSRUUNCisJYm9vbCAiRGVidWcgbWFwbGUgdHJl ZXMiDQorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMDQorCWhlbHANCisJICBFbmFibGUgbWFwbGUg dHJlZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIGV4dHJhIHZhbGlkYXRpb25zLg0KKw0KKwkg IElmIHVuc3VyZSwgc2F5IE4uDQorDQogZW5kbWVudQ0KIA0KIGNvbmZpZyBERUJVR19DUkVERU5U SUFMUw0KZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQ0KaW5kZXggNmI5 ZmZjMWJkMWVlLi4yOGI0MTM2M2E2MzYgMTAwNjQ0DQotLS0gYS9saWIvTWFrZWZpbGUNCisrKyBi L2xpYi9NYWtlZmlsZQ0KQEAgLTI5LDcgKzI5LDggQEAgZW5kaWYNCiANCiBsaWIteSA6PSBjdHlw ZS5vIHN0cmluZy5vIHZzcHJpbnRmLm8gY21kbGluZS5vIFwNCiAJIHJidHJlZS5vIHJhZGl4LXRy ZWUubyB0aW1lcnF1ZXVlLm8geGFycmF5Lm8gXA0KLQkgaWRyLm8gZXh0YWJsZS5vIHNoYTEubyBp cnFfcmVncy5vIGFyZ3Zfc3BsaXQubyBcDQorCSBtYXBsZV90cmVlLm8gaWRyLm8gZXh0YWJsZS5v IFwNCisJIHNoYTEubyBpcnFfcmVncy5vIGFyZ3Zfc3BsaXQubyBcDQogCSBmbGV4X3Byb3BvcnRp b25zLm8gcmF0ZWxpbWl0Lm8gc2hvd19tZW0ubyBcDQogCSBpc19zaW5nbGVfdGhyZWFkZWQubyBw bGlzdC5vIGRlY29tcHJlc3MubyBrb2JqZWN0X3VldmVudC5vIFwNCiAJIGVhcmx5Y3Bpby5vIHNl cV9idWYubyBzaXBoYXNoLm8gZGVjX2FuZF9sb2NrLm8gXA0KZGlmZiAtLWdpdCBhL2xpYi9tYXBs ZV90cmVlLmMgYi9saWIvbWFwbGVfdHJlZS5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXgg MDAwMDAwMDAwMDAwLi43NWZkMTE5ZjgyMjQNCi0tLSAvZGV2L251bGwNCisrKyBiL2xpYi9tYXBs ZV90cmVlLmMNCkBAIC0wLDAgKzEsNjk2NCBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wKw0KKy8qDQorICogTWFwbGUgVHJlZSBpbXBsZW1lbnRhdGlvbg0KKyAqIENvcHly aWdodCAoYykgMjAxOC0yMDIyIE9yYWNsZSBDb3Jwb3JhdGlvbg0KKyAqIEF1dGhvcnM6IExpYW0g Ui4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20+DQorICoJICAgIE1hdHRoZXcgV2ls Y294IDx3aWxseUBpbmZyYWRlYWQub3JnPg0KKyAqLw0KKw0KKy8qDQorICogRE9DOiBJbnRlcmVz dGluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZSBNYXBsZSBUcmVlDQorICoNCisgKiBF YWNoIG5vZGUgdHlwZSBoYXMgYSBudW1iZXIgb2Ygc2xvdHMgZm9yIGVudHJpZXMgYW5kIGEgbnVt YmVyIG9mIHNsb3RzIGZvcg0KKyAqIHBpdm90cy4gIEluIHRoZSBjYXNlIG9mIGRlbnNlIG5vZGVz LCB0aGUgcGl2b3RzIGFyZSBpbXBsaWVkIGJ5IHRoZSBwb3NpdGlvbg0KKyAqIGFuZCBhcmUgc2lt cGx5IHRoZSBzbG90IGluZGV4ICsgdGhlIG1pbmltdW0gb2YgdGhlIG5vZGUuDQorICoNCisgKiBJ biByZWd1bGFyIEItVHJlZSB0ZXJtcywgcGl2b3RzIGFyZSBjYWxsZWQga2V5cy4gIFRoZSB0ZXJt IHBpdm90IGlzIHVzZWQgdG8NCisgKiBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlIGlzIHNwZWNpZnlp bmcgcmFuZ2VzLCAgUGl2b3RzIG1heSBhcHBlYXIgaW4gdGhlDQorICogc3VidHJlZSB3aXRoIGFu IGVudHJ5IGF0dGFjaGVkIHRvIHRoZSB2YWx1ZSB3aGVyZSBhcyBrZXlzIGFyZSB1bmlxdWUgdG8g YQ0KKyAqIHNwZWNpZmljIHBvc2l0aW9uIG9mIGEgQi10cmVlLiAgUGl2b3QgdmFsdWVzIGFyZSBp bmNsdXNpdmUgb2YgdGhlIHNsb3Qgd2l0aA0KKyAqIHRoZSBzYW1lIGluZGV4Lg0KKyAqDQorICoN CisgKiBUaGUgZm9sbG93aW5nIGlsbHVzdHJhdGVzIHRoZSBsYXlvdXQgb2YgYSByYW5nZTY0IG5v ZGVzIHNsb3RzIGFuZCBwaXZvdHMuDQorICoNCisgKg0KKyAqICBTbG90cyAtPiB8IDAgfCAxIHwg MiB8IC4uLiB8IDEyIHwgMTMgfCAxNCB8IDE1IHwNCisgKiAgICAgICAgICAg4pSsICAg4pSsICAg 4pSsICAg4pSsICAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsDQorICogICAgICAg ICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAg IOKUlOKUgCBJbXBsaWVkIG1heGltdW0NCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg 4pSCICAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIAgUGl2b3QgMTQNCisgKiAgICAgICAg ICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilIIgICAg4pSCICAgIOKUlOKUgCBQaXZvdCAx Mw0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKUgiAgICDilJTilIAg UGl2b3QgMTINCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilJTilIAg UGl2b3QgMTENCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSU4pSAIFBpdm90IDIN CisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSU4pSAIFBpdm90IDENCisgKiAgICAgICAgICAg 4pSCICAg4pSU4pSAIFBpdm90IDANCisgKiAgICAgICAgICAg4pSU4pSAICBJbXBsaWVkIG1pbmlt dW0NCisgKg0KKyAqIFNsb3QgY29udGVudHM6DQorICogIEludGVybmFsIChub24tbGVhZikgbm9k ZXMgY29udGFpbiBwb2ludGVycyB0byBvdGhlciBub2Rlcy4NCisgKiAgTGVhZiBub2RlcyBjb250 YWluIGVudHJpZXMuDQorICoNCisgKiBUaGUgbG9jYXRpb24gb2YgaW50ZXJlc3QgaXMgb2Z0ZW4g cmVmZXJyZWQgdG8gYXMgYW4gb2Zmc2V0LiAgQWxsIG9mZnNldHMgaGF2ZQ0KKyAqIGEgc2xvdCwg YnV0IHRoZSBsYXN0IG9mZnNldCBoYXMgYW4gaW1wbGllZCBwaXZvdCBmcm9tIHRoZSBub2RlIGFi b3ZlIChvcg0KKyAqIFVJTlRfTUFYIGZvciB0aGUgcm9vdCBub2RlLg0KKyAqDQorICogUmFuZ2Vz IGNvbXBsaWNhdGUgY2VydGFpbiB3cml0ZSBhY3Rpdml0aWVzLiAgV2hlbiBtb2RpZnlpbmcgYW55 IG9mDQorICogdGhlIEItdHJlZSB2YXJpYW50cywgaXQgaXMga25vd24gdGhhdCBvbmUgZW50cnkg d2lsbCBlaXRoZXIgYmUgYWRkZWQgb3INCisgKiBkZWxldGVkLiAgV2hlbiBtb2RpZnlpbmcgdGhl IE1hcGxlIFRyZWUsIG9uZSBzdG9yZSBvcGVyYXRpb24gbWF5IG92ZXJ3cml0ZQ0KKyAqIHRoZSBl bnRpcmUgZGF0YSBzZXQsIG9yIG9uZSBoYWxmIG9mIHRoZSB0cmVlLCBvciB0aGUgbWlkZGxlIGhh bGYgb2YgdGhlIHRyZWUuDQorICoNCisgKi8NCisNCisNCisjaW5jbHVkZSA8bGludXgvbWFwbGVf dHJlZS5oPg0KKyNpbmNsdWRlIDxsaW51eC94YXJyYXkuaD4NCisjaW5jbHVkZSA8bGludXgvdHlw ZXMuaD4NCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4NCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+DQorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+ DQorDQorI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTDQorI2luY2x1ZGUgPHRyYWNlL2V2ZW50 cy9tYXBsZV90cmVlLmg+DQorDQorI2RlZmluZSBNQV9ST09UX1BBUkVOVCAxDQorDQorLyogTWFw bGUgc3RhdGUgZmxhZ3MgKi8NCisjZGVmaW5lIE1BX1NUQVRFX0JVTEsJCTENCisjZGVmaW5lIE1B X1NUQVRFX1JFQkFMQU5DRQkyDQorDQorI2RlZmluZSBtYV9wYXJlbnRfcHRyKHgpICgoc3RydWN0 IG1hcGxlX3Bub2RlICopKHgpKQ0KKyNkZWZpbmUgbWFfbW5vZGVfcHRyKHgpICgoc3RydWN0IG1h cGxlX25vZGUgKikoeCkpDQorI2RlZmluZSBtYV9lbm9kZV9wdHIoeCkgKChzdHJ1Y3QgbWFwbGVf ZW5vZGUgKikoeCkpDQorc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptYXBsZV9ub2RlX2NhY2hl Ow0KKw0KKyNpZmRlZiBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KK3N0YXRpYyBjb25zdCB1bnNp Z25lZCBsb25nIG10X21heFtdID0gew0KKwlbbWFwbGVfZGVuc2VdCQk9IE1BUExFX05PREVfU0xP VFMsDQorCVttYXBsZV9sZWFmXzY0XQkJPSBVTE9OR19NQVgsDQorCVttYXBsZV9yYW5nZV82NF0J PSBVTE9OR19NQVgsDQorCVttYXBsZV9hcmFuZ2VfNjRdCT0gVUxPTkdfTUFYLA0KK307DQorI2Rl ZmluZSBtdF9ub2RlX21heCh4KSBtdF9tYXhbbXRlX25vZGVfdHlwZSh4KV0NCisjZW5kaWYNCisN CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtdF9zbG90c1tdID0gew0KKwlbbWFwbGVfZGVu c2VdCQk9IE1BUExFX05PREVfU0xPVFMsDQorCVttYXBsZV9sZWFmXzY0XQkJPSBNQVBMRV9SQU5H RTY0X1NMT1RTLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0gTUFQTEVfUkFOR0U2NF9TTE9UUywNCisJ W21hcGxlX2FyYW5nZV82NF0JPSBNQVBMRV9BUkFOR0U2NF9TTE9UUywNCit9Ow0KKyNkZWZpbmUg bXRfc2xvdF9jb3VudCh4KSBtdF9zbG90c1ttdGVfbm9kZV90eXBlKHgpXQ0KKw0KK3N0YXRpYyBj b25zdCB1bnNpZ25lZCBjaGFyIG10X3Bpdm90c1tdID0gew0KKwlbbWFwbGVfZGVuc2VdCQk9IDAs DQorCVttYXBsZV9sZWFmXzY0XQkJPSBNQVBMRV9SQU5HRTY0X1NMT1RTIC0gMSwNCisJW21hcGxl X3JhbmdlXzY0XQk9IE1BUExFX1JBTkdFNjRfU0xPVFMgLSAxLA0KKwlbbWFwbGVfYXJhbmdlXzY0 XQk9IE1BUExFX0FSQU5HRTY0X1NMT1RTIC0gMSwNCit9Ow0KKyNkZWZpbmUgbXRfcGl2b3RfY291 bnQoeCkgbXRfcGl2b3RzW210ZV9ub2RlX3R5cGUoeCldDQorDQorc3RhdGljIGNvbnN0IHVuc2ln bmVkIGNoYXIgbXRfbWluX3Nsb3RzW10gPSB7DQorCVttYXBsZV9kZW5zZV0JCT0gTUFQTEVfTk9E RV9TTE9UUyAvIDIsDQorCVttYXBsZV9sZWFmXzY0XQkJPSAoTUFQTEVfUkFOR0U2NF9TTE9UUyAv IDIpIC0gMiwNCisJW21hcGxlX3JhbmdlXzY0XQk9IChNQVBMRV9SQU5HRTY0X1NMT1RTIC8gMikg LSAyLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IChNQVBMRV9BUkFOR0U2NF9TTE9UUyAvIDIpIC0g MSwNCit9Ow0KKyNkZWZpbmUgbXRfbWluX3Nsb3RfY291bnQoeCkgbXRfbWluX3Nsb3RzW210ZV9u b2RlX3R5cGUoeCldDQorDQorI2RlZmluZSBNQVBMRV9CSUdfTk9ERV9TTE9UUwkoTUFQTEVfUkFO R0U2NF9TTE9UUyAqIDIgKyAyKQ0KKyNkZWZpbmUgTUFQTEVfQklHX05PREVfR0FQUwkoTUFQTEVf QVJBTkdFNjRfU0xPVFMgKiAyICsgMSkNCisNCitzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgew0KKwlz dHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9C SUdfTk9ERV9TTE9UUyAtIDFdOw0KKwl1bmlvbiB7DQorCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnNs b3RbTUFQTEVfQklHX05PREVfU0xPVFNdOw0KKwkJc3RydWN0IHsNCisJCQl1bnNpZ25lZCBsb25n IHBhZGRpbmdbTUFQTEVfQklHX05PREVfR0FQU107DQorCQkJdW5zaWduZWQgbG9uZyBnYXBbTUFQ TEVfQklHX05PREVfR0FQU107DQorCQl9Ow0KKwl9Ow0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kOw0K KwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCit9Ow0KKw0KKy8qDQorICogVGhlIG1hcGxlX3N1YnRy ZWVfc3RhdGUgaXMgdXNlZCB0byBidWlsZCBhIHRyZWUgdG8gcmVwbGFjZSBhIHNlZ21lbnQgb2Yg YW4NCisgKiBleGlzdGluZyB0cmVlIGluIGEgbW9yZSBhdG9taWMgd2F5LiAgQW55IHdhbGtlcnMg b2YgdGhlIG9sZGVyIHRyZWUgd2lsbCBoaXQgYQ0KKyAqIGRlYWQgbm9kZSBhbmQgcmVzdGFydCBv biB1cGRhdGVzLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlIHsNCisJc3RydWN0 IG1hX3N0YXRlICpvcmlnX2w7CS8qIE9yaWdpbmFsIGxlZnQgc2lkZSBvZiBzdWJ0cmVlICovDQor CXN0cnVjdCBtYV9zdGF0ZSAqb3JpZ19yOwkvKiBPcmlnaW5hbCByaWdodCBzaWRlIG9mIHN1YnRy ZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICpsOwkJLyogTmV3IGxlZnQgc2lkZSBvZiBzdWJ0cmVl ICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqbTsJCS8qIE5ldyBtaWRkbGUgb2Ygc3VidHJlZSAocmFy ZSkgKi8NCisJc3RydWN0IG1hX3N0YXRlICpyOwkJLyogTmV3IHJpZ2h0IHNpZGUgb2Ygc3VidHJl ZSAqLw0KKwlzdHJ1Y3QgbWFfdG9waWFyeSAqZnJlZTsJLyogbm9kZXMgdG8gYmUgZnJlZWQgKi8N CisJc3RydWN0IG1hX3RvcGlhcnkgKmRlc3Ryb3k7CS8qIE5vZGVzIHRvIGJlIGRlc3Ryb3llZCAo d2Fsa2VkIGFuZCBmcmVlZCkgKi8NCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlICpibjsNCit9Ow0K Kw0KKy8qIEZ1bmN0aW9ucyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10 X2FsbG9jX29uZShnZnBfdCBnZnApDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhtYXBs ZV9ub2RlX2NhY2hlLCBnZnAgfCBfX0dGUF9aRVJPKTsNCit9DQorDQorc3RhdGljIGlubGluZSBp bnQgbXRfYWxsb2NfYnVsayhnZnBfdCBnZnAsIHNpemVfdCBzaXplLCB2b2lkICoqbm9kZXMpDQor ew0KKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19idWxrKG1hcGxlX25vZGVfY2FjaGUsIGdmcCB8 IF9fR0ZQX1pFUk8sIHNpemUsDQorCQkJCSAgICAgbm9kZXMpOw0KK30NCisNCitzdGF0aWMgaW5s aW5lIHZvaWQgbXRfZnJlZV9idWxrKHNpemVfdCBzaXplLCB2b2lkIF9fcmN1ICoqbm9kZXMpDQor ew0KKwlrbWVtX2NhY2hlX2ZyZWVfYnVsayhtYXBsZV9ub2RlX2NhY2hlLCBzaXplLCAodm9pZCAq Kilub2Rlcyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVh ZCAqaGVhZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gY29udGFpbmVyX29mKGhl YWQsIHN0cnVjdCBtYXBsZV9ub2RlLCByY3UpOw0KKw0KKwlrbWVtX2NhY2hlX2ZyZWUobWFwbGVf bm9kZV9jYWNoZSwgbm9kZSk7DQorfQ0KKw0KKy8qDQorICogbWFfZnJlZV9yY3UoKSAtIFVzZSBy Y3UgY2FsbGJhY2sgdG8gZnJlZSBhIG1hcGxlIG5vZGUNCisgKiBAbm9kZTogVGhlIG5vZGUgdG8g ZnJlZQ0KKyAqDQorICogVGhlIG1hcGxlIHRyZWUgdXNlcyB0aGUgcGFyZW50IHBvaW50ZXIgdG8g aW5kaWNhdGUgdGhpcyBub2RlIGlzIG5vIGxvbmdlciBpbg0KKyAqIHVzZSBhbmQgd2lsbCBiZSBm cmVlZC4NCisgKi8NCitzdGF0aWMgdm9pZCBtYV9mcmVlX3JjdShzdHJ1Y3QgbWFwbGVfbm9kZSAq bm9kZSkNCit7DQorCW5vZGUtPnBhcmVudCA9IG1hX3BhcmVudF9wdHIobm9kZSk7DQorCWNhbGxf cmN1KCZub2RlLT5yY3UsIG10X2ZyZWVfcmN1KTsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIGlu dCBtdF9oZWlnaHQoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuICht dC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19IRUlHSFRfTUFTSykgPj4gTVRfRkxBR1NfSEVJR0hUX09G RlNFVDsNCit9DQorDQorc3RhdGljIHZvaWQgbWFzX3NldF9oZWlnaHQoc3RydWN0IG1hX3N0YXRl ICptYXMpDQorew0KKwl1bnNpZ25lZCBpbnQgbmV3X2ZsYWdzID0gbWFzLT50cmVlLT5tYV9mbGFn czsNCisNCisJbmV3X2ZsYWdzICY9IH5NVF9GTEFHU19IRUlHSFRfTUFTSzsNCisJQlVHX09OKG1h cy0+ZGVwdGggPiBNQVBMRV9IRUlHSFRfTUFYKTsNCisJbmV3X2ZsYWdzIHw9IG1hcy0+ZGVwdGgg PDwgTVRfRkxBR1NfSEVJR0hUX09GRlNFVDsNCisJbWFzLT50cmVlLT5tYV9mbGFncyA9IG5ld19m bGFnczsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIGludCBtYXNfbXRfaGVpZ2h0KHN0cnVjdCBt YV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG10X2hlaWdodChtYXMtPnRyZWUpOw0KK30NCisN CitzdGF0aWMgaW5saW5lIGVudW0gbWFwbGVfdHlwZSBtdGVfbm9kZV90eXBlKGNvbnN0IHN0cnVj dCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0KKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWVudHJ5 ID4+IE1BUExFX05PREVfVFlQRV9TSElGVCkgJg0KKwkJTUFQTEVfTk9ERV9UWVBFX01BU0s7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9pc19kZW5zZShjb25zdCBlbnVtIG1hcGxlX3R5 cGUgdHlwZSkNCit7DQorCXJldHVybiB0eXBlIDwgbWFwbGVfbGVhZl82NDsNCit9DQorDQorc3Rh dGljIGlubGluZSBib29sIG1hX2lzX2xlYWYoY29uc3QgZW51bSBtYXBsZV90eXBlIHR5cGUpDQor ew0KKwlyZXR1cm4gdHlwZSA8IG1hcGxlX3JhbmdlXzY0Ow0KK30NCisNCitzdGF0aWMgaW5saW5l IGJvb2wgbXRlX2lzX2xlYWYoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQor CXJldHVybiBtYV9pc19sZWFmKG10ZV9ub2RlX3R5cGUoZW50cnkpKTsNCit9DQorDQorLyoNCisg KiBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdpdGggdGhlIGJvdHRvbSB0d28gYml0cyBzZXQgdG8g JzEwJyB3aGljaCBhcmUNCisgKiBiZWxvdyA0MDk2DQorICovDQorc3RhdGljIGlubGluZSBib29s IG10X2lzX3Jlc2VydmVkKGNvbnN0IHZvaWQgKmVudHJ5KQ0KK3sNCisJcmV0dXJuICgodW5zaWdu ZWQgbG9uZyllbnRyeSA8IE1BUExFX1JFU0VSVkVEX1JBTkdFKSAmJg0KKwkJeGFfaXNfaW50ZXJu YWwoZW50cnkpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3NldF9lcnIoc3RydWN0 IG1hX3N0YXRlICptYXMsIGxvbmcgZXJyKQ0KK3sNCisJbWFzLT5ub2RlID0gTUFfRVJST1IoZXJy KTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19wdHIoc3RydWN0IG1hX3N0YXRl ICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19ST09UOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIGJvb2wgbWFzX2lzX3N0YXJ0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJ cmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfU1RBUlQ7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9v bCBtYXNfaXNfZXJyKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIHhhX2lzX2Vy cihtYXMtPm5vZGUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3NlYXJjaGFibGUo c3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkNCisJCXJl dHVybiBmYWxzZTsNCisNCisJaWYgKG1hc19pc19wdHIobWFzKSkNCisJCXJldHVybiBmYWxzZTsN CisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25v ZGUgKm10ZV90b19ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0KKwly ZXR1cm4gKHN0cnVjdCBtYXBsZV9ub2RlICopKCh1bnNpZ25lZCBsb25nKWVudHJ5ICYgfk1BUExF X05PREVfTUFTSyk7DQorfQ0KKw0KKy8qDQorICogbXRlX3RvX21hdCgpIC0gQ29udmVydCBhIG1h cGxlIGVuY29kZWQgbm9kZSB0byBhIG1hcGxlIHRvcGlhcnkgbm9kZS4NCisgKiBAZW50cnk6IFRo ZSBtYXBsZSBlbmNvZGVkIG5vZGUNCisgKg0KKyAqIFJldHVybjogYSBtYXBsZSB0b3BpYXJ5IHBv aW50ZXINCisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV90b3BpYXJ5ICptdGVfdG9f bWF0KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0KKwlyZXR1cm4gKHN0cnVj dCBtYXBsZV90b3BpYXJ5ICopDQorCQkoKHVuc2lnbmVkIGxvbmcpZW50cnkgJiB+TUFQTEVfTk9E RV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBtYXNfbW4oKSAtIEdldCB0aGUgbWFwbGUgc3RhdGUg bm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFJldHVybjogdGhlIG1h cGxlIG5vZGUgKG5vdCBlbmNvZGVkIC0gYmFyZSBwb2ludGVyKS4NCisgKi8NCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBtYXBsZV9ub2RlICptYXNfbW4oY29uc3Qgc3RydWN0IG1hX3N0YXRlICptYXMp DQorew0KKwlyZXR1cm4gbXRlX3RvX25vZGUobWFzLT5ub2RlKTsNCit9DQorDQorLyoNCisgKiBt dGVfc2V0X25vZGVfZGVhZCgpIC0gU2V0IGEgbWFwbGUgZW5jb2RlZCBub2RlIGFzIGRlYWQuDQor ICogQG1uOiBUaGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtdGVfc2V0X25vZGVfZGVhZChzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1uKQ0KK3sNCisJbXRlX3Rv X25vZGUobW4pLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKG10ZV90b19ub2RlKG1uKSk7DQorCXNt cF93bWIoKTsNCit9DQorDQorLyogQml0IDEgaW5kaWNhdGVzIHRoZSByb290IGlzIGEgbm9kZSAq Lw0KKyNkZWZpbmUgTUFQTEVfUk9PVF9OT0RFCQkJMHgwMg0KKy8qIG1hcGxlX3R5cGUgc3RvcmVk IGJpdCAzLTYgKi8NCisjZGVmaW5lIE1BUExFX0VOT0RFX1RZUEVfU0hJRlQJCTB4MDMNCisvKiBC aXQgMiBtZWFucyBhIE5VTEwgc29tZXdoZXJlIGJlbG93ICovDQorI2RlZmluZSBNQVBMRV9FTk9E RV9OVUxMCQkweDA0DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm10X21r X25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQkgICAgIGVudW0gbWFw bGVfdHlwZSB0eXBlKQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUg fA0KKwkJCSh0eXBlIDw8IE1BUExFX0VOT0RFX1RZUEVfU0hJRlQpIHwgTUFQTEVfRU5PREVfTlVM TCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRlX21rX3Jvb3QoY29uc3Qgc3RydWN0 IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25n KW5vZGUgfCBNQVBMRV9ST09UX05PREUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm10 ZV9zYWZlX3Jvb3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJcmV0dXJu ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgJiB+TUFQTEVfUk9PVF9OT0RFKTsNCit9DQor DQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9zZXRfZnVsbChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5v ZGUgKm5vZGUpDQorew0KKwlub2RlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbm9kZSAmIH5N QVBMRV9FTk9ERV9OVUxMKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9jbGVhcl9m dWxsKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCW5vZGUgPSAodm9pZCAq KSgodW5zaWduZWQgbG9uZylub2RlIHwgTUFQTEVfRU5PREVfTlVMTCk7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtYV9pc19yb290KHN0cnVjdCBtYXBsZV9ub2RlICpub2RlKQ0KK3sNCisJ cmV0dXJuICgodW5zaWduZWQgbG9uZylub2RlLT5wYXJlbnQgJiBNQV9ST09UX1BBUkVOVCk7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdGVfaXNfcm9vdChjb25zdCBzdHJ1Y3QgbWFwbGVf ZW5vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gbWFfaXNfcm9vdChtdGVfdG9fbm9kZShub2RlKSk7 DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfcm9vdF9saW1pdHMoY29uc3Qgc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gIW1hcy0+bWluICYmIG1hcy0+bWF4ID09 IFVMT05HX01BWDsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2lzX2FsbG9jKHN0cnVj dCBtYXBsZV90cmVlICptdCkNCit7DQorCXJldHVybiAobXQtPm1hX2ZsYWdzICYgTVRfRkxBR1Nf QUxMT0NfUkFOR0UpOw0KK30NCisNCisvKg0KKyAqIFRoZSBQYXJlbnQgUG9pbnRlcg0KKyAqIEV4 Y2x1ZGluZyByb290LCB0aGUgcGFyZW50IHBvaW50ZXIgaXMgMjU2QiBhbGlnbmVkIGxpa2UgYWxs IG90aGVyIHRyZWUgbm9kZXMuDQorICogV2hlbiBzdG9yaW5nIGEgMzIgb3IgNjQgYml0IHZhbHVl cywgdGhlIG9mZnNldCBjYW4gZml0IGludG8gNCBiaXRzLiAgVGhlIDE2DQorICogYml0IHZhbHVl cyBuZWVkIGFuIGV4dHJhIGJpdCB0byBzdG9yZSB0aGUgb2Zmc2V0LiAgVGhpcyBleHRyYSBiaXQg Y29tZXMgZnJvbQ0KKyAqIGEgcmV1c2Ugb2YgdGhlIGxhc3QgYml0IGluIHRoZSBub2RlIHR5cGUu ICBUaGlzIGlzIHBvc3NpYmxlIGJ5IHVzaW5nIGJpdCAxIHRvDQorICogaW5kaWNhdGUgaWYgYml0 IDIgaXMgcGFydCBvZiB0aGUgdHlwZSBvciB0aGUgc2xvdC4NCisgKg0KKyAqIE5vdGUgdHlwZXM6 DQorICogIDB4Pz8xID0gUm9vdA0KKyAqICAweD8wMCA9IDE2IGJpdCBub2Rlcw0KKyAqICAweDAx MCA9IDMyIGJpdCBub2Rlcw0KKyAqICAweDExMCA9IDY0IGJpdCBub2Rlcw0KKyAqDQorICogU2xv dCBzaXplIGFuZCBhbGlnbm1lbnQNCisgKiAgMHg/PzEgOiBSb290DQorICogIDB4PzAwIDogMTYg Yml0IHZhbHVlcywgdHlwZSBpbiAwLTEsIHNsb3QgaW4gMi02DQorICogIDB4MDEwIDogMzIgYml0 IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQorICogIDB4MTEwIDogNjQgYml0IHZh bHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQorICovDQorDQorI2RlZmluZSBNQVBMRV9Q QVJFTlRfUk9PVAkJMHgwMQ0KKw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1NMT1RfU0hJRlQJCTB4 MDMNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9TTE9UX01BU0sJCTB4NzgNCisNCisjZGVmaW5lIE1B UExFX1BBUkVOVF8xNkJfU0xPVF9TSElGVAkweDAyDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfMTZC X1NMT1RfTUFTSwkweDdDDQorDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfUkFOR0U2NAkJMHgwNg0K KyNkZWZpbmUgTUFQTEVfUEFSRU5UX1JBTkdFMzIJCTB4MDQNCisjZGVmaW5lIE1BUExFX1BBUkVO VF9OT1RfUkFOR0UxNgkweDAyDQorDQorLyoNCisgKiBtdGVfcGFyZW50X3NoaWZ0KCkgLSBHZXQg dGhlIHBhcmVudCBzaGlmdCBmb3IgdGhlIHNsb3Qgc3RvcmFnZS4NCisgKiBAcGFyZW50OiBUaGUg cGFyZW50IHBvaW50ZXIgY2FzdCBhcyBhbiB1bnNpZ25lZCBsb25nDQorICogUmV0dXJuOiBUaGUg c2hpZnQgaW50byB0aGF0IHBvaW50ZXIgdG8gdGhlIHN0YXIgdG8gb2YgdGhlIHNsb3QNCisgKi8N CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3BhcmVudF9zaGlmdCh1bnNpZ25lZCBs b25nIHBhcmVudCkNCit7DQorCS8qIE5vdGUgYml0IDEgPT0gMCBtZWFucyAxNkIgKi8NCisJaWYg KGxpa2VseShwYXJlbnQgJiBNQVBMRV9QQVJFTlRfTk9UX1JBTkdFMTYpKQ0KKwkJcmV0dXJuIE1B UExFX1BBUkVOVF9TTE9UX1NISUZUOw0KKw0KKwlyZXR1cm4gTUFQTEVfUEFSRU5UXzE2Ql9TTE9U X1NISUZUOw0KK30NCisNCisvKg0KKyAqIG10ZV9wYXJlbnRfc2xvdF9tYXNrKCkgLSBHZXQgdGhl IHNsb3QgbWFzayBmb3IgdGhlIHBhcmVudC4NCisgKiBAcGFyZW50OiBUaGUgcGFyZW50IHBvaW50 ZXIgY2FzdCBhcyBhbiB1bnNpZ25lZCBsb25nLg0KKyAqIFJldHVybjogVGhlIHNsb3QgbWFzayBm b3IgdGhhdCBwYXJlbnQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG10ZV9w YXJlbnRfc2xvdF9tYXNrKHVuc2lnbmVkIGxvbmcgcGFyZW50KQ0KK3sNCisJLyogTm90ZSBiaXQg MSA9PSAwIG1lYW5zIDE2QiAqLw0KKwlpZiAobGlrZWx5KHBhcmVudCAmIE1BUExFX1BBUkVOVF9O T1RfUkFOR0UxNikpDQorCQlyZXR1cm4gTUFQTEVfUEFSRU5UX1NMT1RfTUFTSzsNCisNCisJcmV0 dXJuIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9NQVNLOw0KK30NCisNCisvKg0KKyAqIG1hc19wYXJl bnRfZW51bSgpIC0gUmV0dXJuIHRoZSBtYXBsZV90eXBlIG9mIHRoZSBwYXJlbnQgZnJvbSB0aGUg c3RvcmVkDQorICogcGFyZW50IHR5cGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICog QG5vZGU6IFRoZSBtYXBsZV9lbm9kZSB0byBleHRyYWN0IHRoZSBwYXJlbnQncyBlbnVtDQorICog UmV0dXJuOiBUaGUgbm9kZS0+cGFyZW50IG1hcGxlX3R5cGUNCisgKi8NCitzdGF0aWMgaW5saW5l DQorZW51bSBtYXBsZV90eXBlIG10ZV9wYXJlbnRfZW51bShzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBf ZW5vZGUsDQorCQkJCXN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXVuc2lnbmVkIGxvbmcg cF90eXBlOw0KKw0KKwlwX3R5cGUgPSAodW5zaWduZWQgbG9uZylwX2Vub2RlOw0KKwlpZiAocF90 eXBlICYgTUFQTEVfUEFSRU5UX1JPT1QpDQorCQlyZXR1cm4gMDsgLyogVmFsaWRhdGVkIGluIHRo ZSBjYWxsZXIuICovDQorDQorCXBfdHlwZSAmPSBNQVBMRV9OT0RFX01BU0s7DQorCXBfdHlwZSA9 IHBfdHlwZSAmIH4oTUFQTEVfUEFSRU5UX1JPT1QgfCBtdGVfcGFyZW50X3Nsb3RfbWFzayhwX3R5 cGUpKTsNCisNCisJc3dpdGNoIChwX3R5cGUpIHsNCisJY2FzZSBNQVBMRV9QQVJFTlRfUkFOR0U2 NDogLyogb3IgTUFQTEVfUEFSRU5UX0FSQU5HRTY0ICovDQorCQlpZiAobXRfaXNfYWxsb2MobXQp KQ0KKwkJCXJldHVybiBtYXBsZV9hcmFuZ2VfNjQ7DQorCQlyZXR1cm4gbWFwbGVfcmFuZ2VfNjQ7 DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUNCitlbnVtIG1hcGxl X3R5cGUgbWFzX3BhcmVudF9lbnVtKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVf ZW5vZGUgKmVub2RlKQ0KK3sNCisJcmV0dXJuIG10ZV9wYXJlbnRfZW51bShtYV9lbm9kZV9wdHIo bXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQpLCBtYXMtPnRyZWUpOw0KK30NCisNCisvKg0KKyAq IG10ZV9zZXRfcGFyZW50KCkgLSBTZXQgdGhlIHBhcmVudCBub2RlIGFuZCBlbmNvZGUgdGhlIHNs b3QNCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICogQHBhcmVudDogVGhl IGVuY29kZWQgbWFwbGUgbm9kZSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgQGVub2RlLg0KKyAqIEBz bG90OiBUaGUgc2xvdCB0aGF0IEBlbm9kZSByZXNpZGVzIGluIEBwYXJlbnQuDQorICoNCisgKiBT bG90IG51bWJlciBpcyBlbmNvZGVkIGluIHRoZSBlbm9kZS0+cGFyZW50IGJpdCAzLTYgb3IgMi02 LCBkZXBlbmRpbmcgb24gdGhlDQorICogcGFyZW50IHR5cGUuDQorICovDQorc3RhdGljIGlubGlu ZQ0KK3ZvaWQgbXRlX3NldF9wYXJlbnQoc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSwgY29uc3Qg c3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQsDQorCQkgICAgdW5zaWduZWQgY2hhciBzbG90KQ0K K3sNCisJdW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZykgcGFyZW50Ow0KKwl1bnNp Z25lZCBsb25nIHNoaWZ0Ow0KKwl1bnNpZ25lZCBsb25nIHR5cGU7DQorCWVudW0gbWFwbGVfdHlw ZSBwX3R5cGUgPSBtdGVfbm9kZV90eXBlKHBhcmVudCk7DQorDQorCUJVR19PTihwX3R5cGUgPT0g bWFwbGVfZGVuc2UpOw0KKwlCVUdfT04ocF90eXBlID09IG1hcGxlX2xlYWZfNjQpOw0KKw0KKwlz d2l0Y2gocF90eXBlKSB7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfYXJh bmdlXzY0Og0KKwkJc2hpZnQgPSBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVDsNCisJCXR5cGUgPSBN QVBMRV9QQVJFTlRfUkFOR0U2NDsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwljYXNlIG1hcGxl X2RlbnNlOg0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlzaGlmdCA9IHR5cGUgPSAwOw0KKwkJ YnJlYWs7DQorCX0NCisNCisJdmFsICY9IH5NQVBMRV9OT0RFX01BU0s7IC8qIENsZWFyIGFsbCBu b2RlIG1ldGFkYXRhIGluIHBhcmVudCAqLw0KKwl2YWwgfD0gKHNsb3QgPDwgc2hpZnQpIHwgdHlw ZTsNCisJbXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKHZhbCk7DQor fQ0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zbG90KCkgLSBnZXQgdGhlIHBhcmVudCBzbG90IG9m IEBlbm9kZS4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICoNCisgKiBS ZXR1cm46IFRoZSBzbG90IGluIHRoZSBwYXJlbnQgbm9kZSB3aGVyZSBAZW5vZGUgcmVzaWRlcy4N CisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtdGVfcGFyZW50X3Nsb3QoY29uc3Qg c3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXVuc2lnbmVkIGxvbmcgdmFsID0gKHVu c2lnbmVkIGxvbmcpIG10ZV90b19ub2RlKGVub2RlKS0+cGFyZW50Ow0KKw0KKwkvKiBSb290LiAq Lw0KKwlpZiAodmFsICYgMSkNCisJCXJldHVybiAwOw0KKw0KKwkvKg0KKwkgKiBPa2F5IHRvIHVz ZSBNQVBMRV9QQVJFTlRfMTZCX1NMT1RfTUFTSyBhcyB0aGUgbGFzdCBiaXQgd2lsbCBiZSBsb3N0 DQorCSAqIGJ5IHNoaWZ0IGlmIHRoZSBwYXJlbnQgc2hpZnQgaXMgTUFQTEVfUEFSRU5UX1NMT1Rf U0hJRlQNCisJICovDQorCXJldHVybiAodmFsICYgTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX01BU0sp ID4+IG10ZV9wYXJlbnRfc2hpZnQodmFsKTsNCit9DQorDQorLyoNCisgKiBtdGVfcGFyZW50KCkg LSBHZXQgdGhlIHBhcmVudCBvZiBAbm9kZS4NCisgKiBAbm9kZTogVGhlIGVuY29kZWQgbWFwbGUg bm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBhcmVudCBtYXBsZSBub2RlLg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10ZV9wYXJlbnQoY29uc3Qgc3RydWN0IG1h cGxlX2Vub2RlICplbm9kZSkNCit7DQorCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZykN CisJCQkobXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQpICYgfk1BUExFX05PREVfTUFTSyk7DQor fQ0KKw0KKy8qDQorICogbWFfZGVhZF9ub2RlKCkgLSBjaGVjayBpZiB0aGUgQGVub2RlIGlzIGRl YWQuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICoNCisgKiBSZXR1cm46 IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9v bCBtYV9kZWFkX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUpDQorew0KKwlzdHJ1 Y3QgbWFwbGVfbm9kZSAqcGFyZW50ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpDQorCQkJCQkg ICAgIG5vZGUtPnBhcmVudCAmIH5NQVBMRV9OT0RFX01BU0spOw0KKw0KKwlyZXR1cm4gKHBhcmVu dCA9PSBub2RlKTsNCit9DQorLyoNCisgKiBtdGVfZGVhZF9ub2RlKCkgLSBjaGVjayBpZiB0aGUg QGVub2RlIGlzIGRlYWQuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICoN CisgKiBSZXR1cm46IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtdGVfZGVhZF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5v ZGUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50LCAqbm9kZTsNCisNCisJbm9kZSA9 IG10ZV90b19ub2RlKGVub2RlKTsNCisJcGFyZW50ID0gbXRlX3BhcmVudChlbm9kZSk7DQorCXJl dHVybiAocGFyZW50ID09IG5vZGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19hbGxvY2F0ZWQoKSAt IEdldCB0aGUgbnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZCBpbiBhIG1hcGxlIHN0YXRlLg0KKyAq IEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVGhlIG1hX3N0YXRlIGFsbG9jIG1lbWJl ciBpcyBvdmVybG9hZGVkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdA0KKyAqIGFsbG9j YXRlZCBub2RlIG9yIHRvIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIG5vZGVzIHRvIGFsbG9jYXRl LiAgSWYgYml0IDAgaXMNCisgKiBzZXQsIHRoZW4gdGhlIGFsbG9jIGNvbnRhaW5zIHRoZSBudW1i ZXIgb2YgcmVxdWVzdGVkIG5vZGVzLiAgSWYgdGhlcmUgaXMgYW4NCisgKiBhbGxvY2F0ZWQgbm9k ZSwgdGhlbiB0aGUgdG90YWwgYWxsb2NhdGVkIG5vZGVzIGlzIGluIHRoYXQgbm9kZS4NCisgKg0K KyAqIFJldHVybjogVGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBhbGxvY2F0ZWQNCisgKi8NCitz dGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWFzX2FsbG9jYXRlZChjb25zdCBzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCWlmICghbWFzLT5hbGxvYyB8fCAoKHVuc2lnbmVkIGxvbmcpbWFz LT5hbGxvYyAmIDB4MSkpDQorCQlyZXR1cm4gMDsNCisNCisJcmV0dXJuIG1hcy0+YWxsb2MtPnRv dGFsOw0KK30NCisNCisvKg0KKyAqIG1hc19zZXRfYWxsb2NfcmVxKCkgLSBTZXQgdGhlIHJlcXVl c3RlZCBudW1iZXIgb2YgYWxsb2NhdGlvbnMuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQor ICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLg0KKyAqDQorICogVGhlIHJlcXVl c3RlZCBudW1iZXIgb2YgYWxsb2NhdGlvbnMgaXMgZWl0aGVyIGluIHRoZSBmaXJzdCBhbGxvY2F0 ZWQgbm9kZSwNCisgKiBsb2NhdGVkIGluIEBtYXMtPmFsbG9jLT5yZXF1ZXN0X2NvdW50LCBvciBk aXJlY3RseSBpbiBAbWFzLT5hbGxvYyBpZiB0aGVyZSBpcw0KKyAqIG5vIGFsbG9jYXRlZCBub2Rl LiAgU2V0IHRoZSByZXF1ZXN0IGVpdGhlciBpbiB0aGUgbm9kZSBvciBkbyB0aGUgbmVjZXNzYXJ5 DQorICogZW5jb2RpbmcgdG8gc3RvcmUgaW4gQG1hcy0+YWxsb2MgZGlyZWN0bHkuDQorICovDQor c3RhdGljIGlubGluZSB2b2lkIG1hc19zZXRfYWxsb2NfcmVxKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LCB1bnNpZ25lZCBsb25nIGNvdW50KQ0KK3sNCisJaWYgKCFtYXMtPmFsbG9jIHx8ICgodW5zaWdu ZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkgew0KKwkJaWYgKCFjb3VudCkNCisJCQltYXMtPmFs bG9jID0gTlVMTDsNCisJCWVsc2UNCisJCQltYXMtPmFsbG9jID0gKHN0cnVjdCBtYXBsZV9hbGxv YyAqKSgoKGNvdW50KSA8PCAxVSkgfCAxVSk7DQorCQlyZXR1cm47DQorCX0NCisNCisJbWFzLT5h bGxvYy0+cmVxdWVzdF9jb3VudCA9IGNvdW50Ow0KK30NCisNCisvKg0KKyAqIG1hc19hbGxvY19y ZXEoKSAtIGdldCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9ucy4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFRoZSBhbGxvYyBjb3VudCBpcyBlaXRoZXIgc3Rv cmVkIGRpcmVjdGx5IGluIEBtYXMsIG9yIGluDQorICogQG1hcy0+YWxsb2MtPnJlcXVlc3RfY291 bnQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG5vZGUgYWxsb2NhdGVkLiAgRGVjb2RlDQorICog dGhlIHJlcXVlc3QgY291bnQgaWYgaXQncyBzdG9yZWQgZGlyZWN0bHkgaW4gQG1hcy0+YWxsb2Mu DQorICoNCisgKiBSZXR1cm46IFRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgY291bnQuDQorICovDQor c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWFzX2FsbG9jX3JlcShjb25zdCBzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCWlmICgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKQ0K KwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKShtYXMtPmFsbG9jKSA+PiAxOw0KKwllbHNlIGlmICht YXMtPmFsbG9jKQ0KKwkJcmV0dXJuIG1hcy0+YWxsb2MtPnJlcXVlc3RfY291bnQ7DQorCXJldHVy biAwOw0KK30NCisNCisvKg0KKyAqIG1hX3Bpdm90cygpIC0gR2V0IGEgcG9pbnRlciB0byB0aGUg bWFwbGUgbm9kZSBwaXZvdHMuDQorICogQG5vZGUgLSB0aGUgbWFwbGUgbm9kZQ0KKyAqIEB0eXBl IC0gdGhlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gdGhlIG1hcGxl IG5vZGUgcGl2b3RzDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICptYV9waXZv dHMoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQkgICBlbnVtIG1hcGxlX3R5cGUgdHlw ZSkNCit7DQorCXN3aXRjaCAodHlwZSkgew0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCXJl dHVybiBub2RlLT5tYTY0LnBpdm90Ow0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1h cGxlX2xlYWZfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bXI2NC5waXZvdDsNCisJY2FzZSBtYXBsZV9k ZW5zZToNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0K KyAqIG1hX2dhcHMoKSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgZ2Fwcy4NCisg KiBAbm9kZSAtIHRoZSBtYXBsZSBub2RlDQorICogQHR5cGUgLSB0aGUgbm9kZSB0eXBlDQorICoN CisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBnYXBzDQorICovDQorc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nICptYV9nYXBzKHN0cnVjdCBtYXBsZV9ub2RlICpub2Rl LA0KKwkJCQkgICAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJc3dpdGNoICh0eXBlKSB7 DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQuZ2FwOw0KKwlj YXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCWNhc2UgbWFwbGVf ZGVuc2U6DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoN CisgKiBtdGVfcGl2b3QoKSAtIEdldCB0aGUgcGl2b3QgYXQgQHBpdiBvZiB0aGUgbWFwbGUgZW5j b2RlZCBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKiBAcGl2OiBU aGUgcGl2b3QuDQorICoNCisgKiBSZXR1cm46IHRoZSBwaXZvdCBhdCBAcGl2IG9mIEBtbi4NCisg Ki8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3Bpdm90KGNvbnN0IHN0cnVjdCBt YXBsZV9lbm9kZSAqbW4sDQorCQkJCSB1bnNpZ25lZCBjaGFyIHBpdikNCit7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKw0KKwlpZihwaXYgPj0gbXRfcGl2 b3RzW3Bpdl0pIHsNCisJCVdBUk5fT04oMSk7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwlzd2l0Y2gg KG10ZV9ub2RlX3R5cGUobW4pKSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJu IG5vZGUtPm1hNjQucGl2b3RbcGl2XTsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBt YXBsZV9sZWFmXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1yNjQucGl2b3RbcGl2XTsNCisJY2FzZSBt YXBsZV9kZW5zZToNCisJCXJldHVybiAwOw0KKwl9DQorCXJldHVybiAwOw0KK30NCisNCisvKg0K KyAqIG1hc19zYWZlX3Bpdm90KCkgLSBnZXQgdGhlIHBpdm90IGF0IEBwaXYgb3IgbWFzLT5tYXgu DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHBpdm90czogVGhlIHBvaW50ZXIgdG8g dGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICogQHBpdjogVGhlIHBpdm90IHRvIGZldGNoDQorICog QHR5cGU6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjogVGhlIHBpdm90IGF0 IEBwaXYgd2l0aGluIHRoZSBsaW1pdCBvZiB0aGUgQHBpdm90cyBhcnJheSwgQG1hcy0+bWF4DQor ICogb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZw0KK21hc19z YWZlX3Bpdm90KGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nICpwaXZv dHMsDQorCSAgICAgICB1bnNpZ25lZCBjaGFyIHBpdiwgZW51bSBtYXBsZV90eXBlIHR5cGUpDQor ew0KKwlpZiAocGl2ID49IG10X3Bpdm90c1t0eXBlXSkNCisJCXJldHVybiBtYXMtPm1heDsNCisN CisJcmV0dXJuIHBpdm90c1twaXZdOw0KK30NCisNCisvKg0KKyAqIG1hc19zYWZlX21pbigpIC0g UmV0dXJuIHRoZSBtaW5pbXVtIGZvciBhIGdpdmVuIG9mZnNldC4NCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKiBAcGl2b3RzOiBUaGUgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZv dHMNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHBpdm90IGFycmF5DQorICoNCisg KiBSZXR1cm46IFRoZSBtaW5pbXVtIHJhbmdlIHZhbHVlIHRoYXQgaXMgY29udGFpbmVkIGluIEBv ZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nDQorbWFzX3NhZmVfbWlu KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nICpwaXZvdHMsIHVuc2lnbmVkIGNo YXIgb2Zmc2V0KQ0KK3sNCisJaWYgKGxpa2VseShvZmZzZXQpKQ0KKwkJcmV0dXJuIHBpdm90c1tv ZmZzZXQgLSAxXSArIDE7DQorDQorCXJldHVybiBtYXMtPm1pbjsNCit9DQorDQorLyoNCisgKiBt YXNfbG9naWNhbF9waXZvdCgpIC0gR2V0IHRoZSBsb2dpY2FsIHBpdm90IG9mIGEgZ2l2ZW4gb2Zm c2V0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZvdHM6IFRoZSBwb2ludGVy IHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0 aGUgcGl2b3QgYXJyYXkNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqDQorICog V2hlbiB0aGVyZSBpcyBubyB2YWx1ZSBhdCBhIHBpdm90IChiZXlvbmQgdGhlIGVuZCBvZiB0aGUg ZGF0YSksIHRoZW4gdGhlDQorICogcGl2b3QgaXMgYWN0dWFsbHkgQG1hcy0+bWF4Lg0KKyAqDQor ICogUmV0dXJuOiB0aGUgbG9naWNhbCBwaXZvdCBvZiBhIGdpdmVuIEBvZmZzZXQuDQorICovDQor c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nDQorbWFzX2xvZ2ljYWxfcGl2b3Qoc3RydWN0IG1h X3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgKnBpdm90cywNCisJCSAgdW5zaWduZWQgY2hhciBv ZmZzZXQsIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJdW5zaWduZWQgbG9uZyBscGl2ID0g bWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIG9mZnNldCwgdHlwZSk7DQorDQorCWlmIChsaWtl bHkobHBpdikpDQorCQlyZXR1cm4gbHBpdjsNCisNCisJaWYgKGxpa2VseShvZmZzZXQpKQ0KKwkJ cmV0dXJuIG1hcy0+bWF4Ow0KKw0KKwlyZXR1cm4gbHBpdjsNCit9DQorDQorLyoNCisgKiBtdGVf c2V0X3Bpdm90KCkgLSBTZXQgYSBwaXZvdCB0byBhIHZhbHVlIGluIGFuIGVuY29kZWQgbWFwbGUg bm9kZS4NCisgKiBAbW46IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAcGl2OiBUaGUgcGl2 b3Qgb2Zmc2V0DQorICogQHZhbDogVGhlIHZhbHVlIG9mIHRoZSBwaXZvdA0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtdGVfc2V0X3Bpdm90KHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4sIHVuc2ln bmVkIGNoYXIgcGl2LA0KKwkJCQl1bnNpZ25lZCBsb25nIHZhbCkNCit7DQorCXN0cnVjdCBtYXBs ZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9 IG10ZV9ub2RlX3R5cGUobW4pOw0KKw0KKwlCVUdfT04ocGl2ID49IG10X3Bpdm90c1t0eXBlXSk7 DQorCXN3aXRjaCAodHlwZSkgew0KKwlkZWZhdWx0Og0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0K KwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlub2RlLT5tcjY0LnBpdm90W3Bpdl0gPSB2YWw7DQor CQlicmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlub2RlLT5tYTY0LnBpdm90W3Bp dl0gPSB2YWw7DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJCWJyZWFrOw0KKwl9 DQorDQorfQ0KKw0KKy8qDQorICogbWFfc2xvdHMoKSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIG1h cGxlIG5vZGUgc2xvdHMuDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBtdDogVGhlIG1h cGxlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5v ZGUgc2xvdHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgX19yY3UgKiptYV9zbG90cyhzdHJ1 Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCXN3aXRjaCAobXQp IHsNCisJZGVmYXVsdDoNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlyZXR1cm4gbW4tPm1h NjQuc2xvdDsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBtYXBsZV9sZWFmXzY0Og0K KwkJcmV0dXJuIG1uLT5tcjY0LnNsb3Q7DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlyZXR1cm4g bW4tPnNsb3Q7DQorCX0NCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2xvY2tlZChjb25z dCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4gbXRfZXh0ZXJuYWxfbG9jayht dCkgPyBtdF9sb2NrX2lzX2hlbGQobXQpIDoNCisJCWxvY2tkZXBfaXNfaGVsZCgmbXQtPm1hX2xv Y2spOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm10X3Nsb3QoY29uc3Qgc3RydWN0IG1h cGxlX3RyZWUgKm10LA0KKwkJdm9pZCBfX3JjdSAqKnNsb3RzLCB1bnNpZ25lZCBjaGFyIG9mZnNl dCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2soc2xvdHNbb2Zmc2V0XSwgbXRf bG9ja2VkKG10KSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Nsb3RfbG9ja2VkKCkgLSBHZXQgdGhl IHNsb3QgdmFsdWUgd2hlbiBob2xkaW5nIHRoZSBtYXBsZSB0cmVlIGxvY2suDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQHNsb3RzOiBUaGUgcG9pbnRlciB0byB0aGUgc2xvdHMNCisg KiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHNsb3RzIGFycmF5IHRvIGZldGNoDQorICoN CisgKiBSZXR1cm46IFRoZSBlbnRyeSBzdG9yZWQgaW4gQHNsb3RzIGF0IHRoZSBAb2Zmc2V0Lg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3Nsb3RfbG9ja2VkKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMsDQorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIG9m ZnNldCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNsb3RzW29mZnNl dF0sIG10X2xvY2tlZChtYXMtPnRyZWUpKTsNCit9DQorDQorLyoNCisgKiBtYXNfc2xvdCgpIC0g R2V0IHRoZSBzbG90IHZhbHVlIHdoZW4gbm90IGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9jay4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6IFRoZSBwb2ludGVyIHRvIHRo ZSBzbG90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xvdHMgYXJyYXkgdG8g ZmV0Y2gNCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBpbiBAc2xvdHMgYXQgdGhl IEBvZmZzZXQNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19zbG90KHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMsDQorCQkJICAgICB1bnNpZ25lZCBjaGFyIG9m ZnNldCkNCit7DQorCXJldHVybiBtdF9zbG90KG1hcy0+dHJlZSwgc2xvdHMsIG9mZnNldCk7DQor fQ0KKw0KKy8qDQorICogbWFzX3Jvb3QoKSAtIEdldCB0aGUgbWFwbGUgdHJlZSByb290Lg0KKyAq IEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBvaW50ZXIgdG8g dGhlIHJvb3Qgb2YgdGhlIHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19yb290 KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVj ayhtYXMtPnRyZWUtPm1hX3Jvb3QsIG10X2xvY2tlZChtYXMtPnRyZWUpKTsNCit9DQorDQorc3Rh dGljIGlubGluZSB2b2lkICptdF9yb290X2xvY2tlZChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQor ew0KKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChtdC0+bWFfcm9vdCwgbXRfbG9j a2VkKG10KSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jvb3RfbG9ja2VkKCkgLSBHZXQgdGhlIG1h cGxlIHRyZWUgcm9vdCB3aGVuIGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9jay4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBSZXR1cm46IFRoZSBwb2ludGVyIHRvIHRoZSBy b290IG9mIHRoZSB0cmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfcm9vdF9sb2Nr ZWQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRfcm9vdF9sb2NrZWQobWFz LT50cmVlKTsNCit9DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1h X21ldGEoc3RydWN0IG1hcGxlX25vZGUgKm1uLA0KKwkJCQkJICAgICBlbnVtIG1hcGxlX3R5cGUg bXQpDQorew0KKwlzd2l0Y2ggKG10KSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0 dXJuICZtbi0+bWE2NC5tZXRhOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuICZtbi0+bXI2NC5tZXRh Ow0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFfc2V0X21ldGEoKSAtIFNldCB0aGUgbWV0YWRhdGEg aW5mb3JtYXRpb24gb2YgYSBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbXQ6 IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IG9mIHRoZSBoaWdo ZXN0IHN1Yi1nYXAgaW4gdGhpcyBub2RlLg0KKyAqIEBlbmQ6IFRoZSBlbmQgb2YgdGhlIGRhdGEg aW4gdGhpcyBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYV9zZXRfbWV0YShzdHJ1 Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJCQkgICAgICAgdW5zaWdu ZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJc3RydWN0IG1hcGxlX21l dGFkYXRhICptZXRhID0gbWFfbWV0YShtbiwgbXQpOw0KKw0KKwltZXRhLT5nYXAgPSBvZmZzZXQ7 DQorCW1ldGEtPmVuZCA9IGVuZDsNCit9DQorDQorLyoNCisgKiBtYV9tZXRhX2VuZCgpIC0gR2V0 IHRoZSBkYXRhIGVuZCBvZiBhIG5vZGUgZnJvbSB0aGUgbWV0YWRhdGENCisgKiBAbW46IFRoZSBt YXBsZSBub2RlDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICovDQorc3RhdGljIGlu bGluZSB1bnNpZ25lZCBjaGFyIG1hX21ldGFfZW5kKHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJ CQkJCWVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAqbWV0 YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJcmV0dXJuIG1ldGEtPmVuZDsNCit9DQorDQorLyoN CisgKiBtYV9tZXRhX2dhcCgpIC0gR2V0IHRoZSBsYXJnZXN0IGdhcCBsb2NhdGlvbiBvZiBhIG5v ZGUgZnJvbSB0aGUgbWV0YWRhdGENCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQorICogQG10OiBU aGUgbWFwbGUgbm9kZSB0eXBlDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1h X21ldGFfZ2FwKHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCQkJCWVudW0gbWFwbGVfdHlwZSBt dCkNCit7DQorCUJVR19PTihtdCAhPSBtYXBsZV9hcmFuZ2VfNjQpOw0KKw0KKwlyZXR1cm4gbW4t Pm1hNjQubWV0YS5nYXA7DQorfQ0KKw0KKy8qDQorICogbWFfc2V0X21ldGFfZ2FwKCkgLSBTZXQg dGhlIGxhcmdlc3QgZ2FwIGxvY2F0aW9uIGluIGEgbm9kZXMgbWV0YWRhdGENCisgKiBAbW46IFRo ZSBtYXBsZSBub2RlDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQG9mZnNldDog VGhlIGxvY2F0aW9uIG9mIHRoZSBsYXJnZXN0IGdhcC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFfc2V0X21ldGFfZ2FwKHN0cnVjdCBtYXBsZV9ub2RlICptbiwgZW51bSBtYXBsZV90eXBl IG10LA0KKwkJCQkgICB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorDQorCXN0cnVjdCBtYXBs ZV9tZXRhZGF0YSAqbWV0YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJbWV0YS0+Z2FwID0gb2Zm c2V0Ow0KK30NCisNCisvKg0KKyAqIG1hdF9hZGQoKSAtIEFkZCBhIEBkZWFkX2Vub2RlIHRvIHRo ZSBtYV90b3BpYXJ5IG9mIGEgbGlzdCBvZiBkZWFkIG5vZGVzLg0KKyAqIEBtYXQgLSB0aGUgbWFf dG9waWFyeSwgYSBsaW5rZWQgbGlzdCBvZiBkZWFkIG5vZGVzLg0KKyAqIEBkZWFkX2Vub2RlIC0g dGhlIG5vZGUgdG8gYmUgbWFya2VkIGFzIGRlYWQgYW5kIGFkZGVkIHRvIHRoZSB0YWlsIG9mIHRo ZSBsaXN0DQorICoNCisgKiBBZGQgdGhlIEBkZWFkX2Vub2RlIHRvIHRoZSBsaW5rZWQgbGlzdCBp biBAbWF0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXRfYWRkKHN0cnVjdCBtYV90b3Bp YXJ5ICptYXQsDQorCQkJICAgc3RydWN0IG1hcGxlX2Vub2RlICpkZWFkX2Vub2RlKQ0KK3sNCisJ bXRlX3NldF9ub2RlX2RlYWQoZGVhZF9lbm9kZSk7DQorCW10ZV90b19tYXQoZGVhZF9lbm9kZSkt Pm5leHQgPSBOVUxMOw0KKwlpZiAoIW1hdC0+dGFpbCkgew0KKwkJbWF0LT50YWlsID0gbWF0LT5o ZWFkID0gZGVhZF9lbm9kZTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltdGVfdG9fbWF0KG1hdC0+ dGFpbCktPm5leHQgPSBkZWFkX2Vub2RlOw0KKwltYXQtPnRhaWwgPSBkZWFkX2Vub2RlOw0KK30N CisNCitzdGF0aWMgdm9pZCBtdGVfZGVzdHJveV93YWxrKHN0cnVjdCBtYXBsZV9lbm9kZSAqLCBz dHJ1Y3QgbWFwbGVfdHJlZSAqKTsNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2ZyZWUoc3RydWN0 IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9lbm9kZSAqdXNlZCk7DQorDQorLyoNCisgKiBt YXNfbWF0X2ZyZWUoKSAtIEZyZWUgYWxsIG5vZGVzIGluIGEgZGVhZCBsaXN0Lg0KKyAqIEBtYXMg LSB0aGUgbWFwbGUgc3RhdGUNCisgKiBAbWF0IC0gdGhlIG1hX3RvcGlhcnkgbGlua2VkIGxpc3Qg b2YgZGVhZCBub2RlcyB0byBmcmVlLg0KKyAqDQorICogRnJlZSB3YWxrIGEgZGVhZCBsaXN0Lg0K KyAqLw0KK3N0YXRpYyB2b2lkIG1hc19tYXRfZnJlZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3Ry dWN0IG1hX3RvcGlhcnkgKm1hdCkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsNCisN CisJd2hpbGUgKG1hdC0+aGVhZCkgew0KKwkJbmV4dCA9IG10ZV90b19tYXQobWF0LT5oZWFkKS0+ bmV4dDsNCisJCW1hc19mcmVlKG1hcywgbWF0LT5oZWFkKTsNCisJCW1hdC0+aGVhZCA9IG5leHQ7 DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfbWF0X2Rlc3Ryb3koKSAtIEZyZWUgYWxsIG5vZGVz IGFuZCBzdWJ0cmVlcyBpbiBhIGRlYWQgbGlzdC4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRl DQorICogQG1hdCAtIHRoZSBtYV90b3BpYXJ5IGxpbmtlZCBsaXN0IG9mIGRlYWQgbm9kZXMgdG8g ZnJlZS4NCisgKg0KKyAqIERlc3Ryb3kgd2FsayBhIGRlYWQgbGlzdC4NCisgKi8NCitzdGF0aWMg dm9pZCBtYXNfbWF0X2Rlc3Ryb3koc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV90b3Bp YXJ5ICptYXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQ7DQorDQorCXdoaWxlICht YXQtPmhlYWQpIHsNCisJCW5leHQgPSBtdGVfdG9fbWF0KG1hdC0+aGVhZCktPm5leHQ7DQorCQlt dGVfZGVzdHJveV93YWxrKG1hdC0+aGVhZCwgbWF0LT5tdHJlZSk7DQorCQltYXQtPmhlYWQgPSBu ZXh0Ow0KKwl9DQorfQ0KKy8qDQorICogbWFzX2Rlc2NlbmQoKSAtIERlc2NlbmQgaW50byB0aGUg c2xvdCBzdG9yZWQgaW4gdGhlIG1hX3N0YXRlLg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUu DQorICoNCisgKiBOb3RlOiBOb3QgUkNVIHNhZmUsIG9ubHkgdXNlIGluIHdyaXRlIHNpZGUgb3Ig ZGVidWcgY29kZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Rlc2NlbmQoc3RydWN0 IG1hX3N0YXRlICptYXMpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJdW5zaWduZWQg bG9uZyAqcGl2b3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9pZCBfX3JjdSAq KnNsb3RzOw0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXR5cGUgPSBtdGVfbm9kZV90eXBl KG1hcy0+bm9kZSk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMg PSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisNCisJaWYgKG1hcy0+b2Zmc2V0KQ0KKwkJbWFzLT5t aW4gPSBwaXZvdHNbbWFzLT5vZmZzZXQgLSAxXSArIDE7DQorCW1hcy0+bWF4ID0gbWFzX3NhZmVf cGl2b3QobWFzLCBwaXZvdHMsIG1hcy0+b2Zmc2V0LCB0eXBlKTsNCisJbWFzLT5ub2RlID0gbWFz X3Nsb3QobWFzLCBzbG90cywgbWFzLT5vZmZzZXQpOw0KK30NCisNCisvKg0KKyAqIG10ZV9zZXRf Z2FwKCkgLSBTZXQgYSBtYXBsZSBub2RlIGdhcC4NCisgKiBAbW46IFRoZSBlbmNvZGVkIG1hcGxl IG5vZGUNCisgKiBAZ2FwOiBUaGUgb2Zmc2V0IG9mIHRoZSBnYXAgdG8gc2V0DQorICogQHZhbDog VGhlIGdhcCB2YWx1ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfc2V0X2dhcChjb25z dCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1uLA0KKwkJCQkgdW5zaWduZWQgY2hhciBnYXAsIHVuc2ln bmVkIGxvbmcgdmFsKQ0KK3sNCisJc3dpdGNoIChtdGVfbm9kZV90eXBlKG1uKSkgew0KKwlkZWZh dWx0Og0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJbXRlX3RvX25vZGUo bW4pLT5tYTY0LmdhcFtnYXBdID0gdmFsOw0KKwkJYnJlYWs7DQorCX0NCit9DQorDQorLyoNCisg KiBtYXNfYXNjZW5kKCkgLSBXYWxrIHVwIGEgbGV2ZWwgb2YgdGhlIHRyZWUuDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBTZXRzIHRoZSBAbWFzLT5tYXggYW5kIEBtYXMtPm1p biB0byB0aGUgY29ycmVjdCB2YWx1ZXMgd2hlbiB3YWxraW5nIHVwLiAgVGhpcw0KKyAqIG1heSBj YXVzZSBzZXZlcmFsIGxldmVscyBvZiB3YWxraW5nIHVwIHRvIGZpbmQgdGhlIGNvcnJlY3QgbWlu IGFuZCBtYXguDQorICogTWF5IGZpbmQgYSBkZWFkIG5vZGUgd2hpY2ggd2lsbCBjYXVzZSBhIHBy ZW1hdHVyZSByZXR1cm4uDQorICogUmV0dXJuOiAxIG9uIGRlYWQgbm9kZSwgMCBvdGhlcndpc2UN CisgKi8NCitzdGF0aWMgaW50IG1hc19hc2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0K KwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBfZW5vZGU7IC8qIHBhcmVudCBlbm9kZS4gKi8NCisJc3Ry dWN0IG1hcGxlX2Vub2RlICphX2Vub2RlOyAvKiBhbmNlc3RvciBlbm9kZS4gKi8NCisJc3RydWN0 IG1hcGxlX25vZGUgKmFfbm9kZTsgLyogYW5jZXN0b3Igbm9kZS4gKi8NCisJc3RydWN0IG1hcGxl X25vZGUgKnBfbm9kZTsgLyogcGFyZW50IG5vZGUuICovDQorCXVuc2lnbmVkIGNoYXIgYV9zbG90 Ow0KKwllbnVtIG1hcGxlX3R5cGUgYV90eXBlOw0KKwl1bnNpZ25lZCBsb25nIG1pbiwgbWF4Ow0K Kwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlib29s IHNldF9tYXggPSBmYWxzZSwgc2V0X21pbiA9IGZhbHNlOw0KKw0KKwlhX25vZGUgPSBtYXNfbW4o bWFzKTsNCisJaWYgKG1hX2lzX3Jvb3QoYV9ub2RlKSkgew0KKwkJbWFzLT5vZmZzZXQgPSAwOw0K KwkJcmV0dXJuIDA7DQorCX0NCisNCisJcF9ub2RlID0gbXRlX3BhcmVudChtYXMtPm5vZGUpOw0K KwlpZiAodW5saWtlbHkoYV9ub2RlID09IHBfbm9kZSkpDQorCQlyZXR1cm4gMTsNCisJYV90eXBl ID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsNCisJb2Zmc2V0ID0gbXRlX3BhcmVu dF9zbG90KG1hcy0+bm9kZSk7DQorCWFfZW5vZGUgPSBtdF9ta19ub2RlKHBfbm9kZSwgYV90eXBl KTsNCisNCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBwYXJlbnQgaW5mb3JtYXRpb24gaXMg c3RpbGwgYWNjdXJhdGUgKi8NCisJaWYgKHBfbm9kZSAhPSBtdGVfcGFyZW50KG1hcy0+bm9kZSkp DQorCQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0gYV9lbm9kZTsNCisJbWFzLT5vZmZzZXQg PSBvZmZzZXQ7DQorDQorCWlmIChtdGVfaXNfcm9vdChhX2Vub2RlKSkgew0KKwkJbWFzLT5tYXgg PSBVTE9OR19NQVg7DQorCQltYXMtPm1pbiA9IDA7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwlt aW4gPSAwOw0KKwltYXggPSBVTE9OR19NQVg7DQorCWRvIHsNCisJCXBfZW5vZGUgPSBhX2Vub2Rl Ow0KKwkJYV90eXBlID0gbWFzX3BhcmVudF9lbnVtKG1hcywgcF9lbm9kZSk7DQorCQlhX25vZGUg PSBtdGVfcGFyZW50KHBfZW5vZGUpOw0KKwkJYV9zbG90ID0gbXRlX3BhcmVudF9zbG90KHBfZW5v ZGUpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKGFfbm9kZSwgYV90eXBlKTsNCisJCWFfZW5vZGUg PSBtdF9ta19ub2RlKGFfbm9kZSwgYV90eXBlKTsNCisNCisJCWlmICghc2V0X21pbiAmJiBhX3Ns b3QpIHsNCisJCQlzZXRfbWluID0gdHJ1ZTsNCisJCQltaW4gPSBwaXZvdHNbYV9zbG90IC0gMV0g KyAxOw0KKwkJfQ0KKw0KKwkJaWYgKCFzZXRfbWF4ICYmIGFfc2xvdCA8IG10X3Bpdm90c1thX3R5 cGVdKSB7DQorCQkJc2V0X21heCA9IHRydWU7DQorCQkJbWF4ID0gcGl2b3RzW2Ffc2xvdF07DQor CQl9DQorDQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKGFfbm9kZSkpKQ0KKwkJCXJldHVy biAxOw0KKw0KKwkJaWYgKHVubGlrZWx5KG1hX2lzX3Jvb3QoYV9ub2RlKSkpDQorCQkJYnJlYWs7 DQorDQorCX0gd2hpbGUgKCFzZXRfbWluIHx8ICFzZXRfbWF4KTsNCisNCisJbWFzLT5tYXggPSBt YXg7DQorCW1hcy0+bWluID0gbWluOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNf cG9wX25vZGUoKSAtIEdldCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1hcGxlIG5vZGUgZnJvbSB0 aGUgbWFwbGUgc3RhdGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBSZXR1 cm46IEEgcG9pbnRlciB0byBhIG1hcGxlIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1 Y3QgbWFwbGVfbm9kZSAqbWFzX3BvcF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJ c3RydWN0IG1hcGxlX2FsbG9jICpyZXQsICpub2RlID0gbWFzLT5hbGxvYzsNCisJdW5zaWduZWQg bG9uZyB0b3RhbCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisNCisJLyogbm90aGluZyBvciBhIHJl cXVlc3QgcGVuZGluZy4gKi8NCisJaWYgKHVubGlrZWx5KCF0b3RhbCkpDQorCQlyZXR1cm4gTlVM TDsNCisNCisJaWYgKHRvdGFsID09IDEpIHsNCisJCS8qIHNpbmdsZSBhbGxvY2F0aW9uIGluIHRo aXMgbWFfc3RhdGUgKi8NCisJCW1hcy0+YWxsb2MgPSBOVUxMOw0KKwkJcmV0ID0gbm9kZTsNCisJ CWdvdG8gc2luZ2xlX25vZGU7DQorCX0NCisNCisJaWYgKCFub2RlLT5ub2RlX2NvdW50KSB7DQor CQkvKiBTaW5nbGUgYWxsb2NhdGlvbiBpbiB0aGlzIG5vZGUuICovDQorCQltYXMtPmFsbG9jID0g bm9kZS0+c2xvdFswXTsNCisJCW5vZGUtPnNsb3RbMF0gPSBOVUxMOw0KKwkJbWFzLT5hbGxvYy0+ dG90YWwgPSBub2RlLT50b3RhbCAtIDE7DQorCQlyZXQgPSBub2RlOw0KKwkJZ290byBuZXdfaGVh ZDsNCisJfQ0KKw0KKwlub2RlLT50b3RhbC0tOw0KKwlyZXQgPSBub2RlLT5zbG90W25vZGUtPm5v ZGVfY291bnRdOw0KKwlub2RlLT5zbG90W25vZGUtPm5vZGVfY291bnQtLV0gPSBOVUxMOw0KKw0K K3NpbmdsZV9ub2RlOg0KK25ld19oZWFkOg0KKwlyZXQtPnRvdGFsID0gMDsNCisJcmV0LT5ub2Rl X2NvdW50ID0gMDsNCisJaWYgKHJldC0+cmVxdWVzdF9jb3VudCkgew0KKwkJbWFzX3NldF9hbGxv Y19yZXEobWFzLCByZXQtPnJlcXVlc3RfY291bnQgKyAxKTsNCisJCXJldC0+cmVxdWVzdF9jb3Vu dCA9IDA7DQorCX0NCisJcmV0dXJuIChzdHJ1Y3QgbWFwbGVfbm9kZSAqKXJldDsNCit9DQorDQor LyoNCisgKiBtYXNfcHVzaF9ub2RlKCkgLSBQdXNoIGEgbm9kZSBiYWNrIG9uIHRoZSBtYXBsZSBz dGF0ZSBhbGxvY2F0aW9uLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEB1c2VkOiBU aGUgdXNlZCBtYXBsZSBub2RlDQorICoNCisgKiBTdG9yZXMgdGhlIG1hcGxlIG5vZGUgYmFjayBp bnRvIEBtYXMtPmFsbG9jIGZvciByZXVzZS4gIFVwZGF0ZXMgYWxsb2NhdGVkIGFuZA0KKyAqIHJl cXVlc3RlZCBub2RlIGNvdW50IGFzIG5lY2Vzc2FyeS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX3B1c2hfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUg KnVzZWQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKnJldXNlID0gKHN0cnVjdCBtYXBsZV9h bGxvYyAqKXVzZWQ7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqaGVhZCA9IG1hcy0+YWxsb2M7DQor CXVuc2lnbmVkIGxvbmcgY291bnQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0ZWQgPSBtYXNfYWxs b2NfcmVxKG1hcyk7DQorDQorCW1lbXNldChyZXVzZSwgMCwgc2l6ZW9mKCpyZXVzZSkpOw0KKwlj b3VudCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisNCisJaWYgKGNvdW50ICYmIChoZWFkLT5ub2Rl X2NvdW50IDwgTUFQTEVfQUxMT0NfU0xPVFMgLSAxKSkgew0KKwkJaWYgKGhlYWQtPnNsb3RbMF0p DQorCQkJaGVhZC0+bm9kZV9jb3VudCsrOw0KKwkJaGVhZC0+c2xvdFtoZWFkLT5ub2RlX2NvdW50 XSA9IHJldXNlOw0KKwkJaGVhZC0+dG90YWwrKzsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwly ZXVzZS0+dG90YWwgPSAxOw0KKwlpZiAoKGhlYWQpICYmICEoKHVuc2lnbmVkIGxvbmcpaGVhZCAm IDB4MSkpIHsNCisJCWhlYWQtPnJlcXVlc3RfY291bnQgPSAwOw0KKwkJcmV1c2UtPnNsb3RbMF0g PSBoZWFkOw0KKwkJcmV1c2UtPnRvdGFsICs9IGhlYWQtPnRvdGFsOw0KKwl9DQorDQorCW1hcy0+ YWxsb2MgPSByZXVzZTsNCitkb25lOg0KKwlpZiAocmVxdWVzdGVkID4gMSkNCisJCW1hc19zZXRf YWxsb2NfcmVxKG1hcywgcmVxdWVzdGVkIC0gMSk7DQorfQ0KKw0KKy8qDQorICogbWFzX2FsbG9j X25vZGVzKCkgLSBBbGxvY2F0ZSBub2RlcyBpbnRvIGEgbWFwbGUgc3RhdGUNCisgKiBAbWFzOiBU aGUgbWFwbGUgc3RhdGUNCisgKiBAZ2ZwOiBUaGUgR0ZQIEZsYWdzDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG1hc19hbGxvY19ub2RlcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgZ2ZwX3QgZ2Zw KQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2Mg Kipub2RlcCA9ICZtYXMtPmFsbG9jOw0KKwl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9IG1hc19h bGxvY2F0ZWQobWFzKTsNCisJdW5zaWduZWQgbG9uZyBzdWNjZXNzID0gYWxsb2NhdGVkOw0KKwl1 bnNpZ25lZCBpbnQgcmVxdWVzdGVkID0gbWFzX2FsbG9jX3JlcShtYXMpOw0KKwl1bnNpZ25lZCBp bnQgY291bnQ7DQorCXZvaWQgKipzbG90cyA9IE5VTEw7DQorCXVuc2lnbmVkIGludCBtYXhfcmVx ID0gMDsNCisNCisJaWYgKCFyZXF1ZXN0ZWQpDQorCQlyZXR1cm47DQorDQorCW1hc19zZXRfYWxs b2NfcmVxKG1hcywgMCk7DQorCWlmICghYWxsb2NhdGVkIHx8IG1hcy0+YWxsb2MtPm5vZGVfY291 bnQgPT0gTUFQTEVfQUxMT0NfU0xPVFMgLSAxKSB7DQorCQlub2RlID0gKHN0cnVjdCBtYXBsZV9h bGxvYyAqKW10X2FsbG9jX29uZShnZnApOw0KKwkJaWYgKCFub2RlKQ0KKwkJCWdvdG8gbm9tZW1f b25lOw0KKw0KKwkJaWYgKGFsbG9jYXRlZCkNCisJCQlub2RlLT5zbG90WzBdID0gbWFzLT5hbGxv YzsNCisNCisJCXN1Y2Nlc3MrKzsNCisJCW1hcy0+YWxsb2MgPSBub2RlOw0KKwkJcmVxdWVzdGVk LS07DQorCX0NCisNCisJbm9kZSA9IG1hcy0+YWxsb2M7DQorCXdoaWxlIChyZXF1ZXN0ZWQpIHsN CisJCW1heF9yZXEgPSBNQVBMRV9OT0RFX1NMT1RTIC0gMTsNCisJCWlmIChub2RlLT5zbG90WzBd KSB7DQorCQkJdW5zaWduZWQgaW50IG9mZnNldCA9IG5vZGUtPm5vZGVfY291bnQgKyAxOw0KKw0K KwkJCXNsb3RzID0gKHZvaWQgKiopJm5vZGUtPnNsb3Rbb2Zmc2V0XTsNCisJCQltYXhfcmVxIC09 IG9mZnNldDsNCisJCX0gZWxzZSB7DQorCQkJc2xvdHMgPSAodm9pZCAqKikmbm9kZS0+c2xvdDsN CisJCX0NCisNCisJCW1heF9yZXEgPSBtaW4ocmVxdWVzdGVkLCBtYXhfcmVxKTsNCisJCWNvdW50 ID0gbXRfYWxsb2NfYnVsayhnZnAsIG1heF9yZXEsIHNsb3RzKTsNCisJCWlmICghY291bnQpDQor CQkJZ290byBub21lbV9idWxrOw0KKw0KKwkJbm9kZS0+bm9kZV9jb3VudCArPSBjb3VudDsNCisJ CS8qIHplcm8gaW5kZXhlZC4gKi8NCisJCWlmIChzbG90cyA9PSAodm9pZCAqKikmbm9kZS0+c2xv dCkNCisJCQlub2RlLT5ub2RlX2NvdW50LS07DQorDQorCQlzdWNjZXNzICs9IGNvdW50Ow0KKwkJ bm9kZXAgPSAmbm9kZS0+c2xvdFswXTsNCisJCW5vZGUgPSAqbm9kZXA7DQorCQlyZXF1ZXN0ZWQg LT0gY291bnQ7DQorCX0NCisJbWFzLT5hbGxvYy0+dG90YWwgPSBzdWNjZXNzOw0KKwlyZXR1cm47 DQorDQorbm9tZW1fYnVsazoNCisJLyogQ2xlYW4gdXAgcG90ZW50aWFsIGZyZWVkIGFsbG9jYXRp b25zIG9uIGJ1bGsgZmFpbHVyZSAqLw0KKwltZW1zZXQoc2xvdHMsIDAsIG1heF9yZXEgKiBzaXpl b2YodW5zaWduZWQgbG9uZykpOw0KK25vbWVtX29uZToNCisJbWFzX3NldF9hbGxvY19yZXEobWFz LCByZXF1ZXN0ZWQpOw0KKwlpZiAobWFzLT5hbGxvYyAmJiAhKCgodW5zaWduZWQgbG9uZyltYXMt PmFsbG9jICYgMHgxKSkpDQorCQltYXMtPmFsbG9jLT50b3RhbCA9IHN1Y2Nlc3M7DQorCW1hc19z ZXRfZXJyKG1hcywgLUVOT01FTSk7DQorCXJldHVybjsNCisNCit9DQorDQorLyoNCisgKiBtYXNf ZnJlZSgpIC0gRnJlZSBhbiBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUNCisgKiBAdXNlZDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byBmcmVlLg0KKyAqDQor ICogVXNlcyByY3UgZnJlZSBpZiBuZWNlc3NhcnksIHB1c2hlcyBAdXNlZCBiYWNrIG9uIHRoZSBt YXBsZSBzdGF0ZSBhbGxvY2F0aW9ucw0KKyAqIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5s aW5lIHZvaWQgbWFzX2ZyZWUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9lbm9k ZSAqdXNlZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICp0bXAgPSBtdGVfdG9fbm9kZSh1c2Vk KTsNCisNCisJaWYgKG10X2luX3JjdShtYXMtPnRyZWUpKQ0KKwkJbWFfZnJlZV9yY3UodG1wKTsN CisJZWxzZQ0KKwkJbWFzX3B1c2hfbm9kZShtYXMsIHRtcCk7DQorfQ0KKw0KKy8qDQorICogbWFz X25vZGVfY291bnQoKSAtIENoZWNrIGlmIGVub3VnaCBub2RlcyBhcmUgYWxsb2NhdGVkIGFuZCBy ZXF1ZXN0IG1vcmUgaWYNCisgKiB0aGVyZSBpcyBub3QgZW5vdWdoIG5vZGVzLg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBjb3VudDogVGhlIG51bWJlciBvZiBub2RlcyBuZWVkZWQN CisgKi8NCitzdGF0aWMgdm9pZCBtYXNfbm9kZV9jb3VudChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg aW50IGNvdW50KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBhbGxvY2F0ZWQgPSBtYXNfYWxsb2NhdGVk KG1hcyk7DQorDQorCWlmIChhbGxvY2F0ZWQgPCBjb3VudCkgew0KKwkJbWFzX3NldF9hbGxvY19y ZXEobWFzLCBjb3VudCAtIGFsbG9jYXRlZCk7DQorCQltYXNfYWxsb2Nfbm9kZXMobWFzLCBHRlBf Tk9XQUlUIHwgX19HRlBfTk9XQVJOKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19zdGFydCgp IC0gU2V0cyB1cCBtYXBsZSBzdGF0ZSBmb3Igb3BlcmF0aW9ucy4NCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUuDQorICoNCisgKiBJZiBtYXMtPm5vZGUgPT0gTUFTX1NUQVJULCB0aGVuIHNldCB0 aGUgbWluLCBtYXgsIGRlcHRoLCBhbmQgb2Zmc2V0IHRvDQorICogZGVmYXVsdHMuDQorICoNCisg KiBSZXR1cm46DQorICogLSBJZiBtYXMtPm5vZGUgaXMgYW4gZXJyb3Igb3Igbm90IE1BU19TVEFS VCwgcmV0dXJuIE5VTEwuDQorICogLSBJZiBpdCdzIGFuIGVtcHR5IHRyZWU6ICAgICBOVUxMICYg bWFzLT5ub2RlID09IE1BU19OT05FDQorICogLSBJZiBpdCdzIGEgc2luZ2xlIGVudHJ5OiAgICBU aGUgZW50cnkgJiBtYXMtPm5vZGUgPT0gTUFTX1JPT1QNCisgKiAtIElmIGl0J3MgYSB0cmVlOiAg ICAgICAgICAgIE5VTEwgJiBtYXMtPm5vZGUgPT0gc2FmZSByb290IG5vZGUuDQorICovDQorc3Rh dGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1hc19zdGFydChzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCWlmIChsaWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7DQorCQlzdHJ1Y3Qg bWFwbGVfZW5vZGUgKnJvb3Q7DQorDQorCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCW1hcy0+ bWluID0gMDsNCisJCW1hcy0+bWF4ID0gVUxPTkdfTUFYOw0KKwkJbWFzLT5kZXB0aCA9IDA7DQor CQltYXMtPm9mZnNldCA9IDA7DQorDQorCQlyb290ID0gbWFzX3Jvb3QobWFzKTsNCisJCS8qIFRy ZWUgd2l0aCBub2RlcyAqLw0KKwkJaWYgKGxpa2VseSh4YV9pc19ub2RlKHJvb3QpKSkgew0KKwkJ CW1hcy0+bm9kZSA9IG10ZV9zYWZlX3Jvb3Qocm9vdCk7DQorCQkJcmV0dXJuIE5VTEw7DQorCQl9 DQorDQorCQkvKiBlbXB0eSB0cmVlICovDQorCQlpZiAodW5saWtlbHkoIXJvb3QpKSB7DQorCQkJ bWFzLT5vZmZzZXQgPSBNQVBMRV9OT0RFX1NMT1RTOw0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0K Kw0KKwkJLyogU2luZ2xlIGVudHJ5IHRyZWUgKi8NCisJCW1hcy0+bm9kZSA9IE1BU19ST09UOw0K KwkJbWFzLT5vZmZzZXQgPSBNQVBMRV9OT0RFX1NMT1RTOw0KKw0KKwkJLyogU2luZ2xlIGVudHJ5 IHRyZWUuICovDQorCQlpZiAobWFzLT5pbmRleCA+IDApDQorCQkJcmV0dXJuIE5VTEw7DQorDQor CQlyZXR1cm4gcm9vdDsNCisJfQ0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBt YV9kYXRhX2VuZCgpIC0gRmluZCB0aGUgZW5kIG9mIHRoZSBkYXRhIGluIGEgbm9kZS4NCisgKiBA bm9kZTogVGhlIG1hcGxlIG5vZGUNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAq IEBwaXZvdHM6IFRoZSBhcnJheSBvZiBwaXZvdHMgaW4gdGhlIG5vZGUNCisgKiBAbWF4OiBUaGUg bWF4aW11bSB2YWx1ZSBpbiB0aGUgbm9kZQ0KKyAqDQorICogVXNlcyBtZXRhZGF0YSB0byBmaW5k IHRoZSBlbmQgb2YgdGhlIGRhdGEgd2hlbiBwb3NzaWJsZS4NCisgKiBSZXR1cm46IFRoZSB6ZXJv IGluZGV4ZWQgbGFzdCBzbG90IHdpdGggZGF0YSAobWF5IGJlIG51bGwpLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYV9kYXRhX2VuZChzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9k ZSwNCisJCQkJCWVudW0gbWFwbGVfdHlwZSB0eXBlLA0KKwkJCQkJdW5zaWduZWQgbG9uZyAqcGl2 b3RzLA0KKwkJCQkJdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9mZnNl dDsNCisNCisJaWYgKHR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJcmV0dXJuIG1hX21ldGFf ZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlvZmZzZXQgPSBtdF9waXZvdHNbdHlwZV0gLSAxOw0KKwlp ZiAobGlrZWx5KCFwaXZvdHNbb2Zmc2V0XSkpDQorCQlyZXR1cm4gbWFfbWV0YV9lbmQobm9kZSwg dHlwZSk7DQorDQorCWlmIChsaWtlbHkocGl2b3RzW29mZnNldF0gPT0gbWF4KSkNCisJCXJldHVy biBvZmZzZXQ7DQorDQorCXJldHVybiBtdF9waXZvdHNbdHlwZV07DQorfQ0KKw0KKy8qDQorICog bWFzX2RhdGFfZW5kKCkgLSBGaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgKHNsb3QpLg0KKyAqIEBt YXM6IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEB0eXBlOiB0aGUgdHlwZSBvZiBtYXBsZSBub2RlDQor ICoNCisgKiBUaGlzIG1ldGhvZCBpcyBvcHRpbWl6ZWQgdG8gY2hlY2sgdGhlIG1ldGFkYXRhIG9m IGEgbm9kZSBpZiB0aGUgbm9kZSB0eXBlDQorICogc3VwcG9ydHMgZGF0YSBlbmQgbWV0YWRhdGEu DQorICoNCisgKiBSZXR1cm46IFRoZSB6ZXJvIGluZGV4ZWQgbGFzdCBzbG90IHdpdGggZGF0YSAo bWF5IGJlIG51bGwpLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYXNfZGF0 YV9lbmQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1 bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9k ZSk7DQorCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJaWYgKHR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0 KQ0KKwkJcmV0dXJuIG1hX21ldGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlwaXZvdHMgPSBtYV9w aXZvdHMobm9kZSwgdHlwZSk7DQorCW9mZnNldCA9IG10X3Bpdm90c1t0eXBlXSAtIDE7DQorCWlm IChsaWtlbHkoIXBpdm90c1tvZmZzZXRdKSkNCisJCXJldHVybiBtYV9tZXRhX2VuZChub2RlLCB0 eXBlKTsNCisNCisJaWYgKGxpa2VseShwaXZvdHNbb2Zmc2V0XSA9PSBtYXMtPm1heCkpDQorCQly ZXR1cm4gb2Zmc2V0Ow0KKw0KKwlyZXR1cm4gbXRfcGl2b3RzW3R5cGVdOw0KK30NCisNCisvKg0K KyAqIG1hc19sZWFmX21heF9nYXAoKSAtIFJldHVybnMgdGhlIGxhcmdlc3QgZ2FwIGluIGEgbGVh ZiBub2RlDQorICogQG1hcyAtIHRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUaGUg bWF4aW11bSBnYXAgaW4gdGhlIGxlYWYuDQorICovDQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFz X2xlYWZfbWF4X2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWVudW0gbWFwbGVfdHlw ZSBtdDsNCisJdW5zaWduZWQgbG9uZyBwc3RhcnQsIGdhcCwgbWF4X2dhcDsNCisJc3RydWN0IG1h cGxlX25vZGUgKm1uOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipz bG90czsNCisJdW5zaWduZWQgY2hhciBpOw0KKwl1bnNpZ25lZCBjaGFyIG1heF9waXY7DQorDQor CW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwltbiA9IG1hc19tbihtYXMpOw0KKwlz bG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCW1heF9nYXAgPSAwOw0KKwlpZiAodW5saWtlbHko bWFfaXNfZGVuc2UobXQpKSkgew0KKwkJZ2FwID0gMDsNCisJCWZvciAoaSA9IDA7IGkgPCBtdF9z bG90c1ttdF07IGkrKykgew0KKwkJCWlmIChzbG90c1tpXSkgew0KKwkJCQlpZiAoZ2FwID4gbWF4 X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQorCQkJCWdhcCA9IDA7DQorCQkJfSBlbHNlIHsN CisJCQkJZ2FwKys7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4 X2dhcCA9IGdhcDsNCisJCXJldHVybiBtYXhfZ2FwOw0KKwl9DQorDQorCS8qDQorCSAqIENoZWNr IHRoZSBmaXJzdCBpbXBsaWVkIHBpdm90IG9wdGltaXplcyB0aGUgbG9vcCBiZWxvdyBhbmQgc2xv dCAxIG1heQ0KKwkgKiBiZSBza2lwcGVkIGlmIHRoZXJlIGlzIGEgZ2FwIGluIHNsb3QgMC4NCisJ ICovDQorCXBpdm90cyA9IG1hX3Bpdm90cyhtbiwgbXQpOw0KKwlpZiAobGlrZWx5KCFzbG90c1sw XSkpIHsNCisJCW1heF9nYXAgPSBwaXZvdHNbMF0gLSBtYXMtPm1pbiArIDE7DQorCQlpID0gMjsN CisJfSBlbHNlIHsNCisJCWkgPSAxOw0KKwl9DQorDQorCS8qIHJlZHVjZSBtYXhfcGl2IGFzIHRo ZSBzcGVjaWFsIGNhc2UgaXMgY2hlY2tlZCBiZWZvcmUgdGhlIGxvb3AgKi8NCisJbWF4X3BpdiA9 IG1hX2RhdGFfZW5kKG1uLCBtdCwgcGl2b3RzLCBtYXMtPm1heCkgLSAxOw0KKwkvKg0KKwkgKiBD aGVjayBlbmQgaW1wbGllZCBwaXZvdCB3aGljaCBjYW4gb25seSBiZSBhIGdhcCBvbiB0aGUgcmln aHQgbW9zdA0KKwkgKiBub2RlLg0KKwkgKi8NCisJaWYgKHVubGlrZWx5KG1hcy0+bWF4ID09IFVM T05HX01BWCkgJiYgIXNsb3RzW21heF9waXYgKyAxXSkgew0KKwkJZ2FwID0gVUxPTkdfTUFYIC0g cGl2b3RzW21heF9waXZdOw0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdh cDsNCisJfQ0KKw0KKwlmb3IgKDsgaSA8PSBtYXhfcGl2OyBpKyspIHsNCisJCS8qIGRhdGEgPT0g bm8gZ2FwLiAqLw0KKwkJaWYgKGxpa2VseShzbG90c1tpXSkpDQorCQkJY29udGludWU7DQorDQor CQlwc3RhcnQgPSBwaXZvdHNbaSAtIDFdOw0KKwkJZ2FwID0gcGl2b3RzW2ldIC0gcHN0YXJ0Ow0K KwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisNCisJCS8qIFRoZXJl IGNhbm5vdCBiZSB0d28gZ2FwcyBpbiBhIHJvdy4gKi8NCisJCWkrKzsNCisJfQ0KKwlyZXR1cm4g bWF4X2dhcDsNCit9DQorDQorLyoNCisgKiBtYV9tYXhfZ2FwKCkgLSBHZXQgdGhlIG1heGltdW0g Z2FwIGluIGEgbWFwbGUgbm9kZSAobm9uLWxlYWYpDQorICogQG5vZGU6IFRoZSBtYXBsZSBub2Rl DQorICogQGdhcHM6IFRoZSBwb2ludGVyIHRvIHRoZSBnYXBzDQorICogQG10OiBUaGUgbWFwbGUg bm9kZSB0eXBlDQorICogQCpvZmY6IFBvaW50ZXIgdG8gc3RvcmUgdGhlIG9mZnNldCBsb2NhdGlv biBvZiB0aGUgZ2FwLg0KKyAqDQorICogVXNlcyB0aGUgbWV0YWRhdGEgZGF0YSBlbmQgdG8gc2Nh biBiYWNrd2FyZHMgYWNyb3NzIHNldCBnYXBzLg0KKyAqDQorICogUmV0dXJuOiBUaGUgbWF4aW11 bSBnYXAgdmFsdWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcNCittYV9tYXhf Z2FwKHN0cnVjdCBtYXBsZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nICpnYXBzLCBlbnVtIG1h cGxlX3R5cGUgbXQsDQorCSAgICB1bnNpZ25lZCBjaGFyICpvZmYpDQorew0KKwl1bnNpZ25lZCBj aGFyIG9mZnNldCwgaTsNCisJdW5zaWduZWQgbG9uZyBtYXhfZ2FwID0gMDsNCisNCisJaSA9IG9m ZnNldCA9IG1hX21ldGFfZW5kKG5vZGUsIG10KTsNCisJZG8gew0KKwkJaWYgKGdhcHNbaV0gPiBt YXhfZ2FwKSB7DQorCQkJbWF4X2dhcCA9IGdhcHNbaV07DQorCQkJb2Zmc2V0ID0gaTsNCisJCX0N CisJfSB3aGlsZSAoaS0tKTsNCisNCisJKm9mZiA9IG9mZnNldDsNCisJcmV0dXJuIG1heF9nYXA7 DQorfQ0KKw0KKy8qDQorICogbWFzX21heF9nYXAoKSAtIGZpbmQgdGhlIGxhcmdlc3QgZ2FwIGlu IGEgbm9uLWxlYWYgbm9kZSBhbmQgc2V0IHRoZSBzbG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZS4NCisgKg0KKyAqIElmIHRoZSBtZXRhZGF0YSBnYXAgaXMgc2V0IHRvIE1BUExFX0FSQU5H RTY0X01FVEFfTUFYLCB0aGVyZSBpcyBubyBnYXAuDQorICoNCisgKiBSZXR1cm46IFRoZSBnYXAg dmFsdWUuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1hc19tYXhfZ2FwKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgbG9uZyAqZ2FwczsNCisJdW5zaWdu ZWQgY2hhciBvZmZzZXQ7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJc3RydWN0IG1hcGxlX25v ZGUgKm5vZGU7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlpZiAobWFf aXNfbGVhZihtdCkpDQorCQlyZXR1cm4gbWFzX2xlYWZfbWF4X2dhcChtYXMpOw0KKw0KKwlub2Rl ID0gbWFzX21uKG1hcyk7DQorCW9mZnNldCA9IG1hX21ldGFfZ2FwKG5vZGUsIG10KTsNCisJaWYg KG9mZnNldCA9PSBNQVBMRV9BUkFOR0U2NF9NRVRBX01BWCkNCisJCXJldHVybiAwOw0KKw0KKwln YXBzID0gbWFfZ2Fwcyhub2RlLCBtdCk7DQorCXJldHVybiBnYXBzW29mZnNldF07DQorfQ0KKw0K Ky8qDQorICogbWFzX3BhcmVudF9nYXAoKSAtIFNldCB0aGUgcGFyZW50IGdhcCBhbmQgYW55IGdh cHMgYWJvdmUsIGFzIG5lZWRlZA0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZz ZXQ6IFRoZSBnYXAgb2Zmc2V0IGluIHRoZSBwYXJlbnQgdG8gc2V0DQorICogQG5ldzogVGhlIG5l dyBnYXAgdmFsdWUuDQorICoNCisgKiBTZXQgdGhlIHBhcmVudCBnYXAgdGhlbiBjb250aW51ZSB0 byBzZXQgdGhlIGdhcCB1cHdhcmRzLCB1c2luZyB0aGUgbWV0YWRhdGENCisgKiBvZiB0aGUgcGFy ZW50IHRvIHNlZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIG5vZGUgYWJvdmUuDQor ICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19wYXJlbnRfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwNCisJCXVuc2lnbmVkIGxvbmcgbmV3KQ0KK3sNCisJ dW5zaWduZWQgbG9uZyBtZXRhX2dhcCA9IDA7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwbm9kZTsN CisJc3RydWN0IG1hcGxlX2Vub2RlICpwZW5vZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBnYXBzOw0K Kwl1bnNpZ25lZCBjaGFyIG1ldGFfb2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgcG10Ow0KKw0K Kwlwbm9kZSA9IG10ZV9wYXJlbnQobWFzLT5ub2RlKTsNCisJcG10ID0gbWFzX3BhcmVudF9lbnVt KG1hcywgbWFzLT5ub2RlKTsNCisJcGVub2RlID0gbXRfbWtfbm9kZShwbm9kZSwgcG10KTsNCisJ cGdhcHMgPSBtYV9nYXBzKHBub2RlLCBwbXQpOw0KKw0KK2FzY2VuZDoNCisJbWV0YV9vZmZzZXQg PSBtYV9tZXRhX2dhcChwbm9kZSwgcG10KTsNCisJaWYgKG1ldGFfb2Zmc2V0ID09IE1BUExFX0FS QU5HRTY0X01FVEFfTUFYKQ0KKwkJbWV0YV9nYXAgPSAwOw0KKwllbHNlDQorCQltZXRhX2dhcCA9 IHBnYXBzW21ldGFfb2Zmc2V0XTsNCisNCisJcGdhcHNbb2Zmc2V0XSA9IG5ldzsNCisNCisJaWYg KG1ldGFfZ2FwID09IG5ldykNCisJCXJldHVybjsNCisNCisJaWYgKG9mZnNldCAhPSBtZXRhX29m ZnNldCkgew0KKwkJaWYgKG1ldGFfZ2FwID4gbmV3KQ0KKwkJCXJldHVybjsNCisNCisJCW1hX3Nl dF9tZXRhX2dhcChwbm9kZSwgcG10LCBvZmZzZXQpOw0KKwl9IGVsc2UgaWYgKG5ldyA8IG1ldGFf Z2FwKSB7DQorCQltZXRhX29mZnNldCA9IDE1Ow0KKwkJbmV3ID0gbWFfbWF4X2dhcChwbm9kZSwg cGdhcHMsIHBtdCwgJm1ldGFfb2Zmc2V0KTsNCisJCW1hX3NldF9tZXRhX2dhcChwbm9kZSwgcG10 LCBtZXRhX29mZnNldCk7DQorCX0NCisNCisJaWYgKG1hX2lzX3Jvb3QocG5vZGUpKQ0KKwkJcmV0 dXJuOw0KKw0KKwkvKiBHbyB0byB0aGUgcGFyZW50IG5vZGUuICovDQorCXBub2RlID0gbXRlX3Bh cmVudChwZW5vZGUpOw0KKwlwbXQgPSBtYXNfcGFyZW50X2VudW0obWFzLCBwZW5vZGUpOw0KKwlw Z2FwcyA9IG1hX2dhcHMocG5vZGUsIHBtdCk7DQorCW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChw ZW5vZGUpOw0KKwlwZW5vZGUgPSBtdF9ta19ub2RlKHBub2RlLCBwbXQpOw0KKwlnb3RvIGFzY2Vu ZDsNCit9DQorDQorLyoNCisgKiBtYXNfdXBkYXRlX2dhcCgpIC0gVXBkYXRlIGEgbm9kZXMgZ2Fw cyBhbmQgcHJvcGFnYXRlIHVwIGlmIG5lY2Vzc2FyeS4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0 YXRlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfdXBkYXRlX2dhcChzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgcHNsb3Q7DQorCXVuc2lnbmVkIGxvbmcg cF9nYXA7DQorCXVuc2lnbmVkIGxvbmcgbWF4X2dhcDsNCisNCisJaWYgKCFtdF9pc19hbGxvYyht YXMtPnRyZWUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkN CisJCXJldHVybjsNCisNCisJbWF4X2dhcCA9IG1hc19tYXhfZ2FwKG1hcyk7DQorDQorCXBzbG90 ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCXBfZ2FwID0gbWFfZ2FwcyhtdGVfcGFy ZW50KG1hcy0+bm9kZSksDQorCQkJbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKSlbcHNs b3RdOw0KKw0KKwlpZiAocF9nYXAgIT0gbWF4X2dhcCkNCisJCW1hc19wYXJlbnRfZ2FwKG1hcywg cHNsb3QsIG1heF9nYXApOw0KK30NCisNCisvKg0KKyAqIG1hc19hZG9wdF9jaGlsZHJlbigpIC0g U2V0IHRoZSBwYXJlbnQgcG9pbnRlciBvZiBhbGwgbm9kZXMgaW4gQHBhcmVudCB0bw0KKyAqIEBw YXJlbnQgd2l0aCB0aGUgc2xvdCBlbmNvZGVkLg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUg KGZvciB0aGUgdHJlZSkNCisgKiBAcGFyZW50IC0gdGhlIG1hcGxlIGVuY29kZWQgbm9kZSBjb250 YWluaW5nIHRoZSBjaGlsZHJlbi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Fkb3B0 X2NoaWxkcmVuKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICpw YXJlbnQpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUocGFyZW50 KTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtYXNfbW4obWFzKTsNCisJdm9pZCBfX3Jj dSAqKnNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90 cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsN CisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorDQorCW9mZnNldCA9IG1hX2RhdGFfZW5kKG5vZGUs IHR5cGUsIHBpdm90cywgbWFzLT5tYXgpOw0KKwlkbyB7DQorCQljaGlsZCA9IG1hc19zbG90X2xv Y2tlZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJbXRlX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVu dCwgb2Zmc2V0KTsNCisJfSB3aGlsZShvZmZzZXQtLSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jl cGxhY2UoKSAtIFJlcGxhY2UgYSBtYXBsZSBub2RlIGluIHRoZSB0cmVlIHdpdGggbWFzLT5ub2Rl LiAgVXNlcyB0aGUNCisgKiBwYXJlbnQgZW5jb2RpbmcgdG8gbG9jYXRlIHRoZSBtYXBsZSBub2Rl IGluIHRoZSB0cmVlLg0KKyAqIEBtYXMgLSB0aGUgbWFfc3RhdGUgdG8gdXNlIGZvciBvcGVyYXRp b25zLg0KKyAqIEBhZHZhbmNlZCAtIGJvb2xlYW4gdG8gYWRvcHQgdGhlIGNoaWxkIG5vZGVzIGFu ZCBmcmVlIHRoZSBvbGQgbm9kZSAoZmFsc2UpIG9yDQorICogbGVhdmUgdGhlIG5vZGUgKHRydWUp IGFuZCBoYW5kbGUgdGhlIGFkb3B0aW9uIGFuZCBmcmVlIGVsc2V3aGVyZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3JlcGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIGJvb2wgYWR2 YW5jZWQpDQorCV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCXN0cnVjdCBtYXBs ZV9ub2RlICptbiA9IG1hc19tbihtYXMpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9lbm9k ZTsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQgPSAwOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHMgPSBO VUxMOw0KKw0KKwlpZiAobWFfaXNfcm9vdChtbikpIHsNCisJCW9sZF9lbm9kZSA9IG1hc19yb290 X2xvY2tlZChtYXMpOw0KKwl9IGVsc2Ugew0KKwkJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1h cy0+bm9kZSk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG10ZV9wYXJlbnQobWFzLT5ub2RlKSwNCisJ CQkJIG1hc19wYXJlbnRfZW51bShtYXMsIG1hcy0+bm9kZSkpOw0KKwkJb2xkX2Vub2RlID0gbWFz X3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCX0NCisNCisJaWYgKCFhZHZhbmNl ZCAmJiAhbXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCW1hc19hZG9wdF9jaGlsZHJlbihtYXMs IG1hcy0+bm9kZSk7DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQltbi0+ cGFyZW50ID0gbWFfcGFyZW50X3B0cigNCisJCQkgICAgICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50 cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUt Pm1hX3Jvb3QsIG10ZV9ta19yb290KG1hcy0+bm9kZSkpOw0KKwkJbWFzX3NldF9oZWlnaHQobWFz KTsNCisJfSBlbHNlIHsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBtYXMt Pm5vZGUpOw0KKwl9DQorDQorCWlmICghYWR2YW5jZWQpDQorCQltYXNfZnJlZShtYXMsIG9sZF9l bm9kZSk7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19jaGlsZCgpIC0gRmluZCB0aGUgbmV3IGNo aWxkIG9mIGEgbm9kZS4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAY2hpbGQ6IHRo ZSBtYXBsZSBzdGF0ZSB0byBzdG9yZSB0aGUgY2hpbGQuDQorICovDQorc3RhdGljIGlubGluZSBi b29sIG1hc19uZXdfY2hpbGQoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV9zdGF0ZSAq Y2hpbGQpDQorCV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCWVudW0gbWFwbGVf dHlwZSBtdDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0K Kwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnk7DQor CXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCW10 ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXNs b3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQp Ow0KKwllbmQgPSBtYV9kYXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCWZv ciAob2Zmc2V0ID0gbWFzLT5vZmZzZXQ7IG9mZnNldCA8PSBlbmQ7IG9mZnNldCsrKSB7DQorCQll bnRyeSA9IG1hc19zbG90X2xvY2tlZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKG10ZV9w YXJlbnQoZW50cnkpID09IG5vZGUpIHsNCisJCQkqY2hpbGQgPSAqbWFzOw0KKwkJCW1hcy0+b2Zm c2V0ID0gb2Zmc2V0ICsgMTsNCisJCQljaGlsZC0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwkJCW1hc19k ZXNjZW5kKGNoaWxkKTsNCisJCQljaGlsZC0+b2Zmc2V0ID0gMDsNCisJCQlyZXR1cm4gdHJ1ZTsN CisJCX0NCisJfQ0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFiX3NoaWZ0X3Jp Z2h0KCkgLSBTaGlmdCB0aGUgZGF0YSBpbiBtYWIgcmlnaHQuIE5vdGUsIGRvZXMgbm90IGNsZWFu IG91dCB0aGUNCisgKiBvbGQgZGF0YSBvciBzZXQgYl9ub2RlLT5iX2VuZC4NCisgKiBAYl9ub2Rl OiB0aGUgbWFwbGVfYmlnX25vZGUNCisgKiBAc2hpZnQ6IHRoZSBzaGlmdCBjb3VudA0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgdm9pZCBtYWJfc2hpZnRfcmlnaHQoc3RydWN0IG1hcGxlX2JpZ19ub2Rl ICpiX25vZGUsDQorCQkJCSB1bnNpZ25lZCBjaGFyIHNoaWZ0KQ0KK3sNCisJdW5zaWduZWQgbG9u ZyBzaXplID0gYl9ub2RlLT5iX2VuZCAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsNCisNCisJbWVt bW92ZShiX25vZGUtPnBpdm90ICsgc2hpZnQsIGJfbm9kZS0+cGl2b3QsIHNpemUpOw0KKwltZW1t b3ZlKGJfbm9kZS0+c2xvdCArIHNoaWZ0LCBiX25vZGUtPnNsb3QsIHNpemUpOw0KKwlpZiAoYl9u b2RlLT50eXBlID09IG1hcGxlX2FyYW5nZV82NCkNCisJCW1lbW1vdmUoYl9ub2RlLT5nYXAgKyBz aGlmdCwgYl9ub2RlLT5nYXAsIHNpemUpOw0KK30NCisNCisvKg0KKyAqIG1hYl9taWRkbGVfbm9k ZSgpIC0gQ2hlY2sgaWYgYSBtaWRkbGUgbm9kZSBpcyBuZWVkZWQgKHVubGlrZWx5KQ0KKyAqIEBi X25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhLg0KKyAqIEBz aXplOiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGJfbm9kZQ0KKyAqIEBzcGxpdDogdGhlIHBv dGVudGlhbCBzcGxpdCBsb2NhdGlvbg0KKyAqIEBzbG90X2NvdW50OiB0aGUgc2l6ZSB0aGF0IGNh biBiZSBzdG9yZWQgaW4gYSBzaW5nbGUgbm9kZSBiZWluZyBjb25zaWRlcmVkLg0KKyAqDQorICog UmV0dXJuOiB0cnVlIGlmIGEgbWlkZGxlIG5vZGUgaXMgcmVxdWlyZWQuDQorICovDQorc3RhdGlj IGlubGluZSBib29sIG1hYl9taWRkbGVfbm9kZShzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9k ZSwgaW50IHNwbGl0LA0KKwkJCQkgICB1bnNpZ25lZCBjaGFyIHNsb3RfY291bnQpDQorew0KKwl1 bnNpZ25lZCBjaGFyIHNpemUgPSBiX25vZGUtPmJfZW5kOw0KKw0KKwlpZiAoc2l6ZSA+PSAyICog c2xvdF9jb3VudCkNCisJCXJldHVybiB0cnVlOw0KKw0KKwlpZiAoIWJfbm9kZS0+c2xvdFtzcGxp dF0gJiYgKHNpemUgPj0gMiAqIHNsb3RfY291bnQgLSAxKSkNCisJCXJldHVybiB0cnVlOw0KKw0K KwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFiX25vX251bGxfc3BsaXQoKSAtIGVu c3VyZSB0aGUgc3BsaXQgZG9lc24ndCBmYWxsIG9uIGEgTlVMTA0KKyAqIEBiX25vZGU6IHRoZSBt YXBsZV9iaWdfbm9kZSB3aXRoIHRoZSBkYXRhDQorICogQHNwbGl0OiB0aGUgc3VnZ2VzdGVkIHNw bGl0IGxvY2F0aW9uDQorICogQHNsb3RfY291bnQ6IHRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhl IG5vZGUgYmVpbmcgY29uc2lkZXJlZC4NCisgKg0KKyAqIFJldHVybjogdGhlIHNwbGl0IGxvY2F0 aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hYl9ub19udWxsX3NwbGl0KHN0cnVjdCBt YXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCQkgICAgdW5zaWduZWQgY2hhciBzcGxpdCwgdW5z aWduZWQgY2hhciBzbG90X2NvdW50KQ0KK3sNCisJaWYgKCFiX25vZGUtPnNsb3Rbc3BsaXRdKSB7 DQorCQkvKg0KKwkJICogSWYgdGhlIHNwbGl0IGlzIGxlc3MgdGhhbiB0aGUgbWF4IHNsb3QgJiYg dGhlIHJpZ2h0IHNpZGUgd2lsbA0KKwkJICogc3RpbGwgYmUgc3VmZmljaWVudCwgdGhlbiBpbmNy ZW1lbnQgdGhlIHNwbGl0IG9uIE5VTEwuDQorCQkgKi8NCisJCWlmICgoc3BsaXQgPCBzbG90X2Nv dW50IC0gMSkgJiYNCisJCSAgICAoYl9ub2RlLT5iX2VuZCAtIHNwbGl0KSA+IChtdF9taW5fc2xv dHNbYl9ub2RlLT50eXBlXSkpDQorCQkJc3BsaXQrKzsNCisJCWVsc2UNCisJCQlzcGxpdC0tOw0K Kwl9DQorCXJldHVybiBzcGxpdDsNCit9DQorDQorLyoNCisgKiBtYWJfY2FsY19zcGxpdCgpIC0g Q2FsY3VsYXRlIHRoZSBzcGxpdCBsb2NhdGlvbiBhbmQgaWYgdGhlcmUgbmVlZHMgdG8gYmUgdHdv DQorICogc3BsaXRzLg0KKyAqIEBibjogVGhlIG1hcGxlX2JpZ19ub2RlIHdpdGggdGhlIGRhdGEN CisgKiBAbWlkX3NwbGl0OiBUaGUgc2Vjb25kIHNwbGl0LCBpZiByZXF1aXJlZC4gIDAgb3RoZXJ3 aXNlLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZmlyc3Qgc3BsaXQgbG9jYXRpb24uICBUaGUgbWlk ZGxlIHNwbGl0IGlzIHNldCBpbiBAbWlkX3NwbGl0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50 IG1hYl9jYWxjX3NwbGl0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkgc3RydWN0IG1hcGxlX2Jp Z19ub2RlICpibiwgdW5zaWduZWQgY2hhciAqbWlkX3NwbGl0LCB1bnNpZ25lZCBsb25nIG1pbikN Cit7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBibi0+Yl9lbmQ7DQorCWludCBzcGxpdCA9IGJf ZW5kIC8gMjsgLyogQXNzdW1lIGVxdWFsIHNwbGl0LiAqLw0KKwl1bnNpZ25lZCBjaGFyIHNsb3Rf bWluLCBzbG90X2NvdW50ID0gbXRfc2xvdHNbYm4tPnR5cGVdOw0KKw0KKwkvKg0KKwkgKiBUbyBz dXBwb3J0IGdhcCB0cmFja2luZywgYWxsIE5VTEwgZW50cmllcyBhcmUga2VwdCB0b2dldGhlciBh bmQgYSBub2RlIGNhbm5vdA0KKwkgKiBlbmQgb24gYSBOVUxMIGVudHJ5LCB3aXRoIHRoZSBleGNl cHRpb24gb2YgdGhlIGxlZnQtbW9zdCBsZWFmLiAgVGhlDQorCSAqIGxpbWl0YXRpb24gbWVhbnMg dGhhdCB0aGUgc3BsaXQgb2YgYSBub2RlIG11c3QgYmUgY2hlY2tlZCBmb3IgdGhpcyBjb25kaXRp b24NCisJICogYW5kIGJlIGFibGUgdG8gcHV0IG1vcmUgZGF0YSBpbiBvbmUgZGlyZWN0aW9uIG9y IHRoZSBvdGhlci4NCisJICovDQorCWlmICh1bmxpa2VseSgobWFzLT5tYXNfZmxhZ3MgJiBNQV9T VEFURV9CVUxLKSkpIHsNCisJCSptaWRfc3BsaXQgPSAwOw0KKwkJaWYgKG1hX2lzX2xlYWYoYm4t PnR5cGUpKQ0KKwkJCXNsb3RfbWluID0gMjsNCisJCWVsc2UNCisJCQlyZXR1cm4gYl9lbmQgLSBt dF9taW5fc2xvdHNbYm4tPnR5cGVdOw0KKw0KKwkJc3BsaXQgPSBiX2VuZCAtIHNsb3RfbWluOw0K KwkJbWFzLT5tYXNfZmxhZ3MgfD0gTUFfU1RBVEVfUkVCQUxBTkNFOw0KKwkJaWYgKCFibi0+c2xv dFtzcGxpdF0pDQorCQkJc3BsaXQtLTsNCisJCXJldHVybiBzcGxpdDsNCisJfQ0KKw0KKwkvKg0K KwkgKiBBbHRob3VnaCBleHRyZW1lbHkgcmFyZSwgaXQgaXMgcG9zc2libGUgdG8gZW50ZXIgd2hh dCBpcyBrbm93biBhcyB0aGUgMy13YXkNCisJICogc3BsaXQgc2NlbmFyaW8uICBUaGUgMy13YXkg c3BsaXQgY29tZXMgYWJvdXQgYnkgbWVhbnMgb2YgYSBzdG9yZSBvZiBhIHJhbmdlDQorCSAqIHRo YXQgb3ZlcndyaXRlcyB0aGUgZW5kIGFuZCBiZWdpbm5pbmcgb2YgdHdvIGZ1bGwgbm9kZXMuICBU aGUgcmVzdWx0IGlzIGEgc2V0DQorCSAqIG9mIGVudHJpZXMgdGhhdCBjYW5ub3QgYmUgc3RvcmVk IGluIDIgbm9kZXMuICBTb21ldGltZXMsIHRoZXNlIHR3byBub2RlcyBjYW4NCisJICogYWxzbyBi ZSBsb2NhdGVkIGluIGRpZmZlcmVudCBwYXJlbnQgbm9kZXMgd2hpY2ggYXJlIGFsc28gZnVsbC4g IFRoaXMgY2FuDQorCSAqIGNhcnJ5IHVwd2FyZHMgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QgaW4g dGhlIHdvcnN0IGNhc2UuDQorCSAqLw0KKwlpZiAodW5saWtlbHkobWFiX21pZGRsZV9ub2RlKGJu LCBzcGxpdCwgc2xvdF9jb3VudCkpKSB7DQorCQlzcGxpdCA9IGJfZW5kIC8gMzsNCisJCSptaWRf c3BsaXQgPSBzcGxpdCAqIDI7DQorCX0gZWxzZSB7DQorCQlzbG90X21pbiA9IG10X21pbl9zbG90 c1tibi0+dHlwZV07DQorDQorCQkqbWlkX3NwbGl0ID0gMDsNCisJCS8qDQorCQkgKiBBdm9pZCBo YXZpbmcgYSByYW5nZSBsZXNzIHRoYW4gdGhlIHNsb3QgY291bnQgdW5sZXNzIGl0DQorCQkgKiBj YXVzZXMgb25lIG5vZGUgdG8gYmUgZGVmaWNpZW50Lg0KKwkJICogTk9URTogbXRfbWluX3Nsb3Rz IGlzIDEgYmFzZWQsIGJfZW5kIGFuZCBzcGxpdCBhcmUgemVyby4NCisJCSAqLw0KKwkJd2hpbGUg KCgoYm4tPnBpdm90W3NwbGl0XSAtIG1pbikgPCBzbG90X2NvdW50IC0gMSkgJiYNCisJCSAgICAg ICAoc3BsaXQgPCBzbG90X2NvdW50IC0gMSkgJiYgKGJfZW5kIC0gc3BsaXQgPiBzbG90X21pbikp DQorCQkJc3BsaXQrKzsNCisJfQ0KKw0KKwkvKiBBdm9pZCBlbmRpbmcgYSBub2RlIG9uIGEgTlVM TCBlbnRyeSAqLw0KKwlzcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KGJuLCBzcGxpdCwgc2xvdF9j b3VudCk7DQorCWlmICghKCptaWRfc3BsaXQpKQ0KKwkJcmV0dXJuIHNwbGl0Ow0KKw0KKwkqbWlk X3NwbGl0ID0gbWFiX25vX251bGxfc3BsaXQoYm4sICptaWRfc3BsaXQsIHNsb3RfY291bnQpOw0K Kw0KKwlyZXR1cm4gc3BsaXQ7DQorfQ0KKw0KKy8qDQorICogbWFzX21hYl9jcCgpIC0gQ29weSBk YXRhIGZyb20gYSBtYXBsZSBzdGF0ZSBpbmNsdXNpdmVseSB0byBhIG1hcGxlX2JpZ19ub2RlDQor ICogYW5kIHNldCBAYl9ub2RlLT5iX2VuZCB0byB0aGUgbmV4dCBmcmVlIHNsb3QuDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICogQG1hc19zdGFydDogVGhlIHN0YXJ0aW5nIHNsb3QgdG8g Y29weQ0KKyAqIEBtYXNfZW5kOiBUaGUgZW5kIHNsb3QgdG8gY29weSAoaW5jbHVzaXZlbHkpDQor ICogQGJfbm9kZTogVGhlIG1hcGxlX2JpZ19ub2RlIHRvIHBsYWNlIHRoZSBkYXRhDQorICogQG1h Yl9zdGFydDogVGhlIHN0YXJ0aW5nIGxvY2F0aW9uIGluIG1hcGxlX2JpZ19ub2RlIHRvIHN0b3Jl IHRoZSBkYXRhLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfbWFiX2NwKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFyIG1hc19zdGFydCwNCisJCQl1bnNpZ25lZCBjaGFy IG1hc19lbmQsIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCXVuc2lnbmVkIGNo YXIgbWFiX3N0YXJ0KQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZv dHMsICpnYXBzOw0KKwlpbnQgaSA9IG1hc19zdGFydCwgaiA9IG1hYl9zdGFydDsNCisJdW5zaWdu ZWQgY2hhciBwaXZfZW5kOw0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW10ID0gbXRlX25v ZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwlp ZiAoIWkpIHsNCisJCWJfbm9kZS0+cGl2b3Rbal0gPSBwaXZvdHNbaSsrXTsNCisJCWlmICh1bmxp a2VseShpID4gbWFzX2VuZCkpDQorCQkJZ290byBjb21wbGV0ZTsNCisJCWorKzsNCisJfQ0KKw0K KwlwaXZfZW5kID0gbWluKG1hc19lbmQsIG10X3Bpdm90c1ttdF0pOw0KKwlmb3IgKDsgaSA8IHBp dl9lbmQ7IGkrKywgaisrKSB7DQorCQliX25vZGUtPnBpdm90W2pdID0gcGl2b3RzW2ldOw0KKwkJ aWYgKHVubGlrZWx5KCFiX25vZGUtPnBpdm90W2pdKSkNCisJCQlicmVhazsNCisNCisJCWlmICh1 bmxpa2VseShtYXMtPm1heCA9PSBiX25vZGUtPnBpdm90W2pdKSkNCisJCQlnb3RvIGNvbXBsZXRl Ow0KKwl9DQorDQorCWlmIChsaWtlbHkoaSA8PSBtYXNfZW5kKSkNCisJCWJfbm9kZS0+cGl2b3Rb al0gPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgaSwgbXQpOw0KKw0KK2NvbXBsZXRlOg0K KwliX25vZGUtPmJfZW5kID0gKytqOw0KKwlqIC09IG1hYl9zdGFydDsNCisJc2xvdHMgPSBtYV9z bG90cyhub2RlLCBtdCk7DQorCW1lbWNweShiX25vZGUtPnNsb3QgKyBtYWJfc3RhcnQsIHNsb3Rz ICsgbWFzX3N0YXJ0LCBzaXplb2Yodm9pZCAqKSAqIGopOw0KKwlpZiAoIW1hX2lzX2xlYWYobXQp ICYmIG10X2lzX2FsbG9jKG1hcy0+dHJlZSkpIHsNCisJCWdhcHMgPSBtYV9nYXBzKG5vZGUsIG10 KTsNCisJCW1lbWNweShiX25vZGUtPmdhcCArIG1hYl9zdGFydCwgZ2FwcyArIG1hc19zdGFydCwN CisJCSAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiBqKTsNCisJfQ0KK30NCisNCisvKg0K KyAqIG1hc19sZWFmX3NldF9tZXRhKCkgLSBTZXQgdGhlIG1ldGFkYXRhIG9mIGEgbGVhZiBpZiBw b3NzaWJsZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbm9kZTogVGhlIG1hcGxl IG5vZGUNCisgKiBAcGl2b3RzOiBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAq IEBtdDogVGhlIG1hcGxlIHR5cGUNCisgKiBAZW5kOiBUaGUgYXNzdW1lZCBlbmQNCisgKg0KKyAq IE5vdGUsIGVuZCBtYXkgYmUgaW5jcmVtZW50ZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gYnV0IG5v dCBtb2RpZmllZCBhdCB0aGUNCisgKiBzb3VyY2UuICBUaGlzIGlzIGZpbmUgc2luY2UgdGhlIG1l dGFkYXRhIGlzIHRoZSBsYXN0IHRoaW5nIHRvIGJlIHN0b3JlZCBpbiBhDQorICogbm9kZSBkdXJp bmcgYSB3cml0ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2xlYWZfc2V0X21ldGEo c3RydWN0IG1hX3N0YXRlICptYXMsDQorCQlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgdW5zaWdu ZWQgbG9uZyAqcGl2b3RzLA0KKwkJZW51bSBtYXBsZV90eXBlIG10LCB1bnNpZ25lZCBjaGFyIGVu ZCkNCit7DQorCS8qIFRoZXJlIGlzIG5vIHJvb20gZm9yIG1ldGFkYXRhIGFscmVhZHkgKi8NCisJ aWYgKG10X3Bpdm90c1ttdF0gPD0gZW5kKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAocGl2b3RzW2Vu ZF0gJiYgcGl2b3RzW2VuZF0gPCBtYXMtPm1heCkNCisJCWVuZCsrOw0KKw0KKwlpZiAoZW5kIDwg bXRfc2xvdHNbbXRdIC0gMSkNCisJCW1hX3NldF9tZXRhKG5vZGUsIG10LCAwLCBlbmQpOw0KK30N CisNCisvKg0KKyAqIG1hYl9tYXNfY3AoKSAtIENvcHkgZGF0YSBmcm9tIG1hcGxlX2JpZ19ub2Rl IHRvIGEgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9k ZSB0aGF0IGhhcyB0aGUgZGF0YQ0KKyAqIEBtYWJfc3RhcnQ6IHRoZSBzdGFydCBsb2NhdGlvbiBp biBAYl9ub2RlLg0KKyAqIEBtYWJfZW5kOiBUaGUgZW5kIGxvY2F0aW9uIGluIEBiX25vZGUgKGlu Y2x1c2l2ZWx5KQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZSB3aXRoIHRoZSBtYXBsZSBlbmNv ZGVkIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hYl9tYXNfY3Aoc3RydWN0IG1h cGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJICAgICAgdW5zaWduZWQgY2hhciBtYWJfc3RhcnQs IHVuc2lnbmVkIGNoYXIgbWFiX2VuZCwNCisJCQkgICAgICBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg Ym9vbCBuZXdfbWF4KQ0KK3sNCisJaW50IGksIGogPSAwOw0KKwllbnVtIG1hcGxlX3R5cGUgbXQg PSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0g bXRlX3RvX25vZGUobWFzLT5ub2RlKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMo bm9kZSwgbXQpOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQp Ow0KKwl1bnNpZ25lZCBsb25nICpnYXBzID0gTlVMTDsNCisJdW5zaWduZWQgY2hhciBlbmQ7DQor DQorCWlmIChtYWJfZW5kIC0gbWFiX3N0YXJ0ID4gbXRfcGl2b3RzW210XSkNCisJCW1hYl9lbmQt LTsNCisNCisJaWYgKCFwaXZvdHNbbXRfcGl2b3RzW210XSAtIDFdKQ0KKwkJc2xvdHNbbXRfcGl2 b3RzW210XV0gPSBOVUxMOw0KKw0KKwlpID0gbWFiX3N0YXJ0Ow0KKwlwaXZvdHNbaisrXSA9IGJf bm9kZS0+cGl2b3RbaSsrXTsNCisJZG8gew0KKwkJcGl2b3RzW2orK10gPSBiX25vZGUtPnBpdm90 W2krK107DQorCX0gd2hpbGUgKGkgPD0gbWFiX2VuZCAmJiBsaWtlbHkoYl9ub2RlLT5waXZvdFtp XSkpOw0KKw0KKwltZW1jcHkoc2xvdHMsIGJfbm9kZS0+c2xvdCArIG1hYl9zdGFydCwNCisJICAg ICAgIHNpemVvZih2b2lkICopICogKGkgLSBtYWJfc3RhcnQpKTsNCisNCisJaWYgKG5ld19tYXgp DQorCQltYXMtPm1heCA9IGJfbm9kZS0+cGl2b3RbaSAtIDFdOw0KKw0KKwllbmQgPSBqIC0gMTsN CisJaWYgKGxpa2VseSghbWFfaXNfbGVhZihtdCkgJiYgbXRfaXNfYWxsb2MobWFzLT50cmVlKSkp IHsNCisJCXVuc2lnbmVkIGxvbmcgbWF4X2dhcCA9IDA7DQorCQl1bnNpZ25lZCBjaGFyIG9mZnNl dCA9IDE1Ow0KKw0KKwkJZ2FwcyA9IG1hX2dhcHMobm9kZSwgbXQpOw0KKwkJZG8gew0KKwkJCWdh cHNbLS1qXSA9IGJfbm9kZS0+Z2FwWy0taV07DQorCQkJaWYgKGdhcHNbal0gPiBtYXhfZ2FwKSB7 DQorCQkJCW9mZnNldCA9IGo7DQorCQkJCW1heF9nYXAgPSBnYXBzW2pdOw0KKwkJCX0NCisJCX0g d2hpbGUgKGopOw0KKw0KKwkJbWFfc2V0X21ldGEobm9kZSwgbXQsIG9mZnNldCwgZW5kKTsNCisJ fSBlbHNlIHsNCisJCW1hc19sZWFmX3NldF9tZXRhKG1hcywgbm9kZSwgcGl2b3RzLCBtdCwgZW5k KTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19kZXNjZW5kX2Fkb3B0KCkgLSBEZXNjZW5kIHRo cm91Z2ggYSBzdWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4uDQorICogQG1hczogdGhlIG1hcGxl IHN0YXRlIHdpdGggdGhlIG1hcGxlIGVuY29kZWQgbm9kZSBvZiB0aGUgc3ViLXRyZWUuDQorICoN CisgKiBEZXNjZW5kIHRocm91Z2ggYSBzdWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4gd2hvIGRv IG5vdCBoYXZlIHRoZSBjb3JyZWN0DQorICogcGFyZW50cyBzZXQuICBGb2xsb3cgdGhlIHBhcmVu dHMgd2hpY2ggaGF2ZSB0aGUgY29ycmVjdCBwYXJlbnRzIGFzIHRoZXkgYXJlDQorICogdGhlIG5l dyBlbnRyaWVzIHdoaWNoIG5lZWQgdG8gYmUgZm9sbG93ZWQgdG8gZmluZCBvdGhlciBpbmNvcnJl Y3RseSBzZXQNCisgKiBwYXJlbnRzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZGVz Y2VuZF9hZG9wdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSBs aXN0WzNdLCBuZXh0WzNdOw0KKwlpbnQgaSwgbjsNCisNCisJLyoNCisJICogQXQgZWFjaCBsZXZl bCB0aGVyZSBtYXkgYmUgdXAgdG8gMyBjb3JyZWN0IHBhcmVudCBwb2ludGVycyB3aGljaCBpbmRp Y2F0ZXMNCisJICogdGhlIG5ldyBub2RlcyB3aGljaCBuZWVkIHRvIGJlIHdhbGtlZCB0byBmaW5k IGFueSBuZXcgbm9kZXMgYXQgYSBsb3dlciBsZXZlbC4NCisJICovDQorDQorCWZvciAoaSA9IDA7 IGkgPCAzOyBpKyspIHsNCisJCWxpc3RbaV0gPSAqbWFzOw0KKwkJbGlzdFtpXS5vZmZzZXQgPSAw Ow0KKwkJbmV4dFtpXS5vZmZzZXQgPSAwOw0KKwl9DQorCW5leHRbMF0gPSAqbWFzOw0KKw0KKwl3 aGlsZSAoIW10ZV9pc19sZWFmKGxpc3RbMF0ubm9kZSkpIHsNCisJCW4gPSAwOw0KKwkJZm9yIChp ID0gMDsgaSA8IDM7IGkrKykgew0KKwkJCWlmIChtYXNfaXNfbm9uZSgmbGlzdFtpXSkpDQorCQkJ CWNvbnRpbnVlOw0KKw0KKwkJCWlmIChpICYmIGxpc3RbaS0xXS5ub2RlID09IGxpc3RbaV0ubm9k ZSkNCisJCQkJY29udGludWU7DQorDQorCQkJd2hpbGUgKChuIDwgMykgJiYgKG1hc19uZXdfY2hp bGQoJmxpc3RbaV0sICZuZXh0W25dKSkpDQorCQkJCW4rKzsNCisNCisJCQltYXNfYWRvcHRfY2hp bGRyZW4oJmxpc3RbaV0sIGxpc3RbaV0ubm9kZSk7DQorCQl9DQorDQorCQl3aGlsZSAobiA8IDMp DQorCQkJbmV4dFtuKytdLm5vZGUgPSBNQVNfTk9ORTsNCisNCisJCS8qIGRlc2NlbmQgYnkgc2V0 dGluZyB0aGUgbGlzdCB0byB0aGUgY2hpbGRyZW4gKi8NCisJCWZvciAoaSA9IDA7IGkgPCAzOyBp KyspDQorCQkJbGlzdFtpXSA9IG5leHRbaV07DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfYnVs a19yZWJhbGFuY2UoKSAtIFJlYmFsYW5jZSB0aGUgZW5kIG9mIGEgdHJlZSBhZnRlciBhIGJ1bGsg aW5zZXJ0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbmQ6IFRoZSBtYXBsZSBu b2RlIGVuZA0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtYXNfYnVsa19yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGNoYXIgZW5kLA0KKwkJCQkgICAgICBlbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlpZiAoISht YXMtPm1hc19mbGFncyAmIE1BX1NUQVRFX0JVTEspKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRl X2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJaWYgKGVuZCA+IG10X21pbl9z bG90c1ttdF0pIHsNCisJCW1hcy0+bWFzX2ZsYWdzICY9IH5NQV9TVEFURV9SRUJBTEFOQ0U7DQor CQlyZXR1cm47DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfc3RvcmVfYl9ub2RlKCkgLSBTdG9y ZSBhbiBAZW50cnkgaW50byB0aGUgYl9ub2RlIHdoaWxlIGFsc28gY29weWluZyB0aGUNCisgKiBk YXRhIGZyb20gYSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICogQHdyX21hczogdGhlIG1hcGxlIHdy aXRlIHN0YXRlDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHRvIGZpbGwgd2l0aCBk YXRhDQorICogQG9mZnNldF9lbmQ6IHRoZSBvZmZzZXQgdG8gZW5kIGNvcHlpbmcNCisgKg0KKyAq IFJldHVybjogVGhlIGFjdHVhbCBlbmQgb2YgdGhlIGRhdGEgc3RvcmVkIGluIEBiX25vZGUNCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3N0b3JlX2Jfbm9kZShzdHJ1Y3QgbWFfd3Jfc3Rh dGUgKndyX21hcywNCisJCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLCB1bnNpZ25lZCBj aGFyIG9mZnNldF9lbmQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNsb3Q7DQorCXVuc2lnbmVkIGNo YXIgYl9lbmQ7DQorCS8qIFBvc3NpYmxlIHVuZGVyZmxvdyBvZiBwaXYgd2lsbCB3cmFwIGJhY2sg dG8gMCBiZWZvcmUgdXNlLiAqLw0KKwl1bnNpZ25lZCBsb25nIHBpdjsNCisJc3RydWN0IG1hX3N0 YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisNCisJYl9ub2RlLT50eXBlID0gd3JfbWFzLT50eXBl Ow0KKwliX2VuZCA9IDA7DQorCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJaWYgKHNsb3QpIHsNCisJ CS8qIENvcHkgc3RhcnQgZGF0YSB1cCB0byBpbnNlcnQuICovDQorCQltYXNfbWFiX2NwKG1hcywg MCwgc2xvdCAtIDEsIGJfbm9kZSwgMCk7DQorCQliX2VuZCA9IGJfbm9kZS0+Yl9lbmQ7DQorCQlw aXYgPSBiX25vZGUtPnBpdm90W2JfZW5kIC0gMV07DQorCX0gZWxzZQ0KKwkJcGl2ID0gbWFzLT5t aW4gLSAxOw0KKw0KKwlpZiAocGl2ICsgMSA8IG1hcy0+aW5kZXgpIHsNCisJCS8qIEhhbmRsZSBy YW5nZSBzdGFydGluZyBhZnRlciBvbGQgcmFuZ2UgKi8NCisJCWJfbm9kZS0+c2xvdFtiX2VuZF0g PSB3cl9tYXMtPmNvbnRlbnQ7DQorCQlpZiAoIXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUt PmdhcFtiX2VuZF0gPSBtYXMtPmluZGV4IC0gMSAtIHBpdjsNCisJCWJfbm9kZS0+cGl2b3RbYl9l bmQrK10gPSBtYXMtPmluZGV4IC0gMTsNCisJfQ0KKw0KKwkvKiBTdG9yZSB0aGUgbmV3IGVudHJ5 LiAqLw0KKwltYXMtPm9mZnNldCA9IGJfZW5kOw0KKwliX25vZGUtPnNsb3RbYl9lbmRdID0gd3Jf bWFzLT5lbnRyeTsNCisJYl9ub2RlLT5waXZvdFtiX2VuZF0gPSBtYXMtPmxhc3Q7DQorDQorCS8q IEFwcGVuZGVkLiAqLw0KKwlpZiAobWFzLT5sYXN0ID49IG1hcy0+bWF4KQ0KKwkJZ290byBiX2Vu ZDsNCisNCisJLyogSGFuZGxlIG5ldyByYW5nZSBlbmRpbmcgYmVmb3JlIG9sZCByYW5nZSBlbmRz ICovDQorCXBpdiA9IG1hc19sb2dpY2FsX3Bpdm90KG1hcywgd3JfbWFzLT5waXZvdHMsIG9mZnNl dF9lbmQsIHdyX21hcy0+dHlwZSk7DQorCWlmIChwaXYgPiBtYXMtPmxhc3QpIHsNCisJCWlmIChw aXYgPT0gVUxPTkdfTUFYKQ0KKwkJCW1hc19idWxrX3JlYmFsYW5jZShtYXMsIGJfbm9kZS0+Yl9l bmQsIHdyX21hcy0+dHlwZSk7DQorDQorCQlpZiAob2Zmc2V0X2VuZCAhPSBzbG90KQ0KKwkJCXdy X21hcy0+Y29udGVudCA9IG1hc19zbG90X2xvY2tlZChtYXMsIHdyX21hcy0+c2xvdHMsDQorCQkJ CQkJCSAgb2Zmc2V0X2VuZCk7DQorDQorCQliX25vZGUtPnNsb3RbKytiX2VuZF0gPSB3cl9tYXMt PmNvbnRlbnQ7DQorCQlpZiAoIXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2Vu ZF0gPSBwaXYgLSBtYXMtPmxhc3QgKyAxOw0KKwkJYl9ub2RlLT5waXZvdFtiX2VuZF0gPSBwaXY7 DQorCX0NCisNCisJc2xvdCA9IG9mZnNldF9lbmQgKyAxOw0KKwlpZiAoc2xvdCA+IHdyX21hcy0+ bm9kZV9lbmQpDQorCQlnb3RvIGJfZW5kOw0KKw0KKwkvKiBDb3B5IGVuZCBkYXRhIHRvIHRoZSBl bmQgb2YgdGhlIG5vZGUuICovDQorCW1hc19tYWJfY3AobWFzLCBzbG90LCB3cl9tYXMtPm5vZGVf ZW5kICsgMSwgYl9ub2RlLCArK2JfZW5kKTsNCisJYl9ub2RlLT5iX2VuZC0tOw0KKwlyZXR1cm47 DQorDQorYl9lbmQ6DQorCWJfbm9kZS0+Yl9lbmQgPSBiX2VuZDsNCit9DQorDQorLyoNCisgKiBt YXNfcHJldl9zaWJsaW5nKCkgLSBGaW5kIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIHNhbWUg cGFyZW50Lg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUcnVl IGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgc2libGluZywgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfcHJldl9zaWJsaW5nKHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJdW5zaWduZWQgaW50IHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUp Ow0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybiBmYWxzZTsNCisN CisJaWYgKCFwX3Nsb3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCW1hc19hc2NlbmQobWFzKTsN CisJbWFzLT5vZmZzZXQgPSBwX3Nsb3QgLSAxOw0KKwltYXNfZGVzY2VuZChtYXMpOw0KKwlyZXR1 cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXNfbmV4dF9zaWJsaW5nKCkgLSBGaW5kIHRoZSBu ZXh0IG5vZGUgd2l0aCB0aGUgc2FtZSBwYXJlbnQuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRl DQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHNpYmxpbmcsIGZhbHNl IG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX25leHRfc2libGluZyhz dHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCU1BX1NUQVRFKHBhcmVudCwgbWFzLT50cmVlLCBt YXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkN CisJCXJldHVybiBmYWxzZTsNCisNCisJcGFyZW50ID0gKm1hczsNCisJbWFzX2FzY2VuZCgmcGFy ZW50KTsNCisJcGFyZW50Lm9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpICsgMTsN CisJaWYgKHBhcmVudC5vZmZzZXQgPiBtYXNfZGF0YV9lbmQoJnBhcmVudCkpDQorCQlyZXR1cm4g ZmFsc2U7DQorDQorCSptYXMgPSBwYXJlbnQ7DQorCW1hc19kZXNjZW5kKG1hcyk7DQorCXJldHVy biB0cnVlOw0KK30NCisNCisvKg0KKyAqIG10ZV9ub2RlX29yX25vZGUoKSAtIFJldHVybiB0aGUg ZW5jb2RlZCBub2RlIG9yIE1BU19OT05FLg0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUg bm9kZS4NCisgKg0KKyAqIFNob3J0aGFuZCB0byBhdm9pZCBzZXR0aW5nICVOVUxMcyBpbiB0aGUg dHJlZSBvciBtYXBsZV9zdWJ0cmVlX3N0YXRlLg0KKyAqDQorICogUmV0dXJuOiBAZW5vZGUgb3Ig TUFTX05PTkUNCisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbXRlX25v ZGVfb3Jfbm9uZShzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJaWYgKGVub2RlKQ0K KwkJcmV0dXJuIGVub2RlOw0KKw0KKwlyZXR1cm4gbWFfZW5vZGVfcHRyKE1BU19OT05FKTsNCit9 DQorDQorLyoNCisgKiBtYXNfd3Jfbm9kZV93YWxrKCkgLSBGaW5kIHRoZSBjb3JyZWN0IG9mZnNl dCBmb3IgdGhlIGluZGV4IGluIHRoZSBAbWFzLg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0 ZSBzdGF0ZQ0KKyAqDQorICogVXNlcyBtYXNfc2xvdF9sb2NrZWQoKSBhbmQgZG9lcyBub3QgbmVl ZCB0byB3b3JyeSBhYm91dCBkZWFkIG5vZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfd3Jfbm9kZV93YWxrKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0 IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisJdW5zaWduZWQgY2hhciBjb3VudDsNCisJ dW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1pbiwgbWF4Ow0K Kw0KKwlpZiAodW5saWtlbHkobWFfaXNfZGVuc2Uod3JfbWFzLT50eXBlKSkpIHsNCisJCXdyX21h cy0+cl9tYXggPSB3cl9tYXMtPnJfbWluID0gbWFzLT5pbmRleDsNCisJCW1hcy0+b2Zmc2V0ID0g bWFzLT5pbmRleCA9IG1hcy0+bWluOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCXdyX21hcy0+bm9k ZSA9IG1hc19tbih3cl9tYXMtPm1hcyk7DQorCXdyX21hcy0+cGl2b3RzID0gbWFfcGl2b3RzKHdy X21hcy0+bm9kZSwgd3JfbWFzLT50eXBlKTsNCisJY291bnQgPSB3cl9tYXMtPm5vZGVfZW5kID0g bWFfZGF0YV9lbmQod3JfbWFzLT5ub2RlLCB3cl9tYXMtPnR5cGUsDQorCQkJCQkgICAgICAgd3Jf bWFzLT5waXZvdHMsIG1hcy0+bWF4KTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCW1pbiA9 IG1hc19zYWZlX21pbihtYXMsIHdyX21hcy0+cGl2b3RzLCBvZmZzZXQpOw0KKwltYXggPSB3cl9t YXMtPnBpdm90c1tvZmZzZXRdOw0KKwlpZiAodW5saWtlbHkob2Zmc2V0ID09IGNvdW50KSkNCisJ CWdvdG8gbWF4OyAvKiBtYXkgaGF2ZSBiZWVuIHNldCB0byB6ZXJvICovDQorDQorCWluZGV4ID0g bWFzLT5pbmRleDsNCisJaWYgKHVubGlrZWx5KGluZGV4IDw9IG1heCkpDQorCQlnb3RvIGRvbmU7 DQorDQorCWlmICh1bmxpa2VseSghbWF4ICYmIG9mZnNldCkpDQorCQlnb3RvIG1heDsNCisNCisJ bWluID0gbWF4ICsgMTsNCisJd2hpbGUgKCsrb2Zmc2V0IDwgY291bnQpIHsNCisJCW1heCA9IHdy X21hcy0+cGl2b3RzW29mZnNldF07DQorCQlpZiAoaW5kZXggPD0gbWF4KQ0KKwkJCWdvdG8gZG9u ZTsNCisJCWVsc2UgaWYgKHVubGlrZWx5KCFtYXgpKQ0KKwkJCWJyZWFrOw0KKw0KKwkJbWluID0g bWF4ICsgMTsNCisJfQ0KKw0KK21heDoNCisJbWF4ID0gbWFzLT5tYXg7DQorZG9uZToNCisJd3Jf bWFzLT5yX21heCA9IG1heDsNCisJd3JfbWFzLT5yX21pbiA9IG1pbjsNCisJd3JfbWFzLT5vZmZz ZXRfZW5kID0gbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorfQ0KKw0KKy8qDQorICogbWFzdF90b3Bp YXJ5KCkgLSBBZGQgdGhlIHBvcnRpb25zIG9mIHRoZSB0cmVlIHRvIHRoZSByZW1vdmFsIGxpc3Q7 IGVpdGhlciB0bw0KKyAqIGJlIGZyZWVkIG9yIGRpc2NhcmRlZCAoZGVzdHJveSB3YWxrKS4NCisg KiBAbWFzdDogVGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUuDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc3RfdG9waWFyeShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQor CU1BX1dSX1NUQVRFKHdyX21hcywgbWFzdC0+b3JpZ19sLCBOVUxMKTsNCisJdW5zaWduZWQgY2hh ciBsX29mZiwgcl9vZmYsIG9mZnNldDsNCisJdW5zaWduZWQgbG9uZyBsX2luZGV4Ow0KKwlzdHJ1 Y3QgbWFwbGVfZW5vZGUgKmNoaWxkOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCXdyX21h cy50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwkvKiBUaGUgbGVm dCBub2RlIGlzIGNvbnN1bWVkLCBzbyBhZGQgdG8gdGhlIGZyZWUgbGlzdC4gKi8NCisJbF9pbmRl eCA9IG1hc3QtPm9yaWdfbC0+aW5kZXg7DQorCW1hc3QtPm9yaWdfbC0+aW5kZXggPSBtYXN0LT5v cmlnX2wtPmxhc3Q7DQorCW1hc193cl9ub2RlX3dhbGsoJndyX21hcyk7DQorCW1hc3QtPm9yaWdf bC0+aW5kZXggPSBsX2luZGV4Ow0KKwlsX29mZiA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0Ow0KKwly X29mZiA9IG1hc3QtPm9yaWdfci0+b2Zmc2V0Ow0KKwlpZiAobWFzdC0+b3JpZ19sLT5ub2RlID09 IG1hc3QtPm9yaWdfci0+bm9kZSkgew0KKwkJc2xvdHMgPSBtYV9zbG90cyhtdGVfdG9fbm9kZSht YXN0LT5vcmlnX2wtPm5vZGUpLCB3cl9tYXMudHlwZSk7DQorCQlmb3IgKG9mZnNldCA9IGxfb2Zm ICsgMTsgb2Zmc2V0IDwgcl9vZmY7IG9mZnNldCsrKQ0KKwkJCW1hdF9hZGQobWFzdC0+ZGVzdHJv eSwgbWFzX3Nsb3RfbG9ja2VkKG1hc3QtPm9yaWdfbCwNCisJCQkJCQkJc2xvdHMsIG9mZnNldCkp Ow0KKw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCS8qIG1hc3QtPm9yaWdfciBpcyBkaWZmZXJlbnQg YW5kIGNvbnN1bWVkLiAqLw0KKwlpZiAobXRlX2lzX2xlYWYobWFzdC0+b3JpZ19yLT5ub2RlKSkN CisJCXJldHVybjsNCisNCisJLyogTm93IGRlc3Ryb3kgbF9vZmYgKyAxIC0+IGVuZCBhbmQgMCAt PiByX29mZiAtIDEgKi8NCisJb2Zmc2V0ID0gbF9vZmYgKyAxOw0KKwlzbG90cyA9IG1hX3Nsb3Rz KG10ZV90b19ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSksIHdyX21hcy50eXBlKTsNCisJd2hpbGUg KG9mZnNldCA8IG10X3Nsb3RzW3dyX21hcy50eXBlXSkgew0KKwkJY2hpbGQgPSBtYXNfc2xvdF9s b2NrZWQobWFzdC0+b3JpZ19sLCBzbG90cywgb2Zmc2V0KyspOw0KKwkJaWYgKCFjaGlsZCkNCisJ CQlicmVhazsNCisNCisJCW1hdF9hZGQobWFzdC0+ZGVzdHJveSwgY2hpbGQpOw0KKwl9DQorDQor CXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzdC0+b3JpZ19yLT5ub2RlKSwNCisJCQkg ICAgIG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19yLT5ub2RlKSk7DQorCWZvciAob2Zmc2V0ID0g MDsgb2Zmc2V0IDwgcl9vZmY7IG9mZnNldCsrKQ0KKwkJbWF0X2FkZChtYXN0LT5kZXN0cm95LA0K KwkJCQltYXNfc2xvdF9sb2NrZWQobWFzdC0+b3JpZ19sLCBzbG90cywgb2Zmc2V0KSk7DQorfQ0K Kw0KKy8qDQorICogbWFzdF9yZWJhbGFuY2VfbmV4dCgpIC0gUmViYWxhbmNlIGFnYWluc3QgdGhl IG5leHQgbm9kZQ0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBvbGRf cjogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byB0aGUgcmlnaHQgKG5leHQgbm9kZSkuDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfcmViYWxhbmNlX25leHQoc3RydWN0IG1hcGxlX3N1 YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9y LCBib29sIGZyZWUpDQorew0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kID0gbWFzdC0+Ym4tPmJfZW5k Ow0KKw0KKwltYXNfbWFiX2NwKG1hc3QtPm9yaWdfciwgMCwgbXRfc2xvdF9jb3VudChtYXN0LT5v cmlnX3ItPm5vZGUpLA0KKwkJICAgbWFzdC0+Ym4sIGJfZW5kKTsNCisJaWYgKGZyZWUpDQorCQlt YXRfYWRkKG1hc3QtPmZyZWUsIG9sZF9yKTsNCisNCisJbWFzdC0+b3JpZ19yLT5sYXN0ID0gbWFz dC0+b3JpZ19yLT5tYXg7DQorCWlmIChvbGRfciA9PSBtYXN0LT5vcmlnX2wtPm5vZGUpDQorCQlt YXN0LT5vcmlnX2wtPm5vZGUgPSBtYXN0LT5vcmlnX3ItPm5vZGU7DQorfQ0KKw0KKy8qDQorICog bWFzdF9yZWJhbGFuY2VfcHJldigpIC0gUmViYWxhbmNlIGFnYWluc3QgdGhlIHByZXZpb3VzIG5v ZGUNCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAb2xkX2w6IFRoZSBl bmNvZGVkIG1hcGxlIG5vZGUgdG8gdGhlIGxlZnQgKHByZXZpb3VzIG5vZGUpDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc3RfcmViYWxhbmNlX3ByZXYoc3RydWN0IG1hcGxlX3N1YnRyZWVf c3RhdGUgKm1hc3QsDQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9sKQ0KK3sN CisJdW5zaWduZWQgY2hhciBlbmQgPSBtYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19sKSArIDE7DQor CXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorDQorCW1hYl9zaGlmdF9y aWdodChtYXN0LT5ibiwgZW5kKTsNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX2wsIDAsIGVuZCAt IDEsIG1hc3QtPmJuLCAwKTsNCisJbWF0X2FkZChtYXN0LT5mcmVlLCBvbGRfbCk7DQorCWlmICht YXN0LT5vcmlnX3ItPm5vZGUgPT0gb2xkX2wpDQorCQltYXN0LT5vcmlnX3ItPm5vZGUgPSBtYXN0 LT5vcmlnX2wtPm5vZGU7DQorCW1hc3QtPmwtPm1pbiA9IG1hc3QtPm9yaWdfbC0+bWluOw0KKwlt YXN0LT5vcmlnX2wtPmluZGV4ID0gbWFzdC0+b3JpZ19sLT5taW47DQorCW1hc3QtPmJuLT5iX2Vu ZCA9IGVuZCArIGJfZW5kOw0KKwltYXN0LT5sLT5vZmZzZXQgKz0gZW5kOw0KK30NCisNCisvKg0K KyAqIG1hc3Rfc2libGluZ19yZWJhbGFuY2VfcmlnaHQoKSAtIFJlYmFsYW5jZSBmcm9tIG5vZGVz IHdpdGggdGhlIHNhbWUgcGFyZW50cy4NCisgKiBDaGVjayB0aGUgcmlnaHQgc2lkZSwgdGhlbiB0 aGUgbGVmdC4gIERhdGEgaXMgY29waWVkIGludG8gdGhlIEBtYXN0LT5ibi4NCisgKiBAbWFzdDog VGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUuDQorICovDQorc3RhdGljIGlubGluZQ0KK2Jvb2wgbWFz dF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFz dCwgYm9vbCBmcmVlKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGRfcjsNCisJc3RydWN0 IG1hcGxlX2Vub2RlICpvbGRfbDsNCisNCisJb2xkX3IgPSBtYXN0LT5vcmlnX3ItPm5vZGU7DQor CWlmIChtYXNfbmV4dF9zaWJsaW5nKG1hc3QtPm9yaWdfcikpIHsNCisJCW1hc3RfcmViYWxhbmNl X25leHQobWFzdCwgb2xkX3IsIGZyZWUpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJb2xk X2wgPSBtYXN0LT5vcmlnX2wtPm5vZGU7DQorCWlmIChtYXNfcHJldl9zaWJsaW5nKG1hc3QtPm9y aWdfbCkpIHsNCisJCW1hc3QtPmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wt Pm5vZGUpOw0KKwkJbWFzdF9yZWJhbGFuY2VfcHJldihtYXN0LCBvbGRfbCk7DQorCQlyZXR1cm4g dHJ1ZTsNCisJfQ0KKw0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgaW50 IG1hc19wcmV2X25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKTsN CitzdGF0aWMgaW5saW5lIGludCBtYXNfbmV4dF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBz dHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJdW5zaWduZWQgbG9uZyBtYXgpOw0KKy8qDQor ICogbWFzdF9jb3VzaW5fcmViYWxhbmNlX3JpZ2h0KCkgLSBSZWJhbGFuY2UgZnJvbSBub2RlcyB3 aXRoIGRpZmZlcmVudCBwYXJlbnRzLg0KKyAqIENoZWNrIHRoZSByaWdodCBzaWRlLCB0aGVuIHRo ZSBsZWZ0LiAgRGF0YSBpcyBjb3BpZWQgaW50byB0aGUgQG1hc3QtPmJuLg0KKyAqIEBtYXN0OiBU aGUgbWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lDQorYm9vbCBtYXN0 X2NvdXNpbl9yZWJhbGFuY2VfcmlnaHQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3Qs IGJvb2wgZnJlZSkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqb2xkX2wgPSBtYXN0LT5vcmln X2wtPm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqb2xkX3IgPSBtYXN0LT5vcmlnX3ItPm5v ZGU7DQorDQorCU1BX1NUQVRFKHRtcCwgbWFzdC0+b3JpZ19yLT50cmVlLCBtYXN0LT5vcmlnX3It PmluZGV4LCBtYXN0LT5vcmlnX3ItPmxhc3QpOw0KKw0KKwl0bXAgPSAqbWFzdC0+b3JpZ19yOw0K KwltYXNfbmV4dF9ub2RlKG1hc3QtPm9yaWdfciwgbWFzX21uKG1hc3QtPm9yaWdfciksIFVMT05H X01BWCk7DQorCWlmICghbWFzX2lzX25vbmUobWFzdC0+b3JpZ19yKSkgew0KKwkJbWFzdF9yZWJh bGFuY2VfbmV4dChtYXN0LCBvbGRfciwgZnJlZSk7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0K KwkqbWFzdC0+b3JpZ19yID0gKm1hc3QtPm9yaWdfbDsNCisJKm1hc3QtPnIgPSAqbWFzdC0+bDsN CisJbWFzX3ByZXZfbm9kZShtYXN0LT5vcmlnX2wsIDApOw0KKwlpZiAobWFzX2lzX25vbmUobWFz dC0+b3JpZ19sKSkgew0KKwkJLyogTWFraW5nIGEgbmV3IHJvb3Qgd2l0aCB0aGUgY29udGVudHMg b2YgbWFzdC0+Ym4gKi8NCisJCSptYXN0LT5vcmlnX2wgPSAqbWFzdC0+b3JpZ19yOw0KKwkJKm1h c3QtPm9yaWdfciA9IHRtcDsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwltYXN0LT5vcmln X2wtPm9mZnNldCA9IDA7DQorCW1hc3RfcmViYWxhbmNlX3ByZXYobWFzdCwgb2xkX2wpOw0KKwly ZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXN0X2FzY2VuZF9mcmVlKCkgLSBBZGQgY3Vy cmVudCBvcmlnaW5hbCBtYXBsZSBzdGF0ZSBub2RlcyB0byB0aGUgZnJlZSBsaXN0DQorICogYW5k IGFzY2VuZC4NCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUuDQorICoNCisgKiBB c2NlbmQgdGhlIG9yaWdpbmFsIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGFuZCBhZGQgdGhlIHByZXZp b3VzIG5vZGVzIHRvIHRoZQ0KKyAqIGZyZWUgbGlzdC4gIFNldCB0aGUgc2xvdHMgdG8gcG9pbnQg dG8gdGhlIGNvcnJlY3QgbG9jYXRpb24gaW4gdGhlIG5ldyBub2Rlcy4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQNCittYXN0X2FzY2VuZF9mcmVlKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRl ICptYXN0KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXN0LT5vcmlnX3IsICBOVUxMKTsN CisJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0ID0gbWFzdC0+b3JpZ19sLT5ub2RlOw0KKwlzdHJ1 Y3QgbWFwbGVfZW5vZGUgKnJpZ2h0ID0gbWFzdC0+b3JpZ19yLT5ub2RlOw0KKw0KKwltYXNfYXNj ZW5kKG1hc3QtPm9yaWdfbCk7DQorCW1hc19hc2NlbmQobWFzdC0+b3JpZ19yKTsNCisJbWF0X2Fk ZChtYXN0LT5mcmVlLCBsZWZ0KTsNCisNCisJaWYgKGxlZnQgIT0gcmlnaHQpDQorCQltYXRfYWRk KG1hc3QtPmZyZWUsIHJpZ2h0KTsNCisNCisJbWFzdC0+b3JpZ19yLT5vZmZzZXQgPSAwOw0KKwlt YXN0LT5vcmlnX3ItPmluZGV4ID0gbWFzdC0+ci0+bWF4Ow0KKwkvKiBsYXN0IHNob3VsZCBiZSBs YXJnZXIgdGhhbiBvciBlcXVhbCB0byBpbmRleCAqLw0KKwlpZiAobWFzdC0+b3JpZ19yLT5sYXN0 IDwgbWFzdC0+b3JpZ19yLT5pbmRleCkNCisJCW1hc3QtPm9yaWdfci0+bGFzdCA9IG1hc3QtPm9y aWdfci0+aW5kZXg7DQorCS8qDQorCSAqIFRoZSBub2RlIG1heSBub3QgY29udGFpbiB0aGUgdmFs dWUgc28gc2V0IHNsb3QgdG8gZW5zdXJlIGFsbA0KKwkgKiBvZiB0aGUgbm9kZXMgY29udGVudHMg YXJlIGZyZWVkIG9yIGRlc3Ryb3llZC4NCisJICovDQorCWlmIChtYXN0LT5vcmlnX3ItPm1heCA8 IG1hc3QtPm9yaWdfci0+bGFzdCkNCisJCW1hc3QtPm9yaWdfci0+b2Zmc2V0ID0gbWFzX2RhdGFf ZW5kKG1hc3QtPm9yaWdfcikgKyAxOw0KKwllbHNlIHsNCisJCXdyX21hcy50eXBlID0gbXRlX25v ZGVfdHlwZShtYXN0LT5vcmlnX3ItPm5vZGUpOw0KKwkJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFz KTsNCisJfQ0KKwkvKiBTZXQgdXAgdGhlIGxlZnQgc2lkZSBvZiB0aGluZ3MgKi8NCisJbWFzdC0+ b3JpZ19sLT5vZmZzZXQgPSAwOw0KKwltYXN0LT5vcmlnX2wtPmluZGV4ID0gbWFzdC0+bC0+bWlu Ow0KKwl3cl9tYXMubWFzID0gbWFzdC0+b3JpZ19sOw0KKwl3cl9tYXMudHlwZSA9IG10ZV9ub2Rl X3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKTsNCisJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFzKTsN Cit9DQorDQorLyoNCisgKiBtYXNfbmV3X21hX25vZGUoKSAtIENyZWF0ZSBhbmQgcmV0dXJuIGEg bmV3IG1hcGxlIG5vZGUuICBIZWxwZXIgZnVuY3Rpb24uDQorICogQG1hczogdGhlIG1hcGxlIHN0 YXRlIHdpdGggdGhlIGFsbG9jYXRpb25zLg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9k ZSB3aXRoIHRoZSB0eXBlIGVuY29kaW5nLg0KKyAqDQorICogVXNlIHRoZSBub2RlIHR5cGUgZnJv bSB0aGUgbWFwbGVfYmlnX25vZGUgdG8gYWxsb2NhdGUgYSBuZXcgbm9kZSBmcm9tIHRoZQ0KKyAq IG1hX3N0YXRlLiAgVGhpcyBmdW5jdGlvbiBleGlzdHMgbWFpbmx5IGZvciBjb2RlIHJlYWRhYmls aXR5Lg0KKyAqDQorICogUmV0dXJuOiBBIG5ldyBtYXBsZSBlbmNvZGVkIG5vZGUNCisgKi8NCitz dGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZQ0KKyptYXNfbmV3X21hX25vZGUoc3RydWN0 IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlKQ0KK3sNCisJcmV0 dXJuIG10X21rX25vZGUobWFfbW5vZGVfcHRyKG1hc19wb3Bfbm9kZShtYXMpKSwgYl9ub2RlLT50 eXBlKTsNCit9DQorDQorLyoNCisgKiBtYXNfbWFiX3RvX25vZGUoKSAtIFNldCB1cCByaWdodCBh bmQgbWlkZGxlIG5vZGVzDQorICoNCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUgdGhhdCBjb250 YWlucyB0aGUgYWxsb2NhdGlvbnMuDQorICogQGJfbm9kZTogdGhlIG5vZGUgd2hpY2ggY29udGFp bnMgdGhlIGRhdGEuDQorICogQGxlZnQ6IFRoZSBwb2ludGVyIHdoaWNoIHdpbGwgaGF2ZSB0aGUg bGVmdCBub2RlDQorICogQHJpZ2h0OiBUaGUgcG9pbnRlciB3aGljaCBtYXkgaGF2ZSB0aGUgcmln aHQgbm9kZQ0KKyAqIEBtaWRkbGU6IHRoZSBwb2ludGVyIHdoaWNoIG1heSBoYXZlIHRoZSBtaWRk bGUgbm9kZSAocmFyZSkNCisgKiBAbWlkX3NwbGl0OiB0aGUgc3BsaXQgbG9jYXRpb24gZm9yIHRo ZSBtaWRkbGUgbm9kZQ0KKyAqDQorICogUmV0dXJuOiB0aGUgc3BsaXQgb2YgbGVmdC4NCisgKi8N CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbWFzX21hYl90b19ub2RlKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLA0KKwlzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwgc3RydWN0IG1hcGxl X2Vub2RlICoqbGVmdCwNCisJc3RydWN0IG1hcGxlX2Vub2RlICoqcmlnaHQsIHN0cnVjdCBtYXBs ZV9lbm9kZSAqKm1pZGRsZSwNCisJdW5zaWduZWQgY2hhciAqbWlkX3NwbGl0LCB1bnNpZ25lZCBs b25nIG1pbikNCit7DQorCXVuc2lnbmVkIGNoYXIgc3BsaXQgPSAwOw0KKwl1bnNpZ25lZCBjaGFy IHNsb3RfY291bnQgPSBtdF9zbG90c1tiX25vZGUtPnR5cGVdOw0KKw0KKwkqbGVmdCA9IG1hc19u ZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCSpyaWdodCA9IE5VTEw7DQorCSptaWRkbGUgPSBO VUxMOw0KKwkqbWlkX3NwbGl0ID0gMDsNCisNCisJaWYgKGJfbm9kZS0+Yl9lbmQgPCBzbG90X2Nv dW50KSB7DQorCQlzcGxpdCA9IGJfbm9kZS0+Yl9lbmQ7DQorCX0gZWxzZSB7DQorCQlzcGxpdCA9 IG1hYl9jYWxjX3NwbGl0KG1hcywgYl9ub2RlLCBtaWRfc3BsaXQsIG1pbik7DQorCQkqcmlnaHQg PSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0KKwl9DQorDQorCWlmICgqbWlkX3NwbGl0 KQ0KKwkJKm1pZGRsZSA9IG1hc19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorDQorCXJldHVy biBzcGxpdDsNCisNCit9DQorDQorLyoNCisgKiBtYWJfc2V0X2JfZW5kKCkgLSBBZGQgZW50cnkg dG8gYl9ub2RlIGF0IGJfbm9kZS0+Yl9lbmQgYW5kIGluY3JlbWVudCB0aGUgZW5kDQorICogcG9p bnRlci4NCisgKiBAYl9ub2RlIC0gdGhlIGJpZyBub2RlIHRvIGFkZCB0aGUgZW50cnkNCisgKiBA bWFzIC0gdGhlIG1hcGxlIHN0YXRlIHRvIGdldCB0aGUgcGl2b3QgKG1hcy0+bWF4KQ0KKyAqIEBl bnRyeSAtIHRoZSBlbnRyeSB0byBhZGQsIGlmIE5VTEwgbm90aGluZyBoYXBwZW5zLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgdm9pZCBtYWJfc2V0X2JfZW5kKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAq Yl9ub2RlLA0KKwkJCQkgc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJCSB2b2lkICplbnRyeSkN Cit7DQorCWlmICghZW50cnkpDQorCQlyZXR1cm47DQorDQorCWJfbm9kZS0+c2xvdFtiX25vZGUt PmJfZW5kXSA9IGVudHJ5Ow0KKwlpZiAobXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJCWJfbm9k ZS0+Z2FwW2Jfbm9kZS0+Yl9lbmRdID0gbWFzX21heF9nYXAobWFzKTsNCisJYl9ub2RlLT5waXZv dFtiX25vZGUtPmJfZW5kKytdID0gbWFzLT5tYXg7DQorfQ0KKw0KKy8qDQorICogbWFzX3NldF9z cGxpdF9wYXJlbnQoKSAtIGNvbWJpbmVfdGhlbl9zZXBhcmF0ZSBoZWxwZXIgZnVuY3Rpb24uICBT ZXRzIHRoZSBwYXJlbnQNCisgKiBvZiBAbWFzLT5ub2RlIHRvIGVpdGhlciBAbGVmdCBvciBAcmln aHQsIGRlcGVuZGluZyBvbiBAc2xvdCBhbmQgQHNwbGl0DQorICoNCisgKiBAbWFzIC0gdGhlIG1h cGxlIHN0YXRlIHdpdGggdGhlIG5vZGUgdGhhdCBuZWVkcyBhIHBhcmVudA0KKyAqIEBsZWZ0IC0g cG9zc2libGUgcGFyZW50IDENCisgKiBAcmlnaHQgLSBwb3NzaWJsZSBwYXJlbnQgMg0KKyAqIEBz bG90IC0gdGhlIHNsb3QgdGhlIG1hcy0+bm9kZSB3YXMgcGxhY2VkDQorICogQHNwbGl0IC0gdGhl IHNwbGl0IGxvY2F0aW9uIGJldHdlZW4gQGxlZnQgYW5kIEByaWdodA0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYXNfc2V0X3NwbGl0X3BhcmVudChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJ CQkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGVmdCwNCisJCQkJCXN0cnVjdCBtYXBsZV9lbm9kZSAq cmlnaHQsDQorCQkJCQl1bnNpZ25lZCBjaGFyICpzbG90LCB1bnNpZ25lZCBjaGFyIHNwbGl0KQ0K K3sNCisJaWYgKG1hc19pc19ub25lKG1hcykpDQorCQlyZXR1cm47DQorDQorCWlmICgoKnNsb3Qp IDw9IHNwbGl0KQ0KKwkJbXRlX3NldF9wYXJlbnQobWFzLT5ub2RlLCBsZWZ0LCAqc2xvdCk7DQor CWVsc2UgaWYgKHJpZ2h0KQ0KKwkJbXRlX3NldF9wYXJlbnQobWFzLT5ub2RlLCByaWdodCwgKCpz bG90KSAtIHNwbGl0IC0gMSk7DQorDQorCSgqc2xvdCkrKzsNCit9DQorDQorLyoNCisgKiBtdGVf bWlkX3NwbGl0X2NoZWNrKCkgLSBDaGVjayBpZiB0aGUgbmV4dCBub2RlIHBhc3NlcyB0aGUgbWlk LXNwbGl0DQorICogQCoqbDogUG9pbnRlciB0byBsZWZ0IGVuY29kZWQgbWFwbGUgbm9kZS4NCisg KiBAKiptOiBQb2ludGVyIHRvIG1pZGRsZSBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICogQCoqcjog UG9pbnRlciB0byByaWdodCBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICogQHNsb3Q6IFRoZSBvZmZz ZXQNCisgKiBAKnNwbGl0OiBUaGUgc3BsaXQgbG9jYXRpb24uDQorICogQG1pZF9zcGxpdDogVGhl IG1pZGRsZSBzcGxpdC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX21pZF9zcGxpdF9j aGVjayhzdHJ1Y3QgbWFwbGVfZW5vZGUgKipsLA0KKwkJCQkgICAgICAgc3RydWN0IG1hcGxlX2Vu b2RlICoqciwNCisJCQkJICAgICAgIHN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQsDQorCQkJCSAg ICAgICB1bnNpZ25lZCBjaGFyIHNsb3QsDQorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzcGxp dCwNCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbWlkX3NwbGl0KQ0KK3sNCisJaWYgKCpyID09 IHJpZ2h0KQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAoc2xvdCA8IG1pZF9zcGxpdCkNCisJCXJldHVy bjsNCisNCisJKmwgPSAqcjsNCisJKnIgPSByaWdodDsNCisJKnNwbGl0ID0gbWlkX3NwbGl0Ow0K K30NCisNCisvKg0KKyAqIG1hc3Rfc2V0X3NwbGl0X3BhcmVudHMoKSAtIEhlbHBlciBmdW5jdGlv biB0byBzZXQgdGhyZWUgbm9kZXMgcGFyZW50cy4gIFNsb3QNCisgKiBpcyB0YWtlbiBmcm9tIEBt YXN0LT5sLg0KKyAqIEBtYXN0IC0gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbGVmdCAt IHRoZSBsZWZ0IG5vZGUNCisgKiBAcmlnaHQgLSB0aGUgcmlnaHQgbm9kZQ0KKyAqIEBzcGxpdCAt IHRoZSBzcGxpdCBsb2NhdGlvbi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9zZXRf c3BsaXRfcGFyZW50cyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJCSAg c3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0LA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1p ZGRsZSwNCisJCQkJCSAgc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwNCisJCQkJCSAgdW5zaWdu ZWQgY2hhciBzcGxpdCwNCisJCQkJCSAgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQorew0KKwl1 bnNpZ25lZCBjaGFyIHNsb3Q7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbCA9IGxlZnQ7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqciA9IHJpZ2h0Ow0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzdC0+ bCkpDQorCQlyZXR1cm47DQorDQorCWlmIChtaWRkbGUpDQorCQlyID0gbWlkZGxlOw0KKw0KKwlz bG90ID0gbWFzdC0+bC0+b2Zmc2V0Ow0KKw0KKwltdGVfbWlkX3NwbGl0X2NoZWNrKCZsLCAmciwg cmlnaHQsIHNsb3QsICZzcGxpdCwgbWlkX3NwbGl0KTsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQo bWFzdC0+bCwgbCwgciwgJnNsb3QsIHNwbGl0KTsNCisNCisJbXRlX21pZF9zcGxpdF9jaGVjaygm bCwgJnIsIHJpZ2h0LCBzbG90LCAmc3BsaXQsIG1pZF9zcGxpdCk7DQorCW1hc19zZXRfc3BsaXRf cGFyZW50KG1hc3QtPm0sIGwsIHIsICZzbG90LCBzcGxpdCk7DQorDQorCW10ZV9taWRfc3BsaXRf Y2hlY2soJmwsICZyLCByaWdodCwgc2xvdCwgJnNwbGl0LCBtaWRfc3BsaXQpOw0KKwltYXNfc2V0 X3NwbGl0X3BhcmVudChtYXN0LT5yLCBsLCByLCAmc2xvdCwgc3BsaXQpOw0KK30NCisNCisvKg0K KyAqIG1hc193bWJfcmVwbGFjZSgpIC0gV3JpdGUgbWVtb3J5IGJhcnJpZXIgYW5kIHJlcGxhY2UN CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZnJlZTogdGhlIG1hcGxlIHRvcGlhcnkg bGlzdCBvZiBub2RlcyB0byBmcmVlDQorICogQGRlc3Ryb3k6IFRoZSBtYXBsZSB0b3BpYXJ5IGxp c3Qgb2Ygbm9kZXMgdG8gZGVzdHJveSAod2FsayBhbmQgZnJlZSkNCisgKg0KKyAqIFVwZGF0ZXMg Z2FwIGFzIG5lY2Vzc2FyeS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3dtYl9yZXBs YWNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQkgICBzdHJ1Y3QgbWFfdG9waWFyeSAqZnJl ZSwNCisJCQkJICAgc3RydWN0IG1hX3RvcGlhcnkgKmRlc3Ryb3kpDQorew0KKwkvKiBBbGwgbm9k ZXMgbXVzdCBzZWUgb2xkIGRhdGEgYXMgZGVhZCBwcmlvciB0byByZXBsYWNpbmcgdGhhdCBkYXRh ICovDQorCXNtcF93bWIoKTsNCisNCisJLyogSW5zZXJ0IHRoZSBuZXcgZGF0YSBpbiB0aGUgdHJl ZSAqLw0KKwltYXNfcmVwbGFjZShtYXMsIHRydWUpOw0KKw0KKwlpZiAoIW10ZV9pc19sZWFmKG1h cy0+bm9kZSkpDQorCQltYXNfZGVzY2VuZF9hZG9wdChtYXMpOw0KKw0KKwltYXNfbWF0X2ZyZWUo bWFzLCBmcmVlKTsNCisNCisJaWYgKGRlc3Ryb3kpDQorCQltYXNfbWF0X2Rlc3Ryb3kobWFzLCBk ZXN0cm95KTsNCisNCisJaWYgKG10ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQor DQorCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9uZXdfcm9vdCgp IC0gU2V0IGEgbmV3IHRyZWUgcm9vdCBkdXJpbmcgc3VidHJlZSBjcmVhdGlvbg0KKyAqIEBtYXN0 OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAq ICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfbmV3X3Jvb3Qoc3RydWN0IG1hcGxlX3N1YnRy ZWVfc3RhdGUgKm1hc3QsDQorCQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCW1hc19t bihtYXN0LT5sKS0+cGFyZW50ID0NCisJCW1hX3BhcmVudF9wdHIoKCh1bnNpZ25lZCBsb25nKW1h cy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCWlmICghbXRlX2RlYWRfbm9kZShtYXN0LT5v cmlnX2wtPm5vZGUpICYmDQorCSAgICAhbXRlX2lzX3Jvb3QobWFzdC0+b3JpZ19sLT5ub2RlKSkg ew0KKwkJZG8gew0KKwkJCW1hc3RfYXNjZW5kX2ZyZWUobWFzdCk7DQorCQkJbWFzdF90b3BpYXJ5 KG1hc3QpOw0KKwkJfSB3aGlsZSAoIW10ZV9pc19yb290KG1hc3QtPm9yaWdfbC0+bm9kZSkpOw0K Kwl9DQorCWlmICgobWFzdC0+b3JpZ19sLT5ub2RlICE9IG1hcy0+bm9kZSkgJiYNCisJCSAgICht YXN0LT5sLT5kZXB0aCA+IG1hc19tdF9oZWlnaHQobWFzKSkpIHsNCisJCW1hdF9hZGQobWFzdC0+ ZnJlZSwgbWFzLT5ub2RlKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfY3BfdG9fbm9kZXMo KSAtIENvcHkgZGF0YSBvdXQgdG8gbm9kZXMuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVl IHN0YXRlDQorICogQGxlZnQ6IFRoZSBsZWZ0IGVuY29kZWQgbWFwbGUgbm9kZQ0KKyAqIEBtaWRk bGU6IFRoZSBtaWRkbGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQHJpZ2h0OiBUaGUgcmlnaHQg ZW5jb2RlZCBtYXBsZSBub2RlDQorICogQHNwbGl0OiBUaGUgbG9jYXRpb24gdG8gc3BsaXQgYmV0 d2VlbiBsZWZ0IGFuZCAobWlkZGxlID8gbWlkZGxlIDogcmlnaHQpDQorICogQG1pZF9zcGxpdDog VGhlIGxvY2F0aW9uIHRvIHNwbGl0IGJldHdlZW4gbWlkZGxlIGFuZCByaWdodC4NCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgbWFzdF9jcF90b19ub2RlcyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9z dGF0ZSAqbWFzdCwNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0LCBzdHJ1Y3QgbWFwbGVfZW5v ZGUgKm1pZGRsZSwNCisJc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwgdW5zaWduZWQgY2hhciBz cGxpdCwgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQorew0KKwlib29sIG5ld19sbWF4ID0gdHJ1 ZTsNCisNCisJbWFzdC0+bC0+bm9kZSA9IG10ZV9ub2RlX29yX25vbmUobGVmdCk7DQorCW1hc3Qt Pm0tPm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKG1pZGRsZSk7DQorCW1hc3QtPnItPm5vZGUgPSBt dGVfbm9kZV9vcl9ub25lKHJpZ2h0KTsNCisNCisJbWFzdC0+bC0+bWluID0gbWFzdC0+b3JpZ19s LT5taW47DQorCWlmIChzcGxpdCA9PSBtYXN0LT5ibi0+Yl9lbmQpIHsNCisJCW1hc3QtPmwtPm1h eCA9IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwkJbmV3X2xtYXggPSBmYWxzZTsNCisJfQ0KKw0KKwlt YWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBzcGxpdCwgbWFzdC0+bCwgbmV3X2xtYXgpOw0KKw0KKwlp ZiAobWlkZGxlKSB7DQorCQltYWJfbWFzX2NwKG1hc3QtPmJuLCAxICsgc3BsaXQsIG1pZF9zcGxp dCwgbWFzdC0+bSwgdHJ1ZSk7DQorCQltYXN0LT5tLT5taW4gPSBtYXN0LT5ibi0+cGl2b3Rbc3Bs aXRdICsgMTsNCisJCXNwbGl0ID0gbWlkX3NwbGl0Ow0KKwl9DQorDQorCW1hc3QtPnItPm1heCA9 IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwlpZiAocmlnaHQpIHsNCisJCW1hYl9tYXNfY3AobWFzdC0+ Ym4sIDEgKyBzcGxpdCwgbWFzdC0+Ym4tPmJfZW5kLCBtYXN0LT5yLCBmYWxzZSk7DQorCQltYXN0 LT5yLT5taW4gPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRdICsgMTsNCisJfQ0KK30NCisNCisvKg0K KyAqIG1hc3RfY29tYmluZV9jcF9sZWZ0IC0gQ29weSBpbiB0aGUgb3JpZ2luYWwgbGVmdCBzaWRl IG9mIHRoZSB0cmVlIGludG8gdGhlDQorICogY29tYmluZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxl IHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0 YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfY29tYmluZV9jcF9sZWZ0KHN0cnVj dCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBsX3Nsb3Qg PSBtYXN0LT5vcmlnX2wtPm9mZnNldDsNCisNCisJaWYgKCFsX3Nsb3QpDQorCQlyZXR1cm47DQor DQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19sLCAwLCBsX3Nsb3QgLSAxLCBtYXN0LT5ibiwgMCk7 DQorfQ0KKw0KKy8qDQorICogbWFzdF9jb21iaW5lX2NwX3JpZ2h0OiBDb3B5IGluIHRoZSBvcmln aW5hbCByaWdodCBzaWRlIG9mIHRoZSB0cmVlIGludG8gdGhlDQorICogY29tYmluZWQgZGF0YSBz ZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICogQG1hc3Q6IFRoZSBt YXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfY29tYmlu ZV9jcF9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCWlmICht YXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4tPmJfZW5kIC0gMV0gPj0gbWFzdC0+b3JpZ19yLT5tYXgp DQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19yLCBtYXN0LT5vcmlnX3It Pm9mZnNldCArIDEsDQorCQkgICBtdF9zbG90X2NvdW50KG1hc3QtPm9yaWdfci0+bm9kZSksIG1h c3QtPmJuLA0KKwkJICAgbWFzdC0+Ym4tPmJfZW5kKTsNCisJbWFzdC0+b3JpZ19yLT5sYXN0ID0g bWFzdC0+b3JpZ19yLT5tYXg7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zdWZmaWNpZW50OiBDaGVj ayBpZiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBoYXMgZW5vdWdoIGRhdGEgaW4gdGhlIGJpZw0K KyAqIG5vZGUgdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSBzdWZmaWNpZW50IG5vZGUNCisgKiBAbWFz dDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFz dF9zdWZmaWNpZW50KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJaWYg KG1hc3QtPmJuLT5iX2VuZCA+IG10X21pbl9zbG90X2NvdW50KG1hc3QtPm9yaWdfbC0+bm9kZSkp DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKg0KKyAqIG1h c3Rfb3ZlcmZsb3c6IENoZWNrIGlmIHRoZXJlIGlzIHRvbyBtdWNoIGRhdGEgaW4gdGhlIHN1YnRy ZWUgc3RhdGUgZm9yIGENCisgKiBzaW5nbGUgbm9kZS4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1 YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzdF9vdmVyZmxvdyhzdHJ1 Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCWlmIChtYXN0LT5ibi0+Yl9lbmQg Pj0gbXRfc2xvdF9jb3VudChtYXN0LT5vcmlnX2wtPm5vZGUpKQ0KKwkJcmV0dXJuIHRydWU7DQor DQorCXJldHVybiBmYWxzZTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdHJlZV9yYW5n ZV93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgbG9uZyAqcGl2b3Rz Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQor CXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCwgKmxhc3Q7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBl Ow0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25l ZCBsb25nIG1heCwgbWluOw0KKwl1bnNpZ25lZCBsb25nIHByZXZfbWF4LCBwcmV2X21pbjsNCisN CisJbGFzdCA9IG5leHQgPSBtYXMtPm5vZGU7DQorCXByZXZfbWluID0gbWluID0gbWFzLT5taW47 DQorCW1heCA9IG1hcy0+bWF4Ow0KKwlkbyB7DQorCQlvZmZzZXQgPSAwOw0KKwkJbGFzdCA9IG5l eHQ7DQorCQlub2RlID0gbXRlX3RvX25vZGUobmV4dCk7DQorCQl0eXBlID0gbXRlX25vZGVfdHlw ZShuZXh0KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJCWVuZCA9IG1h X2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWF4KTsNCisJCWlmICh1bmxpa2VseShtYV9k ZWFkX25vZGUobm9kZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKw0KKwkJaWYgKHBpdm90c1tv ZmZzZXRdID49IG1hcy0+aW5kZXgpIHsNCisJCQlwcmV2X21heCA9IG1heDsNCisJCQlwcmV2X21p biA9IG1pbjsNCisJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJCQlnb3RvIG5leHQ7DQorCQl9 DQorDQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7DQorCQl9IHdoaWxlKChvZmZzZXQgPCBlbmQpICYm IChwaXZvdHNbb2Zmc2V0XSA8IG1hcy0+aW5kZXgpKTsNCisNCisJCXByZXZfbWluID0gbWluOw0K KwkJbWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisJCXByZXZfbWF4ID0gbWF4Ow0KKwkJ aWYgKGxpa2VseShvZmZzZXQgPCBlbmQgJiYgcGl2b3RzW29mZnNldF0pKQ0KKwkJCW1heCA9IHBp dm90c1tvZmZzZXRdOw0KKw0KK25leHQ6DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUp Ow0KKwkJbmV4dCA9IG10X3Nsb3QobWFzLT50cmVlLCBzbG90cywgb2Zmc2V0KTsNCisJCWlmICh1 bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKwl9IHdo aWxlICghbWFfaXNfbGVhZih0eXBlKSk7DQorDQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwlt YXMtPmluZGV4ID0gbWluOw0KKwltYXMtPmxhc3QgPSBtYXg7DQorCW1hcy0+bWluID0gcHJldl9t aW47DQorCW1hcy0+bWF4ID0gcHJldl9tYXg7DQorCW1hcy0+bm9kZSA9IGxhc3Q7DQorCXJldHVy biAodm9pZCAqKSBuZXh0Ow0KKw0KK2RlYWRfbm9kZToNCisJbWFzX3Jlc2V0KG1hcyk7DQorCXJl dHVybiBOVUxMOw0KK30NCisNCisvKg0KKyAqIG1hc19zcGFubmluZ19yZWJhbGFuY2UoKSAtIFJl YmFsYW5jZSBhY3Jvc3MgdHdvIG5vZGVzIHdoaWNoIG1heSBub3QgYmUgcGVlcnMuDQorICogQG1h czogVGhlIHN0YXJ0aW5nIG1hcGxlIHN0YXRlDQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0cmVl X3N0YXRlLCBrZWVwcyB0cmFjayBvZiA0IG1hcGxlIHN0YXRlcy4NCisgKiBAY291bnQ6IFRoZSBl c3RpbWF0ZWQgY291bnQgb2YgaXRlcmF0aW9ucyBuZWVkZWQuDQorICoNCisgKiBGb2xsb3cgdGhl IHRyZWUgdXB3YXJkcyBmcm9tIEBsX21hcyBhbmQgQHJfbWFzIGZvciBAY291bnQsIG9yIHVudGls IHRoZSByb290DQorICogaXMgaGl0LiAgRmlyc3QgQGJfbm9kZSBpcyBzcGxpdCBpbnRvIHR3byBl bnRyaWVzIHdoaWNoIGFyZSBpbnNlcnRlZCBpbnRvIHRoZQ0KKyAqIG5leHQgaXRlcmF0aW9uIG9m IHRoZSBsb29wLiAgQGJfbm9kZSBpcyByZXR1cm5lZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZmluYWwN CisgKiBpdGVyYXRpb24uIEBtYXMgaXMgdXNlZCB0byBvYnRhaW4gYWxsb2NhdGlvbnMuICBvcmln X2xfbWFzIGtlZXBzIHRyYWNrIG9mIHRoZQ0KKyAqIG5vZGVzIHRoYXQgd2lsbCByZW1haW4gYWN0 aXZlIGJ5IHVzaW5nIG9yaWdfbF9tYXMtPmluZGV4IGFuZCBvcmlnX2xfbWFzLT5sYXN0DQorICog dG8gYWNjb3VudCBvZiB3aGF0IGhhcyBiZWVuIGNvcGllZCBpbnRvIHRoZSBuZXcgc3ViLXRyZWUu ICBUaGUgdXBkYXRlIG9mDQorICogb3JpZ19sX21hcy0+bGFzdCBpcyB1c2VkIGluIG1hc19jb25z dW1lIHRvIGZpbmQgdGhlIHNsb3RzIHRoYXQgd2lsbCBuZWVkIHRvDQorICogYmUgZWl0aGVyIGZy ZWVkIG9yIGRlc3Ryb3llZC4gIG9yaWdfbF9tYXMtPmRlcHRoIGtlZXBzIHRyYWNrIG9mIHRoZSBo ZWlnaHQgb2YNCisgKiB0aGUgbmV3IHN1Yi10cmVlIGluIGNhc2UgdGhlIHN1Yi10cmVlIGJlY29t ZXMgdGhlIGZ1bGwgdHJlZS4NCisgKg0KKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBlbGVtZW50 cyBpbiBiX25vZGUgZHVyaW5nIHRoZSBsYXN0IGxvb3AuDQorICovDQorc3RhdGljIGludCBtYXNf c3Bhbm5pbmdfcmViYWxhbmNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxl X3N1YnRyZWVfc3RhdGUgKm1hc3QsIHVuc2lnbmVkIGNoYXIgY291bnQpDQorew0KKwl1bnNpZ25l ZCBjaGFyIHNwbGl0LCBtaWRfc3BsaXQ7DQorCXVuc2lnbmVkIGNoYXIgc2xvdCA9IDA7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqbGVmdCA9IE5VTEwsICptaWRkbGUgPSBOVUxMLCAqcmlnaHQgPSBO VUxMOw0KKw0KKwlNQV9TVEFURShsX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmlu ZGV4KTsNCisJTUFfU1RBVEUocl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5pbmRl eCk7DQorCU1BX1NUQVRFKG1fbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+aW5kZXgp Ow0KKwlNQV9UT1BJQVJZKGZyZWUsIG1hcy0+dHJlZSk7DQorCU1BX1RPUElBUlkoZGVzdHJveSwg bWFzLT50cmVlKTsNCisNCisJLyoNCisJICogVGhlIHRyZWUgbmVlZHMgdG8gYmUgcmViYWxhbmNl ZCBhbmQgbGVhdmVzIG5lZWQgdG8gYmUga2VwdCBhdCB0aGUgc2FtZSBsZXZlbC4NCisJICogUmVi YWxhbmNpbmcgaXMgZG9uZSBieSB1c2Ugb2YgdGhlIGBgc3RydWN0IG1hcGxlX3RvcGlhcnlgYC4N CisJICovDQorCW1hc3QtPmwgPSAmbF9tYXM7DQorCW1hc3QtPm0gPSAmbV9tYXM7DQorCW1hc3Qt PnIgPSAmcl9tYXM7DQorCW1hc3QtPmZyZWUgPSAmZnJlZTsNCisJbWFzdC0+ZGVzdHJveSA9ICZk ZXN0cm95Ow0KKwlsX21hcy5ub2RlID0gcl9tYXMubm9kZSA9IG1fbWFzLm5vZGUgPSBNQVNfTk9O RTsNCisJaWYgKCFtYXNfaXNfcm9vdF9saW1pdHMobWFzdC0+b3JpZ19sKSAmJg0KKwkgICAgdW5s aWtlbHkobWFzdC0+Ym4tPmJfZW5kIDw9IG10X21pbl9zbG90c1ttYXN0LT5ibi0+dHlwZV0pKSB7 DQorCQkvKg0KKwkJICogRG8gbm90IGZyZWUgdGhlIGN1cnJlbnQgbm9kZSBhcyBpdCBtYXkgYmUg ZnJlZWQgaW4gYSBidWxrDQorCQkgKiBmcmVlLg0KKwkJICovDQorCQlpZiAoIW1hc3Rfc2libGlu Z19yZWJhbGFuY2VfcmlnaHQobWFzdCwgZmFsc2UpKQ0KKwkJCW1hc3RfY291c2luX3JlYmFsYW5j ZV9yaWdodChtYXN0LCBmYWxzZSk7DQorCX0NCisJbWFzdC0+b3JpZ19sLT5kZXB0aCA9IDA7DQor DQorCS8qDQorCSAqIEVhY2ggbGV2ZWwgb2YgdGhlIHRyZWUgaXMgZXhhbWluZWQgYW5kIGJhbGFu Y2VkLCBwdXNoaW5nIGRhdGEgdG8gdGhlIGxlZnQgb3INCisJICogcmlnaHQsIG9yIHJlYmFsYW5j aW5nIGFnYWluc3QgbGVmdCBvciByaWdodCBub2RlcyBpcyBlbXBsb3llZCB0byBhdm9pZA0KKwkg KiByaXBwbGluZyB1cCB0aGUgdHJlZSB0byBsaW1pdCB0aGUgYW1vdW50IG9mIGNodXJuLiAgT25j ZSBhIG5ldyBzdWItc2VjdGlvbiBvZg0KKwkgKiB0aGUgdHJlZSBpcyBjcmVhdGVkLCB0aGVyZSBt YXkgYmUgYSBtaXggb2YgbmV3IGFuZCBvbGQgbm9kZXMuICBUaGUgb2xkIG5vZGVzDQorCSAqIHdp bGwgaGF2ZSB0aGUgaW5jb3JyZWN0IHBhcmVudCBwb2ludGVycyBhbmQgY3VycmVudGx5IGJlIGlu IHR3byB0cmVlczogdGhlDQorCSAqIG9yaWdpbmFsIHRyZWUgYW5kIHRoZSBwYXJ0aWFsbHkgbmV3 IHRyZWUuICBUbyByZW1lZHkgdGhlIHBhcmVudCBwb2ludGVycyBpbg0KKwkgKiB0aGUgb2xkIHRy ZWUsIHRoZSBuZXcgZGF0YSBpcyBzd2FwcGVkIGludG8gdGhlIGFjdGl2ZSB0cmVlIGFuZCBhIHdh bGsgZG93bg0KKwkgKiB0aGUgdHJlZSBpcyBwZXJmb3JtZWQgYW5kIHRoZSBwYXJlbnQgcG9pbnRl cnMgYXJlIHVwZGF0ZWQuDQorCSAqIFNlZSBtYXNfZGVzY2VuZF9hZG9wdCgpIGZvciBtb3JlIGlu Zm9ybWF0aW9uLi4NCisJICovDQorCXdoaWxlIChjb3VudC0tKSB7DQorCQltYXN0LT5ibi0+Yl9l bmQtLTsNCisJCW1hc3QtPmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5v ZGUpOw0KKwkJc3BsaXQgPSBtYXNfbWFiX3RvX25vZGUobWFzLCBtYXN0LT5ibiwgJmxlZnQsICZy aWdodCwgJm1pZGRsZSwNCisJCQkJCSZtaWRfc3BsaXQsIG1hc3QtPm9yaWdfbC0+bWluKTsNCisJ CW1hc3Rfc2V0X3NwbGl0X3BhcmVudHMobWFzdCwgbGVmdCwgbWlkZGxlLCByaWdodCwgc3BsaXQs DQorCQkJCSAgICAgICBtaWRfc3BsaXQpOw0KKwkJbWFzdF9jcF90b19ub2RlcyhtYXN0LCBsZWZ0 LCBtaWRkbGUsIHJpZ2h0LCBzcGxpdCwgbWlkX3NwbGl0KTsNCisNCisJCS8qDQorCQkgKiBDb3B5 IGRhdGEgZnJvbSBuZXh0IGxldmVsIGluIHRoZSB0cmVlIHRvIG1hc3QtPmJuIGZyb20gbmV4dA0K KwkJICogaXRlcmF0aW9uDQorCQkgKi8NCisJCW1lbXNldChtYXN0LT5ibiwgMCwgc2l6ZW9mKHN0 cnVjdCBtYXBsZV9iaWdfbm9kZSkpOw0KKwkJbWFzdC0+Ym4tPnR5cGUgPSBtdGVfbm9kZV90eXBl KGxlZnQpOw0KKwkJbWFzdC0+b3JpZ19sLT5kZXB0aCsrOw0KKw0KKwkJLyogUm9vdCBhbHJlYWR5 IHN0b3JlZCBpbiBsLT5ub2RlLiAqLw0KKwkJaWYgKG1hc19pc19yb290X2xpbWl0cyhtYXN0LT5s KSkNCisJCQlnb3RvIG5ld19yb290Ow0KKw0KKwkJbWFzdF9hc2NlbmRfZnJlZShtYXN0KTsNCisJ CW1hc3RfY29tYmluZV9jcF9sZWZ0KG1hc3QpOw0KKwkJbF9tYXMub2Zmc2V0ID0gbWFzdC0+Ym4t PmJfZW5kOw0KKwkJbWFiX3NldF9iX2VuZChtYXN0LT5ibiwgJmxfbWFzLCBsZWZ0KTsNCisJCW1h Yl9zZXRfYl9lbmQobWFzdC0+Ym4sICZtX21hcywgbWlkZGxlKTsNCisJCW1hYl9zZXRfYl9lbmQo bWFzdC0+Ym4sICZyX21hcywgcmlnaHQpOw0KKw0KKwkJLyogQ29weSBhbnl0aGluZyBuZWNlc3Nh cnkgb3V0IG9mIHRoZSByaWdodCBub2RlLiAqLw0KKwkJbWFzdF9jb21iaW5lX2NwX3JpZ2h0KG1h c3QpOw0KKwkJbWFzdF90b3BpYXJ5KG1hc3QpOw0KKwkJbWFzdC0+b3JpZ19sLT5sYXN0ID0gbWFz dC0+b3JpZ19sLT5tYXg7DQorDQorCQlpZiAobWFzdF9zdWZmaWNpZW50KG1hc3QpKQ0KKwkJCWNv bnRpbnVlOw0KKw0KKwkJaWYgKG1hc3Rfb3ZlcmZsb3cobWFzdCkpDQorCQkJY29udGludWU7DQor DQorCQkvKiBNYXkgYmUgYSBuZXcgcm9vdCBzdG9yZWQgaW4gbWFzdC0+Ym4gKi8NCisJCWlmICht YXNfaXNfcm9vdF9saW1pdHMobWFzdC0+b3JpZ19sKSkNCisJCQlicmVhazsNCisNCisJCS8qIFRy eSB0byBnZXQgZW5vdWdoIGRhdGEgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4gKi8NCisJCWlmICgh bWFzdF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdodChtYXN0LCB0cnVlKSkNCisJCQlpZiAoIW1hc3Rf Y291c2luX3JlYmFsYW5jZV9yaWdodChtYXN0LCB0cnVlKSkNCisJCQkJYnJlYWs7DQorDQorCQkv KiByZWJhbGFuY2luZyBmcm9tIG90aGVyIG5vZGVzIG1heSByZXF1aXJlIGFub3RoZXIgbG9vcC4g Ki8NCisJCWlmICghY291bnQpDQorCQkJY291bnQrKzsNCisJfQ0KKwlsX21hcy5ub2RlID0gbXRf bWtfbm9kZShtYV9tbm9kZV9wdHIobWFzX3BvcF9ub2RlKG1hcykpLA0KKwkJCQltdGVfbm9kZV90 eXBlKG1hc3QtPm9yaWdfbC0+bm9kZSkpOw0KKwltYXN0LT5vcmlnX2wtPmRlcHRoKys7DQorCW1h Yl9tYXNfY3AobWFzdC0+Ym4sIDAsIG10X3Nsb3RzW21hc3QtPmJuLT50eXBlXSAtIDEsICZsX21h cywgdHJ1ZSk7DQorCW10ZV9zZXRfcGFyZW50KGxlZnQsIGxfbWFzLm5vZGUsIHNsb3QpOw0KKwlp ZiAobWlkZGxlKQ0KKwkJbXRlX3NldF9wYXJlbnQobWlkZGxlLCBsX21hcy5ub2RlLCArK3Nsb3Qp Ow0KKw0KKwlpZiAocmlnaHQpDQorCQltdGVfc2V0X3BhcmVudChyaWdodCwgbF9tYXMubm9kZSwg KytzbG90KTsNCisNCisJaWYgKG1hc19pc19yb290X2xpbWl0cyhtYXN0LT5sKSkgew0KK25ld19y b290Og0KKwkJbWFzdF9uZXdfcm9vdChtYXN0LCBtYXMpOw0KKwl9IGVsc2Ugew0KKwkJbWFzX21u KCZsX21hcyktPnBhcmVudCA9IG1hc19tbihtYXN0LT5vcmlnX2wpLT5wYXJlbnQ7DQorCX0NCisN CisJaWYgKCFtdGVfZGVhZF9ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSkpDQorCQltYXRfYWRkKCZm cmVlLCBtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKw0KKwltYXMtPmRlcHRoID0gbWFzdC0+b3JpZ19s LT5kZXB0aDsNCisJKm1hc3QtPm9yaWdfbCA9IGxfbWFzOw0KKwltdGVfc2V0X25vZGVfZGVhZCht YXMtPm5vZGUpOw0KKw0KKwkvKiBTZXQgdXAgbWFzIGZvciBpbnNlcnRpb24uICovDQorCW1hc3Qt Pm9yaWdfbC0+ZGVwdGggPSBtYXMtPmRlcHRoOw0KKwltYXN0LT5vcmlnX2wtPmFsbG9jID0gbWFz LT5hbGxvYzsNCisJKm1hcyA9ICptYXN0LT5vcmlnX2w7DQorCW1hc193bWJfcmVwbGFjZShtYXMs ICZmcmVlLCAmZGVzdHJveSk7DQorCW10cmVlX3JhbmdlX3dhbGsobWFzKTsNCisJcmV0dXJuIG1h c3QtPmJuLT5iX2VuZDsNCit9DQorDQorLyoNCisgKiBtYXNfcmViYWxhbmNlKCkgLSBSZWJhbGFu Y2UgYSBnaXZlbiBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBiX25vZGU6 IFRoZSBiaWcgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFJlYmFsYW5jZSB0d28gbm9kZXMgaW50byBh IHNpbmdsZSBub2RlIG9yIHR3byBuZXcgbm9kZXMgdGhhdCBhcmUgc3VmZmljaWVudC4NCisgKiBD b250aW51ZSB1cHdhcmRzIHVudGlsIHRyZWUgaXMgc3VmZmljaWVudC4NCisgKg0KKyAqIFJldHVy bjogdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBiX25vZGUgZHVyaW5nIHRoZSBsYXN0IGxvb3Au DQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcywNCisJCQkJc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUpDQorew0KKwljaGFyIGVt cHR5X2NvdW50ID0gbWFzX210X2hlaWdodChtYXMpOw0KKwlzdHJ1Y3QgbWFwbGVfc3VidHJlZV9z dGF0ZSBtYXN0Ow0KKwl1bnNpZ25lZCBjaGFyIHNoaWZ0LCBiX2VuZCA9ICsrYl9ub2RlLT5iX2Vu ZDsNCisNCisJTUFfU1RBVEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0 KTsNCisJTUFfU1RBVEUocl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsN CisNCisJdHJhY2VfbWFfb3AoX19mdW5jX18sIG1hcyk7DQorDQorCS8qDQorCSAqIFJlYmFsYW5j aW5nIG9jY3VycyBpZiBhIG5vZGUgaXMgaW5zdWZmaWNpZW50LiAgRGF0YSBpcyByZWJhbGFuY2Vk DQorCSAqIGFnYWluc3QgdGhlIG5vZGUgdG8gdGhlIHJpZ2h0IGlmIGl0IGV4aXN0cywgb3RoZXJ3 aXNlIHRoZSBub2RlIHRvIHRoZQ0KKwkgKiBsZWZ0IG9mIHRoaXMgbm9kZSBpcyByZWJhbGFuY2Vk IGFnYWluc3QgdGhpcyBub2RlLiAgSWYgcmViYWxhbmNpbmcNCisJICogY2F1c2VzIGp1c3Qgb25l IG5vZGUgdG8gYmUgcHJvZHVjZWQgaW5zdGVhZCBvZiB0d28sIHRoZW4gdGhlIHBhcmVudA0KKwkg KiBpcyBhbHNvIGV4YW1pbmVkIGFuZCByZWJhbGFuY2VkIGlmIGl0IGlzIGluc3VmZmljaWVudC4g IEV2ZXJ5IGxldmVsDQorCSAqIHRyaWVzIHRvIGNvbWJpbmUgdGhlIGRhdGEgaW4gdGhlIHNhbWUg d2F5LiAgSWYgb25lIG5vZGUgY29udGFpbnMgdGhlDQorCSAqIGVudGlyZSByYW5nZSBvZiB0aGUg dHJlZSwgdGhlbiB0aGF0IG5vZGUgaXMgdXNlZCBhcyBhIG5ldyByb290IG5vZGUuDQorCSAqLw0K KwltYXNfbm9kZV9jb3VudChtYXMsIDEgKyBlbXB0eV9jb3VudCAqIDMpOw0KKwlpZiAobWFzX2lz X2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW1hc3Qub3JpZ19sID0gJmxfbWFzOw0KKwlt YXN0Lm9yaWdfciA9ICZyX21hczsNCisJbWFzdC5ibiA9IGJfbm9kZTsNCisNCisJbF9tYXMgPSBy X21hcyA9ICptYXM7DQorDQorCWlmIChtYXNfbmV4dF9zaWJsaW5nKCZyX21hcykpIHsNCisJCW1h c19tYWJfY3AoJnJfbWFzLCAwLCBtdF9zbG90X2NvdW50KHJfbWFzLm5vZGUpLCBiX25vZGUsIGJf ZW5kKTsNCisJCXJfbWFzLmxhc3QgPSByX21hcy5pbmRleCA9IHJfbWFzLm1heDsNCisJfSBlbHNl IHsNCisJCW1hc19wcmV2X3NpYmxpbmcoJmxfbWFzKTsNCisJCXNoaWZ0ID0gbWFzX2RhdGFfZW5k KCZsX21hcykgKyAxOw0KKwkJbWFiX3NoaWZ0X3JpZ2h0KGJfbm9kZSwgc2hpZnQpOw0KKwkJbWFz LT5vZmZzZXQgKz0gc2hpZnQ7DQorCQltYXNfbWFiX2NwKCZsX21hcywgMCwgc2hpZnQgLSAxLCBi X25vZGUsIDApOw0KKwkJYl9ub2RlLT5iX2VuZCA9IHNoaWZ0ICsgYl9lbmQ7DQorCQlsX21hcy5p bmRleCA9IGxfbWFzLmxhc3QgPSBsX21hcy5taW47DQorCX0NCisNCisJcmV0dXJuIG1hc19zcGFu bmluZ19yZWJhbGFuY2UobWFzLCAmbWFzdCwgZW1wdHlfY291bnQpOw0KK30NCisNCisvKg0KKyAq IG1hc19kZXN0cm95X3JlYmFsYW5jZSgpIC0gUmViYWxhbmNlIGxlZnQtbW9zdCBub2RlIHdoaWxl IGRlc3Ryb3lpbmcgdGhlIG1hcGxlDQorICogc3RhdGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0 YXRlDQorICogQGVuZDogVGhlIGVuZCBvZiB0aGUgbGVmdC1tb3N0IG5vZGUuDQorICoNCisgKiBE dXJpbmcgYSBtYXNzLWluc2VydCBldmVudCAoc3VjaCBhcyBmb3JraW5nKSwgaXQgbWF5IGJlIG5l Y2Vzc2FyeSB0bw0KKyAqIHJlYmFsYW5jZSB0aGUgbGVmdC1tb3N0IG5vZGUgd2hlbiBpdCBpcyBu b3Qgc3VmZmljaWVudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Rlc3Ryb3lfcmVi YWxhbmNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCWVu dW0gbWFwbGVfdHlwZSBtdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJc3RydWN0IG1h cGxlX25vZGUgcmV1c2UsICpuZXdub2RlLCAqcGFyZW50LCAqbmV3X2xlZnQsICpsZWZ0LCAqbm9k ZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICplcGFyZW50Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNl dCwgdG1wLCBzcGxpdCA9IG10X3Nsb3RzW210XSAvIDI7DQorCXZvaWQgX19yY3UgKipsX3Nsb3Rz LCAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpsX3BpdnMsICpwaXZzLCBnYXA7DQorCWJvb2wg aW5fcmN1ID0gbXRfaW5fcmN1KG1hcy0+dHJlZSk7DQorDQorCU1BX1NUQVRFKGxfbWFzLCBtYXMt PnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorDQorCWxfbWFzID0gKm1hczsNCisJbWFz X3ByZXZfc2libGluZygmbF9tYXMpOw0KKw0KKwkvKiBzZXQgdXAgbm9kZS4gKi8NCisJaWYgKGlu X3JjdSkgew0KKwkJLyogQWxsb2NhdGUgZm9yIGJvdGggbGVmdCBhbmQgcmlnaHQgYXMgd2VsbCBh cyBwYXJlbnQuICovDQorCQltYXNfbm9kZV9jb3VudChtYXMsIDMpOw0KKwkJaWYgKG1hc19pc19l cnIobWFzKSkNCisJCQlyZXR1cm47DQorDQorCQluZXdub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7 DQorCX0gZWxzZSB7DQorCQluZXdub2RlID0gJnJldXNlOw0KKwl9DQorDQorCW5vZGUgPSBtYXNf bW4obWFzKTsNCisJbmV3bm9kZS0+cGFyZW50ID0gbm9kZS0+cGFyZW50Ow0KKwlzbG90cyA9IG1h X3Nsb3RzKG5ld25vZGUsIG10KTsNCisJcGl2cyA9IG1hX3Bpdm90cyhuZXdub2RlLCBtdCk7DQor CWxlZnQgPSBtYXNfbW4oJmxfbWFzKTsNCisJbF9zbG90cyA9IG1hX3Nsb3RzKGxlZnQsIG10KTsN CisJbF9waXZzID0gbWFfcGl2b3RzKGxlZnQsIG10KTsNCisJaWYgKCFsX3Nsb3RzW3NwbGl0XSkN CisJCXNwbGl0Kys7DQorCXRtcCA9IG1hc19kYXRhX2VuZCgmbF9tYXMpIC0gc3BsaXQ7DQorDQor CW1lbWNweShzbG90cywgbF9zbG90cyArIHNwbGl0ICsgMSwgc2l6ZW9mKHZvaWQgKikgKiB0bXAp Ow0KKwltZW1jcHkocGl2cywgbF9waXZzICsgc3BsaXQgKyAxLCBzaXplb2YodW5zaWduZWQgbG9u ZykgKiB0bXApOw0KKwlwaXZzW3RtcF0gPSBsX21hcy5tYXg7DQorCW1lbWNweShzbG90cyArIHRt cCwgbWFfc2xvdHMobm9kZSwgbXQpLCBzaXplb2Yodm9pZCAqKSAqIGVuZCk7DQorCW1lbWNweShw aXZzICsgdG1wLCBtYV9waXZvdHMobm9kZSwgbXQpLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBl bmQpOw0KKw0KKwlsX21hcy5tYXggPSBsX3BpdnNbc3BsaXRdOw0KKwltYXMtPm1pbiA9IGxfbWFz Lm1heCArIDE7DQorCWVwYXJlbnQgPSBtdF9ta19ub2RlKG10ZV9wYXJlbnQobF9tYXMubm9kZSks DQorCQkJICAgICBtYXNfcGFyZW50X2VudW0oJmxfbWFzLCBsX21hcy5ub2RlKSk7DQorCXRtcCAr PSBlbmQ7DQorCWlmICghaW5fcmN1KSB7DQorCQl1bnNpZ25lZCBjaGFyIG1heF9wID0gbXRfcGl2 b3RzW210XTsNCisJCXVuc2lnbmVkIGNoYXIgbWF4X3MgPSBtdF9zbG90c1ttdF07DQorDQorCQlp ZiAodG1wIDwgbWF4X3ApDQorCQkJbWVtc2V0KHBpdnMgKyB0bXAsIDAsDQorCQkJICAgICAgIHNp emVvZih1bnNpZ25lZCBsb25nICopICogKG1heF9wIC0gdG1wKSk7DQorDQorCQlpZiAodG1wIDwg bXRfc2xvdHNbbXRdKQ0KKwkJCW1lbXNldChzbG90cyArIHRtcCwgMCwgc2l6ZW9mKHZvaWQgKikg KiAobWF4X3MgLSB0bXApKTsNCisNCisJCW1lbWNweShub2RlLCBuZXdub2RlLCBzaXplb2Yoc3Ry dWN0IG1hcGxlX25vZGUpKTsNCisJCW1hX3NldF9tZXRhKG5vZGUsIG10LCAwLCB0bXAgLSAxKTsN CisJCW10ZV9zZXRfcGl2b3QoZXBhcmVudCwgbXRlX3BhcmVudF9zbG90KGxfbWFzLm5vZGUpLA0K KwkJCSAgICAgIGxfcGl2c1tzcGxpdF0pOw0KKw0KKwkJLyogUmVtb3ZlIGRhdGEgZnJvbSBsX3Bp dnMuICovDQorCQl0bXAgPSBzcGxpdCArIDE7DQorCQltZW1zZXQobF9waXZzICsgdG1wLCAwLCBz aXplb2YodW5zaWduZWQgbG9uZykgKiAobWF4X3AgLSB0bXApKTsNCisJCW1lbXNldChsX3Nsb3Rz ICsgdG1wLCAwLCBzaXplb2Yodm9pZCAqKSAqIChtYXhfcyAtIHRtcCkpOw0KKwkJbWFfc2V0X21l dGEobGVmdCwgbXQsIDAsIHNwbGl0KTsNCisNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvKiBS Q1UgcmVxdWlyZXMgcmVwbGFjaW5nIGJvdGggbF9tYXMsIG1hcywgYW5kIHBhcmVudC4gKi8NCisJ bWFzLT5ub2RlID0gbXRfbWtfbm9kZShuZXdub2RlLCBtdCk7DQorCW1hX3NldF9tZXRhKG5ld25v ZGUsIG10LCAwLCB0bXApOw0KKw0KKwluZXdfbGVmdCA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwlu ZXdfbGVmdC0+cGFyZW50ID0gbGVmdC0+cGFyZW50Ow0KKwltdCA9IG10ZV9ub2RlX3R5cGUobF9t YXMubm9kZSk7DQorCXNsb3RzID0gbWFfc2xvdHMobmV3X2xlZnQsIG10KTsNCisJcGl2cyA9IG1h X3Bpdm90cyhuZXdfbGVmdCwgbXQpOw0KKwltZW1jcHkoc2xvdHMsIGxfc2xvdHMsIHNpemVvZih2 b2lkICopICogc3BsaXQpOw0KKwltZW1jcHkocGl2cywgbF9waXZzLCBzaXplb2YodW5zaWduZWQg bG9uZykgKiBzcGxpdCk7DQorCW1hX3NldF9tZXRhKG5ld19sZWZ0LCBtdCwgMCwgc3BsaXQpOw0K KwlsX21hcy5ub2RlID0gbXRfbWtfbm9kZShuZXdfbGVmdCwgbXQpOw0KKw0KKwkvKiByZXBsYWNl IHBhcmVudC4gKi8NCisJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCW10 ID0gbWFzX3BhcmVudF9lbnVtKCZsX21hcywgbF9tYXMubm9kZSk7DQorCXBhcmVudCA9IG1hc19w b3Bfbm9kZShtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKHBhcmVudCwgbXQpOw0KKwlwaXZzID0g bWFfcGl2b3RzKHBhcmVudCwgbXQpOw0KKwltZW1jcHkocGFyZW50LCBtdGVfdG9fbm9kZShlcGFy ZW50KSwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihz bG90c1tvZmZzZXRdLCBtYXMtPm5vZGUpOw0KKwlyY3VfYXNzaWduX3BvaW50ZXIoc2xvdHNbb2Zm c2V0IC0gMV0sIGxfbWFzLm5vZGUpOw0KKwlwaXZzW29mZnNldCAtIDFdID0gbF9tYXMubWF4Ow0K KwllcGFyZW50ID0gbXRfbWtfbm9kZShwYXJlbnQsIG10KTsNCitkb25lOg0KKwlnYXAgPSBtYXNf bGVhZl9tYXhfZ2FwKG1hcyk7DQorCW10ZV9zZXRfZ2FwKGVwYXJlbnQsIG10ZV9wYXJlbnRfc2xv dChtYXMtPm5vZGUpLCBnYXApOw0KKwlnYXAgPSBtYXNfbGVhZl9tYXhfZ2FwKCZsX21hcyk7DQor CW10ZV9zZXRfZ2FwKGVwYXJlbnQsIG10ZV9wYXJlbnRfc2xvdChsX21hcy5ub2RlKSwgZ2FwKTsN CisJbWFzX2FzY2VuZChtYXMpOw0KKw0KKwlpZiAoaW5fcmN1KQ0KKwkJbWFzX3JlcGxhY2UobWFz LCBmYWxzZSk7DQorDQorCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorfQ0KKw0KKy8qDQorICogbWFz X3NwbGl0X2ZpbmFsX25vZGUoKSAtIFNwbGl0IHRoZSBmaW5hbCBub2RlIGluIGEgc3VidHJlZSBv cGVyYXRpb24uDQorICogQG1hc3Q6IHRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQGhlaWdodDogVGhlIGhlaWdodCBvZiB0aGUgdHJlZSBpbiBj YXNlIGl0J3MgYSBuZXcgcm9vdC4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3NwbGl0 X2ZpbmFsX25vZGUoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCQlzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgaW50IGhlaWdodCkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq YW5jZXN0b3I7DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQlpZiAobXRf aXNfYWxsb2MobWFzLT50cmVlKSkNCisJCQltYXN0LT5ibi0+dHlwZSA9IG1hcGxlX2FyYW5nZV82 NDsNCisJCWVsc2UNCisJCQltYXN0LT5ibi0+dHlwZSA9IG1hcGxlX3JhbmdlXzY0Ow0KKwkJbWFz LT5kZXB0aCA9IGhlaWdodDsNCisJfQ0KKwkvKg0KKwkgKiBPbmx5IGEgc2luZ2xlIG5vZGUgaXMg dXNlZCBoZXJlLCBjb3VsZCBiZSByb290Lg0KKwkgKiBUaGUgQmlnX25vZGUgZGF0YSBzaG91bGQg anVzdCBmaXQgaW4gYSBzaW5nbGUgbm9kZS4NCisJICovDQorCWFuY2VzdG9yID0gbWFzX25ld19t YV9ub2RlKG1hcywgbWFzdC0+Ym4pOw0KKwltdGVfc2V0X3BhcmVudChtYXN0LT5sLT5ub2RlLCBh bmNlc3RvciwgbWFzdC0+bC0+b2Zmc2V0KTsNCisJbXRlX3NldF9wYXJlbnQobWFzdC0+ci0+bm9k ZSwgYW5jZXN0b3IsIG1hc3QtPnItPm9mZnNldCk7DQorCW10ZV90b19ub2RlKGFuY2VzdG9yKS0+ cGFyZW50ID0gbWFzX21uKG1hcyktPnBhcmVudDsNCisNCisJbWFzdC0+bC0+bm9kZSA9IGFuY2Vz dG9yOw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0g LSAxLCBtYXN0LT5sLCB0cnVlKTsNCisJbWFzLT5vZmZzZXQgPSBtYXN0LT5ibi0+Yl9lbmQgLSAx Ow0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXN0X2ZpbGxfYm5vZGUoKSAtIENv cHkgZGF0YSBpbnRvIHRoZSBiaWcgbm9kZSBpbiB0aGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXN0 OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0KKyAq IEBza2lwOiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcCBmb3IgbmV3IG5vZGVzIGluc2Vy dGlvbi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9maWxsX2Jub2RlKHN0cnVjdCBt YXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwkJCQkJIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0K KwkJCQkJIHVuc2lnbmVkIGNoYXIgc2tpcCkNCit7DQorCWJvb2wgY3AgPSB0cnVlOw0KKwlzdHJ1 Y3QgbWFwbGVfZW5vZGUgKm9sZCA9IG1hcy0+bm9kZTsNCisJdW5zaWduZWQgY2hhciBzcGxpdDsN CisNCisJbWVtc2V0KG1hc3QtPmJuLT5nYXAsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIEFS UkFZX1NJWkUobWFzdC0+Ym4tPmdhcCkpOw0KKwltZW1zZXQobWFzdC0+Ym4tPnNsb3QsIDAsIHNp emVvZih1bnNpZ25lZCBsb25nKSAqIEFSUkFZX1NJWkUobWFzdC0+Ym4tPnNsb3QpKTsNCisJbWVt c2V0KG1hc3QtPmJuLT5waXZvdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQVJSQVlfU0la RShtYXN0LT5ibi0+cGl2b3QpKTsNCisJbWFzdC0+Ym4tPmJfZW5kID0gMDsNCisNCisJaWYgKG10 ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJCWNwID0gZmFsc2U7DQorCX0gZWxzZSB7DQorCQlt YXNfYXNjZW5kKG1hcyk7DQorCQltYXRfYWRkKG1hc3QtPmZyZWUsIG9sZCk7DQorCQltYXMtPm9m ZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwl9DQorDQorCWlmIChjcCAmJiBt YXN0LT5sLT5vZmZzZXQpDQorCQltYXNfbWFiX2NwKG1hcywgMCwgbWFzdC0+bC0+b2Zmc2V0IC0g MSwgbWFzdC0+Ym4sIDApOw0KKw0KKwlzcGxpdCA9IG1hc3QtPmJuLT5iX2VuZDsNCisJbWFiX3Nl dF9iX2VuZChtYXN0LT5ibiwgbWFzdC0+bCwgbWFzdC0+bC0+bm9kZSk7DQorCW1hc3QtPnItPm9m ZnNldCA9IG1hc3QtPmJuLT5iX2VuZDsNCisJbWFiX3NldF9iX2VuZChtYXN0LT5ibiwgbWFzdC0+ ciwgbWFzdC0+ci0+bm9kZSk7DQorCWlmIChtYXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4tPmJfZW5k IC0gMV0gPT0gbWFzLT5tYXgpDQorCQljcCA9IGZhbHNlOw0KKw0KKwlpZiAoY3ApDQorCQltYXNf bWFiX2NwKG1hcywgc3BsaXQgKyBza2lwLCBtdF9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAxLA0K KwkJCSAgIG1hc3QtPmJuLCBtYXN0LT5ibi0+Yl9lbmQpOw0KKw0KKwltYXN0LT5ibi0+Yl9lbmQt LTsNCisJbWFzdC0+Ym4tPnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorfQ0KKw0K Ky8qDQorICogbWFzdF9zcGxpdF9kYXRhKCkgLSBTcGxpdCB0aGUgZGF0YSBpbiB0aGUgc3VidHJl ZSBzdGF0ZSBiaWcgbm9kZSBpbnRvIHJlZ3VsYXINCisgKiBub2Rlcy4NCisgKiBAbWFzdDogVGhl IG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc3Bs aXQ6IFRoZSBsb2NhdGlvbiB0byBzcGxpdCB0aGUgYmlnIG5vZGUNCisgKi8NCitzdGF0aWMgaW5s aW5lIHZvaWQgbWFzdF9zcGxpdF9kYXRhKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0 LA0KKwkgICBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBzcGxpdCkNCit7DQor CXVuc2lnbmVkIGNoYXIgcF9zbG90Ow0KKw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBzcGxp dCwgbWFzdC0+bCwgdHJ1ZSk7DQorCW10ZV9zZXRfcGl2b3QobWFzdC0+ci0+bm9kZSwgMCwgbWFz dC0+ci0+bWF4KTsNCisJbWFiX21hc19jcChtYXN0LT5ibiwgc3BsaXQgKyAxLCBtYXN0LT5ibi0+ Yl9lbmQsIG1hc3QtPnIsIGZhbHNlKTsNCisJbWFzdC0+bC0+b2Zmc2V0ID0gbXRlX3BhcmVudF9z bG90KG1hcy0+bm9kZSk7DQorCW1hc3QtPmwtPm1heCA9IG1hc3QtPmJuLT5waXZvdFtzcGxpdF07 DQorCW1hc3QtPnItPm1pbiA9IG1hc3QtPmwtPm1heCArIDE7DQorCWlmIChtdGVfaXNfbGVhZiht YXMtPm5vZGUpKQ0KKwkgICAgcmV0dXJuOw0KKw0KKwlwX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9m ZnNldDsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQobWFzdC0+b3JpZ19sLCBtYXN0LT5sLT5ub2Rl LCBtYXN0LT5yLT5ub2RlLA0KKwkJCSAgICAgJnBfc2xvdCwgc3BsaXQpOw0KKwltYXNfc2V0X3Nw bGl0X3BhcmVudChtYXN0LT5vcmlnX3IsIG1hc3QtPmwtPm5vZGUsIG1hc3QtPnItPm5vZGUsDQor CQkJICAgICAmcF9zbG90LCBzcGxpdCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3B1c2hfZGF0YSgp IC0gSW5zdGVhZCBvZiBzcGxpdHRpbmcgYSBub2RlLCBpdCBpcyBiZW5lZmljaWFsIHRvIHB1c2gg dGhlDQorICogZGF0YSB0byB0aGUgcmlnaHQgb3IgbGVmdCBub2RlIGlmIHRoZXJlIGlzIHJvb20u DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGhlaWdodDogVGhlIGN1cnJlbnQgaGVp Z2h0IG9mIHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0 ZQ0KKyAqIEBsZWZ0OiBQdXNoIGxlZnQgb3Igbm90Lg0KKyAqDQorICogS2VlcGluZyB0aGUgaGVp Z2h0IG9mIHRoZSB0cmVlIGxvdyBtZWFucyBmYXN0ZXIgbG9va3Vwcy4NCisgKg0KKyAqIFJldHVy bjogVHJ1ZSBpZiBwdXNoZWQsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5l IGJvb2wgbWFzX3B1c2hfZGF0YShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgaW50IGhlaWdodCwNCisJ CQkJIHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LCBib29sIGxlZnQpDQorew0KKwl1 bnNpZ25lZCBjaGFyIHNsb3RfdG90YWwgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorCXVuc2lnbmVkIGNo YXIgZW5kLCBzcGFjZSwgc3BsaXQ7DQorDQorCU1BX1NUQVRFKHRtcF9tYXMsIG1hcy0+dHJlZSwg bWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJdG1wX21hcyA9ICptYXM7DQorCXRtcF9tYXMuZGVw dGggPSBtYXN0LT5sLT5kZXB0aDsNCisNCisJaWYgKGxlZnQgJiYgIW1hc19wcmV2X3NpYmxpbmco JnRtcF9tYXMpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwllbHNlIGlmICghbGVmdCAmJiAhbWFzX25l eHRfc2libGluZygmdG1wX21hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWVuZCA9IG1hc19k YXRhX2VuZCgmdG1wX21hcyk7DQorCXNsb3RfdG90YWwgKz0gZW5kOw0KKwlzcGFjZSA9IDIgKiBt dF9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAyOw0KKwkvKiAtMiBpbnN0ZWFkIG9mIC0xIHRvIGVu c3VyZSB0aGVyZSBpc24ndCBhIHRyaXBsZSBzcGxpdCAqLw0KKwlpZiAobWFfaXNfbGVhZihtYXN0 LT5ibi0+dHlwZSkpDQorCQlzcGFjZS0tOw0KKw0KKwlpZiAobWFzLT5tYXggPT0gVUxPTkdfTUFY KQ0KKwkJc3BhY2UtLTsNCisNCisJaWYgKHNsb3RfdG90YWwgPj0gc3BhY2UpDQorCQlyZXR1cm4g ZmFsc2U7DQorDQorCS8qIEdldCB0aGUgZGF0YTsgRmlsbCBtYXN0LT5ibiAqLw0KKwltYXN0LT5i bi0+Yl9lbmQrKzsNCisJaWYgKGxlZnQpIHsNCisJCW1hYl9zaGlmdF9yaWdodChtYXN0LT5ibiwg ZW5kICsgMSk7DQorCQltYXNfbWFiX2NwKCZ0bXBfbWFzLCAwLCBlbmQsIG1hc3QtPmJuLCAwKTsN CisJCW1hc3QtPmJuLT5iX2VuZCA9IHNsb3RfdG90YWwgKyAxOw0KKwl9IGVsc2Ugew0KKwkJbWFz X21hYl9jcCgmdG1wX21hcywgMCwgZW5kLCBtYXN0LT5ibiwgbWFzdC0+Ym4tPmJfZW5kKTsNCisJ fQ0KKw0KKwkvKiBDb25maWd1cmUgbWFzdCBmb3Igc3BsaXR0aW5nIG9mIG1hc3QtPmJuICovDQor CXNwbGl0ID0gbXRfc2xvdHNbbWFzdC0+Ym4tPnR5cGVdIC0gMjsNCisJaWYgKGxlZnQpIHsNCisJ CS8qICBTd2l0Y2ggbWFzIHRvIHByZXYgbm9kZSAgKi8NCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwg bWFzLT5ub2RlKTsNCisJCSptYXMgPSB0bXBfbWFzOw0KKwkJLyogU3RhcnQgdXNpbmcgbWFzdC0+ bCBmb3IgdGhlIGxlZnQgc2lkZS4gKi8NCisJCXRtcF9tYXMubm9kZSA9IG1hc3QtPmwtPm5vZGU7 DQorCQkqbWFzdC0+bCA9IHRtcF9tYXM7DQorCX0gZWxzZSB7DQorCQltYXRfYWRkKG1hc3QtPmZy ZWUsIHRtcF9tYXMubm9kZSk7DQorCQl0bXBfbWFzLm5vZGUgPSBtYXN0LT5yLT5ub2RlOw0KKwkJ Km1hc3QtPnIgPSB0bXBfbWFzOw0KKwkJc3BsaXQgPSBzbG90X3RvdGFsIC0gc3BsaXQ7DQorCX0N CisJc3BsaXQgPSBtYWJfbm9fbnVsbF9zcGxpdChtYXN0LT5ibiwgc3BsaXQsIG10X3Nsb3RzW21h c3QtPmJuLT50eXBlXSk7DQorCS8qIFVwZGF0ZSBwYXJlbnQgc2xvdCBmb3Igc3BsaXQgY2FsY3Vs YXRpb24uICovDQorCWlmIChsZWZ0KQ0KKwkJbWFzdC0+b3JpZ19sLT5vZmZzZXQgKz0gZW5kICsg MTsNCisNCisJbWFzdF9zcGxpdF9kYXRhKG1hc3QsIG1hcywgc3BsaXQpOw0KKwltYXN0X2ZpbGxf Ym5vZGUobWFzdCwgbWFzLCAyKTsNCisJbWFzX3NwbGl0X2ZpbmFsX25vZGUobWFzdCwgbWFzLCBo ZWlnaHQgKyAxKTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX3NwbGl0KCkg LSBTcGxpdCBkYXRhIHRoYXQgaXMgdG9vIGJpZyBmb3Igb25lIG5vZGUgaW50byB0d28uDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGJfbm9kZTogVGhlIG1hcGxlIGJpZyBub2RlDQor ICogUmV0dXJuOiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4NCisgKi8NCitzdGF0aWMgaW50 IG1hc19zcGxpdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpi X25vZGUpDQorew0KKw0KKwlzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSBtYXN0Ow0KKwlpbnQg aGVpZ2h0ID0gMDsNCisJdW5zaWduZWQgY2hhciBtaWRfc3BsaXQsIHNwbGl0ID0gMDsNCisNCisJ LyoNCisJICogU3BsaXR0aW5nIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgZnJvbSBhbnkgb3RoZXIg Qi10cmVlOyB0aGUgTWFwbGUNCisJICogVHJlZSBzcGxpdHMgdXB3YXJkcy4gIFNwbGl0dGluZyB1 cCBtZWFucyB0aGF0IHRoZSBzcGxpdCBvcGVyYXRpb24NCisJICogb2NjdXJzIHdoZW4gdGhlIHdh bGsgb2YgdGhlIHRyZWUgaGl0cyB0aGUgbGVhdmVzIGFuZCBub3Qgb24gdGhlIHdheQ0KKwkgKiBk b3duLiAgVGhlIHJlYXNvbiBmb3Igc3BsaXR0aW5nIHVwIGlzIHRoYXQgaXQgaXMgaW1wb3NzaWJs ZSB0byBrbm93DQorCSAqIGhvdyBtdWNoIHNwYWNlIHdpbGwgYmUgbmVlZGVkIHVudGlsIHRoZSBs ZWFmIGlzIChvciBsZWF2ZXMgYXJlKQ0KKwkgKiByZWFjaGVkLiAgU2luY2Ugb3ZlcndyaXRpbmcg ZGF0YSBpcyBhbGxvd2VkIGFuZCBhIHJhbmdlIGNvdWxkDQorCSAqIG92ZXJ3cml0ZSBtb3JlIHRo YW4gb25lIHJhbmdlIG9yIHJlc3VsdCBpbiBjaGFuZ2luZyBvbmUgZW50cnkgaW50byAzDQorCSAq IGVudHJpZXMsIGl0IGlzIGltcG9zc2libGUgdG8ga25vdyBpZiBhIHNwbGl0IGlzIHJlcXVpcmVk IHVudGlsIHRoZQ0KKwkgKiBkYXRhIGlzIGV4YW1pbmVkLg0KKwkgKg0KKwkgKiBTcGxpdHRpbmcg aXMgYSBiYWxhbmNpbmcgYWN0IGJldHdlZW4ga2VlcGluZyBhbGxvY2F0aW9ucyB0byBhIG1pbmlt dW0NCisJICogYW5kIGF2b2lkaW5nIGEgJ2ppdHRlcicgZXZlbnQgd2hlcmUgYSB0cmVlIGlzIGV4 cGFuZGVkIHRvIG1ha2Ugcm9vbQ0KKwkgKiBmb3IgYW4gZW50cnkgZm9sbG93ZWQgYnkgYSBjb250 cmFjdGlvbiB3aGVuIHRoZSBlbnRyeSBpcyByZW1vdmVkLiAgVG8NCisJICogYWNjb21wbGlzaCB0 aGUgYmFsYW5jZSwgdGhlcmUgYXJlIGVtcHR5IHNsb3RzIHJlbWFpbmluZyBpbiBib3RoIGxlZnQN CisJICogYW5kIHJpZ2h0IG5vZGVzIGFmdGVyIGEgc3BsaXQuDQorCSAqLw0KKwlNQV9TVEFURShs X21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShyX21h cywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShwcmV2X2xf bWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1BX1NUQVRFKHByZXZf cl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJTUFfVE9QSUFSWSht YXQsIG1hcy0+dHJlZSk7DQorDQorCXRyYWNlX21hX29wKF9fZnVuY19fLCBtYXMpOw0KKwltYXMt PmRlcHRoID0gbWFzX210X2hlaWdodChtYXMpOw0KKwkvKiBBbGxvY2F0aW9uIGZhaWx1cmVzIHdp bGwgaGFwcGVuIGVhcmx5LiAqLw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEgKyBtYXMtPmRlcHRo ICogMik7DQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzdC5s ID0gJmxfbWFzOw0KKwltYXN0LnIgPSAmcl9tYXM7DQorCW1hc3Qub3JpZ19sID0gJnByZXZfbF9t YXM7DQorCW1hc3Qub3JpZ19yID0gJnByZXZfcl9tYXM7DQorCW1hc3QuZnJlZSA9ICZtYXQ7DQor CW1hc3QuYm4gPSBiX25vZGU7DQorDQorCXdoaWxlIChoZWlnaHQrKyA8PSBtYXMtPmRlcHRoKSB7 DQorCQlpZiAobXRfc2xvdHNbYl9ub2RlLT50eXBlXSA+IGJfbm9kZS0+Yl9lbmQpIHsNCisJCQlt YXNfc3BsaXRfZmluYWxfbm9kZSgmbWFzdCwgbWFzLCBoZWlnaHQpOw0KKwkJCWJyZWFrOw0KKwkJ fQ0KKw0KKwkJbF9tYXMgPSByX21hcyA9ICptYXM7DQorCQlsX21hcy5ub2RlID0gbWFzX25ld19t YV9ub2RlKG1hcywgYl9ub2RlKTsNCisJCXJfbWFzLm5vZGUgPSBtYXNfbmV3X21hX25vZGUobWFz LCBiX25vZGUpOw0KKwkJLyoNCisJCSAqIEFub3RoZXIgd2F5IHRoYXQgJ2ppdHRlcicgaXMgYXZv aWRlZCBpcyB0byB0ZXJtaW5hdGUgYSBzcGxpdCB1cCBlYXJseSBpZiB0aGUNCisJCSAqIGxlZnQg b3IgcmlnaHQgbm9kZSBoYXMgc3BhY2UgdG8gc3BhcmUuICBUaGlzIGlzIHJlZmVycmVkIHRvIGFz ICJwdXNoaW5nIGxlZnQiDQorCQkgKiBvciAicHVzaGluZyByaWdodCIgYW5kIGlzIHNpbWlsYXIg dG8gdGhlIEIqIHRyZWUsIGV4Y2VwdCB0aGUgbm9kZXMgbGVmdCBvcg0KKwkJICogcmlnaHQgY2Fu IHJhcmVseSBiZSByZXVzZWQgZHVlIHRvIFJDVSwgYnV0IHRoZSByaXBwbGUgdXB3YXJkcyBpcyBo YWx0ZWQgd2hpY2gNCisJCSAqIGlzIGEgc2lnbmlmaWNhbnQgc2F2aW5ncy4NCisJCSAqLw0KKwkJ LyogVHJ5IHRvIHB1c2ggbGVmdC4gKi8NCisJCWlmIChtYXNfcHVzaF9kYXRhKG1hcywgaGVpZ2h0 LCAmbWFzdCwgdHJ1ZSkpDQorCQkJYnJlYWs7DQorDQorCQkvKiBUcnkgdG8gcHVzaCByaWdodC4g Ki8NCisJCWlmIChtYXNfcHVzaF9kYXRhKG1hcywgaGVpZ2h0LCAmbWFzdCwgZmFsc2UpKQ0KKwkJ CWJyZWFrOw0KKw0KKwkJc3BsaXQgPSBtYWJfY2FsY19zcGxpdChtYXMsIGJfbm9kZSwgJm1pZF9z cGxpdCwgcHJldl9sX21hcy5taW4pOw0KKwkJbWFzdF9zcGxpdF9kYXRhKCZtYXN0LCBtYXMsIHNw bGl0KTsNCisJCS8qDQorCQkgKiBVc3VhbGx5IGNvcnJlY3QsIG1hYl9tYXNfY3AgaW4gdGhlIGFi b3ZlIGNhbGwgb3ZlcndyaXRlcw0KKwkJICogci0+bWF4Lg0KKwkJICovDQorCQltYXN0LnItPm1h eCA9IG1hcy0+bWF4Ow0KKwkJbWFzdF9maWxsX2Jub2RlKCZtYXN0LCBtYXMsIDEpOw0KKwkJcHJl dl9sX21hcyA9ICptYXN0Lmw7DQorCQlwcmV2X3JfbWFzID0gKm1hc3QucjsNCisJfQ0KKw0KKwkv KiBTZXQgdGhlIG9yaWdpbmFsIG5vZGUgYXMgZGVhZCAqLw0KKwltYXRfYWRkKG1hc3QuZnJlZSwg bWFzLT5ub2RlKTsNCisJbWFzLT5ub2RlID0gbF9tYXMubm9kZTsNCisJbWFzX3dtYl9yZXBsYWNl KG1hcywgbWFzdC5mcmVlLCBOVUxMKTsNCisJbXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwlyZXR1 cm4gMTsNCit9DQorDQorLyoNCisgKiBtYXNfcmV1c2Vfbm9kZSgpIC0gUmV1c2UgdGhlIG5vZGUg dG8gc3RvcmUgdGhlIGRhdGEuDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQor ICogQGJuOiBUaGUgbWFwbGUgYmlnIG5vZGUNCisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBkYXRh Lg0KKyAqDQorICogV2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIGluIFJDVSBtb2RlLg0KKyAqDQor ICogUmV0dXJuOiBUcnVlIGlmIG5vZGUgd2FzIHJldXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfcmV1c2Vfbm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUg KndyX21hcywNCisJCQkgIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYm4sIHVuc2lnbmVkIGNoYXIg ZW5kKQ0KK3sNCisJLyogTmVlZCB0byBiZSByY3Ugc2FmZS4gKi8NCisJaWYgKG10X2luX3JjdSh3 cl9tYXMtPm1hcy0+dHJlZSkpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmIChlbmQgPiBibi0+ Yl9lbmQpIHsNCisJCQlpbnQgY2xlYXIgPSBtdF9zbG90c1t3cl9tYXMtPnR5cGVdIC0gYm4tPmJf ZW5kOw0KKwkJCW1lbXNldCh3cl9tYXMtPnNsb3RzICsgYm4tPmJfZW5kLCAwLA0KKwkJCSAgICAg ICBzaXplb2Yodm9pZCAqKSAqIGNsZWFyLS0pOw0KKwkJCW1lbXNldCh3cl9tYXMtPnBpdm90cyAr IGJuLT5iX2VuZCwgMCwNCisJCQkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBjbGVhcik7DQorCX0N CisJbWFiX21hc19jcChibiwgMCwgYm4tPmJfZW5kLCB3cl9tYXMtPm1hcywgZmFsc2UpOw0KKwly ZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXNfY29tbWl0X2Jfbm9kZSgpIC0gQ29tbWl0 IHRoZSBiaWcgbm9kZSBpbnRvIHRoZSB0cmVlLg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0 ZSBzdGF0ZQ0KKyAqIEBiX25vZGU6IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6IFRoZSBl bmQgb2YgdGhlIGRhdGEuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX2NvbW1pdF9iX25v ZGUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMsDQorCQkJICAgIHN0cnVjdCBtYXBsZV9iaWdf bm9kZSAqYl9ub2RlLCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlOw0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kID0gYl9ub2RlLT5iX2VuZDsNCisJZW51bSBt YXBsZV90eXBlIGJfdHlwZSA9IGJfbm9kZS0+dHlwZTsNCisNCisJaWYgKChiX2VuZCA8IG10X21p bl9zbG90c1tiX3R5cGVdKSAmJg0KKwkgICAgKCFtdGVfaXNfcm9vdCh3cl9tYXMtPm1hcy0+bm9k ZSkpICYmDQorCSAgICAobWFzX210X2hlaWdodCh3cl9tYXMtPm1hcykgPiAxKSkNCisJCXJldHVy biBtYXNfcmViYWxhbmNlKHdyX21hcy0+bWFzLCBiX25vZGUpOw0KKw0KKwlpZiAoYl9lbmQgPj0g bXRfc2xvdHNbYl90eXBlXSkNCisJCXJldHVybiBtYXNfc3BsaXQod3JfbWFzLT5tYXMsIGJfbm9k ZSk7DQorDQorCWlmIChtYXNfcmV1c2Vfbm9kZSh3cl9tYXMsIGJfbm9kZSwgZW5kKSkNCisJCWdv dG8gcmV1c2Vfbm9kZTsNCisNCisJbWFzX25vZGVfY291bnQod3JfbWFzLT5tYXMsIDEpOw0KKwlp ZiAobWFzX2lzX2Vycih3cl9tYXMtPm1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbm9kZSA9IG1h c19wb3Bfbm9kZSh3cl9tYXMtPm1hcyk7DQorCW5vZGUtPnBhcmVudCA9IG1hc19tbih3cl9tYXMt Pm1hcyktPnBhcmVudDsNCisJd3JfbWFzLT5tYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5vZGUsIGJf dHlwZSk7DQorCW1hYl9tYXNfY3AoYl9ub2RlLCAwLCBiX2VuZCwgd3JfbWFzLT5tYXMsIHRydWUp Ow0KKw0KKwltYXNfcmVwbGFjZSh3cl9tYXMtPm1hcywgZmFsc2UpOw0KK3JldXNlX25vZGU6DQor CW1hc191cGRhdGVfZ2FwKHdyX21hcy0+bWFzKTsNCisJcmV0dXJuIDE7DQorfQ0KKw0KKy8qDQor ICogbWFzX3Jvb3RfZXhwYW5kKCkgLSBFeHBhbmQgYSByb290IHRvIGEgbm9kZQ0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlIGludG8gdGhl IHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfcm9vdF9leHBhbmQoc3RydWN0IG1h X3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJdm9pZCAqY29udGVudHMgPSBtYXNfcm9v dF9sb2NrZWQobWFzKTsNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtYXBsZV9sZWFmXzY0Ow0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNp Z25lZCBsb25nICpwaXZvdHM7DQorCWludCBzbG90ID0gMDsNCisNCisJbWFzX25vZGVfY291bnQo bWFzLCAxKTsNCisJaWYgKHVubGlrZWx5KG1hc19pc19lcnIobWFzKSkpDQorCQlyZXR1cm4gMDsN CisNCisJbm9kZSA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9k ZSwgdHlwZSk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCW5vZGUtPnBhcmVu dCA9IG1hX3BhcmVudF9wdHIoDQorCQkgICAgICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwg TUFfUk9PVF9QQVJFTlQpKTsNCisJbWFzLT5ub2RlID0gbXRfbWtfbm9kZShub2RlLCB0eXBlKTsN CisNCisJaWYgKG1hcy0+aW5kZXgpIHsNCisJCWlmIChjb250ZW50cykgew0KKwkJCXJjdV9hc3Np Z25fcG9pbnRlcihzbG90c1tzbG90XSwgY29udGVudHMpOw0KKwkJCWlmIChsaWtlbHkobWFzLT5p bmRleCA+IDEpKQ0KKwkJCQlzbG90Kys7DQorCQl9DQorCQlwaXZvdHNbc2xvdCsrXSA9IG1hcy0+ aW5kZXggLSAxOw0KKwl9DQorDQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tzbG90XSwgZW50 cnkpOw0KKwltYXMtPm9mZnNldCA9IHNsb3Q7DQorCXBpdm90c1tzbG90XSA9IG1hcy0+bGFzdDsN CisJaWYgKG1hcy0+bGFzdCAhPSBVTE9OR19NQVgpDQorCQlzbG90Kys7DQorCW1hcy0+ZGVwdGgg PSAxOw0KKwltYXNfc2V0X2hlaWdodChtYXMpOw0KKw0KKwkvKiBzd2FwIHRoZSBuZXcgcm9vdCBp bnRvIHRoZSB0cmVlICovDQorCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3Qs IG10ZV9ta19yb290KG1hcy0+bm9kZSkpOw0KKwltYV9zZXRfbWV0YShub2RlLCBtYXBsZV9sZWFm XzY0LCAwLCBzbG90KTsNCisJcmV0dXJuIHNsb3Q7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtYXNfc3RvcmVfcm9vdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0K KwlpZiAobGlrZWx5KChtYXMtPmxhc3QgIT0gMCkgfHwgKG1hcy0+aW5kZXggIT0gMCkpKQ0KKwkJ bWFzX3Jvb3RfZXhwYW5kKG1hcywgZW50cnkpOw0KKwllbHNlIGlmICgoKHVuc2lnbmVkIGxvbmcp IChlbnRyeSkgJiAzKSA9PSAyKQ0KKwkJbWFzX3Jvb3RfZXhwYW5kKG1hcywgZW50cnkpOw0KKwll bHNlIHsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3QsIGVudHJ5KTsN CisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19pc19z cGFuX3dyKCkgLSBDaGVjayBpZiB0aGUgd3JpdGUgbmVlZHMgdG8gYmUgdHJlYXRlZCBhcyBhIHdy aXRlIHRoYXQNCisgKiBzcGFucyB0aGUgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAcGl2OiBUaGUgcGl2b3QgdmFsdWUgYmVpbmcgd3JpdHRlbg0KKyAqIEB0eXBlOiBUaGUg bWFwbGUgbm9kZSB0eXBlDQorICogQGVudHJ5OiBUaGUgZGF0YSB0byB3cml0ZQ0KKyAqDQorICog U3Bhbm5pbmcgd3JpdGVzIGFyZSB3cml0ZXMgdGhhdCBzdGFydCBpbiBvbmUgbm9kZSBhbmQgZW5k IGluIGFub3RoZXIgT1IgaWYNCisgKiB0aGUgd3JpdGUgb2YgYSAlTlVMTCB3aWxsIGNhdXNlIHRo ZSBub2RlIHRvIGVuZCB3aXRoIGEgJU5VTEwuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgdGhp cyBpcyBhIHNwYW5uaW5nIHdyaXRlLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGJv b2wgbWFzX2lzX3NwYW5fd3Ioc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl1bnNp Z25lZCBsb25nIG1heDsNCisJdW5zaWduZWQgbG9uZyBsYXN0ID0gd3JfbWFzLT5tYXMtPmxhc3Q7 DQorCXVuc2lnbmVkIGxvbmcgcGl2ID0gd3JfbWFzLT5yX21heDsNCisJZW51bSBtYXBsZV90eXBl IHR5cGUgPSB3cl9tYXMtPnR5cGU7DQorCXZvaWQgKmVudHJ5ID0gd3JfbWFzLT5lbnRyeTsNCisN CisJLyogQ29udGFpbmVkIGluIHRoaXMgcGl2b3QgKi8NCisJaWYgKHBpdiA+IGxhc3QpDQorCQly ZXR1cm4gZmFsc2U7DQorDQorCW1heCA9IHdyX21hcy0+bWFzLT5tYXg7DQorCWlmICh1bmxpa2Vs eShtYV9pc19sZWFmKHR5cGUpKSkgew0KKwkJLyogRml0cyBpbiB0aGUgbm9kZSwgYnV0IG1heSBz cGFuIHNsb3RzLiAqLw0KKwkJaWYgKGxhc3QgPCBtYXgpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0K KwkJLyogV3JpdGVzIHRvIHRoZSBlbmQgb2YgdGhlIG5vZGUgYnV0IG5vdCBudWxsLiAqLw0KKwkJ aWYgKChsYXN0ID09IG1heCkgJiYgZW50cnkpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJLyoN CisJCSAqIFdyaXRpbmcgVUxPTkdfTUFYIGlzIG5vdCBhIHNwYW5uaW5nIHdyaXRlIHJlZ2FyZGxl c3Mgb2YgdGhlDQorCQkgKiB2YWx1ZSBiZWluZyB3cml0dGVuIGFzIGxvbmcgYXMgdGhlIHJhbmdl IGZpdHMgaW4gdGhlIG5vZGUuDQorCQkgKi8NCisJCWlmICgobGFzdCA9PSBVTE9OR19NQVgpICYm IChsYXN0ID09IG1heCkpDQorCQkJcmV0dXJuIGZhbHNlOw0KKwl9IGVsc2UgaWYgKHBpdiA9PSBs YXN0KSB7DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJLyogRGV0ZWN0 IHNwYW5uaW5nIHN0b3JlIHdyIHdhbGsgKi8NCisJCWlmIChsYXN0ID09IFVMT05HX01BWCkNCisJ CQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIHdyX21h cy0+bWFzLCBwaXYsIGVudHJ5KTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYXNfd3Jfd2Fsa19kZXNjZW5kKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFz KQ0KK3sNCisJd3JfbWFzLT5tYXMtPmRlcHRoKys7DQorCXdyX21hcy0+dHlwZSA9IG10ZV9ub2Rl X3R5cGUod3JfbWFzLT5tYXMtPm5vZGUpOw0KKwltYXNfd3Jfbm9kZV93YWxrKHdyX21hcyk7DQor CXdyX21hcy0+c2xvdHMgPSBtYV9zbG90cyh3cl9tYXMtPm5vZGUsIHdyX21hcy0+dHlwZSk7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3Jfd2Fsa190cmF2ZXJzZShzdHJ1Y3QgbWFf d3Jfc3RhdGUgKndyX21hcykNCit7DQorCXdyX21hcy0+bWFzLT5tYXggPSB3cl9tYXMtPnJfbWF4 Ow0KKwl3cl9tYXMtPm1hcy0+bWluID0gd3JfbWFzLT5yX21pbjsNCisJd3JfbWFzLT5tYXMtPm5v ZGUgPSB3cl9tYXMtPmNvbnRlbnQ7DQorCXdyX21hcy0+bWFzLT5vZmZzZXQgPSAwOw0KK30NCisv Kg0KKyAqIG1hc193cl93YWxrKCkgLSBXYWxrIHRoZSB0cmVlIGZvciBhIHdyaXRlLg0KKyAqIEB3 cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqDQorICogVXNlcyBtYXNfc2xvdF9sb2Nr ZWQoKSBhbmQgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBkZWFkIG5vZGVzLg0KKyAqDQor ICogUmV0dXJuOiBUcnVlIGlmIGl0J3MgY29udGFpbmVkIGluIGEgbm9kZSwgZmFsc2Ugb24gc3Bh bm5pbmcgd3JpdGUuDQorICovDQorc3RhdGljIGJvb2wgbWFzX3dyX3dhbGsoc3RydWN0IG1hX3dy X3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFz Ow0KKw0KKwl3aGlsZSAodHJ1ZSkgew0KKwkJbWFzX3dyX3dhbGtfZGVzY2VuZCh3cl9tYXMpOw0K KwkJaWYgKHVubGlrZWx5KG1hc19pc19zcGFuX3dyKHdyX21hcykpKQ0KKwkJCXJldHVybiBmYWxz ZTsNCisNCisJCXdyX21hcy0+Y29udGVudCA9IG1hc19zbG90X2xvY2tlZChtYXMsIHdyX21hcy0+ c2xvdHMsDQorCQkJCQkJICBtYXMtPm9mZnNldCk7DQorCQlpZiAobWFfaXNfbGVhZih3cl9tYXMt PnR5cGUpKQ0KKwkJCXJldHVybiB0cnVlOw0KKw0KKwkJbWFzX3dyX3dhbGtfdHJhdmVyc2Uod3Jf bWFzKTsNCisJfQ0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGJvb2wgbWFzX3dy X3dhbGtfaW5kZXgoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFf c3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwl3aGlsZSAodHJ1ZSkgew0KKwkJbWFzX3dy X3dhbGtfZGVzY2VuZCh3cl9tYXMpOw0KKwkJd3JfbWFzLT5jb250ZW50ID0gbWFzX3Nsb3RfbG9j a2VkKG1hcywgd3JfbWFzLT5zbG90cywNCisJCQkJCQkgIG1hcy0+b2Zmc2V0KTsNCisJCWlmICht YV9pc19sZWFmKHdyX21hcy0+dHlwZSkpDQorCQkJcmV0dXJuIHRydWU7DQorCQltYXNfd3Jfd2Fs a190cmF2ZXJzZSh3cl9tYXMpOw0KKw0KKwl9DQorCXJldHVybiB0cnVlOw0KK30NCisvKg0KKyAq IG1hc19leHRlbmRfc3Bhbm5pbmdfbnVsbCgpIC0gRXh0ZW5kIGEgc3RvcmUgb2YgYSAlTlVMTCB0 byBpbmNsdWRlIHN1cnJvdW5kaW5nICVOVUxMcy4NCisgKiBAbF93cl9tYXM6IFRoZSBsZWZ0IG1h cGxlIHdyaXRlIHN0YXRlDQorICogQHJfd3JfbWFzOiBUaGUgcmlnaHQgbWFwbGUgd3JpdGUgc3Rh dGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2V4dGVuZF9zcGFubmluZ19udWxsKHN0 cnVjdCBtYV93cl9zdGF0ZSAqbF93cl9tYXMsDQorCQkJCQkgICAgc3RydWN0IG1hX3dyX3N0YXRl ICpyX3dyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqcl9tYXMgPSByX3dyX21hcy0+bWFz Ow0KKwlzdHJ1Y3QgbWFfc3RhdGUgKmxfbWFzID0gbF93cl9tYXMtPm1hczsNCisJdW5zaWduZWQg Y2hhciBsX3Nsb3Q7DQorDQorCWxfc2xvdCA9IGxfbWFzLT5vZmZzZXQ7DQorCWlmICghbF93cl9t YXMtPmNvbnRlbnQpDQorCQlsX21hcy0+aW5kZXggPSBsX3dyX21hcy0+cl9taW47DQorDQorCWlm ICgobF9tYXMtPmluZGV4ID09IGxfd3JfbWFzLT5yX21pbikgJiYNCisJCSAobF9zbG90ICYmDQor CQkgICFtYXNfc2xvdF9sb2NrZWQobF9tYXMsIGxfd3JfbWFzLT5zbG90cywgbF9zbG90IC0gMSkp KSB7DQorCQlpZiAobF9zbG90ID4gMSkNCisJCQlsX21hcy0+aW5kZXggPSBsX3dyX21hcy0+cGl2 b3RzW2xfc2xvdCAtIDJdICsgMTsNCisJCWVsc2UNCisJCQlsX21hcy0+aW5kZXggPSBsX21hcy0+ bWluOw0KKw0KKwkJbF9tYXMtPm9mZnNldCA9IGxfc2xvdCAtIDE7DQorCX0NCisNCisJaWYgKCFy X3dyX21hcy0+Y29udGVudCkgew0KKwkJaWYgKHJfbWFzLT5sYXN0IDwgcl93cl9tYXMtPnJfbWF4 KQ0KKwkJCXJfbWFzLT5sYXN0ID0gcl93cl9tYXMtPnJfbWF4Ow0KKwkJcl9tYXMtPm9mZnNldCsr Ow0KKwl9IGVsc2UgaWYgKChyX21hcy0+bGFzdCA9PSByX3dyX21hcy0+cl9tYXgpICYmDQorCSAg ICAocl9tYXMtPmxhc3QgPCByX21hcy0+bWF4KSAmJg0KKwkgICAgIW1hc19zbG90X2xvY2tlZChy X21hcywgcl93cl9tYXMtPnNsb3RzLCByX21hcy0+b2Zmc2V0ICsgMSkpIHsNCisJCXJfbWFzLT5s YXN0ID0gbWFzX3NhZmVfcGl2b3Qocl9tYXMsIHJfd3JfbWFzLT5waXZvdHMsDQorCQkJCQkgICAg IHJfd3JfbWFzLT50eXBlLCByX21hcy0+b2Zmc2V0ICsgMSk7DQorCQlyX21hcy0+b2Zmc2V0Kys7 DQorCX0NCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfc3RhdGVfd2FsayhzdHJ1Y3Qg bWFfc3RhdGUgKm1hcykNCit7DQorCXZvaWQgKmVudHJ5Ow0KKw0KKwllbnRyeSA9IG1hc19zdGFy dChtYXMpOw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlp ZiAobWFzX2lzX3B0cihtYXMpKQ0KKwkJcmV0dXJuIGVudHJ5Ow0KKw0KKwlyZXR1cm4gbXRyZWVf cmFuZ2Vfd2FsayhtYXMpOw0KK30NCisNCisvKg0KKyAqIG10cmVlX2xvb2t1cF93YWxrKCkgLSBJ bnRlcm5hbCBxdWljayBsb29rdXAgdGhhdCBkb2VzIG5vdCBrZWVwIG1hcGxlIHN0YXRlIHVwDQor ICogdG8gZGF0ZS4NCisgKg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIE5v dGU6IExlYXZlcyBtYXMgaW4gdW5kZXNpcmFibGUgc3RhdGUuDQorICogUmV0dXJuOiBUaGUgZW50 cnkgZm9yIEBtYXMtPmluZGV4IG9yICVOVUxMIG9uIGRlYWQgbm9kZS4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgKm10cmVlX2xvb2t1cF93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsNCisJZW51 bSBtYXBsZV90eXBlIHR5cGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgY2hh ciBlbmQ7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0KKw0KKwluZXh0ID0gbWFzLT5ub2RlOw0KKwlt YXggPSBVTE9OR19NQVg7DQorCWRvIHsNCisJCW9mZnNldCA9IDA7DQorCQlub2RlID0gbXRlX3Rv X25vZGUobmV4dCk7DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90cyA9 IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJCWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUs IHBpdm90cywgbWF4KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJ CWdvdG8gZGVhZF9ub2RlOw0KKw0KKwkJaWYgKHBpdm90c1tvZmZzZXRdID49IG1hcy0+aW5kZXgp DQorCQkJZ290byBuZXh0Ow0KKw0KKwkJZG8gew0KKwkJCW9mZnNldCsrOw0KKwkJfSB3aGlsZSgo b2Zmc2V0IDwgZW5kKSAmJiAocGl2b3RzW29mZnNldF0gPCBtYXMtPmluZGV4KSk7DQorDQorCQlp ZiAobGlrZWx5KG9mZnNldCA+IGVuZCkpDQorCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorDQor bmV4dDoNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xv dChtYXMtPnRyZWUsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9k ZShub2RlKSkpDQorCQkJZ290byBkZWFkX25vZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5 cGUpKTsNCisNCisJcmV0dXJuICh2b2lkICopIG5leHQ7DQorDQorZGVhZF9ub2RlOg0KKwltYXNf cmVzZXQobWFzKTsNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19yb290 KCkgLSBDcmVhdGUgYSBuZXcgcm9vdCBub2RlIHRoYXQgb25seSBjb250YWlucyB0aGUgZW50cnkg cGFzc2VkDQorICogaW4uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBU aGUgZW50cnkgdG8gc3RvcmUuDQorICoNCisgKiBPbmx5IHZhbGlkIHdoZW4gdGhlIGluZGV4ID09 IDAgYW5kIHRoZSBsYXN0ID09IFVMT05HX01BWA0KKyAqDQorICogUmV0dXJuIDAgb24gZXJyb3Is IDEgb24gc3VjY2Vzcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfbmV3X3Jvb3Qoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpyb290ID0gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0g bWFwbGVfbGVhZl82NDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3Ug KipzbG90czsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKw0KKwlpZiAoIWVudHJ5ICYmICFt YXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpIHsNCisJCW1hcy0+ZGVwdGggPSAw Ow0KKwkJbWFzX3NldF9oZWlnaHQobWFzKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRy ZWUtPm1hX3Jvb3QsIGVudHJ5KTsNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCWdvdG8g ZG9uZTsNCisJfQ0KKw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwlpZiAobWFzX2lzX2Vy cihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW5vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJ cGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUs IHR5cGUpOw0KKwlub2RlLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJICAgICAgKCh1bnNp Z25lZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCW1hcy0+bm9kZSA9IG10 X21rX25vZGUobm9kZSwgdHlwZSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1swXSwgZW50 cnkpOw0KKwlwaXZvdHNbMF0gPSBtYXMtPmxhc3Q7DQorCW1hcy0+ZGVwdGggPSAxOw0KKwltYXNf c2V0X2hlaWdodChtYXMpOw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290 LCBtdGVfbWtfcm9vdChtYXMtPm5vZGUpKTsNCisNCitkb25lOg0KKwlpZiAoeGFfaXNfbm9kZShy b290KSkNCisJCW10ZV9kZXN0cm95X3dhbGsocm9vdCwgbWFzLT50cmVlKTsNCisNCisJcmV0dXJu IDE7DQorfQ0KKy8qDQorICogbWFzX3NwYW5uaW5nX3N0b3JlKCkgLSBDcmVhdGUgYSBzdWJ0cmVl IHdpdGggdGhlIHN0b3JlIG9wZXJhdGlvbiBjb21wbGV0ZWQNCisgKiBhbmQgbmV3IG5vZGVzIHdo ZXJlIG5lY2Vzc2FyeSwgdGhlbiBwbGFjZSB0aGUgc3ViLXRyZWUgaW4gdGhlIGFjdHVhbCB0cmVl Lg0KKyAqIE5vdGUgdGhhdCBtYXMgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIG5vZGUgd2hp Y2ggY2F1c2VkIHRoZSBzdG9yZSB0bw0KKyAqIHNwYW4uDQorICogQHdyX21hczogVGhlIG1hcGxl IHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IDAgb24gZXJyb3IsIHBvc2l0aXZlIG9uIHN1 Y2Nlc3MuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHN0 cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3Rh dGUgbWFzdDsNCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlIGJfbm9kZTsNCisJc3RydWN0IG1hX3N0 YXRlICptYXM7DQorCXVuc2lnbmVkIGNoYXIgaGVpZ2h0Ow0KKw0KKwkvKiBMZWZ0IGFuZCBSaWdo dCBzaWRlIG9mIHNwYW5uaW5nIHN0b3JlICovDQorCU1BX1NUQVRFKGxfbWFzLCBOVUxMLCAwLCAw KTsNCisJTUFfU1RBVEUocl9tYXMsIE5VTEwsIDAsIDApOw0KKw0KKwlNQV9XUl9TVEFURShyX3dy X21hcywgJnJfbWFzLCB3cl9tYXMtPmVudHJ5KTsNCisJTUFfV1JfU1RBVEUobF93cl9tYXMsICZs X21hcywgd3JfbWFzLT5lbnRyeSk7DQorDQorCS8qDQorCSAqIEEgc3RvcmUgb3BlcmF0aW9uIHRo YXQgc3BhbnMgbXVsdGlwbGUgbm9kZXMgaXMgY2FsbGVkIGEgc3Bhbm5pbmcNCisJICogc3RvcmUg YW5kIGlzIGhhbmRsZWQgZWFybHkgaW4gdGhlIHN0b3JlIGNhbGwgc3RhY2sgYnkgdGhlIGZ1bmN0 aW9uDQorCSAqIG1hc19pc19zcGFuX3dyKCkuICBXaGVuIGEgc3Bhbm5pbmcgc3RvcmUgaXMgaWRl bnRpZmllZCwgdGhlIG1hcGxlDQorCSAqIHN0YXRlIGlzIGR1cGxpY2F0ZWQuICBUaGUgZmlyc3Qg bWFwbGUgc3RhdGUgd2Fsa3MgdGhlIGxlZnQgdHJlZSBwYXRoDQorCSAqIHRvIGBgaW5kZXhgYCwg dGhlIGR1cGxpY2F0ZSB3YWxrcyB0aGUgcmlnaHQgdHJlZSBwYXRoIHRvIGBgbGFzdGBgLg0KKwkg KiBUaGUgZGF0YSBpbiB0aGUgdHdvIG5vZGVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIG5v ZGUsIHR3byBub2RlcywNCisJICogb3IgcG9zc2libHkgdGhyZWUgbm9kZXMgKHNlZSB0aGUgMy13 YXkgc3BsaXQgYWJvdmUpLiAgQSBgYE5VTExgYA0KKwkgKiB3cml0dGVuIHRvIHRoZSBsYXN0IGVu dHJ5IG9mIGEgbm9kZSBpcyBjb25zaWRlcmVkIGEgc3Bhbm5pbmcgc3RvcmUgYXMNCisJICogYSBy ZWJhbGFuY2UgaXMgcmVxdWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgYW5kIGFu IG92ZXJmbG93DQorCSAqIG9mIGRhdGEgbWF5IGhhcHBlbi4NCisJICovDQorCW1hcyA9IHdyX21h cy0+bWFzOw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywgbWFzKTsNCisNCisJaWYgKHVubGlrZWx5 KCFtYXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpKQ0KKwkJcmV0dXJuIG1hc19u ZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwkvKg0KKwkgKiBOb2RlIHJlYmFsYW5jaW5n IG1heSBvY2N1ciBkdWUgdG8gdGhpcyBzdG9yZSwgc28gdGhlcmUgbWF5IGJlIHR3byBuZXcNCisJ ICogZW50cmllcyBwZXIgbGV2ZWwgcGx1cyBhIG5ldyByb290Lg0KKwkgKi8NCisJaGVpZ2h0ID0g bWFzX210X2hlaWdodChtYXMpOw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEgKyBoZWlnaHQgKiAz KTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwkvKg0KKwkgKiBT ZXQgdXAgcmlnaHQgc2lkZS4gIE5lZWQgdG8gZ2V0IHRvIHRoZSBuZXh0IG9mZnNldCBhZnRlciB0 aGUgc3Bhbm5pbmcNCisJICogc3RvcmUgdG8gZW5zdXJlIGl0J3Mgbm90IE5VTEwgYW5kIHRvIGNv bWJpbmUgYm90aCB0aGUgbmV4dCBub2RlIGFuZA0KKwkgKiB0aGUgbm9kZSB3aXRoIHRoZSBzdGFy dCB0b2dldGhlci4NCisJICovDQorCXJfbWFzID0gKm1hczsNCisJLyogQXZvaWQgb3ZlcmZsb3cs IHdhbGsgdG8gbmV4dCBzbG90IGluIHRoZSB0cmVlLiAqLw0KKwlpZiAocl9tYXMubGFzdCArIDEp DQorCQlyX21hcy5sYXN0Kys7DQorDQorCXJfbWFzLmluZGV4ID0gcl9tYXMubGFzdDsNCisJbWFz X3dyX3dhbGtfaW5kZXgoJnJfd3JfbWFzKTsNCisJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4ID0g bWFzLT5sYXN0Ow0KKw0KKwkvKiBTZXQgdXAgbGVmdCBzaWRlLiAqLw0KKwlsX21hcyA9ICptYXM7 DQorCW1hc193cl93YWxrX2luZGV4KCZsX3dyX21hcyk7DQorDQorCWlmICghd3JfbWFzLT5lbnRy eSkgew0KKwkJbWFzX2V4dGVuZF9zcGFubmluZ19udWxsKCZsX3dyX21hcywgJnJfd3JfbWFzKTsN CisJCW1hcy0+b2Zmc2V0ID0gbF9tYXMub2Zmc2V0Ow0KKwkJbWFzLT5pbmRleCA9IGxfbWFzLmlu ZGV4Ow0KKwkJbWFzLT5sYXN0ID0gbF9tYXMubGFzdCA9IHJfbWFzLmxhc3Q7DQorCX0NCisNCisJ bWVtc2V0KCZiX25vZGUsIDAsIHNpemVvZihzdHJ1Y3QgbWFwbGVfYmlnX25vZGUpKTsNCisJLyog Q29weSBsX21hcyBhbmQgc3RvcmUgdGhlIHZhbHVlIGluIGJfbm9kZS4gKi8NCisJbWFzX3N0b3Jl X2Jfbm9kZSgmbF93cl9tYXMsICZiX25vZGUsIGxfd3JfbWFzLm5vZGVfZW5kKTsNCisJLyogQ29w eSByX21hcyBpbnRvIGJfbm9kZS4gKi8NCisJaWYgKHJfbWFzLm9mZnNldCA8PSByX3dyX21hcy5u b2RlX2VuZCkNCisJCW1hc19tYWJfY3AoJnJfbWFzLCByX21hcy5vZmZzZXQsIHJfd3JfbWFzLm5v ZGVfZW5kLA0KKwkJCSAgICZiX25vZGUsIGJfbm9kZS5iX2VuZCArIDEpOw0KKwkvKiBTdG9wIHNw YW5uaW5nIHNlYXJjaGVzIGJ5IHNlYXJjaGluZyBmb3IganVzdCBpbmRleC4gKi8NCisJbF9tYXMu aW5kZXggPSBsX21hcy5sYXN0ID0gbWFzLT5pbmRleDsNCisNCisJbWFzdC5ibiA9ICZiX25vZGU7 DQorCW1hc3Qub3JpZ19sID0gJmxfbWFzOw0KKwltYXN0Lm9yaWdfciA9ICZyX21hczsNCisJLyog Q29tYmluZSBsX21hcyBhbmQgcl9tYXMgYW5kIHNwbGl0IHRoZW0gdXAgZXZlbmx5IGFnYWluLiAq Lw0KKwlyZXR1cm4gbWFzX3NwYW5uaW5nX3JlYmFsYW5jZShtYXMsICZtYXN0LCBoZWlnaHQgKyAx KTsNCit9DQorDQorLyoNCisgKiBtYXNfd3Jfbm9kZV9zdG9yZSgpIC0gQXR0ZW1wdCB0byBzdG9y ZSB0aGUgdmFsdWUgaW4gYSBub2RlDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRl DQorICoNCisgKiBBdHRlbXB0cyB0byByZXVzZSB0aGUgbm9kZSwgYnV0IG1heSBhbGxvY2F0ZS4N CisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBzdG9yZWQsIGZhbHNlIG90aGVyd2lzZQ0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfd3Jfbm9kZV9zdG9yZShzdHJ1Y3QgbWFfd3Jfc3RhdGUg KndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorCXZv aWQgX19yY3UgKipkc3Rfc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKmRzdF9waXZvdHM7DQorCXVu c2lnbmVkIGNoYXIgZHN0X29mZnNldDsNCisJdW5zaWduZWQgY2hhciBuZXdfZW5kID0gd3JfbWFz LT5ub2RlX2VuZDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgbm9k ZV9zbG90cyA9IG10X3Nsb3RzW3dyX21hcy0+dHlwZV07DQorCXN0cnVjdCBtYXBsZV9ub2RlIHJl dXNlLCAqbmV3bm9kZTsNCisJdW5zaWduZWQgY2hhciBjb3B5X3NpemUsIG1heF9waXYgPSBtdF9w aXZvdHNbd3JfbWFzLT50eXBlXTsNCisJYm9vbCBpbl9yY3UgPSBtdF9pbl9yY3UobWFzLT50cmVl KTsNCisNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCWlmIChtYXMtPmxhc3QgPT0gd3JfbWFz LT5yX21heCkgew0KKwkJLyogcnVucyByaWdodCB0byB0aGUgZW5kIG9mIHRoZSBub2RlICovDQor CQlpZiAobWFzLT5sYXN0ID09IG1hcy0+bWF4KQ0KKwkJCW5ld19lbmQgPSBvZmZzZXQ7DQorCQkv KiBkb24ndCBjb3B5IHRoaXMgb2Zmc2V0ICovDQorCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisJ fSBlbHNlIGlmIChtYXMtPmxhc3QgPCB3cl9tYXMtPnJfbWF4KSB7DQorCQkvKiBuZXcgcmFuZ2Ug ZW5kcyBpbiB0aGlzIHJhbmdlICovDQorCQlpZiAodW5saWtlbHkod3JfbWFzLT5yX21heCA9PSBV TE9OR19NQVgpKQ0KKwkJCW1hc19idWxrX3JlYmFsYW5jZShtYXMsIHdyX21hcy0+bm9kZV9lbmQs IHdyX21hcy0+dHlwZSk7DQorDQorCQluZXdfZW5kKys7DQorCX0gZWxzZSB7DQorCQlpZiAobWFz X3NhZmVfcGl2b3QobWFzLCB3cl9tYXMtPnBpdm90cywgd3JfbWFzLT5vZmZzZXRfZW5kLA0KKwkJ CQkgICB3cl9tYXMtPnR5cGUpID09IG1hcy0+bGFzdCkNCisJCQl3cl9tYXMtPm9mZnNldF9lbmQr KzsNCisNCisJCW5ld19lbmQgLT0gd3JfbWFzLT5vZmZzZXRfZW5kIC0gb2Zmc2V0IC0gMTsNCisJ fQ0KKw0KKwkvKiBuZXcgcmFuZ2Ugc3RhcnRzIHdpdGhpbiBhIHJhbmdlICovDQorCWlmICh3cl9t YXMtPnJfbWluIDwgbWFzLT5pbmRleCkNCisJCW5ld19lbmQrKzsNCisNCisJLyogTm90IGVub3Vn aCByb29tICovDQorCWlmIChuZXdfZW5kID49IG5vZGVfc2xvdHMpDQorCQlyZXR1cm4gZmFsc2U7 DQorDQorCS8qIE5vdCBlbm91Z2ggZGF0YS4gKi8NCisJaWYgKCFtdGVfaXNfcm9vdChtYXMtPm5v ZGUpICYmIChuZXdfZW5kIDw9IG10X21pbl9zbG90c1t3cl9tYXMtPnR5cGVdKSAmJg0KKwkgICAg IShtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRFX0JVTEspKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0K KwkvKiBzZXQgdXAgbm9kZS4gKi8NCisJaWYgKGluX3JjdSkgew0KKwkJbWFzX25vZGVfY291bnQo bWFzLCAxKTsNCisJCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0K KwkJbmV3bm9kZSA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwl9IGVsc2Ugew0KKwkJbWVtc2V0KCZy ZXVzZSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSk7DQorCQluZXdub2RlID0gJnJldXNl Ow0KKwl9DQorDQorCW5ld25vZGUtPnBhcmVudCA9IG1hc19tbihtYXMpLT5wYXJlbnQ7DQorCWRz dF9waXZvdHMgPSBtYV9waXZvdHMobmV3bm9kZSwgd3JfbWFzLT50eXBlKTsNCisJZHN0X3Nsb3Rz ID0gbWFfc2xvdHMobmV3bm9kZSwgd3JfbWFzLT50eXBlKTsNCisJLyogQ29weSBmcm9tIHN0YXJ0 IHRvIGluc2VydCBwb2ludCAqLw0KKwltZW1jcHkoZHN0X3Bpdm90cywgd3JfbWFzLT5waXZvdHMs IHNpemVvZih1bnNpZ25lZCBsb25nKSAqIChvZmZzZXQgKyAxKSk7DQorCW1lbWNweShkc3Rfc2xv dHMsIHdyX21hcy0+c2xvdHMsIHNpemVvZih2b2lkICopICogKG9mZnNldCArIDEpKTsNCisJZHN0 X29mZnNldCA9IG9mZnNldDsNCisNCisJLyogSGFuZGxlIGluc2VydCBvZiBuZXcgcmFuZ2Ugc3Rh cnRpbmcgYWZ0ZXIgb2xkIHJhbmdlICovDQorCWlmICh3cl9tYXMtPnJfbWluIDwgbWFzLT5pbmRl eCkgew0KKwkJbWFzLT5vZmZzZXQrKzsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihkc3Rfc2xvdHNb ZHN0X29mZnNldF0sIHdyX21hcy0+Y29udGVudCk7DQorCQlkc3RfcGl2b3RzW2RzdF9vZmZzZXQr K10gPSBtYXMtPmluZGV4IC0gMTsNCisJfQ0KKw0KKwkvKiBTdG9yZSB0aGUgbmV3IGVudHJ5IGFu ZCByYW5nZSBlbmQuICovDQorCWlmIChkc3Rfb2Zmc2V0IDwgbWF4X3BpdikNCisJCWRzdF9waXZv dHNbZHN0X29mZnNldF0gPSBtYXMtPmxhc3Q7DQorCW1hcy0+b2Zmc2V0ID0gZHN0X29mZnNldDsN CisJcmN1X2Fzc2lnbl9wb2ludGVyKGRzdF9zbG90c1tkc3Rfb2Zmc2V0KytdLCB3cl9tYXMtPmVu dHJ5KTsNCisNCisJLyogdGhpcyByYW5nZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBub2RlLiAq Lw0KKwlpZiAod3JfbWFzLT5vZmZzZXRfZW5kID4gd3JfbWFzLT5ub2RlX2VuZCkNCisJCWdvdG8g ZG9uZTsNCisNCisJLyogQ29weSB0byB0aGUgZW5kIG9mIG5vZGUgaWYgbmVjZXNzYXJ5LiAqLw0K Kwljb3B5X3NpemUgPSB3cl9tYXMtPm5vZGVfZW5kIC0gd3JfbWFzLT5vZmZzZXRfZW5kICsgMTsN CisJbWVtY3B5KGRzdF9zbG90cyArIGRzdF9vZmZzZXQsIHdyX21hcy0+c2xvdHMgKyB3cl9tYXMt Pm9mZnNldF9lbmQsDQorCSAgICAgICBzaXplb2Yodm9pZCAqKSAqIGNvcHlfc2l6ZSk7DQorCWlm IChkc3Rfb2Zmc2V0IDwgbWF4X3Bpdikgew0KKwkJaWYgKGNvcHlfc2l6ZSA+IG1heF9waXYgLSBk c3Rfb2Zmc2V0KQ0KKwkJCWNvcHlfc2l6ZSA9IG1heF9waXYgLSBkc3Rfb2Zmc2V0Ow0KKwkJbWVt Y3B5KGRzdF9waXZvdHMgKyBkc3Rfb2Zmc2V0LCB3cl9tYXMtPnBpdm90cyArIHdyX21hcy0+b2Zm c2V0X2VuZCwNCisJCSAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiBjb3B5X3NpemUpOw0K Kwl9DQorDQorZG9uZToNCisJaWYgKCh3cl9tYXMtPm5vZGVfZW5kID09IG5vZGVfc2xvdHMgLSAx KSAmJiAobmV3X2VuZCA8IG5vZGVfc2xvdHMgLSAxKSkNCisJCWRzdF9waXZvdHNbbmV3X2VuZF0g PSBtYXMtPm1heDsNCisNCisJbWFzX2xlYWZfc2V0X21ldGEobWFzLCBuZXdub2RlLCBkc3RfcGl2 b3RzLCBtYXBsZV9sZWFmXzY0LCBuZXdfZW5kKTsNCisJaWYgKGluX3JjdSkgew0KKwkJbWFzLT5u b2RlID0gbXRfbWtfbm9kZShuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwkJbWFzX3JlcGxhY2Uo bWFzLCBmYWxzZSk7DQorCX0gZWxzZSB7DQorCQltZW1jcHkod3JfbWFzLT5ub2RlLCBuZXdub2Rl LCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJfQ0KKwl0cmFjZV9tYV93cml0ZShfX2Z1 bmNfXywgbWFzLCAwLCB3cl9tYXMtPmVudHJ5KTsNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCisJ cmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX3dyX3Nsb3Rfc3RvcmU6IEF0dGVtcHQg dG8gc3RvcmUgYSB2YWx1ZSBpbiBhIHNsb3QuDQorICogQHdyX21hczogdGhlIG1hcGxlIHdyaXRl IHN0YXRlDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgc3RvcmVkLCBmYWxzZSBvdGhlcndpc2UN CisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3dyX3Nsb3Rfc3RvcmUoc3RydWN0IG1hX3dy X3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFz Ow0KKwl1bnNpZ25lZCBsb25nIGxtYXg7IC8qIExvZ2ljYWwgbWF4LiAqLw0KKwl1bnNpZ25lZCBj aGFyIG9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKw0KKwlpZiAoKHdyX21hcy0+cl9tYXggPiBtYXMt Pmxhc3QpICYmICgod3JfbWFzLT5yX21pbiAhPSBtYXMtPmluZGV4KSB8fA0KKwkJCQkgIChvZmZz ZXQgIT0gd3JfbWFzLT5ub2RlX2VuZCkpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAob2Zm c2V0ID09IHdyX21hcy0+bm9kZV9lbmQgLSAxKQ0KKwkJbG1heCA9IG1hcy0+bWF4Ow0KKwllbHNl DQorCQlsbWF4ID0gd3JfbWFzLT5waXZvdHNbb2Zmc2V0ICsgMV07DQorDQorCS8qIGdvaW5nIHRv IG92ZXJ3cml0ZSB0b28gbWFueSBzbG90cy4gKi8NCisJaWYgKGxtYXggPCBtYXMtPmxhc3QpDQor CQlyZXR1cm4gZmFsc2U7DQorDQorCWlmICh3cl9tYXMtPnJfbWluID09IG1hcy0+aW5kZXgpIHsN CisJCS8qIG92ZXJ3cml0aW5nIHR3byBvciBtb3JlIHJhbmdlcyB3aXRoIG9uZS4gKi8NCisJCWlm IChsbWF4ID09IG1hcy0+bGFzdCkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkvKiBPdmVyd3Jp dGluZyBhbGwgb2Ygb2Zmc2V0IGFuZCBhIHBvcnRpb24gb2Ygb2Zmc2V0ICsgMS4gKi8NCisJCXJj dV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW29mZnNldF0sIHdyX21hcy0+ZW50cnkpOw0K KwkJd3JfbWFzLT5waXZvdHNbb2Zmc2V0XSA9IG1hcy0+bGFzdDsNCisJCWdvdG8gZG9uZTsNCisJ fQ0KKw0KKwkvKiBEb2Vzbid0IGVuZCBvbiB0aGUgbmV4dCByYW5nZSBlbmQuICovDQorCWlmIChs bWF4ICE9IG1hcy0+bGFzdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJLyogT3ZlcndyaXRpbmcg YSBwb3J0aW9uIG9mIG9mZnNldCBhbmQgYWxsIG9mIG9mZnNldCArIDEgKi8NCisJaWYgKChvZmZz ZXQgKyAxIDwgbXRfcGl2b3RzW3dyX21hcy0+dHlwZV0pICYmDQorCSAgICAod3JfbWFzLT5lbnRy eSB8fCB3cl9tYXMtPnBpdm90c1tvZmZzZXQgKyAxXSkpDQorCQkJd3JfbWFzLT5waXZvdHNbb2Zm c2V0ICsgMV0gPSBtYXMtPmxhc3Q7DQorDQorCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNs b3RzW29mZnNldCArIDFdLCB3cl9tYXMtPmVudHJ5KTsNCisJd3JfbWFzLT5waXZvdHNbb2Zmc2V0 XSA9IG1hcy0+aW5kZXggLSAxOw0KKwltYXMtPm9mZnNldCsrOyAvKiBLZWVwIG1hcyBhY2N1cmF0 ZS4gKi8NCisNCitkb25lOg0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCB3cl9t YXMtPmVudHJ5KTsNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCisJcmV0dXJuIHRydWU7DQorfQ0K Kw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3JfZW5kX3BpdihzdHJ1Y3QgbWFfd3Jfc3RhdGUg KndyX21hcykNCit7DQorCXdoaWxlICgod3JfbWFzLT5tYXMtPmxhc3QgPiB3cl9tYXMtPmVuZF9w aXYpICYmDQorCSAgICAgICAod3JfbWFzLT5vZmZzZXRfZW5kIDwgd3JfbWFzLT5ub2RlX2VuZCkp DQorCQl3cl9tYXMtPmVuZF9waXYgPSB3cl9tYXMtPnBpdm90c1srK3dyX21hcy0+b2Zmc2V0X2Vu ZF07DQorDQorCWlmICh3cl9tYXMtPm1hcy0+bGFzdCA+IHdyX21hcy0+ZW5kX3BpdikNCisJCXdy X21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+bWFzLT5tYXg7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg dm9pZCBtYXNfd3JfZXh0ZW5kX251bGwoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0K KwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwlpZiAobWFzLT5sYXN0 IDwgd3JfbWFzLT5lbmRfcGl2ICYmICF3cl9tYXMtPnNsb3RzW3dyX21hcy0+b2Zmc2V0X2VuZF0p DQorCQltYXMtPmxhc3QgPSB3cl9tYXMtPmVuZF9waXY7DQorDQorCS8qIENoZWNrIG5leHQgc2xv dChzKSBpZiB3ZSBhcmUgb3ZlcndyaXRpbmcgdGhlIGVuZCAqLw0KKwlpZiAoKG1hcy0+bGFzdCA9 PSB3cl9tYXMtPmVuZF9waXYpICYmDQorCSAgICAod3JfbWFzLT5ub2RlX2VuZCAhPSB3cl9tYXMt Pm9mZnNldF9lbmQpICYmDQorCSAgICAhd3JfbWFzLT5zbG90c1t3cl9tYXMtPm9mZnNldF9lbmQg KyAxXSkgew0KKwkJd3JfbWFzLT5vZmZzZXRfZW5kKys7DQorCQlpZiAod3JfbWFzLT5vZmZzZXRf ZW5kID09IHdyX21hcy0+bm9kZV9lbmQpDQorCQkJbWFzLT5sYXN0ID0gbWFzLT5tYXg7DQorCQll bHNlDQorCQkJbWFzLT5sYXN0ID0gd3JfbWFzLT5waXZvdHNbd3JfbWFzLT5vZmZzZXRfZW5kXTsN CisJfSBlbHNlIGlmICgobWFzLT5sYXN0ID4gd3JfbWFzLT5lbmRfcGl2KSAmJg0KKwkJICAgIXdy X21hcy0+c2xvdHNbd3JfbWFzLT5vZmZzZXRfZW5kXSkgew0KKwkJbWFzLT5sYXN0ID0gd3JfbWFz LT5lbmRfcGl2Ow0KKwkJd3JfbWFzLT5vZmZzZXRfZW5kKys7DQorCX0NCisNCisJaWYgKCF3cl9t YXMtPmNvbnRlbnQpIHsNCisJCS8qIElmIHRoaXMgb25lIGlzIG51bGwsIHRoZSBuZXh0IGFuZCBw cmV2IGFyZSBub3QgKi8NCisJCW1hcy0+aW5kZXggPSB3cl9tYXMtPnJfbWluOw0KKwl9IGVsc2Ug ew0KKwkJLyogQ2hlY2sgcHJldiBzbG90IGlmIHdlIGFyZSBvdmVyd3JpdGluZyB0aGUgc3RhcnQg Ki8NCisJCWlmIChtYXMtPmluZGV4ID09IHdyX21hcy0+cl9taW4gJiYgbWFzLT5vZmZzZXQgJiYN CisJCSAgICAhd3JfbWFzLT5zbG90c1ttYXMtPm9mZnNldCAtIDFdKSB7DQorCQkJbWFzLT5vZmZz ZXQtLTsNCisJCQl3cl9tYXMtPnJfbWluID0gbWFzLT5pbmRleCA9DQorCQkJCW1hc19zYWZlX21p bihtYXMsIHdyX21hcy0+cGl2b3RzLCBtYXMtPm9mZnNldCk7DQorCQkJd3JfbWFzLT5yX21heCA9 IHdyX21hcy0+cGl2b3RzW21hcy0+b2Zmc2V0XTsNCisJCX0NCisJfQ0KK30NCisNCitzdGF0aWMg aW5saW5lIGJvb2wgbWFzX3dyX2FwcGVuZChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7 DQorCXVuc2lnbmVkIGNoYXIgZW5kID0gd3JfbWFzLT5ub2RlX2VuZDsNCisJdW5zaWduZWQgY2hh ciBuZXdfZW5kID0gZW5kICsgMTsNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1h czsNCisJdW5zaWduZWQgY2hhciBub2RlX3Bpdm90cyA9IG10X3Bpdm90c1t3cl9tYXMtPnR5cGVd Ow0KKw0KKwlpZiAoKG1hcy0+aW5kZXggIT0gd3JfbWFzLT5yX21pbikgJiYgKG1hcy0+bGFzdCA9 PSB3cl9tYXMtPnJfbWF4KSkgew0KKwkJaWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQl3 cl9tYXMtPnBpdm90c1tuZXdfZW5kXSA9IHdyX21hcy0+cGl2b3RzW2VuZF07DQorDQorCQlpZiAo bmV3X2VuZCA8IG5vZGVfcGl2b3RzKQ0KKwkJCW1hX3NldF9tZXRhKHdyX21hcy0+bm9kZSwgbWFw bGVfbGVhZl82NCwgMCwgbmV3X2VuZCk7DQorDQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFz LT5zbG90c1tuZXdfZW5kXSwgd3JfbWFzLT5lbnRyeSk7DQorCQltYXMtPm9mZnNldCA9IG5ld19l bmQ7DQorCQl3cl9tYXMtPnBpdm90c1tlbmRdID0gbWFzLT5pbmRleCAtIDE7DQorDQorCQlyZXR1 cm4gdHJ1ZTsNCisJfQ0KKw0KKwlpZiAoKG1hcy0+aW5kZXggPT0gd3JfbWFzLT5yX21pbikgJiYg KG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgpKSB7DQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2 b3RzKQ0KKwkJCXdyX21hcy0+cGl2b3RzW25ld19lbmRdID0gd3JfbWFzLT5waXZvdHNbZW5kXTsN CisNCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW25ld19lbmRdLCB3cl9tYXMt PmNvbnRlbnQpOw0KKwkJaWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRfbWV0 YSh3cl9tYXMtPm5vZGUsIG1hcGxlX2xlYWZfNjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJd3JfbWFz LT5waXZvdHNbZW5kXSA9IG1hcy0+bGFzdDsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMt PnNsb3RzW2VuZF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJ cmV0dXJuIGZhbHNlOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3dyX21vZGlmeShz dHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9zbG90 czsNCisJdW5zaWduZWQgY2hhciBub2RlX3NpemU7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0g d3JfbWFzLT5tYXM7DQorCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSBiX25vZGU7DQorDQorCS8qIERp cmVjdCByZXBsYWNlbWVudCAqLw0KKwlpZiAod3JfbWFzLT5yX21pbiA9PSBtYXMtPmluZGV4ICYm IHdyX21hcy0+cl9tYXggPT0gbWFzLT5sYXN0KSB7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3Jf bWFzLT5zbG90c1ttYXMtPm9mZnNldF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJaWYgKCEhd3JfbWFz LT5lbnRyeSBeICEhd3JfbWFzLT5jb250ZW50KQ0KKwkJCW1hc191cGRhdGVfZ2FwKG1hcyk7DQor CQlyZXR1cm47DQorCX0NCisNCisJLyogQXR0ZW1wdCB0byBhcHBlbmQgKi8NCisJbm9kZV9zbG90 cyA9IG10X3Nsb3RzW3dyX21hcy0+dHlwZV07DQorCW5vZGVfc2l6ZSA9IHdyX21hcy0+bm9kZV9l bmQgLSB3cl9tYXMtPm9mZnNldF9lbmQgKyBtYXMtPm9mZnNldCArIDI7DQorCWlmIChtYXMtPm1h eCA9PSBVTE9OR19NQVgpDQorCQlub2RlX3NpemUrKzsNCisNCisJLyogc2xvdCBhbmQgbm9kZSBz dG9yZSB3aWxsIG5vdCBmaXQsIGdvIHRvIHRoZSBzbG93IHBhdGggKi8NCisJaWYgKHVubGlrZWx5 KG5vZGVfc2l6ZSA+PSBub2RlX3Nsb3RzKSkNCisJCWdvdG8gc2xvd19wYXRoOw0KKw0KKwlpZiAo d3JfbWFzLT5lbnRyeSAmJiAod3JfbWFzLT5ub2RlX2VuZCA8IG5vZGVfc2xvdHMgLSAxKSAmJg0K KwkgICAgKG1hcy0+b2Zmc2V0ID09IHdyX21hcy0+bm9kZV9lbmQpICYmIG1hc193cl9hcHBlbmQo d3JfbWFzKSkgew0KKwkJCWlmICghd3JfbWFzLT5jb250ZW50IHx8ICF3cl9tYXMtPmVudHJ5KQ0K KwkJCQltYXNfdXBkYXRlX2dhcChtYXMpOw0KKwkJCXJldHVybjsNCisJfQ0KKw0KKwlpZiAoKHdy X21hcy0+b2Zmc2V0X2VuZCAtIG1hcy0+b2Zmc2V0IDw9IDEpICYmIG1hc193cl9zbG90X3N0b3Jl KHdyX21hcykpDQorCQlyZXR1cm47DQorCWVsc2UgaWYgKG1hc193cl9ub2RlX3N0b3JlKHdyX21h cykpDQorCQlyZXR1cm47DQorDQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm47DQor DQorc2xvd19wYXRoOg0KKwltZW1zZXQoJmJfbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9i aWdfbm9kZSkpOw0KKwltYXNfc3RvcmVfYl9ub2RlKHdyX21hcywgJmJfbm9kZSwgd3JfbWFzLT5v ZmZzZXRfZW5kKTsNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIG1hcywgMCwgd3JfbWFzLT5l bnRyeSk7DQorCW1hc19jb21taXRfYl9ub2RlKHdyX21hcywgJmJfbm9kZSwgd3JfbWFzLT5ub2Rl X2VuZCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3dyX3N0b3JlX2VudHJ5KCkgLSBJbnRlcm5hbCBj YWxsIHRvIHN0b3JlIGEgdmFsdWUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50 cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisgKg0KKyAqIFJldHVybjogVGhlIGNvbnRlbnRzIHRo YXQgd2FzIHN0b3JlZCBhdCB0aGUgaW5kZXguDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICpt YXNfd3Jfc3RvcmVfZW50cnkoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1 Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwlpZiAoKHdyX21hcy0+Y29udGVu dCA9IG1hc19zdGFydChtYXMpKSB8fCBtYXNfaXNfbm9uZShtYXMpIHx8DQorCSAgICBtYXNfaXNf cHRyKG1hcykpIHsNCisJCW1hc19zdG9yZV9yb290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCQly ZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseSghbWFzX3dyX3dh bGsod3JfbWFzKSkpIHsNCisJCW1hc193cl9zcGFubmluZ19zdG9yZSh3cl9tYXMpOw0KKwkJcmV0 dXJuIHdyX21hcy0+Y29udGVudDsNCisJfQ0KKw0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUg YXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5lZWRzIHRvIGJlIGFsdGVyZWQuICovDQorCXdyX21hcy0+ ZW5kX3BpdiA9IHdyX21hcy0+cl9tYXg7DQorCW1hc193cl9lbmRfcGl2KHdyX21hcyk7DQorDQor CWlmICghd3JfbWFzLT5lbnRyeSkNCisJCW1hc193cl9leHRlbmRfbnVsbCh3cl9tYXMpOw0KKw0K KwkvKiBOZXcgcm9vdCBmb3IgYSBzaW5nbGUgcG9pbnRlciAqLw0KKwlpZiAodW5saWtlbHkoIW1h cy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkpIHsNCisJCW1hc19uZXdfcm9vdCht YXMsIHdyX21hcy0+ZW50cnkpOw0KKwkJcmV0dXJuIHdyX21hcy0+Y29udGVudDsNCisJfQ0KKw0K KwltYXNfd3JfbW9kaWZ5KHdyX21hcyk7DQorCXJldHVybiB3cl9tYXMtPmNvbnRlbnQ7DQorfQ0K Kw0KKy8qKg0KKyAqIG1hc19pbnNlcnQoKSAtIEludGVybmFsIGNhbGwgdG8gaW5zZXJ0IGEgdmFs dWUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBz dG9yZQ0KKyAqDQorICogUmV0dXJuOiAlTlVMTCBvciB0aGUgY29udGVudHMgdGhhdCBhbHJlYWR5 IGV4aXN0cyBhdCB0aGUgcmVxdWVzdGVkIGluZGV4DQorICogb3RoZXJ3aXNlLiAgVGhlIG1hcGxl IHN0YXRlIG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIGVycm9yIGNvbmRpdGlvbnMuDQorICovDQor c3RhdGljIGlubGluZSB2b2lkICptYXNfaW5zZXJ0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lk ICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBlbnRyeSk7DQorDQorCS8q DQorCSAqIEluc2VydGluZyBhIG5ldyByYW5nZSBpbnNlcnRzIGVpdGhlciAwLCAxLCBvciAyIHBp dm90cyB3aXRoaW4gdGhlDQorCSAqIHRyZWUuICBJZiB0aGUgaW5zZXJ0IGZpdHMgZXhhY3RseSBp bnRvIGFuIGV4aXN0aW5nIGdhcCB3aXRoIGEgdmFsdWUNCisJICogb2YgTlVMTCwgdGhlbiB0aGUg c2xvdCBvbmx5IG5lZWRzIHRvIGJlIHdyaXR0ZW4gd2l0aCB0aGUgbmV3IHZhbHVlLg0KKwkgKiBJ ZiB0aGUgcmFuZ2UgYmVpbmcgaW5zZXJ0ZWQgaXMgYWRqYWNlbnQgdG8gYW5vdGhlciByYW5nZSwg dGhlbiBvbmx5IGENCisJICogc2luZ2xlIHBpdm90IG5lZWRzIHRvIGJlIGluc2VydGVkIChhcyB3 ZWxsIGFzIHdyaXRpbmcgdGhlIGVudHJ5KS4gIElmDQorCSAqIHRoZSBuZXcgcmFuZ2UgaXMgd2l0 aGluIGEgZ2FwIGJ1dCBkb2VzIG5vdCB0b3VjaCBhbnkgb3RoZXIgcmFuZ2VzLA0KKwkgKiB0aGVu IHR3byBwaXZvdHMgbmVlZCB0byBiZSBpbnNlcnRlZDogdGhlIHN0YXJ0IC0gMSwgYW5kIHRoZSBl bmQuICBBcw0KKwkgKiB1c3VhbCwgdGhlIGVudHJ5IG11c3QgYmUgd3JpdHRlbi4gIE1vc3Qgb3Bl cmF0aW9ucyByZXF1aXJlIGEgbmV3IG5vZGUNCisJICogdG8gYmUgYWxsb2NhdGVkIGFuZCByZXBs YWNlIGFuIGV4aXN0aW5nIG5vZGUgdG8gZW5zdXJlIFJDVSBzYWZldHksDQorCSAqIHdoZW4gaW4g UkNVIG1vZGUuICBUaGUgZXhjZXB0aW9uIHRvIHJlcXVpcmluZyBhIG5ld2x5IGFsbG9jYXRlZCBu b2RlDQorCSAqIGlzIHdoZW4gaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2YgYSBub2RlIChhcHBlbmRp bmcpLiAgV2hlbiBkb25lDQorCSAqIGNhcmVmdWxseSwgYXBwZW5kaW5nIGNhbiByZXVzZSB0aGUg bm9kZSBpbiBwbGFjZS4NCisJICovDQorCXdyX21hcy5jb250ZW50ID0gbWFzX3N0YXJ0KG1hcyk7 DQorCWlmICh3cl9tYXMuY29udGVudCkNCisJCWdvdG8gZXhpc3RzOw0KKw0KKwlpZiAobWFzX2lz X25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1hc19zdG9yZV9yb290KG1hcywg ZW50cnkpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJLyogc3Bhbm5pbmcgd3JpdGVzIGFs d2F5cyBvdmVyd3JpdGUgc29tZXRoaW5nICovDQorCWlmICghbWFzX3dyX3dhbGsoJndyX21hcykp DQorCQlnb3RvIGV4aXN0czsNCisNCisJLyogQXQgdGhpcyBwb2ludCwgd2UgYXJlIGF0IHRoZSBs ZWFmIG5vZGUgdGhhdCBuZWVkcyB0byBiZSBhbHRlcmVkLiAqLw0KKwl3cl9tYXMub2Zmc2V0X2Vu ZCA9IG1hcy0+b2Zmc2V0Ow0KKwl3cl9tYXMuZW5kX3BpdiA9IHdyX21hcy5yX21heDsNCisNCisJ aWYgKHdyX21hcy5jb250ZW50IHx8IChtYXMtPmxhc3QgPiB3cl9tYXMucl9tYXgpKQ0KKwkJZ290 byBleGlzdHM7DQorDQorCWlmICghZW50cnkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJbWFzX3dy X21vZGlmeSgmd3JfbWFzKTsNCisJcmV0dXJuIHdyX21hcy5jb250ZW50Ow0KKw0KK2V4aXN0czoN CisJbWFzX3NldF9lcnIobWFzLCAtRUVYSVNUKTsNCisJcmV0dXJuIHdyX21hcy5jb250ZW50Ow0K Kw0KK30NCisNCisvKg0KKyAqIG1hc19wcmV2X25vZGUoKSAtIEZpbmQgdGhlIHByZXYgbm9uLW51 bGwgZW50cnkgYXQgdGhlIHNhbWUgbGV2ZWwgaW4gdGhlDQorICogdHJlZS4gIFRoZSBwcmV2IHZh bHVlIHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+b2Zmc2V0XSBvciBNQVNfTk9ORS4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbG93ZXIgbGltaXQgdG8gc2VhcmNoDQor ICoNCisgKiBUaGUgcHJldiBub2RlIHZhbHVlIHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+b2Zmc2V0 XSBvciBNQVNfTk9ORS4NCisgKiBSZXR1cm46IDEgaWYgdGhlIG5vZGUgaXMgZGVhZCwgMCBvdGhl cndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3ByZXZfbm9kZShzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7 DQorCWludCBvZmZzZXQsIGxldmVsOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlOw0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHM7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuIDA7 DQorDQorCWxldmVsID0gMDsNCisJZG8gew0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJaWYg KG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJCS8qIFdhbGsgdXAu ICovDQorCQlpZiAodW5saWtlbHkobWFzX2FzY2VuZChtYXMpKSkNCisJCQlyZXR1cm4gMTsNCisJ CW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwkJbGV2ZWwrKzsNCisJfSB3aGlsZSAoIW9mZnNldCk7 DQorDQorCW9mZnNldC0tOw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbm9k ZSA9IG1hc19tbihtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJcGl2b3Rz ID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJbWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJ aWYgKG9mZnNldCkNCisJCW1hcy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisJaWYg KHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsNCisNCisJaWYgKG1h cy0+bWF4IDwgbWluKQ0KKwkJZ290byBub19lbnRyeV9taW47DQorDQorCXdoaWxlIChsZXZlbCA+ IDEpIHsNCisJCWxldmVsLS07DQorCQllbm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNl dCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQlyZXR1cm4gMTsN CisNCisJCW1hcy0+bm9kZSA9IGVub2RlOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9k ZSk7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10 KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCQlvZmZzZXQgPSBtYV9kYXRh X2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCQlpZiAob2Zmc2V0KQ0KKwkJCW1h cy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisNCisJCWlmIChvZmZzZXQgPCBtdF9w aXZvdHNbbXRdKQ0KKwkJCW1hcy0+bWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorCQlpZiAobWFz LT5tYXggPCBtaW4pDQorCQkJZ290byBub19lbnRyeTsNCisJfQ0KKw0KKwltYXMtPm5vZGUgPSBt YXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2Rl KG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm9mZnNldCA9IG1hc19kYXRhX2VuZCht YXMpOw0KKwlpZiAodW5saWtlbHkobXRlX2RlYWRfbm9kZShtYXMtPm5vZGUpKSkNCisJCXJldHVy biAxOw0KKw0KKwlyZXR1cm4gMDsNCisNCitub19lbnRyeV9taW46DQorCW1hcy0+b2Zmc2V0ID0g b2Zmc2V0Ow0KKwlpZiAob2Zmc2V0KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0g KyAxOw0KK25vX2VudHJ5Og0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJ CXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJcmV0dXJuIDA7DQorfQ0K Kw0KKy8qDQorICogbWFzX25leHRfbm9kZSgpIC0gR2V0IHRoZSBuZXh0IG5vZGUgYXQgdGhlIHNh bWUgbGV2ZWwgaW4gdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1h eDogVGhlIG1heGltdW0gcGl2b3QgdmFsdWUgdG8gY2hlY2suDQorICoNCisgKiBUaGUgbmV4dCB2 YWx1ZSB3aWxsIGJlIG1hcy0+bm9kZVttYXMtPm9mZnNldF0gb3IgTUFTX05PTkUuDQorICogUmV0 dXJuOiAxIG9uIGRlYWQgbm9kZSwgMCBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBp bnQgbWFzX25leHRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUg Km5vZGUsDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBtaW4s IHBpdm90Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq ZW5vZGU7DQorCWludCBsZXZlbCA9IDA7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwllbnVt IG1hcGxlX3R5cGUgbXQ7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisNCisJaWYgKG1hcy0+bWF4 ID49IG1heCkNCisJCWdvdG8gbm9fZW50cnk7DQorDQorCWxldmVsID0gMDsNCisJZG8gew0KKwkJ aWYgKG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJCW1pbiA9IG1h cy0+bWF4ICsgMTsNCisJCWlmIChtaW4gPiBtYXgpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJ CWlmICh1bmxpa2VseShtYXNfYXNjZW5kKG1hcykpKQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJb2Zm c2V0ID0gbWFzLT5vZmZzZXQ7DQorCQlsZXZlbCsrOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0K KwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMo bm9kZSwgbXQpOw0KKwl9IHdoaWxlICh1bmxpa2VseShvZmZzZXQgPT0gbWFfZGF0YV9lbmQobm9k ZSwgbXQsIHBpdm90cywgbWFzLT5tYXgpKSk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwg bXQpOw0KKwlwaXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCArK29mZnNldCwgbXQp Ow0KKwl3aGlsZSAodW5saWtlbHkobGV2ZWwgPiAxKSkgew0KKwkJLyogRGVzY2VuZCwgaWYgbmVj ZXNzYXJ5ICovDQorCQllbm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlp ZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQlyZXR1cm4gMTsNCisNCisJCW1h cy0+bm9kZSA9IGVub2RlOw0KKwkJbGV2ZWwtLTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJ CW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2Rl LCBtdCk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwkJb2Zmc2V0ID0gMDsN CisJCXBpdm90ID0gcGl2b3RzWzBdOw0KKwl9DQorDQorCWVub2RlID0gbWFzX3Nsb3QobWFzLCBz bG90cywgb2Zmc2V0KTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQly ZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0gZW5vZGU7DQorCW1hcy0+bWluID0gbWluOw0KKwlt YXMtPm1heCA9IHBpdm90Ow0KKwlyZXR1cm4gMDsNCisNCitub19lbnRyeToNCisJaWYgKHVubGlr ZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0g TUFTX05PTkU7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXh0X25lbnRyeSgp IC0gR2V0IHRoZSBuZXh0IG5vZGUgZW50cnkNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisg KiBAbWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0byBjaGVjaw0KKyAqIEAqcmFuZ2Vfc3RhcnQ6IFBv aW50ZXIgdG8gc3RvcmUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4NCisgKg0KKyAqIFNldHMgQG1h cy0+b2Zmc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgbm9kZSBlbnRyeSwgQG1hcy0+bGFz dCB0byB0aGUNCisgKiBwaXZvdCBvZiB0aGUgZW50cnkuDQorICoNCisgKiBSZXR1cm46IFRoZSBu ZXh0IGVudHJ5LCAlTlVMTCBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1h c19uZXh0X25lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJICAgIHN0cnVjdCBtYXBsZV9u b2RlICpub2RlLCB1bnNpZ25lZCBsb25nIG1heCwgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0K Kwl1bnNpZ25lZCBjaGFyIGNvdW50Ow0KKwl1bnNpZ25lZCBsb25nIHBpdm90Ow0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAqZW50cnk7DQor DQorCWlmIChtYXMtPmxhc3QgPT0gbWFzLT5tYXgpIHsNCisJCW1hcy0+aW5kZXggPSBtYXMtPm1h eDsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorDQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0 eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJbWFzLT5pbmRleCA9IG1h c19zYWZlX21pbihtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQpOw0KKwlpZiAobWFfZGVhZF9ub2Rl KG5vZGUpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmIChtYXMtPmluZGV4ID4gbWF4KQ0KKwkJ cmV0dXJuIE5VTEw7DQorDQorCWNvdW50ID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2b3Rz LCBtYXMtPm1heCk7DQorCXdoaWxlIChtYXMtPm9mZnNldCA8IGNvdW50KSB7DQorCQlwaXZvdCA9 IHBpdm90c1ttYXMtPm9mZnNldF07DQorCQllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1h cy0+b2Zmc2V0KTsNCisJCWlmIChtYV9kZWFkX25vZGUobm9kZSkpDQorCQkJcmV0dXJuIE5VTEw7 DQorDQorCQlpZiAoZW50cnkpDQorCQkJZ290byBmb3VuZDsNCisNCisJCWlmIChwaXZvdCA+PSBt YXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQltYXMtPmluZGV4ID0gcGl2b3QgKyAxOw0KKwkJ bWFzLT5vZmZzZXQrKzsNCisJfQ0KKw0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+bWF4KSB7DQor CQltYXMtPmluZGV4ID0gbWFzLT5sYXN0Ow0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJcGl2 b3QgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQsIHR5cGUpOw0KKwll bnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCisJaWYgKG1hX2RlYWRf bm9kZShub2RlKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAoIXBpdm90KQ0KKwkJcmV0dXJu IE5VTEw7DQorDQorCWlmICghZW50cnkpDQorCQlyZXR1cm4gTlVMTDsNCisNCitmb3VuZDoNCisJ bWFzLT5sYXN0ID0gcGl2b3Q7DQorCXJldHVybiBlbnRyeTsNCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc19yZXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5k ZXgpDQorew0KKw0KK3JldHJ5Og0KKwltYXNfc2V0KG1hcywgaW5kZXgpOw0KKwltYXNfc3RhdGVf d2FsayhtYXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0K KwlyZXR1cm47DQorDQorfQ0KKw0KKy8qDQorICogbWFzX25leHRfZW50cnkoKSAtIEludGVybmFs IGZ1bmN0aW9uIHRvIGdldCB0aGUgbmV4dCBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAbGltaXQ6IFRoZSBtYXhpbXVtIHJhbmdlIHN0YXJ0Lg0KKyAqDQorICogU2V0IHRo ZSBAbWFzLT5ub2RlIHRvIHRoZSBuZXh0IGVudHJ5IGFuZCB0aGUgcmFuZ2Vfc3RhcnQgdG8NCisg KiB0aGUgYmVnaW5uaW5nIHZhbHVlIGZvciB0aGUgZW50cnkuICBEb2VzIG5vdCBjaGVjayBiZXlv bmQgQGxpbWl0Lg0KKyAqIFNldHMgQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3QgdG8gdGhlIGxp bWl0IGlmIGl0IGlzIGhpdC4NCisgKiBSZXN0YXJ0cyBvbiBkZWFkIG5vZGVzLg0KKyAqDQorICog UmV0dXJuOiB0aGUgbmV4dCBlbnRyeSBvciAlTlVMTC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgKm1hc19uZXh0X2VudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIGxp bWl0KQ0KK3sNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBy ZXZfbm9kZTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgb2Zm c2V0Ow0KKwl1bnNpZ25lZCBsb25nIGxhc3Q7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisNCisJ bGFzdCA9IG1hcy0+bGFzdDsNCityZXRyeToNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCXBy ZXZfbm9kZSA9IG1hcy0+bm9kZTsNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwltdCA9IG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbWFzLT5vZmZzZXQrKzsNCisJaWYgKHVubGlrZWx5KG1h cy0+b2Zmc2V0ID49IG10X3Nsb3RzW210XSkpDQorCQlnb3RvIG5leHRfbm9kZTsNCisNCisJd2hp bGUgKCFtYXNfaXNfbm9uZShtYXMpKSB7DQorCQllbnRyeSA9IG1hc19uZXh0X25lbnRyeShtYXMs IG5vZGUsIGxpbWl0LCBtdCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkg ew0KKwkJCW1hc19yZXdhbGsobWFzLCBsYXN0KTsNCisJCQlnb3RvIHJldHJ5Ow0KKwkJfQ0KKw0K KwkJaWYgKGxpa2VseShlbnRyeSkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKw0KKwkJaWYgKHVubGlr ZWx5KChtYXMtPmluZGV4ID4gbGltaXQpKSkNCisJCQlicmVhazsNCisNCituZXh0X25vZGU6DQor CQlwcmV2X25vZGUgPSBtYXMtPm5vZGU7DQorCQlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJCWlm ICh1bmxpa2VseShtYXNfbmV4dF9ub2RlKG1hcywgbm9kZSwgbGltaXQpKSkgew0KKwkJCW1hc19y ZXdhbGsobWFzLCBsYXN0KTsNCisJCQlnb3RvIHJldHJ5Ow0KKwkJfQ0KKwkJbWFzLT5vZmZzZXQg PSAwOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSk7DQorCX0NCisNCisJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCA9IGxpbWl0Ow0KKwltYXMt Pm9mZnNldCA9IG9mZnNldDsNCisJbWFzLT5ub2RlID0gcHJldl9ub2RlOw0KKwlyZXR1cm4gTlVM TDsNCit9DQorDQorLyoNCisgKiBtYXNfcHJldl9uZW50cnkoKSAtIEdldCB0aGUgcHJldmlvdXMg bm9kZSBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICogQGxpbWl0OiBUaGUg bG93ZXIgbGltaXQgdG8gY2hlY2sgZm9yIGEgdmFsdWUuDQorICoNCisgKiBSZXR1cm46IHRoZSBl bnRyeSwgJU5VTEwgb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3By ZXZfbmVudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIGxpbWl0LA0KKwkJ CQkgICAgdW5zaWduZWQgbG9uZyBpbmRleCkNCit7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3QsIG1p bjsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXN0cnVjdCBtYXBsZV9ub2RlICptbjsNCisJ ZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19y Y3UgKipzbG90czsNCisJdm9pZCAqZW50cnk7DQorDQorcmV0cnk6DQorCWlmICghbWFzLT5vZmZz ZXQpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJbW4gPSBtYXNfbW4obWFzKTsNCisJbXQgPSBtdGVf bm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0IC0gMTsNCisJc2xv dHMgPSBtYV9zbG90cyhtbiwgbXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobW4sIG10KTsNCisJ aWYgKG9mZnNldCA9PSBtdF9waXZvdHNbbXRdKQ0KKwkJcGl2b3QgPSBtYXMtPm1heDsNCisJZWxz ZQ0KKwkJcGl2b3QgPSBwaXZvdHNbb2Zmc2V0XTsNCisNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRf bm9kZShtbikpKSB7DQorCQltYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKwkJZ290byByZXRyeTsN CisJfQ0KKw0KKwl3aGlsZSAob2Zmc2V0ICYmICgoIW1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNl dCkgJiYgcGl2b3QgPj0gbGltaXQpIHx8DQorCSAgICAgICAhcGl2b3QpKQ0KKwkJcGl2b3QgPSBw aXZvdHNbLS1vZmZzZXRdOw0KKw0KKwltaW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIG9m ZnNldCk7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJaWYgKHVu bGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKSB7DQorCQltYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0K KwkJZ290byByZXRyeTsNCisJfQ0KKw0KKwlpZiAobGlrZWx5KGVudHJ5KSkgew0KKwkJbWFzLT5v ZmZzZXQgPSBvZmZzZXQ7DQorCQltYXMtPmxhc3QgPSBwaXZvdDsNCisJCW1hcy0+aW5kZXggPSBt aW47DQorCX0NCisJcmV0dXJuIGVudHJ5Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm1h c19wcmV2X2VudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7 DQorCXZvaWQgKmVudHJ5Ow0KKw0KK3JldHJ5Og0KKwl3aGlsZSAobGlrZWx5KCFtYXNfaXNfbm9u ZShtYXMpKSkgew0KKwkJZW50cnkgPSBtYXNfcHJldl9uZW50cnkobWFzLCBtaW4sIG1hcy0+aW5k ZXgpOw0KKwkJaWYgKHVubGlrZWx5KG1hcy0+bGFzdCA8IG1pbikpDQorCQkJZ290byBub3RfZm91 bmQ7DQorDQorCQlpZiAobGlrZWx5KGVudHJ5KSkNCisJCQlyZXR1cm4gZW50cnk7DQorDQorCQlp ZiAodW5saWtlbHkobWFzX3ByZXZfbm9kZShtYXMsIG1pbikpKSB7DQorCQkJbWFzX3Jld2Fsayht YXMsIG1hcy0+aW5kZXgpOw0KKwkJCWdvdG8gcmV0cnk7DQorCQl9DQorDQorCQltYXMtPm9mZnNl dCsrOw0KKwl9DQorDQorCW1hcy0+b2Zmc2V0LS07DQorbm90X2ZvdW5kOg0KKwltYXMtPmluZGV4 ID0gbWFzLT5sYXN0ID0gbWluOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNf cmV2X2F3YWxrKCkgLSBJbnRlcm5hbCBmdW5jdGlvbi4gIFJldmVyc2UgYWxsb2NhdGlvbiB3YWxr LiAgRmluZCB0aGUNCisgKiBoaWdoZXN0IGdhcCBhZGRyZXNzIG9mIGEgZ2l2ZW4gc2l6ZSBpbiBh IGdpdmVuIG5vZGUgYW5kIGRlc2NlbmQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICog QHNpemU6IFRoZSBuZWVkZWQgc2l6ZS4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBmb3VuZCBp biBhIGxlYWYsIGZhbHNlIG90aGVyd2lzZS4NCisgKg0KKyAqLw0KK3N0YXRpYyBib29sIG1hc19y ZXZfYXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQor CWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlzdHJ1 Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG1hc19tbihtYXMpOw0KKwl1bnNpZ25lZCBsb25nICpwaXZv dHMsICpnYXBzOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgZ2FwID0g MDsNCisJdW5zaWduZWQgbG9uZyBtYXgsIG1pbiwgaW5kZXg7DQorCXVuc2lnbmVkIGNoYXIgb2Zm c2V0Ow0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJICAgIHJldHVybiB0 cnVlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UodHlwZSkpIHsNCisJCS8qIGRlbnNlIG5vZGVzLiAq Lw0KKwkJbWFzLT5vZmZzZXQgPSAodW5zaWduZWQgY2hhcikobWFzLT5pbmRleCAtIG1hcy0+bWlu KTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0 eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJZ2FwcyA9IG1hX2dhcHMo bm9kZSwgdHlwZSk7DQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwltaW4gPSBtYXNfc2FmZV9t aW4obWFzLCBwaXZvdHMsIG9mZnNldCk7DQorCS8qIFNraXAgb3V0IG9mIGJvdW5kcy4gKi8NCisJ d2hpbGUgKG1hcy0+bGFzdCA8IG1pbikNCisJCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90 cywgLS1vZmZzZXQpOw0KKw0KKwltYXggPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgb2Zm c2V0LCB0eXBlKTsNCisJaW5kZXggPSBtYXMtPmluZGV4Ow0KKwl3aGlsZSAoaW5kZXggPD0gbWF4 KSB7DQorCQlnYXAgPSAwOw0KKwkJaWYgKGdhcHMpDQorCQkJZ2FwID0gZ2Fwc1tvZmZzZXRdOw0K KwkJZWxzZSBpZiAoIW1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCkpDQorCQkJZ2FwID0gbWF4 IC0gbWluICsgMTsNCisNCisJCWlmIChnYXApIHsNCisJCQlpZiAoKHNpemUgPD0gZ2FwKSAmJiAo c2l6ZSA8PSBtYXMtPmxhc3QgLSBtaW4gKyAxKSkNCisJCQkJYnJlYWs7DQorDQorCQkJaWYgKCFn YXBzKSB7DQorCQkJCS8qIFNraXAgdGhlIG5leHQgc2xvdCwgaXQgY2Fubm90IGJlIGEgZ2FwLiAq Lw0KKwkJCQlpZiAob2Zmc2V0IDwgMikNCisJCQkJCWdvdG8gYXNjZW5kOw0KKw0KKwkJCQlvZmZz ZXQgLT0gMjsNCisJCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorCQkJCW1pbiA9IG1hc19zYWZl X21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0K Kw0KKwkJaWYgKCFvZmZzZXQpDQorCQkJZ290byBhc2NlbmQ7DQorDQorCQlvZmZzZXQtLTsNCisJ CW1heCA9IG1pbiAtIDE7DQorCQltaW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIG9mZnNl dCk7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KGluZGV4ID4gbWF4KSkgew0KKwkJbWFzX3NldF9l cnIobWFzLCAtRUJVU1kpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCWlmICh1bmxpa2Vs eShtYV9pc19sZWFmKHR5cGUpKSkgew0KKwkJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCQltYXMt Pm1pbiA9IG1pbjsNCisJCW1hcy0+bWF4ID0gbWluICsgZ2FwIC0gMTsNCisJCXJldHVybiB0cnVl Ow0KKwl9DQorDQorCS8qIGRlc2NlbmQsIG9ubHkgaGFwcGVucyB1bmRlciBsb2NrLiAqLw0KKwlt YXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwltYXMtPm1pbiA9IG1p bjsNCisJbWFzLT5tYXggPSBtYXg7DQorCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hcyk7 DQorCXJldHVybiBmYWxzZTsNCisNCithc2NlbmQ6DQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5v ZGUpKQ0KKwkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKw0KKwlyZXR1cm4gZmFsc2U7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfYW5vZGVfZGVzY2VuZChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUg PSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3QsIG1pbiwg Z2FwID0gMDsNCisJdW5zaWduZWQgY2hhciBjb3VudCwgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25n ICpnYXBzID0gTlVMTCwgKnBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgdHlwZSk7DQor CXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG1hc19tbihtYXMpLCB0eXBlKTsNCisJYm9v bCBmb3VuZCA9IGZhbHNlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UodHlwZSkpIHsNCisJCW1hcy0+ b2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIpKG1hcy0+aW5kZXggLSBtYXMtPm1pbik7DQorCQlyZXR1 cm4gdHJ1ZTsNCisJfQ0KKw0KKwlnYXBzID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtYXMtPm5vZGUp LCB0eXBlKTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCWNvdW50ID0gbXRfc2xvdHNbdHlw ZV07DQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZm9yICg7 IG9mZnNldCA8IGNvdW50OyBvZmZzZXQrKykgew0KKwkJcGl2b3QgPSBtYXNfc2FmZV9waXZvdCht YXMsIHBpdm90cywgb2Zmc2V0LCB0eXBlKTsNCisJCWlmIChvZmZzZXQgJiYgIXBpdm90KQ0KKwkJ CWJyZWFrOw0KKw0KKwkJLyogTm90IHdpdGhpbiBsb3dlciBib3VuZHMgKi8NCisJCWlmIChtYXMt PmluZGV4ID4gcGl2b3QpDQorCQkJZ290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2FwcykNCisJ CQlnYXAgPSBnYXBzW29mZnNldF07DQorCQllbHNlIGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywg b2Zmc2V0KSkNCisJCQlnYXAgPSBtaW4ocGl2b3QsIG1hcy0+bGFzdCkgLSBtYXgobWFzLT5pbmRl eCwgbWluKSArIDE7DQorCQllbHNlDQorCQkJZ290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2Fw ID49IHNpemUpIHsNCisJCQlpZiAobWFfaXNfbGVhZih0eXBlKSkgew0KKwkJCQlmb3VuZCA9IHRy dWU7DQorCQkJCWdvdG8gZG9uZTsNCisJCQl9DQorCQkJaWYgKG1hcy0+aW5kZXggPD0gcGl2b3Qp IHsNCisJCQkJbWFzLT5ub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCQkJ bWFzLT5taW4gPSBtaW47DQorCQkJCW1hcy0+bWF4ID0gcGl2b3Q7DQorCQkJCW9mZnNldCA9IDA7 DQorCQkJCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQkJCWNvdW50ID0gbXRf c2xvdHNbdHlwZV07DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCituZXh0X3Nsb3Q6DQorCQlt aW4gPSBwaXZvdCArIDE7DQorCQlpZiAobWFzLT5sYXN0IDwgbWluKSB7DQorCQkJbWFzX3NldF9l cnIobWFzLCAtRUJVU1kpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorDQorCWlmICht dGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJZm91bmQgPSB0cnVlOw0KK2RvbmU6DQorCW1hcy0+ b2Zmc2V0ID0gb2Zmc2V0Ow0KKwlyZXR1cm4gZm91bmQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc193 YWxrKCkgLSBTZWFyY2ggZm9yIEBtYXMtPmluZGV4IGluIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCB3aWxsIGJl IHNldCB0byB0aGUgcmFuZ2UgaWYgdGhlcmUgaXMgYSB2YWx1ZS4gIElmDQorICogbWFzLT5ub2Rl IGlzIE1BU19OT05FLCByZXNldCB0byBNQVNfU1RBUlQuDQorICoNCisgKiBSZXR1cm46IHRoZSBl bnRyeSBhdCB0aGUgbG9jYXRpb24gb3IgJU5VTEwuDQorICovDQordm9pZCAqbWFzX3dhbGsoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl2b2lkICplbnRyeTsNCisNCityZXRyeToNCisJZW50 cnkgPSBtYXNfc3RhdGVfd2FsayhtYXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQln b3RvIHJldHJ5Ow0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+aW5k ZXgpIHsNCisJCQltYXMtPmxhc3QgPSAwOw0KKwkJfSBlbHNlIHsNCisJCQltYXMtPmluZGV4ID0g MTsNCisJCQltYXMtPmxhc3QgPSBVTE9OR19NQVg7DQorCQl9DQorCQlyZXR1cm4gZW50cnk7DQor CX0NCisNCisJaWYgKG1hc19pc19ub25lKG1hcykpIHsNCisJCW1hcy0+aW5kZXggPSAwOw0KKwkJ bWFzLT5sYXN0ID0gVUxPTkdfTUFYOw0KKwl9DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorDQor c3RhdGljIGlubGluZSBib29sIG1hc19yZXdpbmRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykN Cit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsNCisNCisJZG8gew0KKwkJaWYgKG10ZV9pc19yb290 KG1hcy0+bm9kZSkpIHsNCisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQkJaWYgKCFzbG90KQ0K KwkJCQlyZXR1cm4gZmFsc2U7DQorCQl9IGVsc2Ugew0KKwkJCW1hc19hc2NlbmQobWFzKTsNCisJ CQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQl9DQorCX0gd2hpbGUgKCFzbG90KTsNCisNCisJbWFz LT5vZmZzZXQgPSAtLXNsb3Q7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19z a2lwX25vZGUoKSAtIEludGVybmFsIGZ1bmN0aW9uLiAgU2tpcCBvdmVyIGEgbm9kZS4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgdGhlcmUgaXMg YW5vdGhlciBub2RlLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29s IG1hc19za2lwX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBjaGFy IHNsb3QsIHNsb3RfY291bnQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJZW51bSBtYXBs ZV90eXBlIG10Ow0KKw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJc2xvdF9j b3VudCA9IG10X3Nsb3RzW210XSAtIDE7DQorCWRvIHsNCisJCWlmIChtdGVfaXNfcm9vdChtYXMt Pm5vZGUpKSB7DQorCQkJc2xvdCA9IG1hcy0+b2Zmc2V0Ow0KKwkJCWlmIChzbG90ID4gc2xvdF9j b3VudCkgew0KKwkJCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorCQkJCXJldHVybiBmYWxz ZTsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCW1hc19hc2NlbmQobWFzKTsNCisJCQlzbG90ID0g bWFzLT5vZmZzZXQ7DQorCQkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQkJc2xv dF9jb3VudCA9IG10X3Nsb3RzW210XSAtIDE7DQorCQl9DQorCX0gd2hpbGUgKHNsb3QgPiBzbG90 X2NvdW50KTsNCisNCisJbWFzLT5vZmZzZXQgPSArK3Nsb3Q7DQorCXBpdm90cyA9IG1hX3Bpdm90 cyhtYXNfbW4obWFzKSwgbXQpOw0KKwlpZiAoc2xvdCA+IDApDQorCQltYXMtPm1pbiA9IHBpdm90 c1tzbG90IC0gMV0gKyAxOw0KKw0KKwlpZiAoc2xvdCA8PSBzbG90X2NvdW50KQ0KKwkJbWFzLT5t YXggPSBwaXZvdHNbc2xvdF07DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1h c19hd2FsaygpIC0gQWxsb2NhdGlvbiB3YWxrLiAgU2VhcmNoIGZyb20gbG93IGFkZHJlc3MgdG8g aGlnaCwgZm9yIGEgZ2FwIG9mDQorICogQHNpemUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGdhcCByZXF1aXJlZA0KKyAqDQorICogU2VhcmNo IGJldHdlZW4gQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3QgZm9yIGEgZ2FwIG9mIEBzaXplLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMs IHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGFzdCA9IE5V TEw7DQorDQorCS8qDQorCSAqIFRoZXJlIGFyZSA0IG9wdGlvbnM6DQorCSAqIGdvIHRvIGNoaWxk IChkZXNjZW5kKQ0KKwkgKiBnbyBiYWNrIHRvIHBhcmVudCAoYXNjZW5kKQ0KKwkgKiBubyBnYXAg Zm91bmQuIChyZXR1cm4sIHNsb3QgPT0gTUFQTEVfTk9ERV9TTE9UUykNCisJICogZm91bmQgdGhl IGdhcC4gKHJldHVybiwgc2xvdCAhPSBNQVBMRV9OT0RFX1NMT1RTKQ0KKwkgKi8NCisJd2hpbGUg KCFtYXNfaXNfZXJyKG1hcykgJiYgIW1hc19hbm9kZV9kZXNjZW5kKG1hcywgc2l6ZSkpIHsNCisJ CWlmIChsYXN0ID09IG1hcy0+bm9kZSkNCisJCQltYXNfc2tpcF9ub2RlKG1hcyk7DQorCQllbHNl DQorCQkJbGFzdCA9IG1hcy0+bm9kZTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19maWxsX2dh cCgpIC0gRmlsbCBhIGxvY2F0ZWQgZ2FwIHdpdGggQGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIHZhbHVlIHRvIHN0b3JlDQorICogQHNsb3Q6IFRoZSBv ZmZzZXQgaW50byB0aGUgbm9kZSB0byBzdG9yZSB0aGUgQGVudHJ5DQorICogQHNpemU6IFRoZSBz aXplIG9mIHRoZSBlbnRyeQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IGxvY2F0aW9uDQorICovDQor c3RhdGljIGlubGluZSB2b2lkIG1hc19maWxsX2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9p ZCAqZW50cnksDQorCQl1bnNpZ25lZCBjaGFyIHNsb3QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5z aWduZWQgbG9uZyAqaW5kZXgpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50cnkp Ow0KKwl1bnNpZ25lZCBjaGFyIHBzbG90ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQor CXN0cnVjdCBtYXBsZV9lbm9kZSAqbW4gPSBtYXMtPm5vZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBp dm90czsNCisJZW51bSBtYXBsZV90eXBlIHB0eXBlOw0KKwkvKg0KKwkgKiBtYXMtPmluZGV4IGlz IHRoZSBzdGFydCBhZGRyZXNzIGZvciB0aGUgc2VhcmNoDQorCSAqICB3aGljaCBtYXkgbm8gbG9u Z2VyIGJlIG5lZWRlZC4NCisJICogbWFzLT5sYXN0IGlzIHRoZSBlbmQgYWRkcmVzcyBmb3IgdGhl IHNlYXJjaA0KKwkgKi8NCisNCisJKmluZGV4ID0gbWFzLT5pbmRleDsNCisJbWFzLT5sYXN0ID0g bWFzLT5pbmRleCArIHNpemUgLSAxOw0KKw0KKwkvKg0KKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0 IHVzaW5nIG1hcy0+bWF4IGFuZCBtYXMtPm1pbiB0byBjb3JyZWN0bHkNCisJICogY2FsY3VsYXRl IHRoZSBpbmRleCBhbmQgbGFzdCB3aWxsIGNhdXNlIGFuIGlzc3VlIGluIHRoZSBnYXANCisJICog Y2FsY3VsYXRpb24sIHNvIGZpeCB0aGUgbWFfc3RhdGUgaGVyZQ0KKwkgKi8NCisJbWFzX2FzY2Vu ZChtYXMpOw0KKwlwdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0g bWFfcGl2b3RzKG1hc19tbihtYXMpLCBwdHlwZSk7DQorCW1hcy0+bWF4ID0gbWFzX3NhZmVfcGl2 b3QobWFzLCBwaXZvdHMsIHBzbG90LCBwdHlwZSk7DQorCW1hcy0+bWluID0gbWFzX3NhZmVfbWlu KG1hcywgcGl2b3RzLCBwc2xvdCk7DQorCW1hcy0+bm9kZSA9IG1uOw0KKwltYXMtPm9mZnNldCA9 IHNsb3Q7DQorCW1hc193cl9zdG9yZV9lbnRyeSgmd3JfbWFzKTsNCit9DQorDQorLyoNCisgKiBt YXNfc3BhcnNlX2FyZWEoKSAtIEludGVybmFsIGZ1bmN0aW9uLiAgUmV0dXJuIHVwcGVyIG9yIGxv d2VyIGxpbWl0IHdoZW4NCisgKiBzZWFyY2hpbmcgZm9yIGEgZ2FwIGluIGFuIGVtcHR5IHRyZWUu DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1pbjogdGhlIG1pbmltdW0gcmFuZ2UN CisgKiBAbWF4OiBUaGUgbWF4aW11bSByYW5nZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUg Z2FwDQorICogQGZ3ZDogU2VhcmNoaW5nIGZvcndhcmQgb3IgYmFjaw0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYXNfc3BhcnNlX2FyZWEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGxvbmcgbWluLA0KKwkJCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXplLCBi b29sIGZ3ZCkNCit7DQorCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAwOw0KKw0KKwlpZiAoIXVubGlr ZWx5KG1hc19pc19ub25lKG1hcykpKQ0KKwkJc3RhcnQrKzsNCisJLyogbWFzX2lzX3B0ciAqLw0K Kw0KKwlpZiAoc3RhcnQgPCBtaW4pDQorCQlzdGFydCA9IG1pbjsNCisNCisJaWYgKGZ3ZCkgew0K KwkJbWFzLT5pbmRleCA9IHN0YXJ0Ow0KKwkJbWFzLT5sYXN0ID0gc3RhcnQgKyBzaXplIC0gMTsN CisJCXJldHVybjsNCisJfQ0KKw0KKwltYXMtPmluZGV4ID0gbWF4Ow0KK30NCisNCisvKg0KKyAq IG1hc19lbXB0eV9hcmVhKCkgLSBHZXQgdGhlIGxvd2VzdCBhZGRyZXNzIHdpdGhpbiB0aGUgcmFu Z2UgdGhhdCBpcw0KKyAqIHN1ZmZpY2llbnQgZm9yIHRoZSBzaXplIHJlcXVlc3RlZC4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbG93ZXN0IHZhbHVlIG9mIHRoZSBy YW5nZQ0KKyAqIEBtYXg6IFRoZSBoaWdoZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBzaXpl OiBUaGUgc2l6ZSBuZWVkZWQNCisgKi8NCitpbnQgbWFzX2VtcHR5X2FyZWEoc3RydWN0IG1hX3N0 YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIHVuc2ln bmVkIGxvbmcgc2l6ZSkNCit7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBs b25nICpwaXZvdHM7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisNCisJaWYgKG1hc19pc19zdGFy dChtYXMpKSB7DQorCQltYXNfc3RhcnQobWFzKTsNCisJfSBlbHNlIGlmIChtYXMtPm9mZnNldCA+ PSAyKSB7DQorCQltYXMtPm9mZnNldCAtPSAyOw0KKwl9IGVsc2UgaWYgKCFtYXNfc2tpcF9ub2Rl KG1hcykpIHsNCisJCXJldHVybiAtRUJVU1k7DQorCX0NCisNCisJLyogRW1wdHkgc2V0ICovDQor CWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3NwYXJz ZV9hcmVhKG1hcywgbWluLCBtYXgsIHNpemUsIHRydWUpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisN CisJLyogVGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgd2l0aGluIHRoZXNlIHZh bHVlcyAqLw0KKwltYXMtPmluZGV4ID0gbWluOw0KKwltYXMtPmxhc3QgPSBtYXg7DQorCW1hc19h d2FsayhtYXMsIHNpemUpOw0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJ CXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsNCisNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQor CWlmICh1bmxpa2VseShvZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykpDQorCQlyZXR1cm4gLUVC VVNZOw0KKw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFf cGl2b3RzKG1hc19tbihtYXMpLCBtdCk7DQorCWlmIChvZmZzZXQpDQorCQltYXMtPm1pbiA9IHBp dm90c1tvZmZzZXQgLSAxXSArIDE7DQorDQorCWlmIChvZmZzZXQgPCBtdF9waXZvdHNbbXRdKQ0K KwkJbWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisNCisJaWYgKG1hcy0+aW5kZXggPCBtYXMt Pm1pbikNCisJCW1hcy0+aW5kZXggPSBtYXMtPm1pbjsNCisNCisJbWFzLT5sYXN0ID0gbWFzLT5p bmRleCArIHNpemUgLSAxOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNfZW1wdHlf YXJlYV9yZXYoKSAtIEdldCB0aGUgaGlnaGVzdCBhZGRyZXNzIHdpdGhpbiB0aGUgcmFuZ2UgdGhh dCBpcw0KKyAqIHN1ZmZpY2llbnQgZm9yIHRoZSBzaXplIHJlcXVlc3RlZC4NCisgKiBAbWFzOiBU aGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbG93ZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0K KyAqIEBtYXg6IFRoZSBoaWdoZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBzaXplOiBUaGUg c2l6ZSBuZWVkZWQNCisgKi8NCitpbnQgbWFzX2VtcHR5X2FyZWFfcmV2KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25l ZCBsb25nIHNpemUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxhc3QgPSBtYXMtPm5vZGU7 DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3N0YXJ0KG1hcyk7DQorCQlt YXMtPm9mZnNldCA9IG1hc19kYXRhX2VuZChtYXMpOw0KKwl9IGVsc2UgaWYgKG1hcy0+b2Zmc2V0 ID49IDIpIHsNCisJCW1hcy0+b2Zmc2V0IC09IDI7DQorCX0gZWxzZSBpZiAoIW1hc19yZXdpbmRf bm9kZShtYXMpKSB7DQorCQlyZXR1cm4gLUVCVVNZOw0KKwl9DQorDQorCS8qIEVtcHR5IHNldC4g Ki8NCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQltYXNf c3BhcnNlX2FyZWEobWFzLCBtaW4sIG1heCwgc2l6ZSwgZmFsc2UpOw0KKwkJcmV0dXJuIDA7DQor CX0NCisNCisJLyogVGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgd2l0aGluIHRo ZXNlIHZhbHVlcy4gKi8NCisJbWFzLT5pbmRleCA9IG1pbjsNCisJbWFzLT5sYXN0ID0gbWF4Ow0K Kw0KKwl3aGlsZSAoIW1hc19yZXZfYXdhbGsobWFzLCBzaXplKSkgew0KKwkJaWYgKGxhc3QgPT0g bWFzLT5ub2RlKSB7DQorCQkJaWYgKCFtYXNfcmV3aW5kX25vZGUobWFzKSkNCisJCQkJcmV0dXJu IC1FQlVTWTsNCisJCX0gZWxzZSB7DQorCQkJbGFzdCA9IG1hcy0+bm9kZTsNCisJCX0NCisJfQ0K Kw0KKwlpZiAodW5saWtlbHkobWFzLT5vZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykpDQorCQly ZXR1cm4gLUVCVVNZOw0KKw0KKwkvKg0KKwkgKiBtYXNfcmV2X2F3YWxrKCkgaGFzIHNldCBtYXMt Pm1pbiBhbmQgbWFzLT5tYXggdG8gdGhlIGdhcCB2YWx1ZXMuICBJZg0KKwkgKiB0aGUgbWF4aW11 bSBpcyBvdXRzaWRlIHRoZSB3aW5kb3cgd2UgYXJlIHNlYXJjaGluZywgdGhlbiB1c2UgdGhlIGxh c3QNCisJICogbG9jYXRpb24gaW4gdGhlIHNlYXJjaC4NCisJICogbWFzLT5tYXggYW5kIG1hcy0+ bWluIGlzIHRoZSByYW5nZSBvZiB0aGUgZ2FwLg0KKwkgKiBtYXMtPmluZGV4IGFuZCBtYXMtPmxh c3QgYXJlIGN1cnJlbnRseSBzZXQgdG8gdGhlIHNlYXJjaCByYW5nZS4NCisJICovDQorDQorCS8q IFRyaW0gdGhlIHVwcGVyIGxpbWl0IHRvIHRoZSBtYXguICovDQorCWlmIChtYXMtPm1heCA8PSBt YXMtPmxhc3QpDQorCQltYXMtPmxhc3QgPSBtYXMtPm1heDsNCisNCisJbWFzLT5pbmRleCA9IG1h cy0+bGFzdCAtIHNpemUgKyAxOw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGlubGluZSBp bnQgbWFzX2FsbG9jKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSwNCisJCXVuc2ln bmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyAqaW5kZXgpDQorew0KKwl1bnNpZ25lZCBsb25n IG1pbjsNCisNCisJbWFzX3N0YXJ0KG1hcyk7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1h c19pc19wdHIobWFzKSkgew0KKwkJbWFzX3Jvb3RfZXhwYW5kKG1hcywgZW50cnkpOw0KKwkJaWYg KG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCQlp ZiAoIW1hcy0+aW5kZXgpDQorCQkJcmV0dXJuIG10ZV9waXZvdChtYXMtPm5vZGUsIDApOw0KKwkJ cmV0dXJuIG10ZV9waXZvdChtYXMtPm5vZGUsIDEpOw0KKwl9DQorDQorCS8qIE11c3QgYmUgd2Fs a2luZyBhIHRyZWUuICovDQorCW1hc19hd2FsayhtYXMsIHNpemUpOw0KKwlpZiAobWFzX2lzX2Vy cihtYXMpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlpZiAobWFzLT5vZmZz ZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykNCisJCWdvdG8gbm9fZ2FwOw0KKw0KKwkvKg0KKwkgKiBB dCB0aGlzIHBvaW50LCBtYXMtPm5vZGUgcG9pbnRzIHRvIHRoZSByaWdodCBub2RlIGFuZCB3ZSBo YXZlIGFuDQorCSAqIG9mZnNldCB0aGF0IGhhcyBhIHN1ZmZpY2llbnQgZ2FwLg0KKwkgKi8NCisJ bWluID0gbWFzLT5taW47DQorCWlmIChtYXMtPm9mZnNldCkNCisJCW1pbiA9IG10ZV9waXZvdCht YXMtPm5vZGUsIG1hcy0+b2Zmc2V0IC0gMSkgKyAxOw0KKw0KKwlpZiAobWFzLT5pbmRleCA8IG1p bikNCisJCW1hcy0+aW5kZXggPSBtaW47DQorDQorCW1hc19maWxsX2dhcChtYXMsIGVudHJ5LCBt YXMtPm9mZnNldCwgc2l6ZSwgaW5kZXgpOw0KKwlyZXR1cm4gMDsNCisNCitub19nYXA6DQorCXJl dHVybiAtRUJVU1k7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19yZXZfYWxsb2Moc3Ry dWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJCQl1bnNpZ25lZCBsb25n IG1heCwgdm9pZCAqZW50cnksDQorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9u ZyAqaW5kZXgpDQorew0KKwlpbnQgcmV0ID0gMDsNCisNCisJcmV0ID0gbWFzX2VtcHR5X2FyZWFf cmV2KG1hcywgbWluLCBtYXgsIHNpemUpOw0KKwlpZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisN CisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsNCisN CisJaWYgKG1hcy0+b2Zmc2V0ID09IE1BUExFX05PREVfU0xPVFMpDQorCQlnb3RvIG5vX2dhcDsN CisNCisJbWFzX2ZpbGxfZ2FwKG1hcywgZW50cnksIG1hcy0+b2Zmc2V0LCBzaXplLCBpbmRleCk7 DQorCXJldHVybiAwOw0KKw0KK25vX2dhcDoNCisJcmV0dXJuIC1FQlVTWTsNCit9DQorDQorLyoN CisgKiBtYXNfZGVhZF9sZWF2ZXMoKSAtIE1hcmsgYWxsIGxlYXZlcyBvZiBhIG5vZGUgYXMgZGVh ZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6IFBvaW50ZXIgdG8gdGhl IHNsb3QgYXJyYXkNCisgKg0KKyAqIE11c3QgaG9sZCB0aGUgd3JpdGUgbG9jay4NCisgKg0KKyAq IFJldHVybjogVGhlIG51bWJlciBvZiBsZWF2ZXMgbWFya2VkIGFzIGRlYWQuDQorICovDQorc3Rh dGljIGlubGluZQ0KK3Vuc2lnbmVkIGNoYXIgbWFzX2RlYWRfbGVhdmVzKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9k ZTsNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCXZvaWQgKmVudHJ5Ow0KKwlpbnQgb2Zmc2V0 Ow0KKw0KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IG10X3Nsb3RfY291bnQobWFzLT5ub2Rl KTsgb2Zmc2V0KyspIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9m ZnNldCk7DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShlbnRyeSk7DQorCQlub2RlID0gbXRlX3Rv X25vZGUoZW50cnkpOw0KKwkJLyogVXNlIGJvdGggbm9kZSBhbmQgdHlwZSB0byBjYXRjaCBMRSAm IEJFIG1ldGFkYXRhICovDQorCQlpZiAoIW5vZGUgfHwgIXR5cGUpDQorCQkJYnJlYWs7DQorDQor CQltdGVfc2V0X25vZGVfZGVhZChlbnRyeSk7DQorCQlzbXBfd21iKCk7DQorCQlub2RlLT50eXBl ID0gdHlwZTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBub2RlKTsNCisJ fQ0KKw0KKwlyZXR1cm4gb2Zmc2V0Ow0KK30NCisNCitzdGF0aWMgdm9pZCBfX3JjdSAqKm1hc19k ZWFkX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsICpuZXh0Ow0KKwl2b2lkIF9fcmN1ICoqc2xvdHMg PSBOVUxMOw0KKw0KKwluZXh0ID0gbWFzX21uKG1hcyk7DQorCWRvIHsNCisJCW1hcy0+bm9kZSA9 IG1hX2Vub2RlX3B0cihuZXh0KTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCXNsb3RzID0g bWFfc2xvdHMobm9kZSwgbm9kZS0+dHlwZSk7DQorCQluZXh0ID0gbWFzX3Nsb3RfbG9ja2VkKG1h cywgc2xvdHMsIG9mZnNldCk7DQorCQlvZmZzZXQgPSAwOw0KKwl9IHdoaWxlICghbWFfaXNfbGVh ZihuZXh0LT50eXBlKSk7DQorDQorCXJldHVybiBzbG90czsNCit9DQorDQorc3RhdGljIHZvaWQg bXRfZnJlZV93YWxrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkNCit7DQorCXZvaWQgX19yY3UgKipz bG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsICpzdGFydDsNCisJc3RydWN0IG1hcGxl X3RyZWUgbXQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgdHlw ZTsNCisJTUFfU1RBVEUobWFzLCAmbXQsIDAsIDApOw0KKw0KKwlub2RlID0gY29udGFpbmVyX29m KGhlYWQsIHN0cnVjdCBtYXBsZV9ub2RlLCByY3UpOw0KKw0KKwlpZiAobWFfaXNfbGVhZihub2Rl LT50eXBlKSkNCisJCWdvdG8gZnJlZV9sZWFmOw0KKw0KKwltdF9pbml0X2ZsYWdzKCZtdCwgbm9k ZS0+bWFfZmxhZ3MpOw0KKwltYXNfbG9jaygmbWFzKTsNCisJc3RhcnQgPSBub2RlOw0KKwltYXMu bm9kZSA9IG10X21rX25vZGUobm9kZSwgbm9kZS0+dHlwZSk7DQorCXNsb3RzID0gbWFzX2RlYWRf d2FsaygmbWFzLCAwKTsNCisJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJZG8gew0KKwkJbXRfZnJl ZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorCQlvZmZzZXQgPSBub2RlLT5wYXJlbnRf c2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUtPnBpdl9wYXJlbnQ7DQorCQlpZiAobWFzX21u KCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFydF9zbG90c19mcmVlOw0KKw0KKwkJdHlwZSA9 IG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhtdGVfdG9fbm9k ZShtYXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKChvZmZzZXQgPCBtdF9zbG90c1t0eXBlXSkgJiYg KHNsb3RzW29mZnNldF0pKQ0KKwkJCXNsb3RzID0gbWFzX2RlYWRfd2FsaygmbWFzLCBvZmZzZXQp Ow0KKw0KKwkJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJfSB3aGlsZSAoKG5vZGUgIT0gc3RhcnQp IHx8IChub2RlLT5zbG90X2xlbiA8IG9mZnNldCkpOw0KKw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5v ZGUsIG5vZGUtPnR5cGUpOw0KKwltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4sIHNsb3RzKTsN CisNCitzdGFydF9zbG90c19mcmVlOg0KK2ZyZWVfbGVhZjoNCisJbXRfZnJlZV9yY3UoJm5vZGUt PnJjdSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3JjdSAqKm1hc19kZXN0cm95X2Rl c2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJc3RydWN0IG1hcGxlX2Vub2RlICpwcmV2 LCB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0K KwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQgPSBtYXMtPm5vZGU7DQorCXZvaWQgX19yY3UgKipz bG90cyA9IE5VTEw7DQorDQorCWRvIHsNCisJCW1hcy0+bm9kZSA9IG5leHQ7DQorCQlub2RlID0g bWFzX21uKG1hcyk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10ZV9ub2RlX3R5cGUobWFz LT5ub2RlKSk7DQorCQluZXh0ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIDApOw0KKwkJ bXRlX3NldF9ub2RlX2RlYWQobWFzLT5ub2RlKTsNCisJCW5vZGUtPnR5cGUgPSBtdGVfbm9kZV90 eXBlKG1hcy0+bm9kZSk7DQorCQlub2RlLT5waXZfcGFyZW50ID0gcHJldjsNCisJCW5vZGUtPnBh cmVudF9zbG90ID0gb2Zmc2V0Ow0KKwkJb2Zmc2V0ID0gMDsNCisJCXByZXYgPSBtYXMtPm5vZGU7 DQorCX0gd2hpbGUgKCFtdGVfaXNfbGVhZihuZXh0KSk7DQorCXJldHVybiBzbG90czsNCit9DQor DQorc3RhdGljIHZvaWQgbXRfZGVzdHJveV93YWxrKHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUs IHVuc2lnbmVkIGNoYXIgbWFfZmxhZ3MsDQorCQkJICAgIGJvb2wgZnJlZSkNCit7DQorCXZvaWQg X19yY3UgKipzbG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShl bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqc3RhcnQ7DQorCXN0cnVjdCBtYXBsZV90cmVl IG10Ow0KKw0KKwlNQV9TVEFURShtYXMsICZtdCwgMCwgMCk7DQorDQorCWlmIChtdGVfaXNfbGVh Zihlbm9kZSkpDQorCQlnb3RvIGZyZWVfbGVhZjsNCisNCisJbXRfaW5pdF9mbGFncygmbXQsIG1h X2ZsYWdzKTsNCisJbWFzX2xvY2soJm1hcyk7DQorDQorCW1hcy5ub2RlID0gc3RhcnQgPSBlbm9k ZTsNCisJc2xvdHMgPSBtYXNfZGVzdHJveV9kZXNjZW5kKCZtYXMsIHN0YXJ0LCAwKTsNCisJbm9k ZSA9IG1hc19tbigmbWFzKTsNCisJZG8gew0KKwkJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCQl1 bnNpZ25lZCBjaGFyIG9mZnNldDsNCisNCisJCW5vZGUtPnNsb3RfbGVuID0gbWFzX2RlYWRfbGVh dmVzKCZtYXMsIHNsb3RzKTsNCisJCWlmIChmcmVlKQ0KKwkJCW10X2ZyZWVfYnVsayhub2RlLT5z bG90X2xlbiwgc2xvdHMpOw0KKwkJb2Zmc2V0ID0gbm9kZS0+cGFyZW50X3Nsb3QgKyAxOw0KKwkJ bWFzLm5vZGUgPSBub2RlLT5waXZfcGFyZW50Ow0KKwkJaWYgKG1hc19tbigmbWFzKSA9PSBub2Rl KQ0KKwkJCWdvdG8gc3RhcnRfc2xvdHNfZnJlZTsNCisJCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1h cy5ub2RlKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLm5vZGUpLCB0eXBl KTsNCisJCWlmICgob2Zmc2V0IDwgbXRfc2xvdHNbdHlwZV0pICYmIChzbG90c1tvZmZzZXRdKSkg ew0KKwkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGFyZW50ID0gbWFzLm5vZGU7DQorDQorCQkJbWFz Lm5vZGUgPSBtYXNfc2xvdF9sb2NrZWQoJm1hcywgc2xvdHMsIG9mZnNldCk7DQorCQkJc2xvdHMg PSBtYXNfZGVzdHJveV9kZXNjZW5kKCZtYXMsIHBhcmVudCwgb2Zmc2V0KTsNCisJCX0NCisJCW5v ZGUgPSBtYXNfbW4oJm1hcyk7DQorCX0gd2hpbGUgKHN0YXJ0ICE9IG1hcy5ub2RlKTsNCisNCisJ bm9kZSA9IG1hc19tbigmbWFzKTsNCisJbm9kZS0+c2xvdF9sZW4gPSBtYXNfZGVhZF9sZWF2ZXMo Jm1hcywgc2xvdHMpOw0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVfYnVsayhub2RlLT5zbG90X2xl biwgc2xvdHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorCW1hc191bmxvY2soJm1hcyk7DQor DQorZnJlZV9sZWFmOg0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVfcmN1KCZub2RlLT5yY3UpOw0K K30NCisNCisvKg0KKyAqIG10ZV9kZXN0cm95X3dhbGsoKSAtIEZyZWUgYSB0cmVlIG9yIHN1Yi10 cmVlLg0KKyAqIEBlbm9kZSAtIHRoZSBlbmNvZGVkIG1hcGxlIG5vZGUgKG1hcGxlX2Vub2RlKSB0 byBzdGFydA0KKyAqIEBtbiAtIHRoZSB0cmVlIHRvIGZyZWUgLSBuZWVkZWQgZm9yIG5vZGUgdHlw ZXMuDQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2suDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG10ZV9kZXN0cm95X3dhbGsoc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSwNCisJ CQkJICAgIHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpu b2RlID0gbXRlX3RvX25vZGUoZW5vZGUpOw0KKw0KKwlpZiAobXRfaW5fcmN1KG10KSkgew0KKwkJ bXRfZGVzdHJveV93YWxrKGVub2RlLCBtdC0+bWFfZmxhZ3MsIGZhbHNlKTsNCisJCWNhbGxfcmN1 KCZub2RlLT5yY3UsIG10X2ZyZWVfd2Fsayk7DQorCX0gZWxzZSB7DQorCQltdF9kZXN0cm95X3dh bGsoZW5vZGUsIG10LT5tYV9mbGFncywgdHJ1ZSk7DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQg bWFzX3dyX3N0b3JlX3NldHVwKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJaWYg KCFtYXNfaXNfc3RhcnQod3JfbWFzLT5tYXMpKSB7DQorCQlpZiAobWFzX2lzX25vbmUod3JfbWFz LT5tYXMpKSB7DQorCQkJbWFzX3Jlc2V0KHdyX21hcy0+bWFzKTsNCisJCX0gZWxzZSB7DQorCQkJ d3JfbWFzLT5yX21heCA9IHdyX21hcy0+bWFzLT5tYXg7DQorCQkJd3JfbWFzLT50eXBlID0gbXRl X25vZGVfdHlwZSh3cl9tYXMtPm1hcy0+bm9kZSk7DQorCQkJaWYgKG1hc19pc19zcGFuX3dyKHdy X21hcykpDQorCQkJCW1hc19yZXNldCh3cl9tYXMtPm1hcyk7DQorCQl9DQorCX0NCisNCit9DQor DQorLyogSW50ZXJmYWNlICovDQorDQorLyoqDQorICogbWFzX3N0b3JlKCkgLSBTdG9yZSBhbiBA ZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBlbnRyeTogVGhlIGVudHJ5 IHRvIHN0b3JlLg0KKyAqDQorICogVGhlIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5sYXN0IGlzIHVz ZWQgdG8gc2V0IHRoZSByYW5nZSBmb3IgdGhlIEBlbnRyeS4NCisgKiBOb3RlOiBUaGUgQG1hcyBz aG91bGQgaGF2ZSBwcmUtYWxsb2NhdGVkIGVudHJpZXMgdG8gZW5zdXJlIHRoZXJlIGlzIG1lbW9y eSB0bw0KKyAqIHN0b3JlIHRoZSBlbnRyeS4gIFBsZWFzZSBzZWUgbWFzX2V4cGVjdGVkX2VudHJp ZXMoKS9tYXNfZGVzdHJveSgpIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiBSZXR1cm46IHRo ZSBmaXJzdCBlbnRyeSBiZXR3ZWVuIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCBvciAlTlVMTC4N CisgKi8NCit2b2lkICptYXNfc3RvcmUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5 KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVudHJ5KTsNCisNCisJdHJhY2VfbWFf d3JpdGUoX19mdW5jX18sIG1hcywgMCwgZW50cnkpOw0KKyNpZmRlZiBDT05GSUdfREVCVUdfTUFQ TEVfVFJFRQ0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+bGFzdCkNCisJCXByaW50aygiRXJyb3Ig JWx1ID4gJWx1ICVwXG4iLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QsIGVudHJ5KTsNCisJTVRfQlVH X09OKG1hcy0+dHJlZSwgbWFzLT5pbmRleCA+IG1hcy0+bGFzdCk7DQorCWlmIChtYXMtPmluZGV4 ID4gbWFzLT5sYXN0KSB7DQorCQltYXNfc2V0X2VycihtYXMsIC1FSU5WQUwpOw0KKwkJcmV0dXJu IE5VTEw7DQorCX0NCisNCisjZW5kaWYNCisNCisJLyoNCisJICogU3RvcmluZyBpcyB0aGUgc2Ft ZSBvcGVyYXRpb24gYXMgaW5zZXJ0IHdpdGggdGhlIGFkZGVkIGNhdmVhdCB0aGF0IGl0DQorCSAq IGNhbiBvdmVyd3JpdGUgZW50cmllcy4gIEFsdGhvdWdoIHRoaXMgc2VlbXMgc2ltcGxlIGVub3Vn aCwgb25lIG1heQ0KKwkgKiB3YW50IHRvIGV4YW1pbmUgd2hhdCBoYXBwZW5zIGlmIGEgc2luZ2xl IHN0b3JlIG9wZXJhdGlvbiB3YXMgdG8NCisJICogb3ZlcndyaXRlIG11bHRpcGxlIGVudHJpZXMg d2l0aGluIGEgc2VsZi1iYWxhbmNpbmcgQi1UcmVlLg0KKwkgKi8NCisJbWFzX3dyX3N0b3JlX3Nl dHVwKCZ3cl9tYXMpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQorCXJldHVybiB3 cl9tYXMuY29udGVudDsNCit9DQorDQorLyoqDQorICogbWFzX3N0b3JlX2dmcCgpIC0gU3RvcmUg YSB2YWx1ZSBpbnRvIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBl bnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2Ug Zm9yIGFsbG9jYXRpb25zIGlmIG5lY2Vzc2FyeS4NCisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNj ZXNzLCAtRUlOVkFMIG9uIGludmFsaWQgcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQg bm90DQorICogYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtYXNfc3RvcmVfZ2ZwKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJTUFfV1JfU1RBVEUo d3JfbWFzLCBtYXMsIGVudHJ5KTsNCisNCisJbWFzX3dyX3N0b3JlX3NldHVwKCZ3cl9tYXMpOw0K Kwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCBlbnRyeSk7DQorcmV0cnk6DQorCW1h c193cl9zdG9yZV9lbnRyeSgmd3JfbWFzKTsNCisJaWYgKHVubGlrZWx5KG1hc19ub21lbShtYXMs IGdmcCkpKQ0KKwkJZ290byByZXRyeTsNCisNCisJaWYgKHVubGlrZWx5KG1hc19pc19lcnIobWFz KSkpDQorCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCXJldHVybiAwOw0KK30NCisN CisvKioNCisgKiBtYXNfc3RvcmVfcHJlYWxsb2MoKSAtIFN0b3JlIGEgdmFsdWUgaW50byB0aGUg dHJlZSB1c2luZyBtZW1lb3J5DQorICogcHJlYWxsb2NhdGVkIGluIHRoZSBtYXBsZSBzdGF0ZS4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9y ZS4NCisgKi8NCit2b2lkIG1hc19zdG9yZV9wcmVhbGxvYyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dm9pZCAqZW50cnkpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50cnkpOw0KKw0K KwltYXNfd3Jfc3RvcmVfc2V0dXAoJndyX21hcyk7DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19f LCBtYXMsIDAsIGVudHJ5KTsNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlCVUdf T04obWFzX2lzX2VycihtYXMpKTsNCisJbWFzX2Rlc3Ryb3kobWFzKTsNCit9DQorDQorLyoqDQor ICogbWFzX3ByZWFsbG9jYXRlKCkgLSBQcmVhbGxvY2F0ZSBlbm91Z2ggbm9kZXMgZm9yIGEgc3Rv cmUgb3BlcmF0aW9uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUg ZW50cnkgdGhhdCB3aWxsIGJlIHN0b3JlZA0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Ms IC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG1h c19wcmVhbGxvY2F0ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksIGdmcF90IGdm cCkNCit7DQorDQorCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgMSArIG1hc19tdF9oZWlnaHQobWFz KSAqIDMpOw0KKwltYXNfYWxsb2Nfbm9kZXMobWFzLCBnZnApOw0KKwlpZiAobGlrZWx5KG1hcy0+ bm9kZSAhPSBNQV9FUlJPUigtRU5PTUVNKSkpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzX3NldF9h bGxvY19yZXEobWFzLCAwKTsNCisJbWFzX2Rlc3Ryb3kobWFzKTsNCisJbWFzLT5ub2RlID0gTUFT X1NUQVJUOw0KKwlyZXR1cm4gLUVOT01FTTsNCit9DQorDQorLyoNCisgKiBtYXNfZXhwZWN0ZWRf ZW50cmllcygpIC0gU2V0IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyB0aGF0IHdpbGwg YmUgaW5zZXJ0ZWQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG5yX2VudHJpZXM6 IFRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZW50cmllcy4NCisgKg0KKyAqIFRoaXMgd2lsbCBhdHRl bXB0IHRvIHByZS1hbGxvY2F0ZSBlbm91Z2ggbm9kZXMgdG8gc3RvcmUgdGhlIGV4cGVjdGVkIG51 bWJlcg0KKyAqIG9mIGVudHJpZXMuICBUaGUgYWxsb2NhdGlvbnMgd2lsbCBvY2N1ciB1c2luZyB0 aGUgYnVsayBhbGxvY2F0b3IgaW50ZXJmYWNlDQorICogZm9yIHNwZWVkLiAgUGxlYXNlIGNhbGwg bWFzX2Rlc3Ryb3koKSBvbiB0aGUgQG1hcyBhZnRlciBpbnNlcnRpbmcgdGhlIGVudHJpZXMNCisg KiB0byBlbnN1cmUgYW55IHVudXNlZCBub2RlcyBhcmUgZnJlZWQuDQorICoNCisgKiBSZXR1cm46 IDAgb24gc3VjY2VzcywgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4N CisgKi8NCitpbnQgbWFzX2V4cGVjdGVkX2VudHJpZXMoc3RydWN0IG1hX3N0YXRlICptYXMsIHVu c2lnbmVkIGxvbmcgbnJfZW50cmllcykNCit7DQorCWludCBub25sZWFmX2NhcCA9IE1BUExFX0FS QU5HRTY0X1NMT1RTIC0gMjsNCisJc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSA9IG1hcy0+bm9k ZTsNCisJaW50IG5yX25vZGVzOw0KKwlpbnQgcmV0Ow0KKw0KKwkvKg0KKwkgKiBTb21ldGltZXMg aXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSBhIHRyZWUgdG8gYSBuZXcgdHJlZSwgc3VjaCBh cw0KKwkgKiBmb3JraW5nIGEgcHJvY2VzcyBhbmQgZHVwbGljYXRpbmcgdGhlIFZNQXMgZnJvbSBv bmUgdHJlZSB0byBhIG5ldw0KKwkgKiB0cmVlLiAgV2hlbiBzdWNoIGEgc2l0dWF0aW9uIGFyaXNl cywgaXQgaXMga25vd24gdGhhdCB0aGUgbmV3IHRyZWUgaXMNCisJICogbm90IGdvaW5nIHRvIGJl IHVzZWQgdW50aWwgdGhlIGVudGlyZSB0cmVlIGlzIHBvcHVsYXRlZC4gIEZvcg0KKwkgKiBwZXJm b3JtYW5jZSByZWFzb25zLCBpdCBpcyBiZXN0IHRvIHVzZSBhIGJ1bGsgbG9hZCB3aXRoIFJDVSBk aXNhYmxlZC4NCisJICogVGhpcyBhbGxvd3MgZm9yIG9wdGltaXN0aWMgc3BsaXR0aW5nIHRoYXQg ZmF2b3VycyB0aGUgbGVmdCBhbmQgcmV1c2UNCisJICogb2Ygbm9kZXMgZHVyaW5nIHRoZSBvcGVy YXRpb24uDQorCSAqLw0KKw0KKwkvKiBPcHRpbWl6ZSBzcGxpdHRpbmcgZm9yIGJ1bGsgaW5zZXJ0 IGluLW9yZGVyICovDQorCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NUQVRFX0JVTEs7DQorDQorCS8q DQorCSAqIEF2b2lkIG92ZXJmbG93LCBhc3N1bWUgYSBnYXAgYmV0d2VlbiBlYWNoIGVudHJ5IGFu ZCBhIHRyYWlsaW5nIG51bGwuDQorCSAqIElmIHRoaXMgaXMgd3JvbmcsIGl0IGp1c3QgbWVhbnMg YWxsb2NhdGlvbiBjYW4gaGFwcGVuIGR1cmluZw0KKwkgKiBpbnNlcnRpb24gb2YgZW50cmllcy4N CisJICovDQorCW5yX25vZGVzID0gbWF4KG5yX2VudHJpZXMsIG5yX2VudHJpZXMgKiAyICsgMSk7 DQorDQorCWlmICghbXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJCW5vbmxlYWZfY2FwID0gTUFQ TEVfUkFOR0U2NF9TTE9UUyAtIDI7DQorDQorCS8qIExlYXZlcyAqLw0KKwlucl9ub2RlcyA9IERJ Vl9ST1VORF9VUChucl9ub2RlcywgTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEpOw0KKwkvKiBJbnRl cm5hbCBub2RlcyAqLw0KKwlucl9ub2RlcyArPSBESVZfUk9VTkRfVVAobnJfbm9kZXMsIG5vbmxl YWZfY2FwKTsNCisJbWFzX25vZGVfY291bnQobWFzLCBucl9ub2Rlcyk7DQorDQorCWlmICghbWFz X2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldCA9IHhhX2VycihtYXMtPm5vZGUp Ow0KKwltYXMtPm5vZGUgPSBlbm9kZTsNCisJcmV0dXJuIHJldDsNCisNCit9DQorDQorLyoNCisg KiBtYXNfZGVzdHJveSgpIC0gZGVzdHJveSBhIG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqDQorICogVXBvbiBjb21wbGV0aW9uLCBjaGVjayB0aGUgbGVmdC1tb3N0 IG5vZGUgYW5kIHJlYmFsYW5jZSBhZ2FpbnN0IHRoZSBub2RlIHRvDQorICogdGhlIHJpZ2h0IGlm IG5lY2Vzc2FyeS4gIEZyZWVzIGFueSBhbGxvY2F0ZWQgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRo aXMgbWFwbGUNCisgKiBzdGF0ZS4NCisgKi8NCit2b2lkIG1hc19kZXN0cm95KHN0cnVjdCBtYV9z dGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpub2RlOw0KKw0KKwkvKg0KKwkg KiBXaGVuIHVzaW5nIG1hc19mb3JfZWFjaCgpIHRvIGluc2VydCBhbiBleHBlY3RlZCBudW1iZXIg b2YgZWxlbWVudHMsDQorCSAqIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIG51bWJlciBpbnNlcnRl ZCBpcyBsZXNzIHRoYW4gdGhlIGV4cGVjdGVkDQorCSAqIG51bWJlci4gIFRvIGZpeCBhbiBpbnZh bGlkIGZpbmFsIG5vZGUsIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGhlcmUgdG8NCisJICogcmViYWxh bmNlIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIGZpbmFsIG5vZGUuDQorCSAqLw0KKwlpZiAo bWFzLT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9SRUJBTEFOQ0UpIHsNCisJCXVuc2lnbmVkIGNoYXIg ZW5kOw0KKw0KKwkJaWYgKG1hc19pc19zdGFydChtYXMpKQ0KKwkJCW1hc19zdGFydChtYXMpOw0K Kw0KKwkJbXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwkJZW5kID0gbWFzX2RhdGFfZW5kKG1hcykg KyAxOw0KKwkJaWYgKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAxKQ0KKwkJ CW1hc19kZXN0cm95X3JlYmFsYW5jZShtYXMsIGVuZCk7DQorDQorCQltYXMtPm1hc19mbGFncyAm PSB+TUFfU1RBVEVfUkVCQUxBTkNFOw0KKwl9DQorCW1hcy0+bWFzX2ZsYWdzICY9IH5NQV9TVEFU RV9CVUxLOw0KKw0KKwl3aGlsZSAobWFzLT5hbGxvYyAmJiAhKCh1bnNpZ25lZCBsb25nKW1hcy0+ YWxsb2MgJiAweDEpKSB7DQorCQlub2RlID0gbWFzLT5hbGxvYzsNCisJCW1hcy0+YWxsb2MgPSBu b2RlLT5zbG90WzBdOw0KKwkJaWYgKG5vZGUtPm5vZGVfY291bnQgPiAwKQ0KKwkJCW10X2ZyZWVf YnVsayhub2RlLT5ub2RlX2NvdW50LA0KKwkJCQkgICAgICh2b2lkIF9fcmN1ICoqKSZub2RlLT5z bG90WzFdKTsNCisJCWttZW1fY2FjaGVfZnJlZShtYXBsZV9ub2RlX2NhY2hlLCBub2RlKTsNCisJ fQ0KKwltYXMtPmFsbG9jID0gTlVMTDsNCit9DQorDQorLyoqDQorICogbWFzX25leHQoKSAtIEdl dCB0aGUgbmV4dCBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWF4OiBU aGUgbWF4aW11bSBpbmRleCB0byBjaGVjay4NCisgKg0KKyAqIFJldHVybnMgdGhlIG5leHQgZW50 cnkgYWZ0ZXIgQG1hcy0+aW5kZXguDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhl IHdyaXRlIGxvY2suDQorICogQ2FuIHJldHVybiB0aGUgemVybyBlbnRyeS4NCisgKg0KKyAqIFJl dHVybjogVGhlIG5leHQgZW50cnkgb3IgJU5VTEwNCisgKi8NCit2b2lkICptYXNfbmV4dChzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwlpZiAobWFzX2lzX25v bmUobWFzKSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7 DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCW1hc193YWxrKG1hcyk7IC8qIFJldHJp ZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc193YWxrICovDQorDQorCWlmIChtYXNfaXNf cHRyKG1hcykpIHsNCisJCWlmICghbWFzLT5pbmRleCkgew0KKwkJCW1hcy0+aW5kZXggPSAxOw0K KwkJCW1hcy0+bGFzdCA9IFVMT05HX01BWDsNCisJCX0NCisJCXJldHVybiBOVUxMOw0KKwl9DQor DQorCWlmIChtYXMtPmxhc3QgPT0gVUxPTkdfTUFYKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8q IFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc19uZXh0X2VudHJ5ICovDQorCXJl dHVybiBtYXNfbmV4dF9lbnRyeShtYXMsIG1heCk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1h c19uZXh0KTsNCisNCisvKioNCisgKiBtdF9uZXh0KCkgLSBnZXQgdGhlIG5leHQgdmFsdWUgaW4g dGhlIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUg c3RhcnQgaW5kZXgNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBpbmRleCB0byBjaGVjaw0KKyAqDQor ICogUmV0dXJuOiBUaGUgZW50cnkgYXQgQGluZGV4IG9yIGhpZ2hlciwgb3IgJU5VTEwgaWYgbm90 aGluZyBpcyBmb3VuZC4NCisgKi8NCit2b2lkICptdF9uZXh0KHN0cnVjdCBtYXBsZV90cmVlICpt dCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl2b2lkICpl bnRyeSA9IE5VTEw7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorDQorCXJj dV9yZWFkX2xvY2soKTsNCisJZW50cnkgPSBtYXNfbmV4dCgmbWFzLCBtYXgpOw0KKwlyY3VfcmVh ZF91bmxvY2soKTsNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtdF9u ZXh0KTsNCisNCisvKioNCisgKiBtYXNfcHJldigpIC0gR2V0IHRoZSBwcmV2aW91cyBlbnRyeQ0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBtaW5pbXVtIHZhbHVlIHRv IGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxv Y2suDQorICogV2lsbCByZXNldCBtYXMgdG8gTUFTX1NUQVJUIGlmIHRoZSBub2RlIGlzIE1BU19O T05FLiAgV2lsbCBzdG9wIG9uIG5vdA0KKyAqIHNlYXJjaGFibGUgbm9kZXMuDQorICoNCisgKiBS ZXR1cm46IHRoZSBwcmV2aW91cyB2YWx1ZSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfcHJl dihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwlpZiAoIW1h cy0+aW5kZXgpIHsNCisJCS8qIE5vdGhpbmcgY29tZXMgYmVmb3JlIDAgKi8NCisJCW1hcy0+bGFz dCA9IDA7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3B0 cihtYXMpKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBt YXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorDQorCWlmICht YXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3dhbGsobWFzKTsNCisJCWlmICghbWFzLT5pbmRl eCkNCisJCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKSB7DQor CQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCQltYXMtPmxhc3QgPSAwOw0KKwkJCXJldHVybiBOVUxM Ow0KKwkJfQ0KKw0KKwkJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCA9IDA7DQorCQlyZXR1cm4gbWFz X3Jvb3RfbG9ja2VkKG1hcyk7DQorCX0NCisJcmV0dXJuIG1hc19wcmV2X2VudHJ5KG1hcywgbWlu KTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX3ByZXYpOw0KKw0KKy8qKg0KKyAqIG10X3By ZXYoKSAtIGdldCB0aGUgcHJldmlvdXMgdmFsdWUgaW4gdGhlIG1hcGxlIHRyZWUNCisgKiBAbXQ6 IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQgaW5kZXgNCisgKiBAbWluOiBU aGUgbWluaW11bSBpbmRleCB0byBjaGVjaw0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQg QGluZGV4IG9yIGxvd2VyLCBvciAlTlVMTCBpZiBub3RoaW5nIGlzIGZvdW5kLg0KKyAqLw0KK3Zv aWQgKm10X3ByZXYoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCB1 bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXZvaWQgKmVudHJ5ID0gTlVMTDsNCisJTUFfU1RBVEUo bWFzLCBtdCwgaW5kZXgsIGluZGV4KTsNCisNCisJcmN1X3JlYWRfbG9jaygpOw0KKwllbnRyeSA9 IG1hc19wcmV2KCZtYXMsIG1pbik7DQorCXJjdV9yZWFkX3VubG9jaygpOw0KKwlyZXR1cm4gZW50 cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG10X3ByZXYpOw0KKw0KKy8qKg0KKyAqIG1hc19w YXVzZSgpIC0gUGF1c2UgYSBtYXNfZmluZC9tYXNfZm9yX2VhY2ggdG8gZHJvcCB0aGUgbG9jay4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUgdG8gcGF1c2UNCisgKg0KKyAqIFNvbWUgdXNlcnMg bmVlZCB0byBwYXVzZSBhIHdhbGsgYW5kIGRyb3AgdGhlIGxvY2sgdGhleSdyZSBob2xkaW5nIGlu DQorICogb3JkZXIgdG8geWllbGQgdG8gYSBoaWdoZXIgcHJpb3JpdHkgdGhyZWFkIG9yIGNhcnJ5 IG91dCBhbiBvcGVyYXRpb24NCisgKiBvbiBhbiBlbnRyeS4gIFRob3NlIHVzZXJzIHNob3VsZCBj YWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHRoZXkgZHJvcA0KKyAqIHRoZSBsb2NrLiAgSXQgcmVz ZXRzIHRoZSBAbWFzIHRvIGJlIHN1aXRhYmxlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24NCisgKiBv ZiB0aGUgbG9vcCBhZnRlciB0aGUgdXNlciBoYXMgcmVhY3F1aXJlZCB0aGUgbG9jay4gIElmIG1v c3QgZW50cmllcw0KKyAqIGZvdW5kIGR1cmluZyBhIHdhbGsgcmVxdWlyZSB5b3UgdG8gY2FsbCBt YXNfcGF1c2UoKSwgdGhlIG10X2Zvcl9lYWNoKCkNCisgKiBpdGVyYXRvciBtYXkgYmUgbW9yZSBh cHByb3ByaWF0ZS4NCisgKg0KKyAqLw0KK3ZvaWQgbWFzX3BhdXNlKHN0cnVjdCBtYV9zdGF0ZSAq bWFzKQ0KK3sNCisJbWFzLT5ub2RlID0gTUFTX1BBVVNFOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQ TChtYXNfcGF1c2UpOw0KKw0KKy8qKg0KKyAqIG1hc19maW5kKCkgLSBPbiB0aGUgZmlyc3QgY2Fs bCwgZmluZCB0aGUgZW50cnkgYXQgb3IgYWZ0ZXIgbWFzLT5pbmRleCB1cCB0bw0KKyAqICVtYXgu ICBPdGhlcndpc2UsIGZpbmQgdGhlIGVudHJ5IGFmdGVyIG1hcy0+aW5kZXguDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQG1heDogVGhlIG1heGltdW0gdmFsdWUgdG8gY2hlY2suDQor ICoNCisgKiBNdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBvciB0aGUgd3JpdGUgbG9jay4NCisgKiBJ ZiBhbiBlbnRyeSBleGlzdHMsIGxhc3QgYW5kIGluZGV4IGFyZSB1cGRhdGVkIGFjY29yZGluZ2x5 Lg0KKyAqIE1heSBzZXQgQG1hcy0+bm9kZSB0byBNQVNfTk9ORS4NCisgKg0KKyAqIFJldHVybjog VGhlIGVudHJ5IG9yICVOVUxMLg0KKyAqLw0KK3ZvaWQgKm1hc19maW5kKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCWlmICh1bmxpa2VseShtYXNfaXNfcGF1 c2VkKG1hcykpKSB7DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0ID09IFVMT05HX01BWCkpIHsN CisJCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCQlyZXR1cm4gTlVMTDsNCisJCX0NCisJCW1h cy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCW1hcy0+aW5kZXggPSArK21hcy0+bGFzdDsNCisJfQ0K Kw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7DQorCQkvKiBGaXJzdCBydW4g b3IgY29udGludWUgKi8NCisJCXZvaWQgKmVudHJ5Ow0KKw0KKwkJaWYgKG1hcy0+aW5kZXggPiBt YXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQllbnRyeSA9IG1hc193YWxrKG1hcyk7DQorCQlp ZiAoZW50cnkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseSghbWFz X3NlYXJjaGFibGUobWFzKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJLyogUmV0cmllcyBvbiBk ZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFzX25leHRfZW50cnkgKi8NCisJcmV0dXJuIG1hc19uZXh0 X2VudHJ5KG1hcywgbWF4KTsNCit9DQorDQorLyoqDQorICogbWFzX2ZpbmRfcmV2OiBPbiB0aGUg Zmlyc3QgY2FsbCwgZmluZCB0aGUgZmlyc3Qgbm9uLW51bGwgZW50cnkgYXQgb3IgYmVsb3cNCisg KiBtYXMtPmluZGV4IGRvd24gdG8gJW1pbi4gIE90aGVyd2lzZSBmaW5kIHRoZSBmaXJzdCBub24t bnVsbCBlbnRyeSBiZWxvdw0KKyAqIG1hcy0+aW5kZXggZG93biB0byAlbWluLg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBtaW5pbXVtIHZhbHVlIHRvIGNoZWNrLg0K KyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxvY2suDQorICog SWYgYW4gZW50cnkgZXhpc3RzLCBsYXN0IGFuZCBpbmRleCBhcmUgdXBkYXRlZCBhY2NvcmRpbmds eS4NCisgKiBNYXkgc2V0IEBtYXMtPm5vZGUgdG8gTUFTX05PTkUuDQorICoNCisgKiBSZXR1cm46 IFRoZSBlbnRyeSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfZmluZF9yZXYoc3RydWN0IG1h X3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sNCisJaWYgKHVubGlrZWx5KG1hc19p c19wYXVzZWQobWFzKSkpIHsNCisJCWlmICh1bmxpa2VseShtYXMtPmxhc3QgPT0gVUxPTkdfTUFY KSkgew0KKwkJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0K KwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKwkJbWFzLT5sYXN0ID0gLS1tYXMtPmluZGV4Ow0K Kwl9DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfc3RhcnQobWFzKSkpIHsNCisJCS8qIEZpcnN0 IHJ1biBvciBjb250aW51ZSAqLw0KKwkJdm9pZCAqZW50cnk7DQorDQorCQlpZiAobWFzLT5pbmRl eCA8IG1pbikNCisJCQlyZXR1cm4gTlVMTDsNCisNCisJCWVudHJ5ID0gbWFzX3dhbGsobWFzKTsN CisJCWlmIChlbnRyeSkNCisJCQlyZXR1cm4gZW50cnk7DQorCX0NCisNCisJaWYgKHVubGlrZWx5 KCFtYXNfc2VhcmNoYWJsZShtYXMpKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFzLT5p bmRleCA8IG1pbikNCisJCXJldHVybiBOVUxMOw0KKw0KKwkvKiBSZXRyaWVzIG9uIGRlYWQgbm9k ZXMgaGFuZGxlZCBieSBtYXNfbmV4dF9lbnRyeSAqLw0KKwlyZXR1cm4gbWFzX3ByZXZfZW50cnko bWFzLCBtaW4pOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtYXNfZmluZCk7DQorDQorLyoqDQor ICogbWFzX2VyYXNlKCkgLSBGaW5kIHRoZSByYW5nZSBpbiB3aGljaCBpbmRleCByZXNpZGVzIGFu ZCBlcmFzZSB0aGUgZW50aXJlDQorICogcmFuZ2UuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2suDQorICogU2VhcmNoZXMgZm9yIEBt YXMtPmluZGV4LCBzZXRzIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5sYXN0IHRvIHRoZSByYW5nZSBh bmQNCisgKiBlcmFzZXMgdGhhdCByYW5nZS4NCisgKg0KKyAqIFJldHVybjogdGhlIGVudHJ5IHRo YXQgd2FzIGVyYXNlZCBvciAlTlVMTCwgQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3QgYXJlIHVw ZGF0ZWQuDQorICovDQordm9pZCAqbWFzX2VyYXNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJdm9pZCAqZW50cnk7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBOVUxMKTsNCisNCisJ aWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFzLT5ub2Rl ID0gTUFTX1NUQVJUOw0KKw0KKwkvKiBSZXRyeSB1bm5lY2Vzc2FyeSB3aGVuIGhvbGRpbmcgdGhl IHdyaXRlIGxvY2suICovDQorCWVudHJ5ID0gbWFzX3N0YXRlX3dhbGsobWFzKTsNCisJaWYgKCFl bnRyeSkNCisJCXJldHVybiBOVUxMOw0KKw0KK3dyaXRlX3JldHJ5Og0KKwkvKiBNdXN0IHJlc2V0 IHRvIGVuc3VyZSBzcGFubmluZyB3cml0ZXMgb2YgbGFzdCBzbG90IGFyZSBkZXRlY3RlZCAqLw0K KwltYXNfcmVzZXQobWFzKTsNCisJbWFzX3dyX3N0b3JlX3NldHVwKCZ3cl9tYXMpOw0KKwltYXNf d3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQorCWlmIChtYXNfbm9tZW0obWFzLCBHRlBfS0VSTkVM KSkNCisJCWdvdG8gd3JpdGVfcmV0cnk7DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQT1JU X1NZTUJPTF9HUEwobWFzX2VyYXNlKTsNCisNCisvKioNCisgKiBtYXNfbm9tZW0oKSAtIENoZWNr IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhbGxvY2F0aW5nIGFuZCBkbyB0aGUgYWxsb2NhdGlvbg0K KyAqIGlmIG5lY2Vzc2FyeSBJZiB0aGVyZSBhcmUgYWxsb2NhdGlvbnMsIHRoZW4gZnJlZSB0aGVt Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8g dXNlIGZvciBhbGxvY2F0aW9ucw0KKyAqIFJldHVybjogdHJ1ZSBvbiBhbGxvY2F0aW9uLCBmYWxz ZSBvdGhlcndpc2UuDQorICovDQorYm9vbCBtYXNfbm9tZW0oc3RydWN0IG1hX3N0YXRlICptYXMs IGdmcF90IGdmcCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5sb2NrKQ0KK3sNCisJaWYgKGxp a2VseShtYXMtPm5vZGUgIT0gTUFfRVJST1IoLUVOT01FTSkpKSB7DQorCQltYXNfZGVzdHJveSht YXMpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCWlmIChnZnBmbGFnc19hbGxvd19ibG9j a2luZyhnZnApICYmICFtdF9leHRlcm5hbF9sb2NrKG1hcy0+dHJlZSkpIHsNCisJCW10cmVlX3Vu bG9jayhtYXMtPnRyZWUpOw0KKwkJbWFzX2FsbG9jX25vZGVzKG1hcywgZ2ZwKTsNCisJCW10cmVl X2xvY2sobWFzLT50cmVlKTsNCisJfSBlbHNlIHsNCisJCW1hc19hbGxvY19ub2RlcyhtYXMsIGdm cCk7DQorCX0NCisNCisJaWYgKCFtYXNfYWxsb2NhdGVkKG1hcykpDQorCQlyZXR1cm4gZmFsc2U7 DQorDQorCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3Zv aWQgX19pbml0IG1hcGxlX3RyZWVfaW5pdCh2b2lkKQ0KK3sNCisJbWFwbGVfbm9kZV9jYWNoZSA9 IGttZW1fY2FjaGVfY3JlYXRlKCJtYXBsZV9ub2RlIiwNCisJCQlzaXplb2Yoc3RydWN0IG1hcGxl X25vZGUpLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpLA0KKwkJCVNMQUJfUEFOSUMsIE5VTEwp Ow0KK30NCisNCisvKioNCisgKiBtdHJlZV9sb2FkKCkgLSBMb2FkIGEgdmFsdWUgc3RvcmVkIGlu IGEgbWFwbGUgdHJlZQ0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRoZSBp bmRleCB0byBsb2FkDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRyeSBvciAlTlVMTA0KKyAqLw0K K3ZvaWQgKm10cmVlX2xvYWQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGlu ZGV4KQ0KK3sNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGluZGV4KTsNCisJdm9pZCAqZW50 cnk7DQorDQorCXRyYWNlX21hX3JlYWQoX19mdW5jX18sICZtYXMpOw0KKwlyY3VfcmVhZF9sb2Nr KCk7DQorcmV0cnk6DQorCWVudHJ5ID0gbWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAodW5saWtlbHko bWFzX2lzX25vbmUoJm1hcykpKQ0KKwkJZ290byB1bmxvY2s7DQorDQorCWlmICh1bmxpa2VseSht YXNfaXNfcHRyKCZtYXMpKSkgew0KKwkJaWYgKGluZGV4KQ0KKwkJCWVudHJ5ID0gTlVMTDsNCisN CisJCWdvdG8gdW5sb2NrOw0KKwl9DQorDQorCWVudHJ5ID0gbXRyZWVfbG9va3VwX3dhbGsoJm1h cyk7DQorCWlmICghZW50cnkgJiYgdW5saWtlbHkobWFzX2lzX3N0YXJ0KCZtYXMpKSkNCisJCWdv dG8gcmV0cnk7DQordW5sb2NrOg0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisJaWYgKHhhX2lzX3pl cm8oZW50cnkpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQ T1JUX1NZTUJPTChtdHJlZV9sb2FkKTsNCisNCisvKioNCisgKiBtdHJlZV9zdG9yZV9yYW5nZSgp IC0gU3RvcmUgYW4gZW50cnkgYXQgYSBnaXZlbiByYW5nZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0 cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlDQorICogQGxhc3Q6IFRoZSBl bmQgb2YgdGhlIHJhbmdlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBAZ2Zw OiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMNCisgKg0KKyAqIFJldHVybjog MCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGludmFsaWQgcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1v cnkgY291bGQgbm90DQorICogYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtdHJlZV9zdG9yZV9y YW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsDQorCQl1bnNp Z25lZCBsb25nIGxhc3QsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnApDQorew0KKwlNQV9TVEFURSht YXMsIG10LCBpbmRleCwgbGFzdCk7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgJm1hcywgZW50cnkp Ow0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgJm1hcywgMCwgZW50cnkpOw0KKwlpZiAo V0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFuY2VkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZBTDsN CisNCisJaWYgKGluZGV4ID4gbGFzdCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwltdHJlZV9s b2NrKG10KTsNCityZXRyeToNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlpZiAo bWFzX25vbWVtKCZtYXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91bmxvY2so bXQpOw0KKwlpZiAobWFzX2lzX2VycigmbWFzKSkNCisJCXJldHVybiB4YV9lcnIobWFzLm5vZGUp Ow0KKw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9zdG9yZV9yYW5nZSk7 DQorDQorLyoqDQorICogbXRyZWVfc3RvcmUoKSAtIFN0b3JlIGFuIGVudHJ5IGF0IGEgZ2l2ZW4g aW5kZXguDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIGluZGV4IHRv IHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdm cDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zDQorICoNCisgKiBSZXR1cm46 IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVlc3QsIC1FTk9NRU0gaWYgbWVt b3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfc3RvcmUo c3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICplbnRyeSwN CisJCSBnZnBfdCBnZnApDQorew0KKwlyZXR1cm4gbXRyZWVfc3RvcmVfcmFuZ2UobXQsIGluZGV4 LCBpbmRleCwgZW50cnksIGdmcCk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfc3RvcmUpOw0K Kw0KKy8qKg0KKyAqIG10cmVlX2luc2VydF9yYW5nZSgpIC0gSW5zZXJ0IGFuIGVudHJ5IGF0IGEg Z2l2ZSByYW5nZSBpZiB0aGVyZSBpcyBubyB2YWx1ZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVl DQorICogQGZpcnN0OiBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlDQorICogQGxhc3Q6IFRoZSBlbmQg b2YgdGhlIHJhbmdlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBAZ2ZwOiBU aGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMuDQorICoNCisgKiBSZXR1cm46IDAg b24gc3VjY2VzcywgLUVFWElTVFMgaWYgdGhlIHJhbmdlIGlzIG9jY3VwaWVkLCAtRUlOVkFMIG9u IGludmFsaWQNCisgKiByZXF1ZXN0LCAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUgYWxs b2NhdGVkLg0KKyAqLw0KK2ludCBtdHJlZV9pbnNlcnRfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUg Km10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICpl bnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJTUFfU1RBVEUobXMsIG10LCBmaXJzdCwgbGFzdCk7DQor DQorCWlmIChXQVJOX09OX09OQ0UoeGFfaXNfYWR2YW5jZWQoZW50cnkpKSkNCisJCXJldHVybiAt RUlOVkFMOw0KKw0KKwlpZiAoZmlyc3QgPiBsYXN0KQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQor CW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwltYXNfaW5zZXJ0KCZtcywgZW50cnkpOw0KKwlp ZiAobWFzX25vbWVtKCZtcywgZ2ZwKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCW10cmVlX3VubG9j ayhtdCk7DQorCWlmIChtYXNfaXNfZXJyKCZtcykpDQorCQlyZXR1cm4geGFfZXJyKG1zLm5vZGUp Ow0KKw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9pbnNlcnRfcmFuZ2Up Ow0KKw0KKy8qKg0KKyAqIG10cmVlX2luc2VydCgpIC0gSW5zZXJ0IGFuIGVudHJ5IGF0IGEgZ2l2 ZSBpbmRleCBpZiB0aGVyZSBpcyBubyB2YWx1ZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQor ICogQGluZGV4IDogVGhlIGluZGV4IHRvIHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBlbnRyeTogVGhl IGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEZHUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9j YXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FRVhJU1RTIGlmIHRoZSBy YW5nZSBpcyBvY2N1cGllZCwgLUVJTlZBTCBvbiBpbnZhbGlkDQorICogcmVxdWVzdCwgLUVOT01F TSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfaW5z ZXJ0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqZW50 cnksDQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIG10cmVlX2luc2VydF9yYW5nZShtdCwg aW5kZXgsIGluZGV4LCBlbnRyeSwgZ2ZwKTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9pbnNl cnQpOw0KKw0KK2ludCBtdHJlZV9hbGxvY19yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVu c2lnbmVkIGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHNpemUs IHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdmcCkNCit7 DQorCWludCByZXQgPSAwOw0KKw0KKwlNQV9TVEFURShtYXMsIG10LCBtaW4sIG1heCAtIHNpemUp Ow0KKwlpZiAoIW10X2lzX2FsbG9jKG10KSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAo V0FSTl9PTl9PTkNFKG10X2lzX3Jlc2VydmVkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZBTDsN CisNCisJaWYgKG1pbiA+IG1heCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWF4IDwg c2l6ZSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoIXNpemUpDQorCQlyZXR1cm4gLUVJ TlZBTDsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorcmV0cnk6DQorCW1hcy5vZmZzZXQgPSAwOw0K KwltYXMuaW5kZXggPSBtaW47DQorCW1hcy5sYXN0ID0gbWF4IC0gc2l6ZTsNCisJcmV0ID0gbWFz X2FsbG9jKCZtYXMsIGVudHJ5LCBzaXplLCBzdGFydHApOw0KKwlpZiAobWFzX25vbWVtKCZtYXMs IGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91bmxvY2sobXQpOw0KKwlyZXR1cm4g cmV0Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10cmVlX2FsbG9jX3JhbmdlKTsNCisNCitpbnQgbXRy ZWVfYWxsb2NfcnJhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqc3Rh cnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBt aW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJaW50IHJldCA9IDA7 DQorDQorCU1BX1NUQVRFKG1hcywgbXQsIG1pbiwgbWF4IC0gc2l6ZSk7DQorCWlmICghbXRfaXNf YWxsb2MobXQpKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmIChXQVJOX09OX09OQ0UobXRf aXNfcmVzZXJ2ZWQoZW50cnkpKSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWluID49 IG1heCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWF4IDwgc2l6ZSAtIDEpDQorCQly ZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKCFzaXplKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQor CW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwlyZXQgPSBtYXNfcmV2X2FsbG9jKCZtYXMsIG1p biwgbWF4LCBlbnRyeSwgc2l6ZSwgc3RhcnRwKTsNCisJaWYgKG1hc19ub21lbSgmbWFzLCBnZnAp KQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5sb2NrKG10KTsNCisJcmV0dXJuIHJldDsN Cit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9hbGxvY19ycmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10 cmVlX2VyYXNlKCkgLSBGaW5kIGFuIGluZGV4IGFuZCBlcmFzZSB0aGUgZW50aXJlIHJhbmdlLg0K KyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byBlcmFzZQ0K KyAqDQorICogRXJhc2luZyBpcyB0aGUgc2FtZSBhcyBhIHdhbGsgdG8gYW4gZW50cnkgdGhlbiBh IHN0b3JlIG9mIGEgTlVMTCB0byB0aGF0DQorICogRU5USVJFIHJhbmdlLiAgSW4gZmFjdCwgaXQg aXMgaW1wbGVtZW50ZWQgYXMgc3VjaCB1c2luZyB0aGUgYWR2YW5jZWQgQVBJLg0KKyAqDQorICog UmV0dXJuOiBUaGUgZW50cnkgc3RvcmVkIGF0IHRoZSBAaW5kZXggb3IgJU5VTEwNCisgKi8NCit2 b2lkICptdHJlZV9lcmFzZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5k ZXgpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorDQorCU1BX1NUQVRFKG1hcywgbXQsIGlu ZGV4LCBpbmRleCk7DQorCXRyYWNlX21hX29wKF9fZnVuY19fLCAmbWFzKTsNCisNCisJbXRyZWVf bG9jayhtdCk7DQorCWVudHJ5ID0gbWFzX2VyYXNlKCZtYXMpOw0KKwltdHJlZV91bmxvY2sobXQp Ow0KKw0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfZXJhc2UpOw0K Kw0KKy8qKg0KKyAqIF9fbXRfZGVzdHJveSgpIC0gV2FsayBhbmQgZnJlZSBhbGwgbm9kZXMgb2Yg YSBsb2NrZWQgbWFwbGUgdHJlZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICoNCisgKiBO b3RlOiBEb2VzIG5vdCBoYW5kbGUgbG9ja2luZy4NCisgKi8NCit2b2lkIF9fbXRfZGVzdHJveShz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl2b2lkICpyb290ID0gbXRfcm9vdF9sb2NrZWQo bXQpOw0KKw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobXQtPm1hX3Jvb3QsIE5VTEwpOw0KKwlpZiAo eGFfaXNfbm9kZShyb290KSkNCisJCW10ZV9kZXN0cm95X3dhbGsocm9vdCwgbXQpOw0KKw0KKwlt dC0+bWFfZmxhZ3MgPSAwOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChfX210X2Rlc3Ryb3kpOw0K Kw0KKy8qKg0KKyAqIG10cmVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBtYXBsZSB0cmVlDQorICog QG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqDQorICogRnJlZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5 IHRoZSB0cmVlLiAgSGFuZGxlcyBsb2NraW5nLg0KKyAqLw0KK3ZvaWQgbXRyZWVfZGVzdHJveShz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwltdHJlZV9sb2NrKG10KTsNCisJX19tdF9kZXN0 cm95KG10KTsNCisJbXRyZWVfdW5sb2NrKG10KTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9k ZXN0cm95KTsNCisNCisvKioNCisgKiBtdF9maW5kKCkgLSBTZWFyY2ggZnJvbSB0aGUgc3RhcnQg dXAgdW50aWwgYW4gZW50cnkgaXMgZm91bmQuDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAq IEBpbmRleDogUG9pbnRlciB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhl IHNlYXJjaA0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICoNCisgKiBI YW5kbGVzIGxvY2tpbmcuICBAaW5kZXggd2lsbCBiZSBpbmNyZW1lbnRlZCB0byBvbmUgYmV5b25k IHRoZSByYW5nZS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IGF0IG9yIGFmdGVyIHRoZSBA aW5kZXggb3IgJU5VTEwNCisgKi8NCit2b2lkICptdF9maW5kKHN0cnVjdCBtYXBsZV90cmVlICpt dCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJTUFfU1RB VEUobWFzLCBtdCwgKmluZGV4LCAqaW5kZXgpOw0KKwl2b2lkICplbnRyeTsNCisjaWZkZWYgQ09O RklHX0RFQlVHX01BUExFX1RSRUUNCisJdW5zaWduZWQgbG9uZyBjb3B5ID0gKmluZGV4Ow0KKyNl bmRpZg0KKw0KKwl0cmFjZV9tYV9yZWFkKF9fZnVuY19fLCAmbWFzKTsNCisNCisJaWYgKCgqaW5k ZXgpID4gbWF4KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJjdV9yZWFkX2xvY2soKTsNCityZXRy eToNCisJZW50cnkgPSBtYXNfc3RhdGVfd2FsaygmbWFzKTsNCisJaWYgKG1hc19pc19zdGFydCgm bWFzKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCWlmICh1bmxpa2VseSh4YV9pc196ZXJvKGVudHJ5 KSkpDQorCQllbnRyeSA9IE5VTEw7DQorDQorCWlmIChlbnRyeSkNCisJCWdvdG8gdW5sb2NrOw0K Kw0KKwl3aGlsZSAobWFzX3NlYXJjaGFibGUoJm1hcykgJiYgKG1hcy5pbmRleCA8IG1heCkpIHsN CisJCWVudHJ5ID0gbWFzX25leHRfZW50cnkoJm1hcywgbWF4KTsNCisJCWlmIChsaWtlbHkoZW50 cnkgJiYgIXhhX2lzX3plcm8oZW50cnkpKSkNCisJCQlicmVhazsNCisJfQ0KKw0KKwlpZiAodW5s aWtlbHkoeGFfaXNfemVybyhlbnRyeSkpKQ0KKwkJZW50cnkgPSBOVUxMOw0KK3VubG9jazoNCisJ cmN1X3JlYWRfdW5sb2NrKCk7DQorCWlmIChsaWtlbHkoZW50cnkpKSB7DQorCQkqaW5kZXggPSBt YXMubGFzdCArIDE7DQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorCQlpZiAoKCpp bmRleCkgJiYgKCppbmRleCkgPD0gY29weSkNCisJCQlwcmludGsoImluZGV4IG5vdCBpbmNyZWFz ZWQhICVseCA8PSAlbHhcbiIsDQorCQkJICAgICAgICppbmRleCwgY29weSk7DQorCQlNVF9CVUdf T04obXQsICgqaW5kZXgpICYmICgoKmluZGV4KSA8PSBjb3B5KSk7DQorI2VuZGlmDQorCX0NCisN CisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10X2ZpbmQpOw0KKw0KKy8qKg0K KyAqIG10X2ZpbmRfYWZ0ZXIoKSAtIFNlYXJjaCBmcm9tIHRoZSBzdGFydCB1cCB1bnRpbCBhbiBl bnRyeSBpcyBmb3VuZC4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBQb2lu dGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgc2VhcmNoDQorICog QG1heDogVGhlIG1heGltdW0gdmFsdWUgdG8gY2hlY2sNCisgKg0KKyAqIEhhbmRsZXMgbG9ja2lu ZywgZGV0ZWN0cyB3cmFwcGluZyBvbiBpbmRleCA9PSAwDQorICoNCisgKiBSZXR1cm46IFRoZSBl bnRyeSBhdCBvciBhZnRlciB0aGUgQGluZGV4IG9yICVOVUxMDQorICovDQordm9pZCAqbXRfZmlu ZF9hZnRlcihzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LA0KKwkJ ICAgIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJaWYgKCEoKmluZGV4KSkNCisJCXJldHVybiBO VUxMOw0KKw0KKwlyZXR1cm4gbXRfZmluZChtdCwgaW5kZXgsIG1heCk7DQorfQ0KK0VYUE9SVF9T WU1CT0wobXRfZmluZF9hZnRlcik7DQorDQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVF DQorYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19ydW47DQorRVhQT1JUX1NZTUJPTF9HUEwobWFw bGVfdHJlZV90ZXN0c19ydW4pOw0KK2F0b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkOw0K K0VYUE9SVF9TWU1CT0xfR1BMKG1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkKTsNCisNCisjaWZuZGVm IF9fS0VSTkVMX18NCitleHRlcm4gdm9pZCBrbWVtX2NhY2hlX3NldF9ub25fa2VybmVsKHN0cnVj dCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGludCk7DQordm9pZCBtdF9zZXRfbm9uX2tlcm5lbCh1 bnNpZ25lZCBpbnQgdmFsKQ0KK3sNCisJa21lbV9jYWNoZV9zZXRfbm9uX2tlcm5lbChtYXBsZV9u b2RlX2NhY2hlLCB2YWwpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgbG9uZyBrbWVtX2NhY2hl X2dldF9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit1bnNpZ25lZCBsb25nIG10X2dldF9h bGxvY19zaXplKHZvaWQpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9nZXRfYWxsb2MobWFwbGVf bm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4dGVybiB2b2lkIGttZW1fY2FjaGVfemVyb19ucl90YWxs b2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3ZvaWQgbXRfemVyb19ucl90YWxsb2NhdGVk KCkNCit7DQorCWttZW1fY2FjaGVfemVyb19ucl90YWxsb2NhdGVkKG1hcGxlX25vZGVfY2FjaGUp Ow0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVfbnJfdGFsbG9jYXRlZChz dHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit1bnNpZ25lZCBpbnQgbXRfbnJfdGFsbG9jYXRlZCgpDQor ew0KKwlyZXR1cm4ga21lbV9jYWNoZV9ucl90YWxsb2NhdGVkKG1hcGxlX25vZGVfY2FjaGUpOw0K K30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVfbnJfYWxsb2NhdGVkKHN0cnVj dCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGludCBtdF9ucl9hbGxvY2F0ZWQoKQ0KK3sNCisJ cmV0dXJuIGttZW1fY2FjaGVfbnJfYWxsb2NhdGVkKG1hcGxlX25vZGVfY2FjaGUpOw0KK30NCisN CisvKg0KKyAqIG1hc19kZWFkX25vZGUoKSAtIENoZWNrIGlmIHRoZSBtYXBsZSBzdGF0ZSBpcyBw b2ludGluZyB0byBhIGRlYWQgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBA aW5kZXg6IFRoZSBpbmRleCB0byByZXN0b3JlIGluIEBtYXMuDQorICoNCisgKiBVc2VkIGluIHRl c3QgY29kZS4NCisgKiBSZXR1cm46IDEgaWYgQG1hcyBoYXMgYmVlbiByZXNldCB0byBNQVNfU1RB UlQsIDAgb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19kZWFkX25vZGUo c3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKyAgICAgICBp ZiAodW5saWtlbHkoIW1hc19zZWFyY2hhYmxlKG1hcykgfHwgbWFzX2lzX3N0YXJ0KG1hcykpKQ0K KyAgICAgICAgICAgICAgIHJldHVybiAwOw0KKw0KKyAgICAgICBpZiAobGlrZWx5KCFtdGVfZGVh ZF9ub2RlKG1hcy0+bm9kZSkpKQ0KKyAgICAgICAgICAgICAgIHJldHVybiAwOw0KKw0KKyAgICAg ICBtYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKyAgICAgICByZXR1cm4gMTsNCit9DQorDQorI2Rl ZmluZSBNQV9QVFIgIiVwIg0KKyNlbHNlIC8qICBfX0tFUk5FTF9fIGlzIGRlZmluZWQgKi8NCisj ZGVmaW5lIE1BX1BUUiAiJXB4Ig0KKyNlbmRpZg0KKw0KKy8qDQorICogbWFzX2dldF9zbG90KCkg LSBHZXQgdGhlIGVudHJ5IGluIHRoZSBtYXBsZSBzdGF0ZSBub2RlIHN0b3JlZCBhdCBAb2Zmc2V0 Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50 byB0aGUgc2xvdCBhcnJheSB0byBmZXRjaC4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0 b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2Rl ICptYXNfZ2V0X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQl1bnNpZ25lZCBjaGFyIG9m ZnNldCkNCit7DQorCXJldHVybiBtYXNfc2xvdChtYXMsIG1hX3Nsb3RzKG1hc19tbihtYXMpLCBt dGVfbm9kZV90eXBlKG1hcy0+bm9kZSkpLA0KKwkJICAgICAgIG9mZnNldCk7DQorfQ0KKw0KKw0K Ky8qDQorICogbWFzX2ZpcnN0X2VudHJ5KCkgLSBHbyB0aGUgZmlyc3QgbGVhZiBhbmQgZmluZCB0 aGUgZmlyc3QgZW50cnkuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBsaW1pdDog dGhlIG1heGltdW0gaW5kZXggdG8gY2hlY2suDQorICogQCpyX3N0YXJ0OiBQb2ludGVyIHRvIHNl dCB0byB0aGUgcmFuZ2Ugc3RhcnQuDQorICoNCisgKiBTZXRzIG1hcy0+b2Zmc2V0IHRvIHRoZSBv ZmZzZXQgb2YgdGhlIGVudHJ5LCByX3N0YXJ0IHRvIHRoZSByYW5nZSBtaW5pbXVtLg0KKyAqDQor ICogUmV0dXJuOiBUaGUgZmlyc3QgZW50cnkgb3IgTUFTX05PTkUuDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkICptYXNfZmlyc3RfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBt YXBsZV9ub2RlICptbiwNCisJCXVuc2lnbmVkIGxvbmcgbGltaXQsIGVudW0gbWFwbGVfdHlwZSBt dCkNCisNCit7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7 DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKw0KKwltYXMt PmluZGV4ID0gbWFzLT5taW47DQorCWlmIChtYXMtPmluZGV4ID4gbGltaXQpDQorCQlnb3RvIG5v bmU7DQorDQorCW1heCA9IG1hcy0+bWF4Ow0KKwltYXMtPm9mZnNldCA9IDA7DQorCXdoaWxlIChs aWtlbHkoIW1hX2lzX2xlYWYobXQpKSkgew0KKwkJc2xvdHMgPSBtYV9zbG90cyhtbiwgbXQpOw0K KwkJcGl2b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCQltYXggPSBwaXZvdHNbMF07DQorCQll bnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIDApOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRf bm9kZShtbikpKQ0KKwkJCXJldHVybiBOVUxMOw0KKwkJbWFzLT5ub2RlID0gZW50cnk7DQorCQlt biA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCX0N CisNCisJbWFzLT5tYXggPSBtYXg7DQorCXNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsNCisJZW50 cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCAwKTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9k ZShtbikpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIFNsb3QgMCBvciAxIG11c3QgYmUgc2V0 ICovDQorCWlmIChtYXMtPmluZGV4ID4gbGltaXQpDQorCQlnb3RvIG5vbmU7DQorDQorCWlmKGxp a2VseShlbnRyeSkpDQorCQlyZXR1cm4gZW50cnk7DQorDQorCXBpdm90cyA9IG1hX3Bpdm90cyht biwgbXQpOw0KKwltYXMtPmluZGV4ID0gcGl2b3RzWzBdICsgMTsNCisJbWFzLT5vZmZzZXQgPSAx Ow0KKwllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIDEpOw0KKwlpZiAodW5saWtlbHkobWFf ZGVhZF9ub2RlKG1uKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1hcy0+aW5kZXggPiBs aW1pdCkNCisJCWdvdG8gbm9uZTsNCisNCisJaWYobGlrZWx5KGVudHJ5KSkNCisJCXJldHVybiBl bnRyeTsNCisNCitub25lOg0KKwlpZiAobGlrZWx5KCFtYV9kZWFkX25vZGUobW4pKSkNCisJCW1h cy0+bm9kZSA9IE1BU19OT05FOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyogRGVwdGggZmly c3Qgc2VhcmNoLCBwb3N0LW9yZGVyICovDQorc3RhdGljIHZvaWQgbWFzX2Rmc19wb3N0b3JkZXIo c3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisNCisJc3RydWN0 IG1hcGxlX2Vub2RlICpwID0gTUFTX05PTkUsICptbiA9IG1hcy0+bm9kZTsNCisJdW5zaWduZWQg bG9uZyBwX21pbiwgcF9tYXg7DQorDQorCW1hc19uZXh0X25vZGUobWFzLCBtYXNfbW4obWFzKSwg bWF4KTsNCisJaWYgKCFtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRl X2lzX3Jvb3QobW4pKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXMtPm5vZGUgPSBtbjsNCisJbWFzX2Fz Y2VuZChtYXMpOw0KKwl3aGlsZSAobWFzLT5ub2RlICE9IE1BU19OT05FKSB7DQorCQlwID0gbWFz LT5ub2RlOw0KKwkJcF9taW4gPSBtYXMtPm1pbjsNCisJCXBfbWF4ID0gbWFzLT5tYXg7DQorCQlt YXNfcHJldl9ub2RlKG1hcywgMCk7DQorCX0NCisNCisJaWYgKHAgPT0gTUFTX05PTkUpDQorCQly ZXR1cm47DQorDQorCW1hcy0+bm9kZSA9IHA7DQorCW1hcy0+bWF4ID0gcF9tYXg7DQorCW1hcy0+ bWluID0gcF9taW47DQorfQ0KKw0KKy8qIFRyZWUgdmFsaWRhdGlvbnMgKi8NCitzdGF0aWMgdm9p ZCBtdF9kdW1wX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LCB2b2lkICplbnRyeSwN CisJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRl cHRoKTsNCitzdGF0aWMgdm9pZCBtdF9kdW1wX3JhbmdlKHVuc2lnbmVkIGxvbmcgbWluLCB1bnNp Z25lZCBsb25nIG1heCwNCisJCQkgIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCXN0YXRpYyBj b25zdCBjaGFyIHNwYWNlc1tdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsN CisNCisJaWYgKG1pbiA9PSBtYXgpDQorCQlwcl9pbmZvKCIlLipzJWx1OiAiLCBkZXB0aCAqIDIs IHNwYWNlcywgbWluKTsNCisJZWxzZQ0KKwkJcHJfaW5mbygiJS4qcyVsdS0lbHU6ICIsIGRlcHRo ICogMiwgc3BhY2VzLCBtaW4sIG1heCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfZW50 cnkodm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwNCisJ CQkgIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCW10X2R1bXBfcmFuZ2UobWluLCBtYXgsIGRl cHRoKTsNCisNCisJaWYgKHhhX2lzX3ZhbHVlKGVudHJ5KSkNCisJCXByX2NvbnQoInZhbHVlICVs ZCAoMHglbHgpIFsiTUFfUFRSIl1cbiIsIHhhX3RvX3ZhbHVlKGVudHJ5KSwNCisJCQkJeGFfdG9f dmFsdWUoZW50cnkpLCBlbnRyeSk7DQorCWVsc2UgaWYgKHhhX2lzX3plcm8oZW50cnkpKQ0KKwkJ cHJfY29udCgiemVybyAoJWxkKVxuIiwgeGFfdG9faW50ZXJuYWwoZW50cnkpKTsNCisJZWxzZSBp ZiAobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKQ0KKwkJcHJfY29udCgiVU5LTk9XTiBFTlRSWSAoIk1B X1BUUiIpXG4iLCBlbnRyeSk7DQorCWVsc2UNCisJCXByX2NvbnQoIiJNQV9QVFIiXG4iLCBlbnRy eSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFw bGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25l ZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX3Jhbmdl XzY0ICpub2RlID0gJm10ZV90b19ub2RlKGVudHJ5KS0+bXI2NDsNCisJYm9vbCBsZWFmID0gbXRl X2lzX2xlYWYoZW50cnkpOw0KKwl1bnNpZ25lZCBsb25nIGZpcnN0ID0gbWluOw0KKwlpbnQgaTsN CisNCisJcHJfY29udCgiIGNvbnRlbnRzOiAiKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX1JB TkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KCIiTUFfUFRSIiAlbHUgIiwgbm9kZS0+ c2xvdFtpXSwgbm9kZS0+cGl2b3RbaV0pOw0KKwlwcl9jb250KCIiTUFfUFRSIlxuIiwgbm9kZS0+ c2xvdFtpXSk7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9SQU5HRTY0X1NMT1RTOyBpKyspIHsN CisJCXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwgKE1BUExFX1JBTkdF NjRfU0xPVFMgLSAxKSkNCisJCQlsYXN0ID0gbm9kZS0+cGl2b3RbaV07DQorCQllbHNlIGlmICgh bm9kZS0+c2xvdFtpXSAmJiBtYXggIT0gbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkpXSkNCisJ CQlicmVhazsNCisJCWlmIChsYXN0ID09IDAgJiYgaSA+IDApDQorCQkJYnJlYWs7DQorCQlpZiAo bGVhZikNCisJCQltdF9kdW1wX2VudHJ5KG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJ CQkJZmlyc3QsIGxhc3QsIGRlcHRoICsgMSk7DQorCQllbHNlIGlmIChub2RlLT5zbG90W2ldKQ0K KwkJCW10X2R1bXBfbm9kZShtdCwgbXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlm aXJzdCwgbGFzdCwgZGVwdGggKyAxKTsNCisNCisJCWlmIChsYXN0ID09IG1heCkNCisJCQlicmVh azsNCisJCWlmIChsYXN0ID4gbWF4KSB7DQorCQkJcHJfZXJyKCJub2RlICJNQV9QVFIiIGxhc3Qg KCVsdSkgPiBtYXggKCVsdSkgYXQgcGl2b3QgJWQhXG4iLA0KKwkJCQkJbm9kZSwgbGFzdCwgbWF4 LCBpKTsNCisJCQlicmVhazsNCisJCX0NCisJCWZpcnN0ID0gbGFzdCArIDE7DQorCX0NCit9DQor DQorc3RhdGljIHZvaWQgbXRfZHVtcF9hcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAq bXQsIHZvaWQgKmVudHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1h eCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FyYW5nZV82NCAqbm9k ZSA9ICZtdGVfdG9fbm9kZShlbnRyeSktPm1hNjQ7DQorCWJvb2wgbGVhZiA9IG10ZV9pc19sZWFm KGVudHJ5KTsNCisJdW5zaWduZWQgbG9uZyBmaXJzdCA9IG1pbjsNCisJaW50IGk7DQorDQorCXBy X2NvbnQoIiBjb250ZW50czogIik7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9T TE9UUzsgaSsrKQ0KKwkJcHJfY29udCgiJWx1ICIsIG5vZGUtPmdhcFtpXSk7DQorCXByX2NvbnQo InwgJTAyWCAlMDJYfCAiLCBub2RlLT5tZXRhLmVuZCwgbm9kZS0+bWV0YS5nYXApOw0KKwlmb3Ig KGkgPSAwOyBpIDwgTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KE1B X1BUUiIgJWx1ICIsIG5vZGUtPnNsb3RbaV0sIG5vZGUtPnBpdm90W2ldKTsNCisJcHJfY29udChN QV9QVFIiXG4iLCBub2RlLT5zbG90W2ldKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX0FSQU5H RTY0X1NMT1RTOyBpKyspIHsNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlm IChpIDwgKE1BUExFX0FSQU5HRTY0X1NMT1RTIC0gMSkpDQorCQkJbGFzdCA9IG5vZGUtPnBpdm90 W2ldOw0KKwkJZWxzZSBpZiAoIW5vZGUtPnNsb3RbaV0pDQorCQkJYnJlYWs7DQorCQlpZiAobGFz dCA9PSAwICYmIGkgPiAwKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxlYWYpDQorCQkJbXRfZHVtcF9l bnRyeShtdF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0 aCArIDEpOw0KKwkJZWxzZSBpZiAobm9kZS0+c2xvdFtpXSkNCisJCQltdF9kdW1wX25vZGUobXQs IG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJZmlyc3QsIGxhc3QsIGRlcHRoICsg MSk7DQorDQorCQlpZiAobGFzdCA9PSBtYXgpDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA+IG1h eCkgew0KKwkJCXByX2Vycigibm9kZSAiTUFfUFRSIiBsYXN0ICglbHUpID4gbWF4ICglbHUpIGF0 IHBpdm90ICVkIVxuIiwNCisJCQkJCW5vZGUsIGxhc3QsIG1heCwgaSk7DQorCQkJYnJlYWs7DQor CQl9DQorCQlmaXJzdCA9IGxhc3QgKyAxOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1 bXBfbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJdW5z aWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBpbnQgZGVwdGgpDQor ew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKGVudHJ5KTsNCisJdW5z aWduZWQgaW50IHR5cGUgPSBtdGVfbm9kZV90eXBlKGVudHJ5KTsNCisJdW5zaWduZWQgaW50IGk7 DQorDQorCW10X2R1bXBfcmFuZ2UobWluLCBtYXgsIGRlcHRoKTsNCisNCisJcHJfY29udCgibm9k ZSAiTUFfUFRSIiBkZXB0aCAlZCB0eXBlICVkIHBhcmVudCAiTUFfUFRSLCBub2RlLCBkZXB0aCwg dHlwZSwNCisJCQlub2RlID8gbm9kZS0+cGFyZW50IDogTlVMTCk7DQorCXN3aXRjaCAodHlwZSkg ew0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcHJfY29udCgiXG4iKTsNCisJCWZvciAoaSA9IDA7 IGkgPCBNQVBMRV9OT0RFX1NMT1RTOyBpKyspIHsNCisJCQlpZiAobWluICsgaSA+IG1heCkNCisJ CQkJcHJfY29udCgiT1VUIE9GIFJBTkdFOiAiKTsNCisJCQltdF9kdW1wX2VudHJ5KG10X3Nsb3Qo bXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJbWluICsgaSwgbWluICsgaSwgZGVwdGgpOw0KKwkJ fQ0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJY2FzZSBtYXBsZV9yYW5nZV82 NDoNCisJCW10X2R1bXBfcmFuZ2U2NChtdCwgZW50cnksIG1pbiwgbWF4LCBkZXB0aCk7DQorCQli cmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQltdF9kdW1wX2FyYW5nZTY0KG10LCBl bnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0KKw0KKwlkZWZhdWx0Og0KKwkJcHJf Y29udCgiIFVOS05PV04gVFlQRVxuIik7DQorCX0NCit9DQorDQordm9pZCBtdF9kdW1wKGNvbnN0 IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXZvaWQgKmVudHJ5ID0gcmN1X2RlcmVmZXJl bmNlX2NoZWNrKG10LT5tYV9yb290LCBtdF9sb2NrZWQobXQpKTsNCisNCisJcHJfaW5mbygibWFw bGVfdHJlZSgiTUFfUFRSIikgZmxhZ3MgJVgsIGhlaWdodCAldSByb290ICJNQV9QVFIiXG4iLA0K KwkJIG10LCBtdC0+bWFfZmxhZ3MsIG10X2hlaWdodChtdCksIGVudHJ5KTsNCisJaWYgKCF4YV9p c19ub2RlKGVudHJ5KSkNCisJCW10X2R1bXBfZW50cnkoZW50cnksIDAsIDAsIDApOw0KKwllbHNl IGlmIChlbnRyeSkNCisJCW10X2R1bXBfbm9kZShtdCwgZW50cnksIDAsIG10X21heFttdGVfbm9k ZV90eXBlKGVudHJ5KV0sIDApOw0KK30NCisNCisvKg0KKyAqIENhbGN1bGF0ZSB0aGUgbWF4aW11 bSBnYXAgaW4gYSBub2RlIGFuZCBjaGVjayBpZiB0aGF0J3Mgd2hhdCBpcyByZXBvcnRlZCBpbg0K KyAqIHRoZSBwYXJlbnQgKHVubGVzcyByb290KS4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfdmFs aWRhdGVfZ2FwcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9k ZSAqbXRlID0gbWFzLT5ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcF9tbjsNCisJdW5zaWdu ZWQgbG9uZyBnYXAgPSAwLCBtYXhfZ2FwID0gMDsNCisJdW5zaWduZWQgbG9uZyBwX2VuZCwgcF9z dGFydCA9IG1hcy0+bWluOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdDsNCisJdW5zaWduZWQgbG9u ZyAqZ2FwcyA9IE5VTEw7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhtdGVf dG9fbm9kZShtdGUpLCBtdGVfbm9kZV90eXBlKG10ZSkpOw0KKwlpbnQgaTsNCisNCisJaWYgKG1h X2lzX2RlbnNlKG10ZV9ub2RlX3R5cGUobXRlKSkpIHsNCisJCWZvciAoaSA9IDA7IGkgPCBtdF9z bG90X2NvdW50KG10ZSk7IGkrKykgew0KKwkJCWlmIChtYXNfZ2V0X3Nsb3QobWFzLCBpKSkgew0K KwkJCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQorCQkJCWdhcCA9 IDA7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlnYXArKzsNCisJCX0NCisJCWdvdG8gY291 bnRlZDsNCisJfQ0KKw0KKwlnYXBzID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtdGUpLCBtdGVfbm9k ZV90eXBlKG10ZSkpOw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdF9jb3VudChtdGUpOyBpKysp IHsNCisJCXBfZW5kID0gbWFzX2xvZ2ljYWxfcGl2b3QobWFzLCBwaXZvdHMsIGksIG10ZV9ub2Rl X3R5cGUobXRlKSk7DQorDQorCQlpZiAoIWdhcHMpIHsNCisJCQlpZiAobWFzX2dldF9zbG90KG1h cywgaSkpIHsNCisJCQkJZ2FwID0gMDsNCisJCQkJZ290byBub3RfZW1wdHk7DQorCQkJfQ0KKw0K KwkJCWdhcCArPSBwX2VuZCAtIHBfc3RhcnQgKyAxOw0KKwkJfSBlbHNlIHsNCisJCQl2b2lkICpl bnRyeSA9IG1hc19nZXRfc2xvdChtYXMsIGkpOw0KKw0KKwkJCWdhcCA9IGdhcHNbaV07DQorCQkJ aWYgKCFlbnRyeSkgew0KKwkJCQlpZiAoZ2FwICE9IHBfZW5kIC0gcF9zdGFydCArIDEpIHsNCisJ CQkJCXByX2VycihNQV9QVFIiWyV1XSAtPiAiTUFfUFRSIiAlbHUgIT0gJWx1IC0gJWx1ICsgMVxu IiwNCisJCQkJCQltYXNfbW4obWFzKSwgaSwNCisJCQkJCQltYXNfZ2V0X3Nsb3QobWFzLCBpKSwg Z2FwLA0KKwkJCQkJCXBfZW5kLCBwX3N0YXJ0KTsNCisJCQkJCW10X2R1bXAobWFzLT50cmVlKTsN CisNCisJCQkJCU1UX0JVR19PTihtYXMtPnRyZWUsDQorCQkJCQkJZ2FwICE9IHBfZW5kIC0gcF9z dGFydCArIDEpOw0KKwkJCQl9DQorCQkJfSBlbHNlIHsNCisJCQkJaWYgKGdhcCA+IHBfZW5kIC0g cF9zdGFydCArIDEpIHsNCisJCQkJCXByX2VycihNQV9QVFIiWyV1XSAlbHUgPj0gJWx1IC0gJWx1 ICsgMSAoJWx1KVxuIiwNCisJCQkJCW1hc19tbihtYXMpLCBpLCBnYXAsIHBfZW5kLCBwX3N0YXJ0 LA0KKwkJCQkJcF9lbmQgLSBwX3N0YXJ0ICsgMSk7DQorCQkJCQlNVF9CVUdfT04obWFzLT50cmVl LA0KKwkJCQkJCWdhcCA+IHBfZW5kIC0gcF9zdGFydCArIDEpOw0KKwkJCQl9DQorCQkJfQ0KKwkJ fQ0KKw0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCitub3RfZW1w dHk6DQorCQlwX3N0YXJ0ID0gcF9lbmQgKyAxOw0KKwkJaWYgKHBfZW5kID49IG1hcy0+bWF4KQ0K KwkJCWJyZWFrOw0KKwl9DQorDQorY291bnRlZDoNCisJaWYgKG10ZV9pc19yb290KG10ZSkpDQor CQlyZXR1cm47DQorDQorCXBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwlw X21uID0gbXRlX3BhcmVudChtdGUpOw0KKwlNVF9CVUdfT04obWFzLT50cmVlLCBtYXhfZ2FwID4g bWFzLT5tYXgpOw0KKwlpZiAobWFfZ2FwcyhwX21uLCBtYXNfcGFyZW50X2VudW0obWFzLCBtdGUp KVtwX3Nsb3RdICE9IG1heF9nYXApIHsNCisJCXByX2VycigiZ2FwICJNQV9QVFIiWyV1XSAhPSAl bHVcbiIsIHBfbW4sIHBfc2xvdCwgbWF4X2dhcCk7DQorCQltdF9kdW1wKG1hcy0+dHJlZSk7DQor CX0NCisNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCSAgbWFfZ2FwcyhwX21uLCBtYXNfcGFy ZW50X2VudW0obWFzLCBtdGUpKVtwX3Nsb3RdICE9IG1heF9nYXApOw0KK30NCisNCitzdGF0aWMg dm9pZCBtYXNfdmFsaWRhdGVfcGFyZW50X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGU7 DQorCWVudW0gbWFwbGVfdHlwZSBwX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMtPm5v ZGUpOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUp Ow0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCWludCBpOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3Qo bWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJcGFyZW50ID0gbXRlX3BhcmVudChtYXMtPm5v ZGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKHBhcmVudCwgcF90eXBlKTsNCisJTVRfQlVHX09OKG1h cy0+dHJlZSwgbWFzX21uKG1hcykgPT0gcGFyZW50KTsNCisNCisJLyogQ2hlY2sgcHJldi9uZXh0 IHBhcmVudCBzbG90IGZvciBkdXBsaWNhdGUgbm9kZSBlbnRyeSAqLw0KKw0KKwlmb3IgKGkgPSAw OyBpIDwgbXRfc2xvdHNbcF90eXBlXTsgaSsrKSB7DQorCQlub2RlID0gbWFzX3Nsb3QobWFzLCBz bG90cywgaSk7DQorCQlpZiAoaSA9PSBwX3Nsb3QpIHsNCisJCQlpZiAobm9kZSAhPSBtYXMtPm5v ZGUpDQorCQkJCXByX2VycigicGFyZW50ICVwWyV1XSBkb2VzIG5vdCBoYXZlICVwXG4iLA0KKwkJ CQkJcGFyZW50LCBpLCBtYXNfbW4obWFzKSk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbm9k ZSAhPSBtYXMtPm5vZGUpOw0KKwkJfSBlbHNlIGlmIChub2RlID09IG1hcy0+bm9kZSkgew0KKwkJ CXByX2VycigicGFyZW50IGNvbnRhaW5zIGludmFsaWQgY2hpbGQgYXQgIk1BX1BUUiJbJXVdICIN CisJCQkJTUFfUFRSIiBwX3Nsb3QgJXVcbiIsIHBhcmVudCwgaSwgbWFzX21uKG1hcyksIHBfc2xv dCk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbm9kZSA9PSBtYXMtPm5vZGUpOw0KKwkJfQ0K Kwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1hc192YWxpZGF0ZV9jaGlsZF9zbG90KHN0cnVjdCBt YV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBl KG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2Rl KG1hcy0+bm9kZSksIHR5cGUpOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMo bXRlX3RvX25vZGUobWFzLT5ub2RlKSwgdHlwZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqY2hp bGQ7DQorCXVuc2lnbmVkIGNoYXIgaTsNCisNCisJaWYgKG10ZV9pc19sZWFmKG1hcy0+bm9kZSkp DQorCQlyZXR1cm47DQorDQorCWZvciAoaSA9IDA7IGkgPCBtdF9zbG90c1t0eXBlXTsgaSsrKSB7 DQorCQljaGlsZCA9IG1hc19zbG90KG1hcywgc2xvdHMsIGkpOw0KKwkJaWYgKCFwaXZvdHNbaV0g fHwgcGl2b3RzW2ldID09IG1hcy0+bWF4KQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKCFjaGlsZCkN CisJCQlicmVhazsNCisNCisJCWlmIChtdGVfcGFyZW50X3Nsb3QoY2hpbGQpICE9IGkpIHsNCisJ CQlwcl9lcnIoImNoaWxkIGhhcyBpbmNvcnJlY3Qgc2xvdCBhdCAiTUFfUFRSIlsldV0gIg0KKwkJ CQlNQV9QVFIiIGlzIHNldCB0byAldVxuIiwgbWFzX21uKG1hcyksDQorCQkJCWksIG10ZV90b19u b2RlKGNoaWxkKSwgbXRlX3BhcmVudF9zbG90KGNoaWxkKSk7DQorCQkJTVRfQlVHX09OKG1hcy0+ dHJlZSwgMSk7DQorCQl9DQorDQorCQlpZiAobXRlX3BhcmVudChjaGlsZCkgIT0gbXRlX3RvX25v ZGUobWFzLT5ub2RlKSkgew0KKwkJCXByX2VycigiY2hpbGQgIk1BX1BUUiIgaGFzIHBhcmVudCAi TUFfUFRSIiBub3QgIk1BX1BUUiJcbiIsDQorCQkJbXRlX3RvX25vZGUoY2hpbGQpLCBtdGVfcGFy ZW50KGNoaWxkKSwNCisJCQltdGVfdG9fbm9kZShtYXMtPm5vZGUpKTsNCisJCQlNVF9CVUdfT04o bWFzLT50cmVlLCAxKTsNCisJCX0NCisJfQ0KK30NCisNCisvKg0KKyAqIFZhbGlkYXRlIGFsbCBw aXZvdHMgYXJlIHdpdGhpbiBtYXMtPm1pbiBhbmQgbWFzLT5tYXguDQorICovDQorc3RhdGljIHZv aWQgbWFzX3ZhbGlkYXRlX2xpbWl0cyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWludCBp Ow0KKwl1bnNpZ25lZCBsb25nIHByZXZfcGl2ID0gMDsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0g bWFfc2xvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwNCisJCQkJbXRlX25vZGVfdHlwZShtYXMt Pm5vZGUpKTsNCisNCisJLyogYWxsIGxpbWl0cyBhcmUgZmluZSBoZXJlLiAqLw0KKwlpZiAobXRl X2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJZm9yIChpID0gMDsgaSA8IG10 X3Nsb3RfY291bnQobWFzLT5ub2RlKTsgaSsrKSB7DQorCQllbnVtIG1hcGxlX3R5cGUgdHlwZSA9 IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1h X3Bpdm90cyhtYXNfbW4obWFzKSwgdHlwZSk7DQorCQl1bnNpZ25lZCBsb25nIHBpdiA9IG1hc19z YWZlX3Bpdm90KG1hcywgcGl2b3RzLCB0eXBlLCBpKTsNCisNCisJCWlmICghcGl2KQ0KKwkJCWJy ZWFrOw0KKw0KKwkJaWYgKCFtdGVfaXNfbGVhZihtYXMtPm5vZGUpKSB7DQorCQkJdm9pZCAqZW50 cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBpKTsNCisJCQlpZiAoIWVudHJ5KQ0KKwkJCQlwcl9l cnIoTUFfUFRSIlsldV0gY2Fubm90IGJlIG51bGxcbiIsDQorCQkJCSAgICAgICBtYXNfbW4obWFz KSwgaSk7DQorDQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgIWVudHJ5KTsNCisJCX0NCisNCisJ CWlmIChwcmV2X3BpdiA+IHBpdikgew0KKwkJCXByX2VycihNQV9QVFIiWyV1XSBwaXYgJWx1IDwg cHJldl9waXYgJWx1XG4iLA0KKwkJCQltYXNfbW4obWFzKSwgaSwgcGl2LCBwcmV2X3Bpdik7DQor CQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgcGl2IDwgcHJldl9waXYpOw0KKwkJfQ0KKw0KKwkJaWYg KHBpdiA8IG1hcy0+bWluKSB7DQorCQkJcHJfZXJyKE1BX1BUUiJbJXVdICVsdSA8ICVsdVxuIiwg bWFzX21uKG1hcyksIGksDQorCQkJCXBpdiwgbWFzLT5taW4pOw0KKwkJCU1UX0JVR19PTihtYXMt PnRyZWUsIHBpdiA8IG1hcy0+bWluKTsNCisJCX0NCisJCWlmIChwaXYgPiBtYXMtPm1heCkgew0K KwkJCXByX2VycihNQV9QVFIiWyV1XSAlbHUgPiAlbHVcbiIsIG1hc19tbihtYXMpLCBpLA0KKwkJ CQlwaXYsIG1hcy0+bWF4KTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBwaXYgPiBtYXMtPm1h eCk7DQorCQl9DQorCQlwcmV2X3BpdiA9IHBpdjsNCisJCWlmIChwaXYgPT0gbWFzLT5tYXgpDQor CQkJYnJlYWs7DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgbXRfdmFsaWRhdGVfbnVsbHMoc3Ry dWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqZW50cnksICpsYXN0ID0gKHZvaWQgKikx Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJ TUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorDQorCW1hc19zdGFydCgmbWFzKTsNCisJaWYgKG1h c19pc19ub25lKCZtYXMpIHx8IChtYXMubm9kZSA9PSBNQVNfUk9PVCkpDQorCQlyZXR1cm47DQor DQorCXdoaWxlICghbXRlX2lzX2xlYWYobWFzLm5vZGUpKQ0KKwkJbWFzX2Rlc2NlbmQoJm1hcyk7 DQorDQorCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLm5vZGUpLCBtdGVfbm9kZV90 eXBlKG1hcy5ub2RlKSk7DQorCWRvIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3QoJm1hcywgc2xvdHMs IG9mZnNldCk7DQorCQlpZiAoIWxhc3QgJiYgIWVudHJ5KSB7DQorCQkJcHJfZXJyKCJTZXF1ZW50 aWFsIG51bGxzIGVuZCBhdCAlcFsldV1cbiIsDQorCQkJCW1hc19tbigmbWFzKSwgb2Zmc2V0KTsN CisJCX0NCisJCU1UX0JVR19PTihtdCwgIWxhc3QgJiYgIWVudHJ5KTsNCisJCWxhc3QgPSBlbnRy eTsNCisJCWlmIChvZmZzZXQgPT0gbWFzX2RhdGFfZW5kKCZtYXMpKSB7DQorCQkJbWFzX25leHRf bm9kZSgmbWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01BWCk7DQorCQkJaWYgKG1hc19pc19ub25l KCZtYXMpKQ0KKwkJCQlyZXR1cm47DQorCQkJb2Zmc2V0ID0gMDsNCisJCQlzbG90cyA9IG1hX3Ns b3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwNCisJCQkJCSBtdGVfbm9kZV90eXBlKG1hcy5ub2Rl KSk7DQorCQl9IGVsc2UNCisJCQlvZmZzZXQrKzsNCisNCisJfSB3aGlsZSAoIW1hc19pc19ub25l KCZtYXMpKTsNCit9DQorDQorLyoNCisgKiB2YWxpZGF0ZSBhIG1hcGxlIHRyZWUgYnkgY2hlY2tp bmc6DQorICogMS4gVGhlIGxpbWl0cyAocGl2b3RzIGFyZSB3aXRoaW4gbWFzLT5taW4gdG8gbWFz LT5tYXgpDQorICogMi4gVGhlIGdhcCBpcyBjb3JyZWN0bHkgc2V0IGluIHRoZSBwYXJlbnRzDQor ICovDQordm9pZCBtdF92YWxpZGF0ZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl1bnNp Z25lZCBjaGFyIGVuZDsNCisNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorCXJjdV9yZWFk X2xvY2soKTsNCisJbWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAoIW1hc19zZWFyY2hhYmxlKCZtYXMp KQ0KKwkJZ290byBkb25lOw0KKw0KKwltYXNfZmlyc3RfZW50cnkoJm1hcywgbWFzX21uKCZtYXMp LCBVTE9OR19NQVgsIG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpKTsNCisJd2hpbGUgKCFtYXNfaXNf bm9uZSgmbWFzKSkgew0KKwkJTVRfQlVHX09OKG1hcy50cmVlLCBtdGVfZGVhZF9ub2RlKG1hcy5u b2RlKSk7DQorCQlpZiAoIW10ZV9pc19yb290KG1hcy5ub2RlKSkgew0KKwkJCWVuZCA9IG1hc19k YXRhX2VuZCgmbWFzKTsNCisJCQlpZiAoKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1hcy5ub2Rl KSkgJiYNCisJCQkgICAgKG1hcy5tYXggIT0gVUxPTkdfTUFYKSkgew0KKwkJCQlwcl9lcnIoIklu dmFsaWQgc2l6ZSAldSBvZiAiTUFfUFRSIlxuIiwgZW5kLA0KKwkJCQltYXNfbW4oJm1hcykpOw0K KwkJCQlNVF9CVUdfT04obWFzLnRyZWUsIDEpOw0KKwkJCX0NCisNCisJCX0NCisJCW1hc192YWxp ZGF0ZV9wYXJlbnRfc2xvdCgmbWFzKTsNCisJCW1hc192YWxpZGF0ZV9jaGlsZF9zbG90KCZtYXMp Ow0KKwkJbWFzX3ZhbGlkYXRlX2xpbWl0cygmbWFzKTsNCisJCWlmIChtdF9pc19hbGxvYyhtdCkp DQorCQkJbWFzX3ZhbGlkYXRlX2dhcHMoJm1hcyk7DQorCQltYXNfZGZzX3Bvc3RvcmRlcigmbWFz LCBVTE9OR19NQVgpOw0KKwl9DQorCW10X3ZhbGlkYXRlX251bGxzKG10KTsNCitkb25lOg0KKwly Y3VfcmVhZF91bmxvY2soKTsNCisNCit9DQorDQorI2VuZGlmIC8qIENPTkZJR19ERUJVR19NQVBM RV9UUkVFICovDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25v cmUgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZQ0KaW5kZXggZDk3MTUxNjQw MWU2Li5jOTAxZDk2ZGQwMTMgMTAwNjQ0DQotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUv LmdpdGlnbm9yZQ0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUNCkBA IC02LDMgKzYsNSBAQCBtYWluDQogbXVsdGlvcmRlcg0KIHJhZGl4LXRyZWUuYw0KIHhhcnJheQ0K K21hcGxlDQorbWFfeGFfYmVuY2htYXJrDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRp eC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dl bmVyYXRlZC9hdXRvY29uZi5oDQppbmRleCAyMjE4YjNjYzE4NGUuLmU3ZGE4MDM1MDIzNiAxMDA2 NDQNCi0tLSBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaA0K KysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oDQpAQCAt MSArMSwyIEBADQogI2RlZmluZSBDT05GSUdfWEFSUkFZX01VTFRJIDENCisjZGVmaW5lIENPTkZJ R182NEJJVCAxDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21h cGxlX3RyZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgN Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjg5ZjU2MWU2ODg0MQ0K LS0tIC9kZXYvbnVsbA0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxl X3RyZWUuaA0KQEAgLTAsMCArMSw3IEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjArICovDQorI2RlZmluZSBhdG9taWNfdCBpbnQzMl90DQorI2luY2x1ZGUgIi4uLy4uLy4u Ly4uL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oIg0KKyNkZWZpbmUgYXRvbWljX2luYyh4KSB1 YXRvbWljX2luYyh4KQ0KKyNkZWZpbmUgYXRvbWljX3JlYWQoeCkgdWF0b21pY19yZWFkKHgpDQor I2RlZmluZSBhdG9taWNfc2V0KHgsIHkpIGRvIHt9IHdoaWxlKDApDQorI2RlZmluZSBVOF9NQVgg VUNIQVJfTUFYDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMg Yi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQN CmluZGV4IDAwMDAwMDAwMDAwMC4uMzUwODI2NzE5MjhhDQotLS0gL2Rldi9udWxsDQorKysgYi90 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KQEAgLTAsMCArMSw1OSBAQA0KKy8vIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKw0KKy8qDQorICogbWFwbGVfdHJlZS5jOiBV c2Vyc3BhY2Ugc2hpbSBmb3IgbWFwbGUgdHJlZSB0ZXN0LXN1aXRlDQorICogQ29weXJpZ2h0IChj KSAyMDE4IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQorICovDQor DQorI2RlZmluZSBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KKyNkZWZpbmUgQ09ORklHX01BUExF X1NFQVJDSA0KKyNpbmNsdWRlICJ0ZXN0LmgiDQorDQorI2RlZmluZSBtb2R1bGVfaW5pdCh4KQ0K KyNkZWZpbmUgbW9kdWxlX2V4aXQoeCkNCisjZGVmaW5lIE1PRFVMRV9BVVRIT1IoeCkNCisjZGVm aW5lIE1PRFVMRV9MSUNFTlNFKHgpDQorI2RlZmluZSBkdW1wX3N0YWNrKCkJYXNzZXJ0KDApDQor DQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi9tYXBsZV90cmVlLmMiDQorI3VuZGVmIENPTkZJR19E RUJVR19NQVBMRV9UUkVFDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi90ZXN0X21hcGxlX3RyZWUu YyINCisNCit2b2lkIGZhcm1lcl90ZXN0cyh2b2lkKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUg Km5vZGU7DQorCURFRklORV9NVFJFRSh0cmVlKTsNCisNCisJbXRfZHVtcCgmdHJlZSk7DQorDQor CXRyZWUubWFfcm9vdCA9IHhhX21rX3ZhbHVlKDApOw0KKwltdF9kdW1wKCZ0cmVlKTsNCisNCisJ bm9kZSA9IG10X2FsbG9jX29uZShHRlBfS0VSTkVMKTsNCisJbm9kZS0+cGFyZW50ID0gKHZvaWQg KikoKHVuc2lnbmVkIGxvbmcpKCZ0cmVlKSB8IDEpOw0KKwlub2RlLT5zbG90WzBdID0geGFfbWtf dmFsdWUoMCk7DQorCW5vZGUtPnNsb3RbMV0gPSB4YV9ta192YWx1ZSgxKTsNCisJbm9kZS0+bXI2 NC5waXZvdFswXSA9IDA7DQorCW5vZGUtPm1yNjQucGl2b3RbMV0gPSAxOw0KKwlub2RlLT5tcjY0 LnBpdm90WzJdID0gMDsNCisJdHJlZS5tYV9yb290ID0gbXRfbWtfbm9kZShub2RlLCBtYXBsZV9s ZWFmXzY0KTsNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCW1hX2ZyZWVfcmN1KG5vZGUpOw0KK30N CisNCit2b2lkIG1hcGxlX3RyZWVfdGVzdHModm9pZCkNCit7DQorCWZhcm1lcl90ZXN0cygpOw0K KwltYXBsZV90cmVlX3NlZWQoKTsNCisJbWFwbGVfdHJlZV9oYXJ2ZXN0KCk7DQorfQ0KKw0KK2lu dCBfX3dlYWsgbWFpbih2b2lkKQ0KK3sNCisJbWFwbGVfdHJlZV9pbml0KCk7DQorCW1hcGxlX3Ry ZWVfdGVzdHMoKTsNCisJcmN1X2JhcnJpZXIoKTsNCisJaWYgKG5yX2FsbG9jYXRlZCkNCisJCXBy aW50ZigibnJfYWxsb2NhdGVkID0gJWRcbiIsIG5yX2FsbG9jYXRlZCk7DQorCXJldHVybiAwOw0K K30NCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21h cGxlX3RyZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVf dHJlZS5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi5lNjUzZDAy MzY2M2INCi0tLSAvZGV2L251bGwNCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFj ZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDMgQEANCisjZGVmaW5lIHRyYWNlX21h X29wKGEsIGIpIGRvIHt9IHdoaWxlKDApOw0KKyNkZWZpbmUgdHJhY2VfbWFfcmVhZChhLCBiKSBk byB7fSB3aGlsZSgwKTsNCisjZGVmaW5lIHRyYWNlX21hX3dyaXRlKGEsIGIsIGMsIGQpIGRvIHt9 IHdoaWxlKDApOw0KLS0gDQoyLjM1LjENCg==