From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 171FCC32774 for ; Mon, 22 Aug 2022 15:04:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235465AbiHVPEF (ORCPT ); Mon, 22 Aug 2022 11:04:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52352 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235948AbiHVPDw (ORCPT ); Mon, 22 Aug 2022 11:03:52 -0400 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DC46B85 for ; Mon, 22 Aug 2022 08:03:33 -0700 (PDT) Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 27MEpjiH016581; Mon, 22 Aug 2022 15:03:12 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2022-7-12; bh=y1HMrLZs4p2r8ax835dFGvXnUvP/k1MW1sQQYQ3anDI=; b=cUM97ZI6q/O4M3nEahHEUHwGKb0gY9tovFJDPJVP96XHQJZTDbxe4OC/jKSxNvu31TFr 9WoC42tDh5VC8c1dnWq866J7rrzsws6+Jhy/ZwBzFXGlfEviU11QCD45QyF38xF5aiUU O1w0zJ8/IumSa03NUNT2WyqY24DFwgG+SzosPMgV+pzJcnbGNyV01sULmj4cxfJS2Fz6 5gOD/9xeNkbsOYMEmmxTVfjKe6quioJuJyCKNJMefBscUhXWkGw5sYcUfeN941lIE3tX P5aIPj2AKWW18RaBiBtgp6MvV7KlXmThzCGyvahuQbhGnv2xJDP2vOnsV0rv1w403JWj Qg== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3j4bx68173-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 22 Aug 2022 15:03:11 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 27ME4Ofe005191; Mon, 22 Aug 2022 15:03:10 GMT Received: from nam04-mw2-obe.outbound.protection.outlook.com (mail-mw2nam04lp2171.outbound.protection.outlook.com [104.47.73.171]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3j3mn3tuaf-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 22 Aug 2022 15:03:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nCt2bIsFmY9pvyFIRTTXMOFVAx341T4YHTROWiVe/s5esZy9nsPLFipqhkTz7E8rym1wa1Atb3Uq5Pc7kWrno7YsX+PGyg7tKj37sV2yqLjHqiBqA4M+Wk+5g2BMBk4NZNuYFQ1fE+jhNU6/nk8VwEdxVyCmuv63cJY3bWTtmHKOtSuoxQfjQd/O6ozhvPT9o0yySMMbMZMbS0JeNHGP7N/p/aUwFyyr0nK6y/IpL/kGh8WxQjHdwPcQzFZkk7mzXCqPzp72Ml7xbl9WFSwe56AQg5Z2/BgwauCR8bZrYZ8+S2AR5XqDHPlMBtBSX53kh5OvZ79Vk0tzwqRuduH+fw== 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=y1HMrLZs4p2r8ax835dFGvXnUvP/k1MW1sQQYQ3anDI=; b=AS4M1krKxApdp0xaj9QDWkUN3N2Ci7SGKt8NfHoWQNRabUcBQgzOyXwKG7s+tOEmSn68iCIfm9MHvNDm0zrxIYE3j1xPGmtfHW/BwieT36k4i5HaSpNS7E96z2Sakr6FFgJGMhObIklRUqNNGiW+Xgy4fnhvzJXPkol6wvC5UoLuas2PukFVav+jq9NeEl2W5A7IpNfajbeq+NekkS/bPBpfJ/GDhJHpuLnByquNax5ND58LfK3iu6nvyQxm9+AOIH1SAqp+TUbkedXipk4enZbcKFEpJ1CMPMRZAl6RU+95Mz1aCc7WtW0rIi8XkosNv1io9CeFf1qOuf5HUCjj2Q== 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=y1HMrLZs4p2r8ax835dFGvXnUvP/k1MW1sQQYQ3anDI=; b=Uh2EUMBSpDhZ9eju4RIaulW82kQSL1H2goXj761QkqAY2aN47kqil0Q++OPW2kxuHPRtkcE4KZ74IY0WWGoIgLJiIdx+2kXfcRwkoWBJ2FmwD0cY4zLkIMHhF8lGtW9CXPYrvv/Fzpv3832pumfFRFcpuxjqAazdNMMsh2F7z98= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by BN8PR10MB3506.namprd10.prod.outlook.com (2603:10b6:408:ad::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5546.21; Mon, 22 Aug 2022 15:02:08 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::3d34:ebb5:d9df:98b3]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::3d34:ebb5:d9df:98b3%5]) with mapi id 15.20.5546.023; Mon, 22 Aug 2022 15:02:08 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton CC: Liam Howlett , Liam Howlett , Matthew Wilcox , David Howells , Sven Schnelle Subject: [PATCH v13 01/70] Maple Tree: add new data structure Thread-Topic: [PATCH v13 01/70] Maple Tree: add new data structure Thread-Index: AQHYtjgmwalEUnHvk0y+Hw61HFL5Gg== Date: Mon, 22 Aug 2022 15:02:08 +0000 Message-ID: <20220822150128.1562046-2-Liam.Howlett@oracle.com> References: <20220822150128.1562046-1-Liam.Howlett@oracle.com> In-Reply-To: <20220822150128.1562046-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: e7ed1c50-4073-4c0d-a988-08da844f4896 x-ms-traffictypediagnostic: BN8PR10MB3506:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: hodaoLAlaSiQu2EQO5qizgl0JnrzCKQHF2TKTyEUWZnB85cCGm4/f4U9e/ZdgBotVrTMTI3TcSjoo4JwoxoYVDuxUcZNGHV4wd4LBEov10nwDNHdamqTIBT5nfNojGQJZUZDoCzawmBuDuIkakKXaTZlxpZvppSf79bMWAi4AwvFY6K86Q7Afp3mub54rNtSqTHHZKT7vBEaVOb8/5dZl7iokWD5g4cNHiSBrdRB6LT3Gb4TSLsfArW8WojLBePS7aSstoFfsEMqUgSwpi3O4vXHYtOkQqNv1milNXw0Op1gKnla2vNdKZO5MXUxDbLVCX6weoNmMX3GGrUv5WSHGS0Q6npNjzRXh+6wEHX7OFus5IPrmXxeTyC6U06leAKbOq91nVQZKmyYs39dOPrebnl1jDX1YsN+aKtW3eVSMFQTehxSEW/Zsj0KaCJjq/ZbVNk4AMyttMaH8cpc7BBKj7iFBKeSEZPkxQvUq0FldcrxueRAZNK9dZtZnfyhZIgdyEbP8EiBKQdIT6r0c4APVGtjL4e8dC0+P+k8kwyDMOeuqUJtu0Ov8VkGTieoAXQlf9ArHLhft31eNUGBFpdNFyc3bVRDYlhLIGXzELn1nrdhWwwPNR4/00iis+f7Z4JUak5Y1sFT3wcdmqY6jpndzX9E3PlEVEoeV3+b3gyZsAuBLXblgQvJo6oqx11soCx794G5fezuQblOzHIzCnglZeQfZHxbvT3uCg2eWNPiD1rxAZKme27FAx7A8ohnx6KeHVn65/1UZSSM0SpxkaJrSKHlKcOIasKGxOu70CCoa/hNIcJ8VyyTyxRtzwYv3SSvia2JrXoJBvRqTTA5pstC7SFbODGjqXoD+hjLtBi+zgg= 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:(13230016)(376002)(346002)(39860400002)(396003)(366004)(136003)(38070700005)(83380400001)(38100700002)(66556008)(36756003)(66446008)(122000001)(66476007)(8676002)(4326008)(64756008)(66946007)(76116006)(71200400001)(91956017)(8936002)(26005)(6512007)(5660300002)(30864003)(44832011)(6506007)(478600001)(6486002)(316002)(54906003)(110136005)(41300700001)(86362001)(1076003)(186003)(2906002)(2616005)(966005)(559001)(579004)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?STNCSlRSZ25lRHRpNXFTMjJwZCtDdVZyMjVuMURDb1pDOUVRS3oyNHFhMG5J?= =?utf-8?B?YTdxZnVDODFQSU5RcHhYWmhXMG0xNUM2a3FCUDNQekNsdVgreXJDY2FaMlhK?= =?utf-8?B?ZWtvMVNPTjJLNVpLNURiRFgra2xtRW1XWTNzbE9vYVlWRFEyYllTTjc2VnBs?= =?utf-8?B?Q2VUdXoyb2RqTEJ4QVBMSXh6ai9Odndmb3lqTlhBdlNzWDNMTi81REE4V3E5?= =?utf-8?B?YzRNZ2k5Tm1xV1VUY2o3S2VOb2xTOTZmTGpsVm9nakwzSWVZTjRabEtFMFE5?= =?utf-8?B?VDRvdFZtZlR2U1dVYTF0elNvR3BKT1dqbklVWW5MUUlRLzRGT0ZZdHhwRFhY?= =?utf-8?B?NkZBQk1OR1pTWkYwMmt0RHNhY1FIc3c2V2orQ2JXTWl3ZzYvTmY0MDkwU0dB?= =?utf-8?B?WGVubmtlaUEwM3QwbFkvQW00WGR2bFRUaXd3cnhJejg4a0t6U3FMaHJIUkpq?= =?utf-8?B?NzRtbVhma042ZXNzVzBJVjhSNFo2Z3ZIcGpXQkZqSHB6SDZoSDhWNzg3bW5t?= =?utf-8?B?c2RrUlQ2QjloMlhoZFc2ODVTOHNuQkgwazRrT1NUMlJOT2dqdXo4R0pvOVJ2?= =?utf-8?B?YnlFU2dFQUR1QnZhQ3I2SG91V2ovUVREaWJUUm5qMTNIekhoeTRIMFpuQ2Vv?= =?utf-8?B?T2l2UlMwU3EwKy9sRU1Zd3R0T2xLTDNUQ2VFNmMxZkVUL2RRc3JLVWlUVmFi?= =?utf-8?B?Y0N3aEFIcXdjQW01cnJMY1ZYTzZQd0J3UGlWdzZ2bFJsRTBkZktiNWgxSmta?= =?utf-8?B?ejdyT2xMblh3RWExbEZubFRmNmdnSDIvYUJEVDdrN3JDaHc1TDhrOG1ycVR6?= =?utf-8?B?R2luLzh5RkNqbkJMVUNMbmsxZC9lV1JmbzJDSVlmbnJkbHAwditIb2xRZlpl?= =?utf-8?B?RWltNWV4eGFyMkMwUVNzcjhBR25XdlRlNTE2bEVZWDdrY3grYk9pUUxmdHVG?= =?utf-8?B?MGU1c3NVWm94dVBEVThvaWcxRWRCcnVmWEk3TE4wSENVQWd4TC93R0pISngz?= =?utf-8?B?Tk9vMTM1cjV1M0tMSjk2a3JjTG5raFhBdjR6U1RZU1BXV1ZGdXlGMURTcXRl?= =?utf-8?B?RlFVemg5bExtYUZIQXlzYXhQT1BQN2xFdENJRWMvaWNoTHJETW1oanY2OFEz?= =?utf-8?B?UUFMNlUzUWhHVWtyRFBWWXJrbEN3ZU9VemV3QmkrV0p6SjB5MFAvRGhVeHk4?= =?utf-8?B?YzFvM3BsTDdXakQyb20xV05PSnpBT2dmZzFacDZHNmFFa1lyTWRqTVBGVGVp?= =?utf-8?B?c0ZVUkthb1J6bnorN1RmKzdIOEtkTnN6c01USitUSSt3RG9NYzlHLzRFRWc2?= =?utf-8?B?bG9rZUsveFFuaGpwM0ViM0JtS2M5dEZOV0NGMnZRT0hWRmVIMVZCeGozR2V2?= =?utf-8?B?akM5Q1ZzdDNIQlBPRXp5aldJZ1FUOW9nVk9WcEZVNnI1VnBhQTlDUHRGanRG?= =?utf-8?B?UzVTdk5zU1RPUVR0L3o2dUtWaGg3R0pzbTJrVkcyc0kyaUJHTUF1ekpHQ2tk?= =?utf-8?B?VUl5K213bFhDNURCWkV6QnFROE5DRTY5VTNZVStxWWNSOXR5SVJqWklPRCts?= =?utf-8?B?TG9peDQ5ZGkvdnRWaHp2OFBnR3c2K0NOL2pGZU4vSVRmeDRtSldtU2lSdDRV?= =?utf-8?B?UUorVTM4WjN1blhHNkVsaDk3ZjF3dk9Qby96ZXRia0JoaWs3U0pkZkxRTjBC?= =?utf-8?B?Qm9PTXMxSndyYmg3VnROeFYwN2JqSVRXNDFDbjNnV25GbUNYektiMUdyN2V5?= =?utf-8?B?NkIrelhYUkR3RWdFbE9XcDFXOGdidEE4eUtVQXI5TU1qYmE1dWpoalVKQlRK?= =?utf-8?B?Y0MwWDlMZW5yckVoOVhCRU1UTzV0RGl2anNCWVpZazZUdmxWN3FtNENWWkRX?= =?utf-8?B?ekxSaFRnWUpzTFNPK1FPM2dwVEp0YytqdWplbUl5RHJtM1ZIVFpTWWZuZXNM?= =?utf-8?B?OEg4dnhNTExMZ2dGMmVKT3gxeUhmSFVyMlFzdnR5NkxsYkl3MUpkRnRnV3M5?= =?utf-8?B?Q2QzN3ZVWXRjRTR3STZncFlqYnRyaEcvVEFmbU5GUnR2ajJYTEFkSGtFU2F3?= =?utf-8?B?bTlXRGF6T1NZZ0JBWGdTeC9qdTUxSGZxMktmNWhwbFBpV1VYVzBoajhvWnY0?= =?utf-8?B?bGk5U2tpdSs1QTZseFVaNy80dm10bHRkUW5HMEhnMlFBWFpMek1JeFZnNUNy?= =?utf-8?B?RkE9PQ==?= Content-Type: text/plain; charset="utf-8" Content-ID: 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: e7ed1c50-4073-4c0d-a988-08da844f4896 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Aug 2022 15:02:08.0993 (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: IbO6CDv0jdlPoHBeNoqH8wC441EEj2jF+VRMGaZZzIerv4v2CU8lvMzko8oROS1RMaJKZLD0d696ePoFd0JKpQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN8PR10MB3506 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-08-22_09,2022-08-22_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxlogscore=999 phishscore=0 mlxscore=0 adultscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2207270000 definitions=main-2208220064 X-Proofpoint-ORIG-GUID: 4kSENACz0pfNaI-0Ce1aD_Sg8USyGy1f X-Proofpoint-GUID: 4kSENACz0pfNaI-0Ce1aD_Sg8USyGy1f Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpQYXRj aCBzZXJpZXMgIkludHJvZHVjaW5nIHRoZSBNYXBsZSBUcmVlIg0KDQpUaGUgbWFwbGUgdHJlZSBp cyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8gdXNlIG1vZGVybg0K cHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHBsYWNl cyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdlLWJhc2VkIHRyZWUg d291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBzaW1wbGUgaW50ZXJm YWNlLiAgSWYgeW91IHVzZSBhbiByYnRyZWUgd2l0aCBvdGhlciBkYXRhDQpzdHJ1Y3R1cmVzIHRv IGltcHJvdmUgcGVyZm9ybWFuY2Ugb3IgYW4gaW50ZXJ2YWwgdHJlZSB0byB0cmFjaw0Kbm9uLW92 ZXJsYXBwaW5nIHJhbmdlcywgdGhlbiB0aGlzIGlzIGZvciB5b3UuDQoNClRoZSB0cmVlIGhhcyBh IGJyYW5jaGluZyBmYWN0b3Igb2YgMTAgZm9yIG5vbi1sZWFmIG5vZGVzIGFuZCAxNiBmb3IgbGVh Zg0Kbm9kZXMuICBXaXRoIHRoZSBpbmNyZWFzZWQgYnJhbmNoaW5nIGZhY3RvciwgaXQgaXMgc2ln bmlmaWNhbnRseSBzaG9ydGVyDQp0aGFuIHRoZSByYnRyZWUgc28gaXQgaGFzIGZld2VyIGNhY2hl IG1pc3Nlcy4gIFRoZSByZW1vdmFsIG9mIHRoZSBsaW5rZWQNCmxpc3QgYmV0d2VlbiBzdWJzZXF1 ZW50IGVudHJpZXMgYWxzbyByZWR1Y2VzIHRoZSBjYWNoZSBtaXNzZXMgYW5kIHRoZSBuZWVkDQp0 byBwdWxsIGluIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBWTUEgZHVyaW5nIG1hbnkgdHJlZSBhbHRl cmF0aW9ucy4NCg0KVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMgcGF0Y2gg c2V0IGlzIHRoZSB2bV9hcmVhX3N0cnVjdCwNCndoZXJlIHRocmVlIGRhdGEgc3RydWN0dXJlcyBh cmUgcmVwbGFjZWQgYnkgdGhlIG1hcGxlIHRyZWU6IHRoZSBhdWdtZW50ZWQNCnJidHJlZSwgdGhl IHZtYSBjYWNoZSwgYW5kIHRoZSBsaW5rZWQgbGlzdCBvZiBWTUFzIGluIHRoZSBtbV9zdHJ1Y3Qu ICBUaGUNCmxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZSBvciByZW1vdmUgdGhlIG1tYXBfbG9j ayBjb250ZW50aW9uLg0KDQpUaGUgcGxhbiBpcyB0byBnZXQgdG8gdGhlIHBvaW50IHdoZXJlIHdl IHVzZSB0aGUgbWFwbGUgdHJlZSBpbiBSQ1UgbW9kZS4NClJlYWRlcnMgd2lsbCBub3QgYmxvY2sg Zm9yIHdyaXRlcnMuICBBIHNpbmdsZSB3cml0ZSBvcGVyYXRpb24gd2lsbCBiZQ0KYWxsb3dlZCBh dCBhIHRpbWUuICBBIHJlYWRlciByZS13YWxrcyBpZiBzdGFsZSBkYXRhIGlzIGVuY291bnRlcmVk LiAgVk1Bcw0Kd291bGQgYmUgUkNVIGVuYWJsZWQgYW5kIHRoaXMgbW9kZSB3b3VsZCBiZSBlbnRl cmVkIG9uY2UgbXVsdGlwbGUgdGFza3MNCmFyZSB1c2luZyB0aGUgbW1fc3RydWN0Lg0KDQpEYXZp ZGxvciBzYWlkDQoNCjogWWVzIEkgbGlrZSB0aGUgbWFwbGUgdHJlZSwgYW5kIGF0IHRoaXMgc3Rh Z2UgSSBkb24ndCB0aGluayB3ZSBjYW4gYXNrIGZvcg0KOiBtb3JlIGZyb20gdGhpcyBzZXJpZXMg d3J0IHRoZSBNTSAtIGFsYmVpdCB0aGVyZSBzZWVtcyB0byBzdGlsbCBiZSBzb21lDQo6IGZvbGtz IHJlcG9ydGluZyBicmVha2FnZS4gIEZ1bmRhbWVudGFsbHkgSSBzZWUgTGlhbSdzIHdvcmsgdG8g KHJlKW1vdmUNCjogY29tcGxleGl0eSBvdXQgb2YgdGhlIE1NIChub3QgdG8gc2F5IHRoYXQgdGhl IGFjdHVhbCBtYXBsZSB0cmVlIGlzIG5vdA0KOiBjb21wbGV4KSBieSBjb25zb2xpZGF0aW5nIHRo ZSB0aHJlZSBjb21wbGltZW50YXJ5IGRhdGEgc3RydWN0dXJlcyB2ZXJ5DQo6IG11Y2ggd29ydGgg aXQgY29uc2lkZXJpbmcgcGVyZm9ybWFuY2UgZG9lcyBub3QgdGFrZSBhIGhpdC4gIFRoaXMgd2Fz IHZlcnkNCjogbXVjaCBhIHR1cm4gb2ZmIHdpdGggdGhlIHJhbmdlIGxvY2tpbmcgYXBwcm9hY2gs IHdoaWNoIHdvcnN0IGNhc2Ugc2NlbmFyaW8NCjogaW5jdXJyZWQgaW4gcHJvaGliaXRpdmUgb3Zl cmhlYWQuICBBbHNvIGFzIExpYW0gYW5kIE1hdHRoZXcgaGF2ZQ0KOiBtZW50aW9uZWQsIFJDVSBv cGVucyB1cCBhIGxvdCBvZiBuaWNlIHBlcmZvcm1hbmNlIG9wcG9ydHVuaXRpZXMsIGFuZCBpbg0K OiBhZGRpdGlvbiBhY2FkZW1pYVsxXSBoYXMgc2hvd24gb3V0c3RhbmRpbmcgc2NhbGFiaWxpdHkg b2YgYWRkcmVzcyBzcGFjZXMNCjogd2l0aCB0aGUgZm91bmRhdGlvbiBvZiByZXBsYWNpbmcgdGhl IGxvY2tlZCByYnRyZWUgd2l0aCBSQ1UgYXdhcmUgdHJlZXMuDQoNCkEgc2ltaWxhciB3b3JrIGhh cyBiZWVuIGRpc2NvdmVyZWQgaW4gdGhlIGFjYWRlbWljIHByZXNzDQoNCglodHRwczovL3Bkb3Mu Y3NhaWwubWl0LmVkdS9wYXBlcnMvcmN1dm06YXNwbG9zMTIucGRmDQoNClNoZWVyIGNvaW5jaWRl bmNlLiAgV2UgZGVzaWduZWQgb3VyIHRyZWUgd2l0aCB0aGUgaW50ZW50aW9uIG9mIHNvbHZpbmcg dGhlDQpoYXJkZXN0IHByb2JsZW0gZmlyc3QuICBVcG9uIHNldHRsaW5nIG9uIGEgYi10cmVlIHZh cmlhbnQgYW5kIGEgcm91Z2gNCm91dGxpbmUsIHdlIHJlc2VhcmNoZWQgcmFuZ2VkIGJhc2VkIGIt dHJlZXMgYW5kIFJDVSBiLXRyZWVzIGFuZCBkaWQgZmluZA0KdGhhdCBhcnRpY2xlLiAgU28gaXQg d2FzIG5pY2UgdG8gZmluZCByZWFzc3VyYW5jZXMgdGhhdCB3ZSB3ZXJlIG9uIHRoZQ0KcmlnaHQg cGF0aCwgYnV0IG91ciBkZXNpZ24gY2hvaWNlIG9mIHVzaW5nIHJhbmdlcyBtYWRlIHRoYXQgcGFw ZXIgdW51c2FibGUNCmZvciB1cy4NCg0KVGhpcyBwYXRjaCAob2YgNzApOg0KDQpUaGUgbWFwbGUg dHJlZSBpcyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8gdXNlIG1v ZGVybg0KcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9m IHBsYWNlcyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdlLWJhc2Vk IHRyZWUgd291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBzaW1wbGUg aW50ZXJmYWNlLiAgSWYgeW91IHVzZSBhbiByYnRyZWUgd2l0aCBvdGhlciBkYXRhDQpzdHJ1Y3R1 cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb3IgYW4gaW50ZXJ2YWwgdHJlZSB0byB0cmFjaw0K bm9uLW92ZXJsYXBwaW5nIHJhbmdlcywgdGhlbiB0aGlzIGlzIGZvciB5b3UuDQoNClRoZSB0cmVl IGhhcyBhIGJyYW5jaGluZyBmYWN0b3Igb2YgMTAgZm9yIG5vbi1sZWFmIG5vZGVzIGFuZCAxNiBm b3IgbGVhZg0Kbm9kZXMuICBXaXRoIHRoZSBpbmNyZWFzZWQgYnJhbmNoaW5nIGZhY3RvciwgaXQg aXMgc2lnbmlmaWNhbnRseSBzaG9ydGVyDQp0aGFuIHRoZSByYnRyZWUgc28gaXQgaGFzIGZld2Vy IGNhY2hlIG1pc3Nlcy4gIFRoZSByZW1vdmFsIG9mIHRoZSBsaW5rZWQNCmxpc3QgYmV0d2VlbiBz dWJzZXF1ZW50IGVudHJpZXMgYWxzbyByZWR1Y2VzIHRoZSBjYWNoZSBtaXNzZXMgYW5kIHRoZSBu ZWVkDQp0byBwdWxsIGluIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBWTUEgZHVyaW5nIG1hbnkgdHJl ZSBhbHRlcmF0aW9ucy4NCg0KVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMg cGF0Y2ggc2V0IGlzIHRoZSB2bV9hcmVhX3N0cnVjdCwNCndoZXJlIHRocmVlIGRhdGEgc3RydWN0 dXJlcyBhcmUgcmVwbGFjZWQgYnkgdGhlIG1hcGxlIHRyZWU6IHRoZSBhdWdtZW50ZWQNCnJidHJl ZSwgdGhlIHZtYSBjYWNoZSwgYW5kIHRoZSBsaW5rZWQgbGlzdCBvZiBWTUFzIGluIHRoZSBtbV9z dHJ1Y3QuICBUaGUNCmxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZSBvciByZW1vdmUgdGhlIG1t YXBfbG9jayBjb250ZW50aW9uLg0KDQpUaGUgcGxhbiBpcyB0byBnZXQgdG8gdGhlIHBvaW50IHdo ZXJlIHdlIHVzZSB0aGUgbWFwbGUgdHJlZSBpbiBSQ1UgbW9kZS4NClJlYWRlcnMgd2lsbCBub3Qg YmxvY2sgZm9yIHdyaXRlcnMuICBBIHNpbmdsZSB3cml0ZSBvcGVyYXRpb24gd2lsbCBiZQ0KYWxs b3dlZCBhdCBhIHRpbWUuICBBIHJlYWRlciByZS13YWxrcyBpZiBzdGFsZSBkYXRhIGlzIGVuY291 bnRlcmVkLiAgVk1Bcw0Kd291bGQgYmUgUkNVIGVuYWJsZWQgYW5kIHRoaXMgbW9kZSB3b3VsZCBi ZSBlbnRlcmVkIG9uY2UgbXVsdGlwbGUgdGFza3MNCmFyZSB1c2luZyB0aGUgbW1fc3RydWN0Lg0K DQpTaWduZWQtb2ZmLWJ5OiBMaWFtIFIuIEhvd2xldHQgPExpYW0uSG93bGV0dEBvcmFjbGUuY29t Pg0KU2lnbmVkLW9mZi1ieTogTWF0dGhldyBXaWxjb3ggKE9yYWNsZSkgPHdpbGx5QGluZnJhZGVh ZC5vcmc+DQpUZXN0ZWQtYnk6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+DQpU ZXN0ZWQtYnk6IFN2ZW4gU2NobmVsbGUgPHN2ZW5zQGxpbnV4LmlibS5jb20+DQotLS0NCiBEb2N1 bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4LnJzdCAgICAgICAgICAgICAgfCAgICAxICsNCiBEb2N1 bWVudGF0aW9uL2NvcmUtYXBpL21hcGxlX3RyZWUucnN0ICAgICAgICAgfCAgMjE3ICsNCiBNQUlO VEFJTkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEyICsNCiBpbmNs dWRlL2xpbnV4L21hcGxlX3RyZWUuaCAgICAgICAgICAgICAgICAgICAgfCAgNjg1ICsrDQogaW5j bHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oICAgICAgICAgICAgIHwgIDEyMyArDQogaW5p dC9tYWluLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArDQogbGli L0tjb25maWcuZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNSArDQogbGli L01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArLQ0KIGxp Yi9tYXBsZV90cmVlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcxMzAgKysrKysr KysrKysrKysrKysNCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZSAgICAgICAg ICAgfCAgICAyICsNCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25m LmggfCAgICAxICsNCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFwbGVfdHJlZS5o ICAgfCAgICA3ICsNCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYyAgICAgICAgICAg ICAgfCAgIDU5ICsNCiAuLi4vcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oICAg ICAgfCAgICA1ICsNCiAxNCBmaWxlcyBjaGFuZ2VkLCA4MjYwIGluc2VydGlvbnMoKyksIDEgZGVs ZXRpb24oLSkNCiBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBs ZV90cmVlLnJzdA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUu aA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgN CiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL21hcGxlX3RyZWUuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0 NCB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFwbGVfdHJlZS5oDQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tYXBsZS5jDQogY3JlYXRlIG1vZGUg MTAwNjQ0IHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5o DQoNCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4LnJzdCBiL0RvY3Vt ZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0DQppbmRleCBkYzk1ZGY0NjJlZWEuLjFkYTZhNGZh YzY2NCAxMDA2NDQNCi0tLSBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0DQorKysg Yi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4LnJzdA0KQEAgLTM2LDYgKzM2LDcgQEAgTGli cmFyeSBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBrZXJuZWwuDQog ICAga3JlZg0KICAgIGFzc29jX2FycmF5DQogICAgeGFycmF5DQorICAgbWFwbGVfdHJlZQ0KICAg IGlkcg0KICAgIGNpcmN1bGFyLWJ1ZmZlcnMNCiAgICByYnRyZWUNCmRpZmYgLS1naXQgYS9Eb2N1 bWVudGF0aW9uL2NvcmUtYXBpL21hcGxlX3RyZWUucnN0IGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFw aS9tYXBsZV90cmVlLnJzdA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAw MC4uNDVkZWZjZjE1ZGE3DQotLS0gL2Rldi9udWxsDQorKysgYi9Eb2N1bWVudGF0aW9uL2NvcmUt YXBpL21hcGxlX3RyZWUucnN0DQpAQCAtMCwwICsxLDIxNyBAQA0KKy4uIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wKw0KKw0KKw0KKz09PT09PT09PT0NCitNYXBsZSBUcmVlDQorPT09 PT09PT09PQ0KKw0KKzpBdXRob3I6IExpYW0gUi4gSG93bGV0dA0KKw0KK092ZXJ2aWV3DQorPT09 PT09PT0NCisNCitUaGUgTWFwbGUgVHJlZSBpcyBhIEItVHJlZSBkYXRhIHR5cGUgd2hpY2ggaXMg b3B0aW1pemVkIGZvciBzdG9yaW5nDQorbm9uLW92ZXJsYXBwaW5nIHJhbmdlcywgaW5jbHVkaW5n IHJhbmdlcyBvZiBzaXplIDEuICBUaGUgdHJlZSB3YXMgZGVzaWduZWQgdG8NCitiZSBzaW1wbGUg dG8gdXNlIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgdXNlciB3cml0dGVuIHNlYXJjaCBtZXRob2Qu ICBJdA0KK3N1cHBvcnRzIGl0ZXJhdGluZyBvdmVyIGEgcmFuZ2Ugb2YgZW50cmllcyBhbmQgZ29p bmcgdG8gdGhlIHByZXZpb3VzIG9yIG5leHQNCitlbnRyeSBpbiBhIGNhY2hlLWVmZmljaWVudCBt YW5uZXIuICBUaGUgdHJlZSBjYW4gYWxzbyBiZSBwdXQgaW50byBhbiBSQ1Utc2FmZQ0KK21vZGUg b2Ygb3BlcmF0aW9uIHdoaWNoIGFsbG93cyByZWFkaW5nIGFuZCB3cml0aW5nIGNvbmN1cnJlbnRs eS4gIFdyaXRlcnMgbXVzdA0KK3N5bmNocm9uaXplIG9uIGEgbG9jaywgd2hpY2ggY2FuIGJlIHRo ZSBkZWZhdWx0IHNwaW5sb2NrLCBvciB0aGUgdXNlciBjYW4gc2V0DQordGhlIGxvY2sgdG8gYW4g ZXh0ZXJuYWwgbG9jayBvZiBhIGRpZmZlcmVudCB0eXBlLg0KKw0KK1RoZSBNYXBsZSBUcmVlIG1h aW50YWlucyBhIHNtYWxsIG1lbW9yeSBmb290cHJpbnQgYW5kIHdhcyBkZXNpZ25lZCB0byB1c2UN Cittb2Rlcm4gcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlIG1ham9yaXR5IG9mIHRo ZSB1c2VycyB3aWxsIGJlIGFibGUgdG8NCit1c2UgdGhlIG5vcm1hbCBBUEkuICBBbiA6cmVmOmBt YXBsZS10cmVlLWFkdmFuY2VkLWFwaWAgZXhpc3RzIGZvciBtb3JlIGNvbXBsZXgNCitzY2VuYXJp b3MuICBUaGUgbW9zdCBpbXBvcnRhbnQgdXNhZ2Ugb2YgdGhlIE1hcGxlIFRyZWUgaXMgdGhlIHRy YWNraW5nIG9mIHRoZQ0KK3ZpcnR1YWwgbWVtb3J5IGFyZWFzLg0KKw0KK1RoZSBNYXBsZSBUcmVl IGNhbiBzdG9yZSB2YWx1ZXMgYmV0d2VlbiBgYDBgYCBhbmQgYGBVTE9OR19NQVhgYC4gIFRoZSBN YXBsZQ0KK1RyZWUgcmVzZXJ2ZXMgdmFsdWVzIHdpdGggdGhlIGJvdHRvbSB0d28gYml0cyBzZXQg dG8gJzEwJyB3aGljaCBhcmUgYmVsb3cgNDA5Ng0KKyhpZSAyLCA2LCAxMCAuLiA0MDk0KSBmb3Ig aW50ZXJuYWwgdXNlLiAgSWYgdGhlIGVudHJpZXMgbWF5IHVzZSByZXNlcnZlZA0KK2VudHJpZXMg dGhlbiB0aGUgdXNlcnMgY2FuIGNvbnZlcnQgdGhlIGVudHJpZXMgdXNpbmcgeGFfbWtfdmFsdWUo KSBhbmQgY29udmVydA0KK3RoZW0gYmFjayBieSBjYWxsaW5nIHhhX3RvX3ZhbHVlKCkuICBJZiB0 aGUgdXNlciBuZWVkcyB0byB1c2UgYSByZXNlcnZlZA0KK3ZhbHVlLCB0aGVuIHRoZSB1c2VyIGNh biBjb252ZXJ0IHRoZSB2YWx1ZSB3aGVuIHVzaW5nIHRoZQ0KKzpyZWY6YG1hcGxlLXRyZWUtYWR2 YW5jZWQtYXBpYCwgYnV0IGFyZSBibG9ja2VkIGJ5IHRoZSBub3JtYWwgQVBJLg0KKw0KK1RoZSBN YXBsZSBUcmVlIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBzZWFyY2hpbmcgZm9y IGEgZ2FwIG9mIGEgZ2l2ZW4NCitzaXplIChvciBsYXJnZXIpLg0KKw0KK1ByZS1hbGxvY2F0aW5n IG9mIG5vZGVzIGlzIGFsc28gc3VwcG9ydGVkIHVzaW5nIHRoZQ0KKzpyZWY6YG1hcGxlLXRyZWUt YWR2YW5jZWQtYXBpYC4gIFRoaXMgaXMgdXNlZnVsIGZvciB1c2VycyB3aG8gbXVzdCBndWFyYW50 ZWUgYQ0KK3N1Y2Nlc3NmdWwgc3RvcmUgb3BlcmF0aW9uIHdpdGhpbiBhIGdpdmVuDQorY29kZSBz ZWdtZW50IHdoZW4gYWxsb2NhdGluZyBjYW5ub3QgYmUgZG9uZS4gIEFsbG9jYXRpb25zIG9mIG5v ZGVzIGFyZQ0KK3JlbGF0aXZlbHkgc21hbGwgYXQgYXJvdW5kIDI1NiBieXRlcy4NCisNCisuLiBf bWFwbGUtdHJlZS1ub3JtYWwtYXBpOg0KKw0KK05vcm1hbCBBUEkNCis9PT09PT09PT09DQorDQor U3RhcnQgYnkgaW5pdGlhbGlzaW5nIGEgbWFwbGUgdHJlZSwgZWl0aGVyIHdpdGggREVGSU5FX01U UkVFKCkgZm9yIHN0YXRpY2FsbHkNCithbGxvY2F0ZWQgbWFwbGUgdHJlZXMgb3IgbXRfaW5pdCgp IGZvciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgb25lcy4gIEENCitmcmVzaGx5LWluaXRpYWxpc2Vk IG1hcGxlIHRyZWUgY29udGFpbnMgYSBgYE5VTExgYCBwb2ludGVyIGZvciB0aGUgcmFuZ2UgYGAw YGANCistIGBgVUxPTkdfTUFYYGAuICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byB0eXBlcyBvZiBt YXBsZSB0cmVlcyBzdXBwb3J0ZWQ6IHRoZQ0KK2FsbG9jYXRpb24gdHJlZSBhbmQgdGhlIHJlZ3Vs YXIgdHJlZS4gIFRoZSByZWd1bGFyIHRyZWUgaGFzIGEgaGlnaGVyIGJyYW5jaGluZw0KK2ZhY3Rv ciBmb3IgaW50ZXJuYWwgbm9kZXMuICBUaGUgYWxsb2NhdGlvbiB0cmVlIGhhcyBhIGxvd2VyIGJy YW5jaGluZyBmYWN0b3INCitidXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlYXJjaCBmb3IgYSBnYXAg b2YgYSBnaXZlbiBzaXplIG9yIGxhcmdlciBmcm9tIGVpdGhlcg0KK2BgMGBgIHVwd2FyZHMgb3Ig YGBVTE9OR19NQVhgYCBkb3duLiAgQW4gYWxsb2NhdGlvbiB0cmVlIGNhbiBiZSB1c2VkIGJ5DQor cGFzc2luZyBpbiB0aGUgYGBNVF9GTEFHU19BTExPQ19SQU5HRWBgIGZsYWcgd2hlbiBpbml0aWFs aXNpbmcgdGhlIHRyZWUuDQorDQorWW91IGNhbiB0aGVuIHNldCBlbnRyaWVzIHVzaW5nIG10cmVl X3N0b3JlKCkgb3IgbXRyZWVfc3RvcmVfcmFuZ2UoKS4NCittdHJlZV9zdG9yZSgpIHdpbGwgb3Zl cndyaXRlIGFueSBlbnRyeSB3aXRoIHRoZSBuZXcgZW50cnkgYW5kIHJldHVybiAwIG9uDQorc3Vj Y2VzcyBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4gIG10cmVlX3N0b3JlX3JhbmdlKCkgd29y a3MgaW4gdGhlIHNhbWUgd2F5DQorYnV0IHRha2VzIGEgcmFuZ2UuICBtdHJlZV9sb2FkKCkgaXMg dXNlZCB0byByZXRyaWV2ZSB0aGUgZW50cnkgc3RvcmVkIGF0IGENCitnaXZlbiBpbmRleC4gIFlv dSBjYW4gdXNlIG10cmVlX2VyYXNlKCkgdG8gZXJhc2UgYW4gZW50aXJlIHJhbmdlIGJ5IG9ubHkN Citrbm93aW5nIG9uZSB2YWx1ZSB3aXRoaW4gdGhhdCByYW5nZSwgb3IgbXRyZWVfc3RvcmUoKSBj YWxsIHdpdGggYW4gZW50cnkgb2YNCitOVUxMIG1heSBiZSB1c2VkIHRvIHBhcnRpYWxseSBlcmFz ZSBhIHJhbmdlIG9yIG1hbnkgcmFuZ2VzIGF0IG9uY2UuDQorDQorSWYgeW91IHdhbnQgdG8gb25s eSBzdG9yZSBhIG5ldyBlbnRyeSB0byBhIHJhbmdlIChvciBpbmRleCkgaWYgdGhhdCByYW5nZSBp cw0KK2N1cnJlbnRseSBgYE5VTExgYCwgeW91IGNhbiB1c2UgbXRyZWVfaW5zZXJ0X3JhbmdlKCkg b3IgbXRyZWVfaW5zZXJ0KCkgd2hpY2gNCityZXR1cm4gLUVFWElTVCBpZiB0aGUgcmFuZ2UgaXMg bm90IGVtcHR5Lg0KKw0KK1lvdSBjYW4gc2VhcmNoIGZvciBhbiBlbnRyeSBmcm9tIGFuIGluZGV4 IHVwd2FyZHMgYnkgdXNpbmcgbXRfZmluZCgpLg0KKw0KK1lvdSBjYW4gd2FsayBlYWNoIGVudHJ5 IHdpdGhpbiBhIHJhbmdlIGJ5IGNhbGxpbmcgbXRfZm9yX2VhY2goKS4gIFlvdSBtdXN0DQorcHJv dmlkZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBzdG9yZSBhIGN1cnNvci4gIElmIHlvdSB3YW50 IHRvIHdhbGsgZWFjaA0KK2VsZW1lbnQgb2YgdGhlIHRyZWUgdGhlbiBgYDBgYCBhbmQgYGBVTE9O R19NQVhgYCBtYXkgYmUgdXNlZCBhcyB0aGUgcmFuZ2UuICBJZg0KK3RoZSBjYWxsZXIgaXMgZ29p bmcgdG8gaG9sZCB0aGUgbG9jayBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3YWxrIHRoZW4gaXQg aXMNCit3b3J0aCBsb29raW5nIGF0IHRoZSBtYXNfZm9yX2VhY2goKSBBUEkgaW4gdGhlIDpyZWY6 YG1hcGxlLXRyZWUtYWR2YW5jZWQtYXBpYA0KK3NlY3Rpb24uDQorDQorU29tZXRpbWVzIGl0IGlz IG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlIG5leHQgY2FsbCB0byBzdG9yZSB0byBhIG1hcGxlIHRy ZWUgZG9lcw0KK25vdCBhbGxvY2F0ZSBtZW1vcnksIHBsZWFzZSBzZWUgOnJlZjpgbWFwbGUtdHJl ZS1hZHZhbmNlZC1hcGlgIGZvciB0aGlzIHVzZSBjYXNlLg0KKw0KK0ZpbmFsbHksIHlvdSBjYW4g cmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gYSBtYXBsZSB0cmVlIGJ5IGNhbGxpbmcNCittdHJlZV9k ZXN0cm95KCkuICBJZiB0aGUgbWFwbGUgdHJlZSBlbnRyaWVzIGFyZSBwb2ludGVycywgeW91IG1h eSB3aXNoIHRvIGZyZWUNCit0aGUgZW50cmllcyBmaXJzdC4NCisNCitBbGxvY2F0aW5nIE5vZGVz DQorLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoZSBhbGxvY2F0aW9ucyBhcmUgaGFuZGxlZCBieSB0 aGUgaW50ZXJuYWwgdHJlZSBjb2RlLiAgU2VlDQorOnJlZjpgbWFwbGUtdHJlZS1hZHZhbmNlZC1h bGxvY2AgZm9yIG90aGVyIG9wdGlvbnMuDQorDQorTG9ja2luZw0KKy0tLS0tLS0NCisNCitZb3Ug ZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgbG9ja2luZy4gIFNlZSA6cmVmOmBtYXBsZS10cmVl LWFkdmFuY2VkLWxvY2tzYA0KK2ZvciBvdGhlciBvcHRpb25zLg0KKw0KK1RoZSBNYXBsZSBUcmVl IHVzZXMgUkNVIGFuZCBhbiBpbnRlcm5hbCBzcGlubG9jayB0byBzeW5jaHJvbmlzZSBhY2Nlc3M6 DQorDQorVGFrZXMgUkNVIHJlYWQgbG9jazoNCisgKiBtdHJlZV9sb2FkKCkNCisgKiBtdF9maW5k KCkNCisgKiBtdF9mb3JfZWFjaCgpDQorICogbXRfbmV4dCgpDQorICogbXRfcHJldigpDQorDQor VGFrZXMgbWFfbG9jayBpbnRlcm5hbGx5Og0KKyAqIG10cmVlX3N0b3JlKCkNCisgKiBtdHJlZV9z dG9yZV9yYW5nZSgpDQorICogbXRyZWVfaW5zZXJ0KCkNCisgKiBtdHJlZV9pbnNlcnRfcmFuZ2Uo KQ0KKyAqIG10cmVlX2VyYXNlKCkNCisgKiBtdHJlZV9kZXN0cm95KCkNCisgKiBtdF9zZXRfaW5f cmN1KCkNCisgKiBtdF9jbGVhcl9pbl9yY3UoKQ0KKw0KK0lmIHlvdSB3YW50IHRvIHRha2UgYWR2 YW50YWdlIG9mIHRoZSBpbnRlcm5hbCBsb2NrIHRvIHByb3RlY3QgdGhlIGRhdGENCitzdHJ1Y3R1 cmVzIHRoYXQgeW91IGFyZSBzdG9yaW5nIGluIHRoZSBNYXBsZSBUcmVlLCB5b3UgY2FuIGNhbGwg bXRyZWVfbG9jaygpDQorYmVmb3JlIGNhbGxpbmcgbXRyZWVfbG9hZCgpLCB0aGVuIHRha2UgYSBy ZWZlcmVuY2UgY291bnQgb24gdGhlIG9iamVjdCB5b3UNCitoYXZlIGZvdW5kIGJlZm9yZSBjYWxs aW5nIG10cmVlX3VubG9jaygpLiAgVGhpcyB3aWxsIHByZXZlbnQgc3RvcmVzIGZyb20NCityZW1v dmluZyB0aGUgb2JqZWN0IGZyb20gdGhlIHRyZWUgYmV0d2VlbiBsb29raW5nIHVwIHRoZSBvYmpl Y3QgYW5kDQoraW5jcmVtZW50aW5nIHRoZSByZWZjb3VudC4gIFlvdSBjYW4gYWxzbyB1c2UgUkNV IHRvIGF2b2lkIGRlcmVmZXJlbmNpbmcNCitmcmVlZCBtZW1vcnksIGJ1dCBhbiBleHBsYW5hdGlv biBvZiB0aGF0IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcw0KK2RvY3VtZW50Lg0KKw0KKy4u IF9tYXBsZS10cmVlLWFkdmFuY2VkLWFwaToNCisNCitBZHZhbmNlZCBBUEkNCis9PT09PT09PT09 PT0NCisNCitUaGUgYWR2YW5jZWQgQVBJIG9mZmVycyBtb3JlIGZsZXhpYmlsaXR5IGFuZCBiZXR0 ZXIgcGVyZm9ybWFuY2UgYXQgdGhlDQorY29zdCBvZiBhbiBpbnRlcmZhY2Ugd2hpY2ggY2FuIGJl IGhhcmRlciB0byB1c2UgYW5kIGhhcyBmZXdlciBzYWZlZ3VhcmRzLg0KK1lvdSBtdXN0IHRha2Ug Y2FyZSBvZiB5b3VyIG93biBsb2NraW5nIHdoaWxlIHVzaW5nIHRoZSBhZHZhbmNlZCBBUEkuDQor WW91IGNhbiB1c2UgdGhlIG1hX2xvY2ssIFJDVSBvciBhbiBleHRlcm5hbCBsb2NrIGZvciBwcm90 ZWN0aW9uLg0KK1lvdSBjYW4gbWl4IGFkdmFuY2VkIGFuZCBub3JtYWwgb3BlcmF0aW9ucyBvbiB0 aGUgc2FtZSBhcnJheSwgYXMgbG9uZw0KK2FzIHRoZSBsb2NraW5nIGlzIGNvbXBhdGlibGUuICBU aGUgOnJlZjpgbWFwbGUtdHJlZS1ub3JtYWwtYXBpYCBpcyBpbXBsZW1lbnRlZA0KK2luIHRlcm1z IG9mIHRoZSBhZHZhbmNlZCBBUEkuDQorDQorVGhlIGFkdmFuY2VkIEFQSSBpcyBiYXNlZCBhcm91 bmQgdGhlIG1hX3N0YXRlLCB0aGlzIGlzIHdoZXJlIHRoZSAnbWFzJw0KK3ByZWZpeCBvcmlnaW5h dGVzLiAgVGhlIG1hX3N0YXRlIHN0cnVjdCBrZWVwcyB0cmFjayBvZiB0cmVlIG9wZXJhdGlvbnMg dG8gbWFrZQ0KK2xpZmUgZWFzaWVyIGZvciBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCB0cmVl IHVzZXJzLg0KKw0KK0luaXRpYWxpc2luZyB0aGUgbWFwbGUgdHJlZSBpcyB0aGUgc2FtZSBhcyBp biB0aGUgOnJlZjpgbWFwbGUtdHJlZS1ub3JtYWwtYXBpYC4NCitQbGVhc2Ugc2VlIGFib3ZlLg0K Kw0KK1RoZSBtYXBsZSBzdGF0ZSBrZWVwcyB0cmFjayBvZiB0aGUgcmFuZ2Ugc3RhcnQgYW5kIGVu ZCBpbiBtYXMtPmluZGV4IGFuZA0KK21hcy0+bGFzdCwgcmVzcGVjdGl2ZWx5Lg0KKw0KK21hc193 YWxrKCkgd2lsbCB3YWxrIHRoZSB0cmVlIHRvIHRoZSBsb2NhdGlvbiBvZiBtYXMtPmluZGV4IGFu ZCBzZXQgdGhlDQorbWFzLT5pbmRleCBhbmQgbWFzLT5sYXN0IGFjY29yZGluZyB0byB0aGUgcmFu Z2UgZm9yIHRoZSBlbnRyeS4NCisNCitZb3UgY2FuIHNldCBlbnRyaWVzIHVzaW5nIG1hc19zdG9y ZSgpLiAgbWFzX3N0b3JlKCkgd2lsbCBvdmVyd3JpdGUgYW55IGVudHJ5DQord2l0aCB0aGUgbmV3 IGVudHJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgb3Zlcndy aXR0ZW4uDQorVGhlIHJhbmdlIGlzIHBhc3NlZCBpbiBhcyBtZW1iZXJzIG9mIHRoZSBtYXBsZSBz dGF0ZTogaW5kZXggYW5kIGxhc3QuDQorDQorWW91IGNhbiB1c2UgbWFzX2VyYXNlKCkgdG8gZXJh c2UgYW4gZW50aXJlIHJhbmdlIGJ5IHNldHRpbmcgaW5kZXggYW5kDQorbGFzdCBvZiB0aGUgbWFw bGUgc3RhdGUgdG8gdGhlIGRlc2lyZWQgcmFuZ2UgdG8gZXJhc2UuICBUaGlzIHdpbGwgZXJhc2UN Cit0aGUgZmlyc3QgcmFuZ2UgdGhhdCBpcyBmb3VuZCBpbiB0aGF0IHJhbmdlLCBzZXQgdGhlIG1h cGxlIHN0YXRlIGluZGV4DQorYW5kIGxhc3QgYXMgdGhlIHJhbmdlIHRoYXQgd2FzIGVyYXNlZCBh bmQgcmV0dXJuIHRoZSBlbnRyeSB0aGF0IGV4aXN0ZWQNCithdCB0aGF0IGxvY2F0aW9uLg0KKw0K K1lvdSBjYW4gd2FsayBlYWNoIGVudHJ5IHdpdGhpbiBhIHJhbmdlIGJ5IHVzaW5nIG1hc19mb3Jf ZWFjaCgpLiAgSWYgeW91IHdhbnQNCit0byB3YWxrIGVhY2ggZWxlbWVudCBvZiB0aGUgdHJlZSB0 aGVuIGBgMGBgIGFuZCBgYFVMT05HX01BWGBgIG1heSBiZSB1c2VkIGFzDQordGhlIHJhbmdlLiAg SWYgdGhlIGxvY2sgbmVlZHMgdG8gYmUgcGVyaW9kaWNhbGx5IGRyb3BwZWQsIHNlZSB0aGUgbG9j a2luZw0KK3NlY3Rpb24gbWFzX3BhdXNlKCkuDQorDQorVXNpbmcgYSBtYXBsZSBzdGF0ZSBhbGxv d3MgbWFzX25leHQoKSBhbmQgbWFzX3ByZXYoKSB0byBmdW5jdGlvbiBhcyBpZiB0aGUNCit0cmVl IHdhcyBhIGxpbmtlZCBsaXN0LiAgV2l0aCBzdWNoIGEgaGlnaCBicmFuY2hpbmcgZmFjdG9yIHRo ZSBhbW9ydGl6ZWQNCitwZXJmb3JtYW5jZSBwZW5hbHR5IGlzIG91dHdlaWdoZWQgYnkgY2FjaGUg b3B0aW1pemF0aW9uLiAgbWFzX25leHQoKSB3aWxsDQorcmV0dXJuIHRoZSBuZXh0IGVudHJ5IHdo aWNoIG9jY3VycyBhZnRlciB0aGUgZW50cnkgYXQgaW5kZXguICBtYXNfcHJldigpDQord2lsbCBy ZXR1cm4gdGhlIHByZXZpb3VzIGVudHJ5IHdoaWNoIG9jY3VycyBiZWZvcmUgdGhlIGVudHJ5IGF0 IGluZGV4Lg0KKw0KK21hc19maW5kKCkgd2lsbCBmaW5kIHRoZSBmaXJzdCBlbnRyeSB3aGljaCBl eGlzdHMgYXQgb3IgYWJvdmUgaW5kZXggb24NCit0aGUgZmlyc3QgY2FsbCwgYW5kIHRoZSBuZXh0 IGVudHJ5IGZyb20gZXZlcnkgc3Vic2VxdWVudCBjYWxscy4NCisNCittYXNfZmluZF9yZXYoKSB3 aWxsIGZpbmQgdGhlIGZpc3QgZW50cnkgd2hpY2ggZXhpc3RzIGF0IG9yIGJlbG93IHRoZSBsYXN0 IG9uDQordGhlIGZpcnN0IGNhbGwsIGFuZCB0aGUgcHJldmlvdXMgZW50cnkgZnJvbSBldmVyeSBz dWJzZXF1ZW50IGNhbGxzLg0KKw0KK0lmIHRoZSB1c2VyIG5lZWRzIHRvIHlpZWxkIHRoZSBsb2Nr IGR1cmluZyBhbiBvcGVyYXRpb24sIHRoZW4gdGhlIG1hcGxlIHN0YXRlDQorbXVzdCBiZSBwYXVz ZWQgdXNpbmcgbWFzX3BhdXNlKCkuDQorDQorVGhlcmUgYXJlIGEgZmV3IGV4dHJhIGludGVyZmFj ZXMgcHJvdmlkZWQgd2hlbiB1c2luZyBhbiBhbGxvY2F0aW9uIHRyZWUuDQorSWYgeW91IHdpc2gg dG8gc2VhcmNoIGZvciBhIGdhcCB3aXRoaW4gYSByYW5nZSwgdGhlbiBtYXNfZW1wdHlfYXJlYSgp DQorb3IgbWFzX2VtcHR5X2FyZWFfcmV2KCkgY2FuIGJlIHVzZWQuICBtYXNfZW1wdHlfYXJlYSgp IHNlYXJjaGVzIGZvciBhIGdhcA0KK3N0YXJ0aW5nIGF0IHRoZSBsb3dlc3QgaW5kZXggZ2l2ZW4g dXAgdG8gdGhlIG1heGltdW0gb2YgdGhlIHJhbmdlLg0KK21hc19lbXB0eV9hcmVhX3JldigpIHNl YXJjaGVzIGZvciBhIGdhcCBzdGFydGluZyBhdCB0aGUgaGlnaGVzdCBpbmRleCBnaXZlbg0KK2Fu ZCBjb250aW51ZXMgZG93bndhcmQgdG8gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4NCisN CisuLiBfbWFwbGUtdHJlZS1hZHZhbmNlZC1hbGxvYzoNCisNCitBZHZhbmNlZCBBbGxvY2F0aW5n IE5vZGVzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0FsbG9jYXRpb25zIGFyZSB1 c3VhbGx5IGhhbmRsZWQgaW50ZXJuYWxseSB0byB0aGUgdHJlZSwgaG93ZXZlciBpZiBhbGxvY2F0 aW9ucw0KK25lZWQgdG8gb2NjdXIgYmVmb3JlIGEgd3JpdGUgb2NjdXJzIHRoZW4gY2FsbGluZyBt YXNfZXhwZWN0ZWRfZW50cmllcygpIHdpbGwNCithbGxvY2F0ZSB0aGUgd29yc3QtY2FzZSBudW1i ZXIgb2YgbmVlZGVkIG5vZGVzIHRvIGluc2VydCB0aGUgcHJvdmlkZWQgbnVtYmVyIG9mDQorcmFu Z2VzLiAgVGhpcyBhbHNvIGNhdXNlcyB0aGUgdHJlZSB0byBlbnRlciBtYXNzIGluc2VydGlvbiBt b2RlLiAgT25jZQ0KK2luc2VydGlvbnMgYXJlIGNvbXBsZXRlIGNhbGxpbmcgbWFzX2Rlc3Ryb3ko KSBvbiB0aGUgbWFwbGUgc3RhdGUgd2lsbCBmcmVlIHRoZQ0KK3VudXNlZCBhbGxvY2F0aW9ucy4N CisNCisuLiBfbWFwbGUtdHJlZS1hZHZhbmNlZC1sb2NrczoNCisNCitBZHZhbmNlZCBMb2NraW5n DQorLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoZSBtYXBsZSB0cmVlIHVzZXMgYSBzcGlubG9jayBi eSBkZWZhdWx0LCBidXQgZXh0ZXJuYWwgbG9ja3MgY2FuIGJlIHVzZWQgZm9yDQordHJlZSB1cGRh dGVzIGFzIHdlbGwuICBUbyB1c2UgYW4gZXh0ZXJuYWwgbG9jaywgdGhlIHRyZWUgbXVzdCBiZSBp bml0aWFsaXplZA0KK3dpdGggdGhlIGBgTVRfRkxBR1NfTE9DS19FWFRFUk4gZmxhZ2BgLCB0aGlz IGlzIHVzdWFsbHkgZG9uZSB3aXRoIHRoZQ0KK01UUkVFX0lOSVRfRVhUKCkgI2RlZmluZSwgd2hp Y2ggdGFrZXMgYW4gZXh0ZXJuYWwgbG9jayBhcyBhbiBhcmd1bWVudC4NCisNCitGdW5jdGlvbnMg YW5kIHN0cnVjdHVyZXMNCis9PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisuLiBrZXJuZWwt ZG9jOjogaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgNCisuLiBrZXJuZWwtZG9jOjogbGliL21h cGxlX3RyZWUuYw0KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMNCmluZGV4 IDhhNTAxMmJhNmZmOS4uNTRjYzFlNTEzYWVjIDEwMDY0NA0KLS0tIGEvTUFJTlRBSU5FUlMNCisr KyBiL01BSU5UQUlORVJTDQpAQCAtMTIwODgsNiArMTIwODgsMTggQEAgTDoJbGludXgtbWFuQHZn ZXIua2VybmVsLm9yZw0KIFM6CU1haW50YWluZWQNCiBXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcv ZG9jL21hbi1wYWdlcw0KIA0KK01BUExFIFRSRUUNCitNOglMaWFtIFIuIEhvd2xldHQgPExpYW0u SG93bGV0dEBvcmFjbGUuY29tPg0KK0w6CWxpbnV4LW1tQGt2YWNrLm9yZw0KK1M6CVN1cHBvcnRl ZA0KK0Y6CURvY3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QNCitGOglpbmNsdWRl L2xpbnV4L21hcGxlX3RyZWUuaA0KK0Y6CWluY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUu aA0KK0Y6CWxpYi9tYXBsZV90cmVlLmMNCitGOglsaWIvdGVzdF9tYXBsZV90cmVlLmMNCitGOgl0 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFwbGVfdHJlZS5oDQorRjoJdG9vbHMvdGVz dGluZy9yYWRpeC10cmVlL21hcGxlLmMNCisNCiBNQVJEVUsgKENSRUFUT1IgQ0k0MCkgREVWSUNF IFRSRUUgU1VQUE9SVA0KIE06CVJhaHVsIEJlZGFya2FyIDxyYWh1bGJlZGFya2FyODlAZ21haWwu Y29tPg0KIEw6CWxpbnV4LW1pcHNAdmdlci5rZXJuZWwub3JnDQpkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9saW51eC9tYXBsZV90cmVlLmggYi9pbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KbmV3IGZp bGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uYTMwZTAzYjA2YmVkDQotLS0gL2Rl di9udWxsDQorKysgYi9pbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KQEAgLTAsMCArMSw2ODUg QEANCisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsgKi8NCisjaWZuZGVmIF9M SU5VWF9NQVBMRV9UUkVFX0gNCisjZGVmaW5lIF9MSU5VWF9NQVBMRV9UUkVFX0gNCisvKg0KKyAq IE1hcGxlIFRyZWUgLSBBbiBSQ1Utc2FmZSBhZGFwdGl2ZSB0cmVlIGZvciBzdG9yaW5nIHJhbmdl cw0KKyAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIyIE9yYWNsZQ0KKyAqIEF1dGhvcnM6ICAgICBM aWFtIFIuIEhvd2xldHQgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KKyAqICAgICAgICAgICAg ICBNYXR0aGV3IFdpbGNveCA8d2lsbHlAaW5mcmFkZWFkLm9yZz4NCisgKi8NCisNCisjaW5jbHVk ZSA8bGludXgva2VybmVsLmg+DQorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+DQorI2luY2x1 ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQorLyogI2RlZmluZSBDT05GSUdfTUFQTEVfUkNVX0RJU0FC TEVEICovDQorLyogI2RlZmluZSBDT05GSUdfREVCVUdfTUFQTEVfVFJFRV9WRVJCT1NFICovDQor DQorLyoNCisgKiBBbGxvY2F0ZWQgbm9kZXMgYXJlIG11dGFibGUgdW50aWwgdGhleSBoYXZlIGJl ZW4gaW5zZXJ0ZWQgaW50byB0aGUgdHJlZSwNCisgKiBhdCB3aGljaCB0aW1lIHRoZXkgY2Fubm90 IGNoYW5nZSB0aGVpciB0eXBlIHVudGlsIHRoZXkgaGF2ZSBiZWVuIHJlbW92ZWQNCisgKiBmcm9t IHRoZSB0cmVlIGFuZCBhbiBSQ1UgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQuDQorICoNCisgKiBS ZW1vdmVkIG5vZGVzIGhhdmUgdGhlaXIgLT5wYXJlbnQgc2V0IHRvIHBvaW50IHRvIHRoZW1zZWx2 ZXMuICBSQ1UgcmVhZGVycw0KKyAqIGNoZWNrIC0+cGFyZW50IGJlZm9yZSByZWx5aW5nIG9uIHRo ZSB2YWx1ZSB0aGF0IHRoZXkgbG9hZGVkIGZyb20gdGhlDQorICogc2xvdHMgYXJyYXkuICBUaGlz IGxldHMgdXMgcmV1c2UgdGhlIHNsb3RzIGFycmF5IGZvciB0aGUgUkNVIGhlYWQuDQorICoNCisg KiBOb2RlcyBpbiB0aGUgdHJlZSBwb2ludCB0byB0aGVpciBwYXJlbnQgdW5sZXNzIGJpdCAwIGlz IHNldC4NCisgKi8NCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQlVJTERf VkRTTzMyXzY0KQ0KKy8qIDY0Yml0IHNpemVzICovDQorI2RlZmluZSBNQVBMRV9OT0RFX1NMT1RT CTMxCS8qIDI1NiBieXRlcyBpbmNsdWRpbmcgLT5wYXJlbnQgKi8NCisjZGVmaW5lIE1BUExFX1JB TkdFNjRfU0xPVFMJMTYJLyogMjU2IGJ5dGVzICovDQorI2RlZmluZSBNQVBMRV9BUkFOR0U2NF9T TE9UUwkxMAkvKiAyNDAgYnl0ZXMgKi8NCisjZGVmaW5lIE1BUExFX0FSQU5HRTY0X01FVEFfTUFY CTE1CS8qIE91dCBvZiByYW5nZSBmb3IgbWV0YWRhdGEgKi8NCisjZGVmaW5lIE1BUExFX0FMTE9D X1NMT1RTCShNQVBMRV9OT0RFX1NMT1RTIC0gMSkNCisjZWxzZQ0KKy8qIDMyYml0IHNpemVzICov DQorI2RlZmluZSBNQVBMRV9OT0RFX1NMT1RTCTYzCS8qIDI1NiBieXRlcyBpbmNsdWRpbmcgLT5w YXJlbnQgKi8NCisjZGVmaW5lIE1BUExFX1JBTkdFNjRfU0xPVFMJMzIJLyogMjU2IGJ5dGVzICov DQorI2RlZmluZSBNQVBMRV9BUkFOR0U2NF9TTE9UUwkyMQkvKiAyNDAgYnl0ZXMgKi8NCisjZGVm aW5lIE1BUExFX0FSQU5HRTY0X01FVEFfTUFYCTMxCS8qIE91dCBvZiByYW5nZSBmb3IgbWV0YWRh dGEgKi8NCisjZGVmaW5lIE1BUExFX0FMTE9DX1NMT1RTCShNQVBMRV9OT0RFX1NMT1RTIC0gMikN CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfNjRCSVQpIHx8IGRlZmluZWQoQlVJTERfVkRTTzMy XzY0KSAqLw0KKw0KKyNkZWZpbmUgTUFQTEVfTk9ERV9NQVNLCQkyNTVVTA0KKw0KKy8qDQorICog VGhlIG5vZGUtPnBhcmVudCBvZiB0aGUgcm9vdCBub2RlIGhhcyBiaXQgMCBzZXQgYW5kIHRoZSBy ZXN0IG9mIHRoZSBwb2ludGVyDQorICogaXMgYSBwb2ludGVyIHRvIHRoZSB0cmVlIGl0c2VsZi4g IE5vIG1vcmUgYml0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcG9pbnRlcg0KKyAqIChvbiBtNjhr LCB0aGUgZGF0YSBzdHJ1Y3R1cmUgbWF5IG9ubHkgYmUgMi1ieXRlIGFsaWduZWQpLg0KKyAqDQor ICogSW50ZXJuYWwgbm9uLXJvb3Qgbm9kZXMgY2FuIG9ubHkgaGF2ZSBtYXBsZV9yYW5nZV8qIG5v ZGVzIGFzIHBhcmVudHMuICBUaGUNCisgKiBwYXJlbnQgcG9pbnRlciBpcyAyNTZCIGFsaWduZWQg bGlrZSBhbGwgb3RoZXIgdHJlZSBub2Rlcy4gIFdoZW4gc3RvcmluZyBhIDMyDQorICogb3IgNjQg Yml0IHZhbHVlcywgdGhlIG9mZnNldCBjYW4gZml0IGludG8gNCBiaXRzLiAgVGhlIDE2IGJpdCB2 YWx1ZXMgbmVlZCBhbg0KKyAqIGV4dHJhIGJpdCB0byBzdG9yZSB0aGUgb2Zmc2V0LiAgVGhpcyBl eHRyYSBiaXQgY29tZXMgZnJvbSBhIHJldXNlIG9mIHRoZSBsYXN0DQorICogYml0IGluIHRoZSBu b2RlIHR5cGUuICBUaGlzIGlzIHBvc3NpYmxlIGJ5IHVzaW5nIGJpdCAxIHRvIGluZGljYXRlIGlm IGJpdCAyDQorICogaXMgcGFydCBvZiB0aGUgdHlwZSBvciB0aGUgc2xvdC4NCisgKg0KKyAqIE9u Y2UgdGhlIHR5cGUgaXMgZGVjaWRlZCwgdGhlIGRlY2lzaW9uIG9mIGFuIGFsbG9jYXRpb24gcmFu Z2UgdHlwZSBvciBhIHJhbmdlDQorICogdHlwZSBpcyBkb25lIGJ5IGV4YW1pbmluZyB0aGUgaW1t dXRhYmxlIHRyZWUgZmxhZyBmb3IgdGhlIE1BUExFX0FMTE9DX1JBTkdFDQorICogZmxhZy4NCisg Kg0KKyAqICBOb2RlIHR5cGVzOg0KKyAqICAgMHg/PzEgPSBSb290DQorICogICAweD8wMCA9IDE2 IGJpdCBub2Rlcw0KKyAqICAgMHgwMTAgPSAzMiBiaXQgbm9kZXMNCisgKiAgIDB4MTEwID0gNjQg Yml0IG5vZGVzDQorICoNCisgKiAgU2xvdCBzaXplIGFuZCBsb2NhdGlvbiBpbiB0aGUgcGFyZW50 IHBvaW50ZXI6DQorICogICB0eXBlICA6IHNsb3QgbG9jYXRpb24NCisgKiAgIDB4Pz8xIDogUm9v dA0KKyAqICAgMHg/MDAgOiAxNiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMSwgc2xvdCBpbiAyLTYN CisgKiAgIDB4MDEwIDogMzIgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQor ICogICAweDExMCA6IDY0IGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0yLCBzbG90IGluIDMtNg0KKyAq Lw0KKw0KKy8qDQorICogVGhpcyBtZXRhZGF0YSBpcyB1c2VkIHRvIG9wdGltaXplIHRoZSBnYXAg dXBkYXRpbmcgY29kZSBhbmQgaW4gcmV2ZXJzZQ0KKyAqIHNlYXJjaGluZyBmb3IgZ2FwcyBvciBh bnkgb3RoZXIgY29kZSB0aGF0IG5lZWRzIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgZGF0YS4NCisg Ki8NCitzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgew0KKwl1bnNpZ25lZCBjaGFyIGVuZDsNCisJdW5z aWduZWQgY2hhciBnYXA7DQorfTsNCisNCisvKg0KKyAqIExlYWYgbm9kZXMgZG8gbm90IHN0b3Jl IHBvaW50ZXJzIHRvIG5vZGVzLCB0aGV5IHN0b3JlIHVzZXIgZGF0YS4gIFVzZXJzIG1heQ0KKyAq IHN0b3JlIGFsbW9zdCBhbnkgYml0IHBhdHRlcm4uICBBcyBub3RlZCBhYm92ZSwgdGhlIG9wdGlt aXNhdGlvbiBvZiBzdG9yaW5nIGFuDQorICogZW50cnkgYXQgMCBpbiB0aGUgcm9vdCBwb2ludGVy IGNhbm5vdCBiZSBkb25lIGZvciBkYXRhIHdoaWNoIGhhdmUgdGhlIGJvdHRvbQ0KKyAqIHR3byBi aXRzIHNldCB0byAnMTAnLiAgV2UgYWxzbyByZXNlcnZlIHZhbHVlcyB3aXRoIHRoZSBib3R0b20g dHdvIGJpdHMgc2V0IHRvDQorICogJzEwJyB3aGljaCBhcmUgYmVsb3cgNDA5NiAoaWUgMiwgNiwg MTAgLi4gNDA5NCkgZm9yIGludGVybmFsIHVzZS4gIFNvbWUgQVBJcw0KKyAqIHJldHVybiBlcnJu b3MgYXMgYSBuZWdhdGl2ZSBlcnJubyBzaGlmdGVkIHJpZ2h0IGJ5IHR3byBiaXRzIGFuZCB0aGUg Ym90dG9tDQorICogdHdvIGJpdHMgc2V0IHRvICcxMCcsIGFuZCB3aGlsZSBjaG9vc2luZyB0byBz dG9yZSB0aGVzZSB2YWx1ZXMgaW4gdGhlIGFycmF5DQorICogaXMgbm90IGFuIGVycm9yLCBpdCBt YXkgbGVhZCB0byBjb25mdXNpb24gaWYgeW91J3JlIHRlc3RpbmcgZm9yIGFuIGVycm9yIHdpdGgN CisgKiBtYXNfaXNfZXJyKCkuDQorICoNCisgKiBOb24tbGVhZiBub2RlcyBzdG9yZSB0aGUgdHlw ZSBvZiB0aGUgbm9kZSBwb2ludGVkIHRvIChlbnVtIG1hcGxlX3R5cGUgaW4gYml0cw0KKyAqIDMt NiksIGJpdCAyIGlzIHJlc2VydmVkLiAgVGhhdCBsZWF2ZXMgYml0cyAwLTEgdW51c2VkIGZvciBu b3cuDQorICoNCisgKiBJbiByZWd1bGFyIEItVHJlZSB0ZXJtcywgcGl2b3RzIGFyZSBjYWxsZWQg a2V5cy4gIFRoZSB0ZXJtIHBpdm90IGlzIHVzZWQgdG8NCisgKiBpbmRpY2F0ZSB0aGF0IHRoZSB0 cmVlIGlzIHNwZWNpZnlpbmcgcmFuZ2VzLCAgUGl2b3RzIG1heSBhcHBlYXIgaW4gdGhlDQorICog c3VidHJlZSB3aXRoIGFuIGVudHJ5IGF0dGFjaGVkIHRvIHRoZSB2YWx1ZSB3aGVyZWFzIGtleXMg YXJlIHVuaXF1ZSB0byBhDQorICogc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBCLXRyZWUuICBQaXZv dCB2YWx1ZXMgYXJlIGluY2x1c2l2ZSBvZiB0aGUgc2xvdCB3aXRoDQorICogdGhlIHNhbWUgaW5k ZXguDQorICovDQorDQorc3RydWN0IG1hcGxlX3JhbmdlXzY0IHsNCisJc3RydWN0IG1hcGxlX3Bu b2RlICpwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3RbTUFQTEVfUkFOR0U2NF9TTE9UUyAt IDFdOw0KKwl1bmlvbiB7DQorCQl2b2lkIF9fcmN1ICpzbG90W01BUExFX1JBTkdFNjRfU0xPVFNd Ow0KKwkJc3RydWN0IHsNCisJCQl2b2lkIF9fcmN1ICpwYWRbTUFQTEVfUkFOR0U2NF9TTE9UUyAt IDFdOw0KKwkJCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSBtZXRhOw0KKwkJfTsNCisJfTsNCit9Ow0K Kw0KKy8qDQorICogQXQgdHJlZSBjcmVhdGlvbiB0aW1lLCB0aGUgdXNlciBjYW4gc3BlY2lmeSB0 aGF0IHRoZXkncmUgd2lsbGluZyB0byB0cmFkZSBvZmYNCisgKiBzdG9yaW5nIGZld2VyIGVudHJp ZXMgaW4gYSB0cmVlIGluIHJldHVybiBmb3Igc3RvcmluZyBtb3JlIGluZm9ybWF0aW9uIGluDQor ICogZWFjaCBub2RlLg0KKyAqDQorICogVGhlIG1hcGxlIHRyZWUgc3VwcG9ydHMgcmVjb3JkaW5n IHRoZSBsYXJnZXN0IHJhbmdlIG9mIE5VTEwgZW50cmllcyBhdmFpbGFibGUNCisgKiBpbiB0aGlz IG5vZGUsIGFsc28gY2FsbGVkIGdhcHMuICBUaGlzIG9wdGltaXNlcyB0aGUgdHJlZSBmb3IgYWxs b2NhdGluZyBhDQorICogcmFuZ2UuDQorICovDQorc3RydWN0IG1hcGxlX2FyYW5nZV82NCB7DQor CXN0cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwl1bnNpZ25lZCBsb25nIHBpdm90W01BUExF X0FSQU5HRTY0X1NMT1RTIC0gMV07DQorCXZvaWQgX19yY3UgKnNsb3RbTUFQTEVfQVJBTkdFNjRf U0xPVFNdOw0KKwl1bnNpZ25lZCBsb25nIGdhcFtNQVBMRV9BUkFOR0U2NF9TTE9UU107DQorCXN0 cnVjdCBtYXBsZV9tZXRhZGF0YSBtZXRhOw0KK307DQorDQorc3RydWN0IG1hcGxlX2FsbG9jIHsN CisJdW5zaWduZWQgbG9uZyB0b3RhbDsNCisJdW5zaWduZWQgY2hhciBub2RlX2NvdW50Ow0KKwl1 bnNpZ25lZCBpbnQgcmVxdWVzdF9jb3VudDsNCisJc3RydWN0IG1hcGxlX2FsbG9jICpzbG90W01B UExFX0FMTE9DX1NMT1RTXTsNCit9Ow0KKw0KK3N0cnVjdCBtYXBsZV90b3BpYXJ5IHsNCisJc3Ry dWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsgLyog T3ZlcmxhcHMgdGhlIHBpdm90ICovDQorfTsNCisNCitlbnVtIG1hcGxlX3R5cGUgew0KKwltYXBs ZV9kZW5zZSwNCisJbWFwbGVfbGVhZl82NCwNCisJbWFwbGVfcmFuZ2VfNjQsDQorCW1hcGxlX2Fy YW5nZV82NCwNCit9Ow0KKw0KKw0KKy8qKg0KKyAqIERPQzogTWFwbGUgdHJlZSBmbGFncw0KKyAq DQorICogKiBNVF9GTEFHU19BTExPQ19SQU5HRQktIFRyYWNrIGdhcHMgaW4gdGhpcyB0cmVlDQor ICogKiBNVF9GTEFHU19VU0VfUkNVCQktIE9wZXJhdGUgaW4gUkNVIG1vZGUNCisgKiAqIE1UX0ZM QUdTX0hFSUdIVF9PRkZTRVQJLSBUaGUgcG9zaXRpb24gb2YgdGhlIHRyZWUgaGVpZ2h0IGluIHRo ZSBmbGFncw0KKyAqICogTVRfRkxBR1NfSEVJR0hUX01BU0sJLSBUaGUgbWFzayBmb3IgdGhlIG1h cGxlIHRyZWUgaGVpZ2h0IHZhbHVlDQorICogKiBNVF9GTEFHU19MT0NLX01BU0sJCS0gSG93IHRo ZSBtdF9sb2NrIGlzIHVzZWQNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfSVJRCQktIEFjcXVpcmVkIGly cS1zYWZlDQorICogKiBNVF9GTEFHU19MT0NLX0JICQktIEFjcXVpcmVkIGJoLXNhZmUNCisgKiAq IE1UX0ZMQUdTX0xPQ0tfRVhURVJOCS0gbXRfbG9jayBpcyBub3QgdXNlZA0KKyAqDQorICogTUFQ TEVfSEVJR0hUX01BWAlUaGUgbGFyZ2VzdCBoZWlnaHQgdGhhdCBjYW4gYmUgc3RvcmVkDQorICov DQorI2RlZmluZSBNVF9GTEFHU19BTExPQ19SQU5HRQkweDAxDQorI2RlZmluZSBNVF9GTEFHU19V U0VfUkNVCTB4MDINCisjZGVmaW5lIE1UX0ZMQUdTX0hFSUdIVF9PRkZTRVQJMHgwMg0KKyNkZWZp bmUgTVRfRkxBR1NfSEVJR0hUX01BU0sJMHg3Qw0KKyNkZWZpbmUgTVRfRkxBR1NfTE9DS19NQVNL CTB4MzAwDQorI2RlZmluZSBNVF9GTEFHU19MT0NLX0lSUQkweDEwMA0KKyNkZWZpbmUgTVRfRkxB R1NfTE9DS19CSAkweDIwMA0KKyNkZWZpbmUgTVRfRkxBR1NfTE9DS19FWFRFUk4JMHgzMDANCisN CisjZGVmaW5lIE1BUExFX0hFSUdIVF9NQVgJMzENCisNCisNCisjZGVmaW5lIE1BUExFX05PREVf VFlQRV9NQVNLCTB4MEYNCisjZGVmaW5lIE1BUExFX05PREVfVFlQRV9TSElGVAkweDAzDQorDQor I2RlZmluZSBNQVBMRV9SRVNFUlZFRF9SQU5HRQk0MDk2DQorDQorI2lmZGVmIENPTkZJR19MT0NL REVQDQordHlwZWRlZiBzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2tkZXBfbWFwX3A7DQorI2RlZmlu ZSBtdF9sb2NrX2lzX2hlbGQobXQpCWxvY2tfaXNfaGVsZChtdC0+bWFfZXh0ZXJuYWxfbG9jaykN CisjZGVmaW5lIG10X3NldF9leHRlcm5hbF9sb2NrKG10LCBsb2NrKQkJCQkJXA0KKwkobXQpLT5t YV9leHRlcm5hbF9sb2NrID0gJihsb2NrKS0+ZGVwX21hcA0KKyNlbHNlDQordHlwZWRlZiBzdHJ1 Y3QgeyAvKiBub3RoaW5nICovIH0gbG9ja2RlcF9tYXBfcDsNCisjZGVmaW5lIG10X2xvY2tfaXNf aGVsZChtdCkJMQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQsIGxvY2spCWRvIHsg fSB3aGlsZSAoMCkNCisjZW5kaWYNCisNCisvKg0KKyAqIElmIHRoZSB0cmVlIGNvbnRhaW5zIGEg c2luZ2xlIGVudHJ5IGF0IGluZGV4IDAsIGl0IGlzIHVzdWFsbHkgc3RvcmVkIGluDQorICogdHJl ZS0+bWFfcm9vdC4gIFRvIG9wdGltaXNlIGZvciB0aGUgcGFnZSBjYWNoZSwgYW4gZW50cnkgd2hp Y2ggZW5kcyBpbiAnMDAnLA0KKyAqICcwMScgb3IgJzExJyBpcyBzdG9yZWQgaW4gdGhlIHJvb3Qs IGJ1dCBhbiBlbnRyeSB3aGljaCBlbmRzIGluICcxMCcgd2lsbCBiZQ0KKyAqIHN0b3JlZCBpbiBh IG5vZGUuICBCaXRzIDMtNiBhcmUgdXNlZCB0byBzdG9yZSBlbnVtIG1hcGxlX3R5cGUuDQorICoN CisgKiBUaGUgZmxhZ3MgYXJlIHVzZWQgYm90aCB0byBzdG9yZSBzb21lIGltbXV0YWJsZSBpbmZv cm1hdGlvbiBhYm91dCB0aGlzIHRyZWUNCisgKiAoc2V0IGF0IHRyZWUgY3JlYXRpb24gdGltZSkg YW5kIGR5bmFtaWMgaW5mb3JtYXRpb24gc2V0IHVuZGVyIHRoZSBzcGlubG9jay4NCisgKg0KKyAq IEFub3RoZXIgdXNlIG9mIGZsYWdzIGFyZSB0byBpbmRpY2F0ZSBnbG9iYWwgc3RhdGVzIG9mIHRo ZSB0cmVlLiAgVGhpcyBpcyB0aGUNCisgKiBjYXNlIHdpdGggdGhlIE1BUExFX1VTRV9SQ1UgZmxh Zywgd2hpY2ggaW5kaWNhdGVzIHRoZSB0cmVlIGlzIGN1cnJlbnRseSBpbg0KKyAqIFJDVSBtb2Rl LiAgVGhpcyBtb2RlIHdhcyBhZGRlZCB0byBhbGxvdyB0aGUgdHJlZSB0byByZXVzZSBub2RlcyBp bnN0ZWFkIG9mDQorICogcmUtYWxsb2NhdGluZyBhbmQgUkNVIGZyZWVpbmcgbm9kZXMgd2hlbiB0 aGVyZSBpcyBhIHNpbmdsZSB1c2VyLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV90cmVlIHsNCisJdW5p b24gew0KKwkJc3BpbmxvY2tfdAltYV9sb2NrOw0KKwkJbG9ja2RlcF9tYXBfcAltYV9leHRlcm5h bF9sb2NrOw0KKwl9Ow0KKwl2b2lkIF9fcmN1ICAgICAgKm1hX3Jvb3Q7DQorCXVuc2lnbmVkIGlu dAltYV9mbGFnczsNCit9Ow0KKw0KKy8qKg0KKyAqIE1UUkVFX0lOSVQoKSAtIEluaXRpYWxpemUg YSBtYXBsZSB0cmVlDQorICogQG5hbWU6IFRoZSBtYXBsZSB0cmVlIG5hbWUNCisgKiBAZmxhZ3M6 IFRoZSBtYXBsZSB0cmVlIGZsYWdzDQorICoNCisgKi8NCisjZGVmaW5lIE1UUkVFX0lOSVQobmFt ZSwgX19mbGFncykgewkJCQkJXA0KKwkubWFfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKChu YW1lKS5tYV9sb2NrKSwJCVwNCisJLm1hX2ZsYWdzID0gX19mbGFncywJCQkJCQlcDQorCS5tYV9y b290ID0gTlVMTCwJCQkJCQlcDQorfQ0KKw0KKy8qKg0KKyAqIE1UUkVFX0lOSVRfRVhUKCkgLSBJ bml0aWFsaXplIGEgbWFwbGUgdHJlZSB3aXRoIGFuIGV4dGVybmFsIGxvY2suDQorICogQG5hbWU6 IFRoZSB0cmVlIG5hbWUNCisgKiBAZmxhZ3M6IFRoZSBtYXBsZSB0cmVlIGZsYWdzDQorICogQGxv Y2s6IFRoZSBleHRlcm5hbCBsb2NrDQorICovDQorI2lmZGVmIENPTkZJR19MT0NLREVQDQorI2Rl ZmluZSBNVFJFRV9JTklUX0VYVChuYW1lLCBfX2ZsYWdzLCBfX2xvY2spIHsJCQkJXA0KKwkubWFf ZXh0ZXJuYWxfbG9jayA9ICYoX19sb2NrKS5kZXBfbWFwLAkJCQlcDQorCS5tYV9mbGFncyA9IChf X2ZsYWdzKSwJCQkJCQlcDQorCS5tYV9yb290ID0gTlVMTCwJCQkJCQlcDQorfQ0KKyNlbHNlDQor I2RlZmluZSBNVFJFRV9JTklUX0VYVChuYW1lLCBfX2ZsYWdzLCBfX2xvY2spCU1UUkVFX0lOSVQo bmFtZSwgX19mbGFncykNCisjZW5kaWYNCisNCisjZGVmaW5lIERFRklORV9NVFJFRShuYW1lKQkJ CQkJCVwNCisJc3RydWN0IG1hcGxlX3RyZWUgbmFtZSA9IE1UUkVFX0lOSVQobmFtZSwgMCkNCisN CisjZGVmaW5lIG10cmVlX2xvY2sobXQpCQlzcGluX2xvY2soKCYobXQpLT5tYV9sb2NrKSkNCisj ZGVmaW5lIG10cmVlX3VubG9jayhtdCkJc3Bpbl91bmxvY2soKCYobXQpLT5tYV9sb2NrKSkNCisN CisvKg0KKyAqIFRoZSBNYXBsZSBUcmVlIHNxdWVlemVzIHZhcmlvdXMgYml0cyBpbiBhdCB2YXJp b3VzIHBvaW50cyB3aGljaCBhcmVuJ3QNCisgKiBuZWNlc3NhcmlseSBvYnZpb3VzLiAgVXN1YWxs eSwgdGhpcyBpcyBkb25lIGJ5IG9ic2VydmluZyB0aGF0IHBvaW50ZXJzIGFyZQ0KKyAqIE4tYnl0 ZSBhbGlnbmVkIGFuZCB0aHVzIHRoZSBib3R0b20gbG9nXzIoTikgYml0cyBhcmUgYXZhaWxhYmxl IGZvciB1c2UuICBXZQ0KKyAqIGRvbid0IHVzZSB0aGUgaGlnaCBiaXRzIG9mIHBvaW50ZXJzIHRv IHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVjYXVzZQ0KKyAqIHdlIGRvbid0IGtub3cg d2hhdCBiaXRzIGFyZSB1bnVzZWQgb24gYW55IGdpdmVuIGFyY2hpdGVjdHVyZS4NCisgKg0KKyAq IE5vZGVzIGFyZSAyNTYgYnl0ZXMgaW4gc2l6ZSBhbmQgYXJlIGFsc28gYWxpZ25lZCB0byAyNTYg Ynl0ZXMsIGdpdmluZyB1cyA4DQorICogbG93IGJpdHMgZm9yIG91ciBvd24gcHVycG9zZXMuICBO b2RlcyBhcmUgY3VycmVudGx5IG9mIDQgdHlwZXM6DQorICogMS4gU2luZ2xlIHBvaW50ZXIgKFJh bmdlIGlzIDAtMCkNCisgKiAyLiBOb24tbGVhZiBBbGxvY2F0aW9uIFJhbmdlIG5vZGVzDQorICog My4gTm9uLWxlYWYgUmFuZ2Ugbm9kZXMNCisgKiA0LiBMZWFmIFJhbmdlIG5vZGVzIEFsbCBub2Rl cyBjb25zaXN0IG9mIGEgbnVtYmVyIG9mIG5vZGUgc2xvdHMsDQorICogICAgcGl2b3RzLCBhbmQg YSBwYXJlbnQgcG9pbnRlci4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfbm9kZSB7DQorCXVuaW9u IHsNCisJCXN0cnVjdCB7DQorCQkJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCQkJdm9p ZCBfX3JjdSAqc2xvdFtNQVBMRV9OT0RFX1NMT1RTXTsNCisJCX07DQorCQlzdHJ1Y3Qgew0KKwkJ CXZvaWQgKnBhZDsNCisJCQlzdHJ1Y3QgcmN1X2hlYWQgcmN1Ow0KKwkJCXN0cnVjdCBtYXBsZV9l bm9kZSAqcGl2X3BhcmVudDsNCisJCQl1bnNpZ25lZCBjaGFyIHBhcmVudF9zbG90Ow0KKwkJCWVu dW0gbWFwbGVfdHlwZSB0eXBlOw0KKwkJCXVuc2lnbmVkIGNoYXIgc2xvdF9sZW47DQorCQkJdW5z aWduZWQgaW50IG1hX2ZsYWdzOw0KKwkJfTsNCisJCXN0cnVjdCBtYXBsZV9yYW5nZV82NCBtcjY0 Ow0KKwkJc3RydWN0IG1hcGxlX2FyYW5nZV82NCBtYTY0Ow0KKwkJc3RydWN0IG1hcGxlX2FsbG9j IGFsbG9jOw0KKwl9Ow0KK307DQorDQorLyoNCisgKiBNb3JlIGNvbXBsaWNhdGVkIHN0b3JlcyBj YW4gY2F1c2UgdHdvIG5vZGVzIHRvIGJlY29tZSBvbmUgb3IgdGhyZWUgYW5kDQorICogcG90ZW50 aWFsbHkgYWx0ZXIgdGhlIGhlaWdodCBvZiB0aGUgdHJlZS4gIEVpdGhlciBoYWxmIG9mIHRoZSB0 cmVlIG1heSBuZWVkDQorICogdG8gYmUgcmViYWxhbmNlZCBhZ2FpbnN0IHRoZSBvdGhlci4gIFRo ZSBtYV90b3BpYXJ5IHN0cnVjdCBpcyB1c2VkIHRvIHRyYWNrDQorICogd2hpY2ggbm9kZXMgaGF2 ZSBiZWVuICdjdXQnIGZyb20gdGhlIHRyZWUgc28gdGhhdCB0aGUgY2hhbmdlIGNhbiBiZSBkb25l DQorICogc2FmZWx5IGF0IGEgbGF0ZXIgZGF0ZS4gIFRoaXMgaXMgZG9uZSB0byBzdXBwb3J0IFJD VS4NCisgKi8NCitzdHJ1Y3QgbWFfdG9waWFyeSB7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqaGVh ZDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICp0YWlsOw0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSAqbXRy ZWU7DQorfTsNCisNCit2b2lkICptdHJlZV9sb2FkKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5z aWduZWQgbG9uZyBpbmRleCk7DQorDQoraW50IG10cmVlX2luc2VydChzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsDQorCQl2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsN CitpbnQgbXRyZWVfaW5zZXJ0X3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQg bG9uZyBmaXJzdCwNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCwgdm9pZCAqZW50cnksIGdmcF90IGdm cCk7DQoraW50IG10cmVlX2FsbG9jX3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWdu ZWQgbG9uZyAqc3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5z aWduZWQgbG9uZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKTsNCitpbnQg bXRyZWVfYWxsb2NfcnJhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAq c3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9u ZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKTsNCisNCitpbnQgbXRyZWVf c3RvcmVfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0K KwkJICAgICAgdW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitp bnQgbXRyZWVfc3RvcmUoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4 LA0KKwkJdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQordm9pZCAqbXRyZWVfZXJhc2Uoc3RydWN0 IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCit2b2lkIG10cmVlX2Rl c3Ryb3koc3RydWN0IG1hcGxlX3RyZWUgKm10KTsNCit2b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3Qg bWFwbGVfdHJlZSAqbXQpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2VtcHR5KCkgLSBEZXRlcm1pbmUg aWYgYSB0cmVlIGhhcyBhbnkgcHJlc2VudCBlbnRyaWVzLg0KKyAqIEBtdDogTWFwbGUgVHJlZS4N CisgKg0KKyAqIENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqIFJldHVybjogJXRydWUgaWYgdGhl IHRyZWUgY29udGFpbnMgb25seSBOVUxMIHBvaW50ZXJzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg Ym9vbCBtdHJlZV9lbXB0eShjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1 cm4gbXQtPm1hX3Jvb3QgPT0gTlVMTDsNCit9DQorDQorLyogQWR2YW5jZWQgQVBJICovDQorDQor LyoNCisgKiBUaGUgbWFwbGUgc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgc3RydWN0IG1hX3N0YXRl IGFuZCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sNCisgKiBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgb3Bl cmF0aW9ucywgYW5kIGV2ZW4gYmV0d2VlbiBvcGVyYXRpb25zIHdoZW4gdXNpbmcgdGhlDQorICog YWR2YW5jZWQgQVBJLg0KKyAqDQorICogSWYgc3RhdGUtPm5vZGUgaGFzIGJpdCAwIHNldCB0aGVu IGl0IHJlZmVyZW5jZXMgYSB0cmVlIGxvY2F0aW9uIHdoaWNoIGlzIG5vdA0KKyAqIGEgbm9kZSAo ZWcgdGhlIHJvb3QpLiAgSWYgYml0IDEgaXMgc2V0LCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUg YSBuZWdhdGl2ZQ0KKyAqIGVycm5vLiAgQml0IDIgKHRoZSAndW5hbGxvY2F0ZWQgc2xvdHMnIGJp dCkgaXMgY2xlYXIuICBCaXRzIDMtNiBpbmRpY2F0ZSB0aGUNCisgKiBub2RlIHR5cGUuDQorICoN CisgKiBzdGF0ZS0+YWxsb2MgZWl0aGVyIGhhcyBhIHJlcXVlc3QgbnVtYmVyIG9mIG5vZGVzIG9y IGFuIGFsbG9jYXRlZCBub2RlLiAgSWYNCisgKiBzdGF0LT5hbGxvYyBoYXMgYSByZXF1ZXN0ZWQg bnVtYmVyIG9mIG5vZGVzLCB0aGUgZmlyc3QgYml0IHdpbGwgYmUgc2V0ICgweDEpDQorICogYW5k IHRoZSByZW1haW5pbmcgYml0cyBhcmUgdGhlIHZhbHVlLiAgSWYgc3RhdGUtPmFsbG9jIGlzIGEg bm9kZSwgdGhlbiB0aGUNCisgKiBub2RlIHdpbGwgYmUgb2YgdHlwZSBtYXBsZV9hbGxvYy4gIG1h cGxlX2FsbG9jIGhhcyBNQVBMRV9OT0RFX1NMT1RTIC0gMSBmb3INCisgKiBzdG9yaW5nIG1vcmUg YWxsb2NhdGVkIG5vZGVzLCBhIHRvdGFsIG51bWJlciBvZiBub2RlcyBhbGxvY2F0ZWQsIGFuZCB0 aGUNCisgKiBub2RlX2NvdW50IGluIHRoaXMgbm9kZS4gIG5vZGVfY291bnQgaXMgdGhlIG51bWJl ciBvZiBhbGxvY2F0ZWQgbm9kZXMgaW4gdGhpcw0KKyAqIG5vZGUuICBUaGUgc2NhbGluZyBiZXlv bmQgTUFQTEVfTk9ERV9TTE9UUyAtIDEgaXMgaGFuZGxlZCBieSBzdG9yaW5nIGZ1cnRoZXINCisg KiBub2RlcyBpbnRvIHN0YXRlLT5hbGxvYy0+c2xvdFswXSdzIG5vZGUuICBOb2RlcyBhcmUgdGFr ZW4gZnJvbSBzdGF0ZS0+YWxsb2MNCisgKiBieSByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgc3Rh dGUtPmFsbG9jIG5vZGUgdW50aWwgc3RhdGUtPmFsbG9jLT5ub2RlX2NvdW50DQorICogaXMgMSwg d2hlbiBzdGF0ZS0+YWxsb2MgaXMgcmV0dXJuZWQgYW5kIHRoZSBzdGF0ZS0+YWxsb2MtPnNsb3Rb MF0gaXMgcHJvbW90ZWQNCisgKiB0byBzdGF0ZS0+YWxsb2MuICBOb2RlcyBhcmUgcHVzaGVkIG9u dG8gc3RhdGUtPmFsbG9jIGJ5IHB1dHRpbmcgdGhlIGN1cnJlbnQNCisgKiBzdGF0ZS0+YWxsb2Mg aW50byB0aGUgcHVzaGVkIG5vZGUncyBzbG90WzBdLg0KKyAqDQorICogVGhlIHN0YXRlIGFsc28g Y29udGFpbnMgdGhlIGltcGxpZWQgbWluL21heCBvZiB0aGUgc3RhdGUtPm5vZGUsIHRoZSBkZXB0 aCBvZg0KKyAqIHRoaXMgc2VhcmNoLCBhbmQgdGhlIG9mZnNldC4gVGhlIGltcGxpZWQgbWluL21h eCBhcmUgZWl0aGVyIGZyb20gdGhlIHBhcmVudA0KKyAqIG5vZGUgb3IgYXJlIDAtb28gZm9yIHRo ZSByb290IG5vZGUuICBUaGUgZGVwdGggaXMgaW5jcmVtZW50ZWQgb3IgZGVjcmVtZW50ZWQNCisg KiBldmVyeSB0aW1lIGEgbm9kZSBpcyB3YWxrZWQgZG93biBvciB1cC4gIFRoZSBvZmZzZXQgaXMg dGhlIHNsb3QvcGl2b3Qgb2YNCisgKiBpbnRlcmVzdCBpbiB0aGUgbm9kZSAtIGVpdGhlciBmb3Ig cmVhZGluZyBvciB3cml0aW5nLg0KKyAqDQorICogV2hlbiByZXR1cm5pbmcgYSB2YWx1ZSB0aGUg bWFwbGUgc3RhdGUgaW5kZXggYW5kIGxhc3QgcmVzcGVjdGl2ZWx5IGNvbnRhaW4NCisgKiB0aGUg c3RhcnQgYW5kIGVuZCBvZiB0aGUgcmFuZ2UgZm9yIHRoZSBlbnRyeS4gIFJhbmdlcyBhcmUgaW5j bHVzaXZlIGluIHRoZQ0KKyAqIE1hcGxlIFRyZWUuDQorICovDQorc3RydWN0IG1hX3N0YXRlIHsN CisJc3RydWN0IG1hcGxlX3RyZWUgKnRyZWU7CS8qIFRoZSB0cmVlIHdlJ3JlIG9wZXJhdGluZyBp biAqLw0KKwl1bnNpZ25lZCBsb25nIGluZGV4OwkJLyogVGhlIGluZGV4IHdlJ3JlIG9wZXJhdGlu ZyBvbiAtIHJhbmdlIHN0YXJ0ICovDQorCXVuc2lnbmVkIGxvbmcgbGFzdDsJCS8qIFRoZSBsYXN0 IGluZGV4IHdlJ3JlIG9wZXJhdGluZyBvbiAtIHJhbmdlIGVuZCAqLw0KKwlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKm5vZGU7CS8qIFRoZSBub2RlIGNvbnRhaW5pbmcgdGhpcyBlbnRyeSAqLw0KKwl1bnNp Z25lZCBsb25nIG1pbjsJCS8qIFRoZSBtaW5pbXVtIGluZGV4IG9mIHRoaXMgbm9kZSAtIGltcGxp ZWQgcGl2b3QgbWluICovDQorCXVuc2lnbmVkIGxvbmcgbWF4OwkJLyogVGhlIG1heGltdW0gaW5k ZXggb2YgdGhpcyBub2RlIC0gaW1wbGllZCBwaXZvdCBtYXggKi8NCisJc3RydWN0IG1hcGxlX2Fs bG9jICphbGxvYzsJLyogQWxsb2NhdGVkIG5vZGVzIGZvciB0aGlzIG9wZXJhdGlvbiAqLw0KKwl1 bnNpZ25lZCBjaGFyIGRlcHRoOwkJLyogZGVwdGggb2YgdHJlZSBkZXNjZW50IGR1cmluZyB3cml0 ZSAqLw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgY2hhciBtYXNfZmxhZ3M7 DQorfTsNCisNCitzdHJ1Y3QgbWFfd3Jfc3RhdGUgew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hczsN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7CS8qIERlY29kZWQgbWFzLT5ub2RlICovDQorCXVu c2lnbmVkIGxvbmcgcl9taW47CQkvKiByYW5nZSBtaW4gKi8NCisJdW5zaWduZWQgbG9uZyByX21h eDsJCS8qIHJhbmdlIG1heCAqLw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsJCS8qIG1hcy0+bm9k ZSB0eXBlICovDQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0X2VuZDsJLyogVGhlIG9mZnNldCB3aGVy ZSB0aGUgd3JpdGUgZW5kcyAqLw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfZW5kOwkJLyogbWFzLT5u b2RlIGVuZCAqLw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7CQkvKiBtYXMtPm5vZGUtPnBpdm90 cyBwb2ludGVyICovDQorCXVuc2lnbmVkIGxvbmcgZW5kX3BpdjsJCS8qIFRoZSBwaXZvdCBhdCB0 aGUgb2Zmc2V0IGVuZCAqLw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7CQkvKiBtYXMtPm5vZGUtPnNs b3RzIHBvaW50ZXIgKi8NCisJdm9pZCAqZW50cnk7CQkJLyogVGhlIGVudHJ5IHRvIHdyaXRlICov DQorCXZvaWQgKmNvbnRlbnQ7CQkJLyogVGhlIGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgYmVpbmcg b3ZlcndyaXR0ZW4gKi8NCit9Ow0KKw0KKyNkZWZpbmUgbWFzX2xvY2sobWFzKSAgICAgICAgICAg c3Bpbl9sb2NrKCYoKG1hcyktPnRyZWUtPm1hX2xvY2spKQ0KKyNkZWZpbmUgbWFzX3VubG9jayht YXMpICAgICAgICAgc3Bpbl91bmxvY2soJigobWFzKS0+dHJlZS0+bWFfbG9jaykpDQorDQorDQor LyoNCisgKiBTcGVjaWFsIHZhbHVlcyBmb3IgbWFfc3RhdGUubm9kZS4NCisgKiBNQVNfU1RBUlQg bWVhbnMgd2UgaGF2ZSBub3Qgc2VhcmNoZWQgdGhlIHRyZWUuDQorICogTUFTX1JPT1QgbWVhbnMg d2UgaGF2ZSBzZWFyY2hlZCB0aGUgdHJlZSBhbmQgdGhlIGVudHJ5IHdlIGZvdW5kIGxpdmVzIGlu DQorICogdGhlIHJvb3Qgb2YgdGhlIHRyZWUgKGllIGl0IGhhcyBpbmRleCAwLCBsZW5ndGggMSBh bmQgaXMgdGhlIG9ubHkgZW50cnkgaW4NCisgKiB0aGUgdHJlZSkuDQorICogTUFTX05PTkUgbWVh bnMgd2UgaGF2ZSBzZWFyY2hlZCB0aGUgdHJlZSBhbmQgdGhlcmUgaXMgbm8gbm9kZSBpbiB0aGUN CisgKiB0cmVlIGZvciB0aGlzIGVudHJ5LiAgRm9yIGV4YW1wbGUsIHdlIHNlYXJjaGVkIGZvciBp bmRleCAxIGluIGFuIGVtcHR5DQorICogdHJlZS4gIE9yIHdlIGhhdmUgYSB0cmVlIHdoaWNoIHBv aW50cyB0byBhIGZ1bGwgbGVhZiBub2RlIGFuZCB3ZQ0KKyAqIHNlYXJjaGVkIGZvciBhbiBlbnRy eSB3aGljaCBpcyBsYXJnZXIgdGhhbiBjYW4gYmUgY29udGFpbmVkIGluIHRoYXQNCisgKiBsZWFm IG5vZGUuDQorICogTUFfRVJST1IgcmVwcmVzZW50cyBhbiBlcnJuby4gIEFmdGVyIGRyb3BwaW5n IHRoZSBsb2NrIGFuZCBhdHRlbXB0aW5nDQorICogdG8gcmVzb2x2ZSB0aGUgZXJyb3IsIHRoZSB3 YWxrIHdvdWxkIGhhdmUgdG8gYmUgcmVzdGFydGVkIGZyb20gdGhlDQorICogdG9wIG9mIHRoZSB0 cmVlIGFzIHRoZSB0cmVlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQuDQorICovDQorI2RlZmluZSBN QVNfU1RBUlQJKChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikxVUwpDQorI2RlZmluZSBNQVNfUk9PVAko KHN0cnVjdCBtYXBsZV9lbm9kZSAqKTVVTCkNCisjZGVmaW5lIE1BU19OT05FCSgoc3RydWN0IG1h cGxlX2Vub2RlICopOVVMKQ0KKyNkZWZpbmUgTUFTX1BBVVNFCSgoc3RydWN0IG1hcGxlX2Vub2Rl ICopMTdVTCkNCisjZGVmaW5lIE1BX0VSUk9SKGVycikgXA0KKwkJKChzdHJ1Y3QgbWFwbGVfZW5v ZGUgKikoKCh1bnNpZ25lZCBsb25nKWVyciA8PCAyKSB8IDJVTCkpDQorDQorI2RlZmluZSBNQV9T VEFURShuYW1lLCBtdCwgZmlyc3QsIGVuZCkJCQkJCVwNCisJc3RydWN0IG1hX3N0YXRlIG5hbWUg PSB7CQkJCQlcDQorCQkudHJlZSA9IG10LAkJCQkJCVwNCisJCS5pbmRleCA9IGZpcnN0LAkJCQkJ CVwNCisJCS5sYXN0ID0gZW5kLAkJCQkJCVwNCisJCS5ub2RlID0gTUFTX1NUQVJULAkJCQkJXA0K KwkJLm1pbiA9IDAsCQkJCQkJXA0KKwkJLm1heCA9IFVMT05HX01BWCwJCQkJCVwNCisJCS5hbGxv YyA9IE5VTEwsCQkJCQkJXA0KKwl9DQorDQorI2RlZmluZSBNQV9XUl9TVEFURShuYW1lLCBtYV9z dGF0ZSwgd3JfZW50cnkpCQkJCVwNCisJc3RydWN0IG1hX3dyX3N0YXRlIG5hbWUgPSB7CQkJCQlc DQorCQkubWFzID0gbWFfc3RhdGUsCQkJCQlcDQorCQkuY29udGVudCA9IE5VTEwsCQkJCQlcDQor CQkuZW50cnkgPSB3cl9lbnRyeSwJCQkJCVwNCisJfQ0KKw0KKyNkZWZpbmUgTUFfVE9QSUFSWShu YW1lLCB0cmVlKQkJCQkJCVwNCisJc3RydWN0IG1hX3RvcGlhcnkgbmFtZSA9IHsJCQkJCVwNCisJ CS5oZWFkID0gTlVMTCwJCQkJCQlcDQorCQkudGFpbCA9IE5VTEwsCQkJCQkJXA0KKwkJLm10cmVl ID0gdHJlZSwJCQkJCQlcDQorCX0NCisNCit2b2lkICptYXNfd2FsayhzdHJ1Y3QgbWFfc3RhdGUg Km1hcyk7DQordm9pZCAqbWFzX3N0b3JlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRy eSk7DQordm9pZCAqbWFzX2VyYXNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCitpbnQgbWFzX3N0 b3JlX2dmcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQor dm9pZCBtYXNfc3RvcmVfcHJlYWxsb2Moc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5 KTsNCit2b2lkICptYXNfZmluZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBt YXgpOw0KK3ZvaWQgKm1hc19maW5kX3JldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQg bG9uZyBtaW4pOw0KK2ludCBtYXNfcHJlYWxsb2NhdGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZv aWQgKmVudHJ5LCBnZnBfdCBnZnApOw0KK2Jvb2wgbWFzX2lzX2VycihzdHJ1Y3QgbWFfc3RhdGUg Km1hcyk7DQorDQorYm9vbCBtYXNfbm9tZW0oc3RydWN0IG1hX3N0YXRlICptYXMsIGdmcF90IGdm cCk7DQordm9pZCBtYXNfcGF1c2Uoc3RydWN0IG1hX3N0YXRlICptYXMpOw0KK3ZvaWQgbWFwbGVf dHJlZV9pbml0KHZvaWQpOw0KK3ZvaWQgbWFzX2Rlc3Ryb3koc3RydWN0IG1hX3N0YXRlICptYXMp Ow0KK2ludCBtYXNfZXhwZWN0ZWRfZW50cmllcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBucl9lbnRyaWVzKTsNCisNCit2b2lkICptYXNfcHJldihzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgdW5zaWduZWQgbG9uZyBtaW4pOw0KK3ZvaWQgKm1hc19uZXh0KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCk7DQorDQoraW50IG1hc19lbXB0eV9hcmVhKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwgdW5zaWduZWQgbG9uZyBtYXgsDQor CQkgICB1bnNpZ25lZCBsb25nIHNpemUpOw0KKw0KKy8qIENoZWNrcyBpZiBhIG1hcyBoYXMgbm90 IGZvdW5kIGFueXRoaW5nICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19ub25lKHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfTk9ORTsNCit9 DQorDQorLyogQ2hlY2tzIGlmIGEgbWFzIGhhcyBiZWVuIHBhdXNlZCAqLw0KK3N0YXRpYyBpbmxp bmUgYm9vbCBtYXNfaXNfcGF1c2VkKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJu IG1hcy0+bm9kZSA9PSBNQVNfUEFVU0U7DQorfQ0KKw0KK3ZvaWQgbWFzX2R1cF90cmVlKHN0cnVj dCBtYV9zdGF0ZSAqb2xkbWFzLCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQordm9pZCBtYXNfZHVw X3N0b3JlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSk7DQorDQorLyoNCisgKiBU aGlzIGZpbmRzIGFuIGVtcHR5IGFyZWEgZnJvbSB0aGUgaGlnaGVzdCBhZGRyZXNzIHRvIHRoZSBs b3dlc3QuDQorICogQUtBICJUb3Bkb3duIiB2ZXJzaW9uLA0KKyAqLw0KK2ludCBtYXNfZW1wdHlf YXJlYV9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJICAg ICAgIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25nIHNpemUpOw0KKy8qKg0KKyAqIG1h c19yZXNldCgpIC0gUmVzZXQgYSBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAbWFz OiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKg0KKyAqIFJlc2V0cyB0aGUgZXJyb3Ig b3Igd2FsayBzdGF0ZSBvZiB0aGUgQG1hcyBzbyBmdXR1cmUgd2Fsa3Mgb2YgdGhlDQorICogYXJy YXkgd2lsbCBzdGFydCBmcm9tIHRoZSByb290LiAgVXNlIHRoaXMgaWYgeW91IGhhdmUgZHJvcHBl ZCB0aGUNCisgKiBsb2NrIGFuZCB3YW50IHRvIHJldXNlIHRoZSBtYV9zdGF0ZS4NCisgKg0KKyAq IENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfcmVz ZXQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQor fQ0KKw0KKy8qKg0KKyAqIG1hc19mb3JfZWFjaCgpIC0gSXRlcmF0ZSBvdmVyIGEgcmFuZ2Ugb2Yg dGhlIG1hcGxlIHRyZWUuDQorICogQG1hczogTWFwbGUgVHJlZSBvcGVyYXRpb24gc3RhdGUgKG1h cGxlX3N0YXRlKQ0KKyAqIEBlbnRyeTogRW50cnkgcmV0cmlldmVkIGZyb20gdGhlIHRyZWUNCisg KiBAbWF4OiBtYXhpbXVtIGluZGV4IHRvIHJldHJpZXZlIGZyb20gdGhlIHRyZWUNCisgKg0KKyAq IFdoZW4gcmV0dXJuZWQsIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCB3aWxsIGhvbGQgdGhlIGVu dGlyZSByYW5nZSBmb3IgdGhlDQorICogZW50cnkuDQorICoNCisgKiBOb3RlOiBtYXkgcmV0dXJu IHRoZSB6ZXJvIGVudHJ5Lg0KKyAqDQorICovDQorI2RlZmluZSBtYXNfZm9yX2VhY2goX19tYXMs IF9fZW50cnksIF9fbWF4KSBcDQorCXdoaWxlICgoKF9fZW50cnkpID0gbWFzX2ZpbmQoKF9fbWFz KSwgKF9fbWF4KSkpICE9IE5VTEwpDQorDQorDQorLyoqDQorICogbWFzX3NldF9yYW5nZSgpIC0g U2V0IHVwIE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlIGZvciBhIGRpZmZlcmVudCBpbmRleC4N CisgKiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAc3RhcnQ6IE5ldyBz dGFydCBvZiByYW5nZSBpbiB0aGUgTWFwbGUgVHJlZS4NCisgKiBAbGFzdDogTmV3IGVuZCBvZiBy YW5nZSBpbiB0aGUgTWFwbGUgVHJlZS4NCisgKg0KKyAqIE1vdmUgdGhlIG9wZXJhdGlvbiBzdGF0 ZSB0byByZWZlciB0byBhIGRpZmZlcmVudCByYW5nZS4gIFRoaXMgd2lsbA0KKyAqIGhhdmUgdGhl IGVmZmVjdCBvZiBzdGFydGluZyBhIHdhbGsgZnJvbSB0aGUgdG9wOyBzZWUgbWFzX25leHQoKQ0K KyAqIHRvIG1vdmUgdG8gYW4gYWRqYWNlbnQgaW5kZXguDQorICovDQorc3RhdGljIGlubGluZQ0K K3ZvaWQgbWFzX3NldF9yYW5nZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBz dGFydCwgdW5zaWduZWQgbG9uZyBsYXN0KQ0KK3sNCisJICAgICAgIG1hcy0+aW5kZXggPSBzdGFy dDsNCisJICAgICAgIG1hcy0+bGFzdCA9IGxhc3Q7DQorCSAgICAgICBtYXMtPm5vZGUgPSBNQVNf U1RBUlQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19zZXQoKSAtIFNldCB1cCBNYXBsZSBUcmVlIG9w ZXJhdGlvbiBzdGF0ZSBmb3IgYSBkaWZmZXJlbnQgaW5kZXguDQorICogQG1hczogTWFwbGUgVHJl ZSBvcGVyYXRpb24gc3RhdGUuDQorICogQGluZGV4OiBOZXcgaW5kZXggaW50byB0aGUgTWFwbGUg VHJlZS4NCisgKg0KKyAqIE1vdmUgdGhlIG9wZXJhdGlvbiBzdGF0ZSB0byByZWZlciB0byBhIGRp ZmZlcmVudCBpbmRleC4gIFRoaXMgd2lsbA0KKyAqIGhhdmUgdGhlIGVmZmVjdCBvZiBzdGFydGlu ZyBhIHdhbGsgZnJvbSB0aGUgdG9wOyBzZWUgbWFzX25leHQoKQ0KKyAqIHRvIG1vdmUgdG8gYW4g YWRqYWNlbnQgaW5kZXguDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXQoc3RydWN0 IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKw0KKwltYXNfc2V0X3Jh bmdlKG1hcywgaW5kZXgsIGluZGV4KTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2V4 dGVybmFsX2xvY2soY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuICht dC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19MT0NLX01BU0spID09IE1UX0ZMQUdTX0xPQ0tfRVhURVJO Ow0KK30NCisNCisvKioNCisgKiBtdF9pbml0X2ZsYWdzKCkgLSBJbml0aWFsaXNlIGFuIGVtcHR5 IG1hcGxlIHRyZWUgd2l0aCBmbGFncy4NCisgKiBAbXQ6IE1hcGxlIFRyZWUNCisgKiBAZmxhZ3M6 IG1hcGxlIHRyZWUgZmxhZ3MuDQorICoNCisgKiBJZiB5b3UgbmVlZCB0byBpbml0aWFsaXNlIGEg TWFwbGUgVHJlZSB3aXRoIHNwZWNpYWwgZmxhZ3MgKGVnLCBhbg0KKyAqIGFsbG9jYXRpb24gdHJl ZSksIHVzZSB0aGlzIGZ1bmN0aW9uLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRleHQuDQor ICovDQorc3RhdGljIGlubGluZSB2b2lkIG10X2luaXRfZmxhZ3Moc3RydWN0IG1hcGxlX3RyZWUg Km10LCB1bnNpZ25lZCBpbnQgZmxhZ3MpDQorew0KKwltdC0+bWFfZmxhZ3MgPSBmbGFnczsNCisJ aWYgKCFtdF9leHRlcm5hbF9sb2NrKG10KSkNCisJCXNwaW5fbG9ja19pbml0KCZtdC0+bWFfbG9j ayk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihtdC0+bWFfcm9vdCwgTlVMTCk7DQorfQ0KKw0KKy8q Kg0KKyAqIG10X2luaXQoKSAtIEluaXRpYWxpc2UgYW4gZW1wdHkgbWFwbGUgdHJlZS4NCisgKiBA bXQ6IE1hcGxlIFRyZWUNCisgKg0KKyAqIEFuIGVtcHR5IE1hcGxlIFRyZWUuDQorICoNCisgKiBD b250ZXh0OiBBbnkgY29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfaW5pdChz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwltdF9pbml0X2ZsYWdzKG10LCAwKTsNCit9DQor DQorc3RhdGljIGlubGluZSBib29sIG10X2luX3JjdShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQor ew0KKyNpZmRlZiBDT05GSUdfTUFQTEVfUkNVX0RJU0FCTEVEDQorCXJldHVybiBmYWxzZTsNCisj ZW5kaWYNCisJcmV0dXJuIG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX1VTRV9SQ1U7DQorfQ0KKw0K Ky8qKg0KKyAqIG10X2NsZWFyX2luX3JjdSgpIC0gU3dpdGNoIHRoZSB0cmVlIHRvIG5vbi1SQ1Ug bW9kZS4NCisgKiBAbXQ6IFRoZSBNYXBsZSBUcmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lk IG10X2NsZWFyX2luX3JjdShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlpZiAoIW10X2lu X3JjdShtdCkpDQorCQlyZXR1cm47DQorDQorCWlmIChtdF9leHRlcm5hbF9sb2NrKG10KSkgew0K KwkJQlVHX09OKCFtdF9sb2NrX2lzX2hlbGQobXQpKTsNCisJCW10LT5tYV9mbGFncyAmPSB+TVRf RkxBR1NfVVNFX1JDVTsNCisJfSBlbHNlIHsNCisJCW10cmVlX2xvY2sobXQpOw0KKwkJbXQtPm1h X2ZsYWdzICY9IH5NVF9GTEFHU19VU0VfUkNVOw0KKwkJbXRyZWVfdW5sb2NrKG10KTsNCisJfQ0K K30NCisNCisvKioNCisgKiBtdF9zZXRfaW5fcmN1KCkgLSBTd2l0Y2ggdGhlIHRyZWUgdG8gUkNV IHNhZmUgbW9kZS4NCisgKiBAbXQ6IFRoZSBNYXBsZSBUcmVlDQorICovDQorc3RhdGljIGlubGlu ZSB2b2lkIG10X3NldF9pbl9yY3Uoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJaWYgKG10 X2luX3JjdShtdCkpDQorCQlyZXR1cm47DQorDQorCWlmIChtdF9leHRlcm5hbF9sb2NrKG10KSkg ew0KKwkJQlVHX09OKCFtdF9sb2NrX2lzX2hlbGQobXQpKTsNCisJCW10LT5tYV9mbGFncyB8PSBN VF9GTEFHU19VU0VfUkNVOw0KKwl9IGVsc2Ugew0KKwkJbXRyZWVfbG9jayhtdCk7DQorCQltdC0+ bWFfZmxhZ3MgfD0gTVRfRkxBR1NfVVNFX1JDVTsNCisJCW10cmVlX3VubG9jayhtdCk7DQorCX0N Cit9DQorDQordm9pZCAqbXRfZmluZChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxv bmcgKmluZGV4LCB1bnNpZ25lZCBsb25nIG1heCk7DQordm9pZCAqbXRfZmluZF9hZnRlcihzdHJ1 Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LA0KKwkJICAgIHVuc2lnbmVk IGxvbmcgbWF4KTsNCit2b2lkICptdF9wcmV2KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWdu ZWQgbG9uZyBpbmRleCwgIHVuc2lnbmVkIGxvbmcgbWluKTsNCit2b2lkICptdF9uZXh0KHN0cnVj dCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtYXgp Ow0KKw0KKy8qKg0KKyAqIG10X2Zvcl9lYWNoIC0gSXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgc3Rh cnRpbmcgYXQgaW5kZXggdW50aWwgbWF4Lg0KKyAqIEB0cmVlOiBUaGUgTWFwbGUgVHJlZQ0KKyAq IEBlbnRyeTogVGhlIGN1cnJlbnQgZW50cnkNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byB1cGRh dGUgdG8gdHJhY2sgdGhlIGxvY2F0aW9uIGluIHRoZSB0cmVlDQorICogQG1heDogVGhlIG1heGlt dW0gbGltaXQgZm9yIEBpbmRleA0KKyAqDQorICogTm90ZTogV2lsbCBub3QgcmV0dXJuIHRoZSB6 ZXJvIGVudHJ5Lg0KKyAqLw0KKyNkZWZpbmUgbXRfZm9yX2VhY2goX190cmVlLCBfX2VudHJ5LCBf X2luZGV4LCBfX21heCkgXA0KKwlmb3IgKF9fZW50cnkgPSBtdF9maW5kKF9fdHJlZSwgJihfX2lu ZGV4KSwgX19tYXgpOyBcDQorCQlfX2VudHJ5OyBfX2VudHJ5ID0gbXRfZmluZF9hZnRlcihfX3Ry ZWUsICYoX19pbmRleCksIF9fbWF4KSkNCisNCisNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExF X1RSRUUNCitleHRlcm4gYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19ydW47DQorZXh0ZXJuIGF0 b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkOw0KKw0KK3ZvaWQgbXRfZHVtcChjb25zdCBz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQpOw0KK3ZvaWQgbXRfdmFsaWRhdGUoc3RydWN0IG1hcGxlX3Ry ZWUgKm10KTsNCisjZGVmaW5lIE1UX0JVR19PTihfX3RyZWUsIF9feCkgZG8gewkJCQkJXA0KKwlh dG9taWNfaW5jKCZtYXBsZV90cmVlX3Rlc3RzX3J1bik7CQkJCVwNCisJaWYgKF9feCkgewkJCQkJ CQlcDQorCQlwcl9pbmZvKCJCVUcgYXQgJXM6JWQgKCV1KVxuIiwJCQkJXA0KKwkJX19mdW5jX18s IF9fTElORV9fLCBfX3gpOwkJCQlcDQorCQltdF9kdW1wKF9fdHJlZSk7CQkJCQlcDQorCQlwcl9p bmZvKCJQYXNzOiAldSBSdW46JXVcbiIsCQkJCVwNCisJCQlhdG9taWNfcmVhZCgmbWFwbGVfdHJl ZV90ZXN0c19wYXNzZWQpLAkJXA0KKwkJCWF0b21pY19yZWFkKCZtYXBsZV90cmVlX3Rlc3RzX3J1 bikpOwkJXA0KKwkJZHVtcF9zdGFjaygpOwkJCQkJCVwNCisJfSBlbHNlIHsJCQkJCQkJXA0KKwkJ YXRvbWljX2luYygmbWFwbGVfdHJlZV90ZXN0c19wYXNzZWQpOwkJCVwNCisJfQkJCQkJCQkJXA0K K30gd2hpbGUgKDApDQorI2Vsc2UNCisjZGVmaW5lIE1UX0JVR19PTihfX3RyZWUsIF9feCkgQlVH X09OKF9feCkNCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX01BUExFX1RSRUUgKi8NCisNCisjZW5k aWYgLypfTElOVVhfTUFQTEVfVFJFRV9IICovDQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9l dmVudHMvbWFwbGVfdHJlZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpu ZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi4yYmU0MDNiZGMyYmQNCi0t LSAvZGV2L251bGwNCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0KQEAg LTAsMCArMSwxMjMgQEANCisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLw0K KyN1bmRlZiBUUkFDRV9TWVNURU0NCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBtYXBsZV90cmVlDQor DQorI2lmICFkZWZpbmVkKF9UUkFDRV9NTV9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxU SV9SRUFEKQ0KKyNkZWZpbmUgX1RSQUNFX01NX0gNCisNCisNCisjaW5jbHVkZSA8bGludXgvdHJh Y2Vwb2ludC5oPg0KKw0KK3N0cnVjdCBtYV9zdGF0ZTsNCisNCitUUkFDRV9FVkVOVChtYV9vcCwN CisNCisJVFBfUFJPVE8oY29uc3QgY2hhciAqZm4sIHN0cnVjdCBtYV9zdGF0ZSAqbWFzKSwNCisN CisJVFBfQVJHUyhmbiwgbWFzKSwNCisNCisJVFBfU1RSVUNUX19lbnRyeSgNCisJCQlfX2ZpZWxk KGNvbnN0IGNoYXIgKiwgZm4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBtaW4pDQorCQkJ X19maWVsZCh1bnNpZ25lZCBsb25nLCBtYXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBp bmRleCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGxhc3QpDQorCQkJX19maWVsZCh2b2lk ICosIG5vZGUpDQorCSksDQorDQorCVRQX2Zhc3RfYXNzaWduKA0KKwkJCV9fZW50cnktPmZuCQk9 IGZuOw0KKwkJCV9fZW50cnktPm1pbgkJPSBtYXMtPm1pbjsNCisJCQlfX2VudHJ5LT5tYXgJCT0g bWFzLT5tYXg7DQorCQkJX19lbnRyeS0+aW5kZXgJCT0gbWFzLT5pbmRleDsNCisJCQlfX2VudHJ5 LT5sYXN0CQk9IG1hcy0+bGFzdDsNCisJCQlfX2VudHJ5LT5ub2RlCQk9IG1hcy0+bm9kZTsNCisJ KSwNCisNCisJVFBfcHJpbnRrKCIlc1x0Tm9kZTogJXAgKCVsdSAlbHUpIHJhbmdlOiAlbHUtJWx1 IiwNCisJCSAgX19lbnRyeS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkg ICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2Vu dHJ5LT5tYXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVu c2lnbmVkIGxvbmcpIF9fZW50cnktPmxhc3QNCisJKQ0KKykNCitUUkFDRV9FVkVOVChtYV9yZWFk LA0KKw0KKwlUUF9QUk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRlICptYXMpLA0K Kw0KKwlUUF9BUkdTKGZuLCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmll bGQoY29uc3QgY2hhciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJ CQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcs IGluZGV4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHZv aWQgKiwgbm9kZSkNCisJKSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4J CT0gZm47DQorCQkJX19lbnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJ PSBtYXMtPm1heDsNCisJCQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50 cnktPmxhc3QJCT0gbWFzLT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0K KwkpLA0KKw0KKwlUUF9wcmludGsoIiVzXHROb2RlOiAlcCAoJWx1ICVsdSkgcmFuZ2U6ICVsdS0l bHUiLA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+bm9kZSwNCisJ CSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9f ZW50cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LA0KKwkJICAo dW5zaWduZWQgbG9uZykgX19lbnRyeS0+bGFzdA0KKwkpDQorKQ0KKw0KK1RSQUNFX0VWRU5UKG1h X3dyaXRlLA0KKw0KKwlUUF9QUk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGxvbmcgcGl2LA0KKwkJIHZvaWQgKnZhbCksDQorDQorCVRQX0FSR1MoZm4s IG1hcywgcGl2LCB2YWwpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmllbGQoY29u c3QgY2hhciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJCQlfX2Zp ZWxkKHVuc2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGluZGV4 KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVk IGxvbmcsIHBpdikNCisJCQlfX2ZpZWxkKHZvaWQgKiwgdmFsKQ0KKwkJCV9fZmllbGQodm9pZCAq LCBub2RlKQ0KKwkpLA0KKw0KKwlUUF9mYXN0X2Fzc2lnbigNCisJCQlfX2VudHJ5LT5mbgkJPSBm bjsNCisJCQlfX2VudHJ5LT5taW4JCT0gbWFzLT5taW47DQorCQkJX19lbnRyeS0+bWF4CQk9IG1h cy0+bWF4Ow0KKwkJCV9fZW50cnktPmluZGV4CQk9IG1hcy0+aW5kZXg7DQorCQkJX19lbnRyeS0+ bGFzdAkJPSBtYXMtPmxhc3Q7DQorCQkJX19lbnRyeS0+cGl2CQk9IHBpdjsNCisJCQlfX2VudHJ5 LT52YWwJCT0gdmFsOw0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0K KwlUUF9wcmludGsoIiVzXHROb2RlICVwICglbHUgJWx1KSByYW5nZTolbHUtJWx1IHBpdiAoJWx1 KSB2YWwgJXAiLA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+bm9k ZSwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVuc2lnbmVkIGxv bmcpIF9fZW50cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LA0K KwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bGFzdCwNCisJCSAgKHVuc2lnbmVkIGxvbmcp IF9fZW50cnktPnBpdiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+dmFsDQorCSkNCispDQorI2Vu ZGlmIC8qIF9UUkFDRV9NTV9IICovDQorDQorLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBw cm90ZWN0aW9uICovDQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPg0KZGlmZiAtLWdp dCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMNCmluZGV4IDdmOTUzM2JhNTI3ZC4uZDJkZGQy MGM3NjE0IDEwMDY0NA0KLS0tIGEvaW5pdC9tYWluLmMNCisrKyBiL2luaXQvbWFpbi5jDQpAQCAt MTE3LDYgKzExNyw3IEBAIHN0YXRpYyBpbnQga2VybmVsX2luaXQodm9pZCAqKTsNCiANCiBleHRl cm4gdm9pZCBpbml0X0lSUSh2b2lkKTsNCiBleHRlcm4gdm9pZCByYWRpeF90cmVlX2luaXQodm9p ZCk7DQorZXh0ZXJuIHZvaWQgbWFwbGVfdHJlZV9pbml0KHZvaWQpOw0KIA0KIC8qDQogICogRGVi dWcgaGVscGVyOiB2aWEgdGhpcyBmbGFnIHdlIGtub3cgdGhhdCB3ZSBhcmUgaW4gJ2Vhcmx5IGJv b3R1cCBjb2RlJw0KQEAgLTEwMDMsNiArMTAwNCw3IEBAIGFzbWxpbmthZ2UgX192aXNpYmxlIHZv aWQgX19pbml0IF9fbm9fc2FuaXRpemVfYWRkcmVzcyBzdGFydF9rZXJuZWwodm9pZCkNCiAJCSAi SW50ZXJydXB0cyB3ZXJlIGVuYWJsZWQgKnZlcnkqIGVhcmx5LCBmaXhpbmcgaXRcbiIpKQ0KIAkJ bG9jYWxfaXJxX2Rpc2FibGUoKTsNCiAJcmFkaXhfdHJlZV9pbml0KCk7DQorCW1hcGxlX3RyZWVf aW5pdCgpOw0KIA0KIAkvKg0KIAkgKiBTZXQgdXAgaG91c2VrZWVwaW5nIGJlZm9yZSBzZXR0aW5n IHVwIHdvcmtxdWV1ZXMgdG8gYWxsb3cgdGhlIHVuYm91bmQNCmRpZmYgLS1naXQgYS9saWIvS2Nv bmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnDQppbmRleCAwNzJlNGIyODljMTMuLjNlOWJl MjQ3MzE2MyAxMDA2NDQNCi0tLSBhL2xpYi9LY29uZmlnLmRlYnVnDQorKysgYi9saWIvS2NvbmZp Zy5kZWJ1Zw0KQEAgLTgyMCw2ICs4MjAsMTMgQEAgY29uZmlnIERFQlVHX1ZNX1ZNQUNBQ0hFDQog CSAgY2FuIGNhdXNlIHNpZ25pZmljYW50IG92ZXJoZWFkLCBzbyBvbmx5IGVuYWJsZSBpdCBpbiBu b24tcHJvZHVjdGlvbg0KIAkgIGVudmlyb25tZW50cy4NCiANCitjb25maWcgREVCVUdfVk1fTUFQ TEVfVFJFRQ0KKwlib29sICJEZWJ1ZyBWTSBtYXBsZSB0cmVlcyINCisJZGVwZW5kcyBvbiBERUJV R19WTQ0KKwlzZWxlY3QgREVCVUdfTUFQTEVfVFJFRQ0KKwloZWxwDQorCSAgRW5hYmxlIFZNIG1h cGxlIHRyZWUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBleHRyYSB2YWxpZGF0aW9ucy4NCisN CiAJICBJZiB1bnN1cmUsIHNheSBOLg0KIA0KIGNvbmZpZyBERUJVR19WTV9SQg0KQEAgLTE2MzUs NiArMTY0MiwxNCBAQCBjb25maWcgQlVHX09OX0RBVEFfQ09SUlVQVElPTg0KIA0KIAkgIElmIHVu c3VyZSwgc2F5IE4uDQogDQorY29uZmlnIERFQlVHX01BUExFX1RSRUUNCisJYm9vbCAiRGVidWcg bWFwbGUgdHJlZXMiDQorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMDQorCWhlbHANCisJICBFbmFi bGUgbWFwbGUgdHJlZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIGV4dHJhIHZhbGlkYXRpb25z Lg0KKw0KKwkgIElmIHVuc3VyZSwgc2F5IE4uDQorDQogZW5kbWVudQ0KIA0KIGNvbmZpZyBERUJV R19DUkVERU5USUFMUw0KZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQ0K aW5kZXggYzk1MjEyMTQxOTI4Li5mYTA5ZGI5ODg5YTIgMTAwNjQ0DQotLS0gYS9saWIvTWFrZWZp bGUNCisrKyBiL2xpYi9NYWtlZmlsZQ0KQEAgLTI5LDcgKzI5LDcgQEAgZW5kaWYNCiANCiBsaWIt eSA6PSBjdHlwZS5vIHN0cmluZy5vIHZzcHJpbnRmLm8gY21kbGluZS5vIFwNCiAJIHJidHJlZS5v IHJhZGl4LXRyZWUubyB0aW1lcnF1ZXVlLm8geGFycmF5Lm8gXA0KLQkgaWRyLm8gZXh0YWJsZS5v IGlycV9yZWdzLm8gYXJndl9zcGxpdC5vIFwNCisJIG1hcGxlX3RyZWUubyBpZHIubyBleHRhYmxl Lm8gaXJxX3JlZ3MubyBhcmd2X3NwbGl0Lm8gXA0KIAkgZmxleF9wcm9wb3J0aW9ucy5vIHJhdGVs aW1pdC5vIHNob3dfbWVtLm8gXA0KIAkgaXNfc2luZ2xlX3RocmVhZGVkLm8gcGxpc3QubyBkZWNv bXByZXNzLm8ga29iamVjdF91ZXZlbnQubyBcDQogCSBlYXJseWNwaW8ubyBzZXFfYnVmLm8gc2lw aGFzaC5vIGRlY19hbmRfbG9jay5vIFwNCmRpZmYgLS1naXQgYS9saWIvbWFwbGVfdHJlZS5jIGIv bGliL21hcGxlX3RyZWUuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAw MC4uZTE3NDM4MDNjODUxDQotLS0gL2Rldi9udWxsDQorKysgYi9saWIvbWFwbGVfdHJlZS5jDQpA QCAtMCwwICsxLDcxMzAgQEANCisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsN CisvKg0KKyAqIE1hcGxlIFRyZWUgaW1wbGVtZW50YXRpb24NCisgKiBDb3B5cmlnaHQgKGMpIDIw MTgtMjAyMiBPcmFjbGUgQ29ycG9yYXRpb24NCisgKiBBdXRob3JzOiBMaWFtIFIuIEhvd2xldHQg PExpYW0uSG93bGV0dEBvcmFjbGUuY29tPg0KKyAqCSAgICBNYXR0aGV3IFdpbGNveCA8d2lsbHlA aW5mcmFkZWFkLm9yZz4NCisgKi8NCisNCisvKg0KKyAqIERPQzogSW50ZXJlc3RpbmcgaW1wbGVt ZW50YXRpb24gZGV0YWlscyBvZiB0aGUgTWFwbGUgVHJlZQ0KKyAqDQorICogRWFjaCBub2RlIHR5 cGUgaGFzIGEgbnVtYmVyIG9mIHNsb3RzIGZvciBlbnRyaWVzIGFuZCBhIG51bWJlciBvZiBzbG90 cyBmb3INCisgKiBwaXZvdHMuICBJbiB0aGUgY2FzZSBvZiBkZW5zZSBub2RlcywgdGhlIHBpdm90 cyBhcmUgaW1wbGllZCBieSB0aGUgcG9zaXRpb24NCisgKiBhbmQgYXJlIHNpbXBseSB0aGUgc2xv dCBpbmRleCArIHRoZSBtaW5pbXVtIG9mIHRoZSBub2RlLg0KKyAqDQorICogSW4gcmVndWxhciBC LVRyZWUgdGVybXMsIHBpdm90cyBhcmUgY2FsbGVkIGtleXMuICBUaGUgdGVybSBwaXZvdCBpcyB1 c2VkIHRvDQorICogaW5kaWNhdGUgdGhhdCB0aGUgdHJlZSBpcyBzcGVjaWZ5aW5nIHJhbmdlcywg IFBpdm90cyBtYXkgYXBwZWFyIGluIHRoZQ0KKyAqIHN1YnRyZWUgd2l0aCBhbiBlbnRyeSBhdHRh Y2hlZCB0byB0aGUgdmFsdWUgd2hlcmUgYXMga2V5cyBhcmUgdW5pcXVlIHRvIGENCisgKiBzcGVj aWZpYyBwb3NpdGlvbiBvZiBhIEItdHJlZS4gIFBpdm90IHZhbHVlcyBhcmUgaW5jbHVzaXZlIG9m IHRoZSBzbG90IHdpdGgNCisgKiB0aGUgc2FtZSBpbmRleC4NCisgKg0KKyAqDQorICogVGhlIGZv bGxvd2luZyBpbGx1c3RyYXRlcyB0aGUgbGF5b3V0IG9mIGEgcmFuZ2U2NCBub2RlcyBzbG90cyBh bmQgcGl2b3RzLg0KKyAqDQorICoNCisgKiAgU2xvdHMgLT4gfCAwIHwgMSB8IDIgfCAuLi4gfCAx MiB8IDEzIHwgMTQgfCAxNSB8DQorICogICAgICAgICAgIOKUrCAgIOKUrCAgIOKUrCAgIOKUrCAg ICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrA0KKyAqICAgICAgICAgICDilIIgICDi lIIgICDilIIgICDilIIgICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIAgSW1w bGllZCBtYXhpbXVtDQorICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg4pSC ICAgIOKUgiAgICDilIIgICAg4pSU4pSAIFBpdm90IDE0DQorICogICAgICAgICAgIOKUgiAgIOKU giAgIOKUgiAgIOKUgiAgICAg4pSCICAgIOKUgiAgICDilJTilIAgUGl2b3QgMTMNCisgKiAgICAg ICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilIIgICAg4pSU4pSAIFBpdm90IDEyDQor ICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg4pSU4pSAIFBpdm90IDExDQor ICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUlOKUgCBQaXZvdCAyDQorICogICAgICAg ICAgIOKUgiAgIOKUgiAgIOKUlOKUgCBQaXZvdCAxDQorICogICAgICAgICAgIOKUgiAgIOKUlOKU gCBQaXZvdCAwDQorICogICAgICAgICAgIOKUlOKUgCAgSW1wbGllZCBtaW5pbXVtDQorICoNCisg KiBTbG90IGNvbnRlbnRzOg0KKyAqICBJbnRlcm5hbCAobm9uLWxlYWYpIG5vZGVzIGNvbnRhaW4g cG9pbnRlcnMgdG8gb3RoZXIgbm9kZXMuDQorICogIExlYWYgbm9kZXMgY29udGFpbiBlbnRyaWVz Lg0KKyAqDQorICogVGhlIGxvY2F0aW9uIG9mIGludGVyZXN0IGlzIG9mdGVuIHJlZmVycmVkIHRv IGFzIGFuIG9mZnNldC4gIEFsbCBvZmZzZXRzIGhhdmUNCisgKiBhIHNsb3QsIGJ1dCB0aGUgbGFz dCBvZmZzZXQgaGFzIGFuIGltcGxpZWQgcGl2b3QgZnJvbSB0aGUgbm9kZSBhYm92ZSAob3INCisg KiBVSU5UX01BWCBmb3IgdGhlIHJvb3Qgbm9kZS4NCisgKg0KKyAqIFJhbmdlcyBjb21wbGljYXRl IGNlcnRhaW4gd3JpdGUgYWN0aXZpdGllcy4gIFdoZW4gbW9kaWZ5aW5nIGFueSBvZg0KKyAqIHRo ZSBCLXRyZWUgdmFyaWFudHMsIGl0IGlzIGtub3duIHRoYXQgb25lIGVudHJ5IHdpbGwgZWl0aGVy IGJlIGFkZGVkIG9yDQorICogZGVsZXRlZC4gIFdoZW4gbW9kaWZ5aW5nIHRoZSBNYXBsZSBUcmVl LCBvbmUgc3RvcmUgb3BlcmF0aW9uIG1heSBvdmVyd3JpdGUNCisgKiB0aGUgZW50aXJlIGRhdGEg c2V0LCBvciBvbmUgaGFsZiBvZiB0aGUgdHJlZSwgb3IgdGhlIG1pZGRsZSBoYWxmIG9mIHRoZSB0 cmVlLg0KKyAqDQorICovDQorDQorDQorI2luY2x1ZGUgPGxpbnV4L21hcGxlX3RyZWUuaD4NCisj aW5jbHVkZSA8bGludXgveGFycmF5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQorI2lu Y2x1ZGUgPGxpbnV4L2V4cG9ydC5oPg0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQorI2luY2x1 ZGUgPGxpbnV4L2xpbWl0cy5oPg0KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPg0KKw0KKyNkZWZp bmUgQ1JFQVRFX1RSQUNFX1BPSU5UUw0KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbWFwbGVfdHJl ZS5oPg0KKw0KKyNkZWZpbmUgTUFfUk9PVF9QQVJFTlQgMQ0KKw0KKy8qDQorICogTWFwbGUgc3Rh dGUgZmxhZ3MNCisgKiAqIE1BX1NUQVRFX0JVTEsJCS0gQnVsayBpbnNlcnQgbW9kZQ0KKyAqICog TUFfU1RBVEVfUkVCQUxBTkNFCQktIEluZGljYXRlIGEgcmViYWxhbmNlIGR1cmluZyBidWxrIGlu c2VydA0KKyAqICogTUFfU1RBVEVfUFJFQUxMT0MJCS0gUHJlYWxsb2NhdGVkIG5vZGVzLCBXQVJO X09OIGFsbG9jYXRpb24NCisgKi8NCisjZGVmaW5lIE1BX1NUQVRFX0JVTEsJCTENCisjZGVmaW5l IE1BX1NUQVRFX1JFQkFMQU5DRQkyDQorI2RlZmluZSBNQV9TVEFURV9QUkVBTExPQwk0DQorDQor I2RlZmluZSBtYV9wYXJlbnRfcHRyKHgpICgoc3RydWN0IG1hcGxlX3Bub2RlICopKHgpKQ0KKyNk ZWZpbmUgbWFfbW5vZGVfcHRyKHgpICgoc3RydWN0IG1hcGxlX25vZGUgKikoeCkpDQorI2RlZmlu ZSBtYV9lbm9kZV9wdHIoeCkgKChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikoeCkpDQorc3RhdGljIHN0 cnVjdCBrbWVtX2NhY2hlICptYXBsZV9ub2RlX2NhY2hlOw0KKw0KKyNpZmRlZiBDT05GSUdfREVC VUdfTUFQTEVfVFJFRQ0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG10X21heFtdID0gew0K KwlbbWFwbGVfZGVuc2VdCQk9IE1BUExFX05PREVfU0xPVFMsDQorCVttYXBsZV9sZWFmXzY0XQkJ PSBVTE9OR19NQVgsDQorCVttYXBsZV9yYW5nZV82NF0JPSBVTE9OR19NQVgsDQorCVttYXBsZV9h cmFuZ2VfNjRdCT0gVUxPTkdfTUFYLA0KK307DQorI2RlZmluZSBtdF9ub2RlX21heCh4KSBtdF9t YXhbbXRlX25vZGVfdHlwZSh4KV0NCisjZW5kaWYNCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQg Y2hhciBtdF9zbG90c1tdID0gew0KKwlbbWFwbGVfZGVuc2VdCQk9IE1BUExFX05PREVfU0xPVFMs DQorCVttYXBsZV9sZWFmXzY0XQkJPSBNQVBMRV9SQU5HRTY0X1NMT1RTLA0KKwlbbWFwbGVfcmFu Z2VfNjRdCT0gTUFQTEVfUkFOR0U2NF9TTE9UUywNCisJW21hcGxlX2FyYW5nZV82NF0JPSBNQVBM RV9BUkFOR0U2NF9TTE9UUywNCit9Ow0KKyNkZWZpbmUgbXRfc2xvdF9jb3VudCh4KSBtdF9zbG90 c1ttdGVfbm9kZV90eXBlKHgpXQ0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG10X3Bp dm90c1tdID0gew0KKwlbbWFwbGVfZGVuc2VdCQk9IDAsDQorCVttYXBsZV9sZWFmXzY0XQkJPSBN QVBMRV9SQU5HRTY0X1NMT1RTIC0gMSwNCisJW21hcGxlX3JhbmdlXzY0XQk9IE1BUExFX1JBTkdF NjRfU0xPVFMgLSAxLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IE1BUExFX0FSQU5HRTY0X1NMT1RT IC0gMSwNCit9Ow0KKyNkZWZpbmUgbXRfcGl2b3RfY291bnQoeCkgbXRfcGl2b3RzW210ZV9ub2Rl X3R5cGUoeCldDQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXRfbWluX3Nsb3RzW10g PSB7DQorCVttYXBsZV9kZW5zZV0JCT0gTUFQTEVfTk9ERV9TTE9UUyAvIDIsDQorCVttYXBsZV9s ZWFmXzY0XQkJPSAoTUFQTEVfUkFOR0U2NF9TTE9UUyAvIDIpIC0gMiwNCisJW21hcGxlX3Jhbmdl XzY0XQk9IChNQVBMRV9SQU5HRTY0X1NMT1RTIC8gMikgLSAyLA0KKwlbbWFwbGVfYXJhbmdlXzY0 XQk9IChNQVBMRV9BUkFOR0U2NF9TTE9UUyAvIDIpIC0gMSwNCit9Ow0KKyNkZWZpbmUgbXRfbWlu X3Nsb3RfY291bnQoeCkgbXRfbWluX3Nsb3RzW210ZV9ub2RlX3R5cGUoeCldDQorDQorI2RlZmlu ZSBNQVBMRV9CSUdfTk9ERV9TTE9UUwkoTUFQTEVfUkFOR0U2NF9TTE9UUyAqIDIgKyAyKQ0KKyNk ZWZpbmUgTUFQTEVfQklHX05PREVfR0FQUwkoTUFQTEVfQVJBTkdFNjRfU0xPVFMgKiAyICsgMSkN CisNCitzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVu dDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9CSUdfTk9ERV9TTE9UUyAtIDFdOw0KKwl1 bmlvbiB7DQorCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnNsb3RbTUFQTEVfQklHX05PREVfU0xPVFNd Ow0KKwkJc3RydWN0IHsNCisJCQl1bnNpZ25lZCBsb25nIHBhZGRpbmdbTUFQTEVfQklHX05PREVf R0FQU107DQorCQkJdW5zaWduZWQgbG9uZyBnYXBbTUFQTEVfQklHX05PREVfR0FQU107DQorCQl9 Ow0KKwl9Ow0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsN Cit9Ow0KKw0KKy8qDQorICogVGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUgaXMgdXNlZCB0byBidWls ZCBhIHRyZWUgdG8gcmVwbGFjZSBhIHNlZ21lbnQgb2YgYW4NCisgKiBleGlzdGluZyB0cmVlIGlu IGEgbW9yZSBhdG9taWMgd2F5LiAgQW55IHdhbGtlcnMgb2YgdGhlIG9sZGVyIHRyZWUgd2lsbCBo aXQgYQ0KKyAqIGRlYWQgbm9kZSBhbmQgcmVzdGFydCBvbiB1cGRhdGVzLg0KKyAqLw0KK3N0cnVj dCBtYXBsZV9zdWJ0cmVlX3N0YXRlIHsNCisJc3RydWN0IG1hX3N0YXRlICpvcmlnX2w7CS8qIE9y aWdpbmFsIGxlZnQgc2lkZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqb3JpZ19y OwkvKiBPcmlnaW5hbCByaWdodCBzaWRlIG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRl ICpsOwkJLyogTmV3IGxlZnQgc2lkZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAq bTsJCS8qIE5ldyBtaWRkbGUgb2Ygc3VidHJlZSAocmFyZSkgKi8NCisJc3RydWN0IG1hX3N0YXRl ICpyOwkJLyogTmV3IHJpZ2h0IHNpZGUgb2Ygc3VidHJlZSAqLw0KKwlzdHJ1Y3QgbWFfdG9waWFy eSAqZnJlZTsJLyogbm9kZXMgdG8gYmUgZnJlZWQgKi8NCisJc3RydWN0IG1hX3RvcGlhcnkgKmRl c3Ryb3k7CS8qIE5vZGVzIHRvIGJlIGRlc3Ryb3llZCAod2Fsa2VkIGFuZCBmcmVlZCkgKi8NCisJ c3RydWN0IG1hcGxlX2JpZ19ub2RlICpibjsNCit9Ow0KKw0KKy8qIEZ1bmN0aW9ucyAqLw0KK3N0 YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10X2FsbG9jX29uZShnZnBfdCBnZnApDQor ew0KKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhtYXBsZV9ub2RlX2NhY2hlLCBnZnAgfCBfX0dG UF9aRVJPKTsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQgbXRfYWxsb2NfYnVsayhnZnBfdCBn ZnAsIHNpemVfdCBzaXplLCB2b2lkICoqbm9kZXMpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9h bGxvY19idWxrKG1hcGxlX25vZGVfY2FjaGUsIGdmcCB8IF9fR0ZQX1pFUk8sIHNpemUsDQorCQkJ CSAgICAgbm9kZXMpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfZnJlZV9idWxrKHNp emVfdCBzaXplLCB2b2lkIF9fcmN1ICoqbm9kZXMpDQorew0KKwlrbWVtX2NhY2hlX2ZyZWVfYnVs ayhtYXBsZV9ub2RlX2NhY2hlLCBzaXplLCAodm9pZCAqKilub2Rlcyk7DQorfQ0KKw0KK3N0YXRp YyB2b2lkIG10X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkNCit7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYXBsZV9ub2RlLCBy Y3UpOw0KKw0KKwlrbWVtX2NhY2hlX2ZyZWUobWFwbGVfbm9kZV9jYWNoZSwgbm9kZSk7DQorfQ0K Kw0KKy8qDQorICogbWFfZnJlZV9yY3UoKSAtIFVzZSByY3UgY2FsbGJhY2sgdG8gZnJlZSBhIG1h cGxlIG5vZGUNCisgKiBAbm9kZTogVGhlIG5vZGUgdG8gZnJlZQ0KKyAqDQorICogVGhlIG1hcGxl IHRyZWUgdXNlcyB0aGUgcGFyZW50IHBvaW50ZXIgdG8gaW5kaWNhdGUgdGhpcyBub2RlIGlzIG5v IGxvbmdlciBpbg0KKyAqIHVzZSBhbmQgd2lsbCBiZSBmcmVlZC4NCisgKi8NCitzdGF0aWMgdm9p ZCBtYV9mcmVlX3JjdShzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSkNCit7DQorCW5vZGUtPnBhcmVu dCA9IG1hX3BhcmVudF9wdHIobm9kZSk7DQorCWNhbGxfcmN1KCZub2RlLT5yY3UsIG10X2ZyZWVf cmN1KTsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIGludCBtdF9oZWlnaHQoY29uc3Qgc3RydWN0 IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIChtdC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19I RUlHSFRfTUFTSykgPj4gTVRfRkxBR1NfSEVJR0hUX09GRlNFVDsNCit9DQorDQorc3RhdGljIHZv aWQgbWFzX3NldF9oZWlnaHQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBp bnQgbmV3X2ZsYWdzID0gbWFzLT50cmVlLT5tYV9mbGFnczsNCisNCisJbmV3X2ZsYWdzICY9IH5N VF9GTEFHU19IRUlHSFRfTUFTSzsNCisJQlVHX09OKG1hcy0+ZGVwdGggPiBNQVBMRV9IRUlHSFRf TUFYKTsNCisJbmV3X2ZsYWdzIHw9IG1hcy0+ZGVwdGggPDwgTVRfRkxBR1NfSEVJR0hUX09GRlNF VDsNCisJbWFzLT50cmVlLT5tYV9mbGFncyA9IG5ld19mbGFnczsNCit9DQorDQorc3RhdGljIHVu c2lnbmVkIGludCBtYXNfbXRfaGVpZ2h0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0 dXJuIG10X2hlaWdodChtYXMtPnRyZWUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGVudW0gbWFw bGVfdHlwZSBtdGVfbm9kZV90eXBlKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnkpDQor ew0KKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWVudHJ5ID4+IE1BUExFX05PREVfVFlQRV9TSElG VCkgJg0KKwkJTUFQTEVfTk9ERV9UWVBFX01BU0s7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9v bCBtYV9pc19kZW5zZShjb25zdCBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXJldHVybiB0 eXBlIDwgbWFwbGVfbGVhZl82NDsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lzX2xl YWYoY29uc3QgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlyZXR1cm4gdHlwZSA8IG1hcGxl X3JhbmdlXzY0Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRlX2lzX2xlYWYoY29uc3Qg c3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJldHVybiBtYV9pc19sZWFmKG10ZV9u b2RlX3R5cGUoZW50cnkpKTsNCit9DQorDQorLyoNCisgKiBXZSBhbHNvIHJlc2VydmUgdmFsdWVz IHdpdGggdGhlIGJvdHRvbSB0d28gYml0cyBzZXQgdG8gJzEwJyB3aGljaCBhcmUNCisgKiBiZWxv dyA0MDk2DQorICovDQorc3RhdGljIGlubGluZSBib29sIG10X2lzX3Jlc2VydmVkKGNvbnN0IHZv aWQgKmVudHJ5KQ0KK3sNCisJcmV0dXJuICgodW5zaWduZWQgbG9uZyllbnRyeSA8IE1BUExFX1JF U0VSVkVEX1JBTkdFKSAmJg0KKwkJeGFfaXNfaW50ZXJuYWwoZW50cnkpOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3NldF9lcnIoc3RydWN0IG1hX3N0YXRlICptYXMsIGxvbmcgZXJy KQ0KK3sNCisJbWFzLT5ub2RlID0gTUFfRVJST1IoZXJyKTsNCit9DQorDQorc3RhdGljIGlubGlu ZSBib29sIG1hc19pc19wdHIoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFz LT5ub2RlID09IE1BU19ST09UOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX2lzX3N0 YXJ0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNf U1RBUlQ7DQorfQ0KKw0KK2Jvb2wgbWFzX2lzX2VycihzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7 DQorCXJldHVybiB4YV9pc19lcnIobWFzLT5ub2RlKTsNCit9DQorDQorc3RhdGljIGlubGluZSBi b29sIG1hc19zZWFyY2hhYmxlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaWYgKG1hc19p c19ub25lKG1hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykp DQorCQlyZXR1cm4gZmFsc2U7DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBtYXBsZV9ub2RlICptdGVfdG9fbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfZW5v ZGUgKmVudHJ5KQ0KK3sNCisJcmV0dXJuIChzdHJ1Y3QgbWFwbGVfbm9kZSAqKSgodW5zaWduZWQg bG9uZyllbnRyeSAmIH5NQVBMRV9OT0RFX01BU0spOw0KK30NCisNCisvKg0KKyAqIG10ZV90b19t YXQoKSAtIENvbnZlcnQgYSBtYXBsZSBlbmNvZGVkIG5vZGUgdG8gYSBtYXBsZSB0b3BpYXJ5IG5v ZGUuDQorICogQGVudHJ5OiBUaGUgbWFwbGUgZW5jb2RlZCBub2RlDQorICoNCisgKiBSZXR1cm46 IGEgbWFwbGUgdG9waWFyeSBwb2ludGVyDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFw bGVfdG9waWFyeSAqbXRlX3RvX21hdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVudHJ5KQ0K K3sNCisJcmV0dXJuIChzdHJ1Y3QgbWFwbGVfdG9waWFyeSAqKQ0KKwkJKCh1bnNpZ25lZCBsb25n KWVudHJ5ICYgfk1BUExFX05PREVfTUFTSyk7DQorfQ0KKw0KKy8qDQorICogbWFzX21uKCkgLSBH ZXQgdGhlIG1hcGxlIHN0YXRlIG5vZGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoN CisgKiBSZXR1cm46IHRoZSBtYXBsZSBub2RlIChub3QgZW5jb2RlZCAtIGJhcmUgcG9pbnRlciku DQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAqbWFzX21uKGNvbnN0IHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG10ZV90b19ub2RlKG1hcy0+bm9kZSk7 DQorfQ0KKw0KKy8qDQorICogbXRlX3NldF9ub2RlX2RlYWQoKSAtIFNldCBhIG1hcGxlIGVuY29k ZWQgbm9kZSBhcyBkZWFkLg0KKyAqIEBtbjogVGhlIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX3NldF9ub2RlX2RlYWQoc3RydWN0IG1hcGxlX2Vub2Rl ICptbikNCit7DQorCW10ZV90b19ub2RlKG1uKS0+cGFyZW50ID0gbWFfcGFyZW50X3B0cihtdGVf dG9fbm9kZShtbikpOw0KKwlzbXBfd21iKCk7IC8qIE5lZWRlZCBmb3IgUkNVICovDQorfQ0KKw0K Ky8qIEJpdCAxIGluZGljYXRlcyB0aGUgcm9vdCBpcyBhIG5vZGUgKi8NCisjZGVmaW5lIE1BUExF X1JPT1RfTk9ERQkJCTB4MDINCisvKiBtYXBsZV90eXBlIHN0b3JlZCBiaXQgMy02ICovDQorI2Rl ZmluZSBNQVBMRV9FTk9ERV9UWVBFX1NISUZUCQkweDAzDQorLyogQml0IDIgbWVhbnMgYSBOVUxM IHNvbWV3aGVyZSBiZWxvdyAqLw0KKyNkZWZpbmUgTUFQTEVfRU5PREVfTlVMTAkJMHgwNA0KKw0K K3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlICptdF9ta19ub2RlKGNvbnN0IHN0cnVj dCBtYXBsZV9ub2RlICpub2RlLA0KKwkJCQkJICAgICBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7 DQorCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZylub2RlIHwNCisJCQkodHlwZSA8PCBN QVBMRV9FTk9ERV9UWVBFX1NISUZUKSB8IE1BUExFX0VOT0RFX05VTEwpOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIHZvaWQgKm10ZV9ta19yb290KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9k ZSkNCit7DQorCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZylub2RlIHwgTUFQTEVfUk9P VF9OT0RFKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdGVfc2FmZV9yb290KGNvbnN0 IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCXJldHVybiAodm9pZCAqKSgodW5zaWdu ZWQgbG9uZylub2RlICYgfk1BUExFX1JPT1RfTk9ERSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg dm9pZCBtdGVfc2V0X2Z1bGwoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJ bm9kZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgJiB+TUFQTEVfRU5PREVfTlVMTCk7 DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfY2xlYXJfZnVsbChjb25zdCBzdHJ1Y3Qg bWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlub2RlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcp bm9kZSB8IE1BUExFX0VOT0RFX05VTEwpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFf aXNfcm9vdChzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSkNCit7DQorCXJldHVybiAoKHVuc2lnbmVk IGxvbmcpbm9kZS0+cGFyZW50ICYgTUFfUk9PVF9QQVJFTlQpOw0KK30NCisNCitzdGF0aWMgaW5s aW5lIGJvb2wgbXRlX2lzX3Jvb3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sN CisJcmV0dXJuIG1hX2lzX3Jvb3QobXRlX3RvX25vZGUobm9kZSkpOw0KK30NCisNCitzdGF0aWMg aW5saW5lIGJvb2wgbWFzX2lzX3Jvb3RfbGltaXRzKGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJcmV0dXJuICFtYXMtPm1pbiAmJiBtYXMtPm1heCA9PSBVTE9OR19NQVg7DQorfQ0K Kw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdF9pc19hbGxvYyhzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQp DQorew0KKwlyZXR1cm4gKG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX0FMTE9DX1JBTkdFKTsNCit9 DQorDQorLyoNCisgKiBUaGUgUGFyZW50IFBvaW50ZXINCisgKiBFeGNsdWRpbmcgcm9vdCwgdGhl IHBhcmVudCBwb2ludGVyIGlzIDI1NkIgYWxpZ25lZCBsaWtlIGFsbCBvdGhlciB0cmVlIG5vZGVz Lg0KKyAqIFdoZW4gc3RvcmluZyBhIDMyIG9yIDY0IGJpdCB2YWx1ZXMsIHRoZSBvZmZzZXQgY2Fu IGZpdCBpbnRvIDUgYml0cy4gIFRoZSAxNg0KKyAqIGJpdCB2YWx1ZXMgbmVlZCBhbiBleHRyYSBi aXQgdG8gc3RvcmUgdGhlIG9mZnNldC4gIFRoaXMgZXh0cmEgYml0IGNvbWVzIGZyb20NCisgKiBh IHJldXNlIG9mIHRoZSBsYXN0IGJpdCBpbiB0aGUgbm9kZSB0eXBlLiAgVGhpcyBpcyBwb3NzaWJs ZSBieSB1c2luZyBiaXQgMSB0bw0KKyAqIGluZGljYXRlIGlmIGJpdCAyIGlzIHBhcnQgb2YgdGhl IHR5cGUgb3IgdGhlIHNsb3QuDQorICoNCisgKiBOb3RlIHR5cGVzOg0KKyAqICAweD8/MSA9IFJv b3QNCisgKiAgMHg/MDAgPSAxNiBiaXQgbm9kZXMNCisgKiAgMHgwMTAgPSAzMiBiaXQgbm9kZXMN CisgKiAgMHgxMTAgPSA2NCBiaXQgbm9kZXMNCisgKg0KKyAqIFNsb3Qgc2l6ZSBhbmQgYWxpZ25t ZW50DQorICogIDBiPz8xIDogUm9vdA0KKyAqICAwYj8wMCA6IDE2IGJpdCB2YWx1ZXMsIHR5cGUg aW4gMC0xLCBzbG90IGluIDItNw0KKyAqICAwYjAxMCA6IDMyIGJpdCB2YWx1ZXMsIHR5cGUgaW4g MC0yLCBzbG90IGluIDMtNw0KKyAqICAwYjExMCA6IDY0IGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0y LCBzbG90IGluIDMtNw0KKyAqLw0KKw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1JPT1QJCTB4MDEN CisNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9TTE9UX1NISUZUCQkweDAzDQorI2RlZmluZSBNQVBM RV9QQVJFTlRfU0xPVF9NQVNLCQkweEY4DQorDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfMTZCX1NM T1RfU0hJRlQJMHgwMg0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX01BU0sJMHhGQw0K Kw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1JBTkdFNjQJCTB4MDYNCisjZGVmaW5lIE1BUExFX1BB UkVOVF9SQU5HRTMyCQkweDA0DQorI2RlZmluZSBNQVBMRV9QQVJFTlRfTk9UX1JBTkdFMTYJMHgw Mg0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zaGlmdCgpIC0gR2V0IHRoZSBwYXJlbnQgc2hpZnQg Zm9yIHRoZSBzbG90IHN0b3JhZ2UuDQorICogQHBhcmVudDogVGhlIHBhcmVudCBwb2ludGVyIGNh c3QgYXMgYW4gdW5zaWduZWQgbG9uZw0KKyAqIFJldHVybjogVGhlIHNoaWZ0IGludG8gdGhhdCBw b2ludGVyIHRvIHRoZSBzdGFyIHRvIG9mIHRoZSBzbG90DQorICovDQorc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nIG10ZV9wYXJlbnRfc2hpZnQodW5zaWduZWQgbG9uZyBwYXJlbnQpDQorew0K KwkvKiBOb3RlIGJpdCAxID09IDAgbWVhbnMgMTZCICovDQorCWlmIChsaWtlbHkocGFyZW50ICYg TUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2KSkNCisJCXJldHVybiBNQVBMRV9QQVJFTlRfU0xPVF9T SElGVDsNCisNCisJcmV0dXJuIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9TSElGVDsNCit9DQorDQor LyoNCisgKiBtdGVfcGFyZW50X3Nsb3RfbWFzaygpIC0gR2V0IHRoZSBzbG90IG1hc2sgZm9yIHRo ZSBwYXJlbnQuDQorICogQHBhcmVudDogVGhlIHBhcmVudCBwb2ludGVyIGNhc3QgYXMgYW4gdW5z aWduZWQgbG9uZy4NCisgKiBSZXR1cm46IFRoZSBzbG90IG1hc2sgZm9yIHRoYXQgcGFyZW50Lg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtdGVfcGFyZW50X3Nsb3RfbWFzayh1 bnNpZ25lZCBsb25nIHBhcmVudCkNCit7DQorCS8qIE5vdGUgYml0IDEgPT0gMCBtZWFucyAxNkIg Ki8NCisJaWYgKGxpa2VseShwYXJlbnQgJiBNQVBMRV9QQVJFTlRfTk9UX1JBTkdFMTYpKQ0KKwkJ cmV0dXJuIE1BUExFX1BBUkVOVF9TTE9UX01BU0s7DQorDQorCXJldHVybiBNQVBMRV9QQVJFTlRf MTZCX1NMT1RfTUFTSzsNCit9DQorDQorLyoNCisgKiBtYXNfcGFyZW50X2VudW0oKSAtIFJldHVy biB0aGUgbWFwbGVfdHlwZSBvZiB0aGUgcGFyZW50IGZyb20gdGhlIHN0b3JlZA0KKyAqIHBhcmVu dCB0eXBlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBub2RlOiBUaGUgbWFwbGVf ZW5vZGUgdG8gZXh0cmFjdCB0aGUgcGFyZW50J3MgZW51bQ0KKyAqIFJldHVybjogVGhlIG5vZGUt PnBhcmVudCBtYXBsZV90eXBlDQorICovDQorc3RhdGljIGlubGluZQ0KK2VudW0gbWFwbGVfdHlw ZSBtdGVfcGFyZW50X2VudW0oc3RydWN0IG1hcGxlX2Vub2RlICpwX2Vub2RlLA0KKwkJCQlzdHJ1 Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl1bnNpZ25lZCBsb25nIHBfdHlwZTsNCisNCisJcF90 eXBlID0gKHVuc2lnbmVkIGxvbmcpcF9lbm9kZTsNCisJaWYgKHBfdHlwZSAmIE1BUExFX1BBUkVO VF9ST09UKQ0KKwkJcmV0dXJuIDA7IC8qIFZhbGlkYXRlZCBpbiB0aGUgY2FsbGVyLiAqLw0KKw0K KwlwX3R5cGUgJj0gTUFQTEVfTk9ERV9NQVNLOw0KKwlwX3R5cGUgPSBwX3R5cGUgJiB+KE1BUExF X1BBUkVOVF9ST09UIHwgbXRlX3BhcmVudF9zbG90X21hc2socF90eXBlKSk7DQorDQorCXN3aXRj aCAocF90eXBlKSB7DQorCWNhc2UgTUFQTEVfUEFSRU5UX1JBTkdFNjQ6IC8qIG9yIE1BUExFX1BB UkVOVF9BUkFOR0U2NCAqLw0KKwkJaWYgKG10X2lzX2FsbG9jKG10KSkNCisJCQlyZXR1cm4gbWFw bGVfYXJhbmdlXzY0Ow0KKwkJcmV0dXJuIG1hcGxlX3JhbmdlXzY0Ow0KKwl9DQorDQorCXJldHVy biAwOw0KK30NCisNCitzdGF0aWMgaW5saW5lDQorZW51bSBtYXBsZV90eXBlIG1hc19wYXJlbnRf ZW51bShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7 DQorCXJldHVybiBtdGVfcGFyZW50X2VudW0obWFfZW5vZGVfcHRyKG10ZV90b19ub2RlKGVub2Rl KS0+cGFyZW50KSwgbWFzLT50cmVlKTsNCit9DQorDQorLyoNCisgKiBtdGVfc2V0X3BhcmVudCgp IC0gU2V0IHRoZSBwYXJlbnQgbm9kZSBhbmQgZW5jb2RlIHRoZSBzbG90DQorICogQGVub2RlOiBU aGUgZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqIEBwYXJlbnQ6IFRoZSBlbmNvZGVkIG1hcGxlIG5v ZGUgdGhhdCBpcyB0aGUgcGFyZW50IG9mIEBlbm9kZS4NCisgKiBAc2xvdDogVGhlIHNsb3QgdGhh dCBAZW5vZGUgcmVzaWRlcyBpbiBAcGFyZW50Lg0KKyAqDQorICogU2xvdCBudW1iZXIgaXMgZW5j b2RlZCBpbiB0aGUgZW5vZGUtPnBhcmVudCBiaXQgMy02IG9yIDItNiwgZGVwZW5kaW5nIG9uIHRo ZQ0KKyAqIHBhcmVudCB0eXBlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUNCit2b2lkIG10ZV9zZXRf cGFyZW50KHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUsIGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9k ZSAqcGFyZW50LA0KKwkJICAgIHVuc2lnbmVkIGNoYXIgc2xvdCkNCit7DQorCXVuc2lnbmVkIGxv bmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIHBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBzaGlmdDsN CisJdW5zaWduZWQgbG9uZyB0eXBlOw0KKwllbnVtIG1hcGxlX3R5cGUgcF90eXBlID0gbXRlX25v ZGVfdHlwZShwYXJlbnQpOw0KKw0KKwlCVUdfT04ocF90eXBlID09IG1hcGxlX2RlbnNlKTsNCisJ QlVHX09OKHBfdHlwZSA9PSBtYXBsZV9sZWFmXzY0KTsNCisNCisJc3dpdGNoIChwX3R5cGUpIHsN CisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlzaGlm dCA9IE1BUExFX1BBUkVOVF9TTE9UX1NISUZUOw0KKwkJdHlwZSA9IE1BUExFX1BBUkVOVF9SQU5H RTY0Ow0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCWNhc2Ug bWFwbGVfbGVhZl82NDoNCisJCXNoaWZ0ID0gdHlwZSA9IDA7DQorCQlicmVhazsNCisJfQ0KKw0K Kwl2YWwgJj0gfk1BUExFX05PREVfTUFTSzsgLyogQ2xlYXIgYWxsIG5vZGUgbWV0YWRhdGEgaW4g cGFyZW50ICovDQorCXZhbCB8PSAoc2xvdCA8PCBzaGlmdCkgfCB0eXBlOw0KKwltdGVfdG9fbm9k ZShlbm9kZSktPnBhcmVudCA9IG1hX3BhcmVudF9wdHIodmFsKTsNCit9DQorDQorLyoNCisgKiBt dGVfcGFyZW50X3Nsb3QoKSAtIGdldCB0aGUgcGFyZW50IHNsb3Qgb2YgQGVub2RlLg0KKyAqIEBl bm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHNsb3Qg aW4gdGhlIHBhcmVudCBub2RlIHdoZXJlIEBlbm9kZSByZXNpZGVzLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgaW50IG10ZV9wYXJlbnRfc2xvdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5v ZGUgKmVub2RlKQ0KK3sNCisJdW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZykgbXRl X3RvX25vZGUoZW5vZGUpLT5wYXJlbnQ7DQorDQorCS8qIFJvb3QuICovDQorCWlmICh2YWwgJiAx KQ0KKwkJcmV0dXJuIDA7DQorDQorCS8qDQorCSAqIE9rYXkgdG8gdXNlIE1BUExFX1BBUkVOVF8x NkJfU0xPVF9NQVNLIGFzIHRoZSBsYXN0IGJpdCB3aWxsIGJlIGxvc3QNCisJICogYnkgc2hpZnQg aWYgdGhlIHBhcmVudCBzaGlmdCBpcyBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVA0KKwkgKi8NCisJ cmV0dXJuICh2YWwgJiBNQVBMRV9QQVJFTlRfMTZCX1NMT1RfTUFTSykgPj4gbXRlX3BhcmVudF9z aGlmdCh2YWwpOw0KK30NCisNCisvKg0KKyAqIG10ZV9wYXJlbnQoKSAtIEdldCB0aGUgcGFyZW50 IG9mIEBub2RlLg0KKyAqIEBub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqDQorICog UmV0dXJuOiBUaGUgcGFyZW50IG1hcGxlIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1 Y3QgbWFwbGVfbm9kZSAqbXRlX3BhcmVudChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2Rl KQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKQ0KKwkJCShtdGVfdG9fbm9k ZShlbm9kZSktPnBhcmVudCkgJiB+TUFQTEVfTk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBt YV9kZWFkX25vZGUoKSAtIGNoZWNrIGlmIHRoZSBAZW5vZGUgaXMgZGVhZC4NCisgKiBAZW5vZGU6 IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiBkZWFkLCBm YWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hX2RlYWRfbm9kZShj b25zdCBzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpw YXJlbnQgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykNCisJCQkJCSAgICAgbm9kZS0+cGFyZW50 ICYgfk1BUExFX05PREVfTUFTSyk7DQorDQorCXJldHVybiAocGFyZW50ID09IG5vZGUpOw0KK30N CisvKg0KKyAqIG10ZV9kZWFkX25vZGUoKSAtIGNoZWNrIGlmIHRoZSBAZW5vZGUgaXMgZGVhZC4N CisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKg0KKyAqIFJldHVybjogdHJ1 ZSBpZiBkZWFkLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG10 ZV9kZWFkX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXN0cnVj dCBtYXBsZV9ub2RlICpwYXJlbnQsICpub2RlOw0KKw0KKwlub2RlID0gbXRlX3RvX25vZGUoZW5v ZGUpOw0KKwlwYXJlbnQgPSBtdGVfcGFyZW50KGVub2RlKTsNCisJcmV0dXJuIChwYXJlbnQgPT0g bm9kZSk7DQorfQ0KKw0KKy8qDQorICogbWFzX2FsbG9jYXRlZCgpIC0gR2V0IHRoZSBudW1iZXIg b2Ygbm9kZXMgYWxsb2NhdGVkIGluIGEgbWFwbGUgc3RhdGUuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICoNCisgKiBUaGUgbWFfc3RhdGUgYWxsb2MgbWVtYmVyIGlzIG92ZXJsb2FkZWQg dG8gaG9sZCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0DQorICogYWxsb2NhdGVkIG5vZGUgb3IgdG8g dGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgbm9kZXMgdG8gYWxsb2NhdGUuICBJZiBiaXQgMCBpcw0K KyAqIHNldCwgdGhlbiB0aGUgYWxsb2MgY29udGFpbnMgdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQg bm9kZXMuICBJZiB0aGVyZSBpcyBhbg0KKyAqIGFsbG9jYXRlZCBub2RlLCB0aGVuIHRoZSB0b3Rh bCBhbGxvY2F0ZWQgbm9kZXMgaXMgaW4gdGhhdCBub2RlLg0KKyAqDQorICogUmV0dXJuOiBUaGUg dG90YWwgbnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBtYXNfYWxsb2NhdGVkKGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJaWYgKCFtYXMtPmFsbG9jIHx8ICgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkN CisJCXJldHVybiAwOw0KKw0KKwlyZXR1cm4gbWFzLT5hbGxvYy0+dG90YWw7DQorfQ0KKw0KKy8q DQorICogbWFzX3NldF9hbGxvY19yZXEoKSAtIFNldCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBh bGxvY2F0aW9ucy4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAY291bnQ6IHRoZSBu dW1iZXIgb2YgYWxsb2NhdGlvbnMuDQorICoNCisgKiBUaGUgcmVxdWVzdGVkIG51bWJlciBvZiBh bGxvY2F0aW9ucyBpcyBlaXRoZXIgaW4gdGhlIGZpcnN0IGFsbG9jYXRlZCBub2RlLA0KKyAqIGxv Y2F0ZWQgaW4gQG1hcy0+YWxsb2MtPnJlcXVlc3RfY291bnQsIG9yIGRpcmVjdGx5IGluIEBtYXMt PmFsbG9jIGlmIHRoZXJlIGlzDQorICogbm8gYWxsb2NhdGVkIG5vZGUuICBTZXQgdGhlIHJlcXVl c3QgZWl0aGVyIGluIHRoZSBub2RlIG9yIGRvIHRoZSBuZWNlc3NhcnkNCisgKiBlbmNvZGluZyB0 byBzdG9yZSBpbiBAbWFzLT5hbGxvYyBkaXJlY3RseS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX3NldF9hbGxvY19yZXEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcg Y291bnQpDQorew0KKwlpZiAoIW1hcy0+YWxsb2MgfHwgKCh1bnNpZ25lZCBsb25nKW1hcy0+YWxs b2MgJiAweDEpKSB7DQorCQlpZiAoIWNvdW50KQ0KKwkJCW1hcy0+YWxsb2MgPSBOVUxMOw0KKwkJ ZWxzZQ0KKwkJCW1hcy0+YWxsb2MgPSAoc3RydWN0IG1hcGxlX2FsbG9jICopKCgoY291bnQpIDw8 IDFVKSB8IDFVKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltYXMtPmFsbG9jLT5yZXF1ZXN0X2Nv dW50ID0gY291bnQ7DQorfQ0KKw0KKy8qDQorICogbWFzX2FsbG9jX3JlcSgpIC0gZ2V0IHRoZSBy ZXF1ZXN0ZWQgbnVtYmVyIG9mIGFsbG9jYXRpb25zLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0 ZQ0KKyAqDQorICogVGhlIGFsbG9jIGNvdW50IGlzIGVpdGhlciBzdG9yZWQgZGlyZWN0bHkgaW4g QG1hcywgb3IgaW4NCisgKiBAbWFzLT5hbGxvYy0+cmVxdWVzdF9jb3VudCBpZiB0aGVyZSBpcyBh dCBsZWFzdCBvbmUgbm9kZSBhbGxvY2F0ZWQuICBEZWNvZGUNCisgKiB0aGUgcmVxdWVzdCBjb3Vu dCBpZiBpdCdzIHN0b3JlZCBkaXJlY3RseSBpbiBAbWFzLT5hbGxvYy4NCisgKg0KKyAqIFJldHVy bjogVGhlIGFsbG9jYXRpb24gcmVxdWVzdCBjb3VudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGludCBtYXNfYWxsb2NfcmVxKGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJaWYgKCh1bnNpZ25lZCBsb25nKW1hcy0+YWxsb2MgJiAweDEpDQorCQlyZXR1cm4gKHVuc2ln bmVkIGxvbmcpKG1hcy0+YWxsb2MpID4+IDE7DQorCWVsc2UgaWYgKG1hcy0+YWxsb2MpDQorCQly ZXR1cm4gbWFzLT5hbGxvYy0+cmVxdWVzdF9jb3VudDsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8q DQorICogbWFfcGl2b3RzKCkgLSBHZXQgYSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90 cy4NCisgKiBAbm9kZSAtIHRoZSBtYXBsZSBub2RlDQorICogQHR5cGUgLSB0aGUgbm9kZSB0eXBl DQorICoNCisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisg Ki8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKm1hX3Bpdm90cyhzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZSwNCisJCQkJCSAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJc3dpdGNo ICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQu cGl2b3Q7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJ CXJldHVybiBub2RlLT5tcjY0LnBpdm90Ow0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcmV0dXJu IE5VTEw7DQorCX0NCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFfZ2FwcygpIC0g R2V0IGEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBnYXBzLg0KKyAqIEBub2RlIC0gdGhlIG1h cGxlIG5vZGUNCisgKiBAdHlwZSAtIHRoZSBub2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjogQSBw b2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIGdhcHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2ln bmVkIGxvbmcgKm1hX2dhcHMoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCSAgICAgZW51 bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlzd2l0Y2ggKHR5cGUpIHsNCisJY2FzZSBtYXBsZV9h cmFuZ2VfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bWE2NC5nYXA7DQorCWNhc2UgbWFwbGVfcmFuZ2Vf NjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJCXJldHVy biBOVUxMOw0KKwl9DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0KKyAqIG10ZV9waXZvdCgp IC0gR2V0IHRoZSBwaXZvdCBhdCBAcGl2IG9mIHRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICog QG1uOiBUaGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqIEBwaXY6IFRoZSBwaXZvdC4NCisgKg0K KyAqIFJldHVybjogdGhlIHBpdm90IGF0IEBwaXYgb2YgQG1uLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdW5zaWduZWQgbG9uZyBtdGVfcGl2b3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICptbiwN CisJCQkJIHVuc2lnbmVkIGNoYXIgcGl2KQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUg PSBtdGVfdG9fbm9kZShtbik7DQorDQorCWlmIChwaXYgPj0gbXRfcGl2b3RzW3Bpdl0pIHsNCisJ CVdBUk5fT04oMSk7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwlzd2l0Y2ggKG10ZV9ub2RlX3R5cGUo bW4pKSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQucGl2 b3RbcGl2XTsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBtYXBsZV9sZWFmXzY0Og0K KwkJcmV0dXJuIG5vZGUtPm1yNjQucGl2b3RbcGl2XTsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJ CXJldHVybiAwOw0KKwl9DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAqIG1hc19zYWZlX3Bp dm90KCkgLSBnZXQgdGhlIHBpdm90IGF0IEBwaXYgb3IgbWFzLT5tYXguDQorICogQG1hczogVGhl IG1hcGxlIHN0YXRlDQorICogQHBpdm90czogVGhlIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUg cGl2b3RzDQorICogQHBpdjogVGhlIHBpdm90IHRvIGZldGNoDQorICogQHR5cGU6IFRoZSBtYXBs ZSBub2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjogVGhlIHBpdm90IGF0IEBwaXYgd2l0aGluIHRo ZSBsaW1pdCBvZiB0aGUgQHBpdm90cyBhcnJheSwgQG1hcy0+bWF4DQorICogb3RoZXJ3aXNlLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZw0KK21hc19zYWZlX3Bpdm90KGNvbnN0 IHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nICpwaXZvdHMsDQorCSAgICAgICB1 bnNpZ25lZCBjaGFyIHBpdiwgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlpZiAocGl2ID49 IG10X3Bpdm90c1t0eXBlXSkNCisJCXJldHVybiBtYXMtPm1heDsNCisNCisJcmV0dXJuIHBpdm90 c1twaXZdOw0KK30NCisNCisvKg0KKyAqIG1hc19zYWZlX21pbigpIC0gUmV0dXJuIHRoZSBtaW5p bXVtIGZvciBhIGdpdmVuIG9mZnNldC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBA cGl2b3RzOiBUaGUgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKiBAb2Zmc2V0 OiBUaGUgb2Zmc2V0IGludG8gdGhlIHBpdm90IGFycmF5DQorICoNCisgKiBSZXR1cm46IFRoZSBt aW5pbXVtIHJhbmdlIHZhbHVlIHRoYXQgaXMgY29udGFpbmVkIGluIEBvZmZzZXQuDQorICovDQor c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nDQorbWFzX3NhZmVfbWluKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nICpwaXZvdHMsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sN CisJaWYgKGxpa2VseShvZmZzZXQpKQ0KKwkJcmV0dXJuIHBpdm90c1tvZmZzZXQgLSAxXSArIDE7 DQorDQorCXJldHVybiBtYXMtPm1pbjsNCit9DQorDQorLyoNCisgKiBtYXNfbG9naWNhbF9waXZv dCgpIC0gR2V0IHRoZSBsb2dpY2FsIHBpdm90IG9mIGEgZ2l2ZW4gb2Zmc2V0Lg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZvdHM6IFRoZSBwb2ludGVyIHRvIHRoZSBtYXBsZSBu b2RlIHBpdm90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgcGl2b3QgYXJyYXkN CisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqDQorICogV2hlbiB0aGVyZSBpcyBu byB2YWx1ZSBhdCBhIHBpdm90IChiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSksIHRoZW4gdGhl DQorICogcGl2b3QgaXMgYWN0dWFsbHkgQG1hcy0+bWF4Lg0KKyAqDQorICogUmV0dXJuOiB0aGUg bG9naWNhbCBwaXZvdCBvZiBhIGdpdmVuIEBvZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nDQorbWFzX2xvZ2ljYWxfcGl2b3Qoc3RydWN0IG1hX3N0YXRlICptYXMsIHVu c2lnbmVkIGxvbmcgKnBpdm90cywNCisJCSAgdW5zaWduZWQgY2hhciBvZmZzZXQsIGVudW0gbWFw bGVfdHlwZSB0eXBlKQ0KK3sNCisJdW5zaWduZWQgbG9uZyBscGl2ID0gbWFzX3NhZmVfcGl2b3Qo bWFzLCBwaXZvdHMsIG9mZnNldCwgdHlwZSk7DQorDQorCWlmIChsaWtlbHkobHBpdikpDQorCQly ZXR1cm4gbHBpdjsNCisNCisJaWYgKGxpa2VseShvZmZzZXQpKQ0KKwkJcmV0dXJuIG1hcy0+bWF4 Ow0KKw0KKwlyZXR1cm4gbHBpdjsNCit9DQorDQorLyoNCisgKiBtdGVfc2V0X3Bpdm90KCkgLSBT ZXQgYSBwaXZvdCB0byBhIHZhbHVlIGluIGFuIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAbW46 IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAcGl2OiBUaGUgcGl2b3Qgb2Zmc2V0DQorICog QHZhbDogVGhlIHZhbHVlIG9mIHRoZSBwaXZvdA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt dGVfc2V0X3Bpdm90KHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4sIHVuc2lnbmVkIGNoYXIgcGl2LA0K KwkJCQl1bnNpZ25lZCBsb25nIHZhbCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0g bXRlX3RvX25vZGUobW4pOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUo bW4pOw0KKw0KKwlCVUdfT04ocGl2ID49IG10X3Bpdm90c1t0eXBlXSk7DQorCXN3aXRjaCAodHlw ZSkgew0KKwlkZWZhdWx0Og0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xl YWZfNjQ6DQorCQlub2RlLT5tcjY0LnBpdm90W3Bpdl0gPSB2YWw7DQorCQlicmVhazsNCisJY2Fz ZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlub2RlLT5tYTY0LnBpdm90W3Bpdl0gPSB2YWw7DQorCQli cmVhazsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJCWJyZWFrOw0KKwl9DQorDQorfQ0KKw0KKy8q DQorICogbWFfc2xvdHMoKSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgc2xvdHMu DQorICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0K KyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgc2xvdHMNCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgX19yY3UgKiptYV9zbG90cyhzdHJ1Y3QgbWFwbGVfbm9kZSAq bW4sIGVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCXN3aXRjaCAobXQpIHsNCisJZGVmYXVsdDoN CisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlyZXR1cm4gbW4tPm1hNjQuc2xvdDsNCisJY2Fz ZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBtYXBsZV9sZWFmXzY0Og0KKwkJcmV0dXJuIG1uLT5t cjY0LnNsb3Q7DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlyZXR1cm4gbW4tPnNsb3Q7DQorCX0N Cit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2xvY2tlZChjb25zdCBzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQpDQorew0KKwlyZXR1cm4gbXRfZXh0ZXJuYWxfbG9jayhtdCkgPyBtdF9sb2NrX2lz X2hlbGQobXQpIDoNCisJCWxvY2tkZXBfaXNfaGVsZCgmbXQtPm1hX2xvY2spOw0KK30NCisNCitz dGF0aWMgaW5saW5lIHZvaWQgKm10X3Nsb3QoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LA0K KwkJdm9pZCBfX3JjdSAqKnNsb3RzLCB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVy biByY3VfZGVyZWZlcmVuY2VfY2hlY2soc2xvdHNbb2Zmc2V0XSwgbXRfbG9ja2VkKG10KSk7DQor fQ0KKw0KKy8qDQorICogbWFzX3Nsb3RfbG9ja2VkKCkgLSBHZXQgdGhlIHNsb3QgdmFsdWUgd2hl biBob2xkaW5nIHRoZSBtYXBsZSB0cmVlIGxvY2suDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQHNsb3RzOiBUaGUgcG9pbnRlciB0byB0aGUgc2xvdHMNCisgKiBAb2Zmc2V0OiBUaGUg b2Zmc2V0IGludG8gdGhlIHNsb3RzIGFycmF5IHRvIGZldGNoDQorICoNCisgKiBSZXR1cm46IFRo ZSBlbnRyeSBzdG9yZWQgaW4gQHNsb3RzIGF0IHRoZSBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCAqbWFzX3Nsb3RfbG9ja2VkKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkIF9f cmN1ICoqc2xvdHMsDQorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJl dHVybiByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNsb3RzW29mZnNldF0sIG10X2xvY2tlZCht YXMtPnRyZWUpKTsNCit9DQorDQorLyoNCisgKiBtYXNfc2xvdCgpIC0gR2V0IHRoZSBzbG90IHZh bHVlIHdoZW4gbm90IGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9jay4NCisgKiBAbWFzOiBUaGUg bWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6IFRoZSBwb2ludGVyIHRvIHRoZSBzbG90cw0KKyAqIEBv ZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xvdHMgYXJyYXkgdG8gZmV0Y2gNCisgKg0KKyAq IFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBpbiBAc2xvdHMgYXQgdGhlIEBvZmZzZXQNCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19zbG90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lk IF9fcmN1ICoqc2xvdHMsDQorCQkJICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJl dHVybiBtdF9zbG90KG1hcy0+dHJlZSwgc2xvdHMsIG9mZnNldCk7DQorfQ0KKw0KKy8qDQorICog bWFzX3Jvb3QoKSAtIEdldCB0aGUgbWFwbGUgdHJlZSByb290Lg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBvaW50ZXIgdG8gdGhlIHJvb3Qgb2YgdGhl IHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19yb290KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhtYXMtPnRyZWUtPm1h X3Jvb3QsIG10X2xvY2tlZChtYXMtPnRyZWUpKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lk ICptdF9yb290X2xvY2tlZChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4gcmN1 X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChtdC0+bWFfcm9vdCwgbXRfbG9ja2VkKG10KSk7DQorfQ0K Kw0KKy8qDQorICogbWFzX3Jvb3RfbG9ja2VkKCkgLSBHZXQgdGhlIG1hcGxlIHRyZWUgcm9vdCB3 aGVuIGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUuDQorICoNCisgKiBSZXR1cm46IFRoZSBwb2ludGVyIHRvIHRoZSByb290IG9mIHRoZSB0cmVl DQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfcm9vdF9sb2NrZWQoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRfcm9vdF9sb2NrZWQobWFzLT50cmVlKTsNCit9DQor DQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1hX21ldGEoc3RydWN0IG1h cGxlX25vZGUgKm1uLA0KKwkJCQkJICAgICBlbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlzd2l0 Y2ggKG10KSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuICZtbi0+bWE2NC5t ZXRhOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuICZtbi0+bXI2NC5tZXRhOw0KKwl9DQorfQ0KKw0K Ky8qDQorICogbWFfc2V0X21ldGEoKSAtIFNldCB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24gb2Yg YSBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2Rl IHR5cGUNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IG9mIHRoZSBoaWdoZXN0IHN1Yi1nYXAgaW4g dGhpcyBub2RlLg0KKyAqIEBlbmQ6IFRoZSBlbmQgb2YgdGhlIGRhdGEgaW4gdGhpcyBub2RlLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYV9zZXRfbWV0YShzdHJ1Y3QgbWFwbGVfbm9kZSAq bW4sIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQs IHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJc3RydWN0IG1hcGxlX21ldGFkYXRhICptZXRhID0g bWFfbWV0YShtbiwgbXQpOw0KKw0KKwltZXRhLT5nYXAgPSBvZmZzZXQ7DQorCW1ldGEtPmVuZCA9 IGVuZDsNCit9DQorDQorLyoNCisgKiBtYV9tZXRhX2VuZCgpIC0gR2V0IHRoZSBkYXRhIGVuZCBv ZiBhIG5vZGUgZnJvbSB0aGUgbWV0YWRhdGENCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQorICog QG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBj aGFyIG1hX21ldGFfZW5kKHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCQkJCWVudW0gbWFwbGVf dHlwZSBtdCkNCit7DQorCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAqbWV0YSA9IG1hX21ldGEobW4s IG10KTsNCisNCisJcmV0dXJuIG1ldGEtPmVuZDsNCit9DQorDQorLyoNCisgKiBtYV9tZXRhX2dh cCgpIC0gR2V0IHRoZSBsYXJnZXN0IGdhcCBsb2NhdGlvbiBvZiBhIG5vZGUgZnJvbSB0aGUgbWV0 YWRhdGENCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0 eXBlDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hX21ldGFfZ2FwKHN0cnVj dCBtYXBsZV9ub2RlICptbiwNCisJCQkJCWVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCUJVR19P TihtdCAhPSBtYXBsZV9hcmFuZ2VfNjQpOw0KKw0KKwlyZXR1cm4gbW4tPm1hNjQubWV0YS5nYXA7 DQorfQ0KKw0KKy8qDQorICogbWFfc2V0X21ldGFfZ2FwKCkgLSBTZXQgdGhlIGxhcmdlc3QgZ2Fw IGxvY2F0aW9uIGluIGEgbm9kZXMgbWV0YWRhdGENCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQor ICogQG1uOiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQG9mZnNldDogVGhlIGxvY2F0aW9uIG9m IHRoZSBsYXJnZXN0IGdhcC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFfc2V0X21ldGFf Z2FwKHN0cnVjdCBtYXBsZV9ub2RlICptbiwgZW51bSBtYXBsZV90eXBlIG10LA0KKwkJCQkgICB1 bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorDQorCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAqbWV0 YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJbWV0YS0+Z2FwID0gb2Zmc2V0Ow0KK30NCisNCisv Kg0KKyAqIG1hdF9hZGQoKSAtIEFkZCBhIEBkZWFkX2Vub2RlIHRvIHRoZSBtYV90b3BpYXJ5IG9m IGEgbGlzdCBvZiBkZWFkIG5vZGVzLg0KKyAqIEBtYXQgLSB0aGUgbWFfdG9waWFyeSwgYSBsaW5r ZWQgbGlzdCBvZiBkZWFkIG5vZGVzLg0KKyAqIEBkZWFkX2Vub2RlIC0gdGhlIG5vZGUgdG8gYmUg bWFya2VkIGFzIGRlYWQgYW5kIGFkZGVkIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0DQorICoNCisg KiBBZGQgdGhlIEBkZWFkX2Vub2RlIHRvIHRoZSBsaW5rZWQgbGlzdCBpbiBAbWF0Lg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgdm9pZCBtYXRfYWRkKHN0cnVjdCBtYV90b3BpYXJ5ICptYXQsDQorCQkJ ICAgc3RydWN0IG1hcGxlX2Vub2RlICpkZWFkX2Vub2RlKQ0KK3sNCisJbXRlX3NldF9ub2RlX2Rl YWQoZGVhZF9lbm9kZSk7DQorCW10ZV90b19tYXQoZGVhZF9lbm9kZSktPm5leHQgPSBOVUxMOw0K KwlpZiAoIW1hdC0+dGFpbCkgew0KKwkJbWF0LT50YWlsID0gbWF0LT5oZWFkID0gZGVhZF9lbm9k ZTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltdGVfdG9fbWF0KG1hdC0+dGFpbCktPm5leHQgPSBk ZWFkX2Vub2RlOw0KKwltYXQtPnRhaWwgPSBkZWFkX2Vub2RlOw0KK30NCisNCitzdGF0aWMgdm9p ZCBtdGVfZGVzdHJveV93YWxrKHN0cnVjdCBtYXBsZV9lbm9kZSAqLCBzdHJ1Y3QgbWFwbGVfdHJl ZSAqKTsNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2ZyZWUoc3RydWN0IG1hX3N0YXRlICptYXMs IHN0cnVjdCBtYXBsZV9lbm9kZSAqdXNlZCk7DQorDQorLyoNCisgKiBtYXNfbWF0X2ZyZWUoKSAt IEZyZWUgYWxsIG5vZGVzIGluIGEgZGVhZCBsaXN0Lg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3Rh dGUNCisgKiBAbWF0IC0gdGhlIG1hX3RvcGlhcnkgbGlua2VkIGxpc3Qgb2YgZGVhZCBub2RlcyB0 byBmcmVlLg0KKyAqDQorICogRnJlZSB3YWxrIGEgZGVhZCBsaXN0Lg0KKyAqLw0KK3N0YXRpYyB2 b2lkIG1hc19tYXRfZnJlZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hX3RvcGlhcnkg Km1hdCkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsNCisNCisJd2hpbGUgKG1hdC0+ aGVhZCkgew0KKwkJbmV4dCA9IG10ZV90b19tYXQobWF0LT5oZWFkKS0+bmV4dDsNCisJCW1hc19m cmVlKG1hcywgbWF0LT5oZWFkKTsNCisJCW1hdC0+aGVhZCA9IG5leHQ7DQorCX0NCit9DQorDQor LyoNCisgKiBtYXNfbWF0X2Rlc3Ryb3koKSAtIEZyZWUgYWxsIG5vZGVzIGFuZCBzdWJ0cmVlcyBp biBhIGRlYWQgbGlzdC4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlDQorICogQG1hdCAtIHRo ZSBtYV90b3BpYXJ5IGxpbmtlZCBsaXN0IG9mIGRlYWQgbm9kZXMgdG8gZnJlZS4NCisgKg0KKyAq IERlc3Ryb3kgd2FsayBhIGRlYWQgbGlzdC4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfbWF0X2Rl c3Ryb3koc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV90b3BpYXJ5ICptYXQpDQorew0K KwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQ7DQorDQorCXdoaWxlIChtYXQtPmhlYWQpIHsNCisJ CW5leHQgPSBtdGVfdG9fbWF0KG1hdC0+aGVhZCktPm5leHQ7DQorCQltdGVfZGVzdHJveV93YWxr KG1hdC0+aGVhZCwgbWF0LT5tdHJlZSk7DQorCQltYXQtPmhlYWQgPSBuZXh0Ow0KKwl9DQorfQ0K Ky8qDQorICogbWFzX2Rlc2NlbmQoKSAtIERlc2NlbmQgaW50byB0aGUgc2xvdCBzdG9yZWQgaW4g dGhlIG1hX3N0YXRlLg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBOb3Rl OiBOb3QgUkNVIHNhZmUsIG9ubHkgdXNlIGluIHdyaXRlIHNpZGUgb3IgZGVidWcgY29kZS4NCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Rlc2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMp DQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0KKwlu b2RlID0gbWFzX21uKG1hcyk7DQorCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQor CXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2Rl LCB0eXBlKTsNCisNCisJaWYgKG1hcy0+b2Zmc2V0KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbbWFz LT5vZmZzZXQgLSAxXSArIDE7DQorCW1hcy0+bWF4ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZv dHMsIG1hcy0+b2Zmc2V0LCB0eXBlKTsNCisJbWFzLT5ub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90 cywgbWFzLT5vZmZzZXQpOw0KK30NCisNCisvKg0KKyAqIG10ZV9zZXRfZ2FwKCkgLSBTZXQgYSBt YXBsZSBub2RlIGdhcC4NCisgKiBAbW46IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAZ2Fw OiBUaGUgb2Zmc2V0IG9mIHRoZSBnYXAgdG8gc2V0DQorICogQHZhbDogVGhlIGdhcCB2YWx1ZQ0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfc2V0X2dhcChjb25zdCBzdHJ1Y3QgbWFwbGVf ZW5vZGUgKm1uLA0KKwkJCQkgdW5zaWduZWQgY2hhciBnYXAsIHVuc2lnbmVkIGxvbmcgdmFsKQ0K K3sNCisJc3dpdGNoIChtdGVfbm9kZV90eXBlKG1uKSkgew0KKwlkZWZhdWx0Og0KKwkJYnJlYWs7 DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJbXRlX3RvX25vZGUobW4pLT5tYTY0LmdhcFtn YXBdID0gdmFsOw0KKwkJYnJlYWs7DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfYXNjZW5kKCkg LSBXYWxrIHVwIGEgbGV2ZWwgb2YgdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICoNCisgKiBTZXRzIHRoZSBAbWFzLT5tYXggYW5kIEBtYXMtPm1pbiB0byB0aGUgY29ycmVj dCB2YWx1ZXMgd2hlbiB3YWxraW5nIHVwLiAgVGhpcw0KKyAqIG1heSBjYXVzZSBzZXZlcmFsIGxl dmVscyBvZiB3YWxraW5nIHVwIHRvIGZpbmQgdGhlIGNvcnJlY3QgbWluIGFuZCBtYXguDQorICog TWF5IGZpbmQgYSBkZWFkIG5vZGUgd2hpY2ggd2lsbCBjYXVzZSBhIHByZW1hdHVyZSByZXR1cm4u DQorICogUmV0dXJuOiAxIG9uIGRlYWQgbm9kZSwgMCBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMg aW50IG1hc19hc2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKnBfZW5vZGU7IC8qIHBhcmVudCBlbm9kZS4gKi8NCisJc3RydWN0IG1hcGxlX2Vub2Rl ICphX2Vub2RlOyAvKiBhbmNlc3RvciBlbm9kZS4gKi8NCisJc3RydWN0IG1hcGxlX25vZGUgKmFf bm9kZTsgLyogYW5jZXN0b3Igbm9kZS4gKi8NCisJc3RydWN0IG1hcGxlX25vZGUgKnBfbm9kZTsg LyogcGFyZW50IG5vZGUuICovDQorCXVuc2lnbmVkIGNoYXIgYV9zbG90Ow0KKwllbnVtIG1hcGxl X3R5cGUgYV90eXBlOw0KKwl1bnNpZ25lZCBsb25nIG1pbiwgbWF4Ow0KKwl1bnNpZ25lZCBsb25n ICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlib29sIHNldF9tYXggPSBmYWxz ZSwgc2V0X21pbiA9IGZhbHNlOw0KKw0KKwlhX25vZGUgPSBtYXNfbW4obWFzKTsNCisJaWYgKG1h X2lzX3Jvb3QoYV9ub2RlKSkgew0KKwkJbWFzLT5vZmZzZXQgPSAwOw0KKwkJcmV0dXJuIDA7DQor CX0NCisNCisJcF9ub2RlID0gbXRlX3BhcmVudChtYXMtPm5vZGUpOw0KKwlpZiAodW5saWtlbHko YV9ub2RlID09IHBfbm9kZSkpDQorCQlyZXR1cm4gMTsNCisJYV90eXBlID0gbWFzX3BhcmVudF9l bnVtKG1hcywgbWFzLT5ub2RlKTsNCisJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9k ZSk7DQorCWFfZW5vZGUgPSBtdF9ta19ub2RlKHBfbm9kZSwgYV90eXBlKTsNCisNCisJLyogQ2hl Y2sgdG8gbWFrZSBzdXJlIGFsbCBwYXJlbnQgaW5mb3JtYXRpb24gaXMgc3RpbGwgYWNjdXJhdGUg Ki8NCisJaWYgKHBfbm9kZSAhPSBtdGVfcGFyZW50KG1hcy0+bm9kZSkpDQorCQlyZXR1cm4gMTsN CisNCisJbWFzLT5ub2RlID0gYV9lbm9kZTsNCisJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorDQor CWlmIChtdGVfaXNfcm9vdChhX2Vub2RlKSkgew0KKwkJbWFzLT5tYXggPSBVTE9OR19NQVg7DQor CQltYXMtPm1pbiA9IDA7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwltaW4gPSAwOw0KKwltYXgg PSBVTE9OR19NQVg7DQorCWRvIHsNCisJCXBfZW5vZGUgPSBhX2Vub2RlOw0KKwkJYV90eXBlID0g bWFzX3BhcmVudF9lbnVtKG1hcywgcF9lbm9kZSk7DQorCQlhX25vZGUgPSBtdGVfcGFyZW50KHBf ZW5vZGUpOw0KKwkJYV9zbG90ID0gbXRlX3BhcmVudF9zbG90KHBfZW5vZGUpOw0KKwkJcGl2b3Rz ID0gbWFfcGl2b3RzKGFfbm9kZSwgYV90eXBlKTsNCisJCWFfZW5vZGUgPSBtdF9ta19ub2RlKGFf bm9kZSwgYV90eXBlKTsNCisNCisJCWlmICghc2V0X21pbiAmJiBhX3Nsb3QpIHsNCisJCQlzZXRf bWluID0gdHJ1ZTsNCisJCQltaW4gPSBwaXZvdHNbYV9zbG90IC0gMV0gKyAxOw0KKwkJfQ0KKw0K KwkJaWYgKCFzZXRfbWF4ICYmIGFfc2xvdCA8IG10X3Bpdm90c1thX3R5cGVdKSB7DQorCQkJc2V0 X21heCA9IHRydWU7DQorCQkJbWF4ID0gcGl2b3RzW2Ffc2xvdF07DQorCQl9DQorDQorCQlpZiAo dW5saWtlbHkobWFfZGVhZF9ub2RlKGFfbm9kZSkpKQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJaWYg KHVubGlrZWx5KG1hX2lzX3Jvb3QoYV9ub2RlKSkpDQorCQkJYnJlYWs7DQorDQorCX0gd2hpbGUg KCFzZXRfbWluIHx8ICFzZXRfbWF4KTsNCisNCisJbWFzLT5tYXggPSBtYXg7DQorCW1hcy0+bWlu ID0gbWluOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNfcG9wX25vZGUoKSAtIEdl dCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1hcGxlIG5vZGUgZnJvbSB0aGUgbWFwbGUgc3RhdGUu DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IEEgcG9pbnRlciB0 byBhIG1hcGxlIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAq bWFzX3BvcF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Fs bG9jICpyZXQsICpub2RlID0gbWFzLT5hbGxvYzsNCisJdW5zaWduZWQgbG9uZyB0b3RhbCA9IG1h c19hbGxvY2F0ZWQobWFzKTsNCisNCisJLyogbm90aGluZyBvciBhIHJlcXVlc3QgcGVuZGluZy4g Ki8NCisJaWYgKHVubGlrZWx5KCF0b3RhbCkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKHRv dGFsID09IDEpIHsNCisJCS8qIHNpbmdsZSBhbGxvY2F0aW9uIGluIHRoaXMgbWFfc3RhdGUgKi8N CisJCW1hcy0+YWxsb2MgPSBOVUxMOw0KKwkJcmV0ID0gbm9kZTsNCisJCWdvdG8gc2luZ2xlX25v ZGU7DQorCX0NCisNCisJaWYgKCFub2RlLT5ub2RlX2NvdW50KSB7DQorCQkvKiBTaW5nbGUgYWxs b2NhdGlvbiBpbiB0aGlzIG5vZGUuICovDQorCQltYXMtPmFsbG9jID0gbm9kZS0+c2xvdFswXTsN CisJCW5vZGUtPnNsb3RbMF0gPSBOVUxMOw0KKwkJbWFzLT5hbGxvYy0+dG90YWwgPSBub2RlLT50 b3RhbCAtIDE7DQorCQlyZXQgPSBub2RlOw0KKwkJZ290byBuZXdfaGVhZDsNCisJfQ0KKw0KKwlu b2RlLT50b3RhbC0tOw0KKwlyZXQgPSBub2RlLT5zbG90W25vZGUtPm5vZGVfY291bnRdOw0KKwlu b2RlLT5zbG90W25vZGUtPm5vZGVfY291bnQtLV0gPSBOVUxMOw0KKw0KK3NpbmdsZV9ub2RlOg0K K25ld19oZWFkOg0KKwlyZXQtPnRvdGFsID0gMDsNCisJcmV0LT5ub2RlX2NvdW50ID0gMDsNCisJ aWYgKHJldC0+cmVxdWVzdF9jb3VudCkgew0KKwkJbWFzX3NldF9hbGxvY19yZXEobWFzLCByZXQt PnJlcXVlc3RfY291bnQgKyAxKTsNCisJCXJldC0+cmVxdWVzdF9jb3VudCA9IDA7DQorCX0NCisJ cmV0dXJuIChzdHJ1Y3QgbWFwbGVfbm9kZSAqKXJldDsNCit9DQorDQorLyoNCisgKiBtYXNfcHVz aF9ub2RlKCkgLSBQdXNoIGEgbm9kZSBiYWNrIG9uIHRoZSBtYXBsZSBzdGF0ZSBhbGxvY2F0aW9u Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEB1c2VkOiBUaGUgdXNlZCBtYXBsZSBu b2RlDQorICoNCisgKiBTdG9yZXMgdGhlIG1hcGxlIG5vZGUgYmFjayBpbnRvIEBtYXMtPmFsbG9j IGZvciByZXVzZS4gIFVwZGF0ZXMgYWxsb2NhdGVkIGFuZA0KKyAqIHJlcXVlc3RlZCBub2RlIGNv dW50IGFzIG5lY2Vzc2FyeS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3B1c2hfbm9k ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUgKnVzZWQpDQorew0KKwlz dHJ1Y3QgbWFwbGVfYWxsb2MgKnJldXNlID0gKHN0cnVjdCBtYXBsZV9hbGxvYyAqKXVzZWQ7DQor CXN0cnVjdCBtYXBsZV9hbGxvYyAqaGVhZCA9IG1hcy0+YWxsb2M7DQorCXVuc2lnbmVkIGxvbmcg Y291bnQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0ZWQgPSBtYXNfYWxsb2NfcmVxKG1hcyk7DQor DQorCW1lbXNldChyZXVzZSwgMCwgc2l6ZW9mKCpyZXVzZSkpOw0KKwljb3VudCA9IG1hc19hbGxv Y2F0ZWQobWFzKTsNCisNCisJaWYgKGNvdW50ICYmIChoZWFkLT5ub2RlX2NvdW50IDwgTUFQTEVf QUxMT0NfU0xPVFMgLSAxKSkgew0KKwkJaWYgKGhlYWQtPnNsb3RbMF0pDQorCQkJaGVhZC0+bm9k ZV9jb3VudCsrOw0KKwkJaGVhZC0+c2xvdFtoZWFkLT5ub2RlX2NvdW50XSA9IHJldXNlOw0KKwkJ aGVhZC0+dG90YWwrKzsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwlyZXVzZS0+dG90YWwgPSAx Ow0KKwlpZiAoKGhlYWQpICYmICEoKHVuc2lnbmVkIGxvbmcpaGVhZCAmIDB4MSkpIHsNCisJCWhl YWQtPnJlcXVlc3RfY291bnQgPSAwOw0KKwkJcmV1c2UtPnNsb3RbMF0gPSBoZWFkOw0KKwkJcmV1 c2UtPnRvdGFsICs9IGhlYWQtPnRvdGFsOw0KKwl9DQorDQorCW1hcy0+YWxsb2MgPSByZXVzZTsN Citkb25lOg0KKwlpZiAocmVxdWVzdGVkID4gMSkNCisJCW1hc19zZXRfYWxsb2NfcmVxKG1hcywg cmVxdWVzdGVkIC0gMSk7DQorfQ0KKw0KKy8qDQorICogbWFzX2FsbG9jX25vZGVzKCkgLSBBbGxv Y2F0ZSBub2RlcyBpbnRvIGEgbWFwbGUgc3RhdGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAZ2ZwOiBUaGUgR0ZQIEZsYWdzDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19h bGxvY19ub2RlcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgZ2ZwX3QgZ2ZwKQ0KK3sNCisJc3RydWN0 IG1hcGxlX2FsbG9jICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKipub2RlcCA9ICZtYXMt PmFsbG9jOw0KKwl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9IG1hc19hbGxvY2F0ZWQobWFzKTsN CisJdW5zaWduZWQgbG9uZyBzdWNjZXNzID0gYWxsb2NhdGVkOw0KKwl1bnNpZ25lZCBpbnQgcmVx dWVzdGVkID0gbWFzX2FsbG9jX3JlcShtYXMpOw0KKwl1bnNpZ25lZCBpbnQgY291bnQ7DQorCXZv aWQgKipzbG90cyA9IE5VTEw7DQorCXVuc2lnbmVkIGludCBtYXhfcmVxID0gMDsNCisNCisJaWYg KCFyZXF1ZXN0ZWQpDQorCQlyZXR1cm47DQorDQorCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgMCk7 DQorCWlmIChtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRFX1BSRUFMTE9DKSB7DQorCQlpZiAoYWxs b2NhdGVkKQ0KKwkJCXJldHVybjsNCisJCVdBUk5fT04oIWFsbG9jYXRlZCk7DQorCX0NCisNCisJ aWYgKCFhbGxvY2F0ZWQgfHwgbWFzLT5hbGxvYy0+bm9kZV9jb3VudCA9PSBNQVBMRV9BTExPQ19T TE9UUyAtIDEpIHsNCisJCW5vZGUgPSAoc3RydWN0IG1hcGxlX2FsbG9jICopbXRfYWxsb2Nfb25l KGdmcCk7DQorCQlpZiAoIW5vZGUpDQorCQkJZ290byBub21lbV9vbmU7DQorDQorCQlpZiAoYWxs b2NhdGVkKQ0KKwkJCW5vZGUtPnNsb3RbMF0gPSBtYXMtPmFsbG9jOw0KKw0KKwkJc3VjY2Vzcysr Ow0KKwkJbWFzLT5hbGxvYyA9IG5vZGU7DQorCQlyZXF1ZXN0ZWQtLTsNCisJfQ0KKw0KKwlub2Rl ID0gbWFzLT5hbGxvYzsNCisJd2hpbGUgKHJlcXVlc3RlZCkgew0KKwkJbWF4X3JlcSA9IE1BUExF X0FMTE9DX1NMT1RTOw0KKwkJaWYgKG5vZGUtPnNsb3RbMF0pIHsNCisJCQl1bnNpZ25lZCBpbnQg b2Zmc2V0ID0gbm9kZS0+bm9kZV9jb3VudCArIDE7DQorDQorCQkJc2xvdHMgPSAodm9pZCAqKikm bm9kZS0+c2xvdFtvZmZzZXRdOw0KKwkJCW1heF9yZXEgLT0gb2Zmc2V0Ow0KKwkJfSBlbHNlIHsN CisJCQlzbG90cyA9ICh2b2lkICoqKSZub2RlLT5zbG90Ow0KKwkJfQ0KKw0KKwkJbWF4X3JlcSA9 IG1pbihyZXF1ZXN0ZWQsIG1heF9yZXEpOw0KKwkJY291bnQgPSBtdF9hbGxvY19idWxrKGdmcCwg bWF4X3JlcSwgc2xvdHMpOw0KKwkJaWYgKCFjb3VudCkNCisJCQlnb3RvIG5vbWVtX2J1bGs7DQor DQorCQlub2RlLT5ub2RlX2NvdW50ICs9IGNvdW50Ow0KKwkJLyogemVybyBpbmRleGVkLiAqLw0K KwkJaWYgKHNsb3RzID09ICh2b2lkICoqKSZub2RlLT5zbG90KQ0KKwkJCW5vZGUtPm5vZGVfY291 bnQtLTsNCisNCisJCXN1Y2Nlc3MgKz0gY291bnQ7DQorCQlub2RlcCA9ICZub2RlLT5zbG90WzBd Ow0KKwkJbm9kZSA9ICpub2RlcDsNCisJCXJlcXVlc3RlZCAtPSBjb3VudDsNCisJfQ0KKwltYXMt PmFsbG9jLT50b3RhbCA9IHN1Y2Nlc3M7DQorCXJldHVybjsNCisNCitub21lbV9idWxrOg0KKwkv KiBDbGVhbiB1cCBwb3RlbnRpYWwgZnJlZWQgYWxsb2NhdGlvbnMgb24gYnVsayBmYWlsdXJlICov DQorCW1lbXNldChzbG90cywgMCwgbWF4X3JlcSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7DQor bm9tZW1fb25lOg0KKwltYXNfc2V0X2FsbG9jX3JlcShtYXMsIHJlcXVlc3RlZCk7DQorCWlmICht YXMtPmFsbG9jICYmICEoKCh1bnNpZ25lZCBsb25nKW1hcy0+YWxsb2MgJiAweDEpKSkNCisJCW1h cy0+YWxsb2MtPnRvdGFsID0gc3VjY2VzczsNCisJbWFzX3NldF9lcnIobWFzLCAtRU5PTUVNKTsN CisJcmV0dXJuOw0KKw0KK30NCisNCisvKg0KKyAqIG1hc19mcmVlKCkgLSBGcmVlIGFuIGVuY29k ZWQgbWFwbGUgbm9kZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEB1c2VkOiBUaGUg ZW5jb2RlZCBtYXBsZSBub2RlIHRvIGZyZWUuDQorICoNCisgKiBVc2VzIHJjdSBmcmVlIGlmIG5l Y2Vzc2FyeSwgcHVzaGVzIEB1c2VkIGJhY2sgb24gdGhlIG1hcGxlIHN0YXRlIGFsbG9jYXRpb25z DQorICogb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZnJlZShzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2Vub2RlICp1c2VkKQ0KK3sNCisJc3RydWN0 IG1hcGxlX25vZGUgKnRtcCA9IG10ZV90b19ub2RlKHVzZWQpOw0KKw0KKwlpZiAobXRfaW5fcmN1 KG1hcy0+dHJlZSkpDQorCQltYV9mcmVlX3JjdSh0bXApOw0KKwllbHNlDQorCQltYXNfcHVzaF9u b2RlKG1hcywgdG1wKTsNCit9DQorDQorLyoNCisgKiBtYXNfbm9kZV9jb3VudCgpIC0gQ2hlY2sg aWYgZW5vdWdoIG5vZGVzIGFyZSBhbGxvY2F0ZWQgYW5kIHJlcXVlc3QgbW9yZSBpZg0KKyAqIHRo ZXJlIGlzIG5vdCBlbm91Z2ggbm9kZXMuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICog QGNvdW50OiBUaGUgbnVtYmVyIG9mIG5vZGVzIG5lZWRlZA0KKyAqIEBnZnA6IHRoZSBnZnAgZmxh Z3MNCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfbm9kZV9jb3VudF9nZnAoc3RydWN0IG1hX3N0YXRl ICptYXMsIGludCBjb3VudCwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJdW5zaWduZWQgbG9uZyBhbGxvY2F0 ZWQgPSBtYXNfYWxsb2NhdGVkKG1hcyk7DQorDQorCWlmIChhbGxvY2F0ZWQgPCBjb3VudCkgew0K KwkJbWFzX3NldF9hbGxvY19yZXEobWFzLCBjb3VudCAtIGFsbG9jYXRlZCk7DQorCQltYXNfYWxs b2Nfbm9kZXMobWFzLCBnZnApOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX25vZGVfY291bnQo KSAtIENoZWNrIGlmIGVub3VnaCBub2RlcyBhcmUgYWxsb2NhdGVkIGFuZCByZXF1ZXN0IG1vcmUg aWYNCisgKiB0aGVyZSBpcyBub3QgZW5vdWdoIG5vZGVzLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZQ0KKyAqIEBjb3VudDogVGhlIG51bWJlciBvZiBub2RlcyBuZWVkZWQNCisgKg0KKyAqIE5v dGU6IFVzZXMgR0ZQX05PV0FJVCB8IF9fR0ZQX05PV0FSTiBmb3IgZ2ZwIGZsYWdzLg0KKyAqLw0K K3N0YXRpYyB2b2lkIG1hc19ub2RlX2NvdW50KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBpbnQgY291 bnQpDQorew0KKwlyZXR1cm4gbWFzX25vZGVfY291bnRfZ2ZwKG1hcywgY291bnQsIEdGUF9OT1dB SVQgfCBfX0dGUF9OT1dBUk4pOw0KK30NCisNCisvKg0KKyAqIG1hc19zdGFydCgpIC0gU2V0cyB1 cCBtYXBsZSBzdGF0ZSBmb3Igb3BlcmF0aW9ucy4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUu DQorICoNCisgKiBJZiBtYXMtPm5vZGUgPT0gTUFTX1NUQVJULCB0aGVuIHNldCB0aGUgbWluLCBt YXgsIGRlcHRoLCBhbmQgb2Zmc2V0IHRvDQorICogZGVmYXVsdHMuDQorICoNCisgKiBSZXR1cm46 DQorICogLSBJZiBtYXMtPm5vZGUgaXMgYW4gZXJyb3Igb3Igbm90IE1BU19TVEFSVCwgcmV0dXJu IE5VTEwuDQorICogLSBJZiBpdCdzIGFuIGVtcHR5IHRyZWU6ICAgICBOVUxMICYgbWFzLT5ub2Rl ID09IE1BU19OT05FDQorICogLSBJZiBpdCdzIGEgc2luZ2xlIGVudHJ5OiAgICBUaGUgZW50cnkg JiBtYXMtPm5vZGUgPT0gTUFTX1JPT1QNCisgKiAtIElmIGl0J3MgYSB0cmVlOiAgICAgICAgICAg IE5VTEwgJiBtYXMtPm5vZGUgPT0gc2FmZSByb290IG5vZGUuDQorICovDQorc3RhdGljIGlubGlu ZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1hc19zdGFydChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7 DQorCWlmIChsaWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7DQorCQlzdHJ1Y3QgbWFwbGVfZW5v ZGUgKnJvb3Q7DQorDQorCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCW1hcy0+bWluID0gMDsN CisJCW1hcy0+bWF4ID0gVUxPTkdfTUFYOw0KKwkJbWFzLT5kZXB0aCA9IDA7DQorCQltYXMtPm9m ZnNldCA9IDA7DQorDQorCQlyb290ID0gbWFzX3Jvb3QobWFzKTsNCisJCS8qIFRyZWUgd2l0aCBu b2RlcyAqLw0KKwkJaWYgKGxpa2VseSh4YV9pc19ub2RlKHJvb3QpKSkgew0KKwkJCW1hcy0+bm9k ZSA9IG10ZV9zYWZlX3Jvb3Qocm9vdCk7DQorCQkJcmV0dXJuIE5VTEw7DQorCQl9DQorDQorCQkv KiBlbXB0eSB0cmVlICovDQorCQlpZiAodW5saWtlbHkoIXJvb3QpKSB7DQorCQkJbWFzLT5vZmZz ZXQgPSBNQVBMRV9OT0RFX1NMT1RTOw0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0KKw0KKwkJLyog U2luZ2xlIGVudHJ5IHRyZWUgKi8NCisJCW1hcy0+bm9kZSA9IE1BU19ST09UOw0KKwkJbWFzLT5v ZmZzZXQgPSBNQVBMRV9OT0RFX1NMT1RTOw0KKw0KKwkJLyogU2luZ2xlIGVudHJ5IHRyZWUuICov DQorCQlpZiAobWFzLT5pbmRleCA+IDApDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQlyZXR1cm4g cm9vdDsNCisJfQ0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYV9kYXRhX2Vu ZCgpIC0gRmluZCB0aGUgZW5kIG9mIHRoZSBkYXRhIGluIGEgbm9kZS4NCisgKiBAbm9kZTogVGhl IG1hcGxlIG5vZGUNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqIEBwaXZvdHM6 IFRoZSBhcnJheSBvZiBwaXZvdHMgaW4gdGhlIG5vZGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSB2 YWx1ZSBpbiB0aGUgbm9kZQ0KKyAqDQorICogVXNlcyBtZXRhZGF0YSB0byBmaW5kIHRoZSBlbmQg b2YgdGhlIGRhdGEgd2hlbiBwb3NzaWJsZS4NCisgKiBSZXR1cm46IFRoZSB6ZXJvIGluZGV4ZWQg bGFzdCBzbG90IHdpdGggZGF0YSAobWF5IGJlIG51bGwpLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgY2hhciBtYV9kYXRhX2VuZChzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJ CWVudW0gbWFwbGVfdHlwZSB0eXBlLA0KKwkJCQkJdW5zaWduZWQgbG9uZyAqcGl2b3RzLA0KKwkJ CQkJdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisNCisJ aWYgKHR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJcmV0dXJuIG1hX21ldGFfZW5kKG5vZGUs IHR5cGUpOw0KKw0KKwlvZmZzZXQgPSBtdF9waXZvdHNbdHlwZV0gLSAxOw0KKwlpZiAobGlrZWx5 KCFwaXZvdHNbb2Zmc2V0XSkpDQorCQlyZXR1cm4gbWFfbWV0YV9lbmQobm9kZSwgdHlwZSk7DQor DQorCWlmIChsaWtlbHkocGl2b3RzW29mZnNldF0gPT0gbWF4KSkNCisJCXJldHVybiBvZmZzZXQ7 DQorDQorCXJldHVybiBtdF9waXZvdHNbdHlwZV07DQorfQ0KKw0KKy8qDQorICogbWFzX2RhdGFf ZW5kKCkgLSBGaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgKHNsb3QpLg0KKyAqIEBtYXM6IHRoZSBt YXBsZSBzdGF0ZQ0KKyAqDQorICogVGhpcyBtZXRob2QgaXMgb3B0aW1pemVkIHRvIGNoZWNrIHRo ZSBtZXRhZGF0YSBvZiBhIG5vZGUgaWYgdGhlIG5vZGUgdHlwZQ0KKyAqIHN1cHBvcnRzIGRhdGEg ZW5kIG1ldGFkYXRhLg0KKyAqDQorICogUmV0dXJuOiBUaGUgemVybyBpbmRleGVkIGxhc3Qgc2xv dCB3aXRoIGRhdGEgKG1heSBiZSBudWxsKS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGNoYXIgbWFzX2RhdGFfZW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBs ZV90eXBlIHR5cGU7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl1bnNpZ25lZCBjaGFy IG9mZnNldDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKw0KKwl0eXBlID0gbXRlX25vZGVf dHlwZShtYXMtPm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCWlmICh0eXBlID09IG1h cGxlX2FyYW5nZV82NCkNCisJCXJldHVybiBtYV9tZXRhX2VuZChub2RlLCB0eXBlKTsNCisNCisJ cGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlvZmZzZXQgPSBtdF9waXZvdHNbdHlw ZV0gLSAxOw0KKwlpZiAobGlrZWx5KCFwaXZvdHNbb2Zmc2V0XSkpDQorCQlyZXR1cm4gbWFfbWV0 YV9lbmQobm9kZSwgdHlwZSk7DQorDQorCWlmIChsaWtlbHkocGl2b3RzW29mZnNldF0gPT0gbWFz LT5tYXgpKQ0KKwkJcmV0dXJuIG9mZnNldDsNCisNCisJcmV0dXJuIG10X3Bpdm90c1t0eXBlXTsN Cit9DQorDQorLyoNCisgKiBtYXNfbGVhZl9tYXhfZ2FwKCkgLSBSZXR1cm5zIHRoZSBsYXJnZXN0 IGdhcCBpbiBhIGxlYWYgbm9kZQ0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUNCisgKg0KKyAq IFJldHVybjogVGhlIG1heGltdW0gZ2FwIGluIHRoZSBsZWFmLg0KKyAqLw0KK3N0YXRpYyB1bnNp Z25lZCBsb25nIG1hc19sZWFmX21heF9nYXAoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwll bnVtIG1hcGxlX3R5cGUgbXQ7DQorCXVuc2lnbmVkIGxvbmcgcHN0YXJ0LCBnYXAsIG1heF9nYXA7 DQorCXN0cnVjdCBtYXBsZV9ub2RlICptbjsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl2 b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGNoYXIgaTsNCisJdW5zaWduZWQgY2hhciBt YXhfcGl2Ow0KKw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbW4gPSBtYXNf bW4obWFzKTsNCisJc2xvdHMgPSBtYV9zbG90cyhtbiwgbXQpOw0KKwltYXhfZ2FwID0gMDsNCisJ aWYgKHVubGlrZWx5KG1hX2lzX2RlbnNlKG10KSkpIHsNCisJCWdhcCA9IDA7DQorCQlmb3IgKGkg PSAwOyBpIDwgbXRfc2xvdHNbbXRdOyBpKyspIHsNCisJCQlpZiAoc2xvdHNbaV0pIHsNCisJCQkJ aWYgKGdhcCA+IG1heF9nYXApDQorCQkJCQltYXhfZ2FwID0gZ2FwOw0KKwkJCQlnYXAgPSAwOw0K KwkJCX0gZWxzZSB7DQorCQkJCWdhcCsrOw0KKwkJCX0NCisJCX0NCisJCWlmIChnYXAgPiBtYXhf Z2FwKQ0KKwkJCW1heF9nYXAgPSBnYXA7DQorCQlyZXR1cm4gbWF4X2dhcDsNCisJfQ0KKw0KKwkv Kg0KKwkgKiBDaGVjayB0aGUgZmlyc3QgaW1wbGllZCBwaXZvdCBvcHRpbWl6ZXMgdGhlIGxvb3Ag YmVsb3cgYW5kIHNsb3QgMSBtYXkNCisJICogYmUgc2tpcHBlZCBpZiB0aGVyZSBpcyBhIGdhcCBp biBzbG90IDAuDQorCSAqLw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobW4sIG10KTsNCisJaWYgKGxp a2VseSghc2xvdHNbMF0pKSB7DQorCQltYXhfZ2FwID0gcGl2b3RzWzBdIC0gbWFzLT5taW4gKyAx Ow0KKwkJaSA9IDI7DQorCX0gZWxzZSB7DQorCQlpID0gMTsNCisJfQ0KKw0KKwkvKiByZWR1Y2Ug bWF4X3BpdiBhcyB0aGUgc3BlY2lhbCBjYXNlIGlzIGNoZWNrZWQgYmVmb3JlIHRoZSBsb29wICov DQorCW1heF9waXYgPSBtYV9kYXRhX2VuZChtbiwgbXQsIHBpdm90cywgbWFzLT5tYXgpIC0gMTsN CisJLyoNCisJICogQ2hlY2sgZW5kIGltcGxpZWQgcGl2b3Qgd2hpY2ggY2FuIG9ubHkgYmUgYSBn YXAgb24gdGhlIHJpZ2h0IG1vc3QNCisJICogbm9kZS4NCisJICovDQorCWlmICh1bmxpa2VseSht YXMtPm1heCA9PSBVTE9OR19NQVgpICYmICFzbG90c1ttYXhfcGl2ICsgMV0pIHsNCisJCWdhcCA9 IFVMT05HX01BWCAtIHBpdm90c1ttYXhfcGl2XTsNCisJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJ CW1heF9nYXAgPSBnYXA7DQorCX0NCisNCisJZm9yICg7IGkgPD0gbWF4X3BpdjsgaSsrKSB7DQor CQkvKiBkYXRhID09IG5vIGdhcC4gKi8NCisJCWlmIChsaWtlbHkoc2xvdHNbaV0pKQ0KKwkJCWNv bnRpbnVlOw0KKw0KKwkJcHN0YXJ0ID0gcGl2b3RzW2kgLSAxXTsNCisJCWdhcCA9IHBpdm90c1tp XSAtIHBzdGFydDsNCisJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJCW1heF9nYXAgPSBnYXA7DQor DQorCQkvKiBUaGVyZSBjYW5ub3QgYmUgdHdvIGdhcHMgaW4gYSByb3cuICovDQorCQlpKys7DQor CX0NCisJcmV0dXJuIG1heF9nYXA7DQorfQ0KKw0KKy8qDQorICogbWFfbWF4X2dhcCgpIC0gR2V0 IHRoZSBtYXhpbXVtIGdhcCBpbiBhIG1hcGxlIG5vZGUgKG5vbi1sZWFmKQ0KKyAqIEBub2RlOiBU aGUgbWFwbGUgbm9kZQ0KKyAqIEBnYXBzOiBUaGUgcG9pbnRlciB0byB0aGUgZ2Fwcw0KKyAqIEBt dDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqIEAqb2ZmOiBQb2ludGVyIHRvIHN0b3JlIHRoZSBv ZmZzZXQgbG9jYXRpb24gb2YgdGhlIGdhcC4NCisgKg0KKyAqIFVzZXMgdGhlIG1ldGFkYXRhIGRh dGEgZW5kIHRvIHNjYW4gYmFja3dhcmRzIGFjcm9zcyBzZXQgZ2Fwcy4NCisgKg0KKyAqIFJldHVy bjogVGhlIG1heGltdW0gZ2FwIHZhbHVlDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBs b25nDQorbWFfbWF4X2dhcChzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyAq Z2FwcywgZW51bSBtYXBsZV90eXBlIG10LA0KKwkgICAgdW5zaWduZWQgY2hhciAqb2ZmKQ0KK3sN CisJdW5zaWduZWQgY2hhciBvZmZzZXQsIGk7DQorCXVuc2lnbmVkIGxvbmcgbWF4X2dhcCA9IDA7 DQorDQorCWkgPSBvZmZzZXQgPSBtYV9tZXRhX2VuZChub2RlLCBtdCk7DQorCWRvIHsNCisJCWlm IChnYXBzW2ldID4gbWF4X2dhcCkgew0KKwkJCW1heF9nYXAgPSBnYXBzW2ldOw0KKwkJCW9mZnNl dCA9IGk7DQorCQl9DQorCX0gd2hpbGUgKGktLSk7DQorDQorCSpvZmYgPSBvZmZzZXQ7DQorCXJl dHVybiBtYXhfZ2FwOw0KK30NCisNCisvKg0KKyAqIG1hc19tYXhfZ2FwKCkgLSBmaW5kIHRoZSBs YXJnZXN0IGdhcCBpbiBhIG5vbi1sZWFmIG5vZGUgYW5kIHNldCB0aGUgc2xvdC4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBJZiB0aGUgbWV0YWRhdGEgZ2FwIGlzIHNldCB0 byBNQVBMRV9BUkFOR0U2NF9NRVRBX01BWCwgdGhlcmUgaXMgbm8gZ2FwLg0KKyAqDQorICogUmV0 dXJuOiBUaGUgZ2FwIHZhbHVlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBt YXNfbWF4X2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGxvbmcgKmdh cHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorCXN0 cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2Rl KTsNCisJaWYgKG1hX2lzX2xlYWYobXQpKQ0KKwkJcmV0dXJuIG1hc19sZWFmX21heF9nYXAobWFz KTsNCisNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwlvZmZzZXQgPSBtYV9tZXRhX2dhcChub2Rl LCBtdCk7DQorCWlmIChvZmZzZXQgPT0gTUFQTEVfQVJBTkdFNjRfTUVUQV9NQVgpDQorCQlyZXR1 cm4gMDsNCisNCisJZ2FwcyA9IG1hX2dhcHMobm9kZSwgbXQpOw0KKwlyZXR1cm4gZ2Fwc1tvZmZz ZXRdOw0KK30NCisNCisvKg0KKyAqIG1hc19wYXJlbnRfZ2FwKCkgLSBTZXQgdGhlIHBhcmVudCBn YXAgYW5kIGFueSBnYXBzIGFib3ZlLCBhcyBuZWVkZWQNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAb2Zmc2V0OiBUaGUgZ2FwIG9mZnNldCBpbiB0aGUgcGFyZW50IHRvIHNldA0KKyAq IEBuZXc6IFRoZSBuZXcgZ2FwIHZhbHVlLg0KKyAqDQorICogU2V0IHRoZSBwYXJlbnQgZ2FwIHRo ZW4gY29udGludWUgdG8gc2V0IHRoZSBnYXAgdXB3YXJkcywgdXNpbmcgdGhlIG1ldGFkYXRhDQor ICogb2YgdGhlIHBhcmVudCB0byBzZWUgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIHRoZSBu b2RlIGFib3ZlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfcGFyZW50X2dhcChzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBvZmZzZXQsDQorCQl1bnNpZ25lZCBsb25n IG5ldykNCit7DQorCXVuc2lnbmVkIGxvbmcgbWV0YV9nYXAgPSAwOw0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqcG5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGVub2RlOw0KKwl1bnNpZ25lZCBs b25nICpwZ2FwczsNCisJdW5zaWduZWQgY2hhciBtZXRhX29mZnNldDsNCisJZW51bSBtYXBsZV90 eXBlIHBtdDsNCisNCisJcG5vZGUgPSBtdGVfcGFyZW50KG1hcy0+bm9kZSk7DQorCXBtdCA9IG1h c19wYXJlbnRfZW51bShtYXMsIG1hcy0+bm9kZSk7DQorCXBlbm9kZSA9IG10X21rX25vZGUocG5v ZGUsIHBtdCk7DQorCXBnYXBzID0gbWFfZ2Fwcyhwbm9kZSwgcG10KTsNCisNCithc2NlbmQ6DQor CW1ldGFfb2Zmc2V0ID0gbWFfbWV0YV9nYXAocG5vZGUsIHBtdCk7DQorCWlmIChtZXRhX29mZnNl dCA9PSBNQVBMRV9BUkFOR0U2NF9NRVRBX01BWCkNCisJCW1ldGFfZ2FwID0gMDsNCisJZWxzZQ0K KwkJbWV0YV9nYXAgPSBwZ2Fwc1ttZXRhX29mZnNldF07DQorDQorCXBnYXBzW29mZnNldF0gPSBu ZXc7DQorDQorCWlmIChtZXRhX2dhcCA9PSBuZXcpDQorCQlyZXR1cm47DQorDQorCWlmIChvZmZz ZXQgIT0gbWV0YV9vZmZzZXQpIHsNCisJCWlmIChtZXRhX2dhcCA+IG5ldykNCisJCQlyZXR1cm47 DQorDQorCQltYV9zZXRfbWV0YV9nYXAocG5vZGUsIHBtdCwgb2Zmc2V0KTsNCisJfSBlbHNlIGlm IChuZXcgPCBtZXRhX2dhcCkgew0KKwkJbWV0YV9vZmZzZXQgPSAxNTsNCisJCW5ldyA9IG1hX21h eF9nYXAocG5vZGUsIHBnYXBzLCBwbXQsICZtZXRhX29mZnNldCk7DQorCQltYV9zZXRfbWV0YV9n YXAocG5vZGUsIHBtdCwgbWV0YV9vZmZzZXQpOw0KKwl9DQorDQorCWlmIChtYV9pc19yb290KHBu b2RlKSkNCisJCXJldHVybjsNCisNCisJLyogR28gdG8gdGhlIHBhcmVudCBub2RlLiAqLw0KKwlw bm9kZSA9IG10ZV9wYXJlbnQocGVub2RlKTsNCisJcG10ID0gbWFzX3BhcmVudF9lbnVtKG1hcywg cGVub2RlKTsNCisJcGdhcHMgPSBtYV9nYXBzKHBub2RlLCBwbXQpOw0KKwlvZmZzZXQgPSBtdGVf cGFyZW50X3Nsb3QocGVub2RlKTsNCisJcGVub2RlID0gbXRfbWtfbm9kZShwbm9kZSwgcG10KTsN CisJZ290byBhc2NlbmQ7DQorfQ0KKw0KKy8qDQorICogbWFzX3VwZGF0ZV9nYXAoKSAtIFVwZGF0 ZSBhIG5vZGVzIGdhcHMgYW5kIHByb3BhZ2F0ZSB1cCBpZiBuZWNlc3NhcnkuDQorICogQG1hcyAt IHRoZSBtYXBsZSBzdGF0ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3VwZGF0ZV9n YXAoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBjaGFyIHBzbG90Ow0KKwl1 bnNpZ25lZCBsb25nIHBfZ2FwOw0KKwl1bnNpZ25lZCBsb25nIG1heF9nYXA7DQorDQorCWlmICgh bXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJCXJldHVybjsNCisNCisJaWYgKG10ZV9pc19yb290 KG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCW1heF9nYXAgPSBtYXNfbWF4X2dhcChtYXMp Ow0KKw0KKwlwc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwlwX2dhcCA9IG1h X2dhcHMobXRlX3BhcmVudChtYXMtPm5vZGUpLA0KKwkJCW1hc19wYXJlbnRfZW51bShtYXMsIG1h cy0+bm9kZSkpW3BzbG90XTsNCisNCisJaWYgKHBfZ2FwICE9IG1heF9nYXApDQorCQltYXNfcGFy ZW50X2dhcChtYXMsIHBzbG90LCBtYXhfZ2FwKTsNCit9DQorDQorLyoNCisgKiBtYXNfYWRvcHRf Y2hpbGRyZW4oKSAtIFNldCB0aGUgcGFyZW50IHBvaW50ZXIgb2YgYWxsIG5vZGVzIGluIEBwYXJl bnQgdG8NCisgKiBAcGFyZW50IHdpdGggdGhlIHNsb3QgZW5jb2RlZC4NCisgKiBAbWFzIC0gdGhl IG1hcGxlIHN0YXRlIChmb3IgdGhlIHRyZWUpDQorICogQHBhcmVudCAtIHRoZSBtYXBsZSBlbmNv ZGVkIG5vZGUgY29udGFpbmluZyB0aGUgY2hpbGRyZW4uDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc19hZG9wdF9jaGlsZHJlbihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCXN0cnVjdCBt YXBsZV9lbm9kZSAqcGFyZW50KQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9k ZV90eXBlKHBhcmVudCk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbWFzX21uKG1hcyk7 DQorCXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCXN0cnVjdCBtYXBsZV9l bm9kZSAqY2hpbGQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKw0KKwlvZmZzZXQgPSBtYV9k YXRhX2VuZChub2RlLCB0eXBlLCBwaXZvdHMsIG1hcy0+bWF4KTsNCisJZG8gew0KKwkJY2hpbGQg PSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCW10ZV9zZXRfcGFyZW50 KGNoaWxkLCBwYXJlbnQsIG9mZnNldCk7DQorCX0gd2hpbGUgKG9mZnNldC0tKTsNCit9DQorDQor LyoNCisgKiBtYXNfcmVwbGFjZSgpIC0gUmVwbGFjZSBhIG1hcGxlIG5vZGUgaW4gdGhlIHRyZWUg d2l0aCBtYXMtPm5vZGUuICBVc2VzIHRoZQ0KKyAqIHBhcmVudCBlbmNvZGluZyB0byBsb2NhdGUg dGhlIG1hcGxlIG5vZGUgaW4gdGhlIHRyZWUuDQorICogQG1hcyAtIHRoZSBtYV9zdGF0ZSB0byB1 c2UgZm9yIG9wZXJhdGlvbnMuDQorICogQGFkdmFuY2VkIC0gYm9vbGVhbiB0byBhZG9wdCB0aGUg Y2hpbGQgbm9kZXMgYW5kIGZyZWUgdGhlIG9sZCBub2RlIChmYWxzZSkgb3INCisgKiBsZWF2ZSB0 aGUgbm9kZSAodHJ1ZSkgYW5kIGhhbmRsZSB0aGUgYWRvcHRpb24gYW5kIGZyZWUgZWxzZXdoZXJl Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfcmVwbGFjZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgYm9vbCBhZHZhbmNlZCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5sb2NrKQ0KK3sN CisJc3RydWN0IG1hcGxlX25vZGUgKm1uID0gbWFzX21uKG1hcyk7DQorCXN0cnVjdCBtYXBsZV9l bm9kZSAqb2xkX2Vub2RlOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19y Y3UgKipzbG90cyA9IE5VTEw7DQorDQorCWlmIChtYV9pc19yb290KG1uKSkgew0KKwkJb2xkX2Vu b2RlID0gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCX0gZWxzZSB7DQorCQlvZmZzZXQgPSBtdGVf cGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobXRlX3BhcmVudCht YXMtPm5vZGUpLA0KKwkJCQkgbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKSk7DQorCQlv bGRfZW5vZGUgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJfQ0KKw0K KwlpZiAoIWFkdmFuY2VkICYmICFtdGVfaXNfbGVhZihtYXMtPm5vZGUpKQ0KKwkJbWFzX2Fkb3B0 X2NoaWxkcmVuKG1hcywgbWFzLT5ub2RlKTsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9k ZSkpIHsNCisJCW1uLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJCSAgICAgICgodW5zaWdu ZWQgbG9uZyltYXMtPnRyZWUgfCBNQV9ST09UX1BBUkVOVCkpOw0KKwkJcmN1X2Fzc2lnbl9wb2lu dGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgbXRlX21rX3Jvb3QobWFzLT5ub2RlKSk7DQorCQltYXNf c2V0X2hlaWdodChtYXMpOw0KKwl9IGVsc2Ugew0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3Rz W29mZnNldF0sIG1hcy0+bm9kZSk7DQorCX0NCisNCisJaWYgKCFhZHZhbmNlZCkNCisJCW1hc19m cmVlKG1hcywgb2xkX2Vub2RlKTsNCit9DQorDQorLyoNCisgKiBtYXNfbmV3X2NoaWxkKCkgLSBG aW5kIHRoZSBuZXcgY2hpbGQgb2YgYSBub2RlLg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0K KyAqIEBjaGlsZDogdGhlIG1hcGxlIHN0YXRlIHRvIHN0b3JlIHRoZSBjaGlsZC4NCisgKi8NCitz dGF0aWMgaW5saW5lIGJvb2wgbWFzX25ld19jaGlsZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3Ry dWN0IG1hX3N0YXRlICpjaGlsZCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5sb2NrKQ0KK3sN CisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWdu ZWQgY2hhciBlbmQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0IG1hcGxlX2Vu b2RlICplbnRyeTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipz bG90czsNCisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW5vZGUgPSBtYXNf bW4obWFzKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCXBpdm90cyA9IG1hX3Bp dm90cyhub2RlLCBtdCk7DQorCWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIG10LCBwaXZvdHMsIG1h cy0+bWF4KTsNCisJZm9yIChvZmZzZXQgPSBtYXMtPm9mZnNldDsgb2Zmc2V0IDw9IGVuZDsgb2Zm c2V0KyspIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7 DQorCQlpZiAobXRlX3BhcmVudChlbnRyeSkgPT0gbm9kZSkgew0KKwkJCSpjaGlsZCA9ICptYXM7 DQorCQkJbWFzLT5vZmZzZXQgPSBvZmZzZXQgKyAxOw0KKwkJCWNoaWxkLT5vZmZzZXQgPSBvZmZz ZXQ7DQorCQkJbWFzX2Rlc2NlbmQoY2hpbGQpOw0KKwkJCWNoaWxkLT5vZmZzZXQgPSAwOw0KKwkJ CXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoNCisg KiBtYWJfc2hpZnRfcmlnaHQoKSAtIFNoaWZ0IHRoZSBkYXRhIGluIG1hYiByaWdodC4gTm90ZSwg ZG9lcyBub3QgY2xlYW4gb3V0IHRoZQ0KKyAqIG9sZCBkYXRhIG9yIHNldCBiX25vZGUtPmJfZW5k Lg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZQ0KKyAqIEBzaGlmdDogdGhlIHNoaWZ0 IGNvdW50DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hYl9zaGlmdF9yaWdodChzdHJ1Y3Qg bWFwbGVfYmlnX25vZGUgKmJfbm9kZSwNCisJCQkJIHVuc2lnbmVkIGNoYXIgc2hpZnQpDQorew0K Kwl1bnNpZ25lZCBsb25nIHNpemUgPSBiX25vZGUtPmJfZW5kICogc2l6ZW9mKHVuc2lnbmVkIGxv bmcpOw0KKw0KKwltZW1tb3ZlKGJfbm9kZS0+cGl2b3QgKyBzaGlmdCwgYl9ub2RlLT5waXZvdCwg c2l6ZSk7DQorCW1lbW1vdmUoYl9ub2RlLT5zbG90ICsgc2hpZnQsIGJfbm9kZS0+c2xvdCwgc2l6 ZSk7DQorCWlmIChiX25vZGUtPnR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJbWVtbW92ZShi X25vZGUtPmdhcCArIHNoaWZ0LCBiX25vZGUtPmdhcCwgc2l6ZSk7DQorfQ0KKw0KKy8qDQorICog bWFiX21pZGRsZV9ub2RlKCkgLSBDaGVjayBpZiBhIG1pZGRsZSBub2RlIGlzIG5lZWRlZCAodW5s aWtlbHkpDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHRoYXQgY29udGFpbnMgdGhl IGRhdGEuDQorICogQHNpemU6IHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgYl9ub2RlDQorICog QHNwbGl0OiB0aGUgcG90ZW50aWFsIHNwbGl0IGxvY2F0aW9uDQorICogQHNsb3RfY291bnQ6IHRo ZSBzaXplIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBhIHNpbmdsZSBub2RlIGJlaW5nIGNvbnNpZGVy ZWQuDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgYSBtaWRkbGUgbm9kZSBpcyByZXF1aXJlZC4N CisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFiX21pZGRsZV9ub2RlKHN0cnVjdCBtYXBsZV9i aWdfbm9kZSAqYl9ub2RlLCBpbnQgc3BsaXQsDQorCQkJCSAgIHVuc2lnbmVkIGNoYXIgc2xvdF9j b3VudCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2l6ZSA9IGJfbm9kZS0+Yl9lbmQ7DQorDQorCWlm IChzaXplID49IDIgKiBzbG90X2NvdW50KQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCWlmICghYl9u b2RlLT5zbG90W3NwbGl0XSAmJiAoc2l6ZSA+PSAyICogc2xvdF9jb3VudCAtIDEpKQ0KKwkJcmV0 dXJuIHRydWU7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoNCisgKiBtYWJfbm9fbnVs bF9zcGxpdCgpIC0gZW5zdXJlIHRoZSBzcGxpdCBkb2Vzbid0IGZhbGwgb24gYSBOVUxMDQorICog QGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHdpdGggdGhlIGRhdGENCisgKiBAc3BsaXQ6IHRo ZSBzdWdnZXN0ZWQgc3BsaXQgbG9jYXRpb24NCisgKiBAc2xvdF9jb3VudDogdGhlIG51bWJlciBv ZiBzbG90cyBpbiB0aGUgbm9kZSBiZWluZyBjb25zaWRlcmVkLg0KKyAqDQorICogUmV0dXJuOiB0 aGUgc3BsaXQgbG9jYXRpb24uDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFiX25vX251bGxf c3BsaXQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJCSAgICB1bnNpZ25lZCBj aGFyIHNwbGl0LCB1bnNpZ25lZCBjaGFyIHNsb3RfY291bnQpDQorew0KKwlpZiAoIWJfbm9kZS0+ c2xvdFtzcGxpdF0pIHsNCisJCS8qDQorCQkgKiBJZiB0aGUgc3BsaXQgaXMgbGVzcyB0aGFuIHRo ZSBtYXggc2xvdCAmJiB0aGUgcmlnaHQgc2lkZSB3aWxsDQorCQkgKiBzdGlsbCBiZSBzdWZmaWNp ZW50LCB0aGVuIGluY3JlbWVudCB0aGUgc3BsaXQgb24gTlVMTC4NCisJCSAqLw0KKwkJaWYgKChz cGxpdCA8IHNsb3RfY291bnQgLSAxKSAmJg0KKwkJICAgIChiX25vZGUtPmJfZW5kIC0gc3BsaXQp ID4gKG10X21pbl9zbG90c1tiX25vZGUtPnR5cGVdKSkNCisJCQlzcGxpdCsrOw0KKwkJZWxzZQ0K KwkJCXNwbGl0LS07DQorCX0NCisJcmV0dXJuIHNwbGl0Ow0KK30NCisNCisvKg0KKyAqIG1hYl9j YWxjX3NwbGl0KCkgLSBDYWxjdWxhdGUgdGhlIHNwbGl0IGxvY2F0aW9uIGFuZCBpZiB0aGVyZSBu ZWVkcyB0byBiZSB0d28NCisgKiBzcGxpdHMuDQorICogQGJuOiBUaGUgbWFwbGVfYmlnX25vZGUg d2l0aCB0aGUgZGF0YQ0KKyAqIEBtaWRfc3BsaXQ6IFRoZSBzZWNvbmQgc3BsaXQsIGlmIHJlcXVp cmVkLiAgMCBvdGhlcndpc2UuDQorICoNCisgKiBSZXR1cm46IFRoZSBmaXJzdCBzcGxpdCBsb2Nh dGlvbi4gIFRoZSBtaWRkbGUgc3BsaXQgaXMgc2V0IGluIEBtaWRfc3BsaXQuDQorICovDQorc3Rh dGljIGlubGluZSBpbnQgbWFiX2NhbGNfc3BsaXQoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCSBz dHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJuLCB1bnNpZ25lZCBjaGFyICptaWRfc3BsaXQsIHVuc2ln bmVkIGxvbmcgbWluKQ0KK3sNCisJdW5zaWduZWQgY2hhciBiX2VuZCA9IGJuLT5iX2VuZDsNCisJ aW50IHNwbGl0ID0gYl9lbmQgLyAyOyAvKiBBc3N1bWUgZXF1YWwgc3BsaXQuICovDQorCXVuc2ln bmVkIGNoYXIgc2xvdF9taW4sIHNsb3RfY291bnQgPSBtdF9zbG90c1tibi0+dHlwZV07DQorDQor CS8qDQorCSAqIFRvIHN1cHBvcnQgZ2FwIHRyYWNraW5nLCBhbGwgTlVMTCBlbnRyaWVzIGFyZSBr ZXB0IHRvZ2V0aGVyIGFuZCBhIG5vZGUgY2Fubm90DQorCSAqIGVuZCBvbiBhIE5VTEwgZW50cnks IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgbGVmdC1tb3N0IGxlYWYuICBUaGUNCisJICogbGlt aXRhdGlvbiBtZWFucyB0aGF0IHRoZSBzcGxpdCBvZiBhIG5vZGUgbXVzdCBiZSBjaGVja2VkIGZv ciB0aGlzIGNvbmRpdGlvbg0KKwkgKiBhbmQgYmUgYWJsZSB0byBwdXQgbW9yZSBkYXRhIGluIG9u ZSBkaXJlY3Rpb24gb3IgdGhlIG90aGVyLg0KKwkgKi8NCisJaWYgKHVubGlrZWx5KChtYXMtPm1h c19mbGFncyAmIE1BX1NUQVRFX0JVTEspKSkgew0KKwkJKm1pZF9zcGxpdCA9IDA7DQorCQlzcGxp dCA9IGJfZW5kIC0gbXRfbWluX3Nsb3RzW2JuLT50eXBlXTsNCisNCisJCWlmICghbWFfaXNfbGVh Zihibi0+dHlwZSkpDQorCQkJcmV0dXJuIHNwbGl0Ow0KKw0KKwkJbWFzLT5tYXNfZmxhZ3MgfD0g TUFfU1RBVEVfUkVCQUxBTkNFOw0KKwkJaWYgKCFibi0+c2xvdFtzcGxpdF0pDQorCQkJc3BsaXQt LTsNCisJCXJldHVybiBzcGxpdDsNCisJfQ0KKw0KKwkvKg0KKwkgKiBBbHRob3VnaCBleHRyZW1l bHkgcmFyZSwgaXQgaXMgcG9zc2libGUgdG8gZW50ZXIgd2hhdCBpcyBrbm93biBhcyB0aGUgMy13 YXkNCisJICogc3BsaXQgc2NlbmFyaW8uICBUaGUgMy13YXkgc3BsaXQgY29tZXMgYWJvdXQgYnkg bWVhbnMgb2YgYSBzdG9yZSBvZiBhIHJhbmdlDQorCSAqIHRoYXQgb3ZlcndyaXRlcyB0aGUgZW5k IGFuZCBiZWdpbm5pbmcgb2YgdHdvIGZ1bGwgbm9kZXMuICBUaGUgcmVzdWx0IGlzIGEgc2V0DQor CSAqIG9mIGVudHJpZXMgdGhhdCBjYW5ub3QgYmUgc3RvcmVkIGluIDIgbm9kZXMuICBTb21ldGlt ZXMsIHRoZXNlIHR3byBub2RlcyBjYW4NCisJICogYWxzbyBiZSBsb2NhdGVkIGluIGRpZmZlcmVu dCBwYXJlbnQgbm9kZXMgd2hpY2ggYXJlIGFsc28gZnVsbC4gIFRoaXMgY2FuDQorCSAqIGNhcnJ5 IHVwd2FyZHMgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QgaW4gdGhlIHdvcnN0IGNhc2UuDQorCSAq Lw0KKwlpZiAodW5saWtlbHkobWFiX21pZGRsZV9ub2RlKGJuLCBzcGxpdCwgc2xvdF9jb3VudCkp KSB7DQorCQlzcGxpdCA9IGJfZW5kIC8gMzsNCisJCSptaWRfc3BsaXQgPSBzcGxpdCAqIDI7DQor CX0gZWxzZSB7DQorCQlzbG90X21pbiA9IG10X21pbl9zbG90c1tibi0+dHlwZV07DQorDQorCQkq bWlkX3NwbGl0ID0gMDsNCisJCS8qDQorCQkgKiBBdm9pZCBoYXZpbmcgYSByYW5nZSBsZXNzIHRo YW4gdGhlIHNsb3QgY291bnQgdW5sZXNzIGl0DQorCQkgKiBjYXVzZXMgb25lIG5vZGUgdG8gYmUg ZGVmaWNpZW50Lg0KKwkJICogTk9URTogbXRfbWluX3Nsb3RzIGlzIDEgYmFzZWQsIGJfZW5kIGFu ZCBzcGxpdCBhcmUgemVyby4NCisJCSAqLw0KKwkJd2hpbGUgKCgoYm4tPnBpdm90W3NwbGl0XSAt IG1pbikgPCBzbG90X2NvdW50IC0gMSkgJiYNCisJCSAgICAgICAoc3BsaXQgPCBzbG90X2NvdW50 IC0gMSkgJiYgKGJfZW5kIC0gc3BsaXQgPiBzbG90X21pbikpDQorCQkJc3BsaXQrKzsNCisJfQ0K Kw0KKwkvKiBBdm9pZCBlbmRpbmcgYSBub2RlIG9uIGEgTlVMTCBlbnRyeSAqLw0KKwlzcGxpdCA9 IG1hYl9ub19udWxsX3NwbGl0KGJuLCBzcGxpdCwgc2xvdF9jb3VudCk7DQorCWlmICghKCptaWRf c3BsaXQpKQ0KKwkJcmV0dXJuIHNwbGl0Ow0KKw0KKwkqbWlkX3NwbGl0ID0gbWFiX25vX251bGxf c3BsaXQoYm4sICptaWRfc3BsaXQsIHNsb3RfY291bnQpOw0KKw0KKwlyZXR1cm4gc3BsaXQ7DQor fQ0KKw0KKy8qDQorICogbWFzX21hYl9jcCgpIC0gQ29weSBkYXRhIGZyb20gYSBtYXBsZSBzdGF0 ZSBpbmNsdXNpdmVseSB0byBhIG1hcGxlX2JpZ19ub2RlDQorICogYW5kIHNldCBAYl9ub2RlLT5i X2VuZCB0byB0aGUgbmV4dCBmcmVlIHNsb3QuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICogQG1hc19zdGFydDogVGhlIHN0YXJ0aW5nIHNsb3QgdG8gY29weQ0KKyAqIEBtYXNfZW5kOiBU aGUgZW5kIHNsb3QgdG8gY29weSAoaW5jbHVzaXZlbHkpDQorICogQGJfbm9kZTogVGhlIG1hcGxl X2JpZ19ub2RlIHRvIHBsYWNlIHRoZSBkYXRhDQorICogQG1hYl9zdGFydDogVGhlIHN0YXJ0aW5n IGxvY2F0aW9uIGluIG1hcGxlX2JpZ19ub2RlIHRvIHN0b3JlIHRoZSBkYXRhLg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtYXNfbWFiX2NwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25l ZCBjaGFyIG1hc19zdGFydCwNCisJCQl1bnNpZ25lZCBjaGFyIG1hc19lbmQsIHN0cnVjdCBtYXBs ZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCXVuc2lnbmVkIGNoYXIgbWFiX3N0YXJ0KQ0KK3sNCisJ ZW51bSBtYXBsZV90eXBlIG10Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9pZCBf X3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHMsICpnYXBzOw0KKwlpbnQgaSA9 IG1hc19zdGFydCwgaiA9IG1hYl9zdGFydDsNCisJdW5zaWduZWQgY2hhciBwaXZfZW5kOw0KKw0K Kwlub2RlID0gbWFzX21uKG1hcyk7DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0K KwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwlpZiAoIWkpIHsNCisJCWJfbm9kZS0+ cGl2b3Rbal0gPSBwaXZvdHNbaSsrXTsNCisJCWlmICh1bmxpa2VseShpID4gbWFzX2VuZCkpDQor CQkJZ290byBjb21wbGV0ZTsNCisJCWorKzsNCisJfQ0KKw0KKwlwaXZfZW5kID0gbWluKG1hc19l bmQsIG10X3Bpdm90c1ttdF0pOw0KKwlmb3IgKDsgaSA8IHBpdl9lbmQ7IGkrKywgaisrKSB7DQor CQliX25vZGUtPnBpdm90W2pdID0gcGl2b3RzW2ldOw0KKwkJaWYgKHVubGlrZWx5KCFiX25vZGUt PnBpdm90W2pdKSkNCisJCQlicmVhazsNCisNCisJCWlmICh1bmxpa2VseShtYXMtPm1heCA9PSBi X25vZGUtPnBpdm90W2pdKSkNCisJCQlnb3RvIGNvbXBsZXRlOw0KKwl9DQorDQorCWlmIChsaWtl bHkoaSA8PSBtYXNfZW5kKSkNCisJCWJfbm9kZS0+cGl2b3Rbal0gPSBtYXNfc2FmZV9waXZvdCht YXMsIHBpdm90cywgaSwgbXQpOw0KKw0KK2NvbXBsZXRlOg0KKwliX25vZGUtPmJfZW5kID0gKytq Ow0KKwlqIC09IG1hYl9zdGFydDsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCW1l bWNweShiX25vZGUtPnNsb3QgKyBtYWJfc3RhcnQsIHNsb3RzICsgbWFzX3N0YXJ0LCBzaXplb2Yo dm9pZCAqKSAqIGopOw0KKwlpZiAoIW1hX2lzX2xlYWYobXQpICYmIG10X2lzX2FsbG9jKG1hcy0+ dHJlZSkpIHsNCisJCWdhcHMgPSBtYV9nYXBzKG5vZGUsIG10KTsNCisJCW1lbWNweShiX25vZGUt PmdhcCArIG1hYl9zdGFydCwgZ2FwcyArIG1hc19zdGFydCwNCisJCSAgICAgICBzaXplb2YodW5z aWduZWQgbG9uZykgKiBqKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19sZWFmX3NldF9tZXRh KCkgLSBTZXQgdGhlIG1ldGFkYXRhIG9mIGEgbGVhZiBpZiBwb3NzaWJsZS4NCisgKiBAbWFzOiBU aGUgbWFwbGUgc3RhdGUNCisgKiBAbm9kZTogVGhlIG1hcGxlIG5vZGUNCisgKiBAcGl2b3RzOiBw b2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBtdDogVGhlIG1hcGxlIHR5cGUN CisgKiBAZW5kOiBUaGUgYXNzdW1lZCBlbmQNCisgKg0KKyAqIE5vdGUsIGVuZCBtYXkgYmUgaW5j cmVtZW50ZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gYnV0IG5vdCBtb2RpZmllZCBhdCB0aGUNCisg KiBzb3VyY2UuICBUaGlzIGlzIGZpbmUgc2luY2UgdGhlIG1ldGFkYXRhIGlzIHRoZSBsYXN0IHRo aW5nIHRvIGJlIHN0b3JlZCBpbiBhDQorICogbm9kZSBkdXJpbmcgYSB3cml0ZS4NCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgbWFzX2xlYWZfc2V0X21ldGEoc3RydWN0IG1hX3N0YXRlICptYXMs DQorCQlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyAqcGl2b3RzLA0KKwkJ ZW51bSBtYXBsZV90eXBlIG10LCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCS8qIFRoZXJlIGlz IG5vIHJvb20gZm9yIG1ldGFkYXRhIGFscmVhZHkgKi8NCisJaWYgKG10X3Bpdm90c1ttdF0gPD0g ZW5kKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAocGl2b3RzW2VuZF0gJiYgcGl2b3RzW2VuZF0gPCBt YXMtPm1heCkNCisJCWVuZCsrOw0KKw0KKwlpZiAoZW5kIDwgbXRfc2xvdHNbbXRdIC0gMSkNCisJ CW1hX3NldF9tZXRhKG5vZGUsIG10LCAwLCBlbmQpOw0KK30NCisNCisvKg0KKyAqIG1hYl9tYXNf Y3AoKSAtIENvcHkgZGF0YSBmcm9tIG1hcGxlX2JpZ19ub2RlIHRvIGEgbWFwbGUgZW5jb2RlZCBu b2RlLg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZSB0aGF0IGhhcyB0aGUgZGF0YQ0K KyAqIEBtYWJfc3RhcnQ6IHRoZSBzdGFydCBsb2NhdGlvbiBpbiBAYl9ub2RlLg0KKyAqIEBtYWJf ZW5kOiBUaGUgZW5kIGxvY2F0aW9uIGluIEBiX25vZGUgKGluY2x1c2l2ZWx5KQ0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZSB3aXRoIHRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG1hYl9tYXNfY3Aoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUs DQorCQkJICAgICAgdW5zaWduZWQgY2hhciBtYWJfc3RhcnQsIHVuc2lnbmVkIGNoYXIgbWFiX2Vu ZCwNCisJCQkgICAgICBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgYm9vbCBuZXdfbWF4KQ0KK3sNCisJ aW50IGksIGogPSAwOw0KKwllbnVtIG1hcGxlX3R5cGUgbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobWFzLT5ub2Rl KTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwl1bnNpZ25lZCBsb25nICpn YXBzID0gTlVMTDsNCisJdW5zaWduZWQgY2hhciBlbmQ7DQorDQorCWlmIChtYWJfZW5kIC0gbWFi X3N0YXJ0ID4gbXRfcGl2b3RzW210XSkNCisJCW1hYl9lbmQtLTsNCisNCisJaWYgKCFwaXZvdHNb bXRfcGl2b3RzW210XSAtIDFdKQ0KKwkJc2xvdHNbbXRfcGl2b3RzW210XV0gPSBOVUxMOw0KKw0K KwlpID0gbWFiX3N0YXJ0Ow0KKwlkbyB7DQorCQlwaXZvdHNbaisrXSA9IGJfbm9kZS0+cGl2b3Rb aSsrXTsNCisJfSB3aGlsZSAoaSA8PSBtYWJfZW5kICYmIGxpa2VseShiX25vZGUtPnBpdm90W2ld KSk7DQorDQorCW1lbWNweShzbG90cywgYl9ub2RlLT5zbG90ICsgbWFiX3N0YXJ0LA0KKwkgICAg ICAgc2l6ZW9mKHZvaWQgKikgKiAoaSAtIG1hYl9zdGFydCkpOw0KKw0KKwlpZiAobmV3X21heCkN CisJCW1hcy0+bWF4ID0gYl9ub2RlLT5waXZvdFtpIC0gMV07DQorDQorCWVuZCA9IGogLSAxOw0K KwlpZiAobGlrZWx5KCFtYV9pc19sZWFmKG10KSAmJiBtdF9pc19hbGxvYyhtYXMtPnRyZWUpKSkg ew0KKwkJdW5zaWduZWQgbG9uZyBtYXhfZ2FwID0gMDsNCisJCXVuc2lnbmVkIGNoYXIgb2Zmc2V0 ID0gMTU7DQorDQorCQlnYXBzID0gbWFfZ2Fwcyhub2RlLCBtdCk7DQorCQlkbyB7DQorCQkJZ2Fw c1stLWpdID0gYl9ub2RlLT5nYXBbLS1pXTsNCisJCQlpZiAoZ2Fwc1tqXSA+IG1heF9nYXApIHsN CisJCQkJb2Zmc2V0ID0gajsNCisJCQkJbWF4X2dhcCA9IGdhcHNbal07DQorCQkJfQ0KKwkJfSB3 aGlsZSAoaik7DQorDQorCQltYV9zZXRfbWV0YShub2RlLCBtdCwgb2Zmc2V0LCBlbmQpOw0KKwl9 IGVsc2Ugew0KKwkJbWFzX2xlYWZfc2V0X21ldGEobWFzLCBub2RlLCBwaXZvdHMsIG10LCBlbmQp Ow0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2Rlc2NlbmRfYWRvcHQoKSAtIERlc2NlbmQgdGhy b3VnaCBhIHN1Yi10cmVlIGFuZCBhZG9wdCBjaGlsZHJlbi4NCisgKiBAbWFzOiB0aGUgbWFwbGUg c3RhdGUgd2l0aCB0aGUgbWFwbGUgZW5jb2RlZCBub2RlIG9mIHRoZSBzdWItdHJlZS4NCisgKg0K KyAqIERlc2NlbmQgdGhyb3VnaCBhIHN1Yi10cmVlIGFuZCBhZG9wdCBjaGlsZHJlbiB3aG8gZG8g bm90IGhhdmUgdGhlIGNvcnJlY3QNCisgKiBwYXJlbnRzIHNldC4gIEZvbGxvdyB0aGUgcGFyZW50 cyB3aGljaCBoYXZlIHRoZSBjb3JyZWN0IHBhcmVudHMgYXMgdGhleSBhcmUNCisgKiB0aGUgbmV3 IGVudHJpZXMgd2hpY2ggbmVlZCB0byBiZSBmb2xsb3dlZCB0byBmaW5kIG90aGVyIGluY29ycmVj dGx5IHNldA0KKyAqIHBhcmVudHMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19kZXNj ZW5kX2Fkb3B0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlIGxp c3RbM10sIG5leHRbM107DQorCWludCBpLCBuOw0KKw0KKwkvKg0KKwkgKiBBdCBlYWNoIGxldmVs IHRoZXJlIG1heSBiZSB1cCB0byAzIGNvcnJlY3QgcGFyZW50IHBvaW50ZXJzIHdoaWNoIGluZGlj YXRlcw0KKwkgKiB0aGUgbmV3IG5vZGVzIHdoaWNoIG5lZWQgdG8gYmUgd2Fsa2VkIHRvIGZpbmQg YW55IG5ldyBub2RlcyBhdCBhIGxvd2VyIGxldmVsLg0KKwkgKi8NCisNCisJZm9yIChpID0gMDsg aSA8IDM7IGkrKykgew0KKwkJbGlzdFtpXSA9ICptYXM7DQorCQlsaXN0W2ldLm9mZnNldCA9IDA7 DQorCQluZXh0W2ldLm9mZnNldCA9IDA7DQorCX0NCisJbmV4dFswXSA9ICptYXM7DQorDQorCXdo aWxlICghbXRlX2lzX2xlYWYobGlzdFswXS5ub2RlKSkgew0KKwkJbiA9IDA7DQorCQlmb3IgKGkg PSAwOyBpIDwgMzsgaSsrKSB7DQorCQkJaWYgKG1hc19pc19ub25lKCZsaXN0W2ldKSkNCisJCQkJ Y29udGludWU7DQorDQorCQkJaWYgKGkgJiYgbGlzdFtpLTFdLm5vZGUgPT0gbGlzdFtpXS5ub2Rl KQ0KKwkJCQljb250aW51ZTsNCisNCisJCQl3aGlsZSAoKG4gPCAzKSAmJiAobWFzX25ld19jaGls ZCgmbGlzdFtpXSwgJm5leHRbbl0pKSkNCisJCQkJbisrOw0KKw0KKwkJCW1hc19hZG9wdF9jaGls ZHJlbigmbGlzdFtpXSwgbGlzdFtpXS5ub2RlKTsNCisJCX0NCisNCisJCXdoaWxlIChuIDwgMykN CisJCQluZXh0W24rK10ubm9kZSA9IE1BU19OT05FOw0KKw0KKwkJLyogZGVzY2VuZCBieSBzZXR0 aW5nIHRoZSBsaXN0IHRvIHRoZSBjaGlsZHJlbiAqLw0KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkr KykNCisJCQlsaXN0W2ldID0gbmV4dFtpXTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19idWxr X3JlYmFsYW5jZSgpIC0gUmViYWxhbmNlIHRoZSBlbmQgb2YgYSB0cmVlIGFmdGVyIGEgYnVsayBp bnNlcnQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVuZDogVGhlIG1hcGxlIG5v ZGUgZW5kDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICovDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc19idWxrX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQg Y2hhciBlbmQsDQorCQkJCSAgICAgIGVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCWlmICghKG1h cy0+bWFzX2ZsYWdzICYgTUFfU1RBVEVfQlVMSykpDQorCQlyZXR1cm47DQorDQorCWlmIChtdGVf aXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAoZW5kID4gbXRfbWluX3Ns b3RzW210XSkgew0KKwkJbWFzLT5tYXNfZmxhZ3MgJj0gfk1BX1NUQVRFX1JFQkFMQU5DRTsNCisJ CXJldHVybjsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19zdG9yZV9iX25vZGUoKSAtIFN0b3Jl IGFuIEBlbnRyeSBpbnRvIHRoZSBiX25vZGUgd2hpbGUgYWxzbyBjb3B5aW5nIHRoZQ0KKyAqIGRh dGEgZnJvbSBhIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKiBAd3JfbWFzOiB0aGUgbWFwbGUgd3Jp dGUgc3RhdGUNCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25vZGUgdG8gZmlsbCB3aXRoIGRh dGENCisgKiBAb2Zmc2V0X2VuZDogdGhlIG9mZnNldCB0byBlbmQgY29weWluZw0KKyAqDQorICog UmV0dXJuOiBUaGUgYWN0dWFsIGVuZCBvZiB0aGUgZGF0YSBzdG9yZWQgaW4gQGJfbm9kZQ0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfc3RvcmVfYl9ub2RlKHN0cnVjdCBtYV93cl9zdGF0 ZSAqd3JfbWFzLA0KKwkJc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsIHVuc2lnbmVkIGNo YXIgb2Zmc2V0X2VuZCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsNCisJdW5zaWduZWQgY2hh ciBiX2VuZDsNCisJLyogUG9zc2libGUgdW5kZXJmbG93IG9mIHBpdiB3aWxsIHdyYXAgYmFjayB0 byAwIGJlZm9yZSB1c2UuICovDQorCXVuc2lnbmVkIGxvbmcgcGl2Ow0KKwlzdHJ1Y3QgbWFfc3Rh dGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwliX25vZGUtPnR5cGUgPSB3cl9tYXMtPnR5cGU7 DQorCWJfZW5kID0gMDsNCisJc2xvdCA9IG1hcy0+b2Zmc2V0Ow0KKwlpZiAoc2xvdCkgew0KKwkJ LyogQ29weSBzdGFydCBkYXRhIHVwIHRvIGluc2VydC4gKi8NCisJCW1hc19tYWJfY3AobWFzLCAw LCBzbG90IC0gMSwgYl9ub2RlLCAwKTsNCisJCWJfZW5kID0gYl9ub2RlLT5iX2VuZDsNCisJCXBp diA9IGJfbm9kZS0+cGl2b3RbYl9lbmQgLSAxXTsNCisJfSBlbHNlDQorCQlwaXYgPSBtYXMtPm1p biAtIDE7DQorDQorCWlmIChwaXYgKyAxIDwgbWFzLT5pbmRleCkgew0KKwkJLyogSGFuZGxlIHJh bmdlIHN0YXJ0aW5nIGFmdGVyIG9sZCByYW5nZSAqLw0KKwkJYl9ub2RlLT5zbG90W2JfZW5kXSA9 IHdyX21hcy0+Y29udGVudDsNCisJCWlmICghd3JfbWFzLT5jb250ZW50KQ0KKwkJCWJfbm9kZS0+ Z2FwW2JfZW5kXSA9IG1hcy0+aW5kZXggLSAxIC0gcGl2Ow0KKwkJYl9ub2RlLT5waXZvdFtiX2Vu ZCsrXSA9IG1hcy0+aW5kZXggLSAxOw0KKwl9DQorDQorCS8qIFN0b3JlIHRoZSBuZXcgZW50cnku ICovDQorCW1hcy0+b2Zmc2V0ID0gYl9lbmQ7DQorCWJfbm9kZS0+c2xvdFtiX2VuZF0gPSB3cl9t YXMtPmVudHJ5Ow0KKwliX25vZGUtPnBpdm90W2JfZW5kXSA9IG1hcy0+bGFzdDsNCisNCisJLyog QXBwZW5kZWQuICovDQorCWlmIChtYXMtPmxhc3QgPj0gbWFzLT5tYXgpDQorCQlnb3RvIGJfZW5k Ow0KKw0KKwkvKiBIYW5kbGUgbmV3IHJhbmdlIGVuZGluZyBiZWZvcmUgb2xkIHJhbmdlIGVuZHMg Ki8NCisJcGl2ID0gbWFzX2xvZ2ljYWxfcGl2b3QobWFzLCB3cl9tYXMtPnBpdm90cywgb2Zmc2V0 X2VuZCwgd3JfbWFzLT50eXBlKTsNCisJaWYgKHBpdiA+IG1hcy0+bGFzdCkgew0KKwkJaWYgKHBp diA9PSBVTE9OR19NQVgpDQorCQkJbWFzX2J1bGtfcmViYWxhbmNlKG1hcywgYl9ub2RlLT5iX2Vu ZCwgd3JfbWFzLT50eXBlKTsNCisNCisJCWlmIChvZmZzZXRfZW5kICE9IHNsb3QpDQorCQkJd3Jf bWFzLT5jb250ZW50ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgd3JfbWFzLT5zbG90cywNCisJCQkJ CQkJICBvZmZzZXRfZW5kKTsNCisNCisJCWJfbm9kZS0+c2xvdFsrK2JfZW5kXSA9IHdyX21hcy0+ Y29udGVudDsNCisJCWlmICghd3JfbWFzLT5jb250ZW50KQ0KKwkJCWJfbm9kZS0+Z2FwW2JfZW5k XSA9IHBpdiAtIG1hcy0+bGFzdCArIDE7DQorCQliX25vZGUtPnBpdm90W2JfZW5kXSA9IHBpdjsN CisJfQ0KKw0KKwlzbG90ID0gb2Zmc2V0X2VuZCArIDE7DQorCWlmIChzbG90ID4gd3JfbWFzLT5u b2RlX2VuZCkNCisJCWdvdG8gYl9lbmQ7DQorDQorCS8qIENvcHkgZW5kIGRhdGEgdG8gdGhlIGVu ZCBvZiB0aGUgbm9kZS4gKi8NCisJbWFzX21hYl9jcChtYXMsIHNsb3QsIHdyX21hcy0+bm9kZV9l bmQgKyAxLCBiX25vZGUsICsrYl9lbmQpOw0KKwliX25vZGUtPmJfZW5kLS07DQorCXJldHVybjsN CisNCitiX2VuZDoNCisJYl9ub2RlLT5iX2VuZCA9IGJfZW5kOw0KK30NCisNCisvKg0KKyAqIG1h c19wcmV2X3NpYmxpbmcoKSAtIEZpbmQgdGhlIHByZXZpb3VzIG5vZGUgd2l0aCB0aGUgc2FtZSBw YXJlbnQuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IFRydWUg aWYgdGhlcmUgaXMgYSBwcmV2aW91cyBzaWJsaW5nLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQor c3RhdGljIGlubGluZSBib29sIG1hc19wcmV2X3NpYmxpbmcoc3RydWN0IG1hX3N0YXRlICptYXMp DQorew0KKwl1bnNpZ25lZCBpbnQgcF9zbG90ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7 DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0K KwlpZiAoIXBfc2xvdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJbWFzX2FzY2VuZChtYXMpOw0K KwltYXMtPm9mZnNldCA9IHBfc2xvdCAtIDE7DQorCW1hc19kZXNjZW5kKG1hcyk7DQorCXJldHVy biB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXh0X3NpYmxpbmcoKSAtIEZpbmQgdGhlIG5l eHQgbm9kZSB3aXRoIHRoZSBzYW1lIHBhcmVudC4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUN CisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQgc2libGluZywgZmFsc2Ug b3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfbmV4dF9zaWJsaW5nKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJTUFfU1RBVEUocGFyZW50LCBtYXMtPnRyZWUsIG1h cy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0K KwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlwYXJlbnQgPSAqbWFzOw0KKwltYXNfYXNjZW5kKCZwYXJl bnQpOw0KKwlwYXJlbnQub2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSkgKyAxOw0K KwlpZiAocGFyZW50Lm9mZnNldCA+IG1hc19kYXRhX2VuZCgmcGFyZW50KSkNCisJCXJldHVybiBm YWxzZTsNCisNCisJKm1hcyA9IHBhcmVudDsNCisJbWFzX2Rlc2NlbmQobWFzKTsNCisJcmV0dXJu IHRydWU7DQorfQ0KKw0KKy8qDQorICogbXRlX25vZGVfb3Jfbm9kZSgpIC0gUmV0dXJuIHRoZSBl bmNvZGVkIG5vZGUgb3IgTUFTX05PTkUuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBu b2RlLg0KKyAqDQorICogU2hvcnRoYW5kIHRvIGF2b2lkIHNldHRpbmcgJU5VTExzIGluIHRoZSB0 cmVlIG9yIG1hcGxlX3N1YnRyZWVfc3RhdGUuDQorICoNCisgKiBSZXR1cm46IEBlbm9kZSBvciBN QVNfTk9ORQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlICptdGVfbm9k ZV9vcl9ub25lKHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUpDQorew0KKwlpZiAoZW5vZGUpDQor CQlyZXR1cm4gZW5vZGU7DQorDQorCXJldHVybiBtYV9lbm9kZV9wdHIoTUFTX05PTkUpOw0KK30N CisNCisvKg0KKyAqIG1hc193cl9ub2RlX3dhbGsoKSAtIEZpbmQgdGhlIGNvcnJlY3Qgb2Zmc2V0 IGZvciB0aGUgaW5kZXggaW4gdGhlIEBtYXMuDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRl IHN0YXRlDQorICoNCisgKiBVc2VzIG1hc19zbG90X2xvY2tlZCgpIGFuZCBkb2VzIG5vdCBuZWVk IHRvIHdvcnJ5IGFib3V0IGRlYWQgbm9kZXMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1h c193cl9ub2RlX3dhbGsoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3Qg bWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBjaGFyIGNvdW50Ow0KKwl1 bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgbG9uZyBpbmRleCwgbWluLCBtYXg7DQor DQorCWlmICh1bmxpa2VseShtYV9pc19kZW5zZSh3cl9tYXMtPnR5cGUpKSkgew0KKwkJd3JfbWFz LT5yX21heCA9IHdyX21hcy0+cl9taW4gPSBtYXMtPmluZGV4Ow0KKwkJbWFzLT5vZmZzZXQgPSBt YXMtPmluZGV4ID0gbWFzLT5taW47DQorCQlyZXR1cm47DQorCX0NCisNCisJd3JfbWFzLT5ub2Rl ID0gbWFzX21uKHdyX21hcy0+bWFzKTsNCisJd3JfbWFzLT5waXZvdHMgPSBtYV9waXZvdHMod3Jf bWFzLT5ub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwljb3VudCA9IHdyX21hcy0+bm9kZV9lbmQgPSBt YV9kYXRhX2VuZCh3cl9tYXMtPm5vZGUsIHdyX21hcy0+dHlwZSwNCisJCQkJCSAgICAgICB3cl9t YXMtPnBpdm90cywgbWFzLT5tYXgpOw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJbWluID0g bWFzX3NhZmVfbWluKG1hcywgd3JfbWFzLT5waXZvdHMsIG9mZnNldCk7DQorCWlmICh1bmxpa2Vs eShvZmZzZXQgPT0gY291bnQpKQ0KKwkJZ290byBtYXg7DQorDQorCW1heCA9IHdyX21hcy0+cGl2 b3RzW29mZnNldF07DQorCWluZGV4ID0gbWFzLT5pbmRleDsNCisJaWYgKHVubGlrZWx5KGluZGV4 IDw9IG1heCkpDQorCQlnb3RvIGRvbmU7DQorDQorCWlmICh1bmxpa2VseSghbWF4ICYmIG9mZnNl dCkpDQorCQlnb3RvIG1heDsNCisNCisJbWluID0gbWF4ICsgMTsNCisJd2hpbGUgKCsrb2Zmc2V0 IDwgY291bnQpIHsNCisJCW1heCA9IHdyX21hcy0+cGl2b3RzW29mZnNldF07DQorCQlpZiAoaW5k ZXggPD0gbWF4KQ0KKwkJCWdvdG8gZG9uZTsNCisJCWVsc2UgaWYgKHVubGlrZWx5KCFtYXgpKQ0K KwkJCWJyZWFrOw0KKw0KKwkJbWluID0gbWF4ICsgMTsNCisJfQ0KKw0KK21heDoNCisJbWF4ID0g bWFzLT5tYXg7DQorZG9uZToNCisJd3JfbWFzLT5yX21heCA9IG1heDsNCisJd3JfbWFzLT5yX21p biA9IG1pbjsNCisJd3JfbWFzLT5vZmZzZXRfZW5kID0gbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQor fQ0KKw0KKy8qDQorICogbWFzX3RvcGlhcnlfcmFuZ2UoKSAtIEFkZCBhIHJhbmdlIG9mIHNsb3Rz IHRvIHRoZSB0b3BpYXJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBkZXN0cm95 OiBUaGUgdG9waWFyeSB0byBhZGQgdGhlIHNsb3RzICh1c3VhbGx5IGRlc3Ryb3kpDQorICogQHN0 YXJ0OiBUaGUgc3RhcnRpbmcgc2xvdCBpbmNsdXNpdmVseQ0KKyAqIEBlbmQ6IFRoZSBlbmQgc2xv dCBpbmNsdXNpdmVseQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfdG9waWFyeV9yYW5n ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJc3RydWN0IG1hX3RvcGlhcnkgKmRlc3Ryb3ksIHVu c2lnbmVkIGNoYXIgc3RhcnQsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJdm9pZCBfX3JjdSAq KnNsb3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisNCisJTVRfQlVHX09OKG1hcy0+dHJl ZSwgbXRlX2lzX2xlYWYobWFzLT5ub2RlKSk7DQorCXNsb3RzID0gbWFfc2xvdHMobWFzX21uKG1h cyksIG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKSk7DQorCWZvciAob2Zmc2V0ID0gc3RhcnQ7IG9m ZnNldCA8PSBlbmQ7IG9mZnNldCsrKSB7DQorCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlID0g bWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorDQorCQlpZiAobXRlX2RlYWRf bm9kZShlbm9kZSkpDQorCQkJY29udGludWU7DQorDQorCQltYXRfYWRkKGRlc3Ryb3ksIGVub2Rl KTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfdG9waWFyeSgpIC0gQWRkIHRoZSBwb3J0aW9u cyBvZiB0aGUgdHJlZSB0byB0aGUgcmVtb3ZhbCBsaXN0OyBlaXRoZXIgdG8NCisgKiBiZSBmcmVl ZCBvciBkaXNjYXJkZWQgKGRlc3Ryb3kgd2FsaykuDQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0 cmVlX3N0YXRlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3RvcGlhcnkoc3RydWN0 IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1h c3QtPm9yaWdfbCwgTlVMTCk7DQorCXVuc2lnbmVkIGNoYXIgcl9zdGFydCwgcl9lbmQ7DQorCXVu c2lnbmVkIGNoYXIgbF9zdGFydCwgbF9lbmQ7DQorCXZvaWQgX19yY3UgKipsX3Nsb3RzLCAqKnJf c2xvdHM7DQorDQorCXdyX21hcy50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5v ZGUpOw0KKwltYXN0LT5vcmlnX2wtPmluZGV4ID0gbWFzdC0+b3JpZ19sLT5sYXN0Ow0KKwltYXNf d3Jfbm9kZV93YWxrKCZ3cl9tYXMpOw0KKwlsX3N0YXJ0ID0gbWFzdC0+b3JpZ19sLT5vZmZzZXQg KyAxOw0KKwlsX2VuZCA9IG1hc19kYXRhX2VuZChtYXN0LT5vcmlnX2wpOw0KKwlyX3N0YXJ0ID0g MDsNCisJcl9lbmQgPSBtYXN0LT5vcmlnX3ItPm9mZnNldDsNCisNCisJaWYgKHJfZW5kKQ0KKwkJ cl9lbmQtLTsNCisNCisJbF9zbG90cyA9IG1hX3Nsb3RzKG1hc19tbihtYXN0LT5vcmlnX2wpLA0K KwkJCSAgIG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKSk7DQorDQorCXJfc2xvdHMg PSBtYV9zbG90cyhtYXNfbW4obWFzdC0+b3JpZ19yKSwNCisJCQkgICBtdGVfbm9kZV90eXBlKG1h c3QtPm9yaWdfci0+bm9kZSkpOw0KKw0KKwlpZiAoKGxfc3RhcnQgPCBsX2VuZCkgJiYNCisJICAg IG10ZV9kZWFkX25vZGUobWFzX3Nsb3RfbG9ja2VkKG1hc3QtPm9yaWdfbCwgbF9zbG90cywgbF9z dGFydCkpKSB7DQorCQlsX3N0YXJ0Kys7DQorCX0NCisNCisJaWYgKG10ZV9kZWFkX25vZGUobWFz X3Nsb3RfbG9ja2VkKG1hc3QtPm9yaWdfciwgcl9zbG90cywgcl9lbmQpKSkgew0KKwkJaWYgKHJf ZW5kKQ0KKwkJCXJfZW5kLS07DQorCX0NCisNCisJaWYgKChsX3N0YXJ0ID4gcl9lbmQpICYmICht YXN0LT5vcmlnX2wtPm5vZGUgPT0gbWFzdC0+b3JpZ19yLT5ub2RlKSkNCisJCXJldHVybjsNCisN CisJLyogQXQgdGhlIG5vZGUgd2hlcmUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgbWVldCwgYWRkIHRo ZSBwYXJ0cyBiZXR3ZWVuICovDQorCWlmIChtYXN0LT5vcmlnX2wtPm5vZGUgPT0gbWFzdC0+b3Jp Z19yLT5ub2RlKSB7DQorCQlyZXR1cm4gbWFzX3RvcGlhcnlfcmFuZ2UobWFzdC0+b3JpZ19sLCBt YXN0LT5kZXN0cm95LA0KKwkJCQkJICAgICBsX3N0YXJ0LCByX2VuZCk7DQorCX0NCisNCisJLyog bWFzdC0+b3JpZ19yIGlzIGRpZmZlcmVudCBhbmQgY29uc3VtZWQuICovDQorCWlmIChtdGVfaXNf bGVhZihtYXN0LT5vcmlnX3ItPm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRlX2RlYWRf bm9kZShtYXNfc2xvdF9sb2NrZWQobWFzdC0+b3JpZ19sLCBsX3Nsb3RzLCBsX2VuZCkpKQ0KKwkJ bF9lbmQtLTsNCisNCisNCisJaWYgKGxfc3RhcnQgPD0gbF9lbmQpDQorCQltYXNfdG9waWFyeV9y YW5nZShtYXN0LT5vcmlnX2wsIG1hc3QtPmRlc3Ryb3ksIGxfc3RhcnQsIGxfZW5kKTsNCisNCisJ aWYgKG10ZV9kZWFkX25vZGUobWFzX3Nsb3RfbG9ja2VkKG1hc3QtPm9yaWdfciwgcl9zbG90cywg cl9zdGFydCkpKQ0KKwkJcl9zdGFydCsrOw0KKw0KKwlpZiAocl9zdGFydCA8PSByX2VuZCkNCisJ CW1hc190b3BpYXJ5X3JhbmdlKG1hc3QtPm9yaWdfciwgbWFzdC0+ZGVzdHJveSwgMCwgcl9lbmQp Ow0KK30NCisNCisvKg0KKyAqIG1hc3RfcmViYWxhbmNlX25leHQoKSAtIFJlYmFsYW5jZSBhZ2Fp bnN0IHRoZSBuZXh0IG5vZGUNCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisg KiBAb2xkX3I6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUgdG8gdGhlIHJpZ2h0IChuZXh0IG5vZGUp Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3JlYmFsYW5jZV9uZXh0KHN0cnVjdCBt YXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBiX2VuZCA9IG1h c3QtPmJuLT5iX2VuZDsNCisNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX3IsIDAsIG10X3Nsb3Rf Y291bnQobWFzdC0+b3JpZ19yLT5ub2RlKSwNCisJCSAgIG1hc3QtPmJuLCBiX2VuZCk7DQorCW1h c3QtPm9yaWdfci0+bGFzdCA9IG1hc3QtPm9yaWdfci0+bWF4Ow0KK30NCisNCisvKg0KKyAqIG1h c3RfcmViYWxhbmNlX3ByZXYoKSAtIFJlYmFsYW5jZSBhZ2FpbnN0IHRoZSBwcmV2aW91cyBub2Rl DQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG9sZF9sOiBUaGUgZW5j b2RlZCBtYXBsZSBub2RlIHRvIHRoZSBsZWZ0IChwcmV2aW91cyBub2RlKQ0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtYXN0X3JlYmFsYW5jZV9wcmV2KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0 YXRlICptYXN0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBlbmQgPSBtYXNfZGF0YV9lbmQobWFzdC0+ b3JpZ19sKSArIDE7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQor DQorCW1hYl9zaGlmdF9yaWdodChtYXN0LT5ibiwgZW5kKTsNCisJbWFzX21hYl9jcChtYXN0LT5v cmlnX2wsIDAsIGVuZCAtIDEsIG1hc3QtPmJuLCAwKTsNCisJbWFzdC0+bC0+bWluID0gbWFzdC0+ b3JpZ19sLT5taW47DQorCW1hc3QtPm9yaWdfbC0+aW5kZXggPSBtYXN0LT5vcmlnX2wtPm1pbjsN CisJbWFzdC0+Ym4tPmJfZW5kID0gZW5kICsgYl9lbmQ7DQorCW1hc3QtPmwtPm9mZnNldCArPSBl bmQ7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zcGFubmluZ19yZWJhbGFuY2UoKSAtIFJlYmFsYW5j ZSBub2RlcyB3aXRoIG5lYXJlc3QgbmVpZ2hib3VyIGZhdm91cmluZw0KKyAqIHRoZSBub2RlIHRv IHRoZSByaWdodC4gIENoZWNraW5nIHRoZSBub2RlcyB0byB0aGUgcmlnaHQgdGhlbiB0aGUgbGVm dCBhdCBlYWNoDQorICogbGV2ZWwgdXB3YXJkcyB1bnRpbCByb290IGlzIHJlYWNoZWQuICBGcmVl IGFuZCBkZXN0cm95IGFzIG5lZWRlZC4NCisgKiBEYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBAbWFz dC0+Ym4uDQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0cmVlX3N0YXRlLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUNCitib29sIG1hc3Rfc3Bhbm5pbmdfcmViYWxhbmNlKHN0cnVjdCBtYXBsZV9zdWJ0 cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlIHJfdG1wID0gKm1hc3QtPm9y aWdfcjsNCisJc3RydWN0IG1hX3N0YXRlIGxfdG1wID0gKm1hc3QtPm9yaWdfbDsNCisJc3RydWN0 IG1hcGxlX2Vub2RlICphbmNlc3RvciA9IE5VTEw7DQorCXVuc2lnbmVkIGNoYXIgc3RhcnQsIGVu ZDsNCisJdW5zaWduZWQgY2hhciBkZXB0aCA9IDA7DQorDQorCXJfdG1wID0gKm1hc3QtPm9yaWdf cjsNCisJbF90bXAgPSAqbWFzdC0+b3JpZ19sOw0KKwlkbyB7DQorCQltYXNfYXNjZW5kKG1hc3Qt Pm9yaWdfcik7DQorCQltYXNfYXNjZW5kKG1hc3QtPm9yaWdfbCk7DQorCQlkZXB0aCsrOw0KKwkJ aWYgKCFhbmNlc3RvciAmJg0KKwkJICAgIChtYXN0LT5vcmlnX3ItPm5vZGUgPT0gbWFzdC0+b3Jp Z19sLT5ub2RlKSkgew0KKwkJCWFuY2VzdG9yID0gbWFzdC0+b3JpZ19yLT5ub2RlOw0KKwkJCWVu ZCA9IG1hc3QtPm9yaWdfci0+b2Zmc2V0IC0gMTsNCisJCQlzdGFydCA9IG1hc3QtPm9yaWdfbC0+ b2Zmc2V0ICsgMTsNCisJCX0NCisNCisJCWlmIChtYXN0LT5vcmlnX3ItPm9mZnNldCA8IG1hc19k YXRhX2VuZChtYXN0LT5vcmlnX3IpKSB7DQorCQkJaWYgKCFhbmNlc3Rvcikgew0KKwkJCQlhbmNl c3RvciA9IG1hc3QtPm9yaWdfci0+bm9kZTsNCisJCQkJc3RhcnQgPSAwOw0KKwkJCX0NCisNCisJ CQltYXN0LT5vcmlnX3ItPm9mZnNldCsrOw0KKwkJCWRvIHsNCisJCQkJbWFzX2Rlc2NlbmQobWFz dC0+b3JpZ19yKTsNCisJCQkJbWFzdC0+b3JpZ19yLT5vZmZzZXQgPSAwOw0KKwkJCQlkZXB0aC0t Ow0KKwkJCX0gd2hpbGUgKGRlcHRoKTsNCisNCisJCQltYXN0X3JlYmFsYW5jZV9uZXh0KG1hc3Qp Ow0KKwkJCWRvIHsNCisJCQkJdW5zaWduZWQgY2hhciBsX29mZiA9IDA7DQorCQkJCXN0cnVjdCBt YXBsZV9lbm9kZSAqY2hpbGQgPSByX3RtcC5ub2RlOw0KKw0KKwkJCQltYXNfYXNjZW5kKCZyX3Rt cCk7DQorCQkJCWlmIChhbmNlc3RvciA9PSByX3RtcC5ub2RlKQ0KKwkJCQkJbF9vZmYgPSBzdGFy dDsNCisNCisJCQkJaWYgKHJfdG1wLm9mZnNldCkNCisJCQkJCXJfdG1wLm9mZnNldC0tOw0KKw0K KwkJCQlpZiAobF9vZmYgPCByX3RtcC5vZmZzZXQpDQorCQkJCQltYXNfdG9waWFyeV9yYW5nZSgm cl90bXAsIG1hc3QtPmRlc3Ryb3ksDQorCQkJCQkJCSAgbF9vZmYsIHJfdG1wLm9mZnNldCk7DQor DQorCQkJCWlmIChsX3RtcC5ub2RlICE9IGNoaWxkKQ0KKwkJCQkJbWF0X2FkZChtYXN0LT5mcmVl LCBjaGlsZCk7DQorDQorCQkJfSB3aGlsZSAocl90bXAubm9kZSAhPSBhbmNlc3Rvcik7DQorDQor CQkJKm1hc3QtPm9yaWdfbCA9IGxfdG1wOw0KKwkJCXJldHVybiB0cnVlOw0KKw0KKwkJfSBlbHNl IGlmIChtYXN0LT5vcmlnX2wtPm9mZnNldCAhPSAwKSB7DQorCQkJaWYgKCFhbmNlc3Rvcikgew0K KwkJCQlhbmNlc3RvciA9IG1hc3QtPm9yaWdfbC0+bm9kZTsNCisJCQkJZW5kID0gbWFzX2RhdGFf ZW5kKG1hc3QtPm9yaWdfbCk7DQorCQkJfQ0KKw0KKwkJCW1hc3QtPm9yaWdfbC0+b2Zmc2V0LS07 DQorCQkJZG8gew0KKwkJCQltYXNfZGVzY2VuZChtYXN0LT5vcmlnX2wpOw0KKwkJCQltYXN0LT5v cmlnX2wtPm9mZnNldCA9DQorCQkJCQltYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19sKTsNCisJCQkJ ZGVwdGgtLTsNCisJCQl9IHdoaWxlIChkZXB0aCk7DQorDQorCQkJbWFzdF9yZWJhbGFuY2VfcHJl dihtYXN0KTsNCisJCQlkbyB7DQorCQkJCXVuc2lnbmVkIGNoYXIgcl9vZmY7DQorCQkJCXN0cnVj dCBtYXBsZV9lbm9kZSAqY2hpbGQgPSBsX3RtcC5ub2RlOw0KKw0KKwkJCQltYXNfYXNjZW5kKCZs X3RtcCk7DQorCQkJCWlmIChhbmNlc3RvciA9PSBsX3RtcC5ub2RlKQ0KKwkJCQkJcl9vZmYgPSBl bmQ7DQorCQkJCWVsc2UNCisJCQkJCXJfb2ZmID0gbWFzX2RhdGFfZW5kKCZsX3RtcCk7DQorDQor CQkJCWlmIChsX3RtcC5vZmZzZXQgPCByX29mZikNCisJCQkJCWxfdG1wLm9mZnNldCsrOw0KKw0K KwkJCQlpZiAobF90bXAub2Zmc2V0IDwgcl9vZmYpDQorCQkJCQltYXNfdG9waWFyeV9yYW5nZSgm bF90bXAsIG1hc3QtPmRlc3Ryb3ksDQorCQkJCQkJCSAgbF90bXAub2Zmc2V0LCByX29mZik7DQor DQorCQkJCWlmIChyX3RtcC5ub2RlICE9IGNoaWxkKQ0KKwkJCQkJbWF0X2FkZChtYXN0LT5mcmVl LCBjaGlsZCk7DQorDQorCQkJfSB3aGlsZSAobF90bXAubm9kZSAhPSBhbmNlc3Rvcik7DQorDQor CQkJKm1hc3QtPm9yaWdfciA9IHJfdG1wOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9IHdo aWxlICghbXRlX2lzX3Jvb3QobWFzdC0+b3JpZ19yLT5ub2RlKSk7DQorDQorCSptYXN0LT5vcmln X3IgPSByX3RtcDsNCisJKm1hc3QtPm9yaWdfbCA9IGxfdG1wOw0KKwlyZXR1cm4gZmFsc2U7DQor fQ0KKw0KKy8qDQorICogbWFzdF9hc2NlbmRfZnJlZSgpIC0gQWRkIGN1cnJlbnQgb3JpZ2luYWwg bWFwbGUgc3RhdGUgbm9kZXMgdG8gdGhlIGZyZWUgbGlzdA0KKyAqIGFuZCBhc2NlbmQuDQorICog QG1hc3Q6IHRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlLg0KKyAqDQorICogQXNjZW5kIHRoZSBvcmln aW5hbCBsZWZ0IGFuZCByaWdodCBzaWRlcyBhbmQgYWRkIHRoZSBwcmV2aW91cyBub2RlcyB0byB0 aGUNCisgKiBmcmVlIGxpc3QuICBTZXQgdGhlIHNsb3RzIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0 IGxvY2F0aW9uIGluIHRoZSBuZXcgbm9kZXMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkDQor bWFzdF9hc2NlbmRfZnJlZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQor CU1BX1dSX1NUQVRFKHdyX21hcywgbWFzdC0+b3JpZ19yLCAgTlVMTCk7DQorCXN0cnVjdCBtYXBs ZV9lbm9kZSAqbGVmdCA9IG1hc3QtPm9yaWdfbC0+bm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpyaWdodCA9IG1hc3QtPm9yaWdfci0+bm9kZTsNCisNCisJbWFzX2FzY2VuZChtYXN0LT5vcmln X2wpOw0KKwltYXNfYXNjZW5kKG1hc3QtPm9yaWdfcik7DQorCW1hdF9hZGQobWFzdC0+ZnJlZSwg bGVmdCk7DQorDQorCWlmIChsZWZ0ICE9IHJpZ2h0KQ0KKwkJbWF0X2FkZChtYXN0LT5mcmVlLCBy aWdodCk7DQorDQorCW1hc3QtPm9yaWdfci0+b2Zmc2V0ID0gMDsNCisJbWFzdC0+b3JpZ19yLT5p bmRleCA9IG1hc3QtPnItPm1heDsNCisJLyogbGFzdCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gb3Ig ZXF1YWwgdG8gaW5kZXggKi8NCisJaWYgKG1hc3QtPm9yaWdfci0+bGFzdCA8IG1hc3QtPm9yaWdf ci0+aW5kZXgpDQorCQltYXN0LT5vcmlnX3ItPmxhc3QgPSBtYXN0LT5vcmlnX3ItPmluZGV4Ow0K KwkvKg0KKwkgKiBUaGUgbm9kZSBtYXkgbm90IGNvbnRhaW4gdGhlIHZhbHVlIHNvIHNldCBzbG90 IHRvIGVuc3VyZSBhbGwNCisJICogb2YgdGhlIG5vZGVzIGNvbnRlbnRzIGFyZSBmcmVlZCBvciBk ZXN0cm95ZWQuDQorCSAqLw0KKwl3cl9tYXMudHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3Jp Z19yLT5ub2RlKTsNCisJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFzKTsNCisJLyogU2V0IHVwIHRo ZSBsZWZ0IHNpZGUgb2YgdGhpbmdzICovDQorCW1hc3QtPm9yaWdfbC0+b2Zmc2V0ID0gMDsNCisJ bWFzdC0+b3JpZ19sLT5pbmRleCA9IG1hc3QtPmwtPm1pbjsNCisJd3JfbWFzLm1hcyA9IG1hc3Qt Pm9yaWdfbDsNCisJd3JfbWFzLnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfbC0+bm9k ZSk7DQorCW1hc193cl9ub2RlX3dhbGsoJndyX21hcyk7DQorDQorCW1hc3QtPmJuLT50eXBlID0g d3JfbWFzLnR5cGU7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19tYV9ub2RlKCkgLSBDcmVhdGUg YW5kIHJldHVybiBhIG5ldyBtYXBsZSBub2RlLiAgSGVscGVyIGZ1bmN0aW9uLg0KKyAqIEBtYXM6 IHRoZSBtYXBsZSBzdGF0ZSB3aXRoIHRoZSBhbGxvY2F0aW9ucy4NCisgKiBAYl9ub2RlOiB0aGUg bWFwbGVfYmlnX25vZGUgd2l0aCB0aGUgdHlwZSBlbmNvZGluZy4NCisgKg0KKyAqIFVzZSB0aGUg bm9kZSB0eXBlIGZyb20gdGhlIG1hcGxlX2JpZ19ub2RlIHRvIGFsbG9jYXRlIGEgbmV3IG5vZGUg ZnJvbSB0aGUNCisgKiBtYV9zdGF0ZS4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG1haW5seSBmb3Ig Y29kZSByZWFkYWJpbGl0eS4NCisgKg0KKyAqIFJldHVybjogQSBuZXcgbWFwbGUgZW5jb2RlZCBu b2RlDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUNCisqbWFzX25ld19t YV9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9k ZSkNCit7DQorCXJldHVybiBtdF9ta19ub2RlKG1hX21ub2RlX3B0cihtYXNfcG9wX25vZGUobWFz KSksIGJfbm9kZS0+dHlwZSk7DQorfQ0KKw0KKy8qDQorICogbWFzX21hYl90b19ub2RlKCkgLSBT ZXQgdXAgcmlnaHQgYW5kIG1pZGRsZSBub2Rlcw0KKyAqDQorICogQG1hczogdGhlIG1hcGxlIHN0 YXRlIHRoYXQgY29udGFpbnMgdGhlIGFsbG9jYXRpb25zLg0KKyAqIEBiX25vZGU6IHRoZSBub2Rl IHdoaWNoIGNvbnRhaW5zIHRoZSBkYXRhLg0KKyAqIEBsZWZ0OiBUaGUgcG9pbnRlciB3aGljaCB3 aWxsIGhhdmUgdGhlIGxlZnQgbm9kZQ0KKyAqIEByaWdodDogVGhlIHBvaW50ZXIgd2hpY2ggbWF5 IGhhdmUgdGhlIHJpZ2h0IG5vZGUNCisgKiBAbWlkZGxlOiB0aGUgcG9pbnRlciB3aGljaCBtYXkg aGF2ZSB0aGUgbWlkZGxlIG5vZGUgKHJhcmUpDQorICogQG1pZF9zcGxpdDogdGhlIHNwbGl0IGxv Y2F0aW9uIGZvciB0aGUgbWlkZGxlIG5vZGUNCisgKg0KKyAqIFJldHVybjogdGhlIHNwbGl0IG9m IGxlZnQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hc19tYWJfdG9fbm9k ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUs IHN0cnVjdCBtYXBsZV9lbm9kZSAqKmxlZnQsDQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqKnJpZ2h0 LCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKiptaWRkbGUsDQorCXVuc2lnbmVkIGNoYXIgKm1pZF9zcGxp dCwgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwl1bnNpZ25lZCBjaGFyIHNwbGl0ID0gMDsNCisJ dW5zaWduZWQgY2hhciBzbG90X2NvdW50ID0gbXRfc2xvdHNbYl9ub2RlLT50eXBlXTsNCisNCisJ KmxlZnQgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0KKwkqcmlnaHQgPSBOVUxMOw0K KwkqbWlkZGxlID0gTlVMTDsNCisJKm1pZF9zcGxpdCA9IDA7DQorDQorCWlmIChiX25vZGUtPmJf ZW5kIDwgc2xvdF9jb3VudCkgew0KKwkJc3BsaXQgPSBiX25vZGUtPmJfZW5kOw0KKwl9IGVsc2Ug ew0KKwkJc3BsaXQgPSBtYWJfY2FsY19zcGxpdChtYXMsIGJfbm9kZSwgbWlkX3NwbGl0LCBtaW4p Ow0KKwkJKnJpZ2h0ID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisJfQ0KKw0KKwlp ZiAoKm1pZF9zcGxpdCkNCisJCSptaWRkbGUgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUp Ow0KKw0KKwlyZXR1cm4gc3BsaXQ7DQorDQorfQ0KKw0KKy8qDQorICogbWFiX3NldF9iX2VuZCgp IC0gQWRkIGVudHJ5IHRvIGJfbm9kZSBhdCBiX25vZGUtPmJfZW5kIGFuZCBpbmNyZW1lbnQgdGhl IGVuZA0KKyAqIHBvaW50ZXIuDQorICogQGJfbm9kZSAtIHRoZSBiaWcgbm9kZSB0byBhZGQgdGhl IGVudHJ5DQorICogQG1hcyAtIHRoZSBtYXBsZSBzdGF0ZSB0byBnZXQgdGhlIHBpdm90IChtYXMt Pm1heCkNCisgKiBAZW50cnkgLSB0aGUgZW50cnkgdG8gYWRkLCBpZiBOVUxMIG5vdGhpbmcgaGFw cGVucy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFiX3NldF9iX2VuZChzdHJ1Y3QgbWFw bGVfYmlnX25vZGUgKmJfbm9kZSwNCisJCQkJIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQkg dm9pZCAqZW50cnkpDQorew0KKwlpZiAoIWVudHJ5KQ0KKwkJcmV0dXJuOw0KKw0KKwliX25vZGUt PnNsb3RbYl9ub2RlLT5iX2VuZF0gPSBlbnRyeTsNCisJaWYgKG10X2lzX2FsbG9jKG1hcy0+dHJl ZSkpDQorCQliX25vZGUtPmdhcFtiX25vZGUtPmJfZW5kXSA9IG1hc19tYXhfZ2FwKG1hcyk7DQor CWJfbm9kZS0+cGl2b3RbYl9ub2RlLT5iX2VuZCsrXSA9IG1hcy0+bWF4Ow0KK30NCisNCisvKg0K KyAqIG1hc19zZXRfc3BsaXRfcGFyZW50KCkgLSBjb21iaW5lX3RoZW5fc2VwYXJhdGUgaGVscGVy IGZ1bmN0aW9uLiAgU2V0cyB0aGUgcGFyZW50DQorICogb2YgQG1hcy0+bm9kZSB0byBlaXRoZXIg QGxlZnQgb3IgQHJpZ2h0LCBkZXBlbmRpbmcgb24gQHNsb3QgYW5kIEBzcGxpdA0KKyAqDQorICog QG1hcyAtIHRoZSBtYXBsZSBzdGF0ZSB3aXRoIHRoZSBub2RlIHRoYXQgbmVlZHMgYSBwYXJlbnQN CisgKiBAbGVmdCAtIHBvc3NpYmxlIHBhcmVudCAxDQorICogQHJpZ2h0IC0gcG9zc2libGUgcGFy ZW50IDINCisgKiBAc2xvdCAtIHRoZSBzbG90IHRoZSBtYXMtPm5vZGUgd2FzIHBsYWNlZA0KKyAq IEBzcGxpdCAtIHRoZSBzcGxpdCBsb2NhdGlvbiBiZXR3ZWVuIEBsZWZ0IGFuZCBAcmlnaHQNCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3NldF9zcGxpdF9wYXJlbnQoc3RydWN0IG1hX3N0 YXRlICptYXMsDQorCQkJCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQsDQorCQkJCQlzdHJ1Y3Qg bWFwbGVfZW5vZGUgKnJpZ2h0LA0KKwkJCQkJdW5zaWduZWQgY2hhciAqc2xvdCwgdW5zaWduZWQg Y2hhciBzcGxpdCkNCit7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuOw0KKw0K KwlpZiAoKCpzbG90KSA8PSBzcGxpdCkNCisJCW10ZV9zZXRfcGFyZW50KG1hcy0+bm9kZSwgbGVm dCwgKnNsb3QpOw0KKwllbHNlIGlmIChyaWdodCkNCisJCW10ZV9zZXRfcGFyZW50KG1hcy0+bm9k ZSwgcmlnaHQsICgqc2xvdCkgLSBzcGxpdCAtIDEpOw0KKw0KKwkoKnNsb3QpKys7DQorfQ0KKw0K Ky8qDQorICogbXRlX21pZF9zcGxpdF9jaGVjaygpIC0gQ2hlY2sgaWYgdGhlIG5leHQgbm9kZSBw YXNzZXMgdGhlIG1pZC1zcGxpdA0KKyAqIEAqKmw6IFBvaW50ZXIgdG8gbGVmdCBlbmNvZGVkIG1h cGxlIG5vZGUuDQorICogQCoqbTogUG9pbnRlciB0byBtaWRkbGUgZW5jb2RlZCBtYXBsZSBub2Rl Lg0KKyAqIEAqKnI6IFBvaW50ZXIgdG8gcmlnaHQgZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqIEBz bG90OiBUaGUgb2Zmc2V0DQorICogQCpzcGxpdDogVGhlIHNwbGl0IGxvY2F0aW9uLg0KKyAqIEBt aWRfc3BsaXQ6IFRoZSBtaWRkbGUgc3BsaXQuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10 ZV9taWRfc3BsaXRfY2hlY2soc3RydWN0IG1hcGxlX2Vub2RlICoqbCwNCisJCQkJICAgICAgIHN0 cnVjdCBtYXBsZV9lbm9kZSAqKnIsDQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJp Z2h0LA0KKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBzbG90LA0KKwkJCQkgICAgICAgdW5zaWdu ZWQgY2hhciAqc3BsaXQsDQorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCkNCit7 DQorCWlmICgqciA9PSByaWdodCkNCisJCXJldHVybjsNCisNCisJaWYgKHNsb3QgPCBtaWRfc3Bs aXQpDQorCQlyZXR1cm47DQorDQorCSpsID0gKnI7DQorCSpyID0gcmlnaHQ7DQorCSpzcGxpdCA9 IG1pZF9zcGxpdDsNCit9DQorDQorLyoNCisgKiBtYXN0X3NldF9zcGxpdF9wYXJlbnRzKCkgLSBI ZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHRocmVlIG5vZGVzIHBhcmVudHMuICBTbG90DQorICogaXMg dGFrZW4gZnJvbSBAbWFzdC0+bC4NCisgKiBAbWFzdCAtIHRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRl DQorICogQGxlZnQgLSB0aGUgbGVmdCBub2RlDQorICogQHJpZ2h0IC0gdGhlIHJpZ2h0IG5vZGUN CisgKiBAc3BsaXQgLSB0aGUgc3BsaXQgbG9jYXRpb24uDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc3Rfc2V0X3NwbGl0X3BhcmVudHMoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1h c3QsDQorCQkJCQkgIHN0cnVjdCBtYXBsZV9lbm9kZSAqbGVmdCwNCisJCQkJCSAgc3RydWN0IG1h cGxlX2Vub2RlICptaWRkbGUsDQorCQkJCQkgIHN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQsDQor CQkJCQkgIHVuc2lnbmVkIGNoYXIgc3BsaXQsDQorCQkJCQkgIHVuc2lnbmVkIGNoYXIgbWlkX3Nw bGl0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBzbG90Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmwg PSBsZWZ0Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnIgPSByaWdodDsNCisNCisJaWYgKG1hc19p c19ub25lKG1hc3QtPmwpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobWlkZGxlKQ0KKwkJciA9IG1p ZGRsZTsNCisNCisJc2xvdCA9IG1hc3QtPmwtPm9mZnNldDsNCisNCisJbXRlX21pZF9zcGxpdF9j aGVjaygmbCwgJnIsIHJpZ2h0LCBzbG90LCAmc3BsaXQsIG1pZF9zcGxpdCk7DQorCW1hc19zZXRf c3BsaXRfcGFyZW50KG1hc3QtPmwsIGwsIHIsICZzbG90LCBzcGxpdCk7DQorDQorCW10ZV9taWRf c3BsaXRfY2hlY2soJmwsICZyLCByaWdodCwgc2xvdCwgJnNwbGl0LCBtaWRfc3BsaXQpOw0KKwlt YXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5tLCBsLCByLCAmc2xvdCwgc3BsaXQpOw0KKw0KKwlt dGVfbWlkX3NwbGl0X2NoZWNrKCZsLCAmciwgcmlnaHQsIHNsb3QsICZzcGxpdCwgbWlkX3NwbGl0 KTsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQobWFzdC0+ciwgbCwgciwgJnNsb3QsIHNwbGl0KTsN Cit9DQorDQorLyoNCisgKiBtYXNfd21iX3JlcGxhY2UoKSAtIFdyaXRlIG1lbW9yeSBiYXJyaWVy IGFuZCByZXBsYWNlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGZyZWU6IHRoZSBt YXBsZSB0b3BpYXJ5IGxpc3Qgb2Ygbm9kZXMgdG8gZnJlZQ0KKyAqIEBkZXN0cm95OiBUaGUgbWFw bGUgdG9waWFyeSBsaXN0IG9mIG5vZGVzIHRvIGRlc3Ryb3kgKHdhbGsgYW5kIGZyZWUpDQorICoN CisgKiBVcGRhdGVzIGdhcCBhcyBuZWNlc3NhcnkuDQorICovDQorc3RhdGljIGlubGluZSB2b2lk IG1hc193bWJfcmVwbGFjZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJICAgc3RydWN0IG1h X3RvcGlhcnkgKmZyZWUsDQorCQkJCSAgIHN0cnVjdCBtYV90b3BpYXJ5ICpkZXN0cm95KQ0KK3sN CisJLyogQWxsIG5vZGVzIG11c3Qgc2VlIG9sZCBkYXRhIGFzIGRlYWQgcHJpb3IgdG8gcmVwbGFj aW5nIHRoYXQgZGF0YSAqLw0KKwlzbXBfd21iKCk7IC8qIE5lZWRlZCBmb3IgUkNVICovDQorDQor CS8qIEluc2VydCB0aGUgbmV3IGRhdGEgaW4gdGhlIHRyZWUgKi8NCisJbWFzX3JlcGxhY2UobWFz LCB0cnVlKTsNCisNCisJaWYgKCFtdGVfaXNfbGVhZihtYXMtPm5vZGUpKQ0KKwkJbWFzX2Rlc2Nl bmRfYWRvcHQobWFzKTsNCisNCisJbWFzX21hdF9mcmVlKG1hcywgZnJlZSk7DQorDQorCWlmIChk ZXN0cm95KQ0KKwkJbWFzX21hdF9kZXN0cm95KG1hcywgZGVzdHJveSk7DQorDQorCWlmIChtdGVf aXNfbGVhZihtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXNfdXBkYXRlX2dhcChtYXMp Ow0KK30NCisNCisvKg0KKyAqIG1hc3RfbmV3X3Jvb3QoKSAtIFNldCBhIG5ldyB0cmVlIHJvb3Qg ZHVyaW5nIHN1YnRyZWUgY3JlYXRpb24NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3Rh dGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQg bWFzdF9uZXdfcm9vdChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJIHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJbWFzX21uKG1hc3QtPmwpLT5wYXJlbnQgPQ0KKwkJ bWFfcGFyZW50X3B0cigoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQp KTsNCisJaWYgKCFtdGVfZGVhZF9ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSkgJiYNCisJICAgICFt dGVfaXNfcm9vdChtYXN0LT5vcmlnX2wtPm5vZGUpKSB7DQorCQlkbyB7DQorCQkJbWFzdF9hc2Nl bmRfZnJlZShtYXN0KTsNCisJCQltYXN0X3RvcGlhcnkobWFzdCk7DQorCQl9IHdoaWxlICghbXRl X2lzX3Jvb3QobWFzdC0+b3JpZ19sLT5ub2RlKSk7DQorCX0NCisJaWYgKChtYXN0LT5vcmlnX2wt Pm5vZGUgIT0gbWFzLT5ub2RlKSAmJg0KKwkJICAgKG1hc3QtPmwtPmRlcHRoID4gbWFzX210X2hl aWdodChtYXMpKSkgew0KKwkJbWF0X2FkZChtYXN0LT5mcmVlLCBtYXMtPm5vZGUpOw0KKwl9DQor fQ0KKw0KKy8qDQorICogbWFzdF9jcF90b19ub2RlcygpIC0gQ29weSBkYXRhIG91dCB0byBub2Rl cy4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbGVmdDogVGhlIGxl ZnQgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQG1pZGRsZTogVGhlIG1pZGRsZSBlbmNvZGVkIG1h cGxlIG5vZGUNCisgKiBAcmlnaHQ6IFRoZSByaWdodCBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBA c3BsaXQ6IFRoZSBsb2NhdGlvbiB0byBzcGxpdCBiZXR3ZWVuIGxlZnQgYW5kIChtaWRkbGUgPyBt aWRkbGUgOiByaWdodCkNCisgKiBAbWlkX3NwbGl0OiBUaGUgbG9jYXRpb24gdG8gc3BsaXQgYmV0 d2VlbiBtaWRkbGUgYW5kIHJpZ2h0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X2Nw X3RvX25vZGVzKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwlzdHJ1Y3QgbWFw bGVfZW5vZGUgKmxlZnQsIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWlkZGxlLA0KKwlzdHJ1Y3QgbWFw bGVfZW5vZGUgKnJpZ2h0LCB1bnNpZ25lZCBjaGFyIHNwbGl0LCB1bnNpZ25lZCBjaGFyIG1pZF9z cGxpdCkNCit7DQorCWJvb2wgbmV3X2xtYXggPSB0cnVlOw0KKw0KKwltYXN0LT5sLT5ub2RlID0g bXRlX25vZGVfb3Jfbm9uZShsZWZ0KTsNCisJbWFzdC0+bS0+bm9kZSA9IG10ZV9ub2RlX29yX25v bmUobWlkZGxlKTsNCisJbWFzdC0+ci0+bm9kZSA9IG10ZV9ub2RlX29yX25vbmUocmlnaHQpOw0K Kw0KKwltYXN0LT5sLT5taW4gPSBtYXN0LT5vcmlnX2wtPm1pbjsNCisJaWYgKHNwbGl0ID09IG1h c3QtPmJuLT5iX2VuZCkgew0KKwkJbWFzdC0+bC0+bWF4ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQor CQluZXdfbG1heCA9IGZhbHNlOw0KKwl9DQorDQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIHNw bGl0LCBtYXN0LT5sLCBuZXdfbG1heCk7DQorDQorCWlmIChtaWRkbGUpIHsNCisJCW1hYl9tYXNf Y3AobWFzdC0+Ym4sIDEgKyBzcGxpdCwgbWlkX3NwbGl0LCBtYXN0LT5tLCB0cnVlKTsNCisJCW1h c3QtPm0tPm1pbiA9IG1hc3QtPmJuLT5waXZvdFtzcGxpdF0gKyAxOw0KKwkJc3BsaXQgPSBtaWRf c3BsaXQ7DQorCX0NCisNCisJbWFzdC0+ci0+bWF4ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQorCWlm IChyaWdodCkgew0KKwkJbWFiX21hc19jcChtYXN0LT5ibiwgMSArIHNwbGl0LCBtYXN0LT5ibi0+ Yl9lbmQsIG1hc3QtPnIsIGZhbHNlKTsNCisJCW1hc3QtPnItPm1pbiA9IG1hc3QtPmJuLT5waXZv dFtzcGxpdF0gKyAxOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzdF9jb21iaW5lX2NwX2xlZnQg LSBDb3B5IGluIHRoZSBvcmlnaW5hbCBsZWZ0IHNpZGUgb2YgdGhlIHRyZWUgaW50byB0aGUNCisg KiBjb21iaW5lZCBkYXRhIHNldCBpbiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBiaWcgbm9kZS4N CisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzdF9jb21iaW5lX2NwX2xlZnQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1h c3QpDQorew0KKwl1bnNpZ25lZCBjaGFyIGxfc2xvdCA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0Ow0K Kw0KKwlpZiAoIWxfc2xvdCkNCisJCXJldHVybjsNCisNCisJbWFzX21hYl9jcChtYXN0LT5vcmln X2wsIDAsIGxfc2xvdCAtIDEsIG1hc3QtPmJuLCAwKTsNCit9DQorDQorLyoNCisgKiBtYXN0X2Nv bWJpbmVfY3BfcmlnaHQ6IENvcHkgaW4gdGhlIG9yaWdpbmFsIHJpZ2h0IHNpZGUgb2YgdGhlIHRy ZWUgaW50byB0aGUNCisgKiBjb21iaW5lZCBkYXRhIHNldCBpbiB0aGUgbWFwbGUgc3VidHJlZSBz dGF0ZSBiaWcgbm9kZS4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9jb21iaW5lX2NwX3JpZ2h0KHN0cnVjdCBtYXBsZV9z dWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJaWYgKG1hc3QtPmJuLT5waXZvdFttYXN0LT5ibi0+ Yl9lbmQgLSAxXSA+PSBtYXN0LT5vcmlnX3ItPm1heCkNCisJCXJldHVybjsNCisNCisJbWFzX21h Yl9jcChtYXN0LT5vcmlnX3IsIG1hc3QtPm9yaWdfci0+b2Zmc2V0ICsgMSwNCisJCSAgIG10X3Ns b3RfY291bnQobWFzdC0+b3JpZ19yLT5ub2RlKSwgbWFzdC0+Ym4sDQorCQkgICBtYXN0LT5ibi0+ Yl9lbmQpOw0KKwltYXN0LT5vcmlnX3ItPmxhc3QgPSBtYXN0LT5vcmlnX3ItPm1heDsNCit9DQor DQorLyoNCisgKiBtYXN0X3N1ZmZpY2llbnQ6IENoZWNrIGlmIHRoZSBtYXBsZSBzdWJ0cmVlIHN0 YXRlIGhhcyBlbm91Z2ggZGF0YSBpbiB0aGUgYmlnDQorICogbm9kZSB0byBjcmVhdGUgYXQgbGVh c3Qgb25lIHN1ZmZpY2llbnQgbm9kZQ0KKyAqIEBtYXN0OiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0 ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXN0X3N1ZmZpY2llbnQoc3RydWN0IG1hcGxl X3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwlpZiAobWFzdC0+Ym4tPmJfZW5kID4gbXRfbWlu X3Nsb3RfY291bnQobWFzdC0+b3JpZ19sLT5ub2RlKSkNCisJCXJldHVybiB0cnVlOw0KKw0KKwly ZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFzdF9vdmVyZmxvdzogQ2hlY2sgaWYgdGhl cmUgaXMgdG9vIG11Y2ggZGF0YSBpbiB0aGUgc3VidHJlZSBzdGF0ZSBmb3IgYQ0KKyAqIHNpbmds ZSBub2RlLg0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtYXN0X292ZXJmbG93KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICpt YXN0KQ0KK3sNCisJaWYgKG1hc3QtPmJuLT5iX2VuZCA+PSBtdF9zbG90X2NvdW50KG1hc3QtPm9y aWdfbC0+bm9kZSkpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisN CitzdGF0aWMgaW5saW5lIHZvaWQgKm10cmVlX3JhbmdlX3dhbGsoc3RydWN0IG1hX3N0YXRlICpt YXMpDQorew0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0 Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0 LCAqbGFzdDsNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJdW5zaWduZWQgY2hhciBlbmQ7DQorCXVuc2lnbmVkIGxvbmcgbWF4LCBtaW47DQorCXVuc2ln bmVkIGxvbmcgcHJldl9tYXgsIHByZXZfbWluOw0KKw0KKwlsYXN0ID0gbmV4dCA9IG1hcy0+bm9k ZTsNCisJcHJldl9taW4gPSBtaW4gPSBtYXMtPm1pbjsNCisJbWF4ID0gbWFzLT5tYXg7DQorCWRv IHsNCisJCW9mZnNldCA9IDA7DQorCQlsYXN0ID0gbmV4dDsNCisJCW5vZGUgPSBtdGVfdG9fbm9k ZShuZXh0KTsNCisJCXR5cGUgPSBtdGVfbm9kZV90eXBlKG5leHQpOw0KKwkJcGl2b3RzID0gbWFf cGl2b3RzKG5vZGUsIHR5cGUpOw0KKwkJZW5kID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2 b3RzLCBtYXgpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290 byBkZWFkX25vZGU7DQorDQorCQlpZiAocGl2b3RzW29mZnNldF0gPj0gbWFzLT5pbmRleCkgew0K KwkJCXByZXZfbWF4ID0gbWF4Ow0KKwkJCXByZXZfbWluID0gbWluOw0KKwkJCW1heCA9IHBpdm90 c1tvZmZzZXRdOw0KKwkJCWdvdG8gbmV4dDsNCisJCX0NCisNCisJCWRvIHsNCisJCQlvZmZzZXQr KzsNCisJCX0gd2hpbGUgKChvZmZzZXQgPCBlbmQpICYmIChwaXZvdHNbb2Zmc2V0XSA8IG1hcy0+ aW5kZXgpKTsNCisNCisJCXByZXZfbWluID0gbWluOw0KKwkJbWluID0gcGl2b3RzW29mZnNldCAt IDFdICsgMTsNCisJCXByZXZfbWF4ID0gbWF4Ow0KKwkJaWYgKGxpa2VseShvZmZzZXQgPCBlbmQg JiYgcGl2b3RzW29mZnNldF0pKQ0KKwkJCW1heCA9IHBpdm90c1tvZmZzZXRdOw0KKw0KK25leHQ6 DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwkJbmV4dCA9IG10X3Nsb3QobWFz LT50cmVlLCBzbG90cywgb2Zmc2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9k ZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKwl9IHdoaWxlICghbWFfaXNfbGVhZih0eXBlKSk7 DQorDQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwltYXMtPmluZGV4ID0gbWluOw0KKwltYXMt Pmxhc3QgPSBtYXg7DQorCW1hcy0+bWluID0gcHJldl9taW47DQorCW1hcy0+bWF4ID0gcHJldl9t YXg7DQorCW1hcy0+bm9kZSA9IGxhc3Q7DQorCXJldHVybiAodm9pZCAqKSBuZXh0Ow0KKw0KK2Rl YWRfbm9kZToNCisJbWFzX3Jlc2V0KG1hcyk7DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0K KyAqIG1hc19zcGFubmluZ19yZWJhbGFuY2UoKSAtIFJlYmFsYW5jZSBhY3Jvc3MgdHdvIG5vZGVz IHdoaWNoIG1heSBub3QgYmUgcGVlcnMuDQorICogQG1hczogVGhlIHN0YXJ0aW5nIG1hcGxlIHN0 YXRlDQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0cmVlX3N0YXRlLCBrZWVwcyB0cmFjayBvZiA0 IG1hcGxlIHN0YXRlcy4NCisgKiBAY291bnQ6IFRoZSBlc3RpbWF0ZWQgY291bnQgb2YgaXRlcmF0 aW9ucyBuZWVkZWQuDQorICoNCisgKiBGb2xsb3cgdGhlIHRyZWUgdXB3YXJkcyBmcm9tIEBsX21h cyBhbmQgQHJfbWFzIGZvciBAY291bnQsIG9yIHVudGlsIHRoZSByb290DQorICogaXMgaGl0LiAg Rmlyc3QgQGJfbm9kZSBpcyBzcGxpdCBpbnRvIHR3byBlbnRyaWVzIHdoaWNoIGFyZSBpbnNlcnRl ZCBpbnRvIHRoZQ0KKyAqIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBsb29wLiAgQGJfbm9kZSBpcyBy ZXR1cm5lZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZmluYWwNCisgKiBpdGVyYXRpb24uIEBtYXMgaXMg dXNlZCB0byBvYnRhaW4gYWxsb2NhdGlvbnMuICBvcmlnX2xfbWFzIGtlZXBzIHRyYWNrIG9mIHRo ZQ0KKyAqIG5vZGVzIHRoYXQgd2lsbCByZW1haW4gYWN0aXZlIGJ5IHVzaW5nIG9yaWdfbF9tYXMt PmluZGV4IGFuZCBvcmlnX2xfbWFzLT5sYXN0DQorICogdG8gYWNjb3VudCBvZiB3aGF0IGhhcyBi ZWVuIGNvcGllZCBpbnRvIHRoZSBuZXcgc3ViLXRyZWUuICBUaGUgdXBkYXRlIG9mDQorICogb3Jp Z19sX21hcy0+bGFzdCBpcyB1c2VkIGluIG1hc19jb25zdW1lIHRvIGZpbmQgdGhlIHNsb3RzIHRo YXQgd2lsbCBuZWVkIHRvDQorICogYmUgZWl0aGVyIGZyZWVkIG9yIGRlc3Ryb3llZC4gIG9yaWdf bF9tYXMtPmRlcHRoIGtlZXBzIHRyYWNrIG9mIHRoZSBoZWlnaHQgb2YNCisgKiB0aGUgbmV3IHN1 Yi10cmVlIGluIGNhc2UgdGhlIHN1Yi10cmVlIGJlY29tZXMgdGhlIGZ1bGwgdHJlZS4NCisgKg0K KyAqIFJldHVybjogdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBiX25vZGUgZHVyaW5nIHRoZSBs YXN0IGxvb3AuDQorICovDQorc3RhdGljIGludCBtYXNfc3Bhbm5pbmdfcmViYWxhbmNlKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsIHVu c2lnbmVkIGNoYXIgY291bnQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNwbGl0LCBtaWRfc3BsaXQ7 DQorCXVuc2lnbmVkIGNoYXIgc2xvdCA9IDA7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGVmdCA9 IE5VTEwsICptaWRkbGUgPSBOVUxMLCAqcmlnaHQgPSBOVUxMOw0KKw0KKwlNQV9TVEFURShsX21h cywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmluZGV4KTsNCisJTUFfU1RBVEUocl9tYXMs IG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJTUFfU1RBVEUobV9tYXMsIG1h cy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5pbmRleCk7DQorCU1BX1RPUElBUlkoZnJlZSwgbWFz LT50cmVlKTsNCisJTUFfVE9QSUFSWShkZXN0cm95LCBtYXMtPnRyZWUpOw0KKw0KKwkvKg0KKwkg KiBUaGUgdHJlZSBuZWVkcyB0byBiZSByZWJhbGFuY2VkIGFuZCBsZWF2ZXMgbmVlZCB0byBiZSBr ZXB0IGF0IHRoZSBzYW1lIGxldmVsLg0KKwkgKiBSZWJhbGFuY2luZyBpcyBkb25lIGJ5IHVzZSBv ZiB0aGUgYGBzdHJ1Y3QgbWFwbGVfdG9waWFyeWBgLg0KKwkgKi8NCisJbWFzdC0+bCA9ICZsX21h czsNCisJbWFzdC0+bSA9ICZtX21hczsNCisJbWFzdC0+ciA9ICZyX21hczsNCisJbWFzdC0+ZnJl ZSA9ICZmcmVlOw0KKwltYXN0LT5kZXN0cm95ID0gJmRlc3Ryb3k7DQorCWxfbWFzLm5vZGUgPSBy X21hcy5ub2RlID0gbV9tYXMubm9kZSA9IE1BU19OT05FOw0KKwlpZiAoIShtYXN0LT5vcmlnX2wt Pm1pbiAmJiBtYXN0LT5vcmlnX3ItPm1heCA9PSBVTE9OR19NQVgpICYmDQorCSAgICB1bmxpa2Vs eShtYXN0LT5ibi0+Yl9lbmQgPD0gbXRfbWluX3Nsb3RzW21hc3QtPmJuLT50eXBlXSkpDQorCQlt YXN0X3NwYW5uaW5nX3JlYmFsYW5jZShtYXN0KTsNCisNCisJbWFzdC0+b3JpZ19sLT5kZXB0aCA9 IDA7DQorDQorCS8qDQorCSAqIEVhY2ggbGV2ZWwgb2YgdGhlIHRyZWUgaXMgZXhhbWluZWQgYW5k IGJhbGFuY2VkLCBwdXNoaW5nIGRhdGEgdG8gdGhlIGxlZnQgb3INCisJICogcmlnaHQsIG9yIHJl YmFsYW5jaW5nIGFnYWluc3QgbGVmdCBvciByaWdodCBub2RlcyBpcyBlbXBsb3llZCB0byBhdm9p ZA0KKwkgKiByaXBwbGluZyB1cCB0aGUgdHJlZSB0byBsaW1pdCB0aGUgYW1vdW50IG9mIGNodXJu LiAgT25jZSBhIG5ldyBzdWItc2VjdGlvbiBvZg0KKwkgKiB0aGUgdHJlZSBpcyBjcmVhdGVkLCB0 aGVyZSBtYXkgYmUgYSBtaXggb2YgbmV3IGFuZCBvbGQgbm9kZXMuICBUaGUgb2xkIG5vZGVzDQor CSAqIHdpbGwgaGF2ZSB0aGUgaW5jb3JyZWN0IHBhcmVudCBwb2ludGVycyBhbmQgY3VycmVudGx5 IGJlIGluIHR3byB0cmVlczogdGhlDQorCSAqIG9yaWdpbmFsIHRyZWUgYW5kIHRoZSBwYXJ0aWFs bHkgbmV3IHRyZWUuICBUbyByZW1lZHkgdGhlIHBhcmVudCBwb2ludGVycyBpbg0KKwkgKiB0aGUg b2xkIHRyZWUsIHRoZSBuZXcgZGF0YSBpcyBzd2FwcGVkIGludG8gdGhlIGFjdGl2ZSB0cmVlIGFu ZCBhIHdhbGsgZG93bg0KKwkgKiB0aGUgdHJlZSBpcyBwZXJmb3JtZWQgYW5kIHRoZSBwYXJlbnQg cG9pbnRlcnMgYXJlIHVwZGF0ZWQuDQorCSAqIFNlZSBtYXNfZGVzY2VuZF9hZG9wdCgpIGZvciBt b3JlIGluZm9ybWF0aW9uLi4NCisJICovDQorCXdoaWxlIChjb3VudC0tKSB7DQorCQltYXN0LT5i bi0+Yl9lbmQtLTsNCisJCW1hc3QtPmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmln X2wtPm5vZGUpOw0KKwkJc3BsaXQgPSBtYXNfbWFiX3RvX25vZGUobWFzLCBtYXN0LT5ibiwgJmxl ZnQsICZyaWdodCwgJm1pZGRsZSwNCisJCQkJCSZtaWRfc3BsaXQsIG1hc3QtPm9yaWdfbC0+bWlu KTsNCisJCW1hc3Rfc2V0X3NwbGl0X3BhcmVudHMobWFzdCwgbGVmdCwgbWlkZGxlLCByaWdodCwg c3BsaXQsDQorCQkJCSAgICAgICBtaWRfc3BsaXQpOw0KKwkJbWFzdF9jcF90b19ub2RlcyhtYXN0 LCBsZWZ0LCBtaWRkbGUsIHJpZ2h0LCBzcGxpdCwgbWlkX3NwbGl0KTsNCisNCisJCS8qDQorCQkg KiBDb3B5IGRhdGEgZnJvbSBuZXh0IGxldmVsIGluIHRoZSB0cmVlIHRvIG1hc3QtPmJuIGZyb20g bmV4dA0KKwkJICogaXRlcmF0aW9uDQorCQkgKi8NCisJCW1lbXNldChtYXN0LT5ibiwgMCwgc2l6 ZW9mKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSkpOw0KKwkJbWFzdC0+Ym4tPnR5cGUgPSBtdGVfbm9k ZV90eXBlKGxlZnQpOw0KKwkJbWFzdC0+b3JpZ19sLT5kZXB0aCsrOw0KKw0KKwkJLyogUm9vdCBh bHJlYWR5IHN0b3JlZCBpbiBsLT5ub2RlLiAqLw0KKwkJaWYgKG1hc19pc19yb290X2xpbWl0cyht YXN0LT5sKSkNCisJCQlnb3RvIG5ld19yb290Ow0KKw0KKwkJbWFzdF9hc2NlbmRfZnJlZShtYXN0 KTsNCisJCW1hc3RfY29tYmluZV9jcF9sZWZ0KG1hc3QpOw0KKwkJbF9tYXMub2Zmc2V0ID0gbWFz dC0+Ym4tPmJfZW5kOw0KKwkJbWFiX3NldF9iX2VuZChtYXN0LT5ibiwgJmxfbWFzLCBsZWZ0KTsN CisJCW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sICZtX21hcywgbWlkZGxlKTsNCisJCW1hYl9zZXRf Yl9lbmQobWFzdC0+Ym4sICZyX21hcywgcmlnaHQpOw0KKw0KKwkJLyogQ29weSBhbnl0aGluZyBu ZWNlc3Nhcnkgb3V0IG9mIHRoZSByaWdodCBub2RlLiAqLw0KKwkJbWFzdF9jb21iaW5lX2NwX3Jp Z2h0KG1hc3QpOw0KKwkJbWFzdF90b3BpYXJ5KG1hc3QpOw0KKwkJbWFzdC0+b3JpZ19sLT5sYXN0 ID0gbWFzdC0+b3JpZ19sLT5tYXg7DQorDQorCQlpZiAobWFzdF9zdWZmaWNpZW50KG1hc3QpKQ0K KwkJCWNvbnRpbnVlOw0KKw0KKwkJaWYgKG1hc3Rfb3ZlcmZsb3cobWFzdCkpDQorCQkJY29udGlu dWU7DQorDQorCQkvKiBNYXkgYmUgYSBuZXcgcm9vdCBzdG9yZWQgaW4gbWFzdC0+Ym4gKi8NCisJ CWlmIChtYXNfaXNfcm9vdF9saW1pdHMobWFzdC0+b3JpZ19sKSkNCisJCQlicmVhazsNCisNCisJ CW1hc3Rfc3Bhbm5pbmdfcmViYWxhbmNlKG1hc3QpOw0KKw0KKwkJLyogcmViYWxhbmNpbmcgZnJv bSBvdGhlciBub2RlcyBtYXkgcmVxdWlyZSBhbm90aGVyIGxvb3AuICovDQorCQlpZiAoIWNvdW50 KQ0KKwkJCWNvdW50Kys7DQorCX0NCisNCisJbF9tYXMubm9kZSA9IG10X21rX25vZGUobWFfbW5v ZGVfcHRyKG1hc19wb3Bfbm9kZShtYXMpKSwNCisJCQkJbXRlX25vZGVfdHlwZShtYXN0LT5vcmln X2wtPm5vZGUpKTsNCisJbWFzdC0+b3JpZ19sLT5kZXB0aCsrOw0KKwltYWJfbWFzX2NwKG1hc3Qt PmJuLCAwLCBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0gLSAxLCAmbF9tYXMsIHRydWUpOw0KKwlt dGVfc2V0X3BhcmVudChsZWZ0LCBsX21hcy5ub2RlLCBzbG90KTsNCisJaWYgKG1pZGRsZSkNCisJ CW10ZV9zZXRfcGFyZW50KG1pZGRsZSwgbF9tYXMubm9kZSwgKytzbG90KTsNCisNCisJaWYgKHJp Z2h0KQ0KKwkJbXRlX3NldF9wYXJlbnQocmlnaHQsIGxfbWFzLm5vZGUsICsrc2xvdCk7DQorDQor CWlmIChtYXNfaXNfcm9vdF9saW1pdHMobWFzdC0+bCkpIHsNCituZXdfcm9vdDoNCisJCW1hc3Rf bmV3X3Jvb3QobWFzdCwgbWFzKTsNCisJfSBlbHNlIHsNCisJCW1hc19tbigmbF9tYXMpLT5wYXJl bnQgPSBtYXNfbW4obWFzdC0+b3JpZ19sKS0+cGFyZW50Ow0KKwl9DQorDQorCWlmICghbXRlX2Rl YWRfbm9kZShtYXN0LT5vcmlnX2wtPm5vZGUpKQ0KKwkJbWF0X2FkZCgmZnJlZSwgbWFzdC0+b3Jp Z19sLT5ub2RlKTsNCisNCisJbWFzLT5kZXB0aCA9IG1hc3QtPm9yaWdfbC0+ZGVwdGg7DQorCSpt YXN0LT5vcmlnX2wgPSBsX21hczsNCisJbXRlX3NldF9ub2RlX2RlYWQobWFzLT5ub2RlKTsNCisN CisJLyogU2V0IHVwIG1hcyBmb3IgaW5zZXJ0aW9uLiAqLw0KKwltYXN0LT5vcmlnX2wtPmRlcHRo ID0gbWFzLT5kZXB0aDsNCisJbWFzdC0+b3JpZ19sLT5hbGxvYyA9IG1hcy0+YWxsb2M7DQorCSpt YXMgPSAqbWFzdC0+b3JpZ19sOw0KKwltYXNfd21iX3JlcGxhY2UobWFzLCAmZnJlZSwgJmRlc3Ry b3kpOw0KKwltdHJlZV9yYW5nZV93YWxrKG1hcyk7DQorCXJldHVybiBtYXN0LT5ibi0+Yl9lbmQ7 DQorfQ0KKw0KKy8qDQorICogbWFzX3JlYmFsYW5jZSgpIC0gUmViYWxhbmNlIGEgZ2l2ZW4gbm9k ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAYl9ub2RlOiBUaGUgYmlnIG1hcGxl IG5vZGUuDQorICoNCisgKiBSZWJhbGFuY2UgdHdvIG5vZGVzIGludG8gYSBzaW5nbGUgbm9kZSBv ciB0d28gbmV3IG5vZGVzIHRoYXQgYXJlIHN1ZmZpY2llbnQuDQorICogQ29udGludWUgdXB3YXJk cyB1bnRpbCB0cmVlIGlzIHN1ZmZpY2llbnQuDQorICoNCisgKiBSZXR1cm46IHRoZSBudW1iZXIg b2YgZWxlbWVudHMgaW4gYl9ub2RlIGR1cmluZyB0aGUgbGFzdCBsb29wLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgaW50IG1hc19yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJCXN0 cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlKQ0KK3sNCisJY2hhciBlbXB0eV9jb3VudCA9IG1h c19tdF9oZWlnaHQobWFzKTsNCisJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgbWFzdDsNCisJ dW5zaWduZWQgY2hhciBzaGlmdCwgYl9lbmQgPSArK2Jfbm9kZS0+Yl9lbmQ7DQorDQorCU1BX1NU QVRFKGxfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1BX1NUQVRF KHJfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorDQorCXRyYWNlX21h X29wKF9fZnVuY19fLCBtYXMpOw0KKw0KKwkvKg0KKwkgKiBSZWJhbGFuY2luZyBvY2N1cnMgaWYg YSBub2RlIGlzIGluc3VmZmljaWVudC4gIERhdGEgaXMgcmViYWxhbmNlZA0KKwkgKiBhZ2FpbnN0 IHRoZSBub2RlIHRvIHRoZSByaWdodCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB0aGUgbm9kZSB0 byB0aGUNCisJICogbGVmdCBvZiB0aGlzIG5vZGUgaXMgcmViYWxhbmNlZCBhZ2FpbnN0IHRoaXMg bm9kZS4gIElmIHJlYmFsYW5jaW5nDQorCSAqIGNhdXNlcyBqdXN0IG9uZSBub2RlIHRvIGJlIHBy b2R1Y2VkIGluc3RlYWQgb2YgdHdvLCB0aGVuIHRoZSBwYXJlbnQNCisJICogaXMgYWxzbyBleGFt aW5lZCBhbmQgcmViYWxhbmNlZCBpZiBpdCBpcyBpbnN1ZmZpY2llbnQuICBFdmVyeSBsZXZlbA0K KwkgKiB0cmllcyB0byBjb21iaW5lIHRoZSBkYXRhIGluIHRoZSBzYW1lIHdheS4gIElmIG9uZSBu b2RlIGNvbnRhaW5zIHRoZQ0KKwkgKiBlbnRpcmUgcmFuZ2Ugb2YgdGhlIHRyZWUsIHRoZW4gdGhh dCBub2RlIGlzIHVzZWQgYXMgYSBuZXcgcm9vdCBub2RlLg0KKwkgKi8NCisJbWFzX25vZGVfY291 bnQobWFzLCAxICsgZW1wdHlfY291bnQgKiAzKTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJ CXJldHVybiAwOw0KKw0KKwltYXN0Lm9yaWdfbCA9ICZsX21hczsNCisJbWFzdC5vcmlnX3IgPSAm cl9tYXM7DQorCW1hc3QuYm4gPSBiX25vZGU7DQorCW1hc3QuYm4tPnR5cGUgPSBtdGVfbm9kZV90 eXBlKG1hcy0+bm9kZSk7DQorDQorCWxfbWFzID0gcl9tYXMgPSAqbWFzOw0KKw0KKwlpZiAobWFz X25leHRfc2libGluZygmcl9tYXMpKSB7DQorCQltYXNfbWFiX2NwKCZyX21hcywgMCwgbXRfc2xv dF9jb3VudChyX21hcy5ub2RlKSwgYl9ub2RlLCBiX2VuZCk7DQorCQlyX21hcy5sYXN0ID0gcl9t YXMuaW5kZXggPSByX21hcy5tYXg7DQorCX0gZWxzZSB7DQorCQltYXNfcHJldl9zaWJsaW5nKCZs X21hcyk7DQorCQlzaGlmdCA9IG1hc19kYXRhX2VuZCgmbF9tYXMpICsgMTsNCisJCW1hYl9zaGlm dF9yaWdodChiX25vZGUsIHNoaWZ0KTsNCisJCW1hcy0+b2Zmc2V0ICs9IHNoaWZ0Ow0KKwkJbWFz X21hYl9jcCgmbF9tYXMsIDAsIHNoaWZ0IC0gMSwgYl9ub2RlLCAwKTsNCisJCWJfbm9kZS0+Yl9l bmQgPSBzaGlmdCArIGJfZW5kOw0KKwkJbF9tYXMuaW5kZXggPSBsX21hcy5sYXN0ID0gbF9tYXMu bWluOw0KKwl9DQorDQorCXJldHVybiBtYXNfc3Bhbm5pbmdfcmViYWxhbmNlKG1hcywgJm1hc3Qs IGVtcHR5X2NvdW50KTsNCit9DQorDQorLyoNCisgKiBtYXNfZGVzdHJveV9yZWJhbGFuY2UoKSAt IFJlYmFsYW5jZSBsZWZ0LW1vc3Qgbm9kZSB3aGlsZSBkZXN0cm95aW5nIHRoZSBtYXBsZQ0KKyAq IHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbmQ6IFRoZSBlbmQgb2Yg dGhlIGxlZnQtbW9zdCBub2RlLg0KKyAqDQorICogRHVyaW5nIGEgbWFzcy1pbnNlcnQgZXZlbnQg KHN1Y2ggYXMgZm9ya2luZyksIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8NCisgKiByZWJhbGFuY2Ug dGhlIGxlZnQtbW9zdCBub2RlIHdoZW4gaXQgaXMgbm90IHN1ZmZpY2llbnQuDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc19kZXN0cm95X3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdW5zaWduZWQgY2hhciBlbmQpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgbXQgPSBtdGVfbm9k ZV90eXBlKG1hcy0+bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9ub2RlIHJldXNlLCAqbmV3bm9kZSwg KnBhcmVudCwgKm5ld19sZWZ0LCAqbGVmdCwgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq ZXBhcmVudDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQsIHRtcCwgc3BsaXQgPSBtdF9zbG90c1tt dF0gLyAyOw0KKwl2b2lkIF9fcmN1ICoqbF9zbG90cywgKipzbG90czsNCisJdW5zaWduZWQgbG9u ZyAqbF9waXZzLCAqcGl2cywgZ2FwOw0KKwlib29sIGluX3JjdSA9IG10X2luX3JjdShtYXMtPnRy ZWUpOw0KKw0KKwlNQV9TVEFURShsX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxh c3QpOw0KKw0KKwlsX21hcyA9ICptYXM7DQorCW1hc19wcmV2X3NpYmxpbmcoJmxfbWFzKTsNCisN CisJLyogc2V0IHVwIG5vZGUuICovDQorCWlmIChpbl9yY3UpIHsNCisJCS8qIEFsbG9jYXRlIGZv ciBib3RoIGxlZnQgYW5kIHJpZ2h0IGFzIHdlbGwgYXMgcGFyZW50LiAqLw0KKwkJbWFzX25vZGVf Y291bnQobWFzLCAzKTsNCisJCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQkJcmV0dXJuOw0KKw0K KwkJbmV3bm9kZSA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwl9IGVsc2Ugew0KKwkJbmV3bm9kZSA9 ICZyZXVzZTsNCisJfQ0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW5ld25vZGUtPnBhcmVu dCA9IG5vZGUtPnBhcmVudDsNCisJc2xvdHMgPSBtYV9zbG90cyhuZXdub2RlLCBtdCk7DQorCXBp dnMgPSBtYV9waXZvdHMobmV3bm9kZSwgbXQpOw0KKwlsZWZ0ID0gbWFzX21uKCZsX21hcyk7DQor CWxfc2xvdHMgPSBtYV9zbG90cyhsZWZ0LCBtdCk7DQorCWxfcGl2cyA9IG1hX3Bpdm90cyhsZWZ0 LCBtdCk7DQorCWlmICghbF9zbG90c1tzcGxpdF0pDQorCQlzcGxpdCsrOw0KKwl0bXAgPSBtYXNf ZGF0YV9lbmQoJmxfbWFzKSAtIHNwbGl0Ow0KKw0KKwltZW1jcHkoc2xvdHMsIGxfc2xvdHMgKyBz cGxpdCArIDEsIHNpemVvZih2b2lkICopICogdG1wKTsNCisJbWVtY3B5KHBpdnMsIGxfcGl2cyAr IHNwbGl0ICsgMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogdG1wKTsNCisJcGl2c1t0bXBdID0g bF9tYXMubWF4Ow0KKwltZW1jcHkoc2xvdHMgKyB0bXAsIG1hX3Nsb3RzKG5vZGUsIG10KSwgc2l6 ZW9mKHZvaWQgKikgKiBlbmQpOw0KKwltZW1jcHkocGl2cyArIHRtcCwgbWFfcGl2b3RzKG5vZGUs IG10KSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogZW5kKTsNCisNCisJbF9tYXMubWF4ID0gbF9w aXZzW3NwbGl0XTsNCisJbWFzLT5taW4gPSBsX21hcy5tYXggKyAxOw0KKwllcGFyZW50ID0gbXRf bWtfbm9kZShtdGVfcGFyZW50KGxfbWFzLm5vZGUpLA0KKwkJCSAgICAgbWFzX3BhcmVudF9lbnVt KCZsX21hcywgbF9tYXMubm9kZSkpOw0KKwl0bXAgKz0gZW5kOw0KKwlpZiAoIWluX3JjdSkgew0K KwkJdW5zaWduZWQgY2hhciBtYXhfcCA9IG10X3Bpdm90c1ttdF07DQorCQl1bnNpZ25lZCBjaGFy IG1heF9zID0gbXRfc2xvdHNbbXRdOw0KKw0KKwkJaWYgKHRtcCA8IG1heF9wKQ0KKwkJCW1lbXNl dChwaXZzICsgdG1wLCAwLA0KKwkJCSAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZyAqKSAqICht YXhfcCAtIHRtcCkpOw0KKw0KKwkJaWYgKHRtcCA8IG10X3Nsb3RzW210XSkNCisJCQltZW1zZXQo c2xvdHMgKyB0bXAsIDAsIHNpemVvZih2b2lkICopICogKG1heF9zIC0gdG1wKSk7DQorDQorCQlt ZW1jcHkobm9kZSwgbmV3bm9kZSwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSk7DQorCQltYV9z ZXRfbWV0YShub2RlLCBtdCwgMCwgdG1wIC0gMSk7DQorCQltdGVfc2V0X3Bpdm90KGVwYXJlbnQs IG10ZV9wYXJlbnRfc2xvdChsX21hcy5ub2RlKSwNCisJCQkgICAgICBsX3BpdnNbc3BsaXRdKTsN CisNCisJCS8qIFJlbW92ZSBkYXRhIGZyb20gbF9waXZzLiAqLw0KKwkJdG1wID0gc3BsaXQgKyAx Ow0KKwkJbWVtc2V0KGxfcGl2cyArIHRtcCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogKG1h eF9wIC0gdG1wKSk7DQorCQltZW1zZXQobF9zbG90cyArIHRtcCwgMCwgc2l6ZW9mKHZvaWQgKikg KiAobWF4X3MgLSB0bXApKTsNCisJCW1hX3NldF9tZXRhKGxlZnQsIG10LCAwLCBzcGxpdCk7DQor DQorCQlnb3RvIGRvbmU7DQorCX0NCisNCisJLyogUkNVIHJlcXVpcmVzIHJlcGxhY2luZyBib3Ro IGxfbWFzLCBtYXMsIGFuZCBwYXJlbnQuICovDQorCW1hcy0+bm9kZSA9IG10X21rX25vZGUobmV3 bm9kZSwgbXQpOw0KKwltYV9zZXRfbWV0YShuZXdub2RlLCBtdCwgMCwgdG1wKTsNCisNCisJbmV3 X2xlZnQgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJbmV3X2xlZnQtPnBhcmVudCA9IGxlZnQtPnBh cmVudDsNCisJbXQgPSBtdGVfbm9kZV90eXBlKGxfbWFzLm5vZGUpOw0KKwlzbG90cyA9IG1hX3Ns b3RzKG5ld19sZWZ0LCBtdCk7DQorCXBpdnMgPSBtYV9waXZvdHMobmV3X2xlZnQsIG10KTsNCisJ bWVtY3B5KHNsb3RzLCBsX3Nsb3RzLCBzaXplb2Yodm9pZCAqKSAqIHNwbGl0KTsNCisJbWVtY3B5 KHBpdnMsIGxfcGl2cywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogc3BsaXQpOw0KKwltYV9zZXRf bWV0YShuZXdfbGVmdCwgbXQsIDAsIHNwbGl0KTsNCisJbF9tYXMubm9kZSA9IG10X21rX25vZGUo bmV3X2xlZnQsIG10KTsNCisNCisJLyogcmVwbGFjZSBwYXJlbnQuICovDQorCW9mZnNldCA9IG10 ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwltdCA9IG1hc19wYXJlbnRfZW51bSgmbF9tYXMs IGxfbWFzLm5vZGUpOw0KKwlwYXJlbnQgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJc2xvdHMgPSBt YV9zbG90cyhwYXJlbnQsIG10KTsNCisJcGl2cyA9IG1hX3Bpdm90cyhwYXJlbnQsIG10KTsNCisJ bWVtY3B5KHBhcmVudCwgbXRlX3RvX25vZGUoZXBhcmVudCksIHNpemVvZihzdHJ1Y3QgbWFwbGVf bm9kZSkpOw0KKwlyY3VfYXNzaWduX3BvaW50ZXIoc2xvdHNbb2Zmc2V0XSwgbWFzLT5ub2RlKTsN CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW29mZnNldCAtIDFdLCBsX21hcy5ub2RlKTsNCisJ cGl2c1tvZmZzZXQgLSAxXSA9IGxfbWFzLm1heDsNCisJZXBhcmVudCA9IG10X21rX25vZGUocGFy ZW50LCBtdCk7DQorZG9uZToNCisJZ2FwID0gbWFzX2xlYWZfbWF4X2dhcChtYXMpOw0KKwltdGVf c2V0X2dhcChlcGFyZW50LCBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKSwgZ2FwKTsNCisJZ2Fw ID0gbWFzX2xlYWZfbWF4X2dhcCgmbF9tYXMpOw0KKwltdGVfc2V0X2dhcChlcGFyZW50LCBtdGVf cGFyZW50X3Nsb3QobF9tYXMubm9kZSksIGdhcCk7DQorCW1hc19hc2NlbmQobWFzKTsNCisNCisJ aWYgKGluX3JjdSkNCisJCW1hc19yZXBsYWNlKG1hcywgZmFsc2UpOw0KKw0KKwltYXNfdXBkYXRl X2dhcChtYXMpOw0KK30NCisNCisvKg0KKyAqIG1hc19zcGxpdF9maW5hbF9ub2RlKCkgLSBTcGxp dCB0aGUgZmluYWwgbm9kZSBpbiBhIHN1YnRyZWUgb3BlcmF0aW9uLg0KKyAqIEBtYXN0OiB0aGUg bWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBoZWln aHQ6IFRoZSBoZWlnaHQgb2YgdGhlIHRyZWUgaW4gY2FzZSBpdCdzIGEgbmV3IHJvb3QuDQorICov DQorc3RhdGljIGlubGluZSBib29sIG1hc19zcGxpdF9maW5hbF9ub2RlKHN0cnVjdCBtYXBsZV9z dWJ0cmVlX3N0YXRlICptYXN0LA0KKwkJCQkJc3RydWN0IG1hX3N0YXRlICptYXMsIGludCBoZWln aHQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmFuY2VzdG9yOw0KKw0KKwlpZiAobXRlX2lz X3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJaWYgKG10X2lzX2FsbG9jKG1hcy0+dHJlZSkpDQorCQkJ bWFzdC0+Ym4tPnR5cGUgPSBtYXBsZV9hcmFuZ2VfNjQ7DQorCQllbHNlDQorCQkJbWFzdC0+Ym4t PnR5cGUgPSBtYXBsZV9yYW5nZV82NDsNCisJCW1hcy0+ZGVwdGggPSBoZWlnaHQ7DQorCX0NCisJ LyoNCisJICogT25seSBhIHNpbmdsZSBub2RlIGlzIHVzZWQgaGVyZSwgY291bGQgYmUgcm9vdC4N CisJICogVGhlIEJpZ19ub2RlIGRhdGEgc2hvdWxkIGp1c3QgZml0IGluIGEgc2luZ2xlIG5vZGUu DQorCSAqLw0KKwlhbmNlc3RvciA9IG1hc19uZXdfbWFfbm9kZShtYXMsIG1hc3QtPmJuKTsNCisJ bXRlX3NldF9wYXJlbnQobWFzdC0+bC0+bm9kZSwgYW5jZXN0b3IsIG1hc3QtPmwtPm9mZnNldCk7 DQorCW10ZV9zZXRfcGFyZW50KG1hc3QtPnItPm5vZGUsIGFuY2VzdG9yLCBtYXN0LT5yLT5vZmZz ZXQpOw0KKwltdGVfdG9fbm9kZShhbmNlc3RvciktPnBhcmVudCA9IG1hc19tbihtYXMpLT5wYXJl bnQ7DQorDQorCW1hc3QtPmwtPm5vZGUgPSBhbmNlc3RvcjsNCisJbWFiX21hc19jcChtYXN0LT5i biwgMCwgbXRfc2xvdHNbbWFzdC0+Ym4tPnR5cGVdIC0gMSwgbWFzdC0+bCwgdHJ1ZSk7DQorCW1h cy0+b2Zmc2V0ID0gbWFzdC0+Ym4tPmJfZW5kIC0gMTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0K Ky8qDQorICogbWFzdF9maWxsX2Jub2RlKCkgLSBDb3B5IGRhdGEgaW50byB0aGUgYmlnIG5vZGUg aW4gdGhlIHN1YnRyZWUgc3RhdGUNCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUN CisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAc2tpcDogVGhlIG51bWJlciBvZiBlbnRy aWVzIHRvIHNraXAgZm9yIG5ldyBub2RlcyBpbnNlcnRpb24uDQorICovDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc3RfZmlsbF9ibm9kZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwN CisJCQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJCSB1bnNpZ25lZCBjaGFyIHNraXAp DQorew0KKwlib29sIGNwID0gdHJ1ZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGQgPSBtYXMt Pm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgc3BsaXQ7DQorDQorCW1lbXNldChtYXN0LT5ibi0+Z2Fw LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBBUlJBWV9TSVpFKG1hc3QtPmJuLT5nYXApKTsN CisJbWVtc2V0KG1hc3QtPmJuLT5zbG90LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBBUlJB WV9TSVpFKG1hc3QtPmJuLT5zbG90KSk7DQorCW1lbXNldChtYXN0LT5ibi0+cGl2b3QsIDAsIHNp emVvZih1bnNpZ25lZCBsb25nKSAqIEFSUkFZX1NJWkUobWFzdC0+Ym4tPnBpdm90KSk7DQorCW1h c3QtPmJuLT5iX2VuZCA9IDA7DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQor CQljcCA9IGZhbHNlOw0KKwl9IGVsc2Ugew0KKwkJbWFzX2FzY2VuZChtYXMpOw0KKwkJbWF0X2Fk ZChtYXN0LT5mcmVlLCBvbGQpOw0KKwkJbWFzLT5vZmZzZXQgPSBtdGVfcGFyZW50X3Nsb3QobWFz LT5ub2RlKTsNCisJfQ0KKw0KKwlpZiAoY3AgJiYgbWFzdC0+bC0+b2Zmc2V0KQ0KKwkJbWFzX21h Yl9jcChtYXMsIDAsIG1hc3QtPmwtPm9mZnNldCAtIDEsIG1hc3QtPmJuLCAwKTsNCisNCisJc3Bs aXQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorCW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sIG1hc3QtPmws IG1hc3QtPmwtPm5vZGUpOw0KKwltYXN0LT5yLT5vZmZzZXQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQor CW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sIG1hc3QtPnIsIG1hc3QtPnItPm5vZGUpOw0KKwlpZiAo bWFzdC0+Ym4tPnBpdm90W21hc3QtPmJuLT5iX2VuZCAtIDFdID09IG1hcy0+bWF4KQ0KKwkJY3Ag PSBmYWxzZTsNCisNCisJaWYgKGNwKQ0KKwkJbWFzX21hYl9jcChtYXMsIHNwbGl0ICsgc2tpcCwg bXRfc2xvdF9jb3VudChtYXMtPm5vZGUpIC0gMSwNCisJCQkgICBtYXN0LT5ibiwgbWFzdC0+Ym4t PmJfZW5kKTsNCisNCisJbWFzdC0+Ym4tPmJfZW5kLS07DQorCW1hc3QtPmJuLT50eXBlID0gbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpOw0KK30NCisNCisvKg0KKyAqIG1hc3Rfc3BsaXRfZGF0YSgp IC0gU3BsaXQgdGhlIGRhdGEgaW4gdGhlIHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUgaW50byByZWd1 bGFyDQorICogbm9kZXMuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHNwbGl0OiBUaGUgbG9jYXRpb24gdG8gc3BsaXQg dGhlIGJpZyBub2RlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3Rfc3BsaXRfZGF0YShz dHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJICAgc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGNoYXIgc3BsaXQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdDsNCisN CisJbWFiX21hc19jcChtYXN0LT5ibiwgMCwgc3BsaXQsIG1hc3QtPmwsIHRydWUpOw0KKwltdGVf c2V0X3Bpdm90KG1hc3QtPnItPm5vZGUsIDAsIG1hc3QtPnItPm1heCk7DQorCW1hYl9tYXNfY3Ao bWFzdC0+Ym4sIHNwbGl0ICsgMSwgbWFzdC0+Ym4tPmJfZW5kLCBtYXN0LT5yLCBmYWxzZSk7DQor CW1hc3QtPmwtPm9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwltYXN0LT5s LT5tYXggPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRdOw0KKwltYXN0LT5yLT5taW4gPSBtYXN0LT5s LT5tYXggKyAxOw0KKwlpZiAobXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisN CisJcF9zbG90ID0gbWFzdC0+b3JpZ19sLT5vZmZzZXQ7DQorCW1hc19zZXRfc3BsaXRfcGFyZW50 KG1hc3QtPm9yaWdfbCwgbWFzdC0+bC0+bm9kZSwgbWFzdC0+ci0+bm9kZSwNCisJCQkgICAgICZw X3Nsb3QsIHNwbGl0KTsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQobWFzdC0+b3JpZ19yLCBtYXN0 LT5sLT5ub2RlLCBtYXN0LT5yLT5ub2RlLA0KKwkJCSAgICAgJnBfc2xvdCwgc3BsaXQpOw0KK30N CisNCisvKg0KKyAqIG1hc19wdXNoX2RhdGEoKSAtIEluc3RlYWQgb2Ygc3BsaXR0aW5nIGEgbm9k ZSwgaXQgaXMgYmVuZWZpY2lhbCB0byBwdXNoIHRoZQ0KKyAqIGRhdGEgdG8gdGhlIHJpZ2h0IG9y IGxlZnQgbm9kZSBpZiB0aGVyZSBpcyByb29tLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0K KyAqIEBoZWlnaHQ6IFRoZSBjdXJyZW50IGhlaWdodCBvZiB0aGUgbWFwbGUgc3RhdGUNCisgKiBA bWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbGVmdDogUHVzaCBsZWZ0IG9yIG5v dC4NCisgKg0KKyAqIEtlZXBpbmcgdGhlIGhlaWdodCBvZiB0aGUgdHJlZSBsb3cgbWVhbnMgZmFz dGVyIGxvb2t1cHMuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgcHVzaGVkLCBmYWxzZSBvdGhl cndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19wdXNoX2RhdGEoc3RydWN0IG1h X3N0YXRlICptYXMsIGludCBoZWlnaHQsDQorCQkJCSBzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0 ZSAqbWFzdCwgYm9vbCBsZWZ0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBzbG90X3RvdGFsID0gbWFz dC0+Ym4tPmJfZW5kOw0KKwl1bnNpZ25lZCBjaGFyIGVuZCwgc3BhY2UsIHNwbGl0Ow0KKw0KKwlN QV9TVEFURSh0bXBfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCXRt cF9tYXMgPSAqbWFzOw0KKwl0bXBfbWFzLmRlcHRoID0gbWFzdC0+bC0+ZGVwdGg7DQorDQorCWlm IChsZWZ0ICYmICFtYXNfcHJldl9zaWJsaW5nKCZ0bXBfbWFzKSkNCisJCXJldHVybiBmYWxzZTsN CisJZWxzZSBpZiAoIWxlZnQgJiYgIW1hc19uZXh0X3NpYmxpbmcoJnRtcF9tYXMpKQ0KKwkJcmV0 dXJuIGZhbHNlOw0KKw0KKwllbmQgPSBtYXNfZGF0YV9lbmQoJnRtcF9tYXMpOw0KKwlzbG90X3Rv dGFsICs9IGVuZDsNCisJc3BhY2UgPSAyICogbXRfc2xvdF9jb3VudChtYXMtPm5vZGUpIC0gMjsN CisJLyogLTIgaW5zdGVhZCBvZiAtMSB0byBlbnN1cmUgdGhlcmUgaXNuJ3QgYSB0cmlwbGUgc3Bs aXQgKi8NCisJaWYgKG1hX2lzX2xlYWYobWFzdC0+Ym4tPnR5cGUpKQ0KKwkJc3BhY2UtLTsNCisN CisJaWYgKG1hcy0+bWF4ID09IFVMT05HX01BWCkNCisJCXNwYWNlLS07DQorDQorCWlmIChzbG90 X3RvdGFsID49IHNwYWNlKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwkvKiBHZXQgdGhlIGRhdGE7 IEZpbGwgbWFzdC0+Ym4gKi8NCisJbWFzdC0+Ym4tPmJfZW5kKys7DQorCWlmIChsZWZ0KSB7DQor CQltYWJfc2hpZnRfcmlnaHQobWFzdC0+Ym4sIGVuZCArIDEpOw0KKwkJbWFzX21hYl9jcCgmdG1w X21hcywgMCwgZW5kLCBtYXN0LT5ibiwgMCk7DQorCQltYXN0LT5ibi0+Yl9lbmQgPSBzbG90X3Rv dGFsICsgMTsNCisJfSBlbHNlIHsNCisJCW1hc19tYWJfY3AoJnRtcF9tYXMsIDAsIGVuZCwgbWFz dC0+Ym4sIG1hc3QtPmJuLT5iX2VuZCk7DQorCX0NCisNCisJLyogQ29uZmlndXJlIG1hc3QgZm9y IHNwbGl0dGluZyBvZiBtYXN0LT5ibiAqLw0KKwlzcGxpdCA9IG10X3Nsb3RzW21hc3QtPmJuLT50 eXBlXSAtIDI7DQorCWlmIChsZWZ0KSB7DQorCQkvKiAgU3dpdGNoIG1hcyB0byBwcmV2IG5vZGUg ICovDQorCQltYXRfYWRkKG1hc3QtPmZyZWUsIG1hcy0+bm9kZSk7DQorCQkqbWFzID0gdG1wX21h czsNCisJCS8qIFN0YXJ0IHVzaW5nIG1hc3QtPmwgZm9yIHRoZSBsZWZ0IHNpZGUuICovDQorCQl0 bXBfbWFzLm5vZGUgPSBtYXN0LT5sLT5ub2RlOw0KKwkJKm1hc3QtPmwgPSB0bXBfbWFzOw0KKwl9 IGVsc2Ugew0KKwkJbWF0X2FkZChtYXN0LT5mcmVlLCB0bXBfbWFzLm5vZGUpOw0KKwkJdG1wX21h cy5ub2RlID0gbWFzdC0+ci0+bm9kZTsNCisJCSptYXN0LT5yID0gdG1wX21hczsNCisJCXNwbGl0 ID0gc2xvdF90b3RhbCAtIHNwbGl0Ow0KKwl9DQorCXNwbGl0ID0gbWFiX25vX251bGxfc3BsaXQo bWFzdC0+Ym4sIHNwbGl0LCBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0pOw0KKwkvKiBVcGRhdGUg cGFyZW50IHNsb3QgZm9yIHNwbGl0IGNhbGN1bGF0aW9uLiAqLw0KKwlpZiAobGVmdCkNCisJCW1h c3QtPm9yaWdfbC0+b2Zmc2V0ICs9IGVuZCArIDE7DQorDQorCW1hc3Rfc3BsaXRfZGF0YShtYXN0 LCBtYXMsIHNwbGl0KTsNCisJbWFzdF9maWxsX2Jub2RlKG1hc3QsIG1hcywgMik7DQorCW1hc19z cGxpdF9maW5hbF9ub2RlKG1hc3QsIG1hcywgaGVpZ2h0ICsgMSk7DQorCXJldHVybiB0cnVlOw0K K30NCisNCisvKg0KKyAqIG1hc19zcGxpdCgpIC0gU3BsaXQgZGF0YSB0aGF0IGlzIHRvbyBiaWcg Zm9yIG9uZSBub2RlIGludG8gdHdvLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBi X25vZGU6IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIFJldHVybjogMSBvbiBzdWNjZXNzLCAwIG9u IGZhaWx1cmUuDQorICovDQorc3RhdGljIGludCBtYXNfc3BsaXQoc3RydWN0IG1hX3N0YXRlICpt YXMsIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlKQ0KK3sNCisNCisJc3RydWN0IG1hcGxl X3N1YnRyZWVfc3RhdGUgbWFzdDsNCisJaW50IGhlaWdodCA9IDA7DQorCXVuc2lnbmVkIGNoYXIg bWlkX3NwbGl0LCBzcGxpdCA9IDA7DQorDQorCS8qDQorCSAqIFNwbGl0dGluZyBpcyBoYW5kbGVk IGRpZmZlcmVudGx5IGZyb20gYW55IG90aGVyIEItdHJlZTsgdGhlIE1hcGxlDQorCSAqIFRyZWUg c3BsaXRzIHVwd2FyZHMuICBTcGxpdHRpbmcgdXAgbWVhbnMgdGhhdCB0aGUgc3BsaXQgb3BlcmF0 aW9uDQorCSAqIG9jY3VycyB3aGVuIHRoZSB3YWxrIG9mIHRoZSB0cmVlIGhpdHMgdGhlIGxlYXZl cyBhbmQgbm90IG9uIHRoZSB3YXkNCisJICogZG93bi4gIFRoZSByZWFzb24gZm9yIHNwbGl0dGlu ZyB1cCBpcyB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8ga25vdw0KKwkgKiBob3cgbXVjaCBzcGFj ZSB3aWxsIGJlIG5lZWRlZCB1bnRpbCB0aGUgbGVhZiBpcyAob3IgbGVhdmVzIGFyZSkNCisJICog cmVhY2hlZC4gIFNpbmNlIG92ZXJ3cml0aW5nIGRhdGEgaXMgYWxsb3dlZCBhbmQgYSByYW5nZSBj b3VsZA0KKwkgKiBvdmVyd3JpdGUgbW9yZSB0aGFuIG9uZSByYW5nZSBvciByZXN1bHQgaW4gY2hh bmdpbmcgb25lIGVudHJ5IGludG8gMw0KKwkgKiBlbnRyaWVzLCBpdCBpcyBpbXBvc3NpYmxlIHRv IGtub3cgaWYgYSBzcGxpdCBpcyByZXF1aXJlZCB1bnRpbCB0aGUNCisJICogZGF0YSBpcyBleGFt aW5lZC4NCisJICoNCisJICogU3BsaXR0aW5nIGlzIGEgYmFsYW5jaW5nIGFjdCBiZXR3ZWVuIGtl ZXBpbmcgYWxsb2NhdGlvbnMgdG8gYSBtaW5pbXVtDQorCSAqIGFuZCBhdm9pZGluZyBhICdqaXR0 ZXInIGV2ZW50IHdoZXJlIGEgdHJlZSBpcyBleHBhbmRlZCB0byBtYWtlIHJvb20NCisJICogZm9y IGFuIGVudHJ5IGZvbGxvd2VkIGJ5IGEgY29udHJhY3Rpb24gd2hlbiB0aGUgZW50cnkgaXMgcmVt b3ZlZC4gIFRvDQorCSAqIGFjY29tcGxpc2ggdGhlIGJhbGFuY2UsIHRoZXJlIGFyZSBlbXB0eSBz bG90cyByZW1haW5pbmcgaW4gYm90aCBsZWZ0DQorCSAqIGFuZCByaWdodCBub2RlcyBhZnRlciBh IHNwbGl0Lg0KKwkgKi8NCisJTUFfU1RBVEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwg bWFzLT5sYXN0KTsNCisJTUFfU1RBVEUocl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFz LT5sYXN0KTsNCisJTUFfU1RBVEUocHJldl9sX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBt YXMtPmxhc3QpOw0KKwlNQV9TVEFURShwcmV2X3JfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgs IG1hcy0+bGFzdCk7DQorCU1BX1RPUElBUlkobWF0LCBtYXMtPnRyZWUpOw0KKw0KKwl0cmFjZV9t YV9vcChfX2Z1bmNfXywgbWFzKTsNCisJbWFzLT5kZXB0aCA9IG1hc19tdF9oZWlnaHQobWFzKTsN CisJLyogQWxsb2NhdGlvbiBmYWlsdXJlcyB3aWxsIGhhcHBlbiBlYXJseS4gKi8NCisJbWFzX25v ZGVfY291bnQobWFzLCAxICsgbWFzLT5kZXB0aCAqIDIpOw0KKwlpZiAobWFzX2lzX2VycihtYXMp KQ0KKwkJcmV0dXJuIDA7DQorDQorCW1hc3QubCA9ICZsX21hczsNCisJbWFzdC5yID0gJnJfbWFz Ow0KKwltYXN0Lm9yaWdfbCA9ICZwcmV2X2xfbWFzOw0KKwltYXN0Lm9yaWdfciA9ICZwcmV2X3Jf bWFzOw0KKwltYXN0LmZyZWUgPSAmbWF0Ow0KKwltYXN0LmJuID0gYl9ub2RlOw0KKw0KKwl3aGls ZSAoaGVpZ2h0KysgPD0gbWFzLT5kZXB0aCkgew0KKwkJaWYgKG10X3Nsb3RzW2Jfbm9kZS0+dHlw ZV0gPiBiX25vZGUtPmJfZW5kKSB7DQorCQkJbWFzX3NwbGl0X2ZpbmFsX25vZGUoJm1hc3QsIG1h cywgaGVpZ2h0KTsNCisJCQlicmVhazsNCisJCX0NCisNCisJCWxfbWFzID0gcl9tYXMgPSAqbWFz Ow0KKwkJbF9tYXMubm9kZSA9IG1hc19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCQlyX21h cy5ub2RlID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisJCS8qDQorCQkgKiBBbm90 aGVyIHdheSB0aGF0ICdqaXR0ZXInIGlzIGF2b2lkZWQgaXMgdG8gdGVybWluYXRlIGEgc3BsaXQg dXAgZWFybHkgaWYgdGhlDQorCQkgKiBsZWZ0IG9yIHJpZ2h0IG5vZGUgaGFzIHNwYWNlIHRvIHNw YXJlLiAgVGhpcyBpcyByZWZlcnJlZCB0byBhcyAicHVzaGluZyBsZWZ0Ig0KKwkJICogb3IgInB1 c2hpbmcgcmlnaHQiIGFuZCBpcyBzaW1pbGFyIHRvIHRoZSBCKiB0cmVlLCBleGNlcHQgdGhlIG5v ZGVzIGxlZnQgb3INCisJCSAqIHJpZ2h0IGNhbiByYXJlbHkgYmUgcmV1c2VkIGR1ZSB0byBSQ1Us IGJ1dCB0aGUgcmlwcGxlIHVwd2FyZHMgaXMgaGFsdGVkIHdoaWNoDQorCQkgKiBpcyBhIHNpZ25p ZmljYW50IHNhdmluZ3MuDQorCQkgKi8NCisJCS8qIFRyeSB0byBwdXNoIGxlZnQuICovDQorCQlp ZiAobWFzX3B1c2hfZGF0YShtYXMsIGhlaWdodCwgJm1hc3QsIHRydWUpKQ0KKwkJCWJyZWFrOw0K Kw0KKwkJLyogVHJ5IHRvIHB1c2ggcmlnaHQuICovDQorCQlpZiAobWFzX3B1c2hfZGF0YShtYXMs IGhlaWdodCwgJm1hc3QsIGZhbHNlKSkNCisJCQlicmVhazsNCisNCisJCXNwbGl0ID0gbWFiX2Nh bGNfc3BsaXQobWFzLCBiX25vZGUsICZtaWRfc3BsaXQsIHByZXZfbF9tYXMubWluKTsNCisJCW1h c3Rfc3BsaXRfZGF0YSgmbWFzdCwgbWFzLCBzcGxpdCk7DQorCQkvKg0KKwkJICogVXN1YWxseSBj b3JyZWN0LCBtYWJfbWFzX2NwIGluIHRoZSBhYm92ZSBjYWxsIG92ZXJ3cml0ZXMNCisJCSAqIHIt Pm1heC4NCisJCSAqLw0KKwkJbWFzdC5yLT5tYXggPSBtYXMtPm1heDsNCisJCW1hc3RfZmlsbF9i bm9kZSgmbWFzdCwgbWFzLCAxKTsNCisJCXByZXZfbF9tYXMgPSAqbWFzdC5sOw0KKwkJcHJldl9y X21hcyA9ICptYXN0LnI7DQorCX0NCisNCisJLyogU2V0IHRoZSBvcmlnaW5hbCBub2RlIGFzIGRl YWQgKi8NCisJbWF0X2FkZChtYXN0LmZyZWUsIG1hcy0+bm9kZSk7DQorCW1hcy0+bm9kZSA9IGxf bWFzLm5vZGU7DQorCW1hc193bWJfcmVwbGFjZShtYXMsIG1hc3QuZnJlZSwgTlVMTCk7DQorCW10 cmVlX3JhbmdlX3dhbGsobWFzKTsNCisJcmV0dXJuIDE7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jl dXNlX25vZGUoKSAtIFJldXNlIHRoZSBub2RlIHRvIHN0b3JlIHRoZSBkYXRhLg0KKyAqIEB3cl9t YXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqIEBibjogVGhlIG1hcGxlIGJpZyBub2RlDQor ICogQGVuZDogVGhlIGVuZCBvZiB0aGUgZGF0YS4NCisgKg0KKyAqIFdpbGwgYWx3YXlzIHJldHVy biBmYWxzZSBpbiBSQ1UgbW9kZS4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBub2RlIHdhcyBy ZXVzZWQsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3Jl dXNlX25vZGUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMsDQorCQkJICBzdHJ1Y3QgbWFwbGVf YmlnX25vZGUgKmJuLCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCS8qIE5lZWQgdG8gYmUgcmN1 IHNhZmUuICovDQorCWlmIChtdF9pbl9yY3Uod3JfbWFzLT5tYXMtPnRyZWUpKQ0KKwkJcmV0dXJu IGZhbHNlOw0KKw0KKwlpZiAoZW5kID4gYm4tPmJfZW5kKSB7DQorCQlpbnQgY2xlYXIgPSBtdF9z bG90c1t3cl9tYXMtPnR5cGVdIC0gYm4tPmJfZW5kOw0KKw0KKwkJbWVtc2V0KHdyX21hcy0+c2xv dHMgKyBibi0+Yl9lbmQsIDAsIHNpemVvZih2b2lkICopICogY2xlYXItLSk7DQorCQltZW1zZXQo d3JfbWFzLT5waXZvdHMgKyBibi0+Yl9lbmQsIDAsIHNpemVvZih2b2lkICopICogY2xlYXIpOw0K Kwl9DQorCW1hYl9tYXNfY3AoYm4sIDAsIGJuLT5iX2VuZCwgd3JfbWFzLT5tYXMsIGZhbHNlKTsN CisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX2NvbW1pdF9iX25vZGUoKSAtIENv bW1pdCB0aGUgYmlnIG5vZGUgaW50byB0aGUgdHJlZS4NCisgKiBAd3JfbWFzOiBUaGUgbWFwbGUg d3JpdGUgc3RhdGUNCisgKiBAYl9ub2RlOiBUaGUgbWFwbGUgYmlnIG5vZGUNCisgKiBAZW5kOiBU aGUgZW5kIG9mIHRoZSBkYXRhLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19jb21taXRf Yl9ub2RlKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzLA0KKwkJCSAgICBzdHJ1Y3QgbWFwbGVf YmlnX25vZGUgKmJfbm9kZSwgdW5zaWduZWQgY2hhciBlbmQpDQorew0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZTsNCisJdW5zaWduZWQgY2hhciBiX2VuZCA9IGJfbm9kZS0+Yl9lbmQ7DQorCWVu dW0gbWFwbGVfdHlwZSBiX3R5cGUgPSBiX25vZGUtPnR5cGU7DQorDQorCWlmICgoYl9lbmQgPCBt dF9taW5fc2xvdHNbYl90eXBlXSkgJiYNCisJICAgICghbXRlX2lzX3Jvb3Qod3JfbWFzLT5tYXMt Pm5vZGUpKSAmJg0KKwkgICAgKG1hc19tdF9oZWlnaHQod3JfbWFzLT5tYXMpID4gMSkpDQorCQly ZXR1cm4gbWFzX3JlYmFsYW5jZSh3cl9tYXMtPm1hcywgYl9ub2RlKTsNCisNCisJaWYgKGJfZW5k ID49IG10X3Nsb3RzW2JfdHlwZV0pDQorCQlyZXR1cm4gbWFzX3NwbGl0KHdyX21hcy0+bWFzLCBi X25vZGUpOw0KKw0KKwlpZiAobWFzX3JldXNlX25vZGUod3JfbWFzLCBiX25vZGUsIGVuZCkpDQor CQlnb3RvIHJldXNlX25vZGU7DQorDQorCW1hc19ub2RlX2NvdW50KHdyX21hcy0+bWFzLCAxKTsN CisJaWYgKG1hc19pc19lcnIod3JfbWFzLT5tYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW5vZGUg PSBtYXNfcG9wX25vZGUod3JfbWFzLT5tYXMpOw0KKwlub2RlLT5wYXJlbnQgPSBtYXNfbW4od3Jf bWFzLT5tYXMpLT5wYXJlbnQ7DQorCXdyX21hcy0+bWFzLT5ub2RlID0gbXRfbWtfbm9kZShub2Rl LCBiX3R5cGUpOw0KKwltYWJfbWFzX2NwKGJfbm9kZSwgMCwgYl9lbmQsIHdyX21hcy0+bWFzLCB0 cnVlKTsNCisNCisJbWFzX3JlcGxhY2Uod3JfbWFzLT5tYXMsIGZhbHNlKTsNCityZXVzZV9ub2Rl Og0KKwltYXNfdXBkYXRlX2dhcCh3cl9tYXMtPm1hcyk7DQorCXJldHVybiAxOw0KK30NCisNCisv Kg0KKyAqIG1hc19yb290X2V4cGFuZCgpIC0gRXhwYW5kIGEgcm9vdCB0byBhIG5vZGUNCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZSBpbnRv IHRoZSB0cmVlDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3Jvb3RfZXhwYW5kKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCXZvaWQgKmNvbnRlbnRzID0gbWFz X3Jvb3RfbG9ja2VkKG1hcyk7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbWFwbGVfbGVhZl82 NDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJ dW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwlpbnQgc2xvdCA9IDA7DQorDQorCW1hc19ub2RlX2Nv dW50KG1hcywgMSk7DQorCWlmICh1bmxpa2VseShtYXNfaXNfZXJyKG1hcykpKQ0KKwkJcmV0dXJu IDA7DQorDQorCW5vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJcGl2b3RzID0gbWFfcGl2b3Rz KG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwlub2RlLT5w YXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJICAgICAgKCh1bnNpZ25lZCBsb25nKW1hcy0+dHJl ZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCW1hcy0+bm9kZSA9IG10X21rX25vZGUobm9kZSwgdHlw ZSk7DQorDQorCWlmIChtYXMtPmluZGV4KSB7DQorCQlpZiAoY29udGVudHMpIHsNCisJCQlyY3Vf YXNzaWduX3BvaW50ZXIoc2xvdHNbc2xvdF0sIGNvbnRlbnRzKTsNCisJCQlpZiAobGlrZWx5KG1h cy0+aW5kZXggPiAxKSkNCisJCQkJc2xvdCsrOw0KKwkJfQ0KKwkJcGl2b3RzW3Nsb3QrK10gPSBt YXMtPmluZGV4IC0gMTsNCisJfQ0KKw0KKwlyY3VfYXNzaWduX3BvaW50ZXIoc2xvdHNbc2xvdF0s IGVudHJ5KTsNCisJbWFzLT5vZmZzZXQgPSBzbG90Ow0KKwlwaXZvdHNbc2xvdF0gPSBtYXMtPmxh c3Q7DQorCWlmIChtYXMtPmxhc3QgIT0gVUxPTkdfTUFYKQ0KKwkJc2xvdCsrOw0KKwltYXMtPmRl cHRoID0gMTsNCisJbWFzX3NldF9oZWlnaHQobWFzKTsNCisNCisJLyogc3dhcCB0aGUgbmV3IHJv b3QgaW50byB0aGUgdHJlZSAqLw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9y b290LCBtdGVfbWtfcm9vdChtYXMtPm5vZGUpKTsNCisJbWFfc2V0X21ldGEobm9kZSwgbWFwbGVf bGVhZl82NCwgMCwgc2xvdCk7DQorCXJldHVybiBzbG90Ow0KK30NCisNCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzX3N0b3JlX3Jvb3Qoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0K K3sNCisJaWYgKGxpa2VseSgobWFzLT5sYXN0ICE9IDApIHx8IChtYXMtPmluZGV4ICE9IDApKSkN CisJCW1hc19yb290X2V4cGFuZChtYXMsIGVudHJ5KTsNCisJZWxzZSBpZiAoKCh1bnNpZ25lZCBs b25nKSAoZW50cnkpICYgMykgPT0gMikNCisJCW1hc19yb290X2V4cGFuZChtYXMsIGVudHJ5KTsN CisJZWxzZSB7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290LCBlbnRy eSk7DQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNf aXNfc3Bhbl93cigpIC0gQ2hlY2sgaWYgdGhlIHdyaXRlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXMg YSB3cml0ZSB0aGF0DQorICogc3BhbnMgdGhlIG5vZGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0 YXRlDQorICogQHBpdjogVGhlIHBpdm90IHZhbHVlIGJlaW5nIHdyaXR0ZW4NCisgKiBAdHlwZTog VGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqIEBlbnRyeTogVGhlIGRhdGEgdG8gd3JpdGUNCisgKg0K KyAqIFNwYW5uaW5nIHdyaXRlcyBhcmUgd3JpdGVzIHRoYXQgc3RhcnQgaW4gb25lIG5vZGUgYW5k IGVuZCBpbiBhbm90aGVyIE9SIGlmDQorICogdGhlIHdyaXRlIG9mIGEgJU5VTEwgd2lsbCBjYXVz ZSB0aGUgbm9kZSB0byBlbmQgd2l0aCBhICVOVUxMLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlm IHRoaXMgaXMgYSBzcGFubmluZyB3cml0ZSwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRp YyBib29sIG1hc19pc19zcGFuX3dyKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJ dW5zaWduZWQgbG9uZyBtYXg7DQorCXVuc2lnbmVkIGxvbmcgbGFzdCA9IHdyX21hcy0+bWFzLT5s YXN0Ow0KKwl1bnNpZ25lZCBsb25nIHBpdiA9IHdyX21hcy0+cl9tYXg7DQorCWVudW0gbWFwbGVf dHlwZSB0eXBlID0gd3JfbWFzLT50eXBlOw0KKwl2b2lkICplbnRyeSA9IHdyX21hcy0+ZW50cnk7 DQorDQorCS8qIENvbnRhaW5lZCBpbiB0aGlzIHBpdm90ICovDQorCWlmIChwaXYgPiBsYXN0KQ0K KwkJcmV0dXJuIGZhbHNlOw0KKw0KKwltYXggPSB3cl9tYXMtPm1hcy0+bWF4Ow0KKwlpZiAodW5s aWtlbHkobWFfaXNfbGVhZih0eXBlKSkpIHsNCisJCS8qIEZpdHMgaW4gdGhlIG5vZGUsIGJ1dCBt YXkgc3BhbiBzbG90cy4gKi8NCisJCWlmIChsYXN0IDwgbWF4KQ0KKwkJCXJldHVybiBmYWxzZTsN CisNCisJCS8qIFdyaXRlcyB0byB0aGUgZW5kIG9mIHRoZSBub2RlIGJ1dCBub3QgbnVsbC4gKi8N CisJCWlmICgobGFzdCA9PSBtYXgpICYmIGVudHJ5KQ0KKwkJCXJldHVybiBmYWxzZTsNCisNCisJ CS8qDQorCQkgKiBXcml0aW5nIFVMT05HX01BWCBpcyBub3QgYSBzcGFubmluZyB3cml0ZSByZWdh cmRsZXNzIG9mIHRoZQ0KKwkJICogdmFsdWUgYmVpbmcgd3JpdHRlbiBhcyBsb25nIGFzIHRoZSBy YW5nZSBmaXRzIGluIHRoZSBub2RlLg0KKwkJICovDQorCQlpZiAoKGxhc3QgPT0gVUxPTkdfTUFY KSAmJiAobGFzdCA9PSBtYXgpKQ0KKwkJCXJldHVybiBmYWxzZTsNCisJfSBlbHNlIGlmIChwaXYg PT0gbGFzdCkgew0KKwkJaWYgKGVudHJ5KQ0KKwkJCXJldHVybiBmYWxzZTsNCisNCisJCS8qIERl dGVjdCBzcGFubmluZyBzdG9yZSB3ciB3YWxrICovDQorCQlpZiAobGFzdCA9PSBVTE9OR19NQVgp DQorCQkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCB3 cl9tYXMtPm1hcywgcGl2LCBlbnRyeSk7DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3dyX3dhbGtfZGVzY2VuZChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndy X21hcykNCit7DQorCXdyX21hcy0+bWFzLT5kZXB0aCsrOw0KKwl3cl9tYXMtPnR5cGUgPSBtdGVf bm9kZV90eXBlKHdyX21hcy0+bWFzLT5ub2RlKTsNCisJbWFzX3dyX25vZGVfd2Fsayh3cl9tYXMp Ow0KKwl3cl9tYXMtPnNsb3RzID0gbWFfc2xvdHMod3JfbWFzLT5ub2RlLCB3cl9tYXMtPnR5cGUp Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3dyX3dhbGtfdHJhdmVyc2Uoc3RydWN0 IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl3cl9tYXMtPm1hcy0+bWF4ID0gd3JfbWFzLT5y X21heDsNCisJd3JfbWFzLT5tYXMtPm1pbiA9IHdyX21hcy0+cl9taW47DQorCXdyX21hcy0+bWFz LT5ub2RlID0gd3JfbWFzLT5jb250ZW50Ow0KKwl3cl9tYXMtPm1hcy0+b2Zmc2V0ID0gMDsNCit9 DQorLyoNCisgKiBtYXNfd3Jfd2FsaygpIC0gV2FsayB0aGUgdHJlZSBmb3IgYSB3cml0ZS4NCisg KiBAd3JfbWFzOiBUaGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIFVzZXMgbWFzX3Nsb3Rf bG9ja2VkKCkgYW5kIGRvZXMgbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgZGVhZCBub2Rlcy4NCisg Kg0KKyAqIFJldHVybjogVHJ1ZSBpZiBpdCdzIGNvbnRhaW5lZCBpbiBhIG5vZGUsIGZhbHNlIG9u IHNwYW5uaW5nIHdyaXRlLg0KKyAqLw0KK3N0YXRpYyBib29sIG1hc193cl93YWxrKHN0cnVjdCBt YV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMt Pm1hczsNCisNCisJd2hpbGUgKHRydWUpIHsNCisJCW1hc193cl93YWxrX2Rlc2NlbmQod3JfbWFz KTsNCisJCWlmICh1bmxpa2VseShtYXNfaXNfc3Bhbl93cih3cl9tYXMpKSkNCisJCQlyZXR1cm4g ZmFsc2U7DQorDQorCQl3cl9tYXMtPmNvbnRlbnQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCB3cl9t YXMtPnNsb3RzLA0KKwkJCQkJCSAgbWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2lzX2xlYWYod3Jf bWFzLT50eXBlKSkNCisJCQlyZXR1cm4gdHJ1ZTsNCisNCisJCW1hc193cl93YWxrX3RyYXZlcnNl KHdyX21hcyk7DQorCX0NCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBib29sIG1h c193cl93YWxrX2luZGV4KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0 IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisNCisJd2hpbGUgKHRydWUpIHsNCisJCW1h c193cl93YWxrX2Rlc2NlbmQod3JfbWFzKTsNCisJCXdyX21hcy0+Y29udGVudCA9IG1hc19zbG90 X2xvY2tlZChtYXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJICBtYXMtPm9mZnNldCk7DQorCQlp ZiAobWFfaXNfbGVhZih3cl9tYXMtPnR5cGUpKQ0KKwkJCXJldHVybiB0cnVlOw0KKwkJbWFzX3dy X3dhbGtfdHJhdmVyc2Uod3JfbWFzKTsNCisNCisJfQ0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorLyoN CisgKiBtYXNfZXh0ZW5kX3NwYW5uaW5nX251bGwoKSAtIEV4dGVuZCBhIHN0b3JlIG9mIGEgJU5V TEwgdG8gaW5jbHVkZSBzdXJyb3VuZGluZyAlTlVMTHMuDQorICogQGxfd3JfbWFzOiBUaGUgbGVm dCBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqIEByX3dyX21hczogVGhlIHJpZ2h0IG1hcGxlIHdyaXRl IHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19leHRlbmRfc3Bhbm5pbmdfbnVs bChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKmxfd3JfbWFzLA0KKwkJCQkJICAgIHN0cnVjdCBtYV93cl9z dGF0ZSAqcl93cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKnJfbWFzID0gcl93cl9tYXMt Pm1hczsNCisJc3RydWN0IG1hX3N0YXRlICpsX21hcyA9IGxfd3JfbWFzLT5tYXM7DQorCXVuc2ln bmVkIGNoYXIgbF9zbG90Ow0KKw0KKwlsX3Nsb3QgPSBsX21hcy0+b2Zmc2V0Ow0KKwlpZiAoIWxf d3JfbWFzLT5jb250ZW50KQ0KKwkJbF9tYXMtPmluZGV4ID0gbF93cl9tYXMtPnJfbWluOw0KKw0K KwlpZiAoKGxfbWFzLT5pbmRleCA9PSBsX3dyX21hcy0+cl9taW4pICYmDQorCQkgKGxfc2xvdCAm Jg0KKwkJICAhbWFzX3Nsb3RfbG9ja2VkKGxfbWFzLCBsX3dyX21hcy0+c2xvdHMsIGxfc2xvdCAt IDEpKSkgew0KKwkJaWYgKGxfc2xvdCA+IDEpDQorCQkJbF9tYXMtPmluZGV4ID0gbF93cl9tYXMt PnBpdm90c1tsX3Nsb3QgLSAyXSArIDE7DQorCQllbHNlDQorCQkJbF9tYXMtPmluZGV4ID0gbF9t YXMtPm1pbjsNCisNCisJCWxfbWFzLT5vZmZzZXQgPSBsX3Nsb3QgLSAxOw0KKwl9DQorDQorCWlm ICghcl93cl9tYXMtPmNvbnRlbnQpIHsNCisJCWlmIChyX21hcy0+bGFzdCA8IHJfd3JfbWFzLT5y X21heCkNCisJCQlyX21hcy0+bGFzdCA9IHJfd3JfbWFzLT5yX21heDsNCisJCXJfbWFzLT5vZmZz ZXQrKzsNCisJfSBlbHNlIGlmICgocl9tYXMtPmxhc3QgPT0gcl93cl9tYXMtPnJfbWF4KSAmJg0K KwkgICAgKHJfbWFzLT5sYXN0IDwgcl9tYXMtPm1heCkgJiYNCisJICAgICFtYXNfc2xvdF9sb2Nr ZWQocl9tYXMsIHJfd3JfbWFzLT5zbG90cywgcl9tYXMtPm9mZnNldCArIDEpKSB7DQorCQlyX21h cy0+bGFzdCA9IG1hc19zYWZlX3Bpdm90KHJfbWFzLCByX3dyX21hcy0+cGl2b3RzLA0KKwkJCQkJ ICAgICByX3dyX21hcy0+dHlwZSwgcl9tYXMtPm9mZnNldCArIDEpOw0KKwkJcl9tYXMtPm9mZnNl dCsrOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3N0YXRlX3dhbGsoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl2b2lkICplbnRyeTsNCisNCisJZW50cnkgPSBtYXNf c3RhcnQobWFzKTsNCisJaWYgKG1hc19pc19ub25lKG1hcykpDQorCQlyZXR1cm4gTlVMTDsNCisN CisJaWYgKG1hc19pc19wdHIobWFzKSkNCisJCXJldHVybiBlbnRyeTsNCisNCisJcmV0dXJuIG10 cmVlX3JhbmdlX3dhbGsobWFzKTsNCit9DQorDQorLyoNCisgKiBtdHJlZV9sb29rdXBfd2Fsaygp IC0gSW50ZXJuYWwgcXVpY2sgbG9va3VwIHRoYXQgZG9lcyBub3Qga2VlcCBtYXBsZSBzdGF0ZSB1 cA0KKyAqIHRvIGRhdGUuDQorICoNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisg KiBOb3RlOiBMZWF2ZXMgbWFzIGluIHVuZGVzaXJhYmxlIHN0YXRlLg0KKyAqIFJldHVybjogVGhl IGVudHJ5IGZvciBAbWFzLT5pbmRleCBvciAlTlVMTCBvbiBkZWFkIG5vZGUuDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkICptdHJlZV9sb29rdXBfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykN Cit7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQor CXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQ7DQor CWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVk IGNoYXIgZW5kOw0KKwl1bnNpZ25lZCBsb25nIG1heDsNCisNCisJbmV4dCA9IG1hcy0+bm9kZTsN CisJbWF4ID0gVUxPTkdfTUFYOw0KKwlkbyB7DQorCQlvZmZzZXQgPSAwOw0KKwkJbm9kZSA9IG10 ZV90b19ub2RlKG5leHQpOw0KKwkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobmV4dCk7DQorCQlwaXZv dHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCQllbmQgPSBtYV9kYXRhX2VuZChub2RlLCB0 eXBlLCBwaXZvdHMsIG1heCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkN CisJCQlnb3RvIGRlYWRfbm9kZTsNCisNCisJCWlmIChwaXZvdHNbb2Zmc2V0XSA+PSBtYXMtPmlu ZGV4KQ0KKwkJCWdvdG8gbmV4dDsNCisNCisJCWRvIHsNCisJCQlvZmZzZXQrKzsNCisJCX0gd2hp bGUgKChvZmZzZXQgPCBlbmQpICYmIChwaXZvdHNbb2Zmc2V0XSA8IG1hcy0+aW5kZXgpKTsNCisN CisJCWlmIChsaWtlbHkob2Zmc2V0ID4gZW5kKSkNCisJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsN CisNCituZXh0Og0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJCW5leHQgPSBt dF9zbG90KG1hcy0+dHJlZSwgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVh ZF9ub2RlKG5vZGUpKSkNCisJCQlnb3RvIGRlYWRfbm9kZTsNCisJfSB3aGlsZSAoIW1hX2lzX2xl YWYodHlwZSkpOw0KKw0KKwlyZXR1cm4gKHZvaWQgKikgbmV4dDsNCisNCitkZWFkX25vZGU6DQor CW1hc19yZXNldChtYXMpOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNfbmV3 X3Jvb3QoKSAtIENyZWF0ZSBhIG5ldyByb290IG5vZGUgdGhhdCBvbmx5IGNvbnRhaW5zIHRoZSBl bnRyeSBwYXNzZWQNCisgKiBpbi4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50 cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisgKg0KKyAqIE9ubHkgdmFsaWQgd2hlbiB0aGUgaW5k ZXggPT0gMCBhbmQgdGhlIGxhc3QgPT0gVUxPTkdfTUFYDQorICoNCisgKiBSZXR1cm4gMCBvbiBl cnJvciwgMSBvbiBzdWNjZXNzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19uZXdfcm9v dChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKnJvb3QgPSBtYXNfcm9vdF9sb2NrZWQobWFzKTsNCisJZW51bSBtYXBsZV90eXBlIHR5 cGUgPSBtYXBsZV9sZWFmXzY0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9pZCBf X3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCWlmICghZW50cnkg JiYgIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkgew0KKwkJbWFzLT5kZXB0 aCA9IDA7DQorCQltYXNfc2V0X2hlaWdodChtYXMpOw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG1h cy0+dHJlZS0+bWFfcm9vdCwgZW50cnkpOw0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKwkJ Z290byBkb25lOw0KKwl9DQorDQorCW1hc19ub2RlX2NvdW50KG1hcywgMSk7DQorCWlmIChtYXNf aXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbm9kZSA9IG1hc19wb3Bfbm9kZShtYXMp Ow0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCXNsb3RzID0gbWFfc2xvdHMo bm9kZSwgdHlwZSk7DQorCW5vZGUtPnBhcmVudCA9IG1hX3BhcmVudF9wdHIoDQorCQkgICAgICAo KHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJbWFzLT5ub2Rl ID0gbXRfbWtfbm9kZShub2RlLCB0eXBlKTsNCisJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzWzBd LCBlbnRyeSk7DQorCXBpdm90c1swXSA9IG1hcy0+bGFzdDsNCisJbWFzLT5kZXB0aCA9IDE7DQor CW1hc19zZXRfaGVpZ2h0KG1hcyk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1h X3Jvb3QsIG10ZV9ta19yb290KG1hcy0+bm9kZSkpOw0KKw0KK2RvbmU6DQorCWlmICh4YV9pc19u b2RlKHJvb3QpKQ0KKwkJbXRlX2Rlc3Ryb3lfd2Fsayhyb290LCBtYXMtPnRyZWUpOw0KKw0KKwly ZXR1cm4gMTsNCit9DQorLyoNCisgKiBtYXNfd3Jfc3Bhbm5pbmdfc3RvcmUoKSAtIENyZWF0ZSBh IHN1YnRyZWUgd2l0aCB0aGUgc3RvcmUgb3BlcmF0aW9uIGNvbXBsZXRlZA0KKyAqIGFuZCBuZXcg bm9kZXMgd2hlcmUgbmVjZXNzYXJ5LCB0aGVuIHBsYWNlIHRoZSBzdWItdHJlZSBpbiB0aGUgYWN0 dWFsIHRyZWUuDQorICogTm90ZSB0aGF0IG1hcyBpcyBleHBlY3RlZCB0byBwb2ludCB0byB0aGUg bm9kZSB3aGljaCBjYXVzZWQgdGhlIHN0b3JlIHRvDQorICogc3Bhbi4NCisgKiBAd3JfbWFzOiBU aGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIFJldHVybjogMCBvbiBlcnJvciwgcG9zaXRp dmUgb24gc3VjY2Vzcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfd3Jfc3Bhbm5pbmdf c3RvcmUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfc3Vi dHJlZV9zdGF0ZSBtYXN0Ow0KKwlzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgYl9ub2RlOw0KKwlzdHJ1 Y3QgbWFfc3RhdGUgKm1hczsNCisJdW5zaWduZWQgY2hhciBoZWlnaHQ7DQorDQorCS8qIExlZnQg YW5kIFJpZ2h0IHNpZGUgb2Ygc3Bhbm5pbmcgc3RvcmUgKi8NCisJTUFfU1RBVEUobF9tYXMsIE5V TEwsIDAsIDApOw0KKwlNQV9TVEFURShyX21hcywgTlVMTCwgMCwgMCk7DQorDQorCU1BX1dSX1NU QVRFKHJfd3JfbWFzLCAmcl9tYXMsIHdyX21hcy0+ZW50cnkpOw0KKwlNQV9XUl9TVEFURShsX3dy X21hcywgJmxfbWFzLCB3cl9tYXMtPmVudHJ5KTsNCisNCisJLyoNCisJICogQSBzdG9yZSBvcGVy YXRpb24gdGhhdCBzcGFucyBtdWx0aXBsZSBub2RlcyBpcyBjYWxsZWQgYSBzcGFubmluZw0KKwkg KiBzdG9yZSBhbmQgaXMgaGFuZGxlZCBlYXJseSBpbiB0aGUgc3RvcmUgY2FsbCBzdGFjayBieSB0 aGUgZnVuY3Rpb24NCisJICogbWFzX2lzX3NwYW5fd3IoKS4gIFdoZW4gYSBzcGFubmluZyBzdG9y ZSBpcyBpZGVudGlmaWVkLCB0aGUgbWFwbGUNCisJICogc3RhdGUgaXMgZHVwbGljYXRlZC4gIFRo ZSBmaXJzdCBtYXBsZSBzdGF0ZSB3YWxrcyB0aGUgbGVmdCB0cmVlIHBhdGgNCisJICogdG8gYGBp bmRleGBgLCB0aGUgZHVwbGljYXRlIHdhbGtzIHRoZSByaWdodCB0cmVlIHBhdGggdG8gYGBsYXN0 YGAuDQorCSAqIFRoZSBkYXRhIGluIHRoZSB0d28gbm9kZXMgYXJlIGNvbWJpbmVkIGludG8gYSBz aW5nbGUgbm9kZSwgdHdvIG5vZGVzLA0KKwkgKiBvciBwb3NzaWJseSB0aHJlZSBub2RlcyAoc2Vl IHRoZSAzLXdheSBzcGxpdCBhYm92ZSkuICBBIGBgTlVMTGBgDQorCSAqIHdyaXR0ZW4gdG8gdGhl IGxhc3QgZW50cnkgb2YgYSBub2RlIGlzIGNvbnNpZGVyZWQgYSBzcGFubmluZyBzdG9yZSBhcw0K KwkgKiBhIHJlYmFsYW5jZSBpcyByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0 ZSBhbmQgYW4gb3ZlcmZsb3cNCisJICogb2YgZGF0YSBtYXkgaGFwcGVuLg0KKwkgKi8NCisJbWFz ID0gd3JfbWFzLT5tYXM7DQorCXRyYWNlX21hX29wKF9fZnVuY19fLCBtYXMpOw0KKw0KKwlpZiAo dW5saWtlbHkoIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkpDQorCQlyZXR1 cm4gbWFzX25ld19yb290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCS8qDQorCSAqIE5vZGUgcmVi YWxhbmNpbmcgbWF5IG9jY3VyIGR1ZSB0byB0aGlzIHN0b3JlLCBzbyB0aGVyZSBtYXkgYmUgdGhy ZWUgbmV3DQorCSAqIGVudHJpZXMgcGVyIGxldmVsIHBsdXMgYSBuZXcgcm9vdC4NCisJICovDQor CWhlaWdodCA9IG1hc19tdF9oZWlnaHQobWFzKTsNCisJbWFzX25vZGVfY291bnQobWFzLCAxICsg aGVpZ2h0ICogMyk7DQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJ LyoNCisJICogU2V0IHVwIHJpZ2h0IHNpZGUuICBOZWVkIHRvIGdldCB0byB0aGUgbmV4dCBvZmZz ZXQgYWZ0ZXIgdGhlIHNwYW5uaW5nDQorCSAqIHN0b3JlIHRvIGVuc3VyZSBpdCdzIG5vdCBOVUxM IGFuZCB0byBjb21iaW5lIGJvdGggdGhlIG5leHQgbm9kZSBhbmQNCisJICogdGhlIG5vZGUgd2l0 aCB0aGUgc3RhcnQgdG9nZXRoZXIuDQorCSAqLw0KKwlyX21hcyA9ICptYXM7DQorCS8qIEF2b2lk IG92ZXJmbG93LCB3YWxrIHRvIG5leHQgc2xvdCBpbiB0aGUgdHJlZS4gKi8NCisJaWYgKHJfbWFz Lmxhc3QgKyAxKQ0KKwkJcl9tYXMubGFzdCsrOw0KKw0KKwlyX21hcy5pbmRleCA9IHJfbWFzLmxh c3Q7DQorCW1hc193cl93YWxrX2luZGV4KCZyX3dyX21hcyk7DQorCXJfbWFzLmxhc3QgPSByX21h cy5pbmRleCA9IG1hcy0+bGFzdDsNCisNCisJLyogU2V0IHVwIGxlZnQgc2lkZS4gKi8NCisJbF9t YXMgPSAqbWFzOw0KKwltYXNfd3Jfd2Fsa19pbmRleCgmbF93cl9tYXMpOw0KKw0KKwlpZiAoIXdy X21hcy0+ZW50cnkpIHsNCisJCW1hc19leHRlbmRfc3Bhbm5pbmdfbnVsbCgmbF93cl9tYXMsICZy X3dyX21hcyk7DQorCQltYXMtPm9mZnNldCA9IGxfbWFzLm9mZnNldDsNCisJCW1hcy0+aW5kZXgg PSBsX21hcy5pbmRleDsNCisJCW1hcy0+bGFzdCA9IGxfbWFzLmxhc3QgPSByX21hcy5sYXN0Ow0K Kwl9DQorDQorCS8qIGV4cGFuZGluZyBOVUxMcyBtYXkgbWFrZSB0aGlzIGNvdmVyIHRoZSBlbnRp cmUgcmFuZ2UgKi8NCisJaWYgKCFsX21hcy5pbmRleCAmJiByX21hcy5sYXN0ID09IFVMT05HX01B WCkgew0KKwkJbWFzX3NldF9yYW5nZShtYXMsIDAsIFVMT05HX01BWCk7DQorCQlyZXR1cm4gbWFz X25ld19yb290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCX0NCisNCisJbWVtc2V0KCZiX25vZGUs IDAsIHNpemVvZihzdHJ1Y3QgbWFwbGVfYmlnX25vZGUpKTsNCisJLyogQ29weSBsX21hcyBhbmQg c3RvcmUgdGhlIHZhbHVlIGluIGJfbm9kZS4gKi8NCisJbWFzX3N0b3JlX2Jfbm9kZSgmbF93cl9t YXMsICZiX25vZGUsIGxfd3JfbWFzLm5vZGVfZW5kKTsNCisJLyogQ29weSByX21hcyBpbnRvIGJf bm9kZS4gKi8NCisJaWYgKHJfbWFzLm9mZnNldCA8PSByX3dyX21hcy5ub2RlX2VuZCkNCisJCW1h c19tYWJfY3AoJnJfbWFzLCByX21hcy5vZmZzZXQsIHJfd3JfbWFzLm5vZGVfZW5kLA0KKwkJCSAg ICZiX25vZGUsIGJfbm9kZS5iX2VuZCArIDEpOw0KKwllbHNlDQorCQliX25vZGUuYl9lbmQrKzsN CisNCisJLyogU3RvcCBzcGFubmluZyBzZWFyY2hlcyBieSBzZWFyY2hpbmcgZm9yIGp1c3QgaW5k ZXguICovDQorCWxfbWFzLmluZGV4ID0gbF9tYXMubGFzdCA9IG1hcy0+aW5kZXg7DQorDQorCW1h c3QuYm4gPSAmYl9ub2RlOw0KKwltYXN0Lm9yaWdfbCA9ICZsX21hczsNCisJbWFzdC5vcmlnX3Ig PSAmcl9tYXM7DQorCS8qIENvbWJpbmUgbF9tYXMgYW5kIHJfbWFzIGFuZCBzcGxpdCB0aGVtIHVw IGV2ZW5seSBhZ2Fpbi4gKi8NCisJcmV0dXJuIG1hc19zcGFubmluZ19yZWJhbGFuY2UobWFzLCAm bWFzdCwgaGVpZ2h0ICsgMSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3dyX25vZGVfc3RvcmUoKSAt IEF0dGVtcHQgdG8gc3RvcmUgdGhlIHZhbHVlIGluIGEgbm9kZQ0KKyAqIEB3cl9tYXM6IFRoZSBt YXBsZSB3cml0ZSBzdGF0ZQ0KKyAqDQorICogQXR0ZW1wdHMgdG8gcmV1c2UgdGhlIG5vZGUsIGJ1 dCBtYXkgYWxsb2NhdGUuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgc3RvcmVkLCBmYWxzZSBv dGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3dyX25vZGVfc3RvcmUoc3Ry dWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdy X21hcy0+bWFzOw0KKwl2b2lkIF9fcmN1ICoqZHN0X3Nsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpk c3RfcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIGRzdF9vZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIg bmV3X2VuZCA9IHdyX21hcy0+bm9kZV9lbmQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1 bnNpZ25lZCBjaGFyIG5vZGVfc2xvdHMgPSBtdF9zbG90c1t3cl9tYXMtPnR5cGVdOw0KKwlzdHJ1 Y3QgbWFwbGVfbm9kZSByZXVzZSwgKm5ld25vZGU7DQorCXVuc2lnbmVkIGNoYXIgY29weV9zaXpl LCBtYXhfcGl2ID0gbXRfcGl2b3RzW3dyX21hcy0+dHlwZV07DQorCWJvb2wgaW5fcmN1ID0gbXRf aW5fcmN1KG1hcy0+dHJlZSk7DQorDQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwlpZiAobWFz LT5sYXN0ID09IHdyX21hcy0+cl9tYXgpIHsNCisJCS8qIHJ1bnMgcmlnaHQgdG8gdGhlIGVuZCBv ZiB0aGUgbm9kZSAqLw0KKwkJaWYgKG1hcy0+bGFzdCA9PSBtYXMtPm1heCkNCisJCQluZXdfZW5k ID0gb2Zmc2V0Ow0KKwkJLyogZG9uJ3QgY29weSB0aGlzIG9mZnNldCAqLw0KKwkJd3JfbWFzLT5v ZmZzZXRfZW5kKys7DQorCX0gZWxzZSBpZiAobWFzLT5sYXN0IDwgd3JfbWFzLT5yX21heCkgew0K KwkJLyogbmV3IHJhbmdlIGVuZHMgaW4gdGhpcyByYW5nZSAqLw0KKwkJaWYgKHVubGlrZWx5KHdy X21hcy0+cl9tYXggPT0gVUxPTkdfTUFYKSkNCisJCQltYXNfYnVsa19yZWJhbGFuY2UobWFzLCB3 cl9tYXMtPm5vZGVfZW5kLCB3cl9tYXMtPnR5cGUpOw0KKw0KKwkJbmV3X2VuZCsrOw0KKwl9IGVs c2Ugew0KKwkJaWYgKHdyX21hcy0+ZW5kX3BpdiA9PSBtYXMtPmxhc3QpDQorCQkJd3JfbWFzLT5v ZmZzZXRfZW5kKys7DQorDQorCQluZXdfZW5kIC09IHdyX21hcy0+b2Zmc2V0X2VuZCAtIG9mZnNl dCAtIDE7DQorCX0NCisNCisJLyogbmV3IHJhbmdlIHN0YXJ0cyB3aXRoaW4gYSByYW5nZSAqLw0K KwlpZiAod3JfbWFzLT5yX21pbiA8IG1hcy0+aW5kZXgpDQorCQluZXdfZW5kKys7DQorDQorCS8q IE5vdCBlbm91Z2ggcm9vbSAqLw0KKwlpZiAobmV3X2VuZCA+PSBub2RlX3Nsb3RzKQ0KKwkJcmV0 dXJuIGZhbHNlOw0KKw0KKwkvKiBOb3QgZW5vdWdoIGRhdGEuICovDQorCWlmICghbXRlX2lzX3Jv b3QobWFzLT5ub2RlKSAmJiAobmV3X2VuZCA8PSBtdF9taW5fc2xvdHNbd3JfbWFzLT50eXBlXSkg JiYNCisJICAgICEobWFzLT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9CVUxLKSkNCisJCXJldHVybiBm YWxzZTsNCisNCisJLyogc2V0IHVwIG5vZGUuICovDQorCWlmIChpbl9yY3UpIHsNCisJCW1hc19u b2RlX2NvdW50KG1hcywgMSk7DQorCQlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJCXJldHVybiBm YWxzZTsNCisNCisJCW5ld25vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJfSBlbHNlIHsNCisJ CW1lbXNldCgmcmV1c2UsIDAsIHNpemVvZihzdHJ1Y3QgbWFwbGVfbm9kZSkpOw0KKwkJbmV3bm9k ZSA9ICZyZXVzZTsNCisJfQ0KKw0KKwluZXdub2RlLT5wYXJlbnQgPSBtYXNfbW4obWFzKS0+cGFy ZW50Ow0KKwlkc3RfcGl2b3RzID0gbWFfcGl2b3RzKG5ld25vZGUsIHdyX21hcy0+dHlwZSk7DQor CWRzdF9zbG90cyA9IG1hX3Nsb3RzKG5ld25vZGUsIHdyX21hcy0+dHlwZSk7DQorCS8qIENvcHkg ZnJvbSBzdGFydCB0byBpbnNlcnQgcG9pbnQgKi8NCisJbWVtY3B5KGRzdF9waXZvdHMsIHdyX21h cy0+cGl2b3RzLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiAob2Zmc2V0ICsgMSkpOw0KKwltZW1j cHkoZHN0X3Nsb3RzLCB3cl9tYXMtPnNsb3RzLCBzaXplb2Yodm9pZCAqKSAqIChvZmZzZXQgKyAx KSk7DQorCWRzdF9vZmZzZXQgPSBvZmZzZXQ7DQorDQorCS8qIEhhbmRsZSBpbnNlcnQgb2YgbmV3 IHJhbmdlIHN0YXJ0aW5nIGFmdGVyIG9sZCByYW5nZSAqLw0KKwlpZiAod3JfbWFzLT5yX21pbiA8 IG1hcy0+aW5kZXgpIHsNCisJCW1hcy0+b2Zmc2V0Kys7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIo ZHN0X3Nsb3RzW2RzdF9vZmZzZXRdLCB3cl9tYXMtPmNvbnRlbnQpOw0KKwkJZHN0X3Bpdm90c1tk c3Rfb2Zmc2V0KytdID0gbWFzLT5pbmRleCAtIDE7DQorCX0NCisNCisJLyogU3RvcmUgdGhlIG5l dyBlbnRyeSBhbmQgcmFuZ2UgZW5kLiAqLw0KKwlpZiAoZHN0X29mZnNldCA8IG1heF9waXYpDQor CQlkc3RfcGl2b3RzW2RzdF9vZmZzZXRdID0gbWFzLT5sYXN0Ow0KKwltYXMtPm9mZnNldCA9IGRz dF9vZmZzZXQ7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihkc3Rfc2xvdHNbZHN0X29mZnNldF0sIHdy X21hcy0+ZW50cnkpOw0KKw0KKwkvKg0KKwkgKiB0aGlzIHJhbmdlIHdyb3RlIHRvIHRoZSBlbmQg b2YgdGhlIG5vZGUgb3IgaXQgb3Zlcndyb3RlIHRoZSByZXN0IG9mDQorCSAqIHRoZSBkYXRhDQor CSAqLw0KKwlpZiAod3JfbWFzLT5vZmZzZXRfZW5kID4gd3JfbWFzLT5ub2RlX2VuZCB8fCBtYXMt Pmxhc3QgPj0gbWFzLT5tYXgpIHsNCisJCW5ld19lbmQgPSBkc3Rfb2Zmc2V0Ow0KKwkJZ290byBk b25lOw0KKwl9DQorDQorCWRzdF9vZmZzZXQrKzsNCisJLyogQ29weSB0byB0aGUgZW5kIG9mIG5v ZGUgaWYgbmVjZXNzYXJ5LiAqLw0KKwljb3B5X3NpemUgPSB3cl9tYXMtPm5vZGVfZW5kIC0gd3Jf bWFzLT5vZmZzZXRfZW5kICsgMTsNCisJbWVtY3B5KGRzdF9zbG90cyArIGRzdF9vZmZzZXQsIHdy X21hcy0+c2xvdHMgKyB3cl9tYXMtPm9mZnNldF9lbmQsDQorCSAgICAgICBzaXplb2Yodm9pZCAq KSAqIGNvcHlfc2l6ZSk7DQorCWlmIChkc3Rfb2Zmc2V0IDwgbWF4X3Bpdikgew0KKwkJaWYgKGNv cHlfc2l6ZSA+IG1heF9waXYgLSBkc3Rfb2Zmc2V0KQ0KKwkJCWNvcHlfc2l6ZSA9IG1heF9waXYg LSBkc3Rfb2Zmc2V0Ow0KKw0KKwkJbWVtY3B5KGRzdF9waXZvdHMgKyBkc3Rfb2Zmc2V0LA0KKwkJ ICAgICAgIHdyX21hcy0+cGl2b3RzICsgd3JfbWFzLT5vZmZzZXRfZW5kLA0KKwkJICAgICAgIHNp emVvZih1bnNpZ25lZCBsb25nKSAqIGNvcHlfc2l6ZSk7DQorCX0NCisNCisJaWYgKCh3cl9tYXMt Pm5vZGVfZW5kID09IG5vZGVfc2xvdHMgLSAxKSAmJiAobmV3X2VuZCA8IG5vZGVfc2xvdHMgLSAx KSkNCisJCWRzdF9waXZvdHNbbmV3X2VuZF0gPSBtYXMtPm1heDsNCisNCitkb25lOg0KKwltYXNf bGVhZl9zZXRfbWV0YShtYXMsIG5ld25vZGUsIGRzdF9waXZvdHMsIG1hcGxlX2xlYWZfNjQsIG5l d19lbmQpOw0KKwlpZiAoaW5fcmN1KSB7DQorCQltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5ld25v ZGUsIHdyX21hcy0+dHlwZSk7DQorCQltYXNfcmVwbGFjZShtYXMsIGZhbHNlKTsNCisJfSBlbHNl IHsNCisJCW1lbWNweSh3cl9tYXMtPm5vZGUsIG5ld25vZGUsIHNpemVvZihzdHJ1Y3QgbWFwbGVf bm9kZSkpOw0KKwl9DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCBtYXMsIDAsIHdyX21hcy0+ ZW50cnkpOw0KKwltYXNfdXBkYXRlX2dhcChtYXMpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQor LyoNCisgKiBtYXNfd3Jfc2xvdF9zdG9yZTogQXR0ZW1wdCB0byBzdG9yZSBhIHZhbHVlIGluIGEg c2xvdC4NCisgKiBAd3JfbWFzOiB0aGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIFJldHVy bjogVHJ1ZSBpZiBzdG9yZWQsIGZhbHNlIG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg Ym9vbCBtYXNfd3Jfc2xvdF9zdG9yZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQor CXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorCXVuc2lnbmVkIGxvbmcgbG1h eDsgLyogTG9naWNhbCBtYXguICovDQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0ID0gbWFzLT5vZmZz ZXQ7DQorDQorCWlmICgod3JfbWFzLT5yX21heCA+IG1hcy0+bGFzdCkgJiYgKCh3cl9tYXMtPnJf bWluICE9IG1hcy0+aW5kZXgpIHx8DQorCQkJCSAgKG9mZnNldCAhPSB3cl9tYXMtPm5vZGVfZW5k KSkpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmIChvZmZzZXQgPT0gd3JfbWFzLT5ub2RlX2Vu ZCAtIDEpDQorCQlsbWF4ID0gbWFzLT5tYXg7DQorCWVsc2UNCisJCWxtYXggPSB3cl9tYXMtPnBp dm90c1tvZmZzZXQgKyAxXTsNCisNCisJLyogZ29pbmcgdG8gb3ZlcndyaXRlIHRvbyBtYW55IHNs b3RzLiAqLw0KKwlpZiAobG1heCA8IG1hcy0+bGFzdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJ aWYgKHdyX21hcy0+cl9taW4gPT0gbWFzLT5pbmRleCkgew0KKwkJLyogb3ZlcndyaXRpbmcgdHdv IG9yIG1vcmUgcmFuZ2VzIHdpdGggb25lLiAqLw0KKwkJaWYgKGxtYXggPT0gbWFzLT5sYXN0KQ0K KwkJCXJldHVybiBmYWxzZTsNCisNCisJCS8qIE92ZXJ3cml0aW5nIGFsbCBvZiBvZmZzZXQgYW5k IGEgcG9ydGlvbiBvZiBvZmZzZXQgKyAxLiAqLw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHdyX21h cy0+c2xvdHNbb2Zmc2V0XSwgd3JfbWFzLT5lbnRyeSk7DQorCQl3cl9tYXMtPnBpdm90c1tvZmZz ZXRdID0gbWFzLT5sYXN0Ow0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCS8qIERvZXNuJ3QgZW5k IG9uIHRoZSBuZXh0IHJhbmdlIGVuZC4gKi8NCisJaWYgKGxtYXggIT0gbWFzLT5sYXN0KQ0KKwkJ cmV0dXJuIGZhbHNlOw0KKw0KKwkvKiBPdmVyd3JpdGluZyBhIHBvcnRpb24gb2Ygb2Zmc2V0IGFu ZCBhbGwgb2Ygb2Zmc2V0ICsgMSAqLw0KKwlpZiAoKG9mZnNldCArIDEgPCBtdF9waXZvdHNbd3Jf bWFzLT50eXBlXSkgJiYNCisJICAgICh3cl9tYXMtPmVudHJ5IHx8IHdyX21hcy0+cGl2b3RzW29m ZnNldCArIDFdKSkNCisJCXdyX21hcy0+cGl2b3RzW29mZnNldCArIDFdID0gbWFzLT5sYXN0Ow0K Kw0KKwlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1tvZmZzZXQgKyAxXSwgd3JfbWFz LT5lbnRyeSk7DQorCXdyX21hcy0+cGl2b3RzW29mZnNldF0gPSBtYXMtPmluZGV4IC0gMTsNCisJ bWFzLT5vZmZzZXQrKzsgLyogS2VlcCBtYXMgYWNjdXJhdGUuICovDQorDQorZG9uZToNCisJdHJh Y2VfbWFfd3JpdGUoX19mdW5jX18sIG1hcywgMCwgd3JfbWFzLT5lbnRyeSk7DQorCW1hc191cGRh dGVfZ2FwKG1hcyk7DQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQg bWFzX3dyX2VuZF9waXYoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl3aGlsZSAo KHdyX21hcy0+bWFzLT5sYXN0ID4gd3JfbWFzLT5lbmRfcGl2KSAmJg0KKwkgICAgICAgKHdyX21h cy0+b2Zmc2V0X2VuZCA8IHdyX21hcy0+bm9kZV9lbmQpKQ0KKwkJd3JfbWFzLT5lbmRfcGl2ID0g d3JfbWFzLT5waXZvdHNbKyt3cl9tYXMtPm9mZnNldF9lbmRdOw0KKw0KKwlpZiAod3JfbWFzLT5t YXMtPmxhc3QgPiB3cl9tYXMtPmVuZF9waXYpDQorCQl3cl9tYXMtPmVuZF9waXYgPSB3cl9tYXMt Pm1hcy0+bWF4Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3dyX2V4dGVuZF9udWxs KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMg PSB3cl9tYXMtPm1hczsNCisNCisJaWYgKG1hcy0+bGFzdCA8IHdyX21hcy0+ZW5kX3BpdiAmJiAh d3JfbWFzLT5zbG90c1t3cl9tYXMtPm9mZnNldF9lbmRdKQ0KKwkJbWFzLT5sYXN0ID0gd3JfbWFz LT5lbmRfcGl2Ow0KKw0KKwkvKiBDaGVjayBuZXh0IHNsb3QocykgaWYgd2UgYXJlIG92ZXJ3cml0 aW5nIHRoZSBlbmQgKi8NCisJaWYgKChtYXMtPmxhc3QgPT0gd3JfbWFzLT5lbmRfcGl2KSAmJg0K KwkgICAgKHdyX21hcy0+bm9kZV9lbmQgIT0gd3JfbWFzLT5vZmZzZXRfZW5kKSAmJg0KKwkgICAg IXdyX21hcy0+c2xvdHNbd3JfbWFzLT5vZmZzZXRfZW5kICsgMV0pIHsNCisJCXdyX21hcy0+b2Zm c2V0X2VuZCsrOw0KKwkJaWYgKHdyX21hcy0+b2Zmc2V0X2VuZCA9PSB3cl9tYXMtPm5vZGVfZW5k KQ0KKwkJCW1hcy0+bGFzdCA9IG1hcy0+bWF4Ow0KKwkJZWxzZQ0KKwkJCW1hcy0+bGFzdCA9IHdy X21hcy0+cGl2b3RzW3dyX21hcy0+b2Zmc2V0X2VuZF07DQorCQl3cl9tYXMtPmVuZF9waXYgPSBt YXMtPmxhc3Q7DQorCX0NCisNCisJaWYgKCF3cl9tYXMtPmNvbnRlbnQpIHsNCisJCS8qIElmIHRo aXMgb25lIGlzIG51bGwsIHRoZSBuZXh0IGFuZCBwcmV2IGFyZSBub3QgKi8NCisJCW1hcy0+aW5k ZXggPSB3cl9tYXMtPnJfbWluOw0KKwl9IGVsc2Ugew0KKwkJLyogQ2hlY2sgcHJldiBzbG90IGlm IHdlIGFyZSBvdmVyd3JpdGluZyB0aGUgc3RhcnQgKi8NCisJCWlmIChtYXMtPmluZGV4ID09IHdy X21hcy0+cl9taW4gJiYgbWFzLT5vZmZzZXQgJiYNCisJCSAgICAhd3JfbWFzLT5zbG90c1ttYXMt Pm9mZnNldCAtIDFdKSB7DQorCQkJbWFzLT5vZmZzZXQtLTsNCisJCQl3cl9tYXMtPnJfbWluID0g bWFzLT5pbmRleCA9DQorCQkJCW1hc19zYWZlX21pbihtYXMsIHdyX21hcy0+cGl2b3RzLCBtYXMt Pm9mZnNldCk7DQorCQkJd3JfbWFzLT5yX21heCA9IHdyX21hcy0+cGl2b3RzW21hcy0+b2Zmc2V0 XTsNCisJCX0NCisJfQ0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3dyX2FwcGVuZChz dHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgZW5kID0gd3Jf bWFzLT5ub2RlX2VuZDsNCisJdW5zaWduZWQgY2hhciBuZXdfZW5kID0gZW5kICsgMTsNCisJc3Ry dWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisJdW5zaWduZWQgY2hhciBub2RlX3Bp dm90cyA9IG10X3Bpdm90c1t3cl9tYXMtPnR5cGVdOw0KKw0KKwlpZiAoKG1hcy0+aW5kZXggIT0g d3JfbWFzLT5yX21pbikgJiYgKG1hcy0+bGFzdCA9PSB3cl9tYXMtPnJfbWF4KSkgew0KKwkJaWYg KG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQl3cl9tYXMtPnBpdm90c1tuZXdfZW5kXSA9IHdy X21hcy0+cGl2b3RzW2VuZF07DQorDQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2b3RzKQ0KKwkJ CW1hX3NldF9tZXRhKHdyX21hcy0+bm9kZSwgbWFwbGVfbGVhZl82NCwgMCwgbmV3X2VuZCk7DQor DQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1tuZXdfZW5kXSwgd3JfbWFzLT5l bnRyeSk7DQorCQltYXMtPm9mZnNldCA9IG5ld19lbmQ7DQorCQl3cl9tYXMtPnBpdm90c1tlbmRd ID0gbWFzLT5pbmRleCAtIDE7DQorDQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlpZiAoKG1h cy0+aW5kZXggPT0gd3JfbWFzLT5yX21pbikgJiYgKG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgp KSB7DQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2b3RzKQ0KKwkJCXdyX21hcy0+cGl2b3RzW25l d19lbmRdID0gd3JfbWFzLT5waXZvdHNbZW5kXTsNCisNCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3 cl9tYXMtPnNsb3RzW25ld19lbmRdLCB3cl9tYXMtPmNvbnRlbnQpOw0KKwkJaWYgKG5ld19lbmQg PCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRfbWV0YSh3cl9tYXMtPm5vZGUsIG1hcGxlX2xlYWZf NjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJd3JfbWFzLT5waXZvdHNbZW5kXSA9IG1hcy0+bGFzdDsN CisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW2VuZF0sIHdyX21hcy0+ZW50cnkp Ow0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKg0K KyAqIG1hc193cl9ibm9kZSgpIC0gU2xvdyBwYXRoIGZvciBhIG1vZGlmaWNhdGlvbi4NCisgKiBA d3JfbWFzOiBUaGUgd3JpdGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFRoaXMgaXMgd2hlcmUgc3Bs aXQsIHJlYmFsYW5jZSBlbmQgdXAuDQorICovDQorc3RhdGljIHZvaWQgbWFzX3dyX2Jub2RlKHN0 cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlIGJf bm9kZTsNCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIHdyX21hcy0+bWFzLCAwLCB3cl9t YXMtPmVudHJ5KTsNCisJbWVtc2V0KCZiX25vZGUsIDAsIHNpemVvZihzdHJ1Y3QgbWFwbGVfYmln X25vZGUpKTsNCisJbWFzX3N0b3JlX2Jfbm9kZSh3cl9tYXMsICZiX25vZGUsIHdyX21hcy0+b2Zm c2V0X2VuZCk7DQorCW1hc19jb21taXRfYl9ub2RlKHdyX21hcywgJmJfbm9kZSwgd3JfbWFzLT5u b2RlX2VuZCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3JfbW9kaWZ5KHN0cnVj dCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJdW5zaWduZWQgY2hhciBub2RlX3Nsb3RzOw0K Kwl1bnNpZ25lZCBjaGFyIG5vZGVfc2l6ZTsNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9t YXMtPm1hczsNCisNCisJLyogRGlyZWN0IHJlcGxhY2VtZW50ICovDQorCWlmICh3cl9tYXMtPnJf bWluID09IG1hcy0+aW5kZXggJiYgd3JfbWFzLT5yX21heCA9PSBtYXMtPmxhc3QpIHsNCisJCXJj dV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW21hcy0+b2Zmc2V0XSwgd3JfbWFzLT5lbnRy eSk7DQorCQlpZiAoISF3cl9tYXMtPmVudHJ5IF4gISF3cl9tYXMtPmNvbnRlbnQpDQorCQkJbWFz X3VwZGF0ZV9nYXAobWFzKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwkvKiBBdHRlbXB0IHRvIGFw cGVuZCAqLw0KKwlub2RlX3Nsb3RzID0gbXRfc2xvdHNbd3JfbWFzLT50eXBlXTsNCisJbm9kZV9z aXplID0gd3JfbWFzLT5ub2RlX2VuZCAtIHdyX21hcy0+b2Zmc2V0X2VuZCArIG1hcy0+b2Zmc2V0 ICsgMjsNCisJaWYgKG1hcy0+bWF4ID09IFVMT05HX01BWCkNCisJCW5vZGVfc2l6ZSsrOw0KKw0K KwkvKiBzbG90IGFuZCBub2RlIHN0b3JlIHdpbGwgbm90IGZpdCwgZ28gdG8gdGhlIHNsb3cgcGF0 aCAqLw0KKwlpZiAodW5saWtlbHkobm9kZV9zaXplID49IG5vZGVfc2xvdHMpKQ0KKwkJZ290byBz bG93X3BhdGg7DQorDQorCWlmICh3cl9tYXMtPmVudHJ5ICYmICh3cl9tYXMtPm5vZGVfZW5kIDwg bm9kZV9zbG90cyAtIDEpICYmDQorCSAgICAobWFzLT5vZmZzZXQgPT0gd3JfbWFzLT5ub2RlX2Vu ZCkgJiYgbWFzX3dyX2FwcGVuZCh3cl9tYXMpKSB7DQorCQlpZiAoIXdyX21hcy0+Y29udGVudCB8 fCAhd3JfbWFzLT5lbnRyeSkNCisJCQltYXNfdXBkYXRlX2dhcChtYXMpOw0KKwkJcmV0dXJuOw0K Kwl9DQorDQorCWlmICgod3JfbWFzLT5vZmZzZXRfZW5kIC0gbWFzLT5vZmZzZXQgPD0gMSkgJiYg bWFzX3dyX3Nsb3Rfc3RvcmUod3JfbWFzKSkNCisJCXJldHVybjsNCisJZWxzZSBpZiAobWFzX3dy X25vZGVfc3RvcmUod3JfbWFzKSkNCisJCXJldHVybjsNCisNCisJaWYgKG1hc19pc19lcnIobWFz KSkNCisJCXJldHVybjsNCisNCitzbG93X3BhdGg6DQorCW1hc193cl9ibm9kZSh3cl9tYXMpOw0K K30NCisNCisvKg0KKyAqIG1hc193cl9zdG9yZV9lbnRyeSgpIC0gSW50ZXJuYWwgY2FsbCB0byBz dG9yZSBhIHZhbHVlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUg ZW50cnkgdG8gc3RvcmUuDQorICoNCisgKiBSZXR1cm46IFRoZSBjb250ZW50cyB0aGF0IHdhcyBz dG9yZWQgYXQgdGhlIGluZGV4Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3dyX3N0 b3JlX2VudHJ5KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0 YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisNCisJd3JfbWFzLT5jb250ZW50ID0gbWFzX3N0YXJ0 KG1hcyk7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJ bWFzX3N0b3JlX3Jvb3QobWFzLCB3cl9tYXMtPmVudHJ5KTsNCisJCXJldHVybiB3cl9tYXMtPmNv bnRlbnQ7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KCFtYXNfd3Jfd2Fsayh3cl9tYXMpKSkgew0K KwkJbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHdyX21hcyk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250 ZW50Ow0KKwl9DQorDQorCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSBhdCB0aGUgbGVhZiBub2Rl IHRoYXQgbmVlZHMgdG8gYmUgYWx0ZXJlZC4gKi8NCisJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFz LT5yX21heDsNCisJbWFzX3dyX2VuZF9waXYod3JfbWFzKTsNCisNCisJaWYgKCF3cl9tYXMtPmVu dHJ5KQ0KKwkJbWFzX3dyX2V4dGVuZF9udWxsKHdyX21hcyk7DQorDQorCS8qIE5ldyByb290IGZv ciBhIHNpbmdsZSBwb2ludGVyICovDQorCWlmICh1bmxpa2VseSghbWFzLT5pbmRleCAmJiBtYXMt Pmxhc3QgPT0gVUxPTkdfTUFYKSkgew0KKwkJbWFzX25ld19yb290KG1hcywgd3JfbWFzLT5lbnRy eSk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9DQorDQorCW1hc193cl9tb2RpZnko d3JfbWFzKTsNCisJcmV0dXJuIHdyX21hcy0+Y29udGVudDsNCit9DQorDQorLyoqDQorICogbWFz X2luc2VydCgpIC0gSW50ZXJuYWwgY2FsbCB0byBpbnNlcnQgYSB2YWx1ZQ0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICoNCisgKiBS ZXR1cm46ICVOVUxMIG9yIHRoZSBjb250ZW50cyB0aGF0IGFscmVhZHkgZXhpc3RzIGF0IHRoZSBy ZXF1ZXN0ZWQgaW5kZXgNCisgKiBvdGhlcndpc2UuICBUaGUgbWFwbGUgc3RhdGUgbmVlZHMgdG8g YmUgY2hlY2tlZCBmb3IgZXJyb3IgY29uZGl0aW9ucy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgKm1hc19pbnNlcnQoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJ TUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVudHJ5KTsNCisNCisJLyoNCisJICogSW5zZXJ0aW5n IGEgbmV3IHJhbmdlIGluc2VydHMgZWl0aGVyIDAsIDEsIG9yIDIgcGl2b3RzIHdpdGhpbiB0aGUN CisJICogdHJlZS4gIElmIHRoZSBpbnNlcnQgZml0cyBleGFjdGx5IGludG8gYW4gZXhpc3Rpbmcg Z2FwIHdpdGggYSB2YWx1ZQ0KKwkgKiBvZiBOVUxMLCB0aGVuIHRoZSBzbG90IG9ubHkgbmVlZHMg dG8gYmUgd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUuDQorCSAqIElmIHRoZSByYW5nZSBiZWlu ZyBpbnNlcnRlZCBpcyBhZGphY2VudCB0byBhbm90aGVyIHJhbmdlLCB0aGVuIG9ubHkgYQ0KKwkg KiBzaW5nbGUgcGl2b3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgKGFzIHdlbGwgYXMgd3JpdGluZyB0 aGUgZW50cnkpLiAgSWYNCisJICogdGhlIG5ldyByYW5nZSBpcyB3aXRoaW4gYSBnYXAgYnV0IGRv ZXMgbm90IHRvdWNoIGFueSBvdGhlciByYW5nZXMsDQorCSAqIHRoZW4gdHdvIHBpdm90cyBuZWVk IHRvIGJlIGluc2VydGVkOiB0aGUgc3RhcnQgLSAxLCBhbmQgdGhlIGVuZC4gIEFzDQorCSAqIHVz dWFsLCB0aGUgZW50cnkgbXVzdCBiZSB3cml0dGVuLiAgTW9zdCBvcGVyYXRpb25zIHJlcXVpcmUg YSBuZXcgbm9kZQ0KKwkgKiB0byBiZSBhbGxvY2F0ZWQgYW5kIHJlcGxhY2UgYW4gZXhpc3Rpbmcg bm9kZSB0byBlbnN1cmUgUkNVIHNhZmV0eSwNCisJICogd2hlbiBpbiBSQ1UgbW9kZS4gIFRoZSBl eGNlcHRpb24gdG8gcmVxdWlyaW5nIGEgbmV3bHkgYWxsb2NhdGVkIG5vZGUNCisJICogaXMgd2hl biBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiBhIG5vZGUgKGFwcGVuZGluZykuICBXaGVuIGRvbmUN CisJICogY2FyZWZ1bGx5LCBhcHBlbmRpbmcgY2FuIHJldXNlIHRoZSBub2RlIGluIHBsYWNlLg0K KwkgKi8NCisJd3JfbWFzLmNvbnRlbnQgPSBtYXNfc3RhcnQobWFzKTsNCisJaWYgKHdyX21hcy5j b250ZW50KQ0KKwkJZ290byBleGlzdHM7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1h c19pc19wdHIobWFzKSkgew0KKwkJbWFzX3N0b3JlX3Jvb3QobWFzLCBlbnRyeSk7DQorCQlyZXR1 cm4gTlVMTDsNCisJfQ0KKw0KKwkvKiBzcGFubmluZyB3cml0ZXMgYWx3YXlzIG92ZXJ3cml0ZSBz b21ldGhpbmcgKi8NCisJaWYgKCFtYXNfd3Jfd2Fsaygmd3JfbWFzKSkNCisJCWdvdG8gZXhpc3Rz Ow0KKw0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgYXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5l ZWRzIHRvIGJlIGFsdGVyZWQuICovDQorCXdyX21hcy5vZmZzZXRfZW5kID0gbWFzLT5vZmZzZXQ7 DQorCXdyX21hcy5lbmRfcGl2ID0gd3JfbWFzLnJfbWF4Ow0KKw0KKwlpZiAod3JfbWFzLmNvbnRl bnQgfHwgKG1hcy0+bGFzdCA+IHdyX21hcy5yX21heCkpDQorCQlnb3RvIGV4aXN0czsNCisNCisJ aWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwltYXNfd3JfbW9kaWZ5KCZ3cl9tYXMp Ow0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7DQorDQorZXhpc3RzOg0KKwltYXNfc2V0X2Vyciht YXMsIC1FRVhJU1QpOw0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7DQorDQorfQ0KKw0KKy8qDQor ICogbWFzX3ByZXZfbm9kZSgpIC0gRmluZCB0aGUgcHJldiBub24tbnVsbCBlbnRyeSBhdCB0aGUg c2FtZSBsZXZlbCBpbiB0aGUNCisgKiB0cmVlLiAgVGhlIHByZXYgdmFsdWUgd2lsbCBiZSBtYXMt Pm5vZGVbbWFzLT5vZmZzZXRdIG9yIE1BU19OT05FLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0 ZQ0KKyAqIEBtaW46IFRoZSBsb3dlciBsaW1pdCB0byBzZWFyY2gNCisgKg0KKyAqIFRoZSBwcmV2 IG5vZGUgdmFsdWUgd2lsbCBiZSBtYXMtPm5vZGVbbWFzLT5vZmZzZXRdIG9yIE1BU19OT05FLg0K KyAqIFJldHVybjogMSBpZiB0aGUgbm9kZSBpcyBkZWFkLCAwIG90aGVyd2lzZS4NCisgKi8NCitz dGF0aWMgaW5saW5lIGludCBtYXNfcHJldl9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNp Z25lZCBsb25nIG1pbikNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJaW50IG9mZnNldCwg bGV2ZWw7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7 DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsN CisNCisJaWYgKG1hc19pc19ub25lKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbGV2ZWwgPSAw Ow0KKwlkbyB7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQlpZiAobWFfaXNfcm9vdChub2Rl KSkNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKw0KKwkJLyogV2FsayB1cC4gKi8NCisJCWlmICh1bmxp a2VseShtYXNfYXNjZW5kKG1hcykpKQ0KKwkJCXJldHVybiAxOw0KKwkJb2Zmc2V0ID0gbWFzLT5v ZmZzZXQ7DQorCQlsZXZlbCsrOw0KKwl9IHdoaWxlICghb2Zmc2V0KTsNCisNCisJb2Zmc2V0LS07 DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7 DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9k ZSwgbXQpOw0KKwltYXMtPm1heCA9IHBpdm90c1tvZmZzZXRdOw0KKwlpZiAob2Zmc2V0KQ0KKwkJ bWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KKwlpZiAodW5saWtlbHkobWFfZGVh ZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwlpZiAobWFzLT5tYXggPCBtaW4pDQor CQlnb3RvIG5vX2VudHJ5X21pbjsNCisNCisJd2hpbGUgKGxldmVsID4gMSkgew0KKwkJbGV2ZWwt LTsNCisJCWVub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCWlmICh1bmxp a2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJbWFzLT5ub2Rl ID0gZW5vZGU7DQorCQltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCW5vZGUgPSBt YXNfbW4obWFzKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwkJcGl2b3RzID0g bWFfcGl2b3RzKG5vZGUsIG10KTsNCisJCW9mZnNldCA9IG1hX2RhdGFfZW5kKG5vZGUsIG10LCBw aXZvdHMsIG1hcy0+bWF4KTsNCisJCWlmIChvZmZzZXQpDQorCQkJbWFzLT5taW4gPSBwaXZvdHNb b2Zmc2V0IC0gMV0gKyAxOw0KKw0KKwkJaWYgKG9mZnNldCA8IG10X3Bpdm90c1ttdF0pDQorCQkJ bWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisNCisJCWlmIChtYXMtPm1heCA8IG1pbikNCisJ CQlnb3RvIG5vX2VudHJ5Ow0KKwl9DQorDQorCW1hcy0+bm9kZSA9IG1hc19zbG90KG1hcywgc2xv dHMsIG9mZnNldCk7DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJcmV0 dXJuIDE7DQorDQorCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hcyk7DQorCWlmICh1bmxp a2VseShtdGVfZGVhZF9ub2RlKG1hcy0+bm9kZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQorCXJldHVy biAwOw0KKw0KK25vX2VudHJ5X21pbjoNCisJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCWlmIChv ZmZzZXQpDQorCQltYXMtPm1pbiA9IHBpdm90c1tvZmZzZXQgLSAxXSArIDE7DQorbm9fZW50cnk6 DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQor CW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNf bmV4dF9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9kZSBhdCB0aGUgc2FtZSBsZXZlbCBpbiB0aGUg dHJlZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBw aXZvdCB2YWx1ZSB0byBjaGVjay4NCisgKg0KKyAqIFRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgbWFz LT5ub2RlW21hcy0+b2Zmc2V0XSBvciBNQVNfTk9ORS4NCisgKiBSZXR1cm46IDEgb24gZGVhZCBu b2RlLCAwIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfbmV4dF9ub2Rl KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJdW5z aWduZWQgbG9uZyBtYXgpDQorew0KKwl1bnNpZ25lZCBsb25nIG1pbiwgcGl2b3Q7DQorCXVuc2ln bmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZTsNCisJaW50IGxl dmVsID0gMDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsN CisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0KKwlpZiAobWFzLT5tYXggPj0gbWF4KQ0KKwkJZ290 byBub19lbnRyeTsNCisNCisJbGV2ZWwgPSAwOw0KKwlkbyB7DQorCQlpZiAobWFfaXNfcm9vdChu b2RlKSkNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKw0KKwkJbWluID0gbWFzLT5tYXggKyAxOw0KKwkJ aWYgKG1pbiA+IG1heCkNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKw0KKwkJaWYgKHVubGlrZWx5KG1h c19hc2NlbmQobWFzKSkpDQorCQkJcmV0dXJuIDE7DQorDQorCQlvZmZzZXQgPSBtYXMtPm9mZnNl dDsNCisJCWxldmVsKys7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQltdCA9IG10ZV9ub2Rl X3R5cGUobWFzLT5ub2RlKTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCX0g d2hpbGUgKHVubGlrZWx5KG9mZnNldCA9PSBtYV9kYXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBt YXMtPm1heCkpKTsNCisNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCXBpdm90ID0g bWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsICsrb2Zmc2V0LCBtdCk7DQorCXdoaWxlICh1bmxp a2VseShsZXZlbCA+IDEpKSB7DQorCQkvKiBEZXNjZW5kLCBpZiBuZWNlc3NhcnkgKi8NCisJCWVu b2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9k ZWFkX25vZGUobm9kZSkpKQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJbWFzLT5ub2RlID0gZW5vZGU7 DQorCQlsZXZlbC0tOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90 eXBlKG1hcy0+bm9kZSk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJCXBpdm90 cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCQlvZmZzZXQgPSAwOw0KKwkJcGl2b3QgPSBwaXZv dHNbMF07DQorCX0NCisNCisJZW5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0K KwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwlt YXMtPm5vZGUgPSBlbm9kZTsNCisJbWFzLT5taW4gPSBtaW47DQorCW1hcy0+bWF4ID0gcGl2b3Q7 DQorCXJldHVybiAwOw0KKw0KK25vX2VudHJ5Og0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2Rl KG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJcmV0 dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX25leHRfbmVudHJ5KCkgLSBHZXQgdGhlIG5leHQg bm9kZSBlbnRyeQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXg6IFRoZSBtYXhp bXVtIHZhbHVlIHRvIGNoZWNrDQorICogQCpyYW5nZV9zdGFydDogUG9pbnRlciB0byBzdG9yZSB0 aGUgc3RhcnQgb2YgdGhlIHJhbmdlLg0KKyAqDQorICogU2V0cyBAbWFzLT5vZmZzZXQgdG8gdGhl IG9mZnNldCBvZiB0aGUgbmV4dCBub2RlIGVudHJ5LCBAbWFzLT5sYXN0IHRvIHRoZQ0KKyAqIHBp dm90IG9mIHRoZSBlbnRyeS4NCisgKg0KKyAqIFJldHVybjogVGhlIG5leHQgZW50cnksICVOVUxM IG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX25leHRfbmVudHJ5KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkgICAgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsIHVuc2ln bmVkIGxvbmcgbWF4LCBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXVuc2lnbmVkIGNoYXIg Y291bnQ7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3Q7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsN CisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl2b2lkICplbnRyeTsNCisNCisJaWYgKG1hcy0+bGFz dCA9PSBtYXMtPm1heCkgew0KKwkJbWFzLT5pbmRleCA9IG1hcy0+bWF4Ow0KKwkJcmV0dXJuIE5V TEw7DQorCX0NCisNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9 IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwltYXMtPmluZGV4ID0gbWFzX3NhZmVfbWluKG1hcywg cGl2b3RzLCBtYXMtPm9mZnNldCk7DQorCWlmIChtYV9kZWFkX25vZGUobm9kZSkpDQorCQlyZXR1 cm4gTlVMTDsNCisNCisJaWYgKG1hcy0+aW5kZXggPiBtYXgpDQorCQlyZXR1cm4gTlVMTDsNCisN CisJY291bnQgPSBtYV9kYXRhX2VuZChub2RlLCB0eXBlLCBwaXZvdHMsIG1hcy0+bWF4KTsNCisJ aWYgKG1hcy0+b2Zmc2V0ID4gY291bnQpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJd2hpbGUgKG1h cy0+b2Zmc2V0IDwgY291bnQpIHsNCisJCXBpdm90ID0gcGl2b3RzW21hcy0+b2Zmc2V0XTsNCisJ CWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgbWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2Rl YWRfbm9kZShub2RlKSkNCisJCQlyZXR1cm4gTlVMTDsNCisNCisJCWlmIChlbnRyeSkNCisJCQln b3RvIGZvdW5kOw0KKw0KKwkJaWYgKHBpdm90ID49IG1heCkNCisJCQlyZXR1cm4gTlVMTDsNCisN CisJCW1hcy0+aW5kZXggPSBwaXZvdCArIDE7DQorCQltYXMtPm9mZnNldCsrOw0KKwl9DQorDQor CWlmIChtYXMtPmluZGV4ID4gbWFzLT5tYXgpIHsNCisJCW1hcy0+aW5kZXggPSBtYXMtPmxhc3Q7 DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlwaXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywg cGl2b3RzLCBtYXMtPm9mZnNldCwgdHlwZSk7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90 cywgbWFzLT5vZmZzZXQpOw0KKwlpZiAobWFfZGVhZF9ub2RlKG5vZGUpKQ0KKwkJcmV0dXJuIE5V TEw7DQorDQorCWlmICghcGl2b3QpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKCFlbnRyeSkN CisJCXJldHVybiBOVUxMOw0KKw0KK2ZvdW5kOg0KKwltYXMtPmxhc3QgPSBwaXZvdDsNCisJcmV0 dXJuIGVudHJ5Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3Jld2FsayhzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBpbmRleCkNCit7DQorDQorcmV0cnk6DQorCW1h c19zZXQobWFzLCBpbmRleCk7DQorCW1hc19zdGF0ZV93YWxrKG1hcyk7DQorCWlmIChtYXNfaXNf c3RhcnQobWFzKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCXJldHVybjsNCisNCit9DQorDQorLyoN CisgKiBtYXNfbmV4dF9lbnRyeSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0 IGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBsaW1pdDogVGhlIG1heGlt dW0gcmFuZ2Ugc3RhcnQuDQorICoNCisgKiBTZXQgdGhlIEBtYXMtPm5vZGUgdG8gdGhlIG5leHQg ZW50cnkgYW5kIHRoZSByYW5nZV9zdGFydCB0bw0KKyAqIHRoZSBiZWdpbm5pbmcgdmFsdWUgZm9y IHRoZSBlbnRyeS4gIERvZXMgbm90IGNoZWNrIGJleW9uZCBAbGltaXQuDQorICogU2V0cyBAbWFz LT5pbmRleCBhbmQgQG1hcy0+bGFzdCB0byB0aGUgbGltaXQgaWYgaXQgaXMgaGl0Lg0KKyAqIFJl c3RhcnRzIG9uIGRlYWQgbm9kZXMuDQorICoNCisgKiBSZXR1cm46IHRoZSBuZXh0IGVudHJ5IG9y ICVOVUxMLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX25leHRfZW50cnkoc3RydWN0 IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbGltaXQpDQorew0KKwl2b2lkICplbnRyeSA9 IE5VTEw7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcHJldl9ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZTsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgbGFz dDsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKw0KKwlsYXN0ID0gbWFzLT5sYXN0Ow0KK3JldHJ5 Og0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJcHJldl9ub2RlID0gbWFzLT5ub2RlOw0KKwlu b2RlID0gbWFzX21uKG1hcyk7DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlt YXMtPm9mZnNldCsrOw0KKwlpZiAodW5saWtlbHkobWFzLT5vZmZzZXQgPj0gbXRfc2xvdHNbbXRd KSkgew0KKwkJbWFzLT5vZmZzZXQgPSBtdF9zbG90c1ttdF0gLSAxOw0KKwkJZ290byBuZXh0X25v ZGU7DQorCX0NCisNCisJd2hpbGUgKCFtYXNfaXNfbm9uZShtYXMpKSB7DQorCQllbnRyeSA9IG1h c19uZXh0X25lbnRyeShtYXMsIG5vZGUsIGxpbWl0LCBtdCk7DQorCQlpZiAodW5saWtlbHkobWFf ZGVhZF9ub2RlKG5vZGUpKSkgew0KKwkJCW1hc19yZXdhbGsobWFzLCBsYXN0KTsNCisJCQlnb3Rv IHJldHJ5Ow0KKwkJfQ0KKw0KKwkJaWYgKGxpa2VseShlbnRyeSkpDQorCQkJcmV0dXJuIGVudHJ5 Ow0KKw0KKwkJaWYgKHVubGlrZWx5KChtYXMtPmluZGV4ID4gbGltaXQpKSkNCisJCQlicmVhazsN CisNCituZXh0X25vZGU6DQorCQlwcmV2X25vZGUgPSBtYXMtPm5vZGU7DQorCQlvZmZzZXQgPSBt YXMtPm9mZnNldDsNCisJCWlmICh1bmxpa2VseShtYXNfbmV4dF9ub2RlKG1hcywgbm9kZSwgbGlt aXQpKSkgew0KKwkJCW1hc19yZXdhbGsobWFzLCBsYXN0KTsNCisJCQlnb3RvIHJldHJ5Ow0KKwkJ fQ0KKwkJbWFzLT5vZmZzZXQgPSAwOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBt dGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCX0NCisNCisJbWFzLT5pbmRleCA9IG1hcy0+bGFz dCA9IGxpbWl0Ow0KKwltYXMtPm9mZnNldCA9IG9mZnNldDsNCisJbWFzLT5ub2RlID0gcHJldl9u b2RlOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNfcHJldl9uZW50cnkoKSAt IEdldCB0aGUgcHJldmlvdXMgbm9kZSBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUu DQorICogQGxpbWl0OiBUaGUgbG93ZXIgbGltaXQgdG8gY2hlY2sgZm9yIGEgdmFsdWUuDQorICoN CisgKiBSZXR1cm46IHRoZSBlbnRyeSwgJU5VTEwgb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCAqbWFzX3ByZXZfbmVudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25l ZCBsb25nIGxpbWl0LA0KKwkJCQkgICAgdW5zaWduZWQgbG9uZyBpbmRleCkNCit7DQorCXVuc2ln bmVkIGxvbmcgcGl2b3QsIG1pbjsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXN0cnVjdCBt YXBsZV9ub2RlICptbjsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAqZW50cnk7DQorDQorcmV0cnk6 DQorCWlmICghbWFzLT5vZmZzZXQpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJbW4gPSBtYXNfbW4o bWFzKTsNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW9mZnNldCA9IG1hcy0+ b2Zmc2V0IC0gMTsNCisJaWYgKG9mZnNldCA+PSBtdF9zbG90c1ttdF0pDQorCQlvZmZzZXQgPSBt dF9zbG90c1ttdF0gLSAxOw0KKw0KKwlzbG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCXBpdm90 cyA9IG1hX3Bpdm90cyhtbiwgbXQpOw0KKwlpZiAob2Zmc2V0ID09IG10X3Bpdm90c1ttdF0pDQor CQlwaXZvdCA9IG1hcy0+bWF4Ow0KKwllbHNlDQorCQlwaXZvdCA9IHBpdm90c1tvZmZzZXRdOw0K Kw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpIHsNCisJCW1hc19yZXdhbGsobWFz LCBpbmRleCk7DQorCQlnb3RvIHJldHJ5Ow0KKwl9DQorDQorCXdoaWxlIChvZmZzZXQgJiYgKCgh bWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KSAmJiBwaXZvdCA+PSBsaW1pdCkgfHwNCisJICAg ICAgICFwaXZvdCkpDQorCQlwaXZvdCA9IHBpdm90c1stLW9mZnNldF07DQorDQorCW1pbiA9IG1h c19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZW50cnkgPSBtYXNfc2xvdChtYXMs IHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpIHsNCisJ CW1hc19yZXdhbGsobWFzLCBpbmRleCk7DQorCQlnb3RvIHJldHJ5Ow0KKwl9DQorDQorCWlmIChs aWtlbHkoZW50cnkpKSB7DQorCQltYXMtPm9mZnNldCA9IG9mZnNldDsNCisJCW1hcy0+bGFzdCA9 IHBpdm90Ow0KKwkJbWFzLT5pbmRleCA9IG1pbjsNCisJfQ0KKwlyZXR1cm4gZW50cnk7DQorfQ0K Kw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3ByZXZfZW50cnkoc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorDQorcmV0cnk6DQor CXdoaWxlIChsaWtlbHkoIW1hc19pc19ub25lKG1hcykpKSB7DQorCQllbnRyeSA9IG1hc19wcmV2 X25lbnRyeShtYXMsIG1pbiwgbWFzLT5pbmRleCk7DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0 IDwgbWluKSkNCisJCQlnb3RvIG5vdF9mb3VuZDsNCisNCisJCWlmIChsaWtlbHkoZW50cnkpKQ0K KwkJCXJldHVybiBlbnRyeTsNCisNCisJCWlmICh1bmxpa2VseShtYXNfcHJldl9ub2RlKG1hcywg bWluKSkpIHsNCisJCQltYXNfcmV3YWxrKG1hcywgbWFzLT5pbmRleCk7DQorCQkJZ290byByZXRy eTsNCisJCX0NCisNCisJCW1hcy0+b2Zmc2V0Kys7DQorCX0NCisNCisJbWFzLT5vZmZzZXQtLTsN Citub3RfZm91bmQ6DQorCW1hcy0+aW5kZXggPSBtYXMtPmxhc3QgPSBtaW47DQorCXJldHVybiBO VUxMOw0KK30NCisNCisvKg0KKyAqIG1hc19yZXZfYXdhbGsoKSAtIEludGVybmFsIGZ1bmN0aW9u LiAgUmV2ZXJzZSBhbGxvY2F0aW9uIHdhbGsuICBGaW5kIHRoZQ0KKyAqIGhpZ2hlc3QgZ2FwIGFk ZHJlc3Mgb2YgYSBnaXZlbiBzaXplIGluIGEgZ2l2ZW4gbm9kZSBhbmQgZGVzY2VuZC4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2l6ZTogVGhlIG5lZWRlZCBzaXplLg0KKyAqDQor ICogUmV0dXJuOiBUcnVlIGlmIGZvdW5kIGluIGEgbGVhZiwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAq DQorICovDQorc3RhdGljIGJvb2wgbWFzX3Jldl9hd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9k ZV90eXBlKG1hcy0+bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbWFzX21uKG1h cyk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cywgKmdhcHM7DQorCXZvaWQgX19yY3UgKipzbG90 czsNCisJdW5zaWduZWQgbG9uZyBnYXAgPSAwOw0KKwl1bnNpZ25lZCBsb25nIG1heCwgbWluLCBp bmRleDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNf ZXJyKG1hcykpKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCWlmIChtYV9pc19kZW5zZSh0eXBlKSkg ew0KKwkJLyogZGVuc2Ugbm9kZXMuICovDQorCQltYXMtPm9mZnNldCA9ICh1bnNpZ25lZCBjaGFy KShtYXMtPmluZGV4IC0gbWFzLT5taW4pOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJcGl2 b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5 cGUpOw0KKwlnYXBzID0gbWFfZ2Fwcyhub2RlLCB0eXBlKTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZz ZXQ7DQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJLyogU2tp cCBvdXQgb2YgYm91bmRzLiAqLw0KKwl3aGlsZSAobWFzLT5sYXN0IDwgbWluKQ0KKwkJbWluID0g bWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCAtLW9mZnNldCk7DQorDQorCW1heCA9IG1hc19zYWZl X3Bpdm90KG1hcywgcGl2b3RzLCBvZmZzZXQsIHR5cGUpOw0KKwlpbmRleCA9IG1hcy0+aW5kZXg7 DQorCXdoaWxlIChpbmRleCA8PSBtYXgpIHsNCisJCWdhcCA9IDA7DQorCQlpZiAoZ2FwcykNCisJ CQlnYXAgPSBnYXBzW29mZnNldF07DQorCQllbHNlIGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywg b2Zmc2V0KSkNCisJCQlnYXAgPSBtYXggLSBtaW4gKyAxOw0KKw0KKwkJaWYgKGdhcCkgew0KKwkJ CWlmICgoc2l6ZSA8PSBnYXApICYmIChzaXplIDw9IG1hcy0+bGFzdCAtIG1pbiArIDEpKQ0KKwkJ CQlicmVhazsNCisNCisJCQlpZiAoIWdhcHMpIHsNCisJCQkJLyogU2tpcCB0aGUgbmV4dCBzbG90 LCBpdCBjYW5ub3QgYmUgYSBnYXAuICovDQorCQkJCWlmIChvZmZzZXQgPCAyKQ0KKwkJCQkJZ290 byBhc2NlbmQ7DQorDQorCQkJCW9mZnNldCAtPSAyOw0KKwkJCQltYXggPSBwaXZvdHNbb2Zmc2V0 XTsNCisJCQkJbWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBvZmZzZXQpOw0KKwkJCQlj b250aW51ZTsNCisJCQl9DQorCQl9DQorDQorCQlpZiAoIW9mZnNldCkNCisJCQlnb3RvIGFzY2Vu ZDsNCisNCisJCW9mZnNldC0tOw0KKwkJbWF4ID0gbWluIC0gMTsNCisJCW1pbiA9IG1hc19zYWZl X21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkoaW5kZXgg PiBtYXgpKSB7DQorCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorCQlyZXR1cm4gZmFsc2U7 DQorCX0NCisNCisJaWYgKHVubGlrZWx5KG1hX2lzX2xlYWYodHlwZSkpKSB7DQorCQltYXMtPm9m ZnNldCA9IG9mZnNldDsNCisJCW1hcy0+bWluID0gbWluOw0KKwkJbWFzLT5tYXggPSBtaW4gKyBn YXAgLSAxOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyogZGVzY2VuZCwgb25seSBoYXBw ZW5zIHVuZGVyIGxvY2suICovDQorCW1hcy0+bm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9m ZnNldCk7DQorCW1hcy0+bWluID0gbWluOw0KKwltYXMtPm1heCA9IG1heDsNCisJbWFzLT5vZmZz ZXQgPSBtYXNfZGF0YV9lbmQobWFzKTsNCisJcmV0dXJuIGZhbHNlOw0KKw0KK2FzY2VuZDoNCisJ aWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7 DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19hbm9k ZV9kZXNjZW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0K KwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJdW5z aWduZWQgbG9uZyBwaXZvdCwgbWluLCBnYXAgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIGNvdW50LCBv ZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgKmdhcHMgPSBOVUxMLCAqcGl2b3RzID0gbWFfcGl2b3Rz KG1hc19tbihtYXMpLCB0eXBlKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobWFz X21uKG1hcyksIHR5cGUpOw0KKwlib29sIGZvdW5kID0gZmFsc2U7DQorDQorCWlmIChtYV9pc19k ZW5zZSh0eXBlKSkgew0KKwkJbWFzLT5vZmZzZXQgPSAodW5zaWduZWQgY2hhcikobWFzLT5pbmRl eCAtIG1hcy0+bWluKTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCWdhcHMgPSBtYV9nYXBz KG10ZV90b19ub2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsN CisJY291bnQgPSBtdF9zbG90c1t0eXBlXTsNCisJbWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2 b3RzLCBvZmZzZXQpOw0KKwlmb3IgKDsgb2Zmc2V0IDwgY291bnQ7IG9mZnNldCsrKSB7DQorCQlw aXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBvZmZzZXQsIHR5cGUpOw0KKwkJaWYg KG9mZnNldCAmJiAhcGl2b3QpDQorCQkJYnJlYWs7DQorDQorCQkvKiBOb3Qgd2l0aGluIGxvd2Vy IGJvdW5kcyAqLw0KKwkJaWYgKG1hcy0+aW5kZXggPiBwaXZvdCkNCisJCQlnb3RvIG5leHRfc2xv dDsNCisNCisJCWlmIChnYXBzKQ0KKwkJCWdhcCA9IGdhcHNbb2Zmc2V0XTsNCisJCWVsc2UgaWYg KCFtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpKQ0KKwkJCWdhcCA9IG1pbihwaXZvdCwgbWFz LT5sYXN0KSAtIG1heChtYXMtPmluZGV4LCBtaW4pICsgMTsNCisJCWVsc2UNCisJCQlnb3RvIG5l eHRfc2xvdDsNCisNCisJCWlmIChnYXAgPj0gc2l6ZSkgew0KKwkJCWlmIChtYV9pc19sZWFmKHR5 cGUpKSB7DQorCQkJCWZvdW5kID0gdHJ1ZTsNCisJCQkJZ290byBkb25lOw0KKwkJCX0NCisJCQlp ZiAobWFzLT5pbmRleCA8PSBwaXZvdCkgew0KKwkJCQltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMs IHNsb3RzLCBvZmZzZXQpOw0KKwkJCQltYXMtPm1pbiA9IG1pbjsNCisJCQkJbWFzLT5tYXggPSBw aXZvdDsNCisJCQkJb2Zmc2V0ID0gMDsNCisJCQkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5u b2RlKTsNCisJCQkJY291bnQgPSBtdF9zbG90c1t0eXBlXTsNCisJCQkJYnJlYWs7DQorCQkJfQ0K KwkJfQ0KK25leHRfc2xvdDoNCisJCW1pbiA9IHBpdm90ICsgMTsNCisJCWlmIChtYXMtPmxhc3Qg PD0gcGl2b3QpIHsNCisJCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorCQkJcmV0dXJuIHRy dWU7DQorCQl9DQorCX0NCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQlmb3Vu ZCA9IHRydWU7DQorZG9uZToNCisJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCXJldHVybiBmb3Vu ZDsNCit9DQorDQorLyoqDQorICogbWFzX3dhbGsoKSAtIFNlYXJjaCBmb3IgQG1hcy0+aW5kZXgg aW4gdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogbWFzLT5p bmRleCBhbmQgbWFzLT5sYXN0IHdpbGwgYmUgc2V0IHRvIHRoZSByYW5nZSBpZiB0aGVyZSBpcyBh IHZhbHVlLiAgSWYNCisgKiBtYXMtPm5vZGUgaXMgTUFTX05PTkUsIHJlc2V0IHRvIE1BU19TVEFS VC4NCisgKg0KKyAqIFJldHVybjogdGhlIGVudHJ5IGF0IHRoZSBsb2NhdGlvbiBvciAlTlVMTC4N CisgKi8NCit2b2lkICptYXNfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXZvaWQg KmVudHJ5Ow0KKw0KK3JldHJ5Og0KKwllbnRyeSA9IG1hc19zdGF0ZV93YWxrKG1hcyk7DQorCWlm IChtYXNfaXNfc3RhcnQobWFzKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCWlmIChtYXNfaXNfcHRy KG1hcykpIHsNCisJCWlmICghbWFzLT5pbmRleCkgew0KKwkJCW1hcy0+bGFzdCA9IDA7DQorCQl9 IGVsc2Ugew0KKwkJCW1hcy0+aW5kZXggPSAxOw0KKwkJCW1hcy0+bGFzdCA9IFVMT05HX01BWDsN CisJCX0NCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkg ew0KKwkJbWFzLT5pbmRleCA9IDA7DQorCQltYXMtPmxhc3QgPSBVTE9OR19NQVg7DQorCX0NCisN CisJcmV0dXJuIGVudHJ5Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3Jld2luZF9u b2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgY2hhciBzbG90Ow0KKw0K KwlkbyB7DQorCQlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJCXNsb3QgPSBtYXMt Pm9mZnNldDsNCisJCQlpZiAoIXNsb3QpDQorCQkJCXJldHVybiBmYWxzZTsNCisJCX0gZWxzZSB7 DQorCQkJbWFzX2FzY2VuZChtYXMpOw0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJCX0NCisJ fSB3aGlsZSAoIXNsb3QpOw0KKw0KKwltYXMtPm9mZnNldCA9IC0tc2xvdDsNCisJcmV0dXJuIHRy dWU7DQorfQ0KKw0KKy8qDQorICogbWFzX3NraXBfbm9kZSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24u ICBTa2lwIG92ZXIgYSBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAq IFJldHVybjogdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIG5vZGUsIGZhbHNlIG90aGVyd2lzZS4N CisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3NraXBfbm9kZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdCwgc2xvdF9jb3VudDsNCisJdW5zaWduZWQg bG9uZyAqcGl2b3RzOw0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorDQorCW10ID0gbXRlX25vZGVf dHlwZShtYXMtPm5vZGUpOw0KKwlzbG90X2NvdW50ID0gbXRfc2xvdHNbbXRdIC0gMTsNCisJZG8g ew0KKwkJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJCQlzbG90ID0gbWFzLT5vZmZz ZXQ7DQorCQkJaWYgKHNsb3QgPiBzbG90X2NvdW50KSB7DQorCQkJCW1hc19zZXRfZXJyKG1hcywg LUVCVVNZKTsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJbWFz X2FzY2VuZChtYXMpOw0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJCQltdCA9IG10ZV9ub2Rl X3R5cGUobWFzLT5ub2RlKTsNCisJCQlzbG90X2NvdW50ID0gbXRfc2xvdHNbbXRdIC0gMTsNCisJ CX0NCisJfSB3aGlsZSAoc2xvdCA+IHNsb3RfY291bnQpOw0KKw0KKwltYXMtPm9mZnNldCA9ICsr c2xvdDsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1hc19tbihtYXMpLCBtdCk7DQorCWlmIChzbG90 ID4gMCkNCisJCW1hcy0+bWluID0gcGl2b3RzW3Nsb3QgLSAxXSArIDE7DQorDQorCWlmIChzbG90 IDw9IHNsb3RfY291bnQpDQorCQltYXMtPm1heCA9IHBpdm90c1tzbG90XTsNCisNCisJcmV0dXJu IHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX2F3YWxrKCkgLSBBbGxvY2F0aW9uIHdhbGsuICBT ZWFyY2ggZnJvbSBsb3cgYWRkcmVzcyB0byBoaWdoLCBmb3IgYSBnYXAgb2YNCisgKiBAc2l6ZQ0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgZ2Fw IHJlcXVpcmVkDQorICoNCisgKiBTZWFyY2ggYmV0d2VlbiBAbWFzLT5pbmRleCBhbmQgQG1hcy0+ bGFzdCBmb3IgYSBnYXAgb2YgQHNpemUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19h d2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICpsYXN0ID0gTlVMTDsNCisNCisJLyoNCisJICogVGhlcmUgYXJlIDQg b3B0aW9uczoNCisJICogZ28gdG8gY2hpbGQgKGRlc2NlbmQpDQorCSAqIGdvIGJhY2sgdG8gcGFy ZW50IChhc2NlbmQpDQorCSAqIG5vIGdhcCBmb3VuZC4gKHJldHVybiwgc2xvdCA9PSBNQVBMRV9O T0RFX1NMT1RTKQ0KKwkgKiBmb3VuZCB0aGUgZ2FwLiAocmV0dXJuLCBzbG90ICE9IE1BUExFX05P REVfU0xPVFMpDQorCSAqLw0KKwl3aGlsZSAoIW1hc19pc19lcnIobWFzKSAmJiAhbWFzX2Fub2Rl X2Rlc2NlbmQobWFzLCBzaXplKSkgew0KKwkJaWYgKGxhc3QgPT0gbWFzLT5ub2RlKQ0KKwkJCW1h c19za2lwX25vZGUobWFzKTsNCisJCWVsc2UNCisJCQlsYXN0ID0gbWFzLT5ub2RlOw0KKwl9DQor fQ0KKw0KKy8qDQorICogbWFzX2ZpbGxfZ2FwKCkgLSBGaWxsIGEgbG9jYXRlZCBnYXAgd2l0aCBA ZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgdmFsdWUg dG8gc3RvcmUNCisgKiBAc2xvdDogVGhlIG9mZnNldCBpbnRvIHRoZSBub2RlIHRvIHN0b3JlIHRo ZSBAZW50cnkNCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGVudHJ5DQorICogQGluZGV4OiBU aGUgc3RhcnQgbG9jYXRpb24NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2ZpbGxfZ2Fw KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGNoYXIgc2xv dCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbmRleCkNCit7DQorCU1BX1dS X1NUQVRFKHdyX21hcywgbWFzLCBlbnRyeSk7DQorCXVuc2lnbmVkIGNoYXIgcHNsb3QgPSBtdGVf cGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICptbiA9IG1hcy0+ bm9kZTsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwllbnVtIG1hcGxlX3R5cGUgcHR5cGU7 DQorCS8qDQorCSAqIG1hcy0+aW5kZXggaXMgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZSBzZWFy Y2gNCisJICogIHdoaWNoIG1heSBubyBsb25nZXIgYmUgbmVlZGVkLg0KKwkgKiBtYXMtPmxhc3Qg aXMgdGhlIGVuZCBhZGRyZXNzIGZvciB0aGUgc2VhcmNoDQorCSAqLw0KKw0KKwkqaW5kZXggPSBt YXMtPmluZGV4Ow0KKwltYXMtPmxhc3QgPSBtYXMtPmluZGV4ICsgc2l6ZSAtIDE7DQorDQorCS8q DQorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdXNpbmcgbWFzLT5tYXggYW5kIG1hcy0+bWluIHRv IGNvcnJlY3RseQ0KKwkgKiBjYWxjdWxhdGUgdGhlIGluZGV4IGFuZCBsYXN0IHdpbGwgY2F1c2Ug YW4gaXNzdWUgaW4gdGhlIGdhcA0KKwkgKiBjYWxjdWxhdGlvbiwgc28gZml4IHRoZSBtYV9zdGF0 ZSBoZXJlDQorCSAqLw0KKwltYXNfYXNjZW5kKG1hcyk7DQorCXB0eXBlID0gbXRlX25vZGVfdHlw ZShtYXMtPm5vZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIHB0eXBlKTsN CisJbWFzLT5tYXggPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgcHNsb3QsIHB0eXBlKTsN CisJbWFzLT5taW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIHBzbG90KTsNCisJbWFzLT5u b2RlID0gbW47DQorCW1hcy0+b2Zmc2V0ID0gc2xvdDsNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3 cl9tYXMpOw0KK30NCisNCisvKg0KKyAqIG1hc19zcGFyc2VfYXJlYSgpIC0gSW50ZXJuYWwgZnVu Y3Rpb24uICBSZXR1cm4gdXBwZXIgb3IgbG93ZXIgbGltaXQgd2hlbg0KKyAqIHNlYXJjaGluZyBm b3IgYSBnYXAgaW4gYW4gZW1wdHkgdHJlZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisg KiBAbWluOiB0aGUgbWluaW11bSByYW5nZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHJhbmdlDQor ICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBnYXANCisgKiBAZndkOiBTZWFyY2hpbmcgZm9yd2Fy ZCBvciBiYWNrDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zcGFyc2VfYXJlYShzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQkJCXVuc2lnbmVkIGxvbmcg bWF4LCB1bnNpZ25lZCBsb25nIHNpemUsIGJvb2wgZndkKQ0KK3sNCisJdW5zaWduZWQgbG9uZyBz dGFydCA9IDA7DQorDQorCWlmICghdW5saWtlbHkobWFzX2lzX25vbmUobWFzKSkpDQorCQlzdGFy dCsrOw0KKwkvKiBtYXNfaXNfcHRyICovDQorDQorCWlmIChzdGFydCA8IG1pbikNCisJCXN0YXJ0 ID0gbWluOw0KKw0KKwlpZiAoZndkKSB7DQorCQltYXMtPmluZGV4ID0gc3RhcnQ7DQorCQltYXMt Pmxhc3QgPSBzdGFydCArIHNpemUgLSAxOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCW1hcy0+aW5k ZXggPSBtYXg7DQorfQ0KKw0KKy8qDQorICogbWFzX2VtcHR5X2FyZWEoKSAtIEdldCB0aGUgbG93 ZXN0IGFkZHJlc3Mgd2l0aGluIHRoZSByYW5nZSB0aGF0IGlzDQorICogc3VmZmljaWVudCBmb3Ig dGhlIHNpemUgcmVxdWVzdGVkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46 IFRoZSBsb3dlc3QgdmFsdWUgb2YgdGhlIHJhbmdlDQorICogQG1heDogVGhlIGhpZ2hlc3QgdmFs dWUgb2YgdGhlIHJhbmdlDQorICogQHNpemU6IFRoZSBzaXplIG5lZWRlZA0KKyAqLw0KK2ludCBt YXNfZW1wdHlfYXJlYShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQor CQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJdW5zaWduZWQg Y2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJZW51bSBtYXBsZV90eXBl IG10Ow0KKw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQltYXNfc3RhcnQobWFzKTsNCisJ ZWxzZSBpZiAobWFzLT5vZmZzZXQgPj0gMikNCisJCW1hcy0+b2Zmc2V0IC09IDI7DQorCWVsc2Ug aWYgKCFtYXNfc2tpcF9ub2RlKG1hcykpDQorCQlyZXR1cm4gLUVCVVNZOw0KKw0KKwkvKiBFbXB0 eSBzZXQgKi8NCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7DQor CQltYXNfc3BhcnNlX2FyZWEobWFzLCBtaW4sIG1heCwgc2l6ZSwgdHJ1ZSk7DQorCQlyZXR1cm4g MDsNCisJfQ0KKw0KKwkvKiBUaGUgc3RhcnQgb2YgdGhlIHdpbmRvdyBjYW4gb25seSBiZSB3aXRo aW4gdGhlc2UgdmFsdWVzICovDQorCW1hcy0+aW5kZXggPSBtaW47DQorCW1hcy0+bGFzdCA9IG1h eDsNCisJbWFzX2F3YWxrKG1hcywgc2l6ZSk7DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfZXJy KG1hcykpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlvZmZzZXQgPSBtYXMt Pm9mZnNldDsNCisJaWYgKHVubGlrZWx5KG9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RTKSkNCisJ CXJldHVybiAtRUJVU1k7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlw aXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIG10KTsNCisJaWYgKG9mZnNldCkNCisJCW1h cy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisNCisJaWYgKG9mZnNldCA8IG10X3Bp dm90c1ttdF0pDQorCQltYXMtPm1heCA9IHBpdm90c1tvZmZzZXRdOw0KKw0KKwlpZiAobWFzLT5p bmRleCA8IG1hcy0+bWluKQ0KKwkJbWFzLT5pbmRleCA9IG1hcy0+bWluOw0KKw0KKwltYXMtPmxh c3QgPSBtYXMtPmluZGV4ICsgc2l6ZSAtIDE7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAq IG1hc19lbXB0eV9hcmVhX3JldigpIC0gR2V0IHRoZSBoaWdoZXN0IGFkZHJlc3Mgd2l0aGluIHRo ZSByYW5nZSB0aGF0IGlzDQorICogc3VmZmljaWVudCBmb3IgdGhlIHNpemUgcmVxdWVzdGVkLg0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlc3QgdmFsdWUgb2Yg dGhlIHJhbmdlDQorICogQG1heDogVGhlIGhpZ2hlc3QgdmFsdWUgb2YgdGhlIHJhbmdlDQorICog QHNpemU6IFRoZSBzaXplIG5lZWRlZA0KKyAqLw0KK2ludCBtYXNfZW1wdHlfYXJlYV9yZXYoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBt YXgsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGFzdCA9 IG1hcy0+bm9kZTsNCisNCisJaWYgKG1hc19pc19zdGFydChtYXMpKSB7DQorCQltYXNfc3RhcnQo bWFzKTsNCisJCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hcyk7DQorCX0gZWxzZSBpZiAo bWFzLT5vZmZzZXQgPj0gMikgew0KKwkJbWFzLT5vZmZzZXQgLT0gMjsNCisJfSBlbHNlIGlmICgh bWFzX3Jld2luZF9ub2RlKG1hcykpIHsNCisJCXJldHVybiAtRUJVU1k7DQorCX0NCisNCisJLyog RW1wdHkgc2V0LiAqLw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1hcykp IHsNCisJCW1hc19zcGFyc2VfYXJlYShtYXMsIG1pbiwgbWF4LCBzaXplLCBmYWxzZSk7DQorCQly ZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBUaGUgc3RhcnQgb2YgdGhlIHdpbmRvdyBjYW4gb25seSBi ZSB3aXRoaW4gdGhlc2UgdmFsdWVzLiAqLw0KKwltYXMtPmluZGV4ID0gbWluOw0KKwltYXMtPmxh c3QgPSBtYXg7DQorDQorCXdoaWxlICghbWFzX3Jldl9hd2FsayhtYXMsIHNpemUpKSB7DQorCQlp ZiAobGFzdCA9PSBtYXMtPm5vZGUpIHsNCisJCQlpZiAoIW1hc19yZXdpbmRfbm9kZShtYXMpKQ0K KwkJCQlyZXR1cm4gLUVCVVNZOw0KKwkJfSBlbHNlIHsNCisJCQlsYXN0ID0gbWFzLT5ub2RlOw0K KwkJfQ0KKwl9DQorDQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4geGFfZXJyKG1h cy0+bm9kZSk7DQorDQorCWlmICh1bmxpa2VseShtYXMtPm9mZnNldCA9PSBNQVBMRV9OT0RFX1NM T1RTKSkNCisJCXJldHVybiAtRUJVU1k7DQorDQorCS8qDQorCSAqIG1hc19yZXZfYXdhbGsoKSBo YXMgc2V0IG1hcy0+bWluIGFuZCBtYXMtPm1heCB0byB0aGUgZ2FwIHZhbHVlcy4gIElmDQorCSAq IHRoZSBtYXhpbXVtIGlzIG91dHNpZGUgdGhlIHdpbmRvdyB3ZSBhcmUgc2VhcmNoaW5nLCB0aGVu IHVzZSB0aGUgbGFzdA0KKwkgKiBsb2NhdGlvbiBpbiB0aGUgc2VhcmNoLg0KKwkgKiBtYXMtPm1h eCBhbmQgbWFzLT5taW4gaXMgdGhlIHJhbmdlIG9mIHRoZSBnYXAuDQorCSAqIG1hcy0+aW5kZXgg YW5kIG1hcy0+bGFzdCBhcmUgY3VycmVudGx5IHNldCB0byB0aGUgc2VhcmNoIHJhbmdlLg0KKwkg Ki8NCisNCisJLyogVHJpbSB0aGUgdXBwZXIgbGltaXQgdG8gdGhlIG1heC4gKi8NCisJaWYgKG1h cy0+bWF4IDw9IG1hcy0+bGFzdCkNCisJCW1hcy0+bGFzdCA9IG1hcy0+bWF4Ow0KKw0KKwltYXMt PmluZGV4ID0gbWFzLT5sYXN0IC0gc2l6ZSArIDE7DQorCXJldHVybiAwOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIGludCBtYXNfYWxsb2Moc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5 LA0KKwkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbmRleCkNCit7DQorCXVu c2lnbmVkIGxvbmcgbWluOw0KKw0KKwltYXNfc3RhcnQobWFzKTsNCisJaWYgKG1hc19pc19ub25l KG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQltYXNfcm9vdF9leHBhbmQobWFzLCBlbnRy eSk7DQorCQlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJCXJldHVybiB4YV9lcnIobWFzLT5ub2Rl KTsNCisNCisJCWlmICghbWFzLT5pbmRleCkNCisJCQlyZXR1cm4gbXRlX3Bpdm90KG1hcy0+bm9k ZSwgMCk7DQorCQlyZXR1cm4gbXRlX3Bpdm90KG1hcy0+bm9kZSwgMSk7DQorCX0NCisNCisJLyog TXVzdCBiZSB3YWxraW5nIGEgdHJlZS4gKi8NCisJbWFzX2F3YWxrKG1hcywgc2l6ZSk7DQorCWlm IChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCWlm IChtYXMtPm9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RTKQ0KKwkJZ290byBub19nYXA7DQorDQor CS8qDQorCSAqIEF0IHRoaXMgcG9pbnQsIG1hcy0+bm9kZSBwb2ludHMgdG8gdGhlIHJpZ2h0IG5v ZGUgYW5kIHdlIGhhdmUgYW4NCisJICogb2Zmc2V0IHRoYXQgaGFzIGEgc3VmZmljaWVudCBnYXAu DQorCSAqLw0KKwltaW4gPSBtYXMtPm1pbjsNCisJaWYgKG1hcy0+b2Zmc2V0KQ0KKwkJbWluID0g bXRlX3Bpdm90KG1hcy0+bm9kZSwgbWFzLT5vZmZzZXQgLSAxKSArIDE7DQorDQorCWlmIChtYXMt PmluZGV4IDwgbWluKQ0KKwkJbWFzLT5pbmRleCA9IG1pbjsNCisNCisJbWFzX2ZpbGxfZ2FwKG1h cywgZW50cnksIG1hcy0+b2Zmc2V0LCBzaXplLCBpbmRleCk7DQorCXJldHVybiAwOw0KKw0KK25v X2dhcDoNCisJcmV0dXJuIC1FQlVTWTsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3Jl dl9hbGxvYyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQkJCXVu c2lnbmVkIGxvbmcgbWF4LCB2b2lkICplbnRyeSwNCisJCQkJdW5zaWduZWQgbG9uZyBzaXplLCB1 bnNpZ25lZCBsb25nICppbmRleCkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlyZXQgPSBtYXNf ZW1wdHlfYXJlYV9yZXYobWFzLCBtaW4sIG1heCwgc2l6ZSk7DQorCWlmIChyZXQpDQorCQlyZXR1 cm4gcmV0Ow0KKw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMt Pm5vZGUpOw0KKw0KKwlpZiAobWFzLT5vZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykNCisJCWdv dG8gbm9fZ2FwOw0KKw0KKwltYXNfZmlsbF9nYXAobWFzLCBlbnRyeSwgbWFzLT5vZmZzZXQsIHNp emUsIGluZGV4KTsNCisJcmV0dXJuIDA7DQorDQorbm9fZ2FwOg0KKwlyZXR1cm4gLUVCVVNZOw0K K30NCisNCisvKg0KKyAqIG1hc19kZWFkX2xlYXZlcygpIC0gTWFyayBhbGwgbGVhdmVzIG9mIGEg bm9kZSBhcyBkZWFkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzbG90czogUG9p bnRlciB0byB0aGUgc2xvdCBhcnJheQ0KKyAqDQorICogTXVzdCBob2xkIHRoZSB3cml0ZSBsb2Nr Lg0KKyAqDQorICogUmV0dXJuOiBUaGUgbnVtYmVyIG9mIGxlYXZlcyBtYXJrZWQgYXMgZGVhZC4N CisgKi8NCitzdGF0aWMgaW5saW5lDQordW5zaWduZWQgY2hhciBtYXNfZGVhZF9sZWF2ZXMoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHZvaWQgX19yY3UgKipzbG90cykNCit7DQorCXN0cnVjdCBtYXBs ZV9ub2RlICpub2RlOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJdm9pZCAqZW50cnk7DQor CWludCBvZmZzZXQ7DQorDQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbXRfc2xvdF9jb3Vu dChtYXMtPm5vZGUpOyBvZmZzZXQrKykgew0KKwkJZW50cnkgPSBtYXNfc2xvdF9sb2NrZWQobWFz LCBzbG90cywgb2Zmc2V0KTsNCisJCXR5cGUgPSBtdGVfbm9kZV90eXBlKGVudHJ5KTsNCisJCW5v ZGUgPSBtdGVfdG9fbm9kZShlbnRyeSk7DQorCQkvKiBVc2UgYm90aCBub2RlIGFuZCB0eXBlIHRv IGNhdGNoIExFICYgQkUgbWV0YWRhdGEgKi8NCisJCWlmICghbm9kZSB8fCAhdHlwZSkNCisJCQli cmVhazsNCisNCisJCW10ZV9zZXRfbm9kZV9kZWFkKGVudHJ5KTsNCisJCXNtcF93bWIoKTsgLyog TmVlZGVkIGZvciBSQ1UgKi8NCisJCW5vZGUtPnR5cGUgPSB0eXBlOw0KKwkJcmN1X2Fzc2lnbl9w b2ludGVyKHNsb3RzW29mZnNldF0sIG5vZGUpOw0KKwl9DQorDQorCXJldHVybiBvZmZzZXQ7DQor fQ0KKw0KK3N0YXRpYyB2b2lkIF9fcmN1ICoqbWFzX2RlYWRfd2FsayhzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9k ZSwgKm5leHQ7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IE5VTEw7DQorDQorCW5leHQgPSBtYXNf bW4obWFzKTsNCisJZG8gew0KKwkJbWFzLT5ub2RlID0gbWFfZW5vZGVfcHRyKG5leHQpOw0KKwkJ bm9kZSA9IG1hc19tbihtYXMpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBub2RlLT50eXBl KTsNCisJCW5leHQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCW9m ZnNldCA9IDA7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKG5leHQtPnR5cGUpKTsNCisNCisJcmV0 dXJuIHNsb3RzOw0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9mcmVlX3dhbGsoc3RydWN0IHJjdV9o ZWFkICpoZWFkKQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9k ZSAqbm9kZSwgKnN0YXJ0Ow0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSBtdDsNCisJdW5zaWduZWQgY2hh ciBvZmZzZXQ7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwlNQV9TVEFURShtYXMsICZtdCwg MCwgMCk7DQorDQorCW5vZGUgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG1hcGxlX25vZGUs IHJjdSk7DQorDQorCWlmIChtYV9pc19sZWFmKG5vZGUtPnR5cGUpKQ0KKwkJZ290byBmcmVlX2xl YWY7DQorDQorCW10X2luaXRfZmxhZ3MoJm10LCBub2RlLT5tYV9mbGFncyk7DQorCW1hc19sb2Nr KCZtYXMpOw0KKwlzdGFydCA9IG5vZGU7DQorCW1hcy5ub2RlID0gbXRfbWtfbm9kZShub2RlLCBu b2RlLT50eXBlKTsNCisJc2xvdHMgPSBtYXNfZGVhZF93YWxrKCZtYXMsIDApOw0KKwlub2RlID0g bWFzX21uKCZtYXMpOw0KKwlkbyB7DQorCQltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4sIHNs b3RzKTsNCisJCW9mZnNldCA9IG5vZGUtPnBhcmVudF9zbG90ICsgMTsNCisJCW1hcy5ub2RlID0g bm9kZS0+cGl2X3BhcmVudDsNCisJCWlmIChtYXNfbW4oJm1hcykgPT0gbm9kZSkNCisJCQlnb3Rv IHN0YXJ0X3Nsb3RzX2ZyZWU7DQorDQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShtYXMubm9kZSk7 DQorCQlzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwgdHlwZSk7DQorCQlp ZiAoKG9mZnNldCA8IG10X3Nsb3RzW3R5cGVdKSAmJiAoc2xvdHNbb2Zmc2V0XSkpDQorCQkJc2xv dHMgPSBtYXNfZGVhZF93YWxrKCZtYXMsIG9mZnNldCk7DQorDQorCQlub2RlID0gbWFzX21uKCZt YXMpOw0KKwl9IHdoaWxlICgobm9kZSAhPSBzdGFydCkgfHwgKG5vZGUtPnNsb3RfbGVuIDwgb2Zm c2V0KSk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbm9kZS0+dHlwZSk7DQorCW10X2Zy ZWVfYnVsayhub2RlLT5zbG90X2xlbiwgc2xvdHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQor CW1hc191bmxvY2soJm1hcyk7DQorZnJlZV9sZWFmOg0KKwltdF9mcmVlX3JjdSgmbm9kZS0+cmN1 KTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIF9fcmN1ICoqbWFzX2Rlc3Ryb3lfZGVzY2Vu ZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnByZXYsIHVu c2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCA9IG1hcy0+bm9kZTsNCisJdm9pZCBfX3JjdSAqKnNsb3Rz ID0gTlVMTDsNCisNCisJZG8gew0KKwkJbWFzLT5ub2RlID0gbmV4dDsNCisJCW5vZGUgPSBtYXNf bW4obWFzKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXRlX25vZGVfdHlwZShtYXMtPm5v ZGUpKTsNCisJCW5leHQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgMCk7DQorCQlpZiAo KG10ZV9kZWFkX25vZGUobmV4dCkpKQ0KKwkJCW5leHQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBz bG90cywgMSk7DQorDQorCQltdGVfc2V0X25vZGVfZGVhZChtYXMtPm5vZGUpOw0KKwkJbm9kZS0+ dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCW5vZGUtPnBpdl9wYXJlbnQgPSBw cmV2Ow0KKwkJbm9kZS0+cGFyZW50X3Nsb3QgPSBvZmZzZXQ7DQorCQlvZmZzZXQgPSAwOw0KKwkJ cHJldiA9IG1hcy0+bm9kZTsNCisJfSB3aGlsZSAoIW10ZV9pc19sZWFmKG5leHQpKTsNCisNCisJ cmV0dXJuIHNsb3RzOw0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9kZXN0cm95X3dhbGsoc3RydWN0 IG1hcGxlX2Vub2RlICplbm9kZSwgdW5zaWduZWQgY2hhciBtYV9mbGFncywNCisJCQkgICAgYm9v bCBmcmVlKQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAq bm9kZSA9IG10ZV90b19ub2RlKGVub2RlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpzdGFydDsN CisJc3RydWN0IG1hcGxlX3RyZWUgbXQ7DQorDQorCU1BX1NUQVRFKG1hcywgJm10LCAwLCAwKTsN CisNCisJaWYgKG10ZV9pc19sZWFmKGVub2RlKSkNCisJCWdvdG8gZnJlZV9sZWFmOw0KKw0KKwlt dF9pbml0X2ZsYWdzKCZtdCwgbWFfZmxhZ3MpOw0KKwltYXNfbG9jaygmbWFzKTsNCisNCisJbWFz Lm5vZGUgPSBzdGFydCA9IGVub2RlOw0KKwlzbG90cyA9IG1hc19kZXN0cm95X2Rlc2NlbmQoJm1h cywgc3RhcnQsIDApOw0KKwlub2RlID0gbWFzX21uKCZtYXMpOw0KKwlkbyB7DQorCQllbnVtIG1h cGxlX3R5cGUgdHlwZTsNCisJCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwkJc3RydWN0IG1hcGxl X2Vub2RlICpwYXJlbnQsICp0bXA7DQorDQorCQlub2RlLT5zbG90X2xlbiA9IG1hc19kZWFkX2xl YXZlcygmbWFzLCBzbG90cyk7DQorCQlpZiAoZnJlZSkNCisJCQltdF9mcmVlX2J1bGsobm9kZS0+ c2xvdF9sZW4sIHNsb3RzKTsNCisJCW9mZnNldCA9IG5vZGUtPnBhcmVudF9zbG90ICsgMTsNCisJ CW1hcy5ub2RlID0gbm9kZS0+cGl2X3BhcmVudDsNCisJCWlmIChtYXNfbW4oJm1hcykgPT0gbm9k ZSkNCisJCQlnb3RvIHN0YXJ0X3Nsb3RzX2ZyZWU7DQorDQorCQl0eXBlID0gbXRlX25vZGVfdHlw ZShtYXMubm9kZSk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwg dHlwZSk7DQorCQlpZiAob2Zmc2V0ID49IG10X3Nsb3RzW3R5cGVdKQ0KKwkJCWdvdG8gbmV4dDsN CisNCisJCXRtcCA9IG1hc19zbG90X2xvY2tlZCgmbWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCWlm IChtdGVfbm9kZV90eXBlKHRtcCkgJiYgbXRlX3RvX25vZGUodG1wKSkgew0KKwkJCXBhcmVudCA9 IG1hcy5ub2RlOw0KKwkJCW1hcy5ub2RlID0gdG1wOw0KKwkJCXNsb3RzID0gbWFzX2Rlc3Ryb3lf ZGVzY2VuZCgmbWFzLCBwYXJlbnQsIG9mZnNldCk7DQorCQl9DQorbmV4dDoNCisJCW5vZGUgPSBt YXNfbW4oJm1hcyk7DQorCX0gd2hpbGUgKHN0YXJ0ICE9IG1hcy5ub2RlKTsNCisNCisJbm9kZSA9 IG1hc19tbigmbWFzKTsNCisJbm9kZS0+c2xvdF9sZW4gPSBtYXNfZGVhZF9sZWF2ZXMoJm1hcywg c2xvdHMpOw0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVfYnVsayhub2RlLT5zbG90X2xlbiwgc2xv dHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorCW1hc191bmxvY2soJm1hcyk7DQorDQorZnJl ZV9sZWFmOg0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVfcmN1KCZub2RlLT5yY3UpOw0KK30NCisN CisvKg0KKyAqIG10ZV9kZXN0cm95X3dhbGsoKSAtIEZyZWUgYSB0cmVlIG9yIHN1Yi10cmVlLg0K KyAqIEBlbm9kZSAtIHRoZSBlbmNvZGVkIG1hcGxlIG5vZGUgKG1hcGxlX2Vub2RlKSB0byBzdGFy dA0KKyAqIEBtbiAtIHRoZSB0cmVlIHRvIGZyZWUgLSBuZWVkZWQgZm9yIG5vZGUgdHlwZXMuDQor ICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2suDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG10ZV9kZXN0cm95X3dhbGsoc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSwNCisJCQkJICAg IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0g bXRlX3RvX25vZGUoZW5vZGUpOw0KKw0KKwlpZiAobXRfaW5fcmN1KG10KSkgew0KKwkJbXRfZGVz dHJveV93YWxrKGVub2RlLCBtdC0+bWFfZmxhZ3MsIGZhbHNlKTsNCisJCWNhbGxfcmN1KCZub2Rl LT5yY3UsIG10X2ZyZWVfd2Fsayk7DQorCX0gZWxzZSB7DQorCQltdF9kZXN0cm95X3dhbGsoZW5v ZGUsIG10LT5tYV9mbGFncywgdHJ1ZSk7DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgbWFzX3dy X3N0b3JlX3NldHVwKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJaWYgKCFtYXNf aXNfc3RhcnQod3JfbWFzLT5tYXMpKSB7DQorCQlpZiAobWFzX2lzX25vbmUod3JfbWFzLT5tYXMp KSB7DQorCQkJbWFzX3Jlc2V0KHdyX21hcy0+bWFzKTsNCisJCX0gZWxzZSB7DQorCQkJd3JfbWFz LT5yX21heCA9IHdyX21hcy0+bWFzLT5tYXg7DQorCQkJd3JfbWFzLT50eXBlID0gbXRlX25vZGVf dHlwZSh3cl9tYXMtPm1hcy0+bm9kZSk7DQorCQkJaWYgKG1hc19pc19zcGFuX3dyKHdyX21hcykp DQorCQkJCW1hc19yZXNldCh3cl9tYXMtPm1hcyk7DQorCQl9DQorCX0NCisNCit9DQorDQorLyog SW50ZXJmYWNlICovDQorDQorLyoqDQorICogbWFzX3N0b3JlKCkgLSBTdG9yZSBhbiBAZW50cnku DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0 b3JlLg0KKyAqDQorICogVGhlIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5sYXN0IGlzIHVzZWQgdG8g c2V0IHRoZSByYW5nZSBmb3IgdGhlIEBlbnRyeS4NCisgKiBOb3RlOiBUaGUgQG1hcyBzaG91bGQg aGF2ZSBwcmUtYWxsb2NhdGVkIGVudHJpZXMgdG8gZW5zdXJlIHRoZXJlIGlzIG1lbW9yeSB0bw0K KyAqIHN0b3JlIHRoZSBlbnRyeS4gIFBsZWFzZSBzZWUgbWFzX2V4cGVjdGVkX2VudHJpZXMoKS9t YXNfZGVzdHJveSgpIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiBSZXR1cm46IHRoZSBmaXJz dCBlbnRyeSBiZXR3ZWVuIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCBvciAlTlVMTC4NCisgKi8N Cit2b2lkICptYXNfc3RvcmUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sN CisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVudHJ5KTsNCisNCisJdHJhY2VfbWFfd3JpdGUo X19mdW5jX18sIG1hcywgMCwgZW50cnkpOw0KKyNpZmRlZiBDT05GSUdfREVCVUdfTUFQTEVfVFJF RQ0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+bGFzdCkNCisJCXByX2VycigiRXJyb3IgJWx1ID4g JWx1ICVwXG4iLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QsIGVudHJ5KTsNCisJTVRfQlVHX09OKG1h cy0+dHJlZSwgbWFzLT5pbmRleCA+IG1hcy0+bGFzdCk7DQorCWlmIChtYXMtPmluZGV4ID4gbWFz LT5sYXN0KSB7DQorCQltYXNfc2V0X2VycihtYXMsIC1FSU5WQUwpOw0KKwkJcmV0dXJuIE5VTEw7 DQorCX0NCisNCisjZW5kaWYNCisNCisJLyoNCisJICogU3RvcmluZyBpcyB0aGUgc2FtZSBvcGVy YXRpb24gYXMgaW5zZXJ0IHdpdGggdGhlIGFkZGVkIGNhdmVhdCB0aGF0IGl0DQorCSAqIGNhbiBv dmVyd3JpdGUgZW50cmllcy4gIEFsdGhvdWdoIHRoaXMgc2VlbXMgc2ltcGxlIGVub3VnaCwgb25l IG1heQ0KKwkgKiB3YW50IHRvIGV4YW1pbmUgd2hhdCBoYXBwZW5zIGlmIGEgc2luZ2xlIHN0b3Jl IG9wZXJhdGlvbiB3YXMgdG8NCisJICogb3ZlcndyaXRlIG11bHRpcGxlIGVudHJpZXMgd2l0aGlu IGEgc2VsZi1iYWxhbmNpbmcgQi1UcmVlLg0KKwkgKi8NCisJbWFzX3dyX3N0b3JlX3NldHVwKCZ3 cl9tYXMpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQorCXJldHVybiB3cl9tYXMu Y29udGVudDsNCit9DQorDQorLyoqDQorICogbWFzX3N0b3JlX2dmcCgpIC0gU3RvcmUgYSB2YWx1 ZSBpbnRvIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTog VGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFs bG9jYXRpb25zIGlmIG5lY2Vzc2FyeS4NCisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAt RUlOVkFMIG9uIGludmFsaWQgcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90DQor ICogYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtYXNfc3RvcmVfZ2ZwKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFz LCBtYXMsIGVudHJ5KTsNCisNCisJbWFzX3dyX3N0b3JlX3NldHVwKCZ3cl9tYXMpOw0KKwl0cmFj ZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCBlbnRyeSk7DQorcmV0cnk6DQorCW1hc193cl9z dG9yZV9lbnRyeSgmd3JfbWFzKTsNCisJaWYgKHVubGlrZWx5KG1hc19ub21lbShtYXMsIGdmcCkp KQ0KKwkJZ290byByZXRyeTsNCisNCisJaWYgKHVubGlrZWx5KG1hc19pc19lcnIobWFzKSkpDQor CQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCXJldHVybiAwOw0KK30NCisNCisvKioN CisgKiBtYXNfc3RvcmVfcHJlYWxsb2MoKSAtIFN0b3JlIGEgdmFsdWUgaW50byB0aGUgdHJlZSB1 c2luZyBtZW1vcnkNCisgKiBwcmVhbGxvY2F0ZWQgaW4gdGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlLg0KKyAq Lw0KK3ZvaWQgbWFzX3N0b3JlX3ByZWFsbG9jKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICpl bnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBlbnRyeSk7DQorDQorCW1hc193 cl9zdG9yZV9zZXR1cCgmd3JfbWFzKTsNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIG1hcywg MCwgZW50cnkpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQorCUJVR19PTihtYXNf aXNfZXJyKG1hcykpOw0KKwltYXNfZGVzdHJveShtYXMpOw0KK30NCisNCisvKioNCisgKiBtYXNf cHJlYWxsb2NhdGUoKSAtIFByZWFsbG9jYXRlIGVub3VnaCBub2RlcyBmb3IgYSBzdG9yZSBvcGVy YXRpb24NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0 aGF0IHdpbGwgYmUgc3RvcmVkDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFs bG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gaWYgbWVt b3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG1hc19wcmVhbGxvY2F0ZShz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksIGdmcF90IGdmcCkNCit7DQorCWludCBy ZXQ7DQorDQorCW1hc19ub2RlX2NvdW50X2dmcChtYXMsIDEgKyBtYXNfbXRfaGVpZ2h0KG1hcykg KiAzLCBnZnApOw0KKwltYXMtPm1hc19mbGFncyB8PSBNQV9TVEFURV9QUkVBTExPQzsNCisJaWYg KGxpa2VseSghbWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiAwOw0KKw0KKwltYXNfc2V0X2Fs bG9jX3JlcShtYXMsIDApOw0KKwlyZXQgPSB4YV9lcnIobWFzLT5ub2RlKTsNCisJbWFzX3Jlc2V0 KG1hcyk7DQorCW1hc19kZXN0cm95KG1hcyk7DQorCW1hc19yZXNldChtYXMpOw0KKwlyZXR1cm4g cmV0Ow0KK30NCisNCisvKg0KKyAqIG1hc19kZXN0cm95KCkgLSBkZXN0cm95IGEgbWFwbGUgc3Rh dGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBVcG9uIGNvbXBsZXRpb24s IGNoZWNrIHRoZSBsZWZ0LW1vc3Qgbm9kZSBhbmQgcmViYWxhbmNlIGFnYWluc3QgdGhlIG5vZGUg dG8NCisgKiB0aGUgcmlnaHQgaWYgbmVjZXNzYXJ5LiAgRnJlZXMgYW55IGFsbG9jYXRlZCBub2Rl cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXBsZQ0KKyAqIHN0YXRlLg0KKyAqLw0KK3ZvaWQgbWFz X2Rlc3Ryb3koc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2Mg Km5vZGU7DQorDQorCS8qDQorCSAqIFdoZW4gdXNpbmcgbWFzX2Zvcl9lYWNoKCkgdG8gaW5zZXJ0 IGFuIGV4cGVjdGVkIG51bWJlciBvZiBlbGVtZW50cywNCisJICogaXQgaXMgcG9zc2libGUgdGhh dCB0aGUgbnVtYmVyIGluc2VydGVkIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQNCisJICogbnVt YmVyLiAgVG8gZml4IGFuIGludmFsaWQgZmluYWwgbm9kZSwgYSBjaGVjayBpcyBwZXJmb3JtZWQg aGVyZSB0bw0KKwkgKiByZWJhbGFuY2UgdGhlIHByZXZpb3VzIG5vZGUgd2l0aCB0aGUgZmluYWwg bm9kZS4NCisJICovDQorCWlmIChtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRFX1JFQkFMQU5DRSkg ew0KKwkJdW5zaWduZWQgY2hhciBlbmQ7DQorDQorCQlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQor CQkJbWFzX3N0YXJ0KG1hcyk7DQorDQorCQltdHJlZV9yYW5nZV93YWxrKG1hcyk7DQorCQllbmQg PSBtYXNfZGF0YV9lbmQobWFzKSArIDE7DQorCQlpZiAoZW5kIDwgbXRfbWluX3Nsb3RfY291bnQo bWFzLT5ub2RlKSAtIDEpDQorCQkJbWFzX2Rlc3Ryb3lfcmViYWxhbmNlKG1hcywgZW5kKTsNCisN CisJCW1hcy0+bWFzX2ZsYWdzICY9IH5NQV9TVEFURV9SRUJBTEFOQ0U7DQorCX0NCisJbWFzLT5t YXNfZmxhZ3MgJj0gfihNQV9TVEFURV9CVUxLfE1BX1NUQVRFX1BSRUFMTE9DKTsNCisNCisJd2hp bGUgKG1hcy0+YWxsb2MgJiYgISgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkgew0K KwkJbm9kZSA9IG1hcy0+YWxsb2M7DQorCQltYXMtPmFsbG9jID0gbm9kZS0+c2xvdFswXTsNCisJ CWlmIChub2RlLT5ub2RlX2NvdW50ID4gMCkNCisJCQltdF9mcmVlX2J1bGsobm9kZS0+bm9kZV9j b3VudCwNCisJCQkJICAgICAodm9pZCBfX3JjdSAqKikmbm9kZS0+c2xvdFsxXSk7DQorCQlrbWVt X2NhY2hlX2ZyZWUobWFwbGVfbm9kZV9jYWNoZSwgbm9kZSk7DQorCX0NCisJbWFzLT5hbGxvYyA9 IE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX2V4cGVjdGVkX2VudHJpZXMoKSAtIFNldCB0aGUg ZXhwZWN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB3aWxsIGJlIGluc2VydGVkLg0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBucl9lbnRyaWVzOiBUaGUgbnVtYmVyIG9mIGV4cGVj dGVkIGVudHJpZXMuDQorICoNCisgKiBUaGlzIHdpbGwgYXR0ZW1wdCB0byBwcmUtYWxsb2NhdGUg ZW5vdWdoIG5vZGVzIHRvIHN0b3JlIHRoZSBleHBlY3RlZCBudW1iZXINCisgKiBvZiBlbnRyaWVz LiAgVGhlIGFsbG9jYXRpb25zIHdpbGwgb2NjdXIgdXNpbmcgdGhlIGJ1bGsgYWxsb2NhdG9yIGlu dGVyZmFjZQ0KKyAqIGZvciBzcGVlZC4gIFBsZWFzZSBjYWxsIG1hc19kZXN0cm95KCkgb24gdGhl IEBtYXMgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBlbnRyaWVzDQorICogdG8gZW5zdXJlIGFueSB1bnVz ZWQgbm9kZXMgYXJlIGZyZWVkLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9N RU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG1hc19leHBl Y3RlZF9lbnRyaWVzKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG5yX2VudHJp ZXMpDQorew0KKwlpbnQgbm9ubGVhZl9jYXAgPSBNQVBMRV9BUkFOR0U2NF9TTE9UUyAtIDI7DQor CXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUgPSBtYXMtPm5vZGU7DQorCWludCBucl9ub2RlczsN CisJaW50IHJldDsNCisNCisJLyoNCisJICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBk dXBsaWNhdGUgYSB0cmVlIHRvIGEgbmV3IHRyZWUsIHN1Y2ggYXMNCisJICogZm9ya2luZyBhIHBy b2Nlc3MgYW5kIGR1cGxpY2F0aW5nIHRoZSBWTUFzIGZyb20gb25lIHRyZWUgdG8gYSBuZXcNCisJ ICogdHJlZS4gIFdoZW4gc3VjaCBhIHNpdHVhdGlvbiBhcmlzZXMsIGl0IGlzIGtub3duIHRoYXQg dGhlIG5ldyB0cmVlIGlzDQorCSAqIG5vdCBnb2luZyB0byBiZSB1c2VkIHVudGlsIHRoZSBlbnRp cmUgdHJlZSBpcyBwb3B1bGF0ZWQuICBGb3INCisJICogcGVyZm9ybWFuY2UgcmVhc29ucywgaXQg aXMgYmVzdCB0byB1c2UgYSBidWxrIGxvYWQgd2l0aCBSQ1UgZGlzYWJsZWQuDQorCSAqIFRoaXMg YWxsb3dzIGZvciBvcHRpbWlzdGljIHNwbGl0dGluZyB0aGF0IGZhdm91cnMgdGhlIGxlZnQgYW5k IHJldXNlDQorCSAqIG9mIG5vZGVzIGR1cmluZyB0aGUgb3BlcmF0aW9uLg0KKwkgKi8NCisNCisJ LyogT3B0aW1pemUgc3BsaXR0aW5nIGZvciBidWxrIGluc2VydCBpbi1vcmRlciAqLw0KKwltYXMt Pm1hc19mbGFncyB8PSBNQV9TVEFURV9CVUxLOw0KKw0KKwkvKg0KKwkgKiBBdm9pZCBvdmVyZmxv dywgYXNzdW1lIGEgZ2FwIGJldHdlZW4gZWFjaCBlbnRyeSBhbmQgYSB0cmFpbGluZyBudWxsLg0K KwkgKiBJZiB0aGlzIGlzIHdyb25nLCBpdCBqdXN0IG1lYW5zIGFsbG9jYXRpb24gY2FuIGhhcHBl biBkdXJpbmcNCisJICogaW5zZXJ0aW9uIG9mIGVudHJpZXMuDQorCSAqLw0KKwlucl9ub2RlcyA9 IG1heChucl9lbnRyaWVzLCBucl9lbnRyaWVzICogMiArIDEpOw0KKwlpZiAoIW10X2lzX2FsbG9j KG1hcy0+dHJlZSkpDQorCQlub25sZWFmX2NhcCA9IE1BUExFX1JBTkdFNjRfU0xPVFMgLSAyOw0K Kw0KKwkvKiBMZWF2ZXM7IHJlZHVjZSBzbG90cyB0byBrZWVwIHNwYWNlIGZvciBleHBhbnNpb24g Ki8NCisJbnJfbm9kZXMgPSBESVZfUk9VTkRfVVAobnJfbm9kZXMsIE1BUExFX1JBTkdFNjRfU0xP VFMgLSAyKTsNCisJLyogSW50ZXJuYWwgbm9kZXMgKi8NCisJbnJfbm9kZXMgKz0gRElWX1JPVU5E X1VQKG5yX25vZGVzLCBub25sZWFmX2NhcCk7DQorCS8qIEFkZCB3b3JraW5nIHJvb20gZm9yIHNw bGl0ICgyIG5vZGVzKSArIG5ldyBwYXJlbnRzICovDQorCW1hc19ub2RlX2NvdW50KG1hcywgbnJf bm9kZXMgKyAzKTsNCisNCisJLyogRGV0ZWN0IGlmIGFsbG9jYXRpb25zIHJ1biBvdXQgKi8NCisJ bWFzLT5tYXNfZmxhZ3MgfD0gTUFfU1RBVEVfUFJFQUxMT0M7DQorDQorCWlmICghbWFzX2lzX2Vy cihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldCA9IHhhX2VycihtYXMtPm5vZGUpOw0KKwlt YXMtPm5vZGUgPSBlbm9kZTsNCisJbWFzX2Rlc3Ryb3kobWFzKTsNCisJcmV0dXJuIHJldDsNCisN Cit9DQorDQorLyoqDQorICogbWFzX25leHQoKSAtIEdldCB0aGUgbmV4dCBlbnRyeS4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBpbmRleCB0byBjaGVj ay4NCisgKg0KKyAqIFJldHVybnMgdGhlIG5leHQgZW50cnkgYWZ0ZXIgQG1hcy0+aW5kZXguDQor ICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxvY2suDQorICogQ2FuIHJl dHVybiB0aGUgemVybyBlbnRyeS4NCisgKg0KKyAqIFJldHVybjogVGhlIG5leHQgZW50cnkgb3Ig JU5VTEwNCisgKi8NCit2b2lkICptYXNfbmV4dChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBtYXgpDQorew0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcGF1c2Vk KG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorDQorCWlmIChtYXNfaXNfc3RhcnQo bWFzKSkNCisJCW1hc193YWxrKG1hcyk7IC8qIFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVk IGJ5IG1hc193YWxrICovDQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykpIHsNCisJCWlmICghbWFz LT5pbmRleCkgew0KKwkJCW1hcy0+aW5kZXggPSAxOw0KKwkJCW1hcy0+bGFzdCA9IFVMT05HX01B WDsNCisJCX0NCisJCXJldHVybiBOVUxMOw0KKwl9DQorDQorCWlmIChtYXMtPmxhc3QgPT0gVUxP TkdfTUFYKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIFJldHJpZXMgb24gZGVhZCBub2RlcyBo YW5kbGVkIGJ5IG1hc19uZXh0X2VudHJ5ICovDQorCXJldHVybiBtYXNfbmV4dF9lbnRyeShtYXMs IG1heCk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19uZXh0KTsNCisNCisvKioNCisgKiBt dF9uZXh0KCkgLSBnZXQgdGhlIG5leHQgdmFsdWUgaW4gdGhlIG1hcGxlIHRyZWUNCisgKiBAbXQ6 IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQgaW5kZXgNCisgKiBAbWF4OiBU aGUgbWF4aW11bSBpbmRleCB0byBjaGVjaw0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQg QGluZGV4IG9yIGhpZ2hlciwgb3IgJU5VTEwgaWYgbm90aGluZyBpcyBmb3VuZC4NCisgKi8NCit2 b2lkICptdF9uZXh0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwg dW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorCU1BX1NUQVRF KG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorDQorCXJjdV9yZWFkX2xvY2soKTsNCisJZW50cnkg PSBtYXNfbmV4dCgmbWFzLCBtYXgpOw0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisJcmV0dXJuIGVu dHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtdF9uZXh0KTsNCisNCisvKioNCisgKiBtYXNf cHJldigpIC0gR2V0IHRoZSBwcmV2aW91cyBlbnRyeQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0 ZQ0KKyAqIEBtaW46IFRoZSBtaW5pbXVtIHZhbHVlIHRvIGNoZWNrLg0KKyAqDQorICogTXVzdCBo b2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxvY2suDQorICogV2lsbCByZXNldCBtYXMg dG8gTUFTX1NUQVJUIGlmIHRoZSBub2RlIGlzIE1BU19OT05FLiAgV2lsbCBzdG9wIG9uIG5vdA0K KyAqIHNlYXJjaGFibGUgbm9kZXMuDQorICoNCisgKiBSZXR1cm46IHRoZSBwcmV2aW91cyB2YWx1 ZSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfcHJldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCS8qIE5vdGhp bmcgY29tZXMgYmVmb3JlIDAgKi8NCisJCW1hcy0+bGFzdCA9IDA7DQorCQlyZXR1cm4gTlVMTDsN CisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3B0cihtYXMpKSkNCisJCXJldHVybiBOVUxM Ow0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQlt YXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJ bWFzX3dhbGsobWFzKTsNCisJCWlmICghbWFzLT5pbmRleCkNCisJCQlyZXR1cm4gTlVMTDsNCisJ fQ0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJ CQltYXMtPmxhc3QgPSAwOw0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0KKw0KKwkJbWFzLT5pbmRl eCA9IG1hcy0+bGFzdCA9IDA7DQorCQlyZXR1cm4gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCX0N CisJcmV0dXJuIG1hc19wcmV2X2VudHJ5KG1hcywgbWluKTsNCit9DQorRVhQT1JUX1NZTUJPTF9H UEwobWFzX3ByZXYpOw0KKw0KKy8qKg0KKyAqIG10X3ByZXYoKSAtIGdldCB0aGUgcHJldmlvdXMg dmFsdWUgaW4gdGhlIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGlu ZGV4OiBUaGUgc3RhcnQgaW5kZXgNCisgKiBAbWluOiBUaGUgbWluaW11bSBpbmRleCB0byBjaGVj aw0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQgQGluZGV4IG9yIGxvd2VyLCBvciAlTlVM TCBpZiBub3RoaW5nIGlzIGZvdW5kLg0KKyAqLw0KK3ZvaWQgKm10X3ByZXYoc3RydWN0IG1hcGxl X3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQor CXZvaWQgKmVudHJ5ID0gTlVMTDsNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGluZGV4KTsN CisNCisJcmN1X3JlYWRfbG9jaygpOw0KKwllbnRyeSA9IG1hc19wcmV2KCZtYXMsIG1pbik7DQor CXJjdV9yZWFkX3VubG9jaygpOw0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0xf R1BMKG10X3ByZXYpOw0KKw0KKy8qKg0KKyAqIG1hc19wYXVzZSgpIC0gUGF1c2UgYSBtYXNfZmlu ZC9tYXNfZm9yX2VhY2ggdG8gZHJvcCB0aGUgbG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUgdG8gcGF1c2UNCisgKg0KKyAqIFNvbWUgdXNlcnMgbmVlZCB0byBwYXVzZSBhIHdhbGsgYW5k IGRyb3AgdGhlIGxvY2sgdGhleSdyZSBob2xkaW5nIGluDQorICogb3JkZXIgdG8geWllbGQgdG8g YSBoaWdoZXIgcHJpb3JpdHkgdGhyZWFkIG9yIGNhcnJ5IG91dCBhbiBvcGVyYXRpb24NCisgKiBv biBhbiBlbnRyeS4gIFRob3NlIHVzZXJzIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3Jl IHRoZXkgZHJvcA0KKyAqIHRoZSBsb2NrLiAgSXQgcmVzZXRzIHRoZSBAbWFzIHRvIGJlIHN1aXRh YmxlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24NCisgKiBvZiB0aGUgbG9vcCBhZnRlciB0aGUgdXNl ciBoYXMgcmVhY3F1aXJlZCB0aGUgbG9jay4gIElmIG1vc3QgZW50cmllcw0KKyAqIGZvdW5kIGR1 cmluZyBhIHdhbGsgcmVxdWlyZSB5b3UgdG8gY2FsbCBtYXNfcGF1c2UoKSwgdGhlIG10X2Zvcl9l YWNoKCkNCisgKiBpdGVyYXRvciBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZS4NCisgKg0KKyAqLw0K K3ZvaWQgbWFzX3BhdXNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJbWFzLT5ub2RlID0g TUFTX1BBVVNFOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtYXNfcGF1c2UpOw0KKw0KKy8qKg0K KyAqIG1hc19maW5kKCkgLSBPbiB0aGUgZmlyc3QgY2FsbCwgZmluZCB0aGUgZW50cnkgYXQgb3Ig YWZ0ZXIgbWFzLT5pbmRleCB1cCB0bw0KKyAqICVtYXguICBPdGhlcndpc2UsIGZpbmQgdGhlIGVu dHJ5IGFmdGVyIG1hcy0+aW5kZXguDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1h eDogVGhlIG1heGltdW0gdmFsdWUgdG8gY2hlY2suDQorICoNCisgKiBNdXN0IGhvbGQgcmN1X3Jl YWRfbG9jayBvciB0aGUgd3JpdGUgbG9jay4NCisgKiBJZiBhbiBlbnRyeSBleGlzdHMsIGxhc3Qg YW5kIGluZGV4IGFyZSB1cGRhdGVkIGFjY29yZGluZ2x5Lg0KKyAqIE1heSBzZXQgQG1hcy0+bm9k ZSB0byBNQVNfTk9ORS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IG9yICVOVUxMLg0KKyAq Lw0KK3ZvaWQgKm1hc19maW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1h eCkNCit7DQorCWlmICh1bmxpa2VseShtYXNfaXNfcGF1c2VkKG1hcykpKSB7DQorCQlpZiAodW5s aWtlbHkobWFzLT5sYXN0ID09IFVMT05HX01BWCkpIHsNCisJCQltYXMtPm5vZGUgPSBNQVNfTk9O RTsNCisJCQlyZXR1cm4gTlVMTDsNCisJCX0NCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJ CW1hcy0+aW5kZXggPSArK21hcy0+bGFzdDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lz X3N0YXJ0KG1hcykpKSB7DQorCQkvKiBGaXJzdCBydW4gb3IgY29udGludWUgKi8NCisJCXZvaWQg KmVudHJ5Ow0KKw0KKwkJaWYgKG1hcy0+aW5kZXggPiBtYXgpDQorCQkJcmV0dXJuIE5VTEw7DQor DQorCQllbnRyeSA9IG1hc193YWxrKG1hcyk7DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGVu dHJ5Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseSghbWFzX3NlYXJjaGFibGUobWFzKSkpDQorCQly ZXR1cm4gTlVMTDsNCisNCisJLyogUmV0cmllcyBvbiBkZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFz X25leHRfZW50cnkgKi8NCisJcmV0dXJuIG1hc19uZXh0X2VudHJ5KG1hcywgbWF4KTsNCit9DQor DQorLyoqDQorICogbWFzX2ZpbmRfcmV2OiBPbiB0aGUgZmlyc3QgY2FsbCwgZmluZCB0aGUgZmly c3Qgbm9uLW51bGwgZW50cnkgYXQgb3IgYmVsb3cNCisgKiBtYXMtPmluZGV4IGRvd24gdG8gJW1p bi4gIE90aGVyd2lzZSBmaW5kIHRoZSBmaXJzdCBub24tbnVsbCBlbnRyeSBiZWxvdw0KKyAqIG1h cy0+aW5kZXggZG93biB0byAlbWluLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBt aW46IFRoZSBtaW5pbXVtIHZhbHVlIHRvIGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9y ZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxvY2suDQorICogSWYgYW4gZW50cnkgZXhpc3RzLCBsYXN0 IGFuZCBpbmRleCBhcmUgdXBkYXRlZCBhY2NvcmRpbmdseS4NCisgKiBNYXkgc2V0IEBtYXMtPm5v ZGUgdG8gTUFTX05PTkUuDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBvciAlTlVMTC4NCisg Ki8NCit2b2lkICptYXNfZmluZF9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxv bmcgbWluKQ0KK3sNCisJaWYgKHVubGlrZWx5KG1hc19pc19wYXVzZWQobWFzKSkpIHsNCisJCWlm ICh1bmxpa2VseShtYXMtPmxhc3QgPT0gVUxPTkdfTUFYKSkgew0KKwkJCW1hcy0+bm9kZSA9IE1B U19OT05FOw0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJU Ow0KKwkJbWFzLT5sYXN0ID0gLS1tYXMtPmluZGV4Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseSht YXNfaXNfc3RhcnQobWFzKSkpIHsNCisJCS8qIEZpcnN0IHJ1biBvciBjb250aW51ZSAqLw0KKwkJ dm9pZCAqZW50cnk7DQorDQorCQlpZiAobWFzLT5pbmRleCA8IG1pbikNCisJCQlyZXR1cm4gTlVM TDsNCisNCisJCWVudHJ5ID0gbWFzX3dhbGsobWFzKTsNCisJCWlmIChlbnRyeSkNCisJCQlyZXR1 cm4gZW50cnk7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KCFtYXNfc2VhcmNoYWJsZShtYXMpKSkN CisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFzLT5pbmRleCA8IG1pbikNCisJCXJldHVybiBO VUxMOw0KKw0KKwkvKiBSZXRyaWVzIG9uIGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfbmV4dF9l bnRyeSAqLw0KKwlyZXR1cm4gbWFzX3ByZXZfZW50cnkobWFzLCBtaW4pOw0KK30NCitFWFBPUlRf U1lNQk9MX0dQTChtYXNfZmluZCk7DQorDQorLyoqDQorICogbWFzX2VyYXNlKCkgLSBGaW5kIHRo ZSByYW5nZSBpbiB3aGljaCBpbmRleCByZXNpZGVzIGFuZCBlcmFzZSB0aGUgZW50aXJlDQorICog cmFuZ2UuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBNdXN0IGhvbGQgdGhl IHdyaXRlIGxvY2suDQorICogU2VhcmNoZXMgZm9yIEBtYXMtPmluZGV4LCBzZXRzIEBtYXMtPmlu ZGV4IGFuZCBAbWFzLT5sYXN0IHRvIHRoZSByYW5nZSBhbmQNCisgKiBlcmFzZXMgdGhhdCByYW5n ZS4NCisgKg0KKyAqIFJldHVybjogdGhlIGVudHJ5IHRoYXQgd2FzIGVyYXNlZCBvciAlTlVMTCwg QG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3QgYXJlIHVwZGF0ZWQuDQorICovDQordm9pZCAqbWFz X2VyYXNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorCU1BX1dS X1NUQVRFKHdyX21hcywgbWFzLCBOVUxMKTsNCisNCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwg bWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKw0KKwkvKiBS ZXRyeSB1bm5lY2Vzc2FyeSB3aGVuIGhvbGRpbmcgdGhlIHdyaXRlIGxvY2suICovDQorCWVudHJ5 ID0gbWFzX3N0YXRlX3dhbGsobWFzKTsNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0K Kw0KK3dyaXRlX3JldHJ5Og0KKwkvKiBNdXN0IHJlc2V0IHRvIGVuc3VyZSBzcGFubmluZyB3cml0 ZXMgb2YgbGFzdCBzbG90IGFyZSBkZXRlY3RlZCAqLw0KKwltYXNfcmVzZXQobWFzKTsNCisJbWFz X3dyX3N0b3JlX3NldHVwKCZ3cl9tYXMpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7 DQorCWlmIChtYXNfbm9tZW0obWFzLCBHRlBfS0VSTkVMKSkNCisJCWdvdG8gd3JpdGVfcmV0cnk7 DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX2VyYXNlKTsN CisNCisvKioNCisgKiBtYXNfbm9tZW0oKSAtIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBh bGxvY2F0aW5nIGFuZCBkbyB0aGUgYWxsb2NhdGlvbg0KKyAqIGlmIG5lY2Vzc2FyeSBJZiB0aGVy ZSBhcmUgYWxsb2NhdGlvbnMsIHRoZW4gZnJlZSB0aGVtLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucw0KKyAq IFJldHVybjogdHJ1ZSBvbiBhbGxvY2F0aW9uLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorYm9v bCBtYXNfbm9tZW0oc3RydWN0IG1hX3N0YXRlICptYXMsIGdmcF90IGdmcCkNCisJX19tdXN0X2hv bGQobWFzLT50cmVlLT5sb2NrKQ0KK3sNCisJaWYgKGxpa2VseShtYXMtPm5vZGUgIT0gTUFfRVJS T1IoLUVOT01FTSkpKSB7DQorCQltYXNfZGVzdHJveShtYXMpOw0KKwkJcmV0dXJuIGZhbHNlOw0K Kwl9DQorDQorCWlmIChnZnBmbGFnc19hbGxvd19ibG9ja2luZyhnZnApICYmICFtdF9leHRlcm5h bF9sb2NrKG1hcy0+dHJlZSkpIHsNCisJCW10cmVlX3VubG9jayhtYXMtPnRyZWUpOw0KKwkJbWFz X2FsbG9jX25vZGVzKG1hcywgZ2ZwKTsNCisJCW10cmVlX2xvY2sobWFzLT50cmVlKTsNCisJfSBl bHNlIHsNCisJCW1hc19hbGxvY19ub2RlcyhtYXMsIGdmcCk7DQorCX0NCisNCisJaWYgKCFtYXNf YWxsb2NhdGVkKG1hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCW1hcy0+bm9kZSA9IE1BU19T VEFSVDsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgX19pbml0IG1hcGxlX3RyZWVfaW5p dCh2b2lkKQ0KK3sNCisJbWFwbGVfbm9kZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJtYXBs ZV9ub2RlIiwNCisJCQlzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpLCBzaXplb2Yoc3RydWN0IG1h cGxlX25vZGUpLA0KKwkJCVNMQUJfUEFOSUMsIE5VTEwpOw0KK30NCisNCisvKioNCisgKiBtdHJl ZV9sb2FkKCkgLSBMb2FkIGEgdmFsdWUgc3RvcmVkIGluIGEgbWFwbGUgdHJlZQ0KKyAqIEBtdDog VGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byBsb2FkDQorICoNCisgKiBS ZXR1cm46IHRoZSBlbnRyeSBvciAlTlVMTA0KKyAqLw0KK3ZvaWQgKm10cmVlX2xvYWQoc3RydWN0 IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4KQ0KK3sNCisJTUFfU1RBVEUobWFz LCBtdCwgaW5kZXgsIGluZGV4KTsNCisJdm9pZCAqZW50cnk7DQorDQorCXRyYWNlX21hX3JlYWQo X19mdW5jX18sICZtYXMpOw0KKwlyY3VfcmVhZF9sb2NrKCk7DQorcmV0cnk6DQorCWVudHJ5ID0g bWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAodW5saWtlbHkobWFzX2lzX25vbmUoJm1hcykpKQ0KKwkJ Z290byB1bmxvY2s7DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfcHRyKCZtYXMpKSkgew0KKwkJ aWYgKGluZGV4KQ0KKwkJCWVudHJ5ID0gTlVMTDsNCisNCisJCWdvdG8gdW5sb2NrOw0KKwl9DQor DQorCWVudHJ5ID0gbXRyZWVfbG9va3VwX3dhbGsoJm1hcyk7DQorCWlmICghZW50cnkgJiYgdW5s aWtlbHkobWFzX2lzX3N0YXJ0KCZtYXMpKSkNCisJCWdvdG8gcmV0cnk7DQordW5sb2NrOg0KKwly Y3VfcmVhZF91bmxvY2soKTsNCisJaWYgKHhhX2lzX3plcm8oZW50cnkpKQ0KKwkJcmV0dXJuIE5V TEw7DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9sb2FkKTsN CisNCisvKioNCisgKiBtdHJlZV9zdG9yZV9yYW5nZSgpIC0gU3RvcmUgYW4gZW50cnkgYXQgYSBn aXZlbiByYW5nZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3Rh cnQgb2YgdGhlIHJhbmdlDQorICogQGxhc3Q6IFRoZSBlbmQgb2YgdGhlIHJhbmdlDQorICogQGVu dHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBAZ2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBm b3IgYWxsb2NhdGlvbnMNCisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9u IGludmFsaWQgcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90DQorICogYmUgYWxs b2NhdGVkLg0KKyAqLw0KK2ludCBtdHJlZV9zdG9yZV9yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAq bXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsDQorCQl1bnNpZ25lZCBsb25nIGxhc3QsIHZvaWQgKmVu dHJ5LCBnZnBfdCBnZnApDQorew0KKwlNQV9TVEFURShtYXMsIG10LCBpbmRleCwgbGFzdCk7DQor CU1BX1dSX1NUQVRFKHdyX21hcywgJm1hcywgZW50cnkpOw0KKw0KKwl0cmFjZV9tYV93cml0ZShf X2Z1bmNfXywgJm1hcywgMCwgZW50cnkpOw0KKwlpZiAoV0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFu Y2VkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKGluZGV4ID4gbGFzdCkN CisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJbWFz X3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlpZiAobWFzX25vbWVtKCZtYXMsIGdmcCkpDQor CQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91bmxvY2sobXQpOw0KKwlpZiAobWFzX2lzX2Vycigm bWFzKSkNCisJCXJldHVybiB4YV9lcnIobWFzLm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQor RVhQT1JUX1NZTUJPTChtdHJlZV9zdG9yZV9yYW5nZSk7DQorDQorLyoqDQorICogbXRyZWVfc3Rv cmUoKSAtIFN0b3JlIGFuIGVudHJ5IGF0IGEgZ2l2ZW4gaW5kZXguDQorICogQG10OiBUaGUgbWFw bGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIGluZGV4IHRvIHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBl bnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2Ug Zm9yIGFsbG9jYXRpb25zDQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBv biBpbnZhbGlkIHJlcXVlc3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFs bG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfc3RvcmUoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1 bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICplbnRyeSwNCisJCSBnZnBfdCBnZnApDQorew0KKwly ZXR1cm4gbXRyZWVfc3RvcmVfcmFuZ2UobXQsIGluZGV4LCBpbmRleCwgZW50cnksIGdmcCk7DQor fQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfc3RvcmUpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2luc2Vy dF9yYW5nZSgpIC0gSW5zZXJ0IGFuIGVudHJ5IGF0IGEgZ2l2ZSByYW5nZSBpZiB0aGVyZSBpcyBu byB2YWx1ZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGZpcnN0OiBUaGUgc3RhcnQg b2YgdGhlIHJhbmdlDQorICogQGxhc3Q6IFRoZSBlbmQgb2YgdGhlIHJhbmdlDQorICogQGVudHJ5 OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBAZ2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3Ig YWxsb2NhdGlvbnMuDQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVFWElTVFMgaWYg dGhlIHJhbmdlIGlzIG9jY3VwaWVkLCAtRUlOVkFMIG9uIGludmFsaWQNCisgKiByZXF1ZXN0LCAt RU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtdHJl ZV9pbnNlcnRfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0 LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJ TUFfU1RBVEUobXMsIG10LCBmaXJzdCwgbGFzdCk7DQorDQorCWlmIChXQVJOX09OX09OQ0UoeGFf aXNfYWR2YW5jZWQoZW50cnkpKSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoZmlyc3Qg PiBsYXN0KQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5 Og0KKwltYXNfaW5zZXJ0KCZtcywgZW50cnkpOw0KKwlpZiAobWFzX25vbWVtKCZtcywgZ2ZwKSkN CisJCWdvdG8gcmV0cnk7DQorDQorCW10cmVlX3VubG9jayhtdCk7DQorCWlmIChtYXNfaXNfZXJy KCZtcykpDQorCQlyZXR1cm4geGFfZXJyKG1zLm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQor RVhQT1JUX1NZTUJPTChtdHJlZV9pbnNlcnRfcmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2lu c2VydCgpIC0gSW5zZXJ0IGFuIGVudHJ5IGF0IGEgZ2l2ZSBpbmRleCBpZiB0aGVyZSBpcyBubyB2 YWx1ZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4IDogVGhlIGluZGV4IHRv IHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdm cDogVGhlIEZHUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJu OiAwIG9uIHN1Y2Nlc3MsIC1FRVhJU1RTIGlmIHRoZSByYW5nZSBpcyBvY2N1cGllZCwgLUVJTlZB TCBvbiBpbnZhbGlkDQorICogcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJl IGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfaW5zZXJ0KHN0cnVjdCBtYXBsZV90cmVlICpt dCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqZW50cnksDQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sN CisJcmV0dXJuIG10cmVlX2luc2VydF9yYW5nZShtdCwgaW5kZXgsIGluZGV4LCBlbnRyeSwgZ2Zw KTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9pbnNlcnQpOw0KKw0KK2ludCBtdHJlZV9hbGxv Y19yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKnN0YXJ0cCwNCisJ CXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJ dW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdmcCkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlN QV9TVEFURShtYXMsIG10LCBtaW4sIG1heCAtIHNpemUpOw0KKwlpZiAoIW10X2lzX2FsbG9jKG10 KSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoV0FSTl9PTl9PTkNFKG10X2lzX3Jlc2Vy dmVkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKG1pbiA+IG1heCkNCisJ CXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWF4IDwgc2l6ZSkNCisJCXJldHVybiAtRUlOVkFM Ow0KKw0KKwlpZiAoIXNpemUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJbXRyZWVfbG9jayht dCk7DQorcmV0cnk6DQorCW1hcy5vZmZzZXQgPSAwOw0KKwltYXMuaW5kZXggPSBtaW47DQorCW1h cy5sYXN0ID0gbWF4IC0gc2l6ZTsNCisJcmV0ID0gbWFzX2FsbG9jKCZtYXMsIGVudHJ5LCBzaXpl LCBzdGFydHApOw0KKwlpZiAobWFzX25vbWVtKCZtYXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0K Kw0KKwltdHJlZV91bmxvY2sobXQpOw0KKwlyZXR1cm4gcmV0Ow0KK30NCitFWFBPUlRfU1lNQk9M KG10cmVlX2FsbG9jX3JhbmdlKTsNCisNCitpbnQgbXRyZWVfYWxsb2NfcnJhbmdlKHN0cnVjdCBt YXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqc3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVu c2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1h eCwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJaW50IHJldCA9IDA7DQorDQorCU1BX1NUQVRFKG1hcywgbXQs IG1pbiwgbWF4IC0gc2l6ZSk7DQorCWlmICghbXRfaXNfYWxsb2MobXQpKQ0KKwkJcmV0dXJuIC1F SU5WQUw7DQorDQorCWlmIChXQVJOX09OX09OQ0UobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKSkNCisJ CXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWluID49IG1heCkNCisJCXJldHVybiAtRUlOVkFM Ow0KKw0KKwlpZiAobWF4IDwgc2l6ZSAtIDEpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYg KCFzaXplKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5 Og0KKwlyZXQgPSBtYXNfcmV2X2FsbG9jKCZtYXMsIG1pbiwgbWF4LCBlbnRyeSwgc2l6ZSwgc3Rh cnRwKTsNCisJaWYgKG1hc19ub21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJ bXRyZWVfdW5sb2NrKG10KTsNCisJcmV0dXJuIHJldDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJl ZV9hbGxvY19ycmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2VyYXNlKCkgLSBGaW5kIGFuIGlu ZGV4IGFuZCBlcmFzZSB0aGUgZW50aXJlIHJhbmdlLg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUN CisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byBlcmFzZQ0KKyAqDQorICogRXJhc2luZyBpcyB0aGUg c2FtZSBhcyBhIHdhbGsgdG8gYW4gZW50cnkgdGhlbiBhIHN0b3JlIG9mIGEgTlVMTCB0byB0aGF0 DQorICogRU5USVJFIHJhbmdlLiAgSW4gZmFjdCwgaXQgaXMgaW1wbGVtZW50ZWQgYXMgc3VjaCB1 c2luZyB0aGUgYWR2YW5jZWQgQVBJLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgc3RvcmVk IGF0IHRoZSBAaW5kZXggb3IgJU5VTEwNCisgKi8NCit2b2lkICptdHJlZV9lcmFzZShzdHJ1Y3Qg bWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKwl2b2lkICplbnRyeSA9 IE5VTEw7DQorDQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorCXRyYWNlX21h X29wKF9fZnVuY19fLCAmbWFzKTsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorCWVudHJ5ID0gbWFz X2VyYXNlKCZtYXMpOw0KKwltdHJlZV91bmxvY2sobXQpOw0KKw0KKwlyZXR1cm4gZW50cnk7DQor fQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfZXJhc2UpOw0KKw0KKy8qKg0KKyAqIF9fbXRfZGVzdHJv eSgpIC0gV2FsayBhbmQgZnJlZSBhbGwgbm9kZXMgb2YgYSBsb2NrZWQgbWFwbGUgdHJlZS4NCisg KiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICoNCisgKiBOb3RlOiBEb2VzIG5vdCBoYW5kbGUgbG9j a2luZy4NCisgKi8NCit2b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQor ew0KKwl2b2lkICpyb290ID0gbXRfcm9vdF9sb2NrZWQobXQpOw0KKw0KKwlyY3VfYXNzaWduX3Bv aW50ZXIobXQtPm1hX3Jvb3QsIE5VTEwpOw0KKwlpZiAoeGFfaXNfbm9kZShyb290KSkNCisJCW10 ZV9kZXN0cm95X3dhbGsocm9vdCwgbXQpOw0KKw0KKwltdC0+bWFfZmxhZ3MgPSAwOw0KK30NCitF WFBPUlRfU1lNQk9MX0dQTChfX210X2Rlc3Ryb3kpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2Rlc3Ry b3koKSAtIERlc3Ryb3kgYSBtYXBsZSB0cmVlDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAq DQorICogRnJlZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSB0cmVlLiAgSGFuZGxlcyBsb2Nr aW5nLg0KKyAqLw0KK3ZvaWQgbXRyZWVfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQor ew0KKwltdHJlZV9sb2NrKG10KTsNCisJX19tdF9kZXN0cm95KG10KTsNCisJbXRyZWVfdW5sb2Nr KG10KTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9kZXN0cm95KTsNCisNCisvKioNCisgKiBt dF9maW5kKCkgLSBTZWFyY2ggZnJvbSB0aGUgc3RhcnQgdXAgdW50aWwgYW4gZW50cnkgaXMgZm91 bmQuDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogUG9pbnRlciB3aGljaCBj b250YWlucyB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIHNlYXJjaA0KKyAqIEBtYXg6IFRoZSBt YXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICoNCisgKiBIYW5kbGVzIGxvY2tpbmcuICBAaW5kZXgg d2lsbCBiZSBpbmNyZW1lbnRlZCB0byBvbmUgYmV5b25kIHRoZSByYW5nZS4NCisgKg0KKyAqIFJl dHVybjogVGhlIGVudHJ5IGF0IG9yIGFmdGVyIHRoZSBAaW5kZXggb3IgJU5VTEwNCisgKi8NCit2 b2lkICptdF9maW5kKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgs IHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJTUFfU1RBVEUobWFzLCBtdCwgKmluZGV4LCAqaW5k ZXgpOw0KKwl2b2lkICplbnRyeTsNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisJ dW5zaWduZWQgbG9uZyBjb3B5ID0gKmluZGV4Ow0KKyNlbmRpZg0KKw0KKwl0cmFjZV9tYV9yZWFk KF9fZnVuY19fLCAmbWFzKTsNCisNCisJaWYgKCgqaW5kZXgpID4gbWF4KQ0KKwkJcmV0dXJuIE5V TEw7DQorDQorCXJjdV9yZWFkX2xvY2soKTsNCityZXRyeToNCisJZW50cnkgPSBtYXNfc3RhdGVf d2FsaygmbWFzKTsNCisJaWYgKG1hc19pc19zdGFydCgmbWFzKSkNCisJCWdvdG8gcmV0cnk7DQor DQorCWlmICh1bmxpa2VseSh4YV9pc196ZXJvKGVudHJ5KSkpDQorCQllbnRyeSA9IE5VTEw7DQor DQorCWlmIChlbnRyeSkNCisJCWdvdG8gdW5sb2NrOw0KKw0KKwl3aGlsZSAobWFzX3NlYXJjaGFi bGUoJm1hcykgJiYgKG1hcy5pbmRleCA8IG1heCkpIHsNCisJCWVudHJ5ID0gbWFzX25leHRfZW50 cnkoJm1hcywgbWF4KTsNCisJCWlmIChsaWtlbHkoZW50cnkgJiYgIXhhX2lzX3plcm8oZW50cnkp KSkNCisJCQlicmVhazsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkoeGFfaXNfemVybyhlbnRyeSkp KQ0KKwkJZW50cnkgPSBOVUxMOw0KK3VubG9jazoNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCWlm IChsaWtlbHkoZW50cnkpKSB7DQorCQkqaW5kZXggPSBtYXMubGFzdCArIDE7DQorI2lmZGVmIENP TkZJR19ERUJVR19NQVBMRV9UUkVFDQorCQlpZiAoKCppbmRleCkgJiYgKCppbmRleCkgPD0gY29w eSkNCisJCQlwcl9lcnIoImluZGV4IG5vdCBpbmNyZWFzZWQhICVseCA8PSAlbHhcbiIsDQorCQkJ ICAgICAgICppbmRleCwgY29weSk7DQorCQlNVF9CVUdfT04obXQsICgqaW5kZXgpICYmICgoKmlu ZGV4KSA8PSBjb3B5KSk7DQorI2VuZGlmDQorCX0NCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitF WFBPUlRfU1lNQk9MKG10X2ZpbmQpOw0KKw0KKy8qKg0KKyAqIG10X2ZpbmRfYWZ0ZXIoKSAtIFNl YXJjaCBmcm9tIHRoZSBzdGFydCB1cCB1bnRpbCBhbiBlbnRyeSBpcyBmb3VuZC4NCisgKiBAbXQ6 IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBQb2ludGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBz dGFydCBsb2NhdGlvbiBvZiB0aGUgc2VhcmNoDQorICogQG1heDogVGhlIG1heGltdW0gdmFsdWUg dG8gY2hlY2sNCisgKg0KKyAqIEhhbmRsZXMgbG9ja2luZywgZGV0ZWN0cyB3cmFwcGluZyBvbiBp bmRleCA9PSAwDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBhdCBvciBhZnRlciB0aGUgQGlu ZGV4IG9yICVOVUxMDQorICovDQordm9pZCAqbXRfZmluZF9hZnRlcihzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LA0KKwkJICAgIHVuc2lnbmVkIGxvbmcgbWF4KQ0K K3sNCisJaWYgKCEoKmluZGV4KSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyZXR1cm4gbXRfZmlu ZChtdCwgaW5kZXgsIG1heCk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRfZmluZF9hZnRlcik7DQor DQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorYXRvbWljX3QgbWFwbGVfdHJlZV90 ZXN0c19ydW47DQorRVhQT1JUX1NZTUJPTF9HUEwobWFwbGVfdHJlZV90ZXN0c19ydW4pOw0KK2F0 b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkOw0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcGxl X3RyZWVfdGVzdHNfcGFzc2VkKTsNCisNCisjaWZuZGVmIF9fS0VSTkVMX18NCitleHRlcm4gdm9p ZCBrbWVtX2NhY2hlX3NldF9ub25fa2VybmVsKHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVk IGludCk7DQordm9pZCBtdF9zZXRfbm9uX2tlcm5lbCh1bnNpZ25lZCBpbnQgdmFsKQ0KK3sNCisJ a21lbV9jYWNoZV9zZXRfbm9uX2tlcm5lbChtYXBsZV9ub2RlX2NhY2hlLCB2YWwpOw0KK30NCisN CitleHRlcm4gdW5zaWduZWQgbG9uZyBrbWVtX2NhY2hlX2dldF9hbGxvYyhzdHJ1Y3Qga21lbV9j YWNoZSAqKTsNCit1bnNpZ25lZCBsb25nIG10X2dldF9hbGxvY19zaXplKHZvaWQpDQorew0KKwly ZXR1cm4ga21lbV9jYWNoZV9nZXRfYWxsb2MobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4 dGVybiB2b2lkIGttZW1fY2FjaGVfemVyb19ucl90YWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hl ICopOw0KK3ZvaWQgbXRfemVyb19ucl90YWxsb2NhdGVkKHZvaWQpDQorew0KKwlrbWVtX2NhY2hl X3plcm9fbnJfdGFsbG9jYXRlZChtYXBsZV9ub2RlX2NhY2hlKTsNCit9DQorDQorZXh0ZXJuIHVu c2lnbmVkIGludCBrbWVtX2NhY2hlX25yX3RhbGxvY2F0ZWQoc3RydWN0IGttZW1fY2FjaGUgKik7 DQordW5zaWduZWQgaW50IG10X25yX3RhbGxvY2F0ZWQodm9pZCkNCit7DQorCXJldHVybiBrbWVt X2NhY2hlX25yX3RhbGxvY2F0ZWQobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4dGVybiB1 bnNpZ25lZCBpbnQga21lbV9jYWNoZV9ucl9hbGxvY2F0ZWQoc3RydWN0IGttZW1fY2FjaGUgKik7 DQordW5zaWduZWQgaW50IG10X25yX2FsbG9jYXRlZCh2b2lkKQ0KK3sNCisJcmV0dXJuIGttZW1f Y2FjaGVfbnJfYWxsb2NhdGVkKG1hcGxlX25vZGVfY2FjaGUpOw0KK30NCisNCisvKg0KKyAqIG1h c19kZWFkX25vZGUoKSAtIENoZWNrIGlmIHRoZSBtYXBsZSBzdGF0ZSBpcyBwb2ludGluZyB0byBh IGRlYWQgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaW5kZXg6IFRoZSBp bmRleCB0byByZXN0b3JlIGluIEBtYXMuDQorICoNCisgKiBVc2VkIGluIHRlc3QgY29kZS4NCisg KiBSZXR1cm46IDEgaWYgQG1hcyBoYXMgYmVlbiByZXNldCB0byBNQVNfU1RBUlQsIDAgb3RoZXJ3 aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19kZWFkX25vZGUoc3RydWN0IG1hX3N0 YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKwlpZiAodW5saWtlbHkoIW1hc19z ZWFyY2hhYmxlKG1hcykgfHwgbWFzX2lzX3N0YXJ0KG1hcykpKQ0KKwkJcmV0dXJuIDA7DQorDQor CWlmIChsaWtlbHkoIW10ZV9kZWFkX25vZGUobWFzLT5ub2RlKSkpDQorCQlyZXR1cm4gMDsNCisN CisJbWFzX3Jld2FsayhtYXMsIGluZGV4KTsNCisJcmV0dXJuIDE7DQorfQ0KKyNlbmRpZiAvKiBu b3QgZGVmaW5lZCBfX0tFUk5FTF9fICovDQorDQorLyoNCisgKiBtYXNfZ2V0X3Nsb3QoKSAtIEdl dCB0aGUgZW50cnkgaW4gdGhlIG1hcGxlIHN0YXRlIG5vZGUgc3RvcmVkIGF0IEBvZmZzZXQuDQor ICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRo ZSBzbG90IGFycmF5IHRvIGZldGNoLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgc3RvcmVk IGF0IEBvZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1h c19nZXRfc2xvdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCXVuc2lnbmVkIGNoYXIgb2Zmc2V0 KQ0KK3sNCisJcmV0dXJuIG1hc19zbG90KG1hcywgbWFfc2xvdHMobWFzX21uKG1hcyksIG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKSksDQorCQkJb2Zmc2V0KTsNCit9DQorDQorDQorLyoNCisgKiBt YXNfZmlyc3RfZW50cnkoKSAtIEdvIHRoZSBmaXJzdCBsZWFmIGFuZCBmaW5kIHRoZSBmaXJzdCBl bnRyeS4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUuDQorICogQGxpbWl0OiB0aGUgbWF4aW11 bSBpbmRleCB0byBjaGVjay4NCisgKiBAKnJfc3RhcnQ6IFBvaW50ZXIgdG8gc2V0IHRvIHRoZSBy YW5nZSBzdGFydC4NCisgKg0KKyAqIFNldHMgbWFzLT5vZmZzZXQgdG8gdGhlIG9mZnNldCBvZiB0 aGUgZW50cnksIHJfc3RhcnQgdG8gdGhlIHJhbmdlIG1pbmltdW0uDQorICoNCisgKiBSZXR1cm46 IFRoZSBmaXJzdCBlbnRyeSBvciBNQVNfTk9ORS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQg Km1hc19maXJzdF9lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUg Km1uLA0KKwkJdW5zaWduZWQgbG9uZyBsaW1pdCwgZW51bSBtYXBsZV90eXBlIG10KQ0KKw0KK3sN CisJdW5zaWduZWQgbG9uZyBtYXg7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdm9pZCBf X3JjdSAqKnNsb3RzOw0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorDQorCW1hcy0+aW5kZXggPSBt YXMtPm1pbjsNCisJaWYgKG1hcy0+aW5kZXggPiBsaW1pdCkNCisJCWdvdG8gbm9uZTsNCisNCisJ bWF4ID0gbWFzLT5tYXg7DQorCW1hcy0+b2Zmc2V0ID0gMDsNCisJd2hpbGUgKGxpa2VseSghbWFf aXNfbGVhZihtdCkpKSB7DQorCQlNVF9CVUdfT04obWFzLT50cmVlLCBtdGVfZGVhZF9ub2RlKG1h cy0+bm9kZSkpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhtbiwgbXQpOw0KKwkJcGl2b3RzID0gbWFf cGl2b3RzKG1uLCBtdCk7DQorCQltYXggPSBwaXZvdHNbMF07DQorCQllbnRyeSA9IG1hc19zbG90 KG1hcywgc2xvdHMsIDApOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKQ0KKwkJ CXJldHVybiBOVUxMOw0KKwkJbWFzLT5ub2RlID0gZW50cnk7DQorCQltbiA9IG1hc19tbihtYXMp Ow0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCX0NCisJTVRfQlVHX09OKG1h cy0+dHJlZSwgbXRlX2RlYWRfbm9kZShtYXMtPm5vZGUpKTsNCisNCisJbWFzLT5tYXggPSBtYXg7 DQorCXNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsNCisJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNs b3RzLCAwKTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKQ0KKwkJcmV0dXJuIE5V TEw7DQorDQorCS8qIFNsb3QgMCBvciAxIG11c3QgYmUgc2V0ICovDQorCWlmIChtYXMtPmluZGV4 ID4gbGltaXQpDQorCQlnb3RvIG5vbmU7DQorDQorCWlmIChsaWtlbHkoZW50cnkpKQ0KKwkJcmV0 dXJuIGVudHJ5Ow0KKw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobW4sIG10KTsNCisJbWFzLT5pbmRl eCA9IHBpdm90c1swXSArIDE7DQorCW1hcy0+b2Zmc2V0ID0gMTsNCisJZW50cnkgPSBtYXNfc2xv dChtYXMsIHNsb3RzLCAxKTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKQ0KKwkJ cmV0dXJuIE5VTEw7DQorDQorCWlmIChtYXMtPmluZGV4ID4gbGltaXQpDQorCQlnb3RvIG5vbmU7 DQorDQorCWlmIChsaWtlbHkoZW50cnkpKQ0KKwkJcmV0dXJuIGVudHJ5Ow0KKw0KK25vbmU6DQor CWlmIChsaWtlbHkoIW1hX2RlYWRfbm9kZShtbikpKQ0KKwkJbWFzLT5ub2RlID0gTUFTX05PTkU7 DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKiBEZXB0aCBmaXJzdCBzZWFyY2gsIHBvc3Qtb3Jk ZXIgKi8NCitzdGF0aWMgdm9pZCBtYXNfZGZzX3Bvc3RvcmRlcihzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnAgPSBN QVNfTk9ORSwgKm1uID0gbWFzLT5ub2RlOw0KKwl1bnNpZ25lZCBsb25nIHBfbWluLCBwX21heDsN CisNCisJbWFzX25leHRfbm9kZShtYXMsIG1hc19tbihtYXMpLCBtYXgpOw0KKwlpZiAoIW1hc19p c19ub25lKG1hcykpDQorCQlyZXR1cm47DQorDQorCWlmIChtdGVfaXNfcm9vdChtbikpDQorCQly ZXR1cm47DQorDQorCW1hcy0+bm9kZSA9IG1uOw0KKwltYXNfYXNjZW5kKG1hcyk7DQorCXdoaWxl IChtYXMtPm5vZGUgIT0gTUFTX05PTkUpIHsNCisJCXAgPSBtYXMtPm5vZGU7DQorCQlwX21pbiA9 IG1hcy0+bWluOw0KKwkJcF9tYXggPSBtYXMtPm1heDsNCisJCW1hc19wcmV2X25vZGUobWFzLCAw KTsNCisJfQ0KKw0KKwlpZiAocCA9PSBNQVNfTk9ORSkNCisJCXJldHVybjsNCisNCisJbWFzLT5u b2RlID0gcDsNCisJbWFzLT5tYXggPSBwX21heDsNCisJbWFzLT5taW4gPSBwX21pbjsNCit9DQor DQorLyogVHJlZSB2YWxpZGF0aW9ucyAqLw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfbm9kZShjb25z dCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJdW5zaWduZWQgbG9uZyBt aW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBpbnQgZGVwdGgpOw0KK3N0YXRpYyB2b2lk IG10X2R1bXBfcmFuZ2UodW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LA0KKwkJ CSAgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RhdGljIGNvbnN0IGNoYXIgc3BhY2VzW10g PSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOw0KKw0KKwlpZiAobWluID09IG1h eCkNCisJCXByX2luZm8oIiUuKnMlbHU6ICIsIGRlcHRoICogMiwgc3BhY2VzLCBtaW4pOw0KKwll bHNlDQorCQlwcl9pbmZvKCIlLipzJWx1LSVsdTogIiwgZGVwdGggKiAyLCBzcGFjZXMsIG1pbiwg bWF4KTsNCit9DQorDQorc3RhdGljIHZvaWQgbXRfZHVtcF9lbnRyeSh2b2lkICplbnRyeSwgdW5z aWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LA0KKwkJCSAgdW5zaWduZWQgaW50IGRl cHRoKQ0KK3sNCisJbXRfZHVtcF9yYW5nZShtaW4sIG1heCwgZGVwdGgpOw0KKw0KKwlpZiAoeGFf aXNfdmFsdWUoZW50cnkpKQ0KKwkJcHJfY29udCgidmFsdWUgJWxkICgweCVseCkgWyVwXVxuIiwg eGFfdG9fdmFsdWUoZW50cnkpLA0KKwkJCQl4YV90b192YWx1ZShlbnRyeSksIGVudHJ5KTsNCisJ ZWxzZSBpZiAoeGFfaXNfemVybyhlbnRyeSkpDQorCQlwcl9jb250KCJ6ZXJvICglbGQpXG4iLCB4 YV90b19pbnRlcm5hbChlbnRyeSkpOw0KKwllbHNlIGlmIChtdF9pc19yZXNlcnZlZChlbnRyeSkp DQorCQlwcl9jb250KCJVTktOT1dOIEVOVFJZICglcClcbiIsIGVudHJ5KTsNCisJZWxzZQ0KKwkJ cHJfY29udCgiJXBcbiIsIGVudHJ5KTsNCit9DQorDQorc3RhdGljIHZvaWQgbXRfZHVtcF9yYW5n ZTY0KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCwgdm9pZCAqZW50cnksDQorCQkJdW5zaWdu ZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBpbnQgZGVwdGgpDQorew0K KwlzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgKm5vZGUgPSAmbXRlX3RvX25vZGUoZW50cnkpLT5tcjY0 Ow0KKwlib29sIGxlYWYgPSBtdGVfaXNfbGVhZihlbnRyeSk7DQorCXVuc2lnbmVkIGxvbmcgZmly c3QgPSBtaW47DQorCWludCBpOw0KKw0KKwlwcl9jb250KCIgY29udGVudHM6ICIpOw0KKwlmb3Ig KGkgPSAwOyBpIDwgTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDE7IGkrKykNCisJCXByX2NvbnQoIiVw ICVsdSAiLCBub2RlLT5zbG90W2ldLCBub2RlLT5waXZvdFtpXSk7DQorCXByX2NvbnQoIiVwXG4i LCBub2RlLT5zbG90W2ldKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX1JBTkdFNjRfU0xPVFM7 IGkrKykgew0KKwkJdW5zaWduZWQgbG9uZyBsYXN0ID0gbWF4Ow0KKw0KKwkJaWYgKGkgPCAoTUFQ TEVfUkFOR0U2NF9TTE9UUyAtIDEpKQ0KKwkJCWxhc3QgPSBub2RlLT5waXZvdFtpXTsNCisJCWVs c2UgaWYgKCFub2RlLT5zbG90W2ldICYmIG1heCAhPSBtdF9tYXhbbXRlX25vZGVfdHlwZShlbnRy eSldKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxhc3QgPT0gMCAmJiBpID4gMCkNCisJCQlicmVhazsN CisJCWlmIChsZWFmKQ0KKwkJCW10X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwg aSksDQorCQkJCQlmaXJzdCwgbGFzdCwgZGVwdGggKyAxKTsNCisJCWVsc2UgaWYgKG5vZGUtPnNs b3RbaV0pDQorCQkJbXRfZHVtcF9ub2RlKG10LCBtdF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwN CisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0aCArIDEpOw0KKw0KKwkJaWYgKGxhc3QgPT0gbWF4KQ0K KwkJCWJyZWFrOw0KKwkJaWYgKGxhc3QgPiBtYXgpIHsNCisJCQlwcl9lcnIoIm5vZGUgJXAgbGFz dCAoJWx1KSA+IG1heCAoJWx1KSBhdCBwaXZvdCAlZCFcbiIsDQorCQkJCQlub2RlLCBsYXN0LCBt YXgsIGkpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJZmlyc3QgPSBsYXN0ICsgMTsNCisJfQ0KK30N CisNCitzdGF0aWMgdm9pZCBtdF9kdW1wX2FyYW5nZTY0KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVl ICptdCwgdm9pZCAqZW50cnksDQorCQkJdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcg bWF4LCB1bnNpZ25lZCBpbnQgZGVwdGgpDQorew0KKwlzdHJ1Y3QgbWFwbGVfYXJhbmdlXzY0ICpu b2RlID0gJm10ZV90b19ub2RlKGVudHJ5KS0+bWE2NDsNCisJYm9vbCBsZWFmID0gbXRlX2lzX2xl YWYoZW50cnkpOw0KKwl1bnNpZ25lZCBsb25nIGZpcnN0ID0gbWluOw0KKwlpbnQgaTsNCisNCisJ cHJfY29udCgiIGNvbnRlbnRzOiAiKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX0FSQU5HRTY0 X1NMT1RTOyBpKyspDQorCQlwcl9jb250KCIlbHUgIiwgbm9kZS0+Z2FwW2ldKTsNCisJcHJfY29u dCgifCAlMDJYICUwMlh8ICIsIG5vZGUtPm1ldGEuZW5kLCBub2RlLT5tZXRhLmdhcCk7DQorCWZv ciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUyAtIDE7IGkrKykNCisJCXByX2NvbnQo IiVwICVsdSAiLCBub2RlLT5zbG90W2ldLCBub2RlLT5waXZvdFtpXSk7DQorCXByX2NvbnQoIiVw XG4iLCBub2RlLT5zbG90W2ldKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX0FSQU5HRTY0X1NM T1RTOyBpKyspIHsNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwg KE1BUExFX0FSQU5HRTY0X1NMT1RTIC0gMSkpDQorCQkJbGFzdCA9IG5vZGUtPnBpdm90W2ldOw0K KwkJZWxzZSBpZiAoIW5vZGUtPnNsb3RbaV0pDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA9PSAw ICYmIGkgPiAwKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxlYWYpDQorCQkJbXRfZHVtcF9lbnRyeSht dF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0aCArIDEp Ow0KKwkJZWxzZSBpZiAobm9kZS0+c2xvdFtpXSkNCisJCQltdF9kdW1wX25vZGUobXQsIG10X3Ns b3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJZmlyc3QsIGxhc3QsIGRlcHRoICsgMSk7DQor DQorCQlpZiAobGFzdCA9PSBtYXgpDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA+IG1heCkgew0K KwkJCXByX2Vycigibm9kZSAlcCBsYXN0ICglbHUpID4gbWF4ICglbHUpIGF0IHBpdm90ICVkIVxu IiwNCisJCQkJCW5vZGUsIGxhc3QsIG1heCwgaSk7DQorCQkJYnJlYWs7DQorCQl9DQorCQlmaXJz dCA9IGxhc3QgKyAxOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfbm9kZShjb25z dCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJdW5zaWduZWQgbG9uZyBt aW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBpbnQgZGVwdGgpDQorew0KKwlzdHJ1Y3Qg bWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKGVudHJ5KTsNCisJdW5zaWduZWQgaW50IHR5 cGUgPSBtdGVfbm9kZV90eXBlKGVudHJ5KTsNCisJdW5zaWduZWQgaW50IGk7DQorDQorCW10X2R1 bXBfcmFuZ2UobWluLCBtYXgsIGRlcHRoKTsNCisNCisJcHJfY29udCgibm9kZSAlcCBkZXB0aCAl ZCB0eXBlICVkIHBhcmVudCAlcCIsIG5vZGUsIGRlcHRoLCB0eXBlLA0KKwkJCW5vZGUgPyBub2Rl LT5wYXJlbnQgOiBOVUxMKTsNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfZGVuc2U6 DQorCQlwcl9jb250KCJcbiIpOw0KKwkJZm9yIChpID0gMDsgaSA8IE1BUExFX05PREVfU0xPVFM7 IGkrKykgew0KKwkJCWlmIChtaW4gKyBpID4gbWF4KQ0KKwkJCQlwcl9jb250KCJPVVQgT0YgUkFO R0U6ICIpOw0KKwkJCW10X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQor CQkJCQltaW4gKyBpLCBtaW4gKyBpLCBkZXB0aCk7DQorCQl9DQorCQlicmVhazsNCisJY2FzZSBt YXBsZV9sZWFmXzY0Og0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwkJbXRfZHVtcF9yYW5nZTY0 KG10LCBlbnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2Fy YW5nZV82NDoNCisJCW10X2R1bXBfYXJhbmdlNjQobXQsIGVudHJ5LCBtaW4sIG1heCwgZGVwdGgp Ow0KKwkJYnJlYWs7DQorDQorCWRlZmF1bHQ6DQorCQlwcl9jb250KCIgVU5LTk9XTiBUWVBFXG4i KTsNCisJfQ0KK30NCisNCit2b2lkIG10X2R1bXAoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10 KQ0KK3sNCisJdm9pZCAqZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2sobXQtPm1hX3Jvb3Qs IG10X2xvY2tlZChtdCkpOw0KKw0KKwlwcl9pbmZvKCJtYXBsZV90cmVlKCVwKSBmbGFncyAlWCwg aGVpZ2h0ICV1IHJvb3QgJXBcbiIsDQorCQkgbXQsIG10LT5tYV9mbGFncywgbXRfaGVpZ2h0KG10 KSwgZW50cnkpOw0KKwlpZiAoIXhhX2lzX25vZGUoZW50cnkpKQ0KKwkJbXRfZHVtcF9lbnRyeShl bnRyeSwgMCwgMCwgMCk7DQorCWVsc2UgaWYgKGVudHJ5KQ0KKwkJbXRfZHVtcF9ub2RlKG10LCBl bnRyeSwgMCwgbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkpXSwgMCk7DQorfQ0KKw0KKy8qDQor ICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGdhcCBpbiBhIG5vZGUgYW5kIGNoZWNrIGlmIHRoYXQn cyB3aGF0IGlzIHJlcG9ydGVkIGluDQorICogdGhlIHBhcmVudCAodW5sZXNzIHJvb3QpLg0KKyAq Lw0KK3N0YXRpYyB2b2lkIG1hc192YWxpZGF0ZV9nYXBzKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0K K3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICptdGUgPSBtYXMtPm5vZGU7DQorCXN0cnVjdCBtYXBs ZV9ub2RlICpwX21uOw0KKwl1bnNpZ25lZCBsb25nIGdhcCA9IDAsIG1heF9nYXAgPSAwOw0KKwl1 bnNpZ25lZCBsb25nIHBfZW5kLCBwX3N0YXJ0ID0gbWFzLT5taW47DQorCXVuc2lnbmVkIGNoYXIg cF9zbG90Ow0KKwl1bnNpZ25lZCBsb25nICpnYXBzID0gTlVMTDsNCisJdW5zaWduZWQgbG9uZyAq cGl2b3RzID0gbWFfcGl2b3RzKG10ZV90b19ub2RlKG10ZSksIG10ZV9ub2RlX3R5cGUobXRlKSk7 DQorCWludCBpOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UobXRlX25vZGVfdHlwZShtdGUpKSkgew0K KwkJZm9yIChpID0gMDsgaSA8IG10X3Nsb3RfY291bnQobXRlKTsgaSsrKSB7DQorCQkJaWYgKG1h c19nZXRfc2xvdChtYXMsIGkpKSB7DQorCQkJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJCQkJbWF4 X2dhcCA9IGdhcDsNCisJCQkJZ2FwID0gMDsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWdh cCsrOw0KKwkJfQ0KKwkJZ290byBjb3VudGVkOw0KKwl9DQorDQorCWdhcHMgPSBtYV9nYXBzKG10 ZV90b19ub2RlKG10ZSksIG10ZV9ub2RlX3R5cGUobXRlKSk7DQorCWZvciAoaSA9IDA7IGkgPCBt dF9zbG90X2NvdW50KG10ZSk7IGkrKykgew0KKwkJcF9lbmQgPSBtYXNfbG9naWNhbF9waXZvdCht YXMsIHBpdm90cywgaSwgbXRlX25vZGVfdHlwZShtdGUpKTsNCisNCisJCWlmICghZ2Fwcykgew0K KwkJCWlmIChtYXNfZ2V0X3Nsb3QobWFzLCBpKSkgew0KKwkJCQlnYXAgPSAwOw0KKwkJCQlnb3Rv IG5vdF9lbXB0eTsNCisJCQl9DQorDQorCQkJZ2FwICs9IHBfZW5kIC0gcF9zdGFydCArIDE7DQor CQl9IGVsc2Ugew0KKwkJCXZvaWQgKmVudHJ5ID0gbWFzX2dldF9zbG90KG1hcywgaSk7DQorDQor CQkJZ2FwID0gZ2Fwc1tpXTsNCisJCQlpZiAoIWVudHJ5KSB7DQorCQkJCWlmIChnYXAgIT0gcF9l bmQgLSBwX3N0YXJ0ICsgMSkgew0KKwkJCQkJcHJfZXJyKCIlcFsldV0gLT4gJXAgJWx1ICE9ICVs dSAtICVsdSArIDFcbiIsDQorCQkJCQkJbWFzX21uKG1hcyksIGksDQorCQkJCQkJbWFzX2dldF9z bG90KG1hcywgaSksIGdhcCwNCisJCQkJCQlwX2VuZCwgcF9zdGFydCk7DQorCQkJCQltdF9kdW1w KG1hcy0+dHJlZSk7DQorDQorCQkJCQlNVF9CVUdfT04obWFzLT50cmVlLA0KKwkJCQkJCWdhcCAh PSBwX2VuZCAtIHBfc3RhcnQgKyAxKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSB7DQorCQkJCWlmIChn YXAgPiBwX2VuZCAtIHBfc3RhcnQgKyAxKSB7DQorCQkJCQlwcl9lcnIoIiVwWyV1XSAlbHUgPj0g JWx1IC0gJWx1ICsgMSAoJWx1KVxuIiwNCisJCQkJCW1hc19tbihtYXMpLCBpLCBnYXAsIHBfZW5k LCBwX3N0YXJ0LA0KKwkJCQkJcF9lbmQgLSBwX3N0YXJ0ICsgMSk7DQorCQkJCQlNVF9CVUdfT04o bWFzLT50cmVlLA0KKwkJCQkJCWdhcCA+IHBfZW5kIC0gcF9zdGFydCArIDEpOw0KKwkJCQl9DQor CQkJfQ0KKwkJfQ0KKw0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsN Citub3RfZW1wdHk6DQorCQlwX3N0YXJ0ID0gcF9lbmQgKyAxOw0KKwkJaWYgKHBfZW5kID49IG1h cy0+bWF4KQ0KKwkJCWJyZWFrOw0KKwl9DQorDQorY291bnRlZDoNCisJaWYgKG10ZV9pc19yb290 KG10ZSkpDQorCQlyZXR1cm47DQorDQorCXBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5v ZGUpOw0KKwlwX21uID0gbXRlX3BhcmVudChtdGUpOw0KKwlNVF9CVUdfT04obWFzLT50cmVlLCBt YXhfZ2FwID4gbWFzLT5tYXgpOw0KKwlpZiAobWFfZ2FwcyhwX21uLCBtYXNfcGFyZW50X2VudW0o bWFzLCBtdGUpKVtwX3Nsb3RdICE9IG1heF9nYXApIHsNCisJCXByX2VycigiZ2FwICVwWyV1XSAh PSAlbHVcbiIsIHBfbW4sIHBfc2xvdCwgbWF4X2dhcCk7DQorCQltdF9kdW1wKG1hcy0+dHJlZSk7 DQorCX0NCisNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCSAgbWFfZ2FwcyhwX21uLCBtYXNf cGFyZW50X2VudW0obWFzLCBtdGUpKVtwX3Nsb3RdICE9IG1heF9nYXApOw0KK30NCisNCitzdGF0 aWMgdm9pZCBtYXNfdmFsaWRhdGVfcGFyZW50X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMpDQor ew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5v ZGU7DQorCWVudW0gbWFwbGVfdHlwZSBwX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMt Pm5vZGUpOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5v ZGUpOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCWludCBpOw0KKw0KKwlpZiAobXRlX2lzX3Jv b3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJcGFyZW50ID0gbXRlX3BhcmVudChtYXMt Pm5vZGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKHBhcmVudCwgcF90eXBlKTsNCisJTVRfQlVHX09O KG1hcy0+dHJlZSwgbWFzX21uKG1hcykgPT0gcGFyZW50KTsNCisNCisJLyogQ2hlY2sgcHJldi9u ZXh0IHBhcmVudCBzbG90IGZvciBkdXBsaWNhdGUgbm9kZSBlbnRyeSAqLw0KKw0KKwlmb3IgKGkg PSAwOyBpIDwgbXRfc2xvdHNbcF90eXBlXTsgaSsrKSB7DQorCQlub2RlID0gbWFzX3Nsb3QobWFz LCBzbG90cywgaSk7DQorCQlpZiAoaSA9PSBwX3Nsb3QpIHsNCisJCQlpZiAobm9kZSAhPSBtYXMt Pm5vZGUpDQorCQkJCXByX2VycigicGFyZW50ICVwWyV1XSBkb2VzIG5vdCBoYXZlICVwXG4iLA0K KwkJCQkJcGFyZW50LCBpLCBtYXNfbW4obWFzKSk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwg bm9kZSAhPSBtYXMtPm5vZGUpOw0KKwkJfSBlbHNlIGlmIChub2RlID09IG1hcy0+bm9kZSkgew0K KwkJCXByX2VycigiSW52YWxpZCBjaGlsZCAlcCBhdCBwYXJlbnQgJXBbJXVdIHBfc2xvdCAldVxu IiwNCisJCQkgICAgICAgbWFzX21uKG1hcyksIHBhcmVudCwgaSwgcF9zbG90KTsNCisJCQlNVF9C VUdfT04obWFzLT50cmVlLCBub2RlID09IG1hcy0+bm9kZSk7DQorCQl9DQorCX0NCit9DQorDQor c3RhdGljIHZvaWQgbWFzX3ZhbGlkYXRlX2NoaWxkX3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMp DQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsN CisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwg dHlwZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhtdGVfdG9fbm9kZSht YXMtPm5vZGUpLCB0eXBlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsNCisJdW5zaWdu ZWQgY2hhciBpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCXJldHVybjsN CisNCisJZm9yIChpID0gMDsgaSA8IG10X3Nsb3RzW3R5cGVdOyBpKyspIHsNCisJCWNoaWxkID0g bWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorCQlpZiAoIXBpdm90c1tpXSB8fCBwaXZvdHNbaV0g PT0gbWFzLT5tYXgpDQorCQkJYnJlYWs7DQorDQorCQlpZiAoIWNoaWxkKQ0KKwkJCWJyZWFrOw0K Kw0KKwkJaWYgKG10ZV9wYXJlbnRfc2xvdChjaGlsZCkgIT0gaSkgew0KKwkJCXByX2VycigiU2xv dCBlcnJvciBhdCAlcFsldV06IGNoaWxkICVwIGhhcyBwc2xvdCAldVxuIiwNCisJCQkgICAgICAg bWFzX21uKG1hcyksIGksIG10ZV90b19ub2RlKGNoaWxkKSwNCisJCQkgICAgICAgbXRlX3BhcmVu dF9zbG90KGNoaWxkKSk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgMSk7DQorCQl9DQorDQor CQlpZiAobXRlX3BhcmVudChjaGlsZCkgIT0gbXRlX3RvX25vZGUobWFzLT5ub2RlKSkgew0KKwkJ CXByX2VycigiY2hpbGQgJXAgaGFzIHBhcmVudCAlcCBub3QgJXBcbiIsDQorCQkJICAgICAgIG10 ZV90b19ub2RlKGNoaWxkKSwgbXRlX3BhcmVudChjaGlsZCksDQorCQkJICAgICAgIG10ZV90b19u b2RlKG1hcy0+bm9kZSkpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIDEpOw0KKwkJfQ0KKwl9 DQorfQ0KKw0KKy8qDQorICogVmFsaWRhdGUgYWxsIHBpdm90cyBhcmUgd2l0aGluIG1hcy0+bWlu IGFuZCBtYXMtPm1heC4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfdmFsaWRhdGVfbGltaXRzKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaW50IGk7DQorCXVuc2lnbmVkIGxvbmcgcHJldl9w aXYgPSAwOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2Rl KTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLT5ub2Rl KSwgdHlwZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFz KSwgdHlwZSk7DQorDQorCS8qIGFsbCBsaW1pdHMgYXJlIGZpbmUgaGVyZS4gKi8NCisJaWYgKG10 ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCWZvciAoaSA9IDA7IGkgPCBt dF9zbG90c1t0eXBlXTsgaSsrKSB7DQorCQl1bnNpZ25lZCBsb25nIHBpdjsNCisNCisJCXBpdiA9 IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBpLCB0eXBlKTsNCisNCisJCWlmICghcGl2ICYm IChpICE9IDApKQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKCFtdGVfaXNfbGVhZihtYXMtPm5vZGUp KSB7DQorCQkJdm9pZCAqZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBpKTsNCisNCisJCQlp ZiAoIWVudHJ5KQ0KKwkJCQlwcl9lcnIoIiVwWyV1XSBjYW5ub3QgYmUgbnVsbFxuIiwNCisJCQkJ ICAgICAgIG1hc19tbihtYXMpLCBpKTsNCisNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCAhZW50 cnkpOw0KKwkJfQ0KKw0KKwkJaWYgKHByZXZfcGl2ID4gcGl2KSB7DQorCQkJcHJfZXJyKCIlcFsl dV0gcGl2ICVsdSA8IHByZXZfcGl2ICVsdVxuIiwNCisJCQkJbWFzX21uKG1hcyksIGksIHBpdiwg cHJldl9waXYpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIHBpdiA8IHByZXZfcGl2KTsNCisJ CX0NCisNCisJCWlmIChwaXYgPCBtYXMtPm1pbikgew0KKwkJCXByX2VycigiJXBbJXVdICVsdSA8 ICVsdVxuIiwgbWFzX21uKG1hcyksIGksDQorCQkJCXBpdiwgbWFzLT5taW4pOw0KKwkJCU1UX0JV R19PTihtYXMtPnRyZWUsIHBpdiA8IG1hcy0+bWluKTsNCisJCX0NCisJCWlmIChwaXYgPiBtYXMt Pm1heCkgew0KKwkJCXByX2VycigiJXBbJXVdICVsdSA+ICVsdVxuIiwgbWFzX21uKG1hcyksIGks DQorCQkJCXBpdiwgbWFzLT5tYXgpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIHBpdiA+IG1h cy0+bWF4KTsNCisJCX0NCisJCXByZXZfcGl2ID0gcGl2Ow0KKwkJaWYgKHBpdiA9PSBtYXMtPm1h eCkNCisJCQlicmVhazsNCisJfQ0KKwlmb3IgKGkgKz0gMTsgaSA8IG10X3Nsb3RzW3R5cGVdOyBp KyspIHsNCisJCXZvaWQgKmVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorDQorCQlp ZiAoZW50cnkgJiYgKGkgIT0gbXRfc2xvdHNbdHlwZV0gLSAxKSkgew0KKwkJCXByX2VycigiJXBb JXVdIHNob3VsZCBub3QgaGF2ZSBlbnRyeSAlcFxuIiwgbWFzX21uKG1hcyksDQorCQkJICAgICAg IGksIGVudHJ5KTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBlbnRyeSAhPSBOVUxMKTsNCisJ CX0NCisNCisJCWlmIChpIDwgbXRfcGl2b3RzW3R5cGVdKSB7DQorCQkJdW5zaWduZWQgbG9uZyBw aXYgPSBwaXZvdHNbaV07DQorDQorCQkJaWYgKCFwaXYpDQorCQkJCWNvbnRpbnVlOw0KKw0KKwkJ CXByX2VycigiJXBbJXVdIHNob3VsZCBub3QgaGF2ZSBwaXYgJWx1XG4iLA0KKwkJCSAgICAgICBt YXNfbW4obWFzKSwgaSwgcGl2KTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBpIDwgbXRfcGl2 b3RzW3R5cGVdIC0gMSk7DQorCQl9DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgbXRfdmFsaWRh dGVfbnVsbHMoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqZW50cnksICpsYXN0 ID0gKHZvaWQgKikxOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19yY3Ug KipzbG90czsNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorDQorCW1hc19zdGFydCgmbWFz KTsNCisJaWYgKG1hc19pc19ub25lKCZtYXMpIHx8IChtYXMubm9kZSA9PSBNQVNfUk9PVCkpDQor CQlyZXR1cm47DQorDQorCXdoaWxlICghbXRlX2lzX2xlYWYobWFzLm5vZGUpKQ0KKwkJbWFzX2Rl c2NlbmQoJm1hcyk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLm5vZGUp LCBtdGVfbm9kZV90eXBlKG1hcy5ub2RlKSk7DQorCWRvIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3Qo Jm1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAoIWxhc3QgJiYgIWVudHJ5KSB7DQorCQkJcHJf ZXJyKCJTZXF1ZW50aWFsIG51bGxzIGVuZCBhdCAlcFsldV1cbiIsDQorCQkJCW1hc19tbigmbWFz KSwgb2Zmc2V0KTsNCisJCX0NCisJCU1UX0JVR19PTihtdCwgIWxhc3QgJiYgIWVudHJ5KTsNCisJ CWxhc3QgPSBlbnRyeTsNCisJCWlmIChvZmZzZXQgPT0gbWFzX2RhdGFfZW5kKCZtYXMpKSB7DQor CQkJbWFzX25leHRfbm9kZSgmbWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01BWCk7DQorCQkJaWYg KG1hc19pc19ub25lKCZtYXMpKQ0KKwkJCQlyZXR1cm47DQorCQkJb2Zmc2V0ID0gMDsNCisJCQlz bG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwNCisJCQkJCSBtdGVfbm9kZV90 eXBlKG1hcy5ub2RlKSk7DQorCQl9IGVsc2Ugew0KKwkJCW9mZnNldCsrOw0KKwkJfQ0KKw0KKwl9 IHdoaWxlICghbWFzX2lzX25vbmUoJm1hcykpOw0KK30NCisNCisvKg0KKyAqIHZhbGlkYXRlIGEg bWFwbGUgdHJlZSBieSBjaGVja2luZzoNCisgKiAxLiBUaGUgbGltaXRzIChwaXZvdHMgYXJlIHdp dGhpbiBtYXMtPm1pbiB0byBtYXMtPm1heCkNCisgKiAyLiBUaGUgZ2FwIGlzIGNvcnJlY3RseSBz ZXQgaW4gdGhlIHBhcmVudHMNCisgKi8NCit2b2lkIG10X3ZhbGlkYXRlKHN0cnVjdCBtYXBsZV90 cmVlICptdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKw0KKwlNQV9TVEFURShtYXMsIG10 LCAwLCAwKTsNCisJcmN1X3JlYWRfbG9jaygpOw0KKwltYXNfc3RhcnQoJm1hcyk7DQorCWlmICgh bWFzX3NlYXJjaGFibGUoJm1hcykpDQorCQlnb3RvIGRvbmU7DQorDQorCW1hc19maXJzdF9lbnRy eSgmbWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01BWCwgbXRlX25vZGVfdHlwZShtYXMubm9kZSkp Ow0KKwl3aGlsZSAoIW1hc19pc19ub25lKCZtYXMpKSB7DQorCQlNVF9CVUdfT04obWFzLnRyZWUs IG10ZV9kZWFkX25vZGUobWFzLm5vZGUpKTsNCisJCWlmICghbXRlX2lzX3Jvb3QobWFzLm5vZGUp KSB7DQorCQkJZW5kID0gbWFzX2RhdGFfZW5kKCZtYXMpOw0KKwkJCWlmICgoZW5kIDwgbXRfbWlu X3Nsb3RfY291bnQobWFzLm5vZGUpKSAmJg0KKwkJCSAgICAobWFzLm1heCAhPSBVTE9OR19NQVgp KSB7DQorCQkJCXByX2VycigiSW52YWxpZCBzaXplICV1IG9mICVwXG4iLCBlbmQsDQorCQkJCW1h c19tbigmbWFzKSk7DQorCQkJCU1UX0JVR19PTihtYXMudHJlZSwgMSk7DQorCQkJfQ0KKw0KKwkJ fQ0KKwkJbWFzX3ZhbGlkYXRlX3BhcmVudF9zbG90KCZtYXMpOw0KKwkJbWFzX3ZhbGlkYXRlX2No aWxkX3Nsb3QoJm1hcyk7DQorCQltYXNfdmFsaWRhdGVfbGltaXRzKCZtYXMpOw0KKwkJaWYgKG10 X2lzX2FsbG9jKG10KSkNCisJCQltYXNfdmFsaWRhdGVfZ2FwcygmbWFzKTsNCisJCW1hc19kZnNf cG9zdG9yZGVyKCZtYXMsIFVMT05HX01BWCk7DQorCX0NCisJbXRfdmFsaWRhdGVfbnVsbHMobXQp Ow0KK2RvbmU6DQorCXJjdV9yZWFkX3VubG9jaygpOw0KKw0KK30NCisNCisjZW5kaWYgLyogQ09O RklHX0RFQlVHX01BUExFX1RSRUUgKi8NCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4 LXRyZWUvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8uZ2l0aWdub3JlDQpp bmRleCBkOTcxNTE2NDAxZTYuLmM5MDFkOTZkZDAxMyAxMDA2NDQNCi0tLSBhL3Rvb2xzL3Rlc3Rp bmcvcmFkaXgtdHJlZS8uZ2l0aWdub3JlDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUv LmdpdGlnbm9yZQ0KQEAgLTYsMyArNiw1IEBAIG1haW4NCiBtdWx0aW9yZGVyDQogcmFkaXgtdHJl ZS5jDQogeGFycmF5DQorbWFwbGUNCittYV94YV9iZW5jaG1hcmsNCmRpZmYgLS1naXQgYS90b29s cy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25mLmggYi90b29scy90ZXN0aW5n L3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25mLmgNCmluZGV4IDIyMThiM2NjMTg0ZS4uZTdk YTgwMzUwMjM2IDEwMDY0NA0KLS0tIGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRl ZC9hdXRvY29uZi5oDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1 dG9jb25mLmgNCkBAIC0xICsxLDIgQEANCiAjZGVmaW5lIENPTkZJR19YQVJSQVlfTVVMVEkgMQ0K KyNkZWZpbmUgQ09ORklHXzY0QklUIDENCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4 LXRyZWUvbGludXgvbWFwbGVfdHJlZS5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4 L21hcGxlX3RyZWUuaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4u N2Q4ZDFmNDQ1Yjg5DQotLS0gL2Rldi9udWxsDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRy ZWUvbGludXgvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDcgQEANCisvKiBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMCsgKi8NCisjZGVmaW5lIGF0b21pY190IGludDMyX3QNCisjaW5j bHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgiDQorI2RlZmluZSBh dG9taWNfaW5jKHgpIHVhdG9taWNfaW5jKHgpDQorI2RlZmluZSBhdG9taWNfcmVhZCh4KSB1YXRv bWljX3JlYWQoeCkNCisjZGVmaW5lIGF0b21pY19zZXQoeCwgeSkgZG8ge30gd2hpbGUgKDApDQor I2RlZmluZSBVOF9NQVggVUNIQVJfTUFYDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRp eC10cmVlL21hcGxlLmMgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KbmV3IGZp bGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uMzUwODI2NzE5MjhhDQotLS0gL2Rl di9udWxsDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KQEAgLTAsMCAr MSw1OSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKw0KKy8qDQorICog bWFwbGVfdHJlZS5jOiBVc2Vyc3BhY2Ugc2hpbSBmb3IgbWFwbGUgdHJlZSB0ZXN0LXN1aXRlDQor ICogQ29weXJpZ2h0IChjKSAyMDE4IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNs ZS5jb20+DQorICovDQorDQorI2RlZmluZSBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KKyNkZWZp bmUgQ09ORklHX01BUExFX1NFQVJDSA0KKyNpbmNsdWRlICJ0ZXN0LmgiDQorDQorI2RlZmluZSBt b2R1bGVfaW5pdCh4KQ0KKyNkZWZpbmUgbW9kdWxlX2V4aXQoeCkNCisjZGVmaW5lIE1PRFVMRV9B VVRIT1IoeCkNCisjZGVmaW5lIE1PRFVMRV9MSUNFTlNFKHgpDQorI2RlZmluZSBkdW1wX3N0YWNr KCkJYXNzZXJ0KDApDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi9tYXBsZV90cmVlLmMiDQor I3VuZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi90 ZXN0X21hcGxlX3RyZWUuYyINCisNCit2b2lkIGZhcm1lcl90ZXN0cyh2b2lkKQ0KK3sNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCURFRklORV9NVFJFRSh0cmVlKTsNCisNCisJbXRfZHVt cCgmdHJlZSk7DQorDQorCXRyZWUubWFfcm9vdCA9IHhhX21rX3ZhbHVlKDApOw0KKwltdF9kdW1w KCZ0cmVlKTsNCisNCisJbm9kZSA9IG10X2FsbG9jX29uZShHRlBfS0VSTkVMKTsNCisJbm9kZS0+ cGFyZW50ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKCZ0cmVlKSB8IDEpOw0KKwlub2RlLT5z bG90WzBdID0geGFfbWtfdmFsdWUoMCk7DQorCW5vZGUtPnNsb3RbMV0gPSB4YV9ta192YWx1ZSgx KTsNCisJbm9kZS0+bXI2NC5waXZvdFswXSA9IDA7DQorCW5vZGUtPm1yNjQucGl2b3RbMV0gPSAx Ow0KKwlub2RlLT5tcjY0LnBpdm90WzJdID0gMDsNCisJdHJlZS5tYV9yb290ID0gbXRfbWtfbm9k ZShub2RlLCBtYXBsZV9sZWFmXzY0KTsNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCW1hX2ZyZWVf cmN1KG5vZGUpOw0KK30NCisNCit2b2lkIG1hcGxlX3RyZWVfdGVzdHModm9pZCkNCit7DQorCWZh cm1lcl90ZXN0cygpOw0KKwltYXBsZV90cmVlX3NlZWQoKTsNCisJbWFwbGVfdHJlZV9oYXJ2ZXN0 KCk7DQorfQ0KKw0KK2ludCBfX3dlYWsgbWFpbih2b2lkKQ0KK3sNCisJbWFwbGVfdHJlZV9pbml0 KCk7DQorCW1hcGxlX3RyZWVfdGVzdHMoKTsNCisJcmN1X2JhcnJpZXIoKTsNCisJaWYgKG5yX2Fs bG9jYXRlZCkNCisJCXByaW50ZigibnJfYWxsb2NhdGVkID0gJWRcbiIsIG5yX2FsbG9jYXRlZCk7 DQorCXJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUv dHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFj ZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAw MDAwMDAwLi45N2QwZTFkZGNmMDgNCi0tLSAvZGV2L251bGwNCisrKyBiL3Rvb2xzL3Rlc3Rpbmcv cmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDUgQEANCisv KiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsgKi8NCisNCisjZGVmaW5lIHRyYWNl X21hX29wKGEsIGIpIGRvIHt9IHdoaWxlICgwKQ0KKyNkZWZpbmUgdHJhY2VfbWFfcmVhZChhLCBi KSBkbyB7fSB3aGlsZSAoMCkNCisjZGVmaW5lIHRyYWNlX21hX3dyaXRlKGEsIGIsIGMsIGQpIGRv IHt9IHdoaWxlICgwKQ0KLS0gDQoyLjM1LjENCg==