Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp3492951rdh; Thu, 28 Sep 2023 13:21:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHVK+QnI5fy0lR4v9DngQo1jzYSluhU2FlVtX/OzrL+mVgf8uQdQzJ2pOuC+RHBA+Gm6y9O X-Received: by 2002:a17:90a:1542:b0:279:71c:19bb with SMTP id y2-20020a17090a154200b00279071c19bbmr2203991pja.34.1695932463276; Thu, 28 Sep 2023 13:21:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695932463; cv=none; d=google.com; s=arc-20160816; b=vMskb+HLdVaWwmaZK+6qmFKAFki/a5rIPAI99lnPwDPOlWbhL4wZl3/oBVtYVzHPVL 6P75jgQY/EbdzbMX7MFz1NfoDEX+d3JRz3Vys9J4L2rg1Sl+YStsjpzv0jHHGnAFyfIG AjMux6bdFpEsApm7myfvRDBImpeoJ8Mewd6axLPhO3XSvMpLU6GS/YO/E2GpNdUuDDSm /vuhiclYyU88KtlZuyLyqOBpLmnhVhDkOZtvn+vDGYmFSOtHNf20+bKI0JEk7w6ccwYZ w/129fJnyj/aCEYLw3aYxsgwSSdbmBQxxsMGQczKWlBOnFOLKehUohFFhLUFWYvo92lx DeoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:autocrypt:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :dkim-signature:dkim-signature; bh=Vhe5gGGGOH60DWMh1u+YuQlAT/cGDO+cJfhxQjGjOCg=; fh=L7BoaZwn5v1HCEC4c8c2kNKksBbqU8g31gNzPwxMEpg=; b=bsz0o/Dj6uOBoTIQzdV+8bCmB92N+Wjc5qeJvQP+74AvONaGR8JpY+0iUft7ggcSB8 CKUU4SPw+V2JWlMQx12Ws31eAC//X61mGIOHjRVfZXx+SyPGj61nifFfapMw3rFIOyPg u5Ve6GWfknY9c2LoFYllVHkYge1i/qJdiaGiuYts558hbaL3H7q1o3xnlaRhNoae7PRc PwT2qZbQb7mXgf/XV7Cr73WI88UWBuL747GATqB5ljuRn2eUTCgO4ONOdohRihjB/kQ4 LU47vdlcMkR8LPl32S+znCcxjuu88GLkaBjb4yPWlXtDurTFtTSAnJOAqqr/zwE7rcdJ 75gA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=aXMuAT9e; dkim=neutral (no key) header.i=@suse.de header.b=dz7J6G+u; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=suse.de Return-Path: Received: from agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id w15-20020a17090a8a0f00b002743618d4bcsi21238033pjn.101.2023.09.28.13.21.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Sep 2023 13:21:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=aXMuAT9e; dkim=neutral (no key) header.i=@suse.de header.b=dz7J6G+u; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=suse.de Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id CAA5382AF666; Thu, 28 Sep 2023 06:59:31 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232392AbjI1N7M (ORCPT + 99 others); Thu, 28 Sep 2023 09:59:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231524AbjI1N7L (ORCPT ); Thu, 28 Sep 2023 09:59:11 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9322311F for ; Thu, 28 Sep 2023 06:59:04 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 2D8841F8D4; Thu, 28 Sep 2023 13:59:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1695909543; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=Vhe5gGGGOH60DWMh1u+YuQlAT/cGDO+cJfhxQjGjOCg=; b=aXMuAT9ek4Togu6nR8dZLGTJ4WFxTZBL3VlxlPfS0ZA0Gb6Uj5rgoo+gtdNMA1uSJmg+r6 LQYDFa775G9ghmE7KNafF9uM2/5YFyyvci1Dmsm1F1B3qYrL4fOLnpQIRDc/6Ckp7bvPQe XvznXdKnmzX8tqBSBXQBvCpLpDvOIbM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1695909543; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=Vhe5gGGGOH60DWMh1u+YuQlAT/cGDO+cJfhxQjGjOCg=; b=dz7J6G+u5DJdJzhqcCpMhH2N/tg35wHougg8v+kYNpD5tppE6hxJ85bmhQIrmm8JpdMteJ ee6WcU/Png+n7aAg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id C0F2513581; Thu, 28 Sep 2023 13:59:02 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id O6JGLqaGFWWwfwAAMHmgww (envelope-from ); Thu, 28 Sep 2023 13:59:02 +0000 Message-ID: Date: Thu, 28 Sep 2023 15:59:01 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH/RFC 3/3] drm: Split drm_modeset_helper_vtables.h Content-Language: en-US To: Geert Uytterhoeven , Maarten Lankhorst , Maxime Ripard , David Airlie , Daniel Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org References: <0f0eae276da4f8ed44cd1a15ffa138879d27b148.1695903065.git.geert+renesas@glider.be> From: Thomas Zimmermann Autocrypt: addr=tzimmermann@suse.de; keydata= xsBNBFs50uABCADEHPidWt974CaxBVbrIBwqcq/WURinJ3+2WlIrKWspiP83vfZKaXhFYsdg XH47fDVbPPj+d6tQrw5lPQCyqjwrCPYnq3WlIBnGPJ4/jreTL6V+qfKRDlGLWFjZcsrPJGE0 BeB5BbqP5erN1qylK9i3gPoQjXGhpBpQYwRrEyQyjuvk+Ev0K1Jc5tVDeJAuau3TGNgah4Yc hdHm3bkPjz9EErV85RwvImQ1dptvx6s7xzwXTgGAsaYZsL8WCwDaTuqFa1d1jjlaxg6+tZsB 9GluwvIhSezPgnEmimZDkGnZRRSFiGP8yjqTjjWuf0bSj5rUnTGiyLyRZRNGcXmu6hjlABEB AAHNJ1Rob21hcyBaaW1tZXJtYW5uIDx0emltbWVybWFubkBzdXNlLmRlPsLAjgQTAQgAOAIb AwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBHIX+6yM6c9jRKFo5WgNwR1TC3ojBQJftODH AAoJEGgNwR1TC3ojx1wH/0hKGWugiqDgLNXLRD/4TfHBEKmxIrmfu9Z5t7vwUKfwhFL6hqvo lXPJJKQpQ2z8+X2vZm/slsLn7J1yjrOsoJhKABDi+3QWWSGkaGwRJAdPVVyJMfJRNNNIKwVb U6B1BkX2XDKDGffF4TxlOpSQzdtNI/9gleOoUA8+jy8knnDYzjBNOZqLG2FuTdicBXblz0Mf vg41gd9kCwYXDnD91rJU8tzylXv03E75NCaTxTM+FBXPmsAVYQ4GYhhgFt8S2UWMoaaABLDe 7l5FdnLdDEcbmd8uLU2CaG4W2cLrUaI4jz2XbkcPQkqTQ3EB67hYkjiEE6Zy3ggOitiQGcqp j//OwE0EWznS4AEIAMYmP4M/V+T5RY5at/g7rUdNsLhWv1APYrh9RQefODYHrNRHUE9eosYb T6XMryR9hT8XlGOYRwKWwiQBoWSDiTMo/Xi29jUnn4BXfI2px2DTXwc22LKtLAgTRjP+qbU6 3Y0xnQN29UGDbYgyyK51DW3H0If2a3JNsheAAK+Xc9baj0LGIc8T9uiEWHBnCH+RdhgATnWW GKdDegUR5BkDfDg5O/FISymJBHx2Dyoklv5g4BzkgqTqwmaYzsl8UxZKvbaxq0zbehDda8lv hFXodNFMAgTLJlLuDYOGLK2AwbrS3Sp0AEbkpdJBb44qVlGm5bApZouHeJ/+n+7r12+lqdsA EQEAAcLAdgQYAQgAIAIbDBYhBHIX+6yM6c9jRKFo5WgNwR1TC3ojBQJftOH6AAoJEGgNwR1T C3ojVSkIALpAPkIJPQoURPb1VWjh34l0HlglmYHvZszJWTXYwavHR8+k6Baa6H7ufXNQtThR yIxJrQLW6rV5lm7TjhffEhxVCn37+cg0zZ3j7zIsSS0rx/aMwi6VhFJA5hfn3T0TtrijKP4A SAQO9xD1Zk9/61JWk8OysuIh7MXkl0fxbRKWE93XeQBhIJHQfnc+YBLprdnxR446Sh8Wn/2D Ya8cavuWf2zrB6cZurs048xe0UbSW5AOSo4V9M0jzYI4nZqTmPxYyXbm30Kvmz0rYVRaitYJ 4kyYYMhuULvrJDMjZRvaNe52tkKAvMevcGdt38H4KSVXAylqyQOW5zvPc4/sq9c= In-Reply-To: <0f0eae276da4f8ed44cd1a15ffa138879d27b148.1695903065.git.geert+renesas@glider.be> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------UBHs4GPgBo1U9sWtFjSS6xYE" X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Thu, 28 Sep 2023 06:59:32 -0700 (PDT) This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------UBHs4GPgBo1U9sWtFjSS6xYE Content-Type: multipart/mixed; boundary="------------arW370dMVpMMlFvhY44uP4fb"; protected-headers="v1" From: Thomas Zimmermann To: Geert Uytterhoeven , Maarten Lankhorst , Maxime Ripard , David Airlie , Daniel Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Message-ID: Subject: Re: [PATCH/RFC 3/3] drm: Split drm_modeset_helper_vtables.h References: <0f0eae276da4f8ed44cd1a15ffa138879d27b148.1695903065.git.geert+renesas@glider.be> In-Reply-To: <0f0eae276da4f8ed44cd1a15ffa138879d27b148.1695903065.git.geert+renesas@glider.be> --------------arW370dMVpMMlFvhY44uP4fb Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 SGkgR2VlcnQNCg0KQW0gMjguMDkuMjMgdW0gMTQ6MTYgc2NocmllYiBHZWVydCBVeXR0ZXJo b2V2ZW46DQo+IDxkcm0vZHJtX21vZGVzZXRfaGVscGVyX3Z0YWJsZXMuaD4gaXMgdGhlIHNl Y29uZCBsYXJnZXN0IGhlYWRlciBmaWxlIGluDQo+IHRoZSBEUk0gc3Vic3lzdGVtLCBhbmQg ZGVjbGFyZXMgaGVscGVycyB2dGFibGVzIGZvciB2YXJpb3VzIERSTQ0KPiBjb21wb25lbnRz LiAgU2V2ZXJhbCB2dGFibGVzIGNvbnRhaW4gbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUs IGFuZCBhbGwNCj4gYnV0IG9uZSB2dGFibGUgZG8gbm90IGZpdCBvbiB0aGUgc2NyZWVuLCBt YWtpbmcgaXQgaGFyZCB0byBuYXZpZ2F0ZSB0bw0KPiB0aGUgYWN0dWFsIG1ldGhvZCBvbmUg aXMgaW50ZXJlc3RlZCBpbi4NCj4gDQo+IE1ha2UgaXQgZWFzaWVyIGZvciB0aGUgY2FzdWFs IHJldmlld2VyIHRvIGtlZXAgdHJhY2sgYnkgc3BsaXR0aW5nDQo+IDxkcm0vZHJtX21vZGVz ZXRfaGVscGVyX3Z0YWJsZXMuaD4gaW4gbXVsdGlwbGUgaGVhZGVyIGZpbGVzLCBvbmUgcGVy IERSTQ0KPiBjb21wb25lbnQuDQoNCkkgbmV2ZXIgbGlrZWQgdGhpcyBoZWFkZXIgZWl0aGVy LCBidXQgZG8gd2UgbmVlZCBuZXcgaGVhZGVyIGZpbGVzPyBFYWNoIA0Kc3RydWN0IGNvdWxk IGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHJlZ3VsYXIgaGVhZGVyOiBzdHJ1Y3Qg DQpkcm1fcGxhbmVfaGVscGVyX2Z1bmNzIHRvIGRybV9wbGFuZS5oLCBkcm1fY29ubmVjdG9y X2hlbHBlcl9mdW5jIHRvIA0KZHJtX2Nvbm5lY3Rvci5oIGFuZCBzbyBvbi4NCg0KQmVzdCBy ZWdhcmRzDQpUaG9tYXMNCg0KPiANCj4gU2lnbmVkLW9mZi1ieTogR2VlcnQgVXl0dGVyaG9l dmVuIDxnZWVydCtyZW5lc2FzQGdsaWRlci5iZT4NCj4gLS0tDQo+IFJGQywgYSBmdXR1cmUg cGF0Y2ggY291bGQgcmVwbGFjZSBpbmNsdXNpb24gb2YNCj4gPGRybS9kcm1fbW9kZXNldF9o ZWxwZXJfdnRhYmxlcy5oPiBieSBpbmNsdXNpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlDQo+ IG5ldyBmaWxlcywgYW5kIHJlZHVjZSBjb21waWxhdGlvbiB0aW1lLg0KPiAtLS0NCj4gICBp bmNsdWRlL2RybS9kcm1fY29ubmVjdG9yX2hlbHBlcl92dGFibGUuaCAgIHwgIDM2NCArKysr Kw0KPiAgIGluY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlcl92dGFibGUuaCAgICAgICAgfCAg NDgzICsrKysrKw0KPiAgIGluY2x1ZGUvZHJtL2RybV9lbmNvZGVyX2hlbHBlcl92dGFibGUu aCAgICAgfCAgMzgxICsrKysrDQo+ICAgaW5jbHVkZS9kcm0vZHJtX21vZGVfY29uZmlnX2hl bHBlcl92dGFibGUuaCB8ICAgOTcgKysNCj4gICBpbmNsdWRlL2RybS9kcm1fbW9kZXNldF9o ZWxwZXJfdnRhYmxlcy5oICAgIHwgMTQ2NiArLS0tLS0tLS0tLS0tLS0tLS0tDQo+ICAgaW5j bHVkZS9kcm0vZHJtX3BsYW5lX2hlbHBlcl92dGFibGUuaCAgICAgICB8ICAyOTcgKysrKw0K PiAgIDYgZmlsZXMgY2hhbmdlZCwgMTYyNyBpbnNlcnRpb25zKCspLCAxNDYxIGRlbGV0aW9u cygtKQ0KPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2RybS9kcm1fY29ubmVjdG9y X2hlbHBlcl92dGFibGUuaA0KPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2RybS9k cm1fY3J0Y19oZWxwZXJfdnRhYmxlLmgNCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVk ZS9kcm0vZHJtX2VuY29kZXJfaGVscGVyX3Z0YWJsZS5oDQo+ICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGluY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZ19oZWxwZXJfdnRhYmxlLmgNCj4gICBj cmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kcm0vZHJtX3BsYW5lX2hlbHBlcl92dGFibGUu aA0KPiANCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jb25uZWN0b3JfaGVscGVy X3Z0YWJsZS5oIGIvaW5jbHVkZS9kcm0vZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfdnRhYmxlLmgN Cj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAwMDAwMDAwMC4uOTJk Yjk3ODRlNGUzN2UwMg0KPiAtLS0gL2Rldi9udWxsDQo+ICsrKyBiL2luY2x1ZGUvZHJtL2Ry bV9jb25uZWN0b3JfaGVscGVyX3Z0YWJsZS5oDQo+IEBAIC0wLDAgKzEsMzY0IEBADQo+ICsv Kg0KPiArICogQ29weXJpZ2h0IMKpIDIwMDYgS2VpdGggUGFja2FyZA0KPiArICogQ29weXJp Z2h0IMKpIDIwMDctMjAwOCBEYXZlIEFpcmxpZQ0KPiArICogQ29weXJpZ2h0IMKpIDIwMDct MjAwOCBJbnRlbCBDb3Jwb3JhdGlvbg0KPiArICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJh cm5lc0BpbnRlbC5jb20+DQo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEzIEludGVsIENv cnBvcmF0aW9uDQo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbg0K PiArICogICBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPg0KPiArICoN Cj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhDQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUg YW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLA0K PiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5j bHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbg0KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNv cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsDQo+ ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0 IHBlcnNvbnMgdG8gd2hvbSB0aGUNCj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBk byBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQo+ICsgKg0KPiAr ICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3Rp Y2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCj4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRp YWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KPiArICoNCj4gKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBF WFBSRVNTIE9SDQo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRP IFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCj4gKyAqIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVO VCBTSEFMTA0KPiArICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJF IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SDQo+ICsgKiBPVEhFUiBMSUFCSUxJ VFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lT RSwNCj4gKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBU SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUg0KPiArICogT1RIRVIgREVBTElOR1MgSU4gVEhF IFNPRlRXQVJFLg0KPiArICovDQo+ICsNCj4gKyNpZm5kZWYgX19EUk1fQ09OTkVDVE9SX0hF TFBFUl9WVEFCTEVfSF9fDQo+ICsjZGVmaW5lIF9fRFJNX0NPTk5FQ1RPUl9IRUxQRVJfVlRB QkxFX0hfXw0KPiArDQo+ICtzdHJ1Y3QgZHJtX3dyaXRlYmFja19jb25uZWN0b3I7DQo+ICtz dHJ1Y3QgZHJtX3dyaXRlYmFja19qb2I7DQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0IGRy bV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIC0gaGVscGVyIG9wZXJhdGlvbnMgZm9yIGNvbm5l Y3RvcnMNCj4gKyAqDQo+ICsgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGF0 b21pYyBhbmQgbGVnYWN5IG1vZGVzZXQgaGVscGVycyBhbmQgYnkgdGhlDQo+ICsgKiBwcm9i ZSBoZWxwZXJzLg0KPiArICovDQo+ICtzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVu Y3Mgew0KPiArCS8qKg0KPiArCSAqIEBnZXRfbW9kZXM6DQo+ICsJICoNCj4gKwkgKiBUaGlz IGZ1bmN0aW9uIHNob3VsZCBmaWxsIGluIGFsbCBtb2RlcyBjdXJyZW50bHkgdmFsaWQgZm9y IHRoZSBzaW5rDQo+ICsJICogaW50byB0aGUgJmRybV9jb25uZWN0b3IucHJvYmVkX21vZGVz IGxpc3QuIEl0IHNob3VsZCBhbHNvIHVwZGF0ZSB0aGUNCj4gKwkgKiBFRElEIHByb3BlcnR5 IGJ5IGNhbGxpbmcgZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eSgpLg0KPiAr CSAqDQo+ICsJICogVGhlIHVzdWFsIHdheSB0byBpbXBsZW1lbnQgdGhpcyBpcyB0byBjYWNo ZSB0aGUgRURJRCByZXRyaWV2ZWQgaW4gdGhlDQo+ICsJICogcHJvYmUgY2FsbGJhY2sgc29t ZXdoZXJlIGluIHRoZSBkcml2ZXItcHJpdmF0ZSBjb25uZWN0b3Igc3RydWN0dXJlLg0KPiAr CSAqIEluIHRoaXMgZnVuY3Rpb24gZHJpdmVycyB0aGVuIHBhcnNlIHRoZSBtb2RlcyBpbiB0 aGUgRURJRCBhbmQgYWRkDQo+ICsJICogdGhlbSBieSBjYWxsaW5nIGRybV9hZGRfZWRpZF9t b2RlcygpLiBCdXQgY29ubmVjdG9ycyB0aGF0IGRyaXZlIGENCj4gKwkgKiBmaXhlZCBwYW5l bCBjYW4gYWxzbyBtYW51YWxseSBhZGQgc3BlY2lmaWMgbW9kZXMgdXNpbmcNCj4gKwkgKiBk cm1fbW9kZV9wcm9iZWRfYWRkKCkuIERyaXZlcnMgd2hpY2ggbWFudWFsbHkgYWRkIG1vZGVz IHNob3VsZCBhbHNvDQo+ICsJICogbWFrZSBzdXJlIHRoYXQgdGhlICZkcm1fY29ubmVjdG9y LmRpc3BsYXlfaW5mbywNCj4gKwkgKiAmZHJtX2Nvbm5lY3Rvci53aWR0aF9tbSBhbmQgJmRy bV9jb25uZWN0b3IuaGVpZ2h0X21tIGZpZWxkcyBhcmUNCj4gKwkgKiBmaWxsZWQgaW4uDQo+ ICsJICoNCj4gKwkgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciBmdW5jdGlvbiB3aWxsIGF1dG9t YXRpY2FsbHkgYWRkIHN0YW5kYXJkIFZFU0ENCj4gKwkgKiBETVQgbW9kZXMgdXAgdG8gMTAy NHg3NjggaWYgdGhlIC5nZXRfbW9kZXMoKSBoZWxwZXIgb3BlcmF0aW9uIHJldHVybnMNCj4g KwkgKiBubyBtb2RlIGFuZCBpZiB0aGUgY29ubmVjdG9yIHN0YXR1cyBpcyBjb25uZWN0b3Jf c3RhdHVzX2Nvbm5lY3RlZCBvcg0KPiArCSAqIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bi4g VGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsDQo+ICsJICogZHJtX2FkZF9tb2Rlc19ub2VkaWQo KSBtYW51YWxseSBpbiB0aGF0IGNhc2UuDQo+ICsJICoNCj4gKwkgKiBWaXJ0dWFsIGRyaXZl cnMgdGhhdCBqdXN0IHdhbnQgc29tZSBzdGFuZGFyZCBWRVNBIG1vZGUgd2l0aCBhIGdpdmVu DQo+ICsJICogcmVzb2x1dGlvbiBjYW4gY2FsbCBkcm1fYWRkX21vZGVzX25vZWRpZCgpLCBh bmQgbWFyayB0aGUgcHJlZmVycmVkDQo+ICsJICogb25lIHVzaW5nIGRybV9zZXRfcHJlZmVy cmVkX21vZGUoKS4NCj4gKwkgKg0KPiArCSAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxs ZWQgYWZ0ZXIgdGhlIEBkZXRlY3QgaG9vayBoYXMgaW5kaWNhdGVkDQo+ICsJICogdGhhdCBh IHNpbmsgaXMgY29ubmVjdGVkIGFuZCB3aGVuIHRoZSBFRElEIGlzbid0IG92ZXJyaWRkZW4g dGhyb3VnaA0KPiArCSAqIHN5c2ZzIG9yIHRoZSBrZXJuZWwgY29tbWFuZGxpbmUuDQo+ICsJ ICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIHByb2JlIGhlbHBlcnMg aW4gZS5nLg0KPiArCSAqIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rl cygpLg0KPiArCSAqDQo+ICsJICogVG8gYXZvaWQgcmFjZXMgd2l0aCBjb25jdXJyZW50IGNv bm5lY3RvciBzdGF0ZSB1cGRhdGVzLCB0aGUgaGVscGVyDQo+ICsJICogbGlicmFyaWVzIGFs d2F5cyBjYWxsIHRoaXMgd2l0aCB0aGUgJmRybV9tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211 dGV4DQo+ICsJICogaGVsZC4gQmVjYXVzZSBvZiB0aGlzIGl0J3Mgc2FmZSB0byBpbnNwZWN0 ICZkcm1fY29ubmVjdG9yLT5zdGF0ZS4NCj4gKwkgKg0KPiArCSAqIFJFVFVSTlM6DQo+ICsJ ICoNCj4gKwkgKiBUaGUgbnVtYmVyIG9mIG1vZGVzIGFkZGVkIGJ5IGNhbGxpbmcgZHJtX21v ZGVfcHJvYmVkX2FkZCgpLg0KPiArCSAqLw0KPiArCWludCAoKmdldF9tb2Rlcykoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAZGV0 ZWN0X2N0eDoNCj4gKwkgKg0KPiArCSAqIENoZWNrIHRvIHNlZSBpZiBhbnl0aGluZyBpcyBh dHRhY2hlZCB0byB0aGUgY29ubmVjdG9yLiBUaGUgcGFyYW1ldGVyDQo+ICsJICogZm9yY2Ug aXMgc2V0IHRvIGZhbHNlIHdoaWxzdCBwb2xsaW5nLCB0cnVlIHdoZW4gY2hlY2tpbmcgdGhl DQo+ICsJICogY29ubmVjdG9yIGR1ZSB0byBhIHVzZXIgcmVxdWVzdC4gZm9yY2UgY2FuIGJl IHVzZWQgYnkgdGhlIGRyaXZlciB0bw0KPiArCSAqIGF2b2lkIGV4cGVuc2l2ZSwgZGVzdHJ1 Y3RpdmUgb3BlcmF0aW9ucyBkdXJpbmcgYXV0b21hdGVkIHByb2JpbmcuDQo+ICsJICoNCj4g KwkgKiBUaGlzIGNhbGxiYWNrIGlzIG9wdGlvbmFsLCBpZiBub3QgaW1wbGVtZW50ZWQgdGhl IGNvbm5lY3RvciB3aWxsIGJlDQo+ICsJICogY29uc2lkZXJlZCBhcyBhbHdheXMgYmVpbmcg YXR0YWNoZWQuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGlzIHRoZSBhdG9taWMgdmVyc2lvbiBv ZiAmZHJtX2Nvbm5lY3Rvcl9mdW5jcy5kZXRlY3QuDQo+ICsJICoNCj4gKwkgKiBUbyBhdm9p ZCByYWNlcyBhZ2FpbnN0IGNvbmN1cnJlbnQgY29ubmVjdG9yIHN0YXRlIHVwZGF0ZXMsIHRo ZQ0KPiArCSAqIGhlbHBlciBsaWJyYXJpZXMgYWx3YXlzIGNhbGwgdGhpcyB3aXRoIGN0eCBz ZXQgdG8gYSB2YWxpZCBjb250ZXh0LA0KPiArCSAqIGFuZCAmZHJtX21vZGVfY29uZmlnLmNv bm5lY3Rpb25fbXV0ZXggd2lsbCBhbHdheXMgYmUgbG9ja2VkIHdpdGgNCj4gKwkgKiB0aGUg Y3R4IHBhcmFtZXRlciBzZXQgdG8gdGhpcyBjdHguIFRoaXMgYWxsb3dzIHRha2luZyBhZGRp dGlvbmFsDQo+ICsJICogbG9ja3MgYXMgcmVxdWlyZWQuDQo+ICsJICoNCj4gKwkgKiBSRVRV Uk5TOg0KPiArCSAqDQo+ICsJICogJmRybV9jb25uZWN0b3Jfc3RhdHVzIGluZGljYXRpbmcg dGhlIGNvbm5lY3RvcidzIHN0YXR1cywNCj4gKwkgKiBvciB0aGUgZXJyb3IgY29kZSByZXR1 cm5lZCBieSBkcm1fbW9kZXNldF9sb2NrKCksIC1FREVBRExLLg0KPiArCSAqLw0KPiArCWlu dCAoKmRldGVjdF9jdHgpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsDQo+ICsJ CQkgIHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4LA0KPiArCQkJICBib29s IGZvcmNlKTsNCj4gKw0KPiArCS8qKg0KPiArCSAqIEBtb2RlX3ZhbGlkOg0KPiArCSAqDQo+ ICsJICogQ2FsbGJhY2sgdG8gdmFsaWRhdGUgYSBtb2RlIGZvciBhIGNvbm5lY3RvciwgaXJy ZXNwZWN0aXZlIG9mIHRoZQ0KPiArCSAqIHNwZWNpZmljIGRpc3BsYXkgY29uZmlndXJhdGlv bi4NCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgcHJvYmUg aGVscGVycyB0byBmaWx0ZXIgdGhlIG1vZGUgbGlzdA0KPiArCSAqICh3aGljaCBpcyB1c3Vh bGx5IGRlcml2ZWQgZnJvbSB0aGUgRURJRCBkYXRhIGJsb2NrIGZyb20gdGhlIHNpbmspLg0K PiArCSAqIFNlZSBlLmcuIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rl cygpLg0KPiArCSAqDQo+ICsJICogVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4NCj4gKwkg Kg0KPiArCSAqIE5PVEU6DQo+ICsJICoNCj4gKwkgKiBUaGlzIG9ubHkgZmlsdGVycyB0aGUg bW9kZSBsaXN0IHN1cHBsaWVkIHRvIHVzZXJzcGFjZSBpbiB0aGUNCj4gKwkgKiBHRVRDT05O RUNUT1IgSU9DVEwuIENvbXBhcmVkIHRvICZkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MubW9k ZV92YWxpZCwNCj4gKwkgKiAmZHJtX2NydGNfaGVscGVyX2Z1bmNzLm1vZGVfdmFsaWQgYW5k ICZkcm1fYnJpZGdlX2Z1bmNzLm1vZGVfdmFsaWQsDQo+ICsJICogd2hpY2ggYXJlIGFsc28g Y2FsbGVkIGJ5IHRoZSBhdG9taWMgaGVscGVycyBmcm9tDQo+ICsJICogZHJtX2F0b21pY19o ZWxwZXJfY2hlY2tfbW9kZXNldCgpLiBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgdG8gZm9yY2Ug YW5kDQo+ICsJICogaWdub3JlIHNpbmsgY29uc3RyYWludCAobGlrZSB0aGUgcGl4ZWwgY2xv Y2sgbGltaXRzIGluIHRoZSBzY3JlZW4ncw0KPiArCSAqIEVESUQpLCB3aGljaCBpcyB1c2Vm dWwgZm9yIGUuZy4gdGVzdGluZywgb3Igd29ya2luZyBhcm91bmQgYSBicm9rZW4NCj4gKwkg KiBFRElELiBBbnkgc291cmNlIGhhcmR3YXJlIGNvbnN0cmFpbnQgKHdoaWNoIGFsd2F5cyBu ZWVkIHRvIGJlDQo+ICsJICogZW5mb3JjZWQpIHRoZXJlZm9yZSBzaG91bGQgYmUgY2hlY2tl ZCBpbiBvbmUgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcywNCj4gKwkgKiBhbmQgbm90IHRoaXMg b25lIGhlcmUuDQo+ICsJICoNCj4gKwkgKiBUbyBhdm9pZCByYWNlcyB3aXRoIGNvbmN1cnJl bnQgY29ubmVjdG9yIHN0YXRlIHVwZGF0ZXMsIHRoZSBoZWxwZXINCj4gKwkgKiBsaWJyYXJp ZXMgYWx3YXlzIGNhbGwgdGhpcyB3aXRoIHRoZSAmZHJtX21vZGVfY29uZmlnLmNvbm5lY3Rp b25fbXV0ZXgNCj4gKwkgKiBoZWxkLiBCZWNhdXNlIG9mIHRoaXMgaXQncyBzYWZlIHRvIGlu c3BlY3QgJmRybV9jb25uZWN0b3ItPnN0YXRlLg0KPiArCSAqDQo+ICsJICogUkVUVVJOUzoN Cj4gKwkgKg0KPiArCSAqIEVpdGhlciAmZHJtX21vZGVfc3RhdHVzLk1PREVfT0sgb3Igb25l IG9mIHRoZSBmYWlsdXJlIHJlYXNvbnMgaW4gJmVudW0NCj4gKwkgKiBkcm1fbW9kZV9zdGF0 dXMuDQo+ICsJICovDQo+ICsJZW51bSBkcm1fbW9kZV9zdGF0dXMgKCptb2RlX3ZhbGlkKShz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLA0KPiArCQkJCQkgICBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSk7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAbW9kZV92YWxp ZF9jdHg6DQo+ICsJICoNCj4gKwkgKiBDYWxsYmFjayB0byB2YWxpZGF0ZSBhIG1vZGUgZm9y IGEgY29ubmVjdG9yLCBpcnJlc3BlY3RpdmUgb2YgdGhlDQo+ICsJICogc3BlY2lmaWMgZGlz cGxheSBjb25maWd1cmF0aW9uLg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1 c2VkIGJ5IHRoZSBwcm9iZSBoZWxwZXJzIHRvIGZpbHRlciB0aGUgbW9kZSBsaXN0DQo+ICsJ ICogKHdoaWNoIGlzIHVzdWFsbHkgZGVyaXZlZCBmcm9tIHRoZSBFRElEIGRhdGEgYmxvY2sg ZnJvbSB0aGUgc2luaykuDQo+ICsJICogU2VlIGUuZy4gZHJtX2hlbHBlcl9wcm9iZV9zaW5n bGVfY29ubmVjdG9yX21vZGVzKCkuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGZ1bmN0aW9uIGlz IG9wdGlvbmFsLCBhbmQgaXMgdGhlIGF0b21pYyB2ZXJzaW9uIG9mDQo+ICsJICogJmRybV9j b25uZWN0b3JfaGVscGVyX2Z1bmNzLm1vZGVfdmFsaWQuDQo+ICsJICoNCj4gKwkgKiBUbyBh bGxvdyBmb3IgYWNjZXNzaW5nIHRoZSBhdG9taWMgc3RhdGUgb2YgbW9kZXNldHRpbmcgb2Jq ZWN0cywgdGhlDQo+ICsJICogaGVscGVyIGxpYnJhcmllcyBhbHdheXMgY2FsbCB0aGlzIHdp dGggY3R4IHNldCB0byBhIHZhbGlkIGNvbnRleHQsDQo+ICsJICogYW5kICZkcm1fbW9kZV9j b25maWcuY29ubmVjdGlvbl9tdXRleCB3aWxsIGFsd2F5cyBiZSBsb2NrZWQgd2l0aA0KPiAr CSAqIHRoZSBjdHggcGFyYW1ldGVyIHNldCB0byBAY3R4LiBUaGlzIGFsbG93cyBmb3IgdGFr aW5nIGFkZGl0aW9uYWwNCj4gKwkgKiBsb2NrcyBhcyByZXF1aXJlZC4NCj4gKwkgKg0KPiAr CSAqIEV2ZW4gdGhvdWdoIGFkZGl0aW9uYWwgbG9ja3MgbWF5IGJlIGFjcXVpcmVkLCB0aGlz IGNhbGxiYWNrIGlzDQo+ICsJICogc3RpbGwgZXhwZWN0ZWQgbm90IHRvIHRha2UgYW55IGNv bnN0cmFpbnRzIGludG8gYWNjb3VudCB3aGljaCB3b3VsZA0KPiArCSAqIGJlIGluZmx1ZW5j ZWQgYnkgdGhlIGN1cnJlbnRseSBzZXQgZGlzcGxheSBzdGF0ZSAtIHN1Y2ggY29uc3RyYWlu dHMNCj4gKwkgKiBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgZHJpdmVyJ3MgYXRvbWljIGNo ZWNrLiBGb3IgZXhhbXBsZSwgaWYgYQ0KPiArCSAqIGNvbm5lY3RvciBzaGFyZXMgZGlzcGxh eSBiYW5kd2lkdGggd2l0aCBvdGhlciBjb25uZWN0b3JzIHRoZW4gaXQNCj4gKwkgKiB3b3Vs ZCBiZSBvayB0byB2YWxpZGF0ZSB0aGUgbWluaW11bSBiYW5kd2lkdGggcmVxdWlyZW1lbnQg b2YgYSBtb2RlDQo+ICsJICogYWdhaW5zdCB0aGUgbWF4aW11bSBwb3NzaWJsZSBiYW5kd2lk dGggb2YgdGhlIGNvbm5lY3Rvci4gQnV0IGl0DQo+ICsJICogd291bGRuJ3QgYmUgb2sgdG8g dGFrZSB0aGUgY3VycmVudCBiYW5kd2lkdGggdXNhZ2Ugb2Ygb3RoZXINCj4gKwkgKiBjb25u ZWN0b3JzIGludG8gYWNjb3VudCwgYXMgdGhpcyB3b3VsZCBjaGFuZ2UgZGVwZW5kaW5nIG9u IHRoZQ0KPiArCSAqIGRpc3BsYXkgc3RhdGUuDQo+ICsJICoNCj4gKwkgKiBSZXR1cm5zOg0K PiArCSAqIDAgaWYgJmRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzLm1vZGVfdmFsaWRfY3R4 IHN1Y2NlZWRlZCBhbmQgd3JvdGUNCj4gKwkgKiB0aGUgJmVudW0gZHJtX21vZGVfc3RhdHVz IHZhbHVlIHRvIEBzdGF0dXMsIG9yIGEgbmVnYXRpdmUgZXJyb3INCj4gKwkgKiBjb2RlIG90 aGVyd2lzZS4NCj4gKwkgKg0KPiArCSAqLw0KPiArCWludCAoKm1vZGVfdmFsaWRfY3R4KShz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLA0KPiArCQkJICAgICAgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKm1vZGUsDQo+ICsJCQkgICAgICBzdHJ1Y3QgZHJtX21vZGVzZXRf YWNxdWlyZV9jdHggKmN0eCwNCj4gKwkJCSAgICAgIGVudW0gZHJtX21vZGVfc3RhdHVzICpz dGF0dXMpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGJlc3RfZW5jb2RlcjoNCj4gKwkgKg0K PiArCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHNlbGVjdCB0aGUgYmVzdCBlbmNvZGVyIGZv ciB0aGUgZ2l2ZW4gY29ubmVjdG9yLg0KPiArCSAqDQo+ICsJICogVGhpcyBmdW5jdGlvbiBp cyB1c2VkIGJ5IGJvdGggdGhlIGF0b21pYyBoZWxwZXJzIChpbiB0aGUNCj4gKwkgKiBkcm1f YXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0KCkgZnVuY3Rpb24pIGFuZCBpbiB0aGUgbGVn YWN5IENSVEMNCj4gKwkgKiBoZWxwZXJzLg0KPiArCSAqDQo+ICsJICogTk9URToNCj4gKwkg Kg0KPiArCSAqIEluIGF0b21pYyBkcml2ZXJzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlu IHRoZSBjaGVjayBwaGFzZSBvZiBhbg0KPiArCSAqIGF0b21pYyB1cGRhdGUuIFRoZSBkcml2 ZXIgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIG9yIGluc3BlY3QNCj4gKwkgKiBhbnl0aGlu ZyBvdXRzaWRlIG9mIGFyZ3VtZW50cyBwYXNzZWQtaW4uIEF0b21pYyBkcml2ZXJzIHdoaWNo IG5lZWQgdG8NCj4gKwkgKiBpbnNwZWN0IGR5bmFtaWMgY29uZmlndXJhdGlvbiBzdGF0ZSBz aG91bGQgaW5zdGVhZCB1c2UNCj4gKwkgKiBAYXRvbWljX2Jlc3RfZW5jb2Rlci4NCj4gKwkg Kg0KPiArCSAqIFlvdSBjYW4gbGVhdmUgdGhpcyBmdW5jdGlvbiB0byBOVUxMIGlmIHRoZSBj b25uZWN0b3IgaXMgb25seQ0KPiArCSAqIGF0dGFjaGVkIHRvIGEgc2luZ2xlIGVuY29kZXIu IEluIHRoaXMgY2FzZSwgdGhlIGNvcmUgd2lsbCBjYWxsDQo+ICsJICogZHJtX2Nvbm5lY3Rv cl9nZXRfc2luZ2xlX2VuY29kZXIoKSBmb3IgeW91Lg0KPiArCSAqDQo+ICsJICogUkVUVVJO UzoNCj4gKwkgKg0KPiArCSAqIEVuY29kZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhl IGdpdmVuIGNvbm5lY3RvciBhbmQgY29ubmVjdG9yDQo+ICsJICogc3RhdGUsIG9yIE5VTEwg aWYgbm8gc3VpdGFibGUgZW5jb2RlciBleGlzdHMuIE5vdGUgdGhhdCB0aGUgaGVscGVycw0K PiArCSAqIHdpbGwgZW5zdXJlIHRoYXQgZW5jb2RlcnMgYXJlbid0IHVzZWQgdHdpY2UsIGRy aXZlcnMgc2hvdWxkIG5vdCBjaGVjaw0KPiArCSAqIGZvciB0aGlzLg0KPiArCSAqLw0KPiAr CXN0cnVjdCBkcm1fZW5jb2RlciAqKCpiZXN0X2VuY29kZXIpKHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGF0b21pY19iZXN0X2Vu Y29kZXI6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGlzIHRoZSBhdG9taWMgdmVyc2lvbiBvZiBA YmVzdF9lbmNvZGVyIGZvciBhdG9taWMgZHJpdmVycyB3aGljaA0KPiArCSAqIG5lZWQgdG8g c2VsZWN0IHRoZSBiZXN0IGVuY29kZXIgZGVwZW5kaW5nIHVwb24gdGhlIGRlc2lyZWQNCj4g KwkgKiBjb25maWd1cmF0aW9uIGFuZCBjYW4ndCBzZWxlY3QgaXQgc3RhdGljYWxseS4NCj4g KwkgKg0KPiArCSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBkcm1fYXRvbWljX2hlbHBl cl9jaGVja19tb2Rlc2V0KCkuDQo+ICsJICogSWYgaXQgaXMgbm90IGltcGxlbWVudGVkLCB0 aGUgY29yZSB3aWxsIGZhbGxiYWNrIHRvIEBiZXN0X2VuY29kZXINCj4gKwkgKiAob3IgZHJt X2Nvbm5lY3Rvcl9nZXRfc2luZ2xlX2VuY29kZXIoKSBpZiBAYmVzdF9lbmNvZGVyIGlzIE5V TEwpLg0KPiArCSAqDQo+ICsJICogTk9URToNCj4gKwkgKg0KPiArCSAqIFRoaXMgZnVuY3Rp b24gaXMgY2FsbGVkIGluIHRoZSBjaGVjayBwaGFzZSBvZiBhbiBhdG9taWMgdXBkYXRlLiBU aGUNCj4gKwkgKiBkcml2ZXIgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGFueXRoaW5nIG91 dHNpZGUgb2YgdGhlDQo+ICsJICogJmRybV9hdG9taWNfc3RhdGUgdXBkYXRlIHRyYWNraW5n IHN0cnVjdHVyZSBwYXNzZWQgaW4uDQo+ICsJICoNCj4gKwkgKiBSRVRVUk5TOg0KPiArCSAq DQo+ICsJICogRW5jb2RlciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gY29u bmVjdG9yIGFuZCBjb25uZWN0b3INCj4gKwkgKiBzdGF0ZSwgb3IgTlVMTCBpZiBubyBzdWl0 YWJsZSBlbmNvZGVyIGV4aXN0cy4gTm90ZSB0aGF0IHRoZSBoZWxwZXJzDQo+ICsJICogd2ls bCBlbnN1cmUgdGhhdCBlbmNvZGVycyBhcmVuJ3QgdXNlZCB0d2ljZSwgZHJpdmVycyBzaG91 bGQgbm90IGNoZWNrDQo+ICsJICogZm9yIHRoaXMuDQo+ICsJICovDQo+ICsJc3RydWN0IGRy bV9lbmNvZGVyICooKmF0b21pY19iZXN0X2VuY29kZXIpKHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsDQo+ICsJCQkJCQkgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3Rh dGUpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGF0b21pY19jaGVjazoNCj4gKwkgKg0KPiAr CSAqIFRoaXMgaG9vayBpcyB1c2VkIHRvIHZhbGlkYXRlIGNvbm5lY3RvciBzdGF0ZS4gVGhp cyBmdW5jdGlvbiBpcw0KPiArCSAqIGNhbGxlZCBmcm9tICZkcm1fYXRvbWljX2hlbHBlcl9j aGVja19tb2Rlc2V0LCBhbmQgaXMgY2FsbGVkIHdoZW4NCj4gKwkgKiBhIGNvbm5lY3RvciBw cm9wZXJ0eSBpcyBzZXQsIG9yIGEgbW9kZXNldCBvbiB0aGUgY3J0YyBpcyBmb3JjZWQuDQo+ ICsJICoNCj4gKwkgKiBCZWNhdXNlICZkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0 IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsDQo+ICsJICogdGhpcyBmdW5jdGlvbiBz aG91bGQgaGFuZGxlIGJlaW5nIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB3ZWxsLg0KPiAr CSAqDQo+ICsJICogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFsbG93ZWQgdG8gaW5zcGVjdCBh bnkgb3RoZXIgb2JqZWN0J3Mgc3RhdGUgYW5kDQo+ICsJICogY2FuIGFkZCBtb3JlIHN0YXRl IG9iamVjdHMgdG8gdGhlIGF0b21pYyBjb21taXQgaWYgbmVlZGVkLiBDYXJlIG11c3QNCj4g KwkgKiBiZSB0YWtlbiB0aG91Z2ggdG8gZW5zdXJlIHRoYXQgc3RhdGUgY2hlY2sgYW5kIGNv bXB1dGUgZnVuY3Rpb25zIGZvcg0KPiArCSAqIHRoZXNlIGFkZGVkIHN0YXRlcyBhcmUgYWxs IGNhbGxlZCwgYW5kIGRlcml2ZWQgc3RhdGUgaW4gb3RoZXIgb2JqZWN0cw0KPiArCSAqIGFs bCB1cGRhdGVkLiBBZ2FpbiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8ganVzdCBjYWxsIGNo ZWNrIGhlbHBlcnMNCj4gKwkgKiB1bnRpbCBhIG1heGltYWwgY29uZmlndXJhdGlvbiBpcyBy ZWFjaGVkLg0KPiArCSAqDQo+ICsJICogTk9URToNCj4gKwkgKg0KPiArCSAqIFRoaXMgZnVu Y3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGVjayBwaGFzZSBvZiBhbiBhdG9taWMgdXBkYXRl LiBUaGUNCj4gKwkgKiBkcml2ZXIgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGFueXRoaW5n IG91dHNpZGUgb2YgdGhlIGZyZWUtc3RhbmRpbmcNCj4gKwkgKiBzdGF0ZSBvYmplY3RzIHBh c3NlZC1pbiBvciBhc3NlbWJsZWQgaW4gdGhlIG92ZXJhbGwgJmRybV9hdG9taWNfc3RhdGUN Cj4gKwkgKiB1cGRhdGUgdHJhY2tpbmcgc3RydWN0dXJlLg0KPiArCSAqDQo+ICsJICogUkVU VVJOUzoNCj4gKwkgKg0KPiArCSAqIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgc3Rh dGUgb3IgdGhlIHRyYW5zaXRpb24gY2FuJ3QgYmUNCj4gKwkgKiBzdXBwb3J0ZWQsIC1FTk9N RU0gb24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBhbmQgLUVERUFETEsgaWYgYW4NCj4g KwkgKiBhdHRlbXB0IHRvIG9idGFpbiBhbm90aGVyIHN0YXRlIG9iamVjdCByYW4gaW50byBh ICZkcm1fbW9kZXNldF9sb2NrDQo+ICsJICogZGVhZGxvY2suDQo+ICsJICovDQo+ICsJaW50 ICgqYXRvbWljX2NoZWNrKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLA0KPiAr CQkJICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkvKioN Cj4gKwkgKiBAYXRvbWljX2NvbW1pdDoNCj4gKwkgKg0KPiArCSAqIFRoaXMgaG9vayBpcyB0 byBiZSB1c2VkIGJ5IGRyaXZlcnMgaW1wbGVtZW50aW5nIHdyaXRlYmFjayBjb25uZWN0b3Jz DQo+ICsJICogdGhhdCBuZWVkIGEgcG9pbnQgd2hlbiB0byBjb21taXQgdGhlIHdyaXRlYmFj ayBqb2IgdG8gdGhlIGhhcmR3YXJlLg0KPiArCSAqIFRoZSB3cml0ZWJhY2tfam9iIHRvIGNv bW1pdCBpcyBhdmFpbGFibGUgaW4gdGhlIG5ldyBjb25uZWN0b3Igc3RhdGUsDQo+ICsJICog aW4gJmRybV9jb25uZWN0b3Jfc3RhdGUud3JpdGViYWNrX2pvYi4NCj4gKwkgKg0KPiArCSAq IFRoaXMgaG9vayBpcyBvcHRpb25hbC4NCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sg aXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycy4NCj4gKwkgKi8NCj4gKwl2 b2lkICgqYXRvbWljX2NvbW1pdCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwN Cj4gKwkJCSAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4g KwkvKioNCj4gKwkgKiBAcHJlcGFyZV93cml0ZWJhY2tfam9iOg0KPiArCSAqDQo+ICsJICog QXMgd3JpdGViYWNrIGpvYnMgY29udGFpbiBhIGZyYW1lYnVmZmVyLCBkcml2ZXJzIG1heSBu ZWVkIHRvDQo+ICsJICogcHJlcGFyZSBhbmQgY2xlYW4gdGhlbSB1cCB0aGUgc2FtZSB3YXkg dGhleSBjYW4gcHJlcGFyZSBhbmQNCj4gKwkgKiBjbGVhbiB1cCBmcmFtZWJ1ZmZlcnMgZm9y IHBsYW5lcy4gVGhpcyBvcHRpb25hbCBjb25uZWN0b3Igb3BlcmF0aW9uDQo+ICsJICogaXMg dXNlZCB0byBzdXBwb3J0IHRoZSBwcmVwYXJhdGlvbiBvZiB3cml0ZWJhY2sgam9icy4gVGhl IGpvYg0KPiArCSAqIHByZXBhcmUgb3BlcmF0aW9uIGlzIGNhbGxlZCBmcm9tIGRybV9hdG9t aWNfaGVscGVyX3ByZXBhcmVfcGxhbmVzKCkNCj4gKwkgKiBmb3Igc3RydWN0ICZkcm1fd3Jp dGViYWNrX2Nvbm5lY3RvciBjb25uZWN0b3JzIG9ubHkuDQo+ICsJICoNCj4gKwkgKiBUaGlz IG9wZXJhdGlvbiBpcyBvcHRpb25hbC4NCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sg aXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycy4NCj4gKwkgKi8NCj4gKwlp bnQgKCpwcmVwYXJlX3dyaXRlYmFja19qb2IpKHN0cnVjdCBkcm1fd3JpdGViYWNrX2Nvbm5l Y3RvciAqY29ubmVjdG9yLA0KPiArCQkJCSAgICAgc3RydWN0IGRybV93cml0ZWJhY2tfam9i ICpqb2IpOw0KPiArCS8qKg0KPiArCSAqIEBjbGVhbnVwX3dyaXRlYmFja19qb2I6DQo+ICsJ ICoNCj4gKwkgKiBUaGlzIG9wdGlvbmFsIGNvbm5lY3RvciBvcGVyYXRpb24gaXMgdXNlZCB0 byBzdXBwb3J0IHRoZQ0KPiArCSAqIGNsZWFudXAgb2Ygd3JpdGViYWNrIGpvYnMuIFRoZSBq b2IgY2xlYW51cCBvcGVyYXRpb24gaXMgY2FsbGVkDQo+ICsJICogZnJvbSB0aGUgZXhpc3Rp bmcgZHJtX3dyaXRlYmFja19jbGVhbnVwX2pvYigpIGZ1bmN0aW9uLCBpbnZva2VkDQo+ICsJ ICogYm90aCB3aGVuIGRlc3Ryb3lpbmcgdGhlIGpvYiBhcyBwYXJ0IG9mIGFuIGFib3J0ZWQg Y29tbWl0LCBvciB3aGVuDQo+ICsJICogdGhlIGpvYiBjb21wbGV0ZXMuDQo+ICsJICoNCj4g KwkgKiBUaGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4NCj4gKwkgKg0KPiArCSAqIFRoaXMg Y2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycy4NCj4gKwkg Ki8NCj4gKwl2b2lkICgqY2xlYW51cF93cml0ZWJhY2tfam9iKShzdHJ1Y3QgZHJtX3dyaXRl YmFja19jb25uZWN0b3IgKmNvbm5lY3RvciwNCj4gKwkJCQkgICAgICBzdHJ1Y3QgZHJtX3dy aXRlYmFja19qb2IgKmpvYik7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAZW5hYmxlX2hwZDoN Cj4gKwkgKg0KPiArCSAqIEVuYWJsZSBob3QtcGx1ZyBkZXRlY3Rpb24gZm9yIHRoZSBjb25u ZWN0b3IuDQo+ICsJICoNCj4gKwkgKiBUaGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4NCj4g KwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgZHJtX2ttc19oZWxw ZXJfcG9sbF9lbmFibGUoKSBoZWxwZXJzLg0KPiArCSAqLw0KPiArCXZvaWQgKCplbmFibGVf aHBkKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsNCj4gKw0KPiArCS8qKg0K PiArCSAqIEBkaXNhYmxlX2hwZDoNCj4gKwkgKg0KPiArCSAqIERpc2FibGUgaG90LXBsdWcg ZGV0ZWN0aW9uIGZvciB0aGUgY29ubmVjdG9yLg0KPiArCSAqDQo+ICsJICogVGhpcyBvcGVy YXRpb24gaXMgb3B0aW9uYWwuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIHVz ZWQgYnkgdGhlIGRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZSgpIGhlbHBlcnMuDQo+ICsJ ICovDQo+ICsJdm9pZCAoKmRpc2FibGVfaHBkKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u bmVjdG9yKTsNCj4gK307DQo+ICsNCj4gKy8qKg0KPiArICogZHJtX2Nvbm5lY3Rvcl9oZWxw ZXJfYWRkIC0gc2V0cyB0aGUgaGVscGVyIHZ0YWJsZSBmb3IgYSBjb25uZWN0b3INCj4gKyAq IEBjb25uZWN0b3I6IERSTSBjb25uZWN0b3INCj4gKyAqIEBmdW5jczogaGVscGVyIHZ0YWJs ZSB0byBzZXQgZm9yIEBjb25uZWN0b3INCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2b2lk IGRybV9jb25uZWN0b3JfaGVscGVyX2FkZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLA0KPiArCQkJCQkgICAgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1 bmNzICpmdW5jcykNCj4gK3sNCj4gKwljb25uZWN0b3ItPmhlbHBlcl9wcml2YXRlID0gZnVu Y3M7DQo+ICt9DQo+ICsNCj4gKyNlbmRpZiAvKiBfX0RSTV9DT05ORUNUT1JfSEVMUEVSX1ZU QUJMRV9IX18gKi8NCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBl cl92dGFibGUuaCBiL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlcl92dGFibGUuaA0KPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwMDAwMDAwMDAwLi42ZGM1ZDRk N2FmNDk0YTFiDQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2Ny dGNfaGVscGVyX3Z0YWJsZS5oDQo+IEBAIC0wLDAgKzEsNDgzIEBADQo+ICsvKg0KPiArICog Q29weXJpZ2h0IMKpIDIwMDYgS2VpdGggUGFja2FyZA0KPiArICogQ29weXJpZ2h0IMKpIDIw MDctMjAwOCBEYXZlIEFpcmxpZQ0KPiArICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBJbnRl bCBDb3Jwb3JhdGlvbg0KPiArICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRl bC5jb20+DQo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEzIEludGVsIENvcnBvcmF0aW9u DQo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbg0KPiArICogICBE YW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPg0KPiArICoNCj4gKyAqIFBl cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy c29uIG9idGFpbmluZyBhDQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29j aWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLA0KPiArICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdp dGhvdXQgbGltaXRhdGlvbg0KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlm eSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsDQo+ICsgKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMg dG8gd2hvbSB0aGUNCj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi amVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQo+ICsgKg0KPiArICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwg YmUgaW5jbHVkZWQgaW4NCj4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlv bnMgb2YgdGhlIFNvZnR3YXJlLg0KPiArICoNCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9W SURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9S DQo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTA0K PiArICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SDQo+ICsgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwNCj4gKyAq IEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdB UkUgT1IgVEhFIFVTRSBPUg0KPiArICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJF Lg0KPiArICovDQo+ICsNCj4gKyNpZm5kZWYgX19EUk1fQ1JUQ19IRUxQRVJfVlRBQkxFX0hf Xw0KPiArI2RlZmluZSBfX0RSTV9DUlRDX0hFTFBFUl9WVEFCTEVfSF9fDQo+ICsNCj4gK2Vu dW0gbW9kZV9zZXRfYXRvbWljIHsNCj4gKwlMRUFWRV9BVE9NSUNfTU9ERV9TRVQsDQo+ICsJ RU5URVJfQVRPTUlDX01PREVfU0VULA0KPiArfTsNCj4gKw0KPiArLyoqDQo+ICsgKiBzdHJ1 Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIC0gaGVscGVyIG9wZXJhdGlvbnMgZm9yIENSVENz DQo+ICsgKg0KPiArICogVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRD IGhlbHBlcnMgYW5kIHRoZSBuZXcgYXRvbWljDQo+ICsgKiBtb2Rlc2V0dGluZyBoZWxwZXJz Lg0KPiArICovDQo+ICtzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIHsNCj4gKwkvKioN Cj4gKwkgKiBAZHBtczoNCj4gKwkgKg0KPiArCSAqIENhbGxiYWNrIHRvIGNvbnRyb2wgcG93 ZXIgbGV2ZWxzIG9uIHRoZSBDUlRDLiAgSWYgdGhlIG1vZGUgcGFzc2VkIGluDQo+ICsJICog aXMgdW5zdXBwb3J0ZWQsIHRoZSBwcm92aWRlciBtdXN0IHVzZSB0aGUgbmV4dCBsb3dlc3Qg cG93ZXIgbGV2ZWwuDQo+ICsJICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kgQ1JUQyBo ZWxwZXJzIHRvIGltcGxlbWVudCBEUE1TDQo+ICsJICogZnVuY3Rpb25hbGl0eSBpbiBkcm1f aGVscGVyX2Nvbm5lY3Rvcl9kcG1zKCkuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNr IGlzIGFsc28gdXNlZCB0byBkaXNhYmxlIGEgQ1JUQyBieSBjYWxsaW5nIGl0IHdpdGgNCj4g KwkgKiBEUk1fTU9ERV9EUE1TX09GRiBpZiB0aGUgQGRpc2FibGUgaG9vayBpc24ndCB1c2Vk Lg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kg Q1JUQyBoZWxwZXJzLiAgQXRvbWljIGhlbHBlcnMNCj4gKwkgKiBhbHNvIHN1cHBvcnQgdXNp bmcgdGhpcyBob29rIGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIGEgQ1JUQyB0bw0KPiAr CSAqIGZhY2lsaXRhdGUgdHJhbnNpdGlvbnMgdG8gYXRvbWljLCBidXQgaXQgaXMgZGVwcmVj YXRlZC4gSW5zdGVhZA0KPiArCSAqIEBhdG9taWNfZW5hYmxlIGFuZCBAYXRvbWljX2Rpc2Fi bGUgc2hvdWxkIGJlIHVzZWQuDQo+ICsJICovDQo+ICsJdm9pZCAoKmRwbXMpKHN0cnVjdCBk cm1fY3J0YyAqY3J0YywgaW50IG1vZGUpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQHByZXBh cmU6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIHNob3VsZCBwcmVwYXJlIHRoZSBD UlRDIGZvciBhIHN1YnNlcXVlbnQgbW9kZXNldCwgd2hpY2gNCj4gKwkgKiBpbiBwcmFjdGlj ZSBtZWFucyB0aGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIHRoZSBDUlRDIGlmIGl0IGlzDQo+ ICsJICogcnVubmluZy4gTW9zdCBkcml2ZXJzIGVuZGVkIHVwIGltcGxlbWVudGluZyB0aGlz IGJ5IGNhbGxpbmcgdGhlaXINCj4gKwkgKiBAZHBtcyBob29rIHdpdGggRFJNX01PREVfRFBN U19PRkYuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGxl Z2FjeSBDUlRDIGhlbHBlcnMuICBBdG9taWMgaGVscGVycw0KPiArCSAqIGFsc28gc3VwcG9y dCB1c2luZyB0aGlzIGhvb2sgZm9yIGRpc2FibGluZyBhIENSVEMgdG8gZmFjaWxpdGF0ZQ0K PiArCSAqIHRyYW5zaXRpb25zIHRvIGF0b21pYywgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuIElu c3RlYWQgQGF0b21pY19kaXNhYmxlDQo+ICsJICogc2hvdWxkIGJlIHVzZWQuDQo+ICsJICov DQo+ICsJdm9pZCAoKnByZXBhcmUpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7DQo+ICsNCj4g KwkvKioNCj4gKwkgKiBAY29tbWl0Og0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBz aG91bGQgY29tbWl0IHRoZSBuZXcgbW9kZSBvbiB0aGUgQ1JUQyBhZnRlciBhIG1vZGVzZXQs DQo+ICsJICogd2hpY2ggaW4gcHJhY3RpY2UgbWVhbnMgdGhlIGRyaXZlciBzaG91bGQgZW5h YmxlIHRoZSBDUlRDLiAgTW9zdA0KPiArCSAqIGRyaXZlcnMgZW5kZWQgdXAgaW1wbGVtZW50 aW5nIHRoaXMgYnkgY2FsbGluZyB0aGVpciBAZHBtcyBob29rIHdpdGgNCj4gKwkgKiBEUk1f TU9ERV9EUE1TX09OLg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5 IHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzLiAgQXRvbWljIGhlbHBlcnMNCj4gKwkgKiBhbHNv IHN1cHBvcnQgdXNpbmcgdGhpcyBob29rIGZvciBlbmFibGluZyBhIENSVEMgdG8gZmFjaWxp dGF0ZQ0KPiArCSAqIHRyYW5zaXRpb25zIHRvIGF0b21pYywgYnV0IGl0IGlzIGRlcHJlY2F0 ZWQuIEluc3RlYWQgQGF0b21pY19lbmFibGUNCj4gKwkgKiBzaG91bGQgYmUgdXNlZC4NCj4g KwkgKi8NCj4gKwl2b2lkICgqY29tbWl0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOw0KPiAr DQo+ICsJLyoqDQo+ICsJICogQG1vZGVfdmFsaWQ6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGNh bGxiYWNrIGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBzcGVjaWZpYyBtb2RlIGlzIHZhbGlkIGlu IHRoaXMNCj4gKwkgKiBjcnRjLiBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpZiB0aGUg Y3J0YyBoYXMgc29tZSBzb3J0IG9mDQo+ICsJICogcmVzdHJpY3Rpb24gaW4gdGhlIG1vZGVz IGl0IGNhbiBkaXNwbGF5LiBGb3IgZXhhbXBsZSwgYSBnaXZlbiBjcnRjDQo+ICsJICogbWF5 IGJlIHJlc3BvbnNpYmxlIHRvIHNldCBhIGNsb2NrIHZhbHVlLiBJZiB0aGUgY2xvY2sgY2Fu IG5vdA0KPiArCSAqIHByb2R1Y2UgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBhdmFpbGFibGUg bW9kZXMgdGhlbiB0aGlzIGNhbGxiYWNrDQo+ICsJICogY2FuIGJlIHVzZWQgdG8gcmVzdHJp Y3QgdGhlIG51bWJlciBvZiBtb2RlcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQNCj4gKwkgKiBj YW4gYmUgZGlzcGxheWVkLg0KPiArCSAqDQo+ICsJICogVGhpcyBob29rIGlzIHVzZWQgYnkg dGhlIHByb2JlIGhlbHBlcnMgdG8gZmlsdGVyIHRoZSBtb2RlIGxpc3QgaW4NCj4gKwkgKiBk cm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoKSwgYW5kIGl0IGlzIHVz ZWQgYnkgdGhlDQo+ICsJICogYXRvbWljIGhlbHBlcnMgdG8gdmFsaWRhdGUgbW9kZXMgc3Vw cGxpZWQgYnkgdXNlcnNwYWNlIGluDQo+ICsJICogZHJtX2F0b21pY19oZWxwZXJfY2hlY2tf bW9kZXNldCgpLg0KPiArCSAqDQo+ICsJICogVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4N Cj4gKwkgKg0KPiArCSAqIE5PVEU6DQo+ICsJICoNCj4gKwkgKiBTaW5jZSB0aGlzIGZ1bmN0 aW9uIGlzIGJvdGggY2FsbGVkIGZyb20gdGhlIGNoZWNrIHBoYXNlIG9mIGFuIGF0b21pYw0K PiArCSAqIGNvbW1pdCwgYW5kIHRoZSBtb2RlIHZhbGlkYXRpb24gaW4gdGhlIHByb2JlIHBh dGhzIGl0IGlzIG5vdCBhbGxvd2VkDQo+ICsJICogdG8gbG9vayBhdCBhbnl0aGluZyBlbHNl IGJ1dCB0aGUgcGFzc2VkLWluIG1vZGUsIGFuZCB2YWxpZGF0ZSBpdA0KPiArCSAqIGFnYWlu c3QgY29uZmlndXJhdGlvbi1pbnZhcmlhbnQgaGFyZHdhcmUgY29uc3RyYWludHMuIEFueSBm dXJ0aGVyDQo+ICsJICogbGltaXRzIHdoaWNoIGRlcGVuZCB1cG9uIHRoZSBjb25maWd1cmF0 aW9uIGNhbiBvbmx5IGJlIGNoZWNrZWQgaW4NCj4gKwkgKiBAbW9kZV9maXh1cCBvciBAYXRv bWljX2NoZWNrLg0KPiArCSAqDQo+ICsJICogUkVUVVJOUzoNCj4gKwkgKg0KPiArCSAqIGRy bV9tb2RlX3N0YXR1cyBFbnVtDQo+ICsJICovDQo+ICsJZW51bSBkcm1fbW9kZV9zdGF0dXMg KCptb2RlX3ZhbGlkKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+ICsJCQkJCSAgIGNvbnN0 IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsNCj4gKw0KPiArCS8qKg0KPiArCSAq IEBtb2RlX2ZpeHVwOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIHRv IHZhbGlkYXRlIGEgbW9kZS4gVGhlIHBhcmFtZXRlciBtb2RlIGlzIHRoZQ0KPiArCSAqIGRp c3BsYXkgbW9kZSB0aGF0IHVzZXJzcGFjZSByZXF1ZXN0ZWQsIGFkanVzdGVkX21vZGUgaXMg dGhlIG1vZGUgdGhlDQo+ICsJICogZW5jb2RlcnMgbmVlZCB0byBiZSBmZWQgd2l0aC4gTm90 ZSB0aGF0IHRoaXMgaXMgdGhlIGludmVyc2Ugc2VtYW50aWNzDQo+ICsJICogb2YgdGhlIG1l YW5pbmcgZm9yIHRoZSAmZHJtX2VuY29kZXIgYW5kICZkcm1fYnJpZGdlX2Z1bmNzLm1vZGVf Zml4dXANCj4gKwkgKiB2ZnVuYy4gSWYgdGhlIENSVEMgY2Fubm90IHN1cHBvcnQgdGhlIHJl cXVlc3RlZCBjb252ZXJzaW9uIGZyb20gbW9kZQ0KPiArCSAqIHRvIGFkanVzdGVkX21vZGUg aXQgc2hvdWxkIHJlamVjdCB0aGUgbW9kZXNldC4gU2VlIGFsc28NCj4gKwkgKiAmZHJtX2Ny dGNfc3RhdGUuYWRqdXN0ZWRfbW9kZSBmb3IgbW9yZSBkZXRhaWxzLg0KPiArCSAqDQo+ICsJ ICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGJvdGggbGVnYWN5IENSVEMgaGVscGVycyBh bmQgYXRvbWljIGhlbHBlcnMuDQo+ICsJICogV2l0aCBhdG9taWMgaGVscGVycyBpdCBpcyBv cHRpb25hbC4NCj4gKwkgKg0KPiArCSAqIE5PVEU6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGZ1 bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhhc2Ugb2YgYXRvbWljIG1vZGVzZXRz LCB3aGljaA0KPiArCSAqIGNhbiBiZSBhYm9ydGVkIGZvciBhbnkgcmVhc29uIChpbmNsdWRp bmcgb24gdXNlcnNwYWNlJ3MgcmVxdWVzdCB0bw0KPiArCSAqIGp1c3QgY2hlY2sgd2hldGhl ciBhIGNvbmZpZ3VyYXRpb24gd291bGQgYmUgcG9zc2libGUpLiBBdG9taWMgZHJpdmVycw0K PiArCSAqIE1VU1QgTk9UIHRvdWNoIGFueSBwZXJzaXN0ZW50IHN0YXRlIChoYXJkd2FyZSBv ciBzb2Z0d2FyZSkgb3IgZGF0YQ0KPiArCSAqIHN0cnVjdHVyZXMgZXhjZXB0IHRoZSBwYXNz ZWQgaW4gYWRqdXN0ZWRfbW9kZSBwYXJhbWV0ZXIuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGlz IGluIGNvbnRyYXN0IHRvIHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzIHdoZXJlIHRoaXMgd2Fz DQo+ICsJICogYWxsb3dlZC4NCj4gKwkgKg0KPiArCSAqIEF0b21pYyBkcml2ZXJzIHdoaWNo IG5lZWQgdG8gaW5zcGVjdCBhbmQgYWRqdXN0IG1vcmUgc3RhdGUgc2hvdWxkDQo+ICsJICog aW5zdGVhZCB1c2UgdGhlIEBhdG9taWNfY2hlY2sgY2FsbGJhY2ssIGJ1dCBub3RlIHRoYXQg dGhleSdyZSBub3QNCj4gKwkgKiBwZXJmZWN0bHkgZXF1aXZhbGVudDogQG1vZGVfdmFsaWQg aXMgY2FsbGVkIGZyb20NCj4gKwkgKiBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0 KCksIGJ1dCBAYXRvbWljX2NoZWNrIGlzIGNhbGxlZCBmcm9tDQo+ICsJICogZHJtX2F0b21p Y19oZWxwZXJfY2hlY2tfcGxhbmVzKCksIGJlY2F1c2Ugb3JpZ2luYWxseSBpdCB3YXMgbWVh bnQgZm9yDQo+ICsJICogcGxhbmUgdXBkYXRlIGNoZWNrcyBvbmx5Lg0KPiArCSAqDQo+ICsJ ICogQWxzbyBiZXdhcmUgdGhhdCB1c2Vyc3BhY2UgY2FuIHJlcXVlc3QgaXRzIG93biBjdXN0 b20gbW9kZXMsIG5laXRoZXINCj4gKwkgKiBjb3JlIG5vciBoZWxwZXJzIGZpbHRlciBtb2Rl cyB0byB0aGUgbGlzdCBvZiBwcm9iZSBtb2RlcyByZXBvcnRlZCBieQ0KPiArCSAqIHRoZSBH RVRDT05ORUNUT1IgSU9DVEwgYW5kIHN0b3JlZCBpbiAmZHJtX2Nvbm5lY3Rvci5tb2Rlcy4g VG8gZW5zdXJlDQo+ICsJICogdGhhdCBtb2RlcyBhcmUgZmlsdGVyZWQgY29uc2lzdGVudGx5 IHB1dCBhbnkgQ1JUQyBjb25zdHJhaW50cyBhbmQNCj4gKwkgKiBsaW1pdHMgY2hlY2tzIGlu dG8gQG1vZGVfdmFsaWQuDQo+ICsJICoNCj4gKwkgKiBSRVRVUk5TOg0KPiArCSAqDQo+ICsJ ICogVHJ1ZSBpZiBhbiBhY2NlcHRhYmxlIGNvbmZpZ3VyYXRpb24gaXMgcG9zc2libGUsIGZh bHNlIGlmIHRoZSBtb2Rlc2V0DQo+ICsJICogb3BlcmF0aW9uIHNob3VsZCBiZSByZWplY3Rl ZC4NCj4gKwkgKi8NCj4gKwlib29sICgqbW9kZV9maXh1cCkoc3RydWN0IGRybV9jcnRjICpj cnRjLA0KPiArCQkJICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsDQo+ ICsJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7DQo+ICsN Cj4gKwkvKioNCj4gKwkgKiBAbW9kZV9zZXQ6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxi YWNrIGlzIHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRDIGhlbHBlcnMgdG8gc2V0IGEgbmV3IG1v ZGUsDQo+ICsJICogcG9zaXRpb24gYW5kIGZyYW1lYnVmZmVyLiBTaW5jZSBpdCB0aWVzIHRo ZSBwcmltYXJ5IHBsYW5lIHRvIGV2ZXJ5DQo+ICsJICogbW9kZSBjaGFuZ2UgaXQgaXMgaW5j b21wYXRpYmxlIHdpdGggdW5pdmVyc2FsIHBsYW5lIHN1cHBvcnQuIEFuZA0KPiArCSAqIHNp bmNlIGl0IGNhbid0IHVwZGF0ZSBvdGhlciBwbGFuZXMgaXQncyBpbmNvbXBhdGlibGUgd2l0 aCBhdG9taWMNCj4gKwkgKiBtb2Rlc2V0IHN1cHBvcnQuDQo+ICsJICoNCj4gKwkgKiBUaGlz IGNhbGxiYWNrIGlzIG9ubHkgdXNlZCBieSBDUlRDIGhlbHBlcnMgYW5kIGRlcHJlY2F0ZWQu DQo+ICsJICoNCj4gKwkgKiBSRVRVUk5TOg0KPiArCSAqDQo+ICsJICogMCBvbiBzdWNjZXNz IG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLg0KPiArCSAqLw0KPiArCWlu dCAoKm1vZGVfc2V0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlLA0KPiArCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVk X21vZGUsIGludCB4LCBpbnQgeSwNCj4gKwkJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9s ZF9mYik7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAbW9kZV9zZXRfbm9mYjoNCj4gKwkgKg0K PiArCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRpc3BsYXkgbW9k ZSBvZiBhIENSVEMgd2l0aG91dA0KPiArCSAqIGNoYW5naW5nIGFueXRoaW5nIG9mIHRoZSBw cmltYXJ5IHBsYW5lIGNvbmZpZ3VyYXRpb24uIFRoaXMgZml0cyB0aGUNCj4gKwkgKiByZXF1 aXJlbWVudCBvZiBhdG9taWMgYW5kIGhlbmNlIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBoZWxw ZXJzLg0KPiArCSAqDQo+ICsJICogTm90ZSB0aGF0IHRoZSBkaXNwbGF5IHBpcGUgaXMgY29t cGxldGVseSBvZmYgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ICsJICogY2FsbGVkLiBBdG9t aWMgZHJpdmVycyB3aGljaCBuZWVkIGhhcmR3YXJlIHRvIGJlIHJ1bm5pbmcgYmVmb3JlIHRo ZXkNCj4gKwkgKiBwcm9ncmFtIHRoZSBuZXcgZGlzcGxheSBtb2RlIChlLmcuIGJlY2F1c2Ug dGhleSBpbXBsZW1lbnQgcnVudGltZSBQTSkNCj4gKwkgKiBzaG91bGQgbm90IHVzZSB0aGlz IGhvb2suIFRoaXMgaXMgYmVjYXVzZSB0aGUgaGVscGVyIGxpYnJhcnkgY2FsbHMNCj4gKwkg KiB0aGlzIGhvb2sgb25seSBvbmNlIHBlciBtb2RlIGNoYW5nZSBhbmQgbm90IGV2ZXJ5IHRp bWUgdGhlIGRpc3BsYXkNCj4gKwkgKiBwaXBlbGluZSBpcyBzdXNwZW5kZWQgdXNpbmcgZWl0 aGVyIERQTVMgb3IgdGhlIG5ldyAiQUNUSVZFIiBwcm9wZXJ0eS4NCj4gKwkgKiBXaGljaCBt ZWFucyByZWdpc3RlciB2YWx1ZXMgc2V0IGluIHRoaXMgY2FsbGJhY2sgbWlnaHQgZ2V0IHJl c2V0IHdoZW4NCj4gKwkgKiB0aGUgQ1JUQyBpcyBzdXNwZW5kZWQsIGJ1dCBub3QgcmVzdG9y ZWQuICBTdWNoIGRyaXZlcnMgc2hvdWxkIGluc3RlYWQNCj4gKwkgKiBtb3ZlIGFsbCB0aGVp ciBDUlRDIHNldHVwIGludG8gdGhlIEBhdG9taWNfZW5hYmxlIGNhbGxiYWNrLg0KPiArCSAq DQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyBvcHRpb25hbC4NCj4gKwkgKi8NCj4gKwl2b2lk ICgqbW9kZV9zZXRfbm9mYikoc3RydWN0IGRybV9jcnRjICpjcnRjKTsNCj4gKw0KPiArCS8q Kg0KPiArCSAqIEBtb2RlX3NldF9iYXNlOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFj ayBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzIHRvIHNldCBhIG5ldw0KPiAr CSAqIGZyYW1lYnVmZmVyIGFuZCBzY2Fub3V0IHBvc2l0aW9uLiBJdCBpcyBvcHRpb25hbCBh bmQgdXNlZCBhcyBhbg0KPiArCSAqIG9wdGltaXplZCBmYXN0LXBhdGggaW5zdGVhZCBvZiBh IGZ1bGwgbW9kZSBzZXQgb3BlcmF0aW9uIHdpdGggYWxsIHRoZQ0KPiArCSAqIHJlc3VsdGlu ZyBmbGlja2VyaW5nLiBJZiBpdCBpcyBub3QgcHJlc2VudA0KPiArCSAqIGRybV9jcnRjX2hl bHBlcl9zZXRfY29uZmlnKCkgd2lsbCBmYWxsIGJhY2sgdG8gYSBmdWxsIG1vZGVzZXQsIHVz aW5nDQo+ICsJICogdGhlIEBtb2RlX3NldCBjYWxsYmFjay4gU2luY2UgaXQgY2FuJ3QgdXBk YXRlIG90aGVyIHBsYW5lcyBpdCdzDQo+ICsJICogaW5jb21wYXRpYmxlIHdpdGggYXRvbWlj IG1vZGVzZXQgc3VwcG9ydC4NCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgaXMgb25s eSB1c2VkIGJ5IHRoZSBDUlRDIGhlbHBlcnMgYW5kIGRlcHJlY2F0ZWQuDQo+ICsJICoNCj4g KwkgKiBSRVRVUk5TOg0KPiArCSAqDQo+ICsJICogMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRp dmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLg0KPiArCSAqLw0KPiArCWludCAoKm1vZGVfc2V0 X2Jhc2UpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LA0KPiArCQkJICAg ICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpOw0KPiArDQo+ICsJLyoqDQo+ICsJ ICogQG1vZGVfc2V0X2Jhc2VfYXRvbWljOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFj ayBpcyB1c2VkIGJ5IHRoZSBmYmRldiBoZWxwZXJzIHRvIHNldCBhIG5ldyBmcmFtZWJ1ZmZl cg0KPiArCSAqIGFuZCBzY2Fub3V0IHdpdGhvdXQgc2xlZXBpbmcsIGkuZS4gZnJvbSBhbiBh dG9taWMgY2FsbGluZyBjb250ZXh0LiBJdA0KPiArCSAqIGlzIG9ubHkgdXNlZCB0byBpbXBs ZW1lbnQga2dkYiBzdXBwb3J0Lg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyBv cHRpb25hbCBhbmQgb25seSBuZWVkZWQgZm9yIGtnZGIgc3VwcG9ydCBpbiB0aGUgZmJkZXYN Cj4gKwkgKiBoZWxwZXJzLg0KPiArCSAqDQo+ICsJICogUkVUVVJOUzoNCj4gKwkgKg0KPiAr CSAqIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4N Cj4gKwkgKi8NCj4gKwlpbnQgKCptb2RlX3NldF9iYXNlX2F0b21pYykoc3RydWN0IGRybV9j cnRjICpjcnRjLA0KPiArCQkJCSAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgaW50 IHgsIGludCB5LA0KPiArCQkJCSAgICBlbnVtIG1vZGVfc2V0X2F0b21pYyk7DQo+ICsNCj4g KwkvKioNCj4gKwkgKiBAZGlzYWJsZToNCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sg c2hvdWxkIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGUgQ1JUQy4gV2l0aCB0aGUgYXRvbWljDQo+ ICsJICogZHJpdmVycyBpdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIGVuY29kZXJzIGNvbm5lY3Rl ZCB0byB0aGlzIENSVEMgaGF2ZQ0KPiArCSAqIGJlZW4gc2h1dCBvZmYgYWxyZWFkeSB1c2lu ZyB0aGVpciBvd24NCj4gKwkgKiAmZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzLmRpc2FibGUg aG9vay4gSWYgdGhhdCBzZXF1ZW5jZSBpcyB0b28NCj4gKwkgKiBzaW1wbGUgZHJpdmVycyBj YW4ganVzdCBhZGQgdGhlaXIgb3duIGhvb2tzIGFuZCBjYWxsIGl0IGZyb20gdGhpcw0KPiAr CSAqIENSVEMgY2FsbGJhY2sgaGVyZSBieSBsb29waW5nIG92ZXIgYWxsIGVuY29kZXJzIGNv bm5lY3RlZCB0byBpdCB1c2luZw0KPiArCSAqIGZvcl9lYWNoX2VuY29kZXJfb25fY3J0Yygp Lg0KPiArCSAqDQo+ICsJICogVGhpcyBob29rIGlzIHVzZWQgYm90aCBieSBsZWdhY3kgQ1JU QyBoZWxwZXJzIGFuZCBhdG9taWMgaGVscGVycy4NCj4gKwkgKiBBdG9taWMgZHJpdmVycyBk b24ndCBuZWVkIHRvIGltcGxlbWVudCBpdCBpZiB0aGVyZSdzIG5vIG5lZWQgdG8NCj4gKwkg KiBkaXNhYmxlIGFueXRoaW5nIGF0IHRoZSBDUlRDIGxldmVsLiBUbyBlbnN1cmUgdGhhdCBy dW50aW1lIFBNDQo+ICsJICogaGFuZGxpbmcgKHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZSBu ZXcgIkFDVElWRSIgcHJvcGVydHkpIHdvcmtzDQo+ICsJICogQGRpc2FibGUgbXVzdCBiZSB0 aGUgaW52ZXJzZSBvZiBAYXRvbWljX2VuYWJsZSBmb3IgYXRvbWljIGRyaXZlcnMuDQo+ICsJ ICogQXRvbWljIGRyaXZlcnMgc2hvdWxkIGNvbnNpZGVyIHRvIHVzZSBAYXRvbWljX2Rpc2Fi bGUgaW5zdGVhZCBvZg0KPiArCSAqIHRoaXMgb25lLg0KPiArCSAqDQo+ICsJICogTk9URToN Cj4gKwkgKg0KPiArCSAqIFdpdGggbGVnYWN5IENSVEMgaGVscGVycyB0aGVyZSdzIGEgYmln IHNlbWFudGljIGRpZmZlcmVuY2UgYmV0d2Vlbg0KPiArCSAqIEBkaXNhYmxlIGFuZCBvdGhl ciBob29rcyAobGlrZSBAcHJlcGFyZSBvciBAZHBtcykgdXNlZCB0byBzaHV0IGRvd24gYQ0K PiArCSAqIENSVEM6IEBkaXNhYmxlIGlzIG9ubHkgY2FsbGVkIHdoZW4gYWxzbyBsb2dpY2Fs bHkgZGlzYWJsaW5nIHRoZQ0KPiArCSAqIGRpc3BsYXkgcGlwZWxpbmUgYW5kIG5lZWRzIHRv IHJlbGVhc2UgYW55IHJlc291cmNlcyBhY3F1aXJlZCBpbg0KPiArCSAqIEBtb2RlX3NldCAo bGlrZSBzaGFyZWQgUExMcywgb3IgYWdhaW4gcmVsZWFzZSBwaW5uZWQgZnJhbWVidWZmZXJz KS4NCj4gKwkgKg0KPiArCSAqIFRoZXJlZm9yZSBAZGlzYWJsZSBtdXN0IGJlIHRoZSBpbnZl cnNlIG9mIEBtb2RlX3NldCBwbHVzIEBjb21taXQgZm9yDQo+ICsJICogZHJpdmVycyBzdGls bCB1c2luZyBsZWdhY3kgQ1JUQyBoZWxwZXJzLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0 aGUNCj4gKwkgKiBydWxlcyB1bmRlciBhdG9taWMuDQo+ICsJICovDQo+ICsJdm9pZCAoKmRp c2FibGUpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBA YXRvbWljX2NoZWNrOg0KPiArCSAqDQo+ICsJICogRHJpdmVycyBzaG91bGQgY2hlY2sgcGxh bmUtdXBkYXRlIHJlbGF0ZWQgQ1JUQyBjb25zdHJhaW50cyBpbiB0aGlzDQo+ICsJICogaG9v ay4gVGhleSBjYW4gYWxzbyBjaGVjayBtb2RlIHJlbGF0ZWQgbGltaXRhdGlvbnMgYnV0IG5l ZWQgdG8gYmUNCj4gKwkgKiBhd2FyZSBvZiB0aGUgY2FsbGluZyBvcmRlciwgc2luY2UgdGhp cyBob29rIGlzIHVzZWQgYnkNCj4gKwkgKiBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19wbGFu ZXMoKSB3aGVyZWFzIHRoZSBwcmVwYXJhdGlvbnMgbmVlZGVkIHRvDQo+ICsJICogY2hlY2sg b3V0cHV0IHJvdXRpbmcgYW5kIHRoZSBkaXNwbGF5IG1vZGUgaXMgZG9uZSBpbg0KPiArCSAq IGRybV9hdG9taWNfaGVscGVyX2NoZWNrX21vZGVzZXQoKS4gVGhlcmVmb3JlIGRyaXZlcnMg dGhhdCB3YW50IHRvDQo+ICsJICogY2hlY2sgb3V0cHV0IHJvdXRpbmcgYW5kIGRpc3BsYXkg bW9kZSBjb25zdHJhaW50cyBpbiB0aGlzIGNhbGxiYWNrDQo+ICsJICogbXVzdCBlbnN1cmUg dGhhdCBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0KCkgaGFzIGJlZW4gY2FsbGVk DQo+ICsJICogYmVmb3JlaGFuZC4gVGhpcyBpcyBjYWxsaW5nIG9yZGVyIHVzZWQgYnkgdGhl IGRlZmF1bHQgaGVscGVyDQo+ICsJICogaW1wbGVtZW50YXRpb24gaW4gZHJtX2F0b21pY19o ZWxwZXJfY2hlY2soKS4NCj4gKwkgKg0KPiArCSAqIFdoZW4gdXNpbmcgZHJtX2F0b21pY19o ZWxwZXJfY2hlY2tfcGxhbmVzKCkgdGhpcyBob29rIGlzIGNhbGxlZA0KPiArCSAqIGFmdGVy IHRoZSAmZHJtX3BsYW5lX2hlbHBlcl9mdW5jcy5hdG9taWNfY2hlY2sgaG9vayBmb3IgcGxh bmVzLCB3aGljaA0KPiArCSAqIGFsbG93cyBkcml2ZXJzIHRvIGFzc2lnbiBzaGFyZWQgcmVz b3VyY2VzIHJlcXVlc3RlZCBieSBwbGFuZXMgaW4gdGhpcw0KPiArCSAqIGNhbGxiYWNrIGhl cmUuIEZvciBtb3JlIGNvbXBsaWNhdGVkIGRlcGVuZGVuY2llcyB0aGUgZHJpdmVyIGNhbiBj YWxsDQo+ICsJICogdGhlIHByb3ZpZGVkIGNoZWNrIGhlbHBlcnMgbXVsdGlwbGUgdGltZXMg dW50aWwgdGhlIGNvbXB1dGVkIHN0YXRlDQo+ICsJICogaGFzIGEgZmluYWwgY29uZmlndXJh dGlvbiBhbmQgZXZlcnl0aGluZyBoYXMgYmVlbiBjaGVja2VkLg0KPiArCSAqDQo+ICsJICog VGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFsbG93ZWQgdG8gaW5zcGVjdCBhbnkgb3RoZXIgb2Jq ZWN0J3Mgc3RhdGUgYW5kDQo+ICsJICogY2FuIGFkZCBtb3JlIHN0YXRlIG9iamVjdHMgdG8g dGhlIGF0b21pYyBjb21taXQgaWYgbmVlZGVkLiBDYXJlIG11c3QNCj4gKwkgKiBiZSB0YWtl biB0aG91Z2ggdG8gZW5zdXJlIHRoYXQgc3RhdGUgY2hlY2sgYW5kIGNvbXB1dGUgZnVuY3Rp b25zIGZvcg0KPiArCSAqIHRoZXNlIGFkZGVkIHN0YXRlcyBhcmUgYWxsIGNhbGxlZCwgYW5k IGRlcml2ZWQgc3RhdGUgaW4gb3RoZXIgb2JqZWN0cw0KPiArCSAqIGFsbCB1cGRhdGVkLiBB Z2FpbiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8ganVzdCBjYWxsIGNoZWNrIGhlbHBlcnMN Cj4gKwkgKiB1bnRpbCBhIG1heGltYWwgY29uZmlndXJhdGlvbiBpcyByZWFjaGVkLg0KPiAr CSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNl dCBoZWxwZXJzLCBidXQgaXQgaXMNCj4gKwkgKiBvcHRpb25hbC4NCj4gKwkgKg0KPiArCSAq IE5PVEU6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUg Y2hlY2sgcGhhc2Ugb2YgYW4gYXRvbWljIHVwZGF0ZS4gVGhlDQo+ICsJICogZHJpdmVyIGlz IG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBhbnl0aGluZyBvdXRzaWRlIG9mIHRoZSBmcmVlLXN0 YW5kaW5nDQo+ICsJICogc3RhdGUgb2JqZWN0IHBhc3NlZC1pbi4NCj4gKwkgKg0KPiArCSAq IEFsc28gYmV3YXJlIHRoYXQgdXNlcnNwYWNlIGNhbiByZXF1ZXN0IGl0cyBvd24gY3VzdG9t IG1vZGVzLCBuZWl0aGVyDQo+ICsJICogY29yZSBub3IgaGVscGVycyBmaWx0ZXIgbW9kZXMg dG8gdGhlIGxpc3Qgb2YgcHJvYmUgbW9kZXMgcmVwb3J0ZWQgYnkNCj4gKwkgKiB0aGUgR0VU Q09OTkVDVE9SIElPQ1RMIGFuZCBzdG9yZWQgaW4gJmRybV9jb25uZWN0b3IubW9kZXMuIFRv IGVuc3VyZQ0KPiArCSAqIHRoYXQgbW9kZXMgYXJlIGZpbHRlcmVkIGNvbnNpc3RlbnRseSBw dXQgYW55IENSVEMgY29uc3RyYWludHMgYW5kDQo+ICsJICogbGltaXRzIGNoZWNrcyBpbnRv IEBtb2RlX3ZhbGlkLg0KPiArCSAqDQo+ICsJICogUkVUVVJOUzoNCj4gKwkgKg0KPiArCSAq IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgc3RhdGUgb3IgdGhlIHRyYW5zaXRpb24g Y2FuJ3QgYmUNCj4gKwkgKiBzdXBwb3J0ZWQsIC1FTk9NRU0gb24gbWVtb3J5IGFsbG9jYXRp b24gZmFpbHVyZSBhbmQgLUVERUFETEsgaWYgYW4NCj4gKwkgKiBhdHRlbXB0IHRvIG9idGFp biBhbm90aGVyIHN0YXRlIG9iamVjdCByYW4gaW50byBhICZkcm1fbW9kZXNldF9sb2NrDQo+ ICsJICogZGVhZGxvY2suDQo+ICsJICovDQo+ICsJaW50ICgqYXRvbWljX2NoZWNrKShzdHJ1 Y3QgZHJtX2NydGMgKmNydGMsDQo+ICsJCQkgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUg KnN0YXRlKTsNCj4gKw0KPiArCS8qKg0KPiArCSAqIEBhdG9taWNfYmVnaW46DQo+ICsJICoN Cj4gKwkgKiBEcml2ZXJzIHNob3VsZCBwcmVwYXJlIGZvciBhbiBhdG9taWMgdXBkYXRlIG9m IG11bHRpcGxlIHBsYW5lcyBvbg0KPiArCSAqIGEgQ1JUQyBpbiB0aGlzIGhvb2suIERlcGVu ZGluZyB1cG9uIGhhcmR3YXJlIHRoaXMgbWlnaHQgYmUgdmJsYW5rDQo+ICsJICogZXZhc2lv biwgYmxvY2tpbmcgdXBkYXRlcyBieSBzZXR0aW5nIGJpdHMgb3IgZG9pbmcgcHJlcGFyYXRv cnkgd29yaw0KPiArCSAqIGZvciBlLmcuIG1hbnVhbCB1cGRhdGUgZGlzcGxheS4NCj4gKwkg Kg0KPiArCSAqIFRoaXMgaG9vayBpcyBjYWxsZWQgYmVmb3JlIGFueSBwbGFuZSBjb21taXQg ZnVuY3Rpb25zIGFyZSBjYWxsZWQuDQo+ICsJICoNCj4gKwkgKiBOb3RlIHRoYXQgdGhlIHBv d2VyIHN0YXRlIG9mIHRoZSBkaXNwbGF5IHBpcGUgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ ICsJICogY2FsbGVkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaGVscGVycyBhbmQgY2FsbGlu ZyBzZXF1ZW5jZSB0aGUgZHJpdmVyDQo+ICsJICogaGFzIHBpY2tlZC4gU2VlIGRybV9hdG9t aWNfaGVscGVyX2NvbW1pdF9wbGFuZXMoKSBmb3IgYSBkaXNjdXNzaW9uIG9mDQo+ICsJICog dGhlIHRyYWRlb2ZmcyBhbmQgdmFyaWFudHMgb2YgcGxhbmUgY29tbWl0IGhlbHBlcnMuDQo+ ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rl c2V0IGhlbHBlcnMsIGJ1dCBpdCBpcw0KPiArCSAqIG9wdGlvbmFsLg0KPiArCSAqLw0KPiAr CXZvaWQgKCphdG9taWNfYmVnaW4pKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywNCj4gKwkJCSAg ICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gKwkvKioNCj4gKwkgKiBA YXRvbWljX2ZsdXNoOg0KPiArCSAqDQo+ICsJICogRHJpdmVycyBzaG91bGQgZmluYWxpemUg YW4gYXRvbWljIHVwZGF0ZSBvZiBtdWx0aXBsZSBwbGFuZXMgb24NCj4gKwkgKiBhIENSVEMg aW4gdGhpcyBob29rLiBEZXBlbmRpbmcgdXBvbiBoYXJkd2FyZSB0aGlzIG1pZ2h0IGluY2x1 ZGUNCj4gKwkgKiBjaGVja2luZyB0aGF0IHZibGFuayBldmFzaW9uIHdhcyBzdWNjZXNzZnVs LCB1bmJsb2NraW5nIHVwZGF0ZXMgYnkNCj4gKwkgKiBzZXR0aW5nIGJpdHMgb3Igc2V0dGlu ZyB0aGUgR08gYml0IHRvIGZsdXNoIG91dCBhbGwgdXBkYXRlcy4NCj4gKwkgKg0KPiArCSAq IFNpbXBsZSBoYXJkd2FyZSBvciBoYXJkd2FyZSB3aXRoIHNwZWNpYWwgcmVxdWlyZW1lbnRz IGNhbiBjb21taXQgYW5kDQo+ICsJICogZmx1c2ggb3V0IGFsbCB1cGRhdGVzIGZvciBhbGwg cGxhbmVzIGZyb20gdGhpcyBob29rIGFuZCBmb3JnbyBhbGwgdGhlDQo+ICsJICogb3RoZXIg Y29tbWl0IGhvb2tzIGZvciBwbGFuZSB1cGRhdGVzLg0KPiArCSAqDQo+ICsJICogVGhpcyBo b29rIGlzIGNhbGxlZCBhZnRlciBhbnkgcGxhbmUgY29tbWl0IGZ1bmN0aW9ucyBhcmUgY2Fs bGVkLg0KPiArCSAqDQo+ICsJICogTm90ZSB0aGF0IHRoZSBwb3dlciBzdGF0ZSBvZiB0aGUg ZGlzcGxheSBwaXBlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcw0KPiArCSAqIGNhbGxlZCBkZXBl bmRzIHVwb24gdGhlIGV4YWN0IGhlbHBlcnMgYW5kIGNhbGxpbmcgc2VxdWVuY2UgdGhlIGRy aXZlcg0KPiArCSAqIGhhcyBwaWNrZWQuIFNlZSBkcm1fYXRvbWljX2hlbHBlcl9jb21taXRf cGxhbmVzKCkgZm9yIGEgZGlzY3Vzc2lvbiBvZg0KPiArCSAqIHRoZSB0cmFkZW9mZnMgYW5k IHZhcmlhbnRzIG9mIHBsYW5lIGNvbW1pdCBoZWxwZXJzLg0KPiArCSAqDQo+ICsJICogVGhp cyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNldCBoZWxwZXJzLCBidXQg aXQgaXMNCj4gKwkgKiBvcHRpb25hbC4NCj4gKwkgKi8NCj4gKwl2b2lkICgqYXRvbWljX2Zs dXNoKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+ICsJCQkgICAgIHN0cnVjdCBkcm1fYXRv bWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAYXRvbWljX2VuYWJs ZToNCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGJlIHVzZWQgdG8gZW5h YmxlIHRoZSBDUlRDLiBXaXRoIHRoZSBhdG9taWMNCj4gKwkgKiBkcml2ZXJzIGl0IGlzIGNh bGxlZCBiZWZvcmUgYWxsIGVuY29kZXJzIGNvbm5lY3RlZCB0byB0aGlzIENSVEMgYXJlDQo+ ICsJICogZW5hYmxlZCB0aHJvdWdoIHRoZSBlbmNvZGVyJ3Mgb3duICZkcm1fZW5jb2Rlcl9o ZWxwZXJfZnVuY3MuZW5hYmxlDQo+ICsJICogaG9vay4gIElmIHRoYXQgc2VxdWVuY2UgaXMg dG9vIHNpbXBsZSBkcml2ZXJzIGNhbiBqdXN0IGFkZCB0aGVpciBvd24NCj4gKwkgKiBob29r cyBhbmQgY2FsbCBpdCBmcm9tIHRoaXMgQ1JUQyBjYWxsYmFjayBoZXJlIGJ5IGxvb3Bpbmcg b3ZlciBhbGwNCj4gKwkgKiBlbmNvZGVycyBjb25uZWN0ZWQgdG8gaXQgdXNpbmcgZm9yX2Vh Y2hfZW5jb2Rlcl9vbl9jcnRjKCkuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGhvb2sgaXMgdXNl ZCBvbmx5IGJ5IGF0b21pYyBoZWxwZXJzLCBmb3Igc3ltbWV0cnkgd2l0aA0KPiArCSAqIEBh dG9taWNfZGlzYWJsZS4gQXRvbWljIGRyaXZlcnMgZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQg aXQgaWYgdGhlcmUncw0KPiArCSAqIG5vIG5lZWQgdG8gZW5hYmxlIGFueXRoaW5nIGF0IHRo ZSBDUlRDIGxldmVsLiBUbyBlbnN1cmUgdGhhdCBydW50aW1lDQo+ICsJICogUE0gaGFuZGxp bmcgKHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZSBuZXcgIkFDVElWRSIgcHJvcGVydHkpIHdv cmtzDQo+ICsJICogQGF0b21pY19lbmFibGUgbXVzdCBiZSB0aGUgaW52ZXJzZSBvZiBAYXRv bWljX2Rpc2FibGUgZm9yIGF0b21pYw0KPiArCSAqIGRyaXZlcnMuDQo+ICsJICoNCj4gKwkg KiBUaGlzIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLg0KPiArCSAqLw0KPiArCXZvaWQgKCphdG9t aWNfZW5hYmxlKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+ICsJCQkgICAgICBzdHJ1Y3Qg ZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGF0b21p Y19kaXNhYmxlOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBzaG91bGQgYmUgdXNl ZCB0byBkaXNhYmxlIHRoZSBDUlRDLiBXaXRoIHRoZSBhdG9taWMNCj4gKwkgKiBkcml2ZXJz IGl0IGlzIGNhbGxlZCBhZnRlciBhbGwgZW5jb2RlcnMgY29ubmVjdGVkIHRvIHRoaXMgQ1JU QyBoYXZlDQo+ICsJICogYmVlbiBzaHV0IG9mZiBhbHJlYWR5IHVzaW5nIHRoZWlyIG93bg0K PiArCSAqICZkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MuZGlzYWJsZSBob29rLiBJZiB0aGF0 IHNlcXVlbmNlIGlzIHRvbw0KPiArCSAqIHNpbXBsZSBkcml2ZXJzIGNhbiBqdXN0IGFkZCB0 aGVpciBvd24gaG9va3MgYW5kIGNhbGwgaXQgZnJvbSB0aGlzDQo+ICsJICogQ1JUQyBjYWxs YmFjayBoZXJlIGJ5IGxvb3Bpbmcgb3ZlciBhbGwgZW5jb2RlcnMgY29ubmVjdGVkIHRvIGl0 IHVzaW5nDQo+ICsJICogZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKCkuDQo+ICsJICoNCj4g KwkgKiBUaGlzIGhvb2sgaXMgdXNlZCBvbmx5IGJ5IGF0b21pYyBoZWxwZXJzLiBBdG9taWMg ZHJpdmVycyBkb24ndA0KPiArCSAqIG5lZWQgdG8gaW1wbGVtZW50IGl0IGlmIHRoZXJlJ3Mg bm8gbmVlZCB0byBkaXNhYmxlIGFueXRoaW5nIGF0IHRoZQ0KPiArCSAqIENSVEMgbGV2ZWwu DQo+ICsJICoNCj4gKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLg0KPiArCSAqLw0K PiArCXZvaWQgKCphdG9taWNfZGlzYWJsZSkoc3RydWN0IGRybV9jcnRjICpjcnRjLA0KPiAr CQkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkv KioNCj4gKwkgKiBAZ2V0X3NjYW5vdXRfcG9zaXRpb246DQo+ICsJICoNCj4gKwkgKiBDYWxs ZWQgYnkgdmJsYW5rIHRpbWVzdGFtcGluZyBjb2RlLg0KPiArCSAqDQo+ICsJICogUmV0dXJu cyB0aGUgY3VycmVudCBkaXNwbGF5IHNjYW5vdXQgcG9zaXRpb24gZnJvbSBhIENSVEMgYW5k IGFuDQo+ICsJICogb3B0aW9uYWwgYWNjdXJhdGUga3RpbWVfZ2V0KCkgdGltZXN0YW1wIG9m IHdoZW4gdGhlIHBvc2l0aW9uIHdhcw0KPiArCSAqIG1lYXN1cmVkLiBOb3RlIHRoYXQgdGhp cyBpcyBhIGhlbHBlciBjYWxsYmFjayB3aGljaCBpcyBvbmx5IHVzZWQNCj4gKwkgKiBpZiBh IGRyaXZlciB1c2VzIGRybV9jcnRjX3ZibGFua19oZWxwZXJfZ2V0X3ZibGFua190aW1lc3Rh bXAoKQ0KPiArCSAqIGZvciB0aGUgQGRybV9jcnRjX2Z1bmNzLmdldF92YmxhbmtfdGltZXN0 YW1wIGNhbGxiYWNrLg0KPiArCSAqDQo+ICsJICogUGFyYW1ldGVyczoNCj4gKwkgKg0KPiAr CSAqIGNydGM6DQo+ICsJICogICAgIFRoZSBDUlRDLg0KPiArCSAqIGluX3ZibGFua19pcnE6 DQo+ICsJICogICAgIFRydWUgd2hlbiBjYWxsZWQgZnJvbSBkcm1fY3J0Y19oYW5kbGVfdmJs YW5rKCkuIFNvbWUgZHJpdmVycw0KPiArCSAqICAgICBuZWVkIHRvIGFwcGx5IHNvbWUgd29y a2Fyb3VuZHMgZm9yIGdwdS1zcGVjaWZpYyB2YmxhbmsgaXJxDQo+ICsJICogICAgIHF1aXJr cyBpZiB0aGUgZmxhZyBpcyBzZXQuDQo+ICsJICogdnBvczoNCj4gKwkgKiAgICAgVGFyZ2V0 IGxvY2F0aW9uIGZvciBjdXJyZW50IHZlcnRpY2FsIHNjYW5vdXQgcG9zaXRpb24uDQo+ICsJ ICogaHBvczoNCj4gKwkgKiAgICAgVGFyZ2V0IGxvY2F0aW9uIGZvciBjdXJyZW50IGhvcml6 b250YWwgc2Nhbm91dCBwb3NpdGlvbi4NCj4gKwkgKiBzdGltZToNCj4gKwkgKiAgICAgVGFy Z2V0IGxvY2F0aW9uIGZvciB0aW1lc3RhbXAgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlDQo+ ICsJICogICAgIHNjYW5vdXQgcG9zaXRpb24gcXVlcnkuIENhbiBiZSBOVUxMIHRvIHNraXAg dGltZXN0YW1wLg0KPiArCSAqIGV0aW1lOg0KPiArCSAqICAgICBUYXJnZXQgbG9jYXRpb24g Zm9yIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseSBhZnRlcg0KPiArCSAqICAgICBzY2Fu b3V0IHBvc2l0aW9uIHF1ZXJ5LiBDYW4gYmUgTlVMTCB0byBza2lwIHRpbWVzdGFtcC4NCj4g KwkgKiBtb2RlOg0KPiArCSAqICAgICBDdXJyZW50IGRpc3BsYXkgdGltaW5ncy4NCj4gKwkg Kg0KPiArCSAqIFJldHVybnMgdnBvcyBhcyBhIHBvc2l0aXZlIG51bWJlciB3aGlsZSBpbiBh Y3RpdmUgc2Nhbm91dCBhcmVhLg0KPiArCSAqIFJldHVybnMgdnBvcyBhcyBhIG5lZ2F0aXZl IG51bWJlciBpbnNpZGUgdmJsYW5rLCBjb3VudGluZyB0aGUgbnVtYmVyDQo+ICsJICogb2Yg c2NhbmxpbmVzIHRvIGdvIHVudGlsIGVuZCBvZiB2YmxhbmssIGUuZy4sIC0xIG1lYW5zICJv bmUgc2NhbmxpbmUNCj4gKwkgKiB1bnRpbCBzdGFydCBvZiBhY3RpdmUgc2Nhbm91dCAvIGVu ZCBvZiB2YmxhbmsuIg0KPiArCSAqDQo+ICsJICogUmV0dXJuczoNCj4gKwkgKg0KPiArCSAq IFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYSByZWxpYWJsZSBzY2Fub3V0IHBvc2l0aW9u IGNvdW50ZXIgY291bGQNCj4gKwkgKiBub3QgYmUgcmVhZCBvdXQuDQo+ICsJICovDQo+ICsJ Ym9vbCAoKmdldF9zY2Fub3V0X3Bvc2l0aW9uKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+ ICsJCQkJICAgICBib29sIGluX3ZibGFua19pcnEsIGludCAqdnBvcywgaW50ICpocG9zLA0K PiArCQkJCSAgICAga3RpbWVfdCAqc3RpbWUsIGt0aW1lX3QgKmV0aW1lLA0KPiArCQkJCSAg ICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOw0KPiArfTsNCj4gKw0K PiArLyoqDQo+ICsgKiBkcm1fY3J0Y19oZWxwZXJfYWRkIC0gc2V0cyB0aGUgaGVscGVyIHZ0 YWJsZSBmb3IgYSBjcnRjDQo+ICsgKiBAY3J0YzogRFJNIENSVEMNCj4gKyAqIEBmdW5jczog aGVscGVyIHZ0YWJsZSB0byBzZXQgZm9yIEBjcnRjDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxp bmUgdm9pZCBkcm1fY3J0Y19oZWxwZXJfYWRkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywNCj4g KwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqZnVuY3Mp DQo+ICt7DQo+ICsJY3J0Yy0+aGVscGVyX3ByaXZhdGUgPSBmdW5jczsNCj4gK30NCj4gKw0K PiArI2VuZGlmIC8qIF9fRFJNX0NSVENfSEVMUEVSX1ZUQUJMRV9IX18gKi8NCj4gZGlmZiAt LWdpdCBhL2luY2x1ZGUvZHJtL2RybV9lbmNvZGVyX2hlbHBlcl92dGFibGUuaCBiL2luY2x1 ZGUvZHJtL2RybV9lbmNvZGVyX2hlbHBlcl92dGFibGUuaA0KPiBuZXcgZmlsZSBtb2RlIDEw MDY0NA0KPiBpbmRleCAwMDAwMDAwMDAwMDAwMDAwLi40MzRkZTFlYmI4MjlmM2VkDQo+IC0t LSAvZGV2L251bGwNCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2VuY29kZXJfaGVscGVyX3Z0 YWJsZS5oDQo+IEBAIC0wLDAgKzEsMzgxIEBADQo+ICsvKg0KPiArICogQ29weXJpZ2h0IMKp IDIwMDYgS2VpdGggUGFja2FyZA0KPiArICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBEYXZl IEFpcmxpZQ0KPiArICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlv bg0KPiArICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+DQo+ICsg KiBDb3B5cmlnaHQgwqkgMjAxMS0yMDEzIEludGVsIENvcnBvcmF0aW9uDQo+ICsgKiBDb3B5 cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbg0KPiArICogICBEYW5pZWwgVmV0dGVy IDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPg0KPiArICoNCj4gKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmlu ZyBhDQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1l bnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLA0KPiArICogdG8gZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRh dGlvbg0KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1 Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsDQo+ICsgKiBhbmQvb3Igc2VsbCBjb3Bp ZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUN Cj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUg Zm9sbG93aW5nIGNvbmRpdGlvbnM6DQo+ICsgKg0KPiArICogVGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQg aW4NCj4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNv ZnR3YXJlLg0KPiArICoNCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMi LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQo+ICsgKiBJTVBM SUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1F UkNIQU5UQUJJTElUWSwNCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTA0KPiArICogVEhFIENP UFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlN LCBEQU1BR0VTIE9SDQo+ICsgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNU SU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwNCj4gKyAqIEFSSVNJTkcgRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVT RSBPUg0KPiArICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KPiArICovDQo+ ICsNCj4gKyNpZm5kZWYgX19EUk1fRU5DT0RFUl9IRUxQRVJfVlRBQkxFX0hfXw0KPiArI2Rl ZmluZSBfX0RSTV9FTkNPREVSX0hFTFBFUl9WVEFCTEVfSF9fDQo+ICsNCj4gKy8qKg0KPiAr ICogc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAtIGhlbHBlciBvcGVyYXRpb25z IGZvciBlbmNvZGVycw0KPiArICoNCj4gKyAqIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IHRo ZSBsZWdhY3kgQ1JUQyBoZWxwZXJzIGFuZCB0aGUgbmV3IGF0b21pYw0KPiArICogbW9kZXNl dHRpbmcgaGVscGVycy4NCj4gKyAqLw0KPiArc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9m dW5jcyB7DQo+ICsJLyoqDQo+ICsJICogQGRwbXM6DQo+ICsJICoNCj4gKwkgKiBDYWxsYmFj ayB0byBjb250cm9sIHBvd2VyIGxldmVscyBvbiB0aGUgZW5jb2Rlci4gIElmIHRoZSBtb2Rl IHBhc3NlZCBpbg0KPiArCSAqIGlzIHVuc3VwcG9ydGVkLCB0aGUgcHJvdmlkZXIgbXVzdCB1 c2UgdGhlIG5leHQgbG93ZXN0IHBvd2VyIGxldmVsLg0KPiArCSAqIFRoaXMgaXMgdXNlZCBi eSB0aGUgbGVnYWN5IGVuY29kZXIgaGVscGVycyB0byBpbXBsZW1lbnQgRFBNUw0KPiArCSAq IGZ1bmN0aW9uYWxpdHkgaW4gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcygpLg0KPiArCSAq DQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyBhbHNvIHVzZWQgdG8gZGlzYWJsZSBhbiBlbmNv ZGVyIGJ5IGNhbGxpbmcgaXQgd2l0aA0KPiArCSAqIERSTV9NT0RFX0RQTVNfT0ZGIGlmIHRo ZSBAZGlzYWJsZSBob29rIGlzbid0IHVzZWQuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxi YWNrIGlzIHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRDIGhlbHBlcnMuICBBdG9taWMgaGVscGVy cw0KPiArCSAqIGFsc28gc3VwcG9ydCB1c2luZyB0aGlzIGhvb2sgZm9yIGVuYWJsaW5nIGFu ZCBkaXNhYmxpbmcgYW4gZW5jb2RlciB0bw0KPiArCSAqIGZhY2lsaXRhdGUgdHJhbnNpdGlv bnMgdG8gYXRvbWljLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZA0KPiArCSAqIEBl bmFibGUgYW5kIEBkaXNhYmxlIHNob3VsZCBiZSB1c2VkLg0KPiArCSAqLw0KPiArCXZvaWQg KCpkcG1zKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKTsNCj4gKw0K PiArCS8qKg0KPiArCSAqIEBtb2RlX3ZhbGlkOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxs YmFjayBpcyB1c2VkIHRvIGNoZWNrIGlmIGEgc3BlY2lmaWMgbW9kZSBpcyB2YWxpZCBpbiB0 aGlzDQo+ICsJICogZW5jb2Rlci4gVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaWYgdGhl IGVuY29kZXIgaGFzIHNvbWUgc29ydA0KPiArCSAqIG9mIHJlc3RyaWN0aW9uIGluIHRoZSBt b2RlcyBpdCBjYW4gZGlzcGxheS4gRm9yIGV4YW1wbGUsIGEgZ2l2ZW4NCj4gKwkgKiBlbmNv ZGVyIG1heSBiZSByZXNwb25zaWJsZSB0byBzZXQgYSBjbG9jayB2YWx1ZS4gSWYgdGhlIGNs b2NrIGNhbg0KPiArCSAqIG5vdCBwcm9kdWNlIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgYXZh aWxhYmxlIG1vZGVzIHRoZW4gdGhpcyBjYWxsYmFjaw0KPiArCSAqIGNhbiBiZSB1c2VkIHRv IHJlc3RyaWN0IHRoZSBudW1iZXIgb2YgbW9kZXMgdG8gb25seSB0aGUgb25lcyB0aGF0DQo+ ICsJICogY2FuIGJlIGRpc3BsYXllZC4NCj4gKwkgKg0KPiArCSAqIFRoaXMgaG9vayBpcyB1 c2VkIGJ5IHRoZSBwcm9iZSBoZWxwZXJzIHRvIGZpbHRlciB0aGUgbW9kZSBsaXN0IGluDQo+ ICsJICogZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKCksIGFuZCBp dCBpcyB1c2VkIGJ5IHRoZQ0KPiArCSAqIGF0b21pYyBoZWxwZXJzIHRvIHZhbGlkYXRlIG1v ZGVzIHN1cHBsaWVkIGJ5IHVzZXJzcGFjZSBpbg0KPiArCSAqIGRybV9hdG9taWNfaGVscGVy X2NoZWNrX21vZGVzZXQoKS4NCj4gKwkgKg0KPiArCSAqIFRoaXMgZnVuY3Rpb24gaXMgb3B0 aW9uYWwuDQo+ICsJICoNCj4gKwkgKiBOT1RFOg0KPiArCSAqDQo+ICsJICogU2luY2UgdGhp cyBmdW5jdGlvbiBpcyBib3RoIGNhbGxlZCBmcm9tIHRoZSBjaGVjayBwaGFzZSBvZiBhbiBh dG9taWMNCj4gKwkgKiBjb21taXQsIGFuZCB0aGUgbW9kZSB2YWxpZGF0aW9uIGluIHRoZSBw cm9iZSBwYXRocyBpdCBpcyBub3QgYWxsb3dlZA0KPiArCSAqIHRvIGxvb2sgYXQgYW55dGhp bmcgZWxzZSBidXQgdGhlIHBhc3NlZC1pbiBtb2RlLCBhbmQgdmFsaWRhdGUgaXQNCj4gKwkg KiBhZ2FpbnN0IGNvbmZpZ3VyYXRpb24taW52YXJpYW50IGhhcmR3YXJlIGNvbnN0cmFpbnRz LiBBbnkgZnVydGhlcg0KPiArCSAqIGxpbWl0cyB3aGljaCBkZXBlbmQgdXBvbiB0aGUgY29u ZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGVja2VkIGluDQo+ICsJICogQG1vZGVfZml4dXAg b3IgQGF0b21pY19jaGVjay4NCj4gKwkgKg0KPiArCSAqIFJFVFVSTlM6DQo+ICsJICoNCj4g KwkgKiBkcm1fbW9kZV9zdGF0dXMgRW51bQ0KPiArCSAqLw0KPiArCWVudW0gZHJtX21vZGVf c3RhdHVzICgqbW9kZV92YWxpZCkoc3RydWN0IGRybV9lbmNvZGVyICpjcnRjLA0KPiArCQkJ CQkgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7DQo+ICsNCj4gKwkv KioNCj4gKwkgKiBAbW9kZV9maXh1cDoNCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sg aXMgdXNlZCB0byB2YWxpZGF0ZSBhbmQgYWRqdXN0IGEgbW9kZS4gVGhlIHBhcmFtZXRlcg0K PiArCSAqIG1vZGUgaXMgdGhlIGRpc3BsYXkgbW9kZSB0aGF0IHNob3VsZCBiZSBmZWQgdG8g dGhlIG5leHQgZWxlbWVudCBpbg0KPiArCSAqIHRoZSBkaXNwbGF5IGNoYWluLCBlaXRoZXIg dGhlIGZpbmFsICZkcm1fY29ubmVjdG9yIG9yIGEgJmRybV9icmlkZ2UuDQo+ICsJICogVGhl IHBhcmFtZXRlciBhZGp1c3RlZF9tb2RlIGlzIHRoZSBpbnB1dCBtb2RlIHRoZSBlbmNvZGVy IHJlcXVpcmVzLiBJdA0KPiArCSAqIGNhbiBiZSBtb2RpZmllZCBieSB0aGlzIGNhbGxiYWNr IGFuZCBkb2VzIG5vdCBuZWVkIHRvIG1hdGNoIG1vZGUuIFNlZQ0KPiArCSAqIGFsc28gJmRy bV9jcnRjX3N0YXRlLmFkanVzdGVkX21vZGUgZm9yIG1vcmUgZGV0YWlscy4NCj4gKwkgKg0K PiArCSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIGxlZ2FjeSBDUlRDIGhlbHBl cnMgYW5kIGF0b21pYyBoZWxwZXJzLg0KPiArCSAqIFRoaXMgaG9vayBpcyBvcHRpb25hbC4N Cj4gKwkgKg0KPiArCSAqIE5PVEU6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhhc2Ugb2YgYXRvbWljIG1vZGVzZXRzLCB3aGljaA0K PiArCSAqIGNhbiBiZSBhYm9ydGVkIGZvciBhbnkgcmVhc29uIChpbmNsdWRpbmcgb24gdXNl cnNwYWNlJ3MgcmVxdWVzdCB0bw0KPiArCSAqIGp1c3QgY2hlY2sgd2hldGhlciBhIGNvbmZp Z3VyYXRpb24gd291bGQgYmUgcG9zc2libGUpLiBBdG9taWMgZHJpdmVycw0KPiArCSAqIE1V U1QgTk9UIHRvdWNoIGFueSBwZXJzaXN0ZW50IHN0YXRlIChoYXJkd2FyZSBvciBzb2Z0d2Fy ZSkgb3IgZGF0YQ0KPiArCSAqIHN0cnVjdHVyZXMgZXhjZXB0IHRoZSBwYXNzZWQgaW4gYWRq dXN0ZWRfbW9kZSBwYXJhbWV0ZXIuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGlzIGluIGNvbnRy YXN0IHRvIHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzIHdoZXJlIHRoaXMgd2FzDQo+ICsJICog YWxsb3dlZC4NCj4gKwkgKg0KPiArCSAqIEF0b21pYyBkcml2ZXJzIHdoaWNoIG5lZWQgdG8g aW5zcGVjdCBhbmQgYWRqdXN0IG1vcmUgc3RhdGUgc2hvdWxkDQo+ICsJICogaW5zdGVhZCB1 c2UgdGhlIEBhdG9taWNfY2hlY2sgY2FsbGJhY2suIElmIEBhdG9taWNfY2hlY2sgaXMgdXNl ZCwNCj4gKwkgKiB0aGlzIGhvb2sgaXNuJ3QgY2FsbGVkIHNpbmNlIEBhdG9taWNfY2hlY2sg YWxsb3dzIGEgc3RyaWN0IHN1cGVyc2V0DQo+ICsJICogb2YgdGhlIGZ1bmN0aW9uYWxpdHkg b2YgQG1vZGVfZml4dXAuDQo+ICsJICoNCj4gKwkgKiBBbHNvIGJld2FyZSB0aGF0IHVzZXJz cGFjZSBjYW4gcmVxdWVzdCBpdHMgb3duIGN1c3RvbSBtb2RlcywgbmVpdGhlcg0KPiArCSAq IGNvcmUgbm9yIGhlbHBlcnMgZmlsdGVyIG1vZGVzIHRvIHRoZSBsaXN0IG9mIHByb2JlIG1v ZGVzIHJlcG9ydGVkIGJ5DQo+ICsJICogdGhlIEdFVENPTk5FQ1RPUiBJT0NUTCBhbmQgc3Rv cmVkIGluICZkcm1fY29ubmVjdG9yLm1vZGVzLiBUbyBlbnN1cmUNCj4gKwkgKiB0aGF0IG1v ZGVzIGFyZSBmaWx0ZXJlZCBjb25zaXN0ZW50bHkgcHV0IGFueSBlbmNvZGVyIGNvbnN0cmFp bnRzIGFuZA0KPiArCSAqIGxpbWl0cyBjaGVja3MgaW50byBAbW9kZV92YWxpZC4NCj4gKwkg Kg0KPiArCSAqIFJFVFVSTlM6DQo+ICsJICoNCj4gKwkgKiBUcnVlIGlmIGFuIGFjY2VwdGFi bGUgY29uZmlndXJhdGlvbiBpcyBwb3NzaWJsZSwgZmFsc2UgaWYgdGhlIG1vZGVzZXQNCj4g KwkgKiBvcGVyYXRpb24gc2hvdWxkIGJlIHJlamVjdGVkLg0KPiArCSAqLw0KPiArCWJvb2wg KCptb2RlX2ZpeHVwKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsDQo+ICsJCQkgICBj b25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwNCj4gKwkJCSAgIHN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsNCj4gKw0KPiArCS8qKg0KPiArCSAq IEBwcmVwYXJlOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBzaG91bGQgcHJlcGFy ZSB0aGUgZW5jb2RlciBmb3IgYSBzdWJzZXF1ZW50IG1vZGVzZXQsDQo+ICsJICogd2hpY2gg aW4gcHJhY3RpY2UgbWVhbnMgdGhlIGRyaXZlciBzaG91bGQgZGlzYWJsZSB0aGUgZW5jb2Rl ciBpZiBpdA0KPiArCSAqIGlzIHJ1bm5pbmcuIE1vc3QgZHJpdmVycyBlbmRlZCB1cCBpbXBs ZW1lbnRpbmcgdGhpcyBieSBjYWxsaW5nIHRoZWlyDQo+ICsJICogQGRwbXMgaG9vayB3aXRo IERSTV9NT0RFX0RQTVNfT0ZGLg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1 c2VkIGJ5IHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzLiAgQXRvbWljIGhlbHBlcnMNCj4gKwkg KiBhbHNvIHN1cHBvcnQgdXNpbmcgdGhpcyBob29rIGZvciBkaXNhYmxpbmcgYW4gZW5jb2Rl ciB0byBmYWNpbGl0YXRlDQo+ICsJICogdHJhbnNpdGlvbnMgdG8gYXRvbWljLCBidXQgaXQg aXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBAZGlzYWJsZSBzaG91bGQNCj4gKwkgKiBiZSB1c2Vk Lg0KPiArCSAqLw0KPiArCXZvaWQgKCpwcmVwYXJlKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVu Y29kZXIpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGNvbW1pdDoNCj4gKwkgKg0KPiArCSAq IFRoaXMgY2FsbGJhY2sgc2hvdWxkIGNvbW1pdCB0aGUgbmV3IG1vZGUgb24gdGhlIGVuY29k ZXIgYWZ0ZXIgYSBtb2Rlc2V0LA0KPiArCSAqIHdoaWNoIGluIHByYWN0aWNlIG1lYW5zIHRo ZSBkcml2ZXIgc2hvdWxkIGVuYWJsZSB0aGUgZW5jb2Rlci4gIE1vc3QNCj4gKwkgKiBkcml2 ZXJzIGVuZGVkIHVwIGltcGxlbWVudGluZyB0aGlzIGJ5IGNhbGxpbmcgdGhlaXIgQGRwbXMg aG9vayB3aXRoDQo+ICsJICogRFJNX01PREVfRFBNU19PTi4NCj4gKwkgKg0KPiArCSAqIFRo aXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgbGVnYWN5IENSVEMgaGVscGVycy4gIEF0b21p YyBoZWxwZXJzDQo+ICsJICogYWxzbyBzdXBwb3J0IHVzaW5nIHRoaXMgaG9vayBmb3IgZW5h YmxpbmcgYW4gZW5jb2RlciB0byBmYWNpbGl0YXRlDQo+ICsJICogdHJhbnNpdGlvbnMgdG8g YXRvbWljLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBAZW5hYmxlIHNob3VsZA0K PiArCSAqIGJlIHVzZWQuDQo+ICsJICovDQo+ICsJdm9pZCAoKmNvbW1pdCkoc3RydWN0IGRy bV9lbmNvZGVyICplbmNvZGVyKTsNCj4gKw0KPiArCS8qKg0KPiArCSAqIEBtb2RlX3NldDoN Cj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRp c3BsYXkgbW9kZSBvZiBhbiBlbmNvZGVyLg0KPiArCSAqDQo+ICsJICogTm90ZSB0aGF0IHRo ZSBkaXNwbGF5IHBpcGUgaXMgY29tcGxldGVseSBvZmYgd2hlbiB0aGlzIGZ1bmN0aW9uIGlz DQo+ICsJICogY2FsbGVkLiBEcml2ZXJzIHdoaWNoIG5lZWQgaGFyZHdhcmUgdG8gYmUgcnVu bmluZyBiZWZvcmUgdGhleSBwcm9ncmFtDQo+ICsJICogdGhlIG5ldyBkaXNwbGF5IG1vZGUg KGJlY2F1c2UgdGhleSBpbXBsZW1lbnQgcnVudGltZSBQTSkgc2hvdWxkIG5vdA0KPiArCSAq IHVzZSB0aGlzIGhvb2ssIGJlY2F1c2UgdGhlIGhlbHBlciBsaWJyYXJ5IGNhbGxzIGl0IG9u bHkgb25jZSBhbmQgbm90DQo+ICsJICogZXZlcnkgdGltZSB0aGUgZGlzcGxheSBwaXBlbGlu ZSBpcyBzdXNwZW5kIHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZQ0KPiArCSAqIG5ldyAiQUNU SVZFIiBwcm9wZXJ0eS4gU3VjaCBkcml2ZXJzIHNob3VsZCBpbnN0ZWFkIG1vdmUgYWxsIHRo ZWlyDQo+ICsJICogZW5jb2RlciBzZXR1cCBpbnRvIHRoZSBAZW5hYmxlIGNhbGxiYWNrLg0K PiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJvdGggYnkgdGhlIGxlZ2Fj eSBDUlRDIGhlbHBlcnMgYW5kIHRoZSBhdG9taWMNCj4gKwkgKiBtb2Rlc2V0IGhlbHBlcnMu IEl0IGlzIG9wdGlvbmFsIGluIHRoZSBhdG9taWMgaGVscGVycy4NCj4gKwkgKg0KPiArCSAq IE5PVEU6DQo+ICsJICoNCj4gKwkgKiBJZiB0aGUgZHJpdmVyIHVzZXMgdGhlIGF0b21pYyBt b2Rlc2V0IGhlbHBlcnMgYW5kIG5lZWRzIHRvIGluc3BlY3QNCj4gKwkgKiB0aGUgY29ubmVj dG9yIHN0YXRlIG9yIGNvbm5lY3RvciBkaXNwbGF5IGluZm8gZHVyaW5nIG1vZGUgc2V0dGlu ZywNCj4gKwkgKiBAYXRvbWljX21vZGVfc2V0IGNhbiBiZSB1c2VkIGluc3RlYWQuDQo+ICsJ ICovDQo+ICsJdm9pZCAoKm1vZGVfc2V0KShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIs DQo+ICsJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsDQo+ICsJCQkgc3RydWN0 IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOw0KPiArDQo+ICsJLyoqDQo+ICsJ ICogQGF0b21pY19tb2RlX3NldDoNCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgaXMg dXNlZCB0byB1cGRhdGUgdGhlIGRpc3BsYXkgbW9kZSBvZiBhbiBlbmNvZGVyLg0KPiArCSAq DQo+ICsJICogTm90ZSB0aGF0IHRoZSBkaXNwbGF5IHBpcGUgaXMgY29tcGxldGVseSBvZmYg d2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ICsJICogY2FsbGVkLiBEcml2ZXJzIHdoaWNoIG5l ZWQgaGFyZHdhcmUgdG8gYmUgcnVubmluZyBiZWZvcmUgdGhleSBwcm9ncmFtDQo+ICsJICog dGhlIG5ldyBkaXNwbGF5IG1vZGUgKGJlY2F1c2UgdGhleSBpbXBsZW1lbnQgcnVudGltZSBQ TSkgc2hvdWxkIG5vdA0KPiArCSAqIHVzZSB0aGlzIGhvb2ssIGJlY2F1c2UgdGhlIGhlbHBl ciBsaWJyYXJ5IGNhbGxzIGl0IG9ubHkgb25jZSBhbmQgbm90DQo+ICsJICogZXZlcnkgdGlt ZSB0aGUgZGlzcGxheSBwaXBlbGluZSBpcyBzdXNwZW5kZWQgdXNpbmcgZWl0aGVyIERQTVMg b3IgdGhlDQo+ICsJICogbmV3ICJBQ1RJVkUiIHByb3BlcnR5LiBTdWNoIGRyaXZlcnMgc2hv dWxkIGluc3RlYWQgbW92ZSBhbGwgdGhlaXINCj4gKwkgKiBlbmNvZGVyIHNldHVwIGludG8g dGhlIEBlbmFibGUgY2FsbGJhY2suDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlz IHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0IGhlbHBlcnMgaW4gcGxhY2Ugb2YgdGhlDQo+ ICsJICogQG1vZGVfc2V0IGNhbGxiYWNrLCBpZiBzZXQgYnkgdGhlIGRyaXZlci4gSXQgaXMg b3B0aW9uYWwgYW5kIHNob3VsZA0KPiArCSAqIGJlIHVzZWQgaW5zdGVhZCBvZiBAbW9kZV9z ZXQgaWYgdGhlIGRyaXZlciBuZWVkcyB0byBpbnNwZWN0IHRoZQ0KPiArCSAqIGNvbm5lY3Rv ciBzdGF0ZSBvciBkaXNwbGF5IGluZm8sIHNpbmNlIHRoZXJlIGlzIG5vIGRpcmVjdCB3YXkg dG8NCj4gKwkgKiBnbyBmcm9tIHRoZSBlbmNvZGVyIHRvIHRoZSBjdXJyZW50IGNvbm5lY3Rv ci4NCj4gKwkgKi8NCj4gKwl2b2lkICgqYXRvbWljX21vZGVfc2V0KShzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIsDQo+ICsJCQkJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0 YXRlLA0KPiArCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpjb25uX3N0YXRlKTsN Cj4gKw0KPiArCS8qKg0KPiArCSAqIEBkZXRlY3Q6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGNh bGxiYWNrIGNhbiBiZSB1c2VkIGJ5IGRyaXZlcnMgd2hvIHdhbnQgdG8gZG8gZGV0ZWN0aW9u IG9uIHRoZQ0KPiArCSAqIGVuY29kZXIgb2JqZWN0IGluc3RlYWQgb2YgaW4gY29ubmVjdG9y IGZ1bmN0aW9ucy4NCj4gKwkgKg0KPiArCSAqIEl0IGlzIG5vdCB1c2VkIGJ5IGFueSBoZWxw ZXIgYW5kIHRoZXJlZm9yZSBoYXMgcHVyZWx5IGRyaXZlci1zcGVjaWZpYw0KPiArCSAqIHNl bWFudGljcy4gTmV3IGRyaXZlcnMgc2hvdWxkbid0IHVzZSB0aGlzIGFuZCBpbnN0ZWFkIGp1 c3QgaW1wbGVtZW50DQo+ICsJICogdGhlaXIgb3duIHByaXZhdGUgY2FsbGJhY2tzLg0KPiAr CSAqDQo+ICsJICogRklYTUU6DQo+ICsJICoNCj4gKwkgKiBUaGlzIHNob3VsZCBqdXN0IGJl IGNvbnZlcnRlZCBpbnRvIGEgcGlsZSBvZiBkcml2ZXIgdmZ1bmNzLg0KPiArCSAqIEN1cnJl bnRseSByYWRlb24sIGFtZGdwdSBhbmQgbm91dmVhdSBhcmUgdXNpbmcgaXQuDQo+ICsJICov DQo+ICsJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyAoKmRldGVjdCkoc3RydWN0IGRybV9l bmNvZGVyICplbmNvZGVyLA0KPiArCQkJCQkgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3Rvcik7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAYXRvbWljX2Rpc2FibGU6DQo+ICsJ ICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIHNob3VsZCBiZSB1c2VkIHRvIGRpc2FibGUgdGhl IGVuY29kZXIuIFdpdGggdGhlIGF0b21pYw0KPiArCSAqIGRyaXZlcnMgaXQgaXMgY2FsbGVk IGJlZm9yZSB0aGlzIGVuY29kZXIncyBDUlRDIGhhcyBiZWVuIHNodXQgb2ZmDQo+ICsJICog dXNpbmcgdGhlaXIgb3duICZkcm1fY3J0Y19oZWxwZXJfZnVuY3MuYXRvbWljX2Rpc2FibGUg aG9vay4gSWYgdGhhdA0KPiArCSAqIHNlcXVlbmNlIGlzIHRvbyBzaW1wbGUgZHJpdmVycyBj YW4ganVzdCBhZGQgdGhlaXIgb3duIGRyaXZlciBwcml2YXRlDQo+ICsJICogZW5jb2RlciBo b29rcyBhbmQgY2FsbCB0aGVtIGZyb20gQ1JUQydzIGNhbGxiYWNrIGJ5IGxvb3Bpbmcgb3Zl ciBhbGwNCj4gKwkgKiBlbmNvZGVycyBjb25uZWN0ZWQgdG8gaXQgdXNpbmcgZm9yX2VhY2hf ZW5jb2Rlcl9vbl9jcnRjKCkuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIGEg dmFyaWFudCBvZiBAZGlzYWJsZSB0aGF0IHByb3ZpZGVzIHRoZSBhdG9taWMgc3RhdGUNCj4g KwkgKiB0byB0aGUgZHJpdmVyLiBJZiBAYXRvbWljX2Rpc2FibGUgaXMgaW1wbGVtZW50ZWQs IEBkaXNhYmxlIGlzIG5vdA0KPiArCSAqIGNhbGxlZCBieSB0aGUgaGVscGVycy4NCj4gKwkg Kg0KPiArCSAqIFRoaXMgaG9vayBpcyBvbmx5IHVzZWQgYnkgYXRvbWljIGhlbHBlcnMuIEF0 b21pYyBkcml2ZXJzIGRvbid0IG5lZWQNCj4gKwkgKiB0byBpbXBsZW1lbnQgaXQgaWYgdGhl cmUncyBubyBuZWVkIHRvIGRpc2FibGUgYW55dGhpbmcgYXQgdGhlIGVuY29kZXINCj4gKwkg KiBsZXZlbC4gVG8gZW5zdXJlIHRoYXQgcnVudGltZSBQTSBoYW5kbGluZyAodXNpbmcgZWl0 aGVyIERQTVMgb3IgdGhlDQo+ICsJICogbmV3ICJBQ1RJVkUiIHByb3BlcnR5KSB3b3JrcyBA YXRvbWljX2Rpc2FibGUgbXVzdCBiZSB0aGUgaW52ZXJzZSBvZg0KPiArCSAqIEBhdG9taWNf ZW5hYmxlLg0KPiArCSAqLw0KPiArCXZvaWQgKCphdG9taWNfZGlzYWJsZSkoc3RydWN0IGRy bV9lbmNvZGVyICplbmNvZGVyLA0KPiArCQkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0 YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAYXRvbWljX2VuYWJsZToNCj4g KwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGJlIHVzZWQgdG8gZW5hYmxlIHRo ZSBlbmNvZGVyLiBJdCBpcyBjYWxsZWQNCj4gKwkgKiBhZnRlciB0aGlzIGVuY29kZXIncyBD UlRDIGhhcyBiZWVuIGVuYWJsZWQgdXNpbmcgdGhlaXIgb3duDQo+ICsJICogJmRybV9jcnRj X2hlbHBlcl9mdW5jcy5hdG9taWNfZW5hYmxlIGhvb2suIElmIHRoYXQgc2VxdWVuY2UgaXMN Cj4gKwkgKiB0b28gc2ltcGxlIGRyaXZlcnMgY2FuIGp1c3QgYWRkIHRoZWlyIG93biBkcml2 ZXIgcHJpdmF0ZSBlbmNvZGVyDQo+ICsJICogaG9va3MgYW5kIGNhbGwgdGhlbSBmcm9tIENS VEMncyBjYWxsYmFjayBieSBsb29waW5nIG92ZXIgYWxsIGVuY29kZXJzDQo+ICsJICogY29u bmVjdGVkIHRvIGl0IHVzaW5nIGZvcl9lYWNoX2VuY29kZXJfb25fY3J0YygpLg0KPiArCSAq DQo+ICsJICogVGhpcyBjYWxsYmFjayBpcyBhIHZhcmlhbnQgb2YgQGVuYWJsZSB0aGF0IHBy b3ZpZGVzIHRoZSBhdG9taWMgc3RhdGUNCj4gKwkgKiB0byB0aGUgZHJpdmVyLiBJZiBAYXRv bWljX2VuYWJsZSBpcyBpbXBsZW1lbnRlZCwgQGVuYWJsZSBpcyBub3QNCj4gKwkgKiBjYWxs ZWQgYnkgdGhlIGhlbHBlcnMuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGhvb2sgaXMgb25seSB1 c2VkIGJ5IGF0b21pYyBoZWxwZXJzLCBpdCBpcyB0aGUgb3Bwb3NpdGUgb2YNCj4gKwkgKiBA YXRvbWljX2Rpc2FibGUuIEF0b21pYyBkcml2ZXJzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50 IGl0IGlmIHRoZXJlJ3MNCj4gKwkgKiBubyBuZWVkIHRvIGVuYWJsZSBhbnl0aGluZyBhdCB0 aGUgZW5jb2RlciBsZXZlbC4gVG8gZW5zdXJlIHRoYXQNCj4gKwkgKiBydW50aW1lIFBNIGhh bmRsaW5nIHdvcmtzIEBhdG9taWNfZW5hYmxlIG11c3QgYmUgdGhlIGludmVyc2Ugb2YNCj4g KwkgKiBAYXRvbWljX2Rpc2FibGUuDQo+ICsJICovDQo+ICsJdm9pZCAoKmF0b21pY19lbmFi bGUpKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwNCj4gKwkJCSAgICAgIHN0cnVjdCBk cm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAZGlzYWJs ZToNCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGJlIHVzZWQgdG8gZGlz YWJsZSB0aGUgZW5jb2Rlci4gV2l0aCB0aGUgYXRvbWljDQo+ICsJICogZHJpdmVycyBpdCBp cyBjYWxsZWQgYmVmb3JlIHRoaXMgZW5jb2RlcidzIENSVEMgaGFzIGJlZW4gc2h1dCBvZmYN Cj4gKwkgKiB1c2luZyB0aGVpciBvd24gJmRybV9jcnRjX2hlbHBlcl9mdW5jcy5kaXNhYmxl IGhvb2suICBJZiB0aGF0DQo+ICsJICogc2VxdWVuY2UgaXMgdG9vIHNpbXBsZSBkcml2ZXJz IGNhbiBqdXN0IGFkZCB0aGVpciBvd24gZHJpdmVyIHByaXZhdGUNCj4gKwkgKiBlbmNvZGVy IGhvb2tzIGFuZCBjYWxsIHRoZW0gZnJvbSBDUlRDJ3MgY2FsbGJhY2sgYnkgbG9vcGluZyBv dmVyIGFsbA0KPiArCSAqIGVuY29kZXJzIGNvbm5lY3RlZCB0byBpdCB1c2luZyBmb3JfZWFj aF9lbmNvZGVyX29uX2NydGMoKS4NCj4gKwkgKg0KPiArCSAqIFRoaXMgaG9vayBpcyB1c2Vk IGJvdGggYnkgbGVnYWN5IENSVEMgaGVscGVycyBhbmQgYXRvbWljIGhlbHBlcnMuDQo+ICsJ ICogQXRvbWljIGRyaXZlcnMgZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQgaXQgaWYgdGhlcmUn cyBubyBuZWVkIHRvDQo+ICsJICogZGlzYWJsZSBhbnl0aGluZyBhdCB0aGUgZW5jb2RlciBs ZXZlbC4gVG8gZW5zdXJlIHRoYXQgcnVudGltZSBQTQ0KPiArCSAqIGhhbmRsaW5nICh1c2lu ZyBlaXRoZXIgRFBNUyBvciB0aGUgbmV3ICJBQ1RJVkUiIHByb3BlcnR5KSB3b3Jrcw0KPiAr CSAqIEBkaXNhYmxlIG11c3QgYmUgdGhlIGludmVyc2Ugb2YgQGVuYWJsZSBmb3IgYXRvbWlj IGRyaXZlcnMuDQo+ICsJICoNCj4gKwkgKiBGb3IgYXRvbWljIGRyaXZlcnMgYWxzbyBjb25z aWRlciBAYXRvbWljX2Rpc2FibGUgYW5kIHNhdmUgeW91cnNlbGYNCj4gKwkgKiBmcm9tIGhh dmluZyB0byByZWFkIHRoZSBOT1RFIGJlbG93IQ0KPiArCSAqDQo+ICsJICogTk9URToNCj4g KwkgKg0KPiArCSAqIFdpdGggbGVnYWN5IENSVEMgaGVscGVycyB0aGVyZSdzIGEgYmlnIHNl bWFudGljIGRpZmZlcmVuY2UgYmV0d2Vlbg0KPiArCSAqIEBkaXNhYmxlIGFuZCBvdGhlciBo b29rcyAobGlrZSBAcHJlcGFyZSBvciBAZHBtcykgdXNlZCB0byBzaHV0IGRvd24gYQ0KPiAr CSAqIGVuY29kZXI6IEBkaXNhYmxlIGlzIG9ubHkgY2FsbGVkIHdoZW4gYWxzbyBsb2dpY2Fs bHkgZGlzYWJsaW5nIHRoZQ0KPiArCSAqIGRpc3BsYXkgcGlwZWxpbmUgYW5kIG5lZWRzIHRv IHJlbGVhc2UgYW55IHJlc291cmNlcyBhY3F1aXJlZCBpbg0KPiArCSAqIEBtb2RlX3NldCAo bGlrZSBzaGFyZWQgUExMcywgb3IgYWdhaW4gcmVsZWFzZSBwaW5uZWQgZnJhbWVidWZmZXJz KS4NCj4gKwkgKg0KPiArCSAqIFRoZXJlZm9yZSBAZGlzYWJsZSBtdXN0IGJlIHRoZSBpbnZl cnNlIG9mIEBtb2RlX3NldCBwbHVzIEBjb21taXQgZm9yDQo+ICsJICogZHJpdmVycyBzdGls bCB1c2luZyBsZWdhY3kgQ1JUQyBoZWxwZXJzLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0 aGUNCj4gKwkgKiBydWxlcyB1bmRlciBhdG9taWMuDQo+ICsJICovDQo+ICsJdm9pZCAoKmRp c2FibGUpKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7DQo+ICsNCj4gKwkvKioNCj4g KwkgKiBAZW5hYmxlOg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBzaG91bGQgYmUg dXNlZCB0byBlbmFibGUgdGhlIGVuY29kZXIuIFdpdGggdGhlIGF0b21pYw0KPiArCSAqIGRy aXZlcnMgaXQgaXMgY2FsbGVkIGFmdGVyIHRoaXMgZW5jb2RlcidzIENSVEMgaGFzIGJlZW4g ZW5hYmxlZCB1c2luZw0KPiArCSAqIHRoZWlyIG93biAmZHJtX2NydGNfaGVscGVyX2Z1bmNz LmVuYWJsZSBob29rLiAgSWYgdGhhdCBzZXF1ZW5jZSBpcw0KPiArCSAqIHRvbyBzaW1wbGUg ZHJpdmVycyBjYW4ganVzdCBhZGQgdGhlaXIgb3duIGRyaXZlciBwcml2YXRlIGVuY29kZXIN Cj4gKwkgKiBob29rcyBhbmQgY2FsbCB0aGVtIGZyb20gQ1JUQydzIGNhbGxiYWNrIGJ5IGxv b3Bpbmcgb3ZlciBhbGwgZW5jb2RlcnMNCj4gKwkgKiBjb25uZWN0ZWQgdG8gaXQgdXNpbmcg Zm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKCkuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGhvb2sg aXMgb25seSB1c2VkIGJ5IGF0b21pYyBoZWxwZXJzLCBpdCBpcyB0aGUgb3Bwb3NpdGUgb2YN Cj4gKwkgKiBAZGlzYWJsZS4gQXRvbWljIGRyaXZlcnMgZG9uJ3QgbmVlZCB0byBpbXBsZW1l bnQgaXQgaWYgdGhlcmUncyBubw0KPiArCSAqIG5lZWQgdG8gZW5hYmxlIGFueXRoaW5nIGF0 IHRoZSBlbmNvZGVyIGxldmVsLiBUbyBlbnN1cmUgdGhhdA0KPiArCSAqIHJ1bnRpbWUgUE0g aGFuZGxpbmcgKHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZSBuZXcgIkFDVElWRSIgcHJvcGVy dHkpDQo+ICsJICogd29ya3MgQGVuYWJsZSBtdXN0IGJlIHRoZSBpbnZlcnNlIG9mIEBkaXNh YmxlIGZvciBhdG9taWMgZHJpdmVycy4NCj4gKwkgKi8NCj4gKwl2b2lkICgqZW5hYmxlKShz dHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGF0 b21pY19jaGVjazoNCj4gKwkgKg0KPiArCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byB2 YWxpZGF0ZSBlbmNvZGVyIHN0YXRlIGZvciBhdG9taWMgZHJpdmVycy4NCj4gKwkgKiBTaW5j ZSB0aGUgZW5jb2RlciBpcyB0aGUgb2JqZWN0IGNvbm5lY3RpbmcgdGhlIENSVEMgYW5kIGNv bm5lY3RvciBpdA0KPiArCSAqIGdldHMgcGFzc2VkIGJvdGggc3RhdGVzLCB0byBiZSBhYmxl IHRvIHZhbGlkYXRlIGludGVyYWN0aW9ucyBhbmQNCj4gKwkgKiB1cGRhdGUgdGhlIENSVEMg dG8gbWF0Y2ggd2hhdCB0aGUgZW5jb2RlciBuZWVkcyBmb3IgdGhlIHJlcXVlc3RlZA0KPiAr CSAqIGNvbm5lY3Rvci4NCj4gKwkgKg0KPiArCSAqIFNpbmNlIHRoaXMgcHJvdmlkZXMgYSBz dHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YNCj4gKwkgKiBAbW9kZV9m aXh1cCAodGhlIHJlcXVlc3RlZCBhbmQgYWRqdXN0ZWQgbW9kZXMgYXJlIGJvdGggYXZhaWxh YmxlDQo+ICsJICogdGhyb3VnaCB0aGUgcGFzc2VkIGluICZzdHJ1Y3QgZHJtX2NydGNfc3Rh dGUpIEBtb2RlX2ZpeHVwIGlzIG5vdA0KPiArCSAqIGNhbGxlZCB3aGVuIEBhdG9taWNfY2hl Y2sgaXMgaW1wbGVtZW50ZWQuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIHVz ZWQgYnkgdGhlIGF0b21pYyBoZWxwZXJzLCBidXQgaXQgaXMgb3B0aW9uYWwuDQo+ICsJICoN Cj4gKwkgKiBOT1RFOg0KPiArCSAqDQo+ICsJICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQg aW4gdGhlIGNoZWNrIHBoYXNlIG9mIGFuIGF0b21pYyB1cGRhdGUuIFRoZQ0KPiArCSAqIGRy aXZlciBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgYW55dGhpbmcgb3V0c2lkZSBvZiB0aGUg ZnJlZS1zdGFuZGluZw0KPiArCSAqIHN0YXRlIG9iamVjdHMgcGFzc2VkLWluIG9yIGFzc2Vt YmxlZCBpbiB0aGUgb3ZlcmFsbCAmZHJtX2F0b21pY19zdGF0ZQ0KPiArCSAqIHVwZGF0ZSB0 cmFja2luZyBzdHJ1Y3R1cmUuDQo+ICsJICoNCj4gKwkgKiBBbHNvIGJld2FyZSB0aGF0IHVz ZXJzcGFjZSBjYW4gcmVxdWVzdCBpdHMgb3duIGN1c3RvbSBtb2RlcywgbmVpdGhlcg0KPiAr CSAqIGNvcmUgbm9yIGhlbHBlcnMgZmlsdGVyIG1vZGVzIHRvIHRoZSBsaXN0IG9mIHByb2Jl IG1vZGVzIHJlcG9ydGVkIGJ5DQo+ICsJICogdGhlIEdFVENPTk5FQ1RPUiBJT0NUTCBhbmQg c3RvcmVkIGluICZkcm1fY29ubmVjdG9yLm1vZGVzLiBUbyBlbnN1cmUNCj4gKwkgKiB0aGF0 IG1vZGVzIGFyZSBmaWx0ZXJlZCBjb25zaXN0ZW50bHkgcHV0IGFueSBlbmNvZGVyIGNvbnN0 cmFpbnRzIGFuZA0KPiArCSAqIGxpbWl0cyBjaGVja3MgaW50byBAbW9kZV92YWxpZC4NCj4g KwkgKg0KPiArCSAqIFJFVFVSTlM6DQo+ICsJICoNCj4gKwkgKiAwIG9uIHN1Y2Nlc3MsIC1F SU5WQUwgaWYgdGhlIHN0YXRlIG9yIHRoZSB0cmFuc2l0aW9uIGNhbid0IGJlDQo+ICsJICog c3VwcG9ydGVkLCAtRU5PTUVNIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgYW5kIC1F REVBRExLIGlmIGFuDQo+ICsJICogYXR0ZW1wdCB0byBvYnRhaW4gYW5vdGhlciBzdGF0ZSBv YmplY3QgcmFuIGludG8gYSAmZHJtX21vZGVzZXRfbG9jaw0KPiArCSAqIGRlYWRsb2NrLg0K PiArCSAqLw0KPiArCWludCAoKmF0b21pY19jaGVjaykoc3RydWN0IGRybV9lbmNvZGVyICpl bmNvZGVyLA0KPiArCQkJICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwN Cj4gKwkJCSAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSk7DQo+ ICt9Ow0KPiArDQo+ICsvKioNCj4gKyAqIGRybV9lbmNvZGVyX2hlbHBlcl9hZGQgLSBzZXRz IHRoZSBoZWxwZXIgdnRhYmxlIGZvciBhbiBlbmNvZGVyDQo+ICsgKiBAZW5jb2RlcjogRFJN IGVuY29kZXINCj4gKyAqIEBmdW5jczogaGVscGVyIHZ0YWJsZSB0byBzZXQgZm9yIEBlbmNv ZGVyDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm1fZW5jb2Rlcl9oZWxwZXJf YWRkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwNCj4gKwkJCQkJICBjb25zdCBzdHJ1 Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpmdW5jcykNCj4gK3sNCj4gKwllbmNvZGVy LT5oZWxwZXJfcHJpdmF0ZSA9IGZ1bmNzOw0KPiArfQ0KPiArDQo+ICsjZW5kaWYgLyogX19E Uk1fRU5DT0RFUl9IRUxQRVJfVlRBQkxFX0hfXyAqLw0KPiBkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9kcm0vZHJtX21vZGVfY29uZmlnX2hlbHBlcl92dGFibGUuaCBiL2luY2x1ZGUvZHJtL2Ry bV9tb2RlX2NvbmZpZ19oZWxwZXJfdnRhYmxlLmgNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQN Cj4gaW5kZXggMDAwMDAwMDAwMDAwMDAwMC4uYTU2ZTM0OTBlMjc0MTFkZQ0KPiAtLS0gL2Rl di9udWxsDQo+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2RlX2NvbmZpZ19oZWxwZXJfdnRh YmxlLmgNCj4gQEAgLTAsMCArMSw5NyBAQA0KPiArLyoNCj4gKyAqIENvcHlyaWdodCDCqSAy MDA2IEtlaXRoIFBhY2thcmQNCj4gKyAqIENvcHlyaWdodCDCqSAyMDA3LTIwMDggRGF2ZSBB aXJsaWUNCj4gKyAqIENvcHlyaWdodCDCqSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24N Cj4gKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPg0KPiArICog Q29weXJpZ2h0IMKpIDIwMTEtMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbg0KPiArICogQ29weXJp Z2h0IMKpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24NCj4gKyAqICAgRGFuaWVsIFZldHRlciA8 ZGFuaWVsLnZldHRlckBmZndsbC5jaD4NCj4gKyAqDQo+ICsgKiBQZXJtaXNzaW9uIGlzIGhl cmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcg YQ0KPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50 YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNv ZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRp b24NCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJs aXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLA0KPiArICogYW5kL29yIHNlbGwgY29waWVz IG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlDQo+ ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZv bGxvd2luZyBjb25kaXRpb25zOg0KPiArICoNCj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGlu DQo+ICsgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0 d2FyZS4NCj4gKyAqDQo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwg V0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KPiArICogSU1QTElF RCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFksDQo+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwNCj4gKyAqIFRIRSBDT1BZ UklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUg0KPiArICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElP TiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsDQo+ICsgKiBBUklTSU5HIEZST00s IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1INCj4gKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCj4gKyAqLw0KPiAr DQo+ICsjaWZuZGVmIF9fRFJNX01PREVfQ09ORklHX0hFTFBFUl9WVEFCTEVfSF9fDQo+ICsj ZGVmaW5lIF9fRFJNX01PREVfQ09ORklHX0hFTFBFUl9WVEFCTEVfSF9fDQo+ICsNCj4gKy8q Kg0KPiArICogc3RydWN0IGRybV9tb2RlX2NvbmZpZ19oZWxwZXJfZnVuY3MgLSBnbG9iYWwg bW9kZXNldCBoZWxwZXIgb3BlcmF0aW9ucw0KPiArICoNCj4gKyAqIFRoZXNlIGhlbHBlciBm dW5jdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGF0b21pYyBoZWxwZXJzLg0KPiArICovDQo+ICtz dHJ1Y3QgZHJtX21vZGVfY29uZmlnX2hlbHBlcl9mdW5jcyB7DQo+ICsJLyoqDQo+ICsJICog QGF0b21pY19jb21taXRfdGFpbDoNCj4gKwkgKg0KPiArCSAqIFRoaXMgaG9vayBpcyB1c2Vk IGJ5IHRoZSBkZWZhdWx0IGF0b21pY19jb21taXQoKSBob29rIGltcGxlbWVudGVkIGluDQo+ ICsJICogZHJtX2F0b21pY19oZWxwZXJfY29tbWl0KCkgdG9nZXRoZXIgd2l0aCB0aGUgbm9u YmxvY2tpbmcgY29tbWl0DQo+ICsJICogaGVscGVycyAoc2VlIGRybV9hdG9taWNfaGVscGVy X3NldHVwX2NvbW1pdCgpIGZvciBhIHN0YXJ0aW5nIHBvaW50KQ0KPiArCSAqIHRvIGltcGxl bWVudCBibG9ja2luZyBhbmQgbm9uYmxvY2tpbmcgY29tbWl0cyBlYXNpbHkuIEl0IGlzIG5v dCB1c2VkDQo+ICsJICogYnkgdGhlIGF0b21pYyBoZWxwZXJzDQo+ICsJICoNCj4gKwkgKiBU aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBuZXcgYXRvbWljIHN0YXRlIGhhcyBh bHJlYWR5IGJlZW4NCj4gKwkgKiBzd2FwcGVkIGludG8gdGhlIHZhcmlvdXMgc3RhdGUgcG9p bnRlcnMuIFRoZSBwYXNzZWQgaW4gc3RhdGUNCj4gKwkgKiB0aGVyZWZvcmUgY29udGFpbnMg Y29waWVzIG9mIHRoZSBvbGQvcHJldmlvdXMgc3RhdGUuIFRoaXMgaG9vayBzaG91bGQNCj4g KwkgKiBjb21taXQgdGhlIG5ldyBzdGF0ZSBpbnRvIGhhcmR3YXJlLiBOb3RlIHRoYXQgdGhl IGhlbHBlcnMgaGF2ZQ0KPiArCSAqIGFscmVhZHkgd2FpdGVkIGZvciBwcmVjZWRpbmcgYXRv bWljIGNvbW1pdHMgYW5kIGZlbmNlcywgYnV0IGRyaXZlcnMNCj4gKwkgKiBjYW4gYWRkIG1v cmUgd2FpdGluZyBjYWxscyBhdCB0aGUgc3RhcnQgb2YgdGhlaXIgaW1wbGVtZW50YXRpb24s IGUuZy4NCj4gKwkgKiB0byB3YWl0IGZvciBkcml2ZXItaW50ZXJuYWwgcmVxdWVzdCBmb3Ig aW1wbGljaXQgc3luY2luZywgYmVmb3JlDQo+ICsJICogc3RhcnRpbmcgdG8gY29tbWl0IHRo ZSB1cGRhdGUgdG8gdGhlIGhhcmR3YXJlLg0KPiArCSAqDQo+ICsJICogQWZ0ZXIgdGhlIGF0 b21pYyB1cGRhdGUgaXMgY29tbWl0dGVkIHRvIHRoZSBoYXJkd2FyZSB0aGlzIGhvb2sgbmVl ZHMNCj4gKwkgKiB0byBjYWxsIGRybV9hdG9taWNfaGVscGVyX2NvbW1pdF9od19kb25lKCku IFRoZW4gd2FpdCBmb3IgdGhlIHVwZGF0ZQ0KPiArCSAqIHRvIGJlIGV4ZWN1dGVkIGJ5IHRo ZSBoYXJkd2FyZSwgZm9yIGV4YW1wbGUgdXNpbmcNCj4gKwkgKiBkcm1fYXRvbWljX2hlbHBl cl93YWl0X2Zvcl92YmxhbmtzKCkgb3INCj4gKwkgKiBkcm1fYXRvbWljX2hlbHBlcl93YWl0 X2Zvcl9mbGlwX2RvbmUoKSwgYW5kIHRoZW4gY2xlYW4gdXAgdGhlIG9sZA0KPiArCSAqIGZy YW1lYnVmZmVycyB1c2luZyBkcm1fYXRvbWljX2hlbHBlcl9jbGVhbnVwX3BsYW5lcygpLg0K PiArCSAqDQo+ICsJICogV2hlbiBkaXNhYmxpbmcgYSBDUlRDIHRoaXMgaG9vayBfbXVzdF8g c3RhbGwgZm9yIHRoZSBjb21taXQgdG8NCj4gKwkgKiBjb21wbGV0ZS4gVmJsYW5rIHdhaXRz IGRvbid0IHdvcmsgb24gZGlzYWJsZWQgQ1JUQywgaGVuY2UgdGhlIGNvcmUNCj4gKwkgKiBj YW4ndCB0YWtlIGNhcmUgb2YgdGhpcy4gQW5kIGl0IGFsc28gY2FuJ3QgcmVseSBvbiB0aGUg dmJsYW5rIGV2ZW50LA0KPiArCSAqIHNpbmNlIHRoYXQgY2FuIGJlIHNpZ25hbGxlZCBhbHJl YWR5IHdoZW4gdGhlIHNjcmVlbiBzaG93cyBibGFjaywNCj4gKwkgKiB3aGljaCBjYW4gaGFw cGVuIG11Y2ggZWFybGllciB0aGFuIHRoZSBsYXN0IGhhcmR3YXJlIGFjY2VzcyBuZWVkZWQg dG8NCj4gKwkgKiBzaHV0IG9mZiB0aGUgZGlzcGxheSBwaXBlbGluZSBjb21wbGV0ZWx5Lg0K PiArCSAqDQo+ICsJICogVGhpcyBob29rIGlzIG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBpbXBs ZW1lbnRhdGlvbiBpcw0KPiArCSAqIGRybV9hdG9taWNfaGVscGVyX2NvbW1pdF90YWlsKCku DQo+ICsJICovDQo+ICsJdm9pZCAoKmF0b21pY19jb21taXRfdGFpbCkoc3RydWN0IGRybV9h dG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gKw0KPiArCS8qKg0KPiArCSAqIEBhdG9taWNfY29t bWl0X3NldHVwOg0KPiArCSAqDQo+ICsJICogVGhpcyBob29rIGlzIHVzZWQgYnkgdGhlIGRl ZmF1bHQgYXRvbWljX2NvbW1pdCgpIGhvb2sgaW1wbGVtZW50ZWQgaW4NCj4gKwkgKiBkcm1f YXRvbWljX2hlbHBlcl9jb21taXQoKSB0b2dldGhlciB3aXRoIHRoZSBub25ibG9ja2luZyBo ZWxwZXJzIChzZWUNCj4gKwkgKiBkcm1fYXRvbWljX2hlbHBlcl9zZXR1cF9jb21taXQoKSkg dG8gZXh0ZW5kIHRoZSBEUk0gY29tbWl0IHNldHVwLiBJdA0KPiArCSAqIGlzIG5vdCB1c2Vk IGJ5IHRoZSBhdG9taWMgaGVscGVycy4NCj4gKwkgKg0KPiArCSAqIFRoaXMgZnVuY3Rpb24g aXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YNCj4gKwkgKiBkcm1fYXRvbWljX2hlbHBlcl9zZXR1 cF9jb21taXQoKSwgc28gb25jZSB0aGUgY29tbWl0IGhhcyBiZWVuDQo+ICsJICogcHJvcGVy bHkgc2V0dXAgYWNyb3NzIHRoZSBnZW5lcmljIERSTSBvYmplY3Qgc3RhdGVzLiBJdCBhbGxv d3MNCj4gKwkgKiBkcml2ZXJzIHRvIGRvIHNvbWUgYWRkaXRpb25hbCBjb21taXQgdHJhY2tp bmcgdGhhdCBpc24ndCByZWxhdGVkIHRvIGENCj4gKwkgKiBDUlRDLCBwbGFuZSBvciBjb25u ZWN0b3IsIHRyYWNrZWQgaW4gYSAmZHJtX3ByaXZhdGVfb2JqIHN0cnVjdHVyZS4NCj4gKwkg Kg0KPiArCSAqIE5vdGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBvZiAmZHJtX3ByaXZhdGVf b2JqIGhhcyBtb3JlIGRldGFpbHMgb24NCj4gKwkgKiBob3cgb25lIHNob3VsZCBpbXBsZW1l bnQgdGhpcy4NCj4gKwkgKg0KPiArCSAqIFRoaXMgaG9vayBpcyBvcHRpb25hbC4NCj4gKwkg Ki8NCj4gKwlpbnQgKCphdG9taWNfY29tbWl0X3NldHVwKShzdHJ1Y3QgZHJtX2F0b21pY19z dGF0ZSAqc3RhdGUpOw0KPiArfTsNCj4gKw0KPiArI2VuZGlmIC8qIF9fRFJNX01PREVfQ09O RklHX0hFTFBFUl9WVEFCTEVfSF9fICovDQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9k cm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oIGIvaW5jbHVkZS9kcm0vZHJtX21vZGVzZXRf aGVscGVyX3Z0YWJsZXMuaA0KPiBpbmRleCA5MTg2MDM3MmJlNmMwNjRlLi5hOWZiNDNiMDdi NjA4NzJkIDEwMDY0NA0KPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fbW9kZXNldF9oZWxwZXJf dnRhYmxlcy5oDQo+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2hlbHBlcl92dGFi bGVzLmgNCj4gQEAgLTQ4LDE0NjYgKzQ4LDEwIEBADQo+ICAgICogVG8gbWFrZSB0aGlzIGNs ZWFyIGFsbCB0aGUgaGVscGVyIHZ0YWJsZXMgYXJlIHB1bGxlZCB0b2dldGhlciBpbiB0aGlz IGxvY2F0aW9uIGhlcmUuDQo+ICAgICovDQo+ICAgDQo+IC1zdHJ1Y3QgZHJtX3dyaXRlYmFj a19jb25uZWN0b3I7DQo+IC1zdHJ1Y3QgZHJtX3dyaXRlYmFja19qb2I7DQo+IC0NCj4gLWVu dW0gbW9kZV9zZXRfYXRvbWljIHsNCj4gLQlMRUFWRV9BVE9NSUNfTU9ERV9TRVQsDQo+IC0J RU5URVJfQVRPTUlDX01PREVfU0VULA0KPiAtfTsNCj4gLQ0KPiAtLyoqDQo+IC0gKiBzdHJ1 Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIC0gaGVscGVyIG9wZXJhdGlvbnMgZm9yIENSVENz DQo+IC0gKg0KPiAtICogVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRD IGhlbHBlcnMgYW5kIHRoZSBuZXcgYXRvbWljDQo+IC0gKiBtb2Rlc2V0dGluZyBoZWxwZXJz Lg0KPiAtICovDQo+IC1zdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIHsNCj4gLQkvKioN Cj4gLQkgKiBAZHBtczoNCj4gLQkgKg0KPiAtCSAqIENhbGxiYWNrIHRvIGNvbnRyb2wgcG93 ZXIgbGV2ZWxzIG9uIHRoZSBDUlRDLiAgSWYgdGhlIG1vZGUgcGFzc2VkIGluDQo+IC0JICog aXMgdW5zdXBwb3J0ZWQsIHRoZSBwcm92aWRlciBtdXN0IHVzZSB0aGUgbmV4dCBsb3dlc3Qg cG93ZXIgbGV2ZWwuDQo+IC0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kgQ1JUQyBo ZWxwZXJzIHRvIGltcGxlbWVudCBEUE1TDQo+IC0JICogZnVuY3Rpb25hbGl0eSBpbiBkcm1f aGVscGVyX2Nvbm5lY3Rvcl9kcG1zKCkuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNr IGlzIGFsc28gdXNlZCB0byBkaXNhYmxlIGEgQ1JUQyBieSBjYWxsaW5nIGl0IHdpdGgNCj4g LQkgKiBEUk1fTU9ERV9EUE1TX09GRiBpZiB0aGUgQGRpc2FibGUgaG9vayBpc24ndCB1c2Vk Lg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kg Q1JUQyBoZWxwZXJzLiAgQXRvbWljIGhlbHBlcnMNCj4gLQkgKiBhbHNvIHN1cHBvcnQgdXNp bmcgdGhpcyBob29rIGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIGEgQ1JUQyB0bw0KPiAt CSAqIGZhY2lsaXRhdGUgdHJhbnNpdGlvbnMgdG8gYXRvbWljLCBidXQgaXQgaXMgZGVwcmVj YXRlZC4gSW5zdGVhZA0KPiAtCSAqIEBhdG9taWNfZW5hYmxlIGFuZCBAYXRvbWljX2Rpc2Fi bGUgc2hvdWxkIGJlIHVzZWQuDQo+IC0JICovDQo+IC0Jdm9pZCAoKmRwbXMpKHN0cnVjdCBk cm1fY3J0YyAqY3J0YywgaW50IG1vZGUpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICogQHByZXBh cmU6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIHNob3VsZCBwcmVwYXJlIHRoZSBD UlRDIGZvciBhIHN1YnNlcXVlbnQgbW9kZXNldCwgd2hpY2gNCj4gLQkgKiBpbiBwcmFjdGlj ZSBtZWFucyB0aGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIHRoZSBDUlRDIGlmIGl0IGlzDQo+ IC0JICogcnVubmluZy4gTW9zdCBkcml2ZXJzIGVuZGVkIHVwIGltcGxlbWVudGluZyB0aGlz IGJ5IGNhbGxpbmcgdGhlaXINCj4gLQkgKiBAZHBtcyBob29rIHdpdGggRFJNX01PREVfRFBN U19PRkYuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGxl Z2FjeSBDUlRDIGhlbHBlcnMuICBBdG9taWMgaGVscGVycw0KPiAtCSAqIGFsc28gc3VwcG9y dCB1c2luZyB0aGlzIGhvb2sgZm9yIGRpc2FibGluZyBhIENSVEMgdG8gZmFjaWxpdGF0ZQ0K PiAtCSAqIHRyYW5zaXRpb25zIHRvIGF0b21pYywgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuIElu c3RlYWQgQGF0b21pY19kaXNhYmxlDQo+IC0JICogc2hvdWxkIGJlIHVzZWQuDQo+IC0JICov DQo+IC0Jdm9pZCAoKnByZXBhcmUpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7DQo+IC0NCj4g LQkvKioNCj4gLQkgKiBAY29tbWl0Og0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBz aG91bGQgY29tbWl0IHRoZSBuZXcgbW9kZSBvbiB0aGUgQ1JUQyBhZnRlciBhIG1vZGVzZXQs DQo+IC0JICogd2hpY2ggaW4gcHJhY3RpY2UgbWVhbnMgdGhlIGRyaXZlciBzaG91bGQgZW5h YmxlIHRoZSBDUlRDLiAgTW9zdA0KPiAtCSAqIGRyaXZlcnMgZW5kZWQgdXAgaW1wbGVtZW50 aW5nIHRoaXMgYnkgY2FsbGluZyB0aGVpciBAZHBtcyBob29rIHdpdGgNCj4gLQkgKiBEUk1f TU9ERV9EUE1TX09OLg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5 IHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzLiAgQXRvbWljIGhlbHBlcnMNCj4gLQkgKiBhbHNv IHN1cHBvcnQgdXNpbmcgdGhpcyBob29rIGZvciBlbmFibGluZyBhIENSVEMgdG8gZmFjaWxp dGF0ZQ0KPiAtCSAqIHRyYW5zaXRpb25zIHRvIGF0b21pYywgYnV0IGl0IGlzIGRlcHJlY2F0 ZWQuIEluc3RlYWQgQGF0b21pY19lbmFibGUNCj4gLQkgKiBzaG91bGQgYmUgdXNlZC4NCj4g LQkgKi8NCj4gLQl2b2lkICgqY29tbWl0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOw0KPiAt DQo+IC0JLyoqDQo+IC0JICogQG1vZGVfdmFsaWQ6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGNh bGxiYWNrIGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBzcGVjaWZpYyBtb2RlIGlzIHZhbGlkIGlu IHRoaXMNCj4gLQkgKiBjcnRjLiBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpZiB0aGUg Y3J0YyBoYXMgc29tZSBzb3J0IG9mDQo+IC0JICogcmVzdHJpY3Rpb24gaW4gdGhlIG1vZGVz IGl0IGNhbiBkaXNwbGF5LiBGb3IgZXhhbXBsZSwgYSBnaXZlbiBjcnRjDQo+IC0JICogbWF5 IGJlIHJlc3BvbnNpYmxlIHRvIHNldCBhIGNsb2NrIHZhbHVlLiBJZiB0aGUgY2xvY2sgY2Fu IG5vdA0KPiAtCSAqIHByb2R1Y2UgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBhdmFpbGFibGUg bW9kZXMgdGhlbiB0aGlzIGNhbGxiYWNrDQo+IC0JICogY2FuIGJlIHVzZWQgdG8gcmVzdHJp Y3QgdGhlIG51bWJlciBvZiBtb2RlcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQNCj4gLQkgKiBj YW4gYmUgZGlzcGxheWVkLg0KPiAtCSAqDQo+IC0JICogVGhpcyBob29rIGlzIHVzZWQgYnkg dGhlIHByb2JlIGhlbHBlcnMgdG8gZmlsdGVyIHRoZSBtb2RlIGxpc3QgaW4NCj4gLQkgKiBk cm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoKSwgYW5kIGl0IGlzIHVz ZWQgYnkgdGhlDQo+IC0JICogYXRvbWljIGhlbHBlcnMgdG8gdmFsaWRhdGUgbW9kZXMgc3Vw cGxpZWQgYnkgdXNlcnNwYWNlIGluDQo+IC0JICogZHJtX2F0b21pY19oZWxwZXJfY2hlY2tf bW9kZXNldCgpLg0KPiAtCSAqDQo+IC0JICogVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC4N Cj4gLQkgKg0KPiAtCSAqIE5PVEU6DQo+IC0JICoNCj4gLQkgKiBTaW5jZSB0aGlzIGZ1bmN0 aW9uIGlzIGJvdGggY2FsbGVkIGZyb20gdGhlIGNoZWNrIHBoYXNlIG9mIGFuIGF0b21pYw0K PiAtCSAqIGNvbW1pdCwgYW5kIHRoZSBtb2RlIHZhbGlkYXRpb24gaW4gdGhlIHByb2JlIHBh dGhzIGl0IGlzIG5vdCBhbGxvd2VkDQo+IC0JICogdG8gbG9vayBhdCBhbnl0aGluZyBlbHNl IGJ1dCB0aGUgcGFzc2VkLWluIG1vZGUsIGFuZCB2YWxpZGF0ZSBpdA0KPiAtCSAqIGFnYWlu c3QgY29uZmlndXJhdGlvbi1pbnZhcmlhbnQgaGFyZHdhcmUgY29uc3RyYWludHMuIEFueSBm dXJ0aGVyDQo+IC0JICogbGltaXRzIHdoaWNoIGRlcGVuZCB1cG9uIHRoZSBjb25maWd1cmF0 aW9uIGNhbiBvbmx5IGJlIGNoZWNrZWQgaW4NCj4gLQkgKiBAbW9kZV9maXh1cCBvciBAYXRv bWljX2NoZWNrLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAtCSAqIGRy bV9tb2RlX3N0YXR1cyBFbnVtDQo+IC0JICovDQo+IC0JZW51bSBkcm1fbW9kZV9zdGF0dXMg KCptb2RlX3ZhbGlkKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+IC0JCQkJCSAgIGNvbnN0 IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAq IEBtb2RlX2ZpeHVwOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIHRv IHZhbGlkYXRlIGEgbW9kZS4gVGhlIHBhcmFtZXRlciBtb2RlIGlzIHRoZQ0KPiAtCSAqIGRp c3BsYXkgbW9kZSB0aGF0IHVzZXJzcGFjZSByZXF1ZXN0ZWQsIGFkanVzdGVkX21vZGUgaXMg dGhlIG1vZGUgdGhlDQo+IC0JICogZW5jb2RlcnMgbmVlZCB0byBiZSBmZWQgd2l0aC4gTm90 ZSB0aGF0IHRoaXMgaXMgdGhlIGludmVyc2Ugc2VtYW50aWNzDQo+IC0JICogb2YgdGhlIG1l YW5pbmcgZm9yIHRoZSAmZHJtX2VuY29kZXIgYW5kICZkcm1fYnJpZGdlX2Z1bmNzLm1vZGVf Zml4dXANCj4gLQkgKiB2ZnVuYy4gSWYgdGhlIENSVEMgY2Fubm90IHN1cHBvcnQgdGhlIHJl cXVlc3RlZCBjb252ZXJzaW9uIGZyb20gbW9kZQ0KPiAtCSAqIHRvIGFkanVzdGVkX21vZGUg aXQgc2hvdWxkIHJlamVjdCB0aGUgbW9kZXNldC4gU2VlIGFsc28NCj4gLQkgKiAmZHJtX2Ny dGNfc3RhdGUuYWRqdXN0ZWRfbW9kZSBmb3IgbW9yZSBkZXRhaWxzLg0KPiAtCSAqDQo+IC0J ICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGJvdGggbGVnYWN5IENSVEMgaGVscGVycyBh bmQgYXRvbWljIGhlbHBlcnMuDQo+IC0JICogV2l0aCBhdG9taWMgaGVscGVycyBpdCBpcyBv cHRpb25hbC4NCj4gLQkgKg0KPiAtCSAqIE5PVEU6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1 bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhhc2Ugb2YgYXRvbWljIG1vZGVzZXRz LCB3aGljaA0KPiAtCSAqIGNhbiBiZSBhYm9ydGVkIGZvciBhbnkgcmVhc29uIChpbmNsdWRp bmcgb24gdXNlcnNwYWNlJ3MgcmVxdWVzdCB0bw0KPiAtCSAqIGp1c3QgY2hlY2sgd2hldGhl ciBhIGNvbmZpZ3VyYXRpb24gd291bGQgYmUgcG9zc2libGUpLiBBdG9taWMgZHJpdmVycw0K PiAtCSAqIE1VU1QgTk9UIHRvdWNoIGFueSBwZXJzaXN0ZW50IHN0YXRlIChoYXJkd2FyZSBv ciBzb2Z0d2FyZSkgb3IgZGF0YQ0KPiAtCSAqIHN0cnVjdHVyZXMgZXhjZXB0IHRoZSBwYXNz ZWQgaW4gYWRqdXN0ZWRfbW9kZSBwYXJhbWV0ZXIuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGlz IGluIGNvbnRyYXN0IHRvIHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzIHdoZXJlIHRoaXMgd2Fz DQo+IC0JICogYWxsb3dlZC4NCj4gLQkgKg0KPiAtCSAqIEF0b21pYyBkcml2ZXJzIHdoaWNo IG5lZWQgdG8gaW5zcGVjdCBhbmQgYWRqdXN0IG1vcmUgc3RhdGUgc2hvdWxkDQo+IC0JICog aW5zdGVhZCB1c2UgdGhlIEBhdG9taWNfY2hlY2sgY2FsbGJhY2ssIGJ1dCBub3RlIHRoYXQg dGhleSdyZSBub3QNCj4gLQkgKiBwZXJmZWN0bHkgZXF1aXZhbGVudDogQG1vZGVfdmFsaWQg aXMgY2FsbGVkIGZyb20NCj4gLQkgKiBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0 KCksIGJ1dCBAYXRvbWljX2NoZWNrIGlzIGNhbGxlZCBmcm9tDQo+IC0JICogZHJtX2F0b21p Y19oZWxwZXJfY2hlY2tfcGxhbmVzKCksIGJlY2F1c2Ugb3JpZ2luYWxseSBpdCB3YXMgbWVh bnQgZm9yDQo+IC0JICogcGxhbmUgdXBkYXRlIGNoZWNrcyBvbmx5Lg0KPiAtCSAqDQo+IC0J ICogQWxzbyBiZXdhcmUgdGhhdCB1c2Vyc3BhY2UgY2FuIHJlcXVlc3QgaXRzIG93biBjdXN0 b20gbW9kZXMsIG5laXRoZXINCj4gLQkgKiBjb3JlIG5vciBoZWxwZXJzIGZpbHRlciBtb2Rl cyB0byB0aGUgbGlzdCBvZiBwcm9iZSBtb2RlcyByZXBvcnRlZCBieQ0KPiAtCSAqIHRoZSBH RVRDT05ORUNUT1IgSU9DVEwgYW5kIHN0b3JlZCBpbiAmZHJtX2Nvbm5lY3Rvci5tb2Rlcy4g VG8gZW5zdXJlDQo+IC0JICogdGhhdCBtb2RlcyBhcmUgZmlsdGVyZWQgY29uc2lzdGVudGx5 IHB1dCBhbnkgQ1JUQyBjb25zdHJhaW50cyBhbmQNCj4gLQkgKiBsaW1pdHMgY2hlY2tzIGlu dG8gQG1vZGVfdmFsaWQuDQo+IC0JICoNCj4gLQkgKiBSRVRVUk5TOg0KPiAtCSAqDQo+IC0J ICogVHJ1ZSBpZiBhbiBhY2NlcHRhYmxlIGNvbmZpZ3VyYXRpb24gaXMgcG9zc2libGUsIGZh bHNlIGlmIHRoZSBtb2Rlc2V0DQo+IC0JICogb3BlcmF0aW9uIHNob3VsZCBiZSByZWplY3Rl ZC4NCj4gLQkgKi8NCj4gLQlib29sICgqbW9kZV9maXh1cCkoc3RydWN0IGRybV9jcnRjICpj cnRjLA0KPiAtCQkJICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsDQo+ IC0JCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7DQo+IC0N Cj4gLQkvKioNCj4gLQkgKiBAbW9kZV9zZXQ6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxi YWNrIGlzIHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRDIGhlbHBlcnMgdG8gc2V0IGEgbmV3IG1v ZGUsDQo+IC0JICogcG9zaXRpb24gYW5kIGZyYW1lYnVmZmVyLiBTaW5jZSBpdCB0aWVzIHRo ZSBwcmltYXJ5IHBsYW5lIHRvIGV2ZXJ5DQo+IC0JICogbW9kZSBjaGFuZ2UgaXQgaXMgaW5j b21wYXRpYmxlIHdpdGggdW5pdmVyc2FsIHBsYW5lIHN1cHBvcnQuIEFuZA0KPiAtCSAqIHNp bmNlIGl0IGNhbid0IHVwZGF0ZSBvdGhlciBwbGFuZXMgaXQncyBpbmNvbXBhdGlibGUgd2l0 aCBhdG9taWMNCj4gLQkgKiBtb2Rlc2V0IHN1cHBvcnQuDQo+IC0JICoNCj4gLQkgKiBUaGlz IGNhbGxiYWNrIGlzIG9ubHkgdXNlZCBieSBDUlRDIGhlbHBlcnMgYW5kIGRlcHJlY2F0ZWQu DQo+IC0JICoNCj4gLQkgKiBSRVRVUk5TOg0KPiAtCSAqDQo+IC0JICogMCBvbiBzdWNjZXNz IG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLg0KPiAtCSAqLw0KPiAtCWlu dCAoKm1vZGVfc2V0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlLA0KPiAtCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVk X21vZGUsIGludCB4LCBpbnQgeSwNCj4gLQkJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9s ZF9mYik7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAbW9kZV9zZXRfbm9mYjoNCj4gLQkgKg0K PiAtCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRpc3BsYXkgbW9k ZSBvZiBhIENSVEMgd2l0aG91dA0KPiAtCSAqIGNoYW5naW5nIGFueXRoaW5nIG9mIHRoZSBw cmltYXJ5IHBsYW5lIGNvbmZpZ3VyYXRpb24uIFRoaXMgZml0cyB0aGUNCj4gLQkgKiByZXF1 aXJlbWVudCBvZiBhdG9taWMgYW5kIGhlbmNlIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBoZWxw ZXJzLg0KPiAtCSAqDQo+IC0JICogTm90ZSB0aGF0IHRoZSBkaXNwbGF5IHBpcGUgaXMgY29t cGxldGVseSBvZmYgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+IC0JICogY2FsbGVkLiBBdG9t aWMgZHJpdmVycyB3aGljaCBuZWVkIGhhcmR3YXJlIHRvIGJlIHJ1bm5pbmcgYmVmb3JlIHRo ZXkNCj4gLQkgKiBwcm9ncmFtIHRoZSBuZXcgZGlzcGxheSBtb2RlIChlLmcuIGJlY2F1c2Ug dGhleSBpbXBsZW1lbnQgcnVudGltZSBQTSkNCj4gLQkgKiBzaG91bGQgbm90IHVzZSB0aGlz IGhvb2suIFRoaXMgaXMgYmVjYXVzZSB0aGUgaGVscGVyIGxpYnJhcnkgY2FsbHMNCj4gLQkg KiB0aGlzIGhvb2sgb25seSBvbmNlIHBlciBtb2RlIGNoYW5nZSBhbmQgbm90IGV2ZXJ5IHRp bWUgdGhlIGRpc3BsYXkNCj4gLQkgKiBwaXBlbGluZSBpcyBzdXNwZW5kZWQgdXNpbmcgZWl0 aGVyIERQTVMgb3IgdGhlIG5ldyAiQUNUSVZFIiBwcm9wZXJ0eS4NCj4gLQkgKiBXaGljaCBt ZWFucyByZWdpc3RlciB2YWx1ZXMgc2V0IGluIHRoaXMgY2FsbGJhY2sgbWlnaHQgZ2V0IHJl c2V0IHdoZW4NCj4gLQkgKiB0aGUgQ1JUQyBpcyBzdXNwZW5kZWQsIGJ1dCBub3QgcmVzdG9y ZWQuICBTdWNoIGRyaXZlcnMgc2hvdWxkIGluc3RlYWQNCj4gLQkgKiBtb3ZlIGFsbCB0aGVp ciBDUlRDIHNldHVwIGludG8gdGhlIEBhdG9taWNfZW5hYmxlIGNhbGxiYWNrLg0KPiAtCSAq DQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyBvcHRpb25hbC4NCj4gLQkgKi8NCj4gLQl2b2lk ICgqbW9kZV9zZXRfbm9mYikoc3RydWN0IGRybV9jcnRjICpjcnRjKTsNCj4gLQ0KPiAtCS8q Kg0KPiAtCSAqIEBtb2RlX3NldF9iYXNlOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFj ayBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kgQ1JUQyBoZWxwZXJzIHRvIHNldCBhIG5ldw0KPiAt CSAqIGZyYW1lYnVmZmVyIGFuZCBzY2Fub3V0IHBvc2l0aW9uLiBJdCBpcyBvcHRpb25hbCBh bmQgdXNlZCBhcyBhbg0KPiAtCSAqIG9wdGltaXplZCBmYXN0LXBhdGggaW5zdGVhZCBvZiBh IGZ1bGwgbW9kZSBzZXQgb3BlcmF0aW9uIHdpdGggYWxsIHRoZQ0KPiAtCSAqIHJlc3VsdGlu ZyBmbGlja2VyaW5nLiBJZiBpdCBpcyBub3QgcHJlc2VudA0KPiAtCSAqIGRybV9jcnRjX2hl bHBlcl9zZXRfY29uZmlnKCkgd2lsbCBmYWxsIGJhY2sgdG8gYSBmdWxsIG1vZGVzZXQsIHVz aW5nDQo+IC0JICogdGhlIEBtb2RlX3NldCBjYWxsYmFjay4gU2luY2UgaXQgY2FuJ3QgdXBk YXRlIG90aGVyIHBsYW5lcyBpdCdzDQo+IC0JICogaW5jb21wYXRpYmxlIHdpdGggYXRvbWlj IG1vZGVzZXQgc3VwcG9ydC4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sgaXMgb25s eSB1c2VkIGJ5IHRoZSBDUlRDIGhlbHBlcnMgYW5kIGRlcHJlY2F0ZWQuDQo+IC0JICoNCj4g LQkgKiBSRVRVUk5TOg0KPiAtCSAqDQo+IC0JICogMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRp dmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLg0KPiAtCSAqLw0KPiAtCWludCAoKm1vZGVfc2V0 X2Jhc2UpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LA0KPiAtCQkJICAg ICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpOw0KPiAtDQo+IC0JLyoqDQo+IC0J ICogQG1vZGVfc2V0X2Jhc2VfYXRvbWljOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFj ayBpcyB1c2VkIGJ5IHRoZSBmYmRldiBoZWxwZXJzIHRvIHNldCBhIG5ldyBmcmFtZWJ1ZmZl cg0KPiAtCSAqIGFuZCBzY2Fub3V0IHdpdGhvdXQgc2xlZXBpbmcsIGkuZS4gZnJvbSBhbiBh dG9taWMgY2FsbGluZyBjb250ZXh0LiBJdA0KPiAtCSAqIGlzIG9ubHkgdXNlZCB0byBpbXBs ZW1lbnQga2dkYiBzdXBwb3J0Lg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyBv cHRpb25hbCBhbmQgb25seSBuZWVkZWQgZm9yIGtnZGIgc3VwcG9ydCBpbiB0aGUgZmJkZXYN Cj4gLQkgKiBoZWxwZXJzLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAt CSAqIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4N Cj4gLQkgKi8NCj4gLQlpbnQgKCptb2RlX3NldF9iYXNlX2F0b21pYykoc3RydWN0IGRybV9j cnRjICpjcnRjLA0KPiAtCQkJCSAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgaW50 IHgsIGludCB5LA0KPiAtCQkJCSAgICBlbnVtIG1vZGVfc2V0X2F0b21pYyk7DQo+IC0NCj4g LQkvKioNCj4gLQkgKiBAZGlzYWJsZToNCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sg c2hvdWxkIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGUgQ1JUQy4gV2l0aCB0aGUgYXRvbWljDQo+ IC0JICogZHJpdmVycyBpdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIGVuY29kZXJzIGNvbm5lY3Rl ZCB0byB0aGlzIENSVEMgaGF2ZQ0KPiAtCSAqIGJlZW4gc2h1dCBvZmYgYWxyZWFkeSB1c2lu ZyB0aGVpciBvd24NCj4gLQkgKiAmZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzLmRpc2FibGUg aG9vay4gSWYgdGhhdCBzZXF1ZW5jZSBpcyB0b28NCj4gLQkgKiBzaW1wbGUgZHJpdmVycyBj YW4ganVzdCBhZGQgdGhlaXIgb3duIGhvb2tzIGFuZCBjYWxsIGl0IGZyb20gdGhpcw0KPiAt CSAqIENSVEMgY2FsbGJhY2sgaGVyZSBieSBsb29waW5nIG92ZXIgYWxsIGVuY29kZXJzIGNv bm5lY3RlZCB0byBpdCB1c2luZw0KPiAtCSAqIGZvcl9lYWNoX2VuY29kZXJfb25fY3J0Yygp Lg0KPiAtCSAqDQo+IC0JICogVGhpcyBob29rIGlzIHVzZWQgYm90aCBieSBsZWdhY3kgQ1JU QyBoZWxwZXJzIGFuZCBhdG9taWMgaGVscGVycy4NCj4gLQkgKiBBdG9taWMgZHJpdmVycyBk b24ndCBuZWVkIHRvIGltcGxlbWVudCBpdCBpZiB0aGVyZSdzIG5vIG5lZWQgdG8NCj4gLQkg KiBkaXNhYmxlIGFueXRoaW5nIGF0IHRoZSBDUlRDIGxldmVsLiBUbyBlbnN1cmUgdGhhdCBy dW50aW1lIFBNDQo+IC0JICogaGFuZGxpbmcgKHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZSBu ZXcgIkFDVElWRSIgcHJvcGVydHkpIHdvcmtzDQo+IC0JICogQGRpc2FibGUgbXVzdCBiZSB0 aGUgaW52ZXJzZSBvZiBAYXRvbWljX2VuYWJsZSBmb3IgYXRvbWljIGRyaXZlcnMuDQo+IC0J ICogQXRvbWljIGRyaXZlcnMgc2hvdWxkIGNvbnNpZGVyIHRvIHVzZSBAYXRvbWljX2Rpc2Fi bGUgaW5zdGVhZCBvZg0KPiAtCSAqIHRoaXMgb25lLg0KPiAtCSAqDQo+IC0JICogTk9URToN Cj4gLQkgKg0KPiAtCSAqIFdpdGggbGVnYWN5IENSVEMgaGVscGVycyB0aGVyZSdzIGEgYmln IHNlbWFudGljIGRpZmZlcmVuY2UgYmV0d2Vlbg0KPiAtCSAqIEBkaXNhYmxlIGFuZCBvdGhl ciBob29rcyAobGlrZSBAcHJlcGFyZSBvciBAZHBtcykgdXNlZCB0byBzaHV0IGRvd24gYQ0K PiAtCSAqIENSVEM6IEBkaXNhYmxlIGlzIG9ubHkgY2FsbGVkIHdoZW4gYWxzbyBsb2dpY2Fs bHkgZGlzYWJsaW5nIHRoZQ0KPiAtCSAqIGRpc3BsYXkgcGlwZWxpbmUgYW5kIG5lZWRzIHRv IHJlbGVhc2UgYW55IHJlc291cmNlcyBhY3F1aXJlZCBpbg0KPiAtCSAqIEBtb2RlX3NldCAo bGlrZSBzaGFyZWQgUExMcywgb3IgYWdhaW4gcmVsZWFzZSBwaW5uZWQgZnJhbWVidWZmZXJz KS4NCj4gLQkgKg0KPiAtCSAqIFRoZXJlZm9yZSBAZGlzYWJsZSBtdXN0IGJlIHRoZSBpbnZl cnNlIG9mIEBtb2RlX3NldCBwbHVzIEBjb21taXQgZm9yDQo+IC0JICogZHJpdmVycyBzdGls bCB1c2luZyBsZWdhY3kgQ1JUQyBoZWxwZXJzLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0 aGUNCj4gLQkgKiBydWxlcyB1bmRlciBhdG9taWMuDQo+IC0JICovDQo+IC0Jdm9pZCAoKmRp c2FibGUpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBA YXRvbWljX2NoZWNrOg0KPiAtCSAqDQo+IC0JICogRHJpdmVycyBzaG91bGQgY2hlY2sgcGxh bmUtdXBkYXRlIHJlbGF0ZWQgQ1JUQyBjb25zdHJhaW50cyBpbiB0aGlzDQo+IC0JICogaG9v ay4gVGhleSBjYW4gYWxzbyBjaGVjayBtb2RlIHJlbGF0ZWQgbGltaXRhdGlvbnMgYnV0IG5l ZWQgdG8gYmUNCj4gLQkgKiBhd2FyZSBvZiB0aGUgY2FsbGluZyBvcmRlciwgc2luY2UgdGhp cyBob29rIGlzIHVzZWQgYnkNCj4gLQkgKiBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19wbGFu ZXMoKSB3aGVyZWFzIHRoZSBwcmVwYXJhdGlvbnMgbmVlZGVkIHRvDQo+IC0JICogY2hlY2sg b3V0cHV0IHJvdXRpbmcgYW5kIHRoZSBkaXNwbGF5IG1vZGUgaXMgZG9uZSBpbg0KPiAtCSAq IGRybV9hdG9taWNfaGVscGVyX2NoZWNrX21vZGVzZXQoKS4gVGhlcmVmb3JlIGRyaXZlcnMg dGhhdCB3YW50IHRvDQo+IC0JICogY2hlY2sgb3V0cHV0IHJvdXRpbmcgYW5kIGRpc3BsYXkg bW9kZSBjb25zdHJhaW50cyBpbiB0aGlzIGNhbGxiYWNrDQo+IC0JICogbXVzdCBlbnN1cmUg dGhhdCBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0KCkgaGFzIGJlZW4gY2FsbGVk DQo+IC0JICogYmVmb3JlaGFuZC4gVGhpcyBpcyBjYWxsaW5nIG9yZGVyIHVzZWQgYnkgdGhl IGRlZmF1bHQgaGVscGVyDQo+IC0JICogaW1wbGVtZW50YXRpb24gaW4gZHJtX2F0b21pY19o ZWxwZXJfY2hlY2soKS4NCj4gLQkgKg0KPiAtCSAqIFdoZW4gdXNpbmcgZHJtX2F0b21pY19o ZWxwZXJfY2hlY2tfcGxhbmVzKCkgdGhpcyBob29rIGlzIGNhbGxlZA0KPiAtCSAqIGFmdGVy IHRoZSAmZHJtX3BsYW5lX2hlbHBlcl9mdW5jcy5hdG9taWNfY2hlY2sgaG9vayBmb3IgcGxh bmVzLCB3aGljaA0KPiAtCSAqIGFsbG93cyBkcml2ZXJzIHRvIGFzc2lnbiBzaGFyZWQgcmVz b3VyY2VzIHJlcXVlc3RlZCBieSBwbGFuZXMgaW4gdGhpcw0KPiAtCSAqIGNhbGxiYWNrIGhl cmUuIEZvciBtb3JlIGNvbXBsaWNhdGVkIGRlcGVuZGVuY2llcyB0aGUgZHJpdmVyIGNhbiBj YWxsDQo+IC0JICogdGhlIHByb3ZpZGVkIGNoZWNrIGhlbHBlcnMgbXVsdGlwbGUgdGltZXMg dW50aWwgdGhlIGNvbXB1dGVkIHN0YXRlDQo+IC0JICogaGFzIGEgZmluYWwgY29uZmlndXJh dGlvbiBhbmQgZXZlcnl0aGluZyBoYXMgYmVlbiBjaGVja2VkLg0KPiAtCSAqDQo+IC0JICog VGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFsbG93ZWQgdG8gaW5zcGVjdCBhbnkgb3RoZXIgb2Jq ZWN0J3Mgc3RhdGUgYW5kDQo+IC0JICogY2FuIGFkZCBtb3JlIHN0YXRlIG9iamVjdHMgdG8g dGhlIGF0b21pYyBjb21taXQgaWYgbmVlZGVkLiBDYXJlIG11c3QNCj4gLQkgKiBiZSB0YWtl biB0aG91Z2ggdG8gZW5zdXJlIHRoYXQgc3RhdGUgY2hlY2sgYW5kIGNvbXB1dGUgZnVuY3Rp b25zIGZvcg0KPiAtCSAqIHRoZXNlIGFkZGVkIHN0YXRlcyBhcmUgYWxsIGNhbGxlZCwgYW5k IGRlcml2ZWQgc3RhdGUgaW4gb3RoZXIgb2JqZWN0cw0KPiAtCSAqIGFsbCB1cGRhdGVkLiBB Z2FpbiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8ganVzdCBjYWxsIGNoZWNrIGhlbHBlcnMN Cj4gLQkgKiB1bnRpbCBhIG1heGltYWwgY29uZmlndXJhdGlvbiBpcyByZWFjaGVkLg0KPiAt CSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNl dCBoZWxwZXJzLCBidXQgaXQgaXMNCj4gLQkgKiBvcHRpb25hbC4NCj4gLQkgKg0KPiAtCSAq IE5PVEU6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUg Y2hlY2sgcGhhc2Ugb2YgYW4gYXRvbWljIHVwZGF0ZS4gVGhlDQo+IC0JICogZHJpdmVyIGlz IG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBhbnl0aGluZyBvdXRzaWRlIG9mIHRoZSBmcmVlLXN0 YW5kaW5nDQo+IC0JICogc3RhdGUgb2JqZWN0IHBhc3NlZC1pbi4NCj4gLQkgKg0KPiAtCSAq IEFsc28gYmV3YXJlIHRoYXQgdXNlcnNwYWNlIGNhbiByZXF1ZXN0IGl0cyBvd24gY3VzdG9t IG1vZGVzLCBuZWl0aGVyDQo+IC0JICogY29yZSBub3IgaGVscGVycyBmaWx0ZXIgbW9kZXMg dG8gdGhlIGxpc3Qgb2YgcHJvYmUgbW9kZXMgcmVwb3J0ZWQgYnkNCj4gLQkgKiB0aGUgR0VU Q09OTkVDVE9SIElPQ1RMIGFuZCBzdG9yZWQgaW4gJmRybV9jb25uZWN0b3IubW9kZXMuIFRv IGVuc3VyZQ0KPiAtCSAqIHRoYXQgbW9kZXMgYXJlIGZpbHRlcmVkIGNvbnNpc3RlbnRseSBw dXQgYW55IENSVEMgY29uc3RyYWludHMgYW5kDQo+IC0JICogbGltaXRzIGNoZWNrcyBpbnRv IEBtb2RlX3ZhbGlkLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAtCSAq IDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgc3RhdGUgb3IgdGhlIHRyYW5zaXRpb24g Y2FuJ3QgYmUNCj4gLQkgKiBzdXBwb3J0ZWQsIC1FTk9NRU0gb24gbWVtb3J5IGFsbG9jYXRp b24gZmFpbHVyZSBhbmQgLUVERUFETEsgaWYgYW4NCj4gLQkgKiBhdHRlbXB0IHRvIG9idGFp biBhbm90aGVyIHN0YXRlIG9iamVjdCByYW4gaW50byBhICZkcm1fbW9kZXNldF9sb2NrDQo+ IC0JICogZGVhZGxvY2suDQo+IC0JICovDQo+IC0JaW50ICgqYXRvbWljX2NoZWNrKShzdHJ1 Y3QgZHJtX2NydGMgKmNydGMsDQo+IC0JCQkgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUg KnN0YXRlKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBhdG9taWNfYmVnaW46DQo+IC0JICoN Cj4gLQkgKiBEcml2ZXJzIHNob3VsZCBwcmVwYXJlIGZvciBhbiBhdG9taWMgdXBkYXRlIG9m IG11bHRpcGxlIHBsYW5lcyBvbg0KPiAtCSAqIGEgQ1JUQyBpbiB0aGlzIGhvb2suIERlcGVu ZGluZyB1cG9uIGhhcmR3YXJlIHRoaXMgbWlnaHQgYmUgdmJsYW5rDQo+IC0JICogZXZhc2lv biwgYmxvY2tpbmcgdXBkYXRlcyBieSBzZXR0aW5nIGJpdHMgb3IgZG9pbmcgcHJlcGFyYXRv cnkgd29yaw0KPiAtCSAqIGZvciBlLmcuIG1hbnVhbCB1cGRhdGUgZGlzcGxheS4NCj4gLQkg Kg0KPiAtCSAqIFRoaXMgaG9vayBpcyBjYWxsZWQgYmVmb3JlIGFueSBwbGFuZSBjb21taXQg ZnVuY3Rpb25zIGFyZSBjYWxsZWQuDQo+IC0JICoNCj4gLQkgKiBOb3RlIHRoYXQgdGhlIHBv d2VyIHN0YXRlIG9mIHRoZSBkaXNwbGF5IHBpcGUgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ IC0JICogY2FsbGVkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaGVscGVycyBhbmQgY2FsbGlu ZyBzZXF1ZW5jZSB0aGUgZHJpdmVyDQo+IC0JICogaGFzIHBpY2tlZC4gU2VlIGRybV9hdG9t aWNfaGVscGVyX2NvbW1pdF9wbGFuZXMoKSBmb3IgYSBkaXNjdXNzaW9uIG9mDQo+IC0JICog dGhlIHRyYWRlb2ZmcyBhbmQgdmFyaWFudHMgb2YgcGxhbmUgY29tbWl0IGhlbHBlcnMuDQo+ IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rl c2V0IGhlbHBlcnMsIGJ1dCBpdCBpcw0KPiAtCSAqIG9wdGlvbmFsLg0KPiAtCSAqLw0KPiAt CXZvaWQgKCphdG9taWNfYmVnaW4pKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywNCj4gLQkJCSAg ICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gLQkvKioNCj4gLQkgKiBA YXRvbWljX2ZsdXNoOg0KPiAtCSAqDQo+IC0JICogRHJpdmVycyBzaG91bGQgZmluYWxpemUg YW4gYXRvbWljIHVwZGF0ZSBvZiBtdWx0aXBsZSBwbGFuZXMgb24NCj4gLQkgKiBhIENSVEMg aW4gdGhpcyBob29rLiBEZXBlbmRpbmcgdXBvbiBoYXJkd2FyZSB0aGlzIG1pZ2h0IGluY2x1 ZGUNCj4gLQkgKiBjaGVja2luZyB0aGF0IHZibGFuayBldmFzaW9uIHdhcyBzdWNjZXNzZnVs LCB1bmJsb2NraW5nIHVwZGF0ZXMgYnkNCj4gLQkgKiBzZXR0aW5nIGJpdHMgb3Igc2V0dGlu ZyB0aGUgR08gYml0IHRvIGZsdXNoIG91dCBhbGwgdXBkYXRlcy4NCj4gLQkgKg0KPiAtCSAq IFNpbXBsZSBoYXJkd2FyZSBvciBoYXJkd2FyZSB3aXRoIHNwZWNpYWwgcmVxdWlyZW1lbnRz IGNhbiBjb21taXQgYW5kDQo+IC0JICogZmx1c2ggb3V0IGFsbCB1cGRhdGVzIGZvciBhbGwg cGxhbmVzIGZyb20gdGhpcyBob29rIGFuZCBmb3JnbyBhbGwgdGhlDQo+IC0JICogb3RoZXIg Y29tbWl0IGhvb2tzIGZvciBwbGFuZSB1cGRhdGVzLg0KPiAtCSAqDQo+IC0JICogVGhpcyBo b29rIGlzIGNhbGxlZCBhZnRlciBhbnkgcGxhbmUgY29tbWl0IGZ1bmN0aW9ucyBhcmUgY2Fs bGVkLg0KPiAtCSAqDQo+IC0JICogTm90ZSB0aGF0IHRoZSBwb3dlciBzdGF0ZSBvZiB0aGUg ZGlzcGxheSBwaXBlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcw0KPiAtCSAqIGNhbGxlZCBkZXBl bmRzIHVwb24gdGhlIGV4YWN0IGhlbHBlcnMgYW5kIGNhbGxpbmcgc2VxdWVuY2UgdGhlIGRy aXZlcg0KPiAtCSAqIGhhcyBwaWNrZWQuIFNlZSBkcm1fYXRvbWljX2hlbHBlcl9jb21taXRf cGxhbmVzKCkgZm9yIGEgZGlzY3Vzc2lvbiBvZg0KPiAtCSAqIHRoZSB0cmFkZW9mZnMgYW5k IHZhcmlhbnRzIG9mIHBsYW5lIGNvbW1pdCBoZWxwZXJzLg0KPiAtCSAqDQo+IC0JICogVGhp cyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNldCBoZWxwZXJzLCBidXQg aXQgaXMNCj4gLQkgKiBvcHRpb25hbC4NCj4gLQkgKi8NCj4gLQl2b2lkICgqYXRvbWljX2Zs dXNoKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+IC0JCQkgICAgIHN0cnVjdCBkcm1fYXRv bWljX3N0YXRlICpzdGF0ZSk7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAYXRvbWljX2VuYWJs ZToNCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGJlIHVzZWQgdG8gZW5h YmxlIHRoZSBDUlRDLiBXaXRoIHRoZSBhdG9taWMNCj4gLQkgKiBkcml2ZXJzIGl0IGlzIGNh bGxlZCBiZWZvcmUgYWxsIGVuY29kZXJzIGNvbm5lY3RlZCB0byB0aGlzIENSVEMgYXJlDQo+ IC0JICogZW5hYmxlZCB0aHJvdWdoIHRoZSBlbmNvZGVyJ3Mgb3duICZkcm1fZW5jb2Rlcl9o ZWxwZXJfZnVuY3MuZW5hYmxlDQo+IC0JICogaG9vay4gIElmIHRoYXQgc2VxdWVuY2UgaXMg dG9vIHNpbXBsZSBkcml2ZXJzIGNhbiBqdXN0IGFkZCB0aGVpciBvd24NCj4gLQkgKiBob29r cyBhbmQgY2FsbCBpdCBmcm9tIHRoaXMgQ1JUQyBjYWxsYmFjayBoZXJlIGJ5IGxvb3Bpbmcg b3ZlciBhbGwNCj4gLQkgKiBlbmNvZGVycyBjb25uZWN0ZWQgdG8gaXQgdXNpbmcgZm9yX2Vh Y2hfZW5jb2Rlcl9vbl9jcnRjKCkuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGhvb2sgaXMgdXNl ZCBvbmx5IGJ5IGF0b21pYyBoZWxwZXJzLCBmb3Igc3ltbWV0cnkgd2l0aA0KPiAtCSAqIEBh dG9taWNfZGlzYWJsZS4gQXRvbWljIGRyaXZlcnMgZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQg aXQgaWYgdGhlcmUncw0KPiAtCSAqIG5vIG5lZWQgdG8gZW5hYmxlIGFueXRoaW5nIGF0IHRo ZSBDUlRDIGxldmVsLiBUbyBlbnN1cmUgdGhhdCBydW50aW1lDQo+IC0JICogUE0gaGFuZGxp bmcgKHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZSBuZXcgIkFDVElWRSIgcHJvcGVydHkpIHdv cmtzDQo+IC0JICogQGF0b21pY19lbmFibGUgbXVzdCBiZSB0aGUgaW52ZXJzZSBvZiBAYXRv bWljX2Rpc2FibGUgZm9yIGF0b21pYw0KPiAtCSAqIGRyaXZlcnMuDQo+IC0JICoNCj4gLQkg KiBUaGlzIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLg0KPiAtCSAqLw0KPiAtCXZvaWQgKCphdG9t aWNfZW5hYmxlKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+IC0JCQkgICAgICBzdHJ1Y3Qg ZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICogQGF0b21p Y19kaXNhYmxlOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBzaG91bGQgYmUgdXNl ZCB0byBkaXNhYmxlIHRoZSBDUlRDLiBXaXRoIHRoZSBhdG9taWMNCj4gLQkgKiBkcml2ZXJz IGl0IGlzIGNhbGxlZCBhZnRlciBhbGwgZW5jb2RlcnMgY29ubmVjdGVkIHRvIHRoaXMgQ1JU QyBoYXZlDQo+IC0JICogYmVlbiBzaHV0IG9mZiBhbHJlYWR5IHVzaW5nIHRoZWlyIG93bg0K PiAtCSAqICZkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MuZGlzYWJsZSBob29rLiBJZiB0aGF0 IHNlcXVlbmNlIGlzIHRvbw0KPiAtCSAqIHNpbXBsZSBkcml2ZXJzIGNhbiBqdXN0IGFkZCB0 aGVpciBvd24gaG9va3MgYW5kIGNhbGwgaXQgZnJvbSB0aGlzDQo+IC0JICogQ1JUQyBjYWxs YmFjayBoZXJlIGJ5IGxvb3Bpbmcgb3ZlciBhbGwgZW5jb2RlcnMgY29ubmVjdGVkIHRvIGl0 IHVzaW5nDQo+IC0JICogZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRjKCkuDQo+IC0JICoNCj4g LQkgKiBUaGlzIGhvb2sgaXMgdXNlZCBvbmx5IGJ5IGF0b21pYyBoZWxwZXJzLiBBdG9taWMg ZHJpdmVycyBkb24ndA0KPiAtCSAqIG5lZWQgdG8gaW1wbGVtZW50IGl0IGlmIHRoZXJlJ3Mg bm8gbmVlZCB0byBkaXNhYmxlIGFueXRoaW5nIGF0IHRoZQ0KPiAtCSAqIENSVEMgbGV2ZWwu DQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLg0KPiAtCSAqLw0K PiAtCXZvaWQgKCphdG9taWNfZGlzYWJsZSkoc3RydWN0IGRybV9jcnRjICpjcnRjLA0KPiAt CQkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+IC0NCj4gLQkv KioNCj4gLQkgKiBAZ2V0X3NjYW5vdXRfcG9zaXRpb246DQo+IC0JICoNCj4gLQkgKiBDYWxs ZWQgYnkgdmJsYW5rIHRpbWVzdGFtcGluZyBjb2RlLg0KPiAtCSAqDQo+IC0JICogUmV0dXJu cyB0aGUgY3VycmVudCBkaXNwbGF5IHNjYW5vdXQgcG9zaXRpb24gZnJvbSBhIENSVEMgYW5k IGFuDQo+IC0JICogb3B0aW9uYWwgYWNjdXJhdGUga3RpbWVfZ2V0KCkgdGltZXN0YW1wIG9m IHdoZW4gdGhlIHBvc2l0aW9uIHdhcw0KPiAtCSAqIG1lYXN1cmVkLiBOb3RlIHRoYXQgdGhp cyBpcyBhIGhlbHBlciBjYWxsYmFjayB3aGljaCBpcyBvbmx5IHVzZWQNCj4gLQkgKiBpZiBh IGRyaXZlciB1c2VzIGRybV9jcnRjX3ZibGFua19oZWxwZXJfZ2V0X3ZibGFua190aW1lc3Rh bXAoKQ0KPiAtCSAqIGZvciB0aGUgQGRybV9jcnRjX2Z1bmNzLmdldF92YmxhbmtfdGltZXN0 YW1wIGNhbGxiYWNrLg0KPiAtCSAqDQo+IC0JICogUGFyYW1ldGVyczoNCj4gLQkgKg0KPiAt CSAqIGNydGM6DQo+IC0JICogICAgIFRoZSBDUlRDLg0KPiAtCSAqIGluX3ZibGFua19pcnE6 DQo+IC0JICogICAgIFRydWUgd2hlbiBjYWxsZWQgZnJvbSBkcm1fY3J0Y19oYW5kbGVfdmJs YW5rKCkuIFNvbWUgZHJpdmVycw0KPiAtCSAqICAgICBuZWVkIHRvIGFwcGx5IHNvbWUgd29y a2Fyb3VuZHMgZm9yIGdwdS1zcGVjaWZpYyB2YmxhbmsgaXJxDQo+IC0JICogICAgIHF1aXJr cyBpZiB0aGUgZmxhZyBpcyBzZXQuDQo+IC0JICogdnBvczoNCj4gLQkgKiAgICAgVGFyZ2V0 IGxvY2F0aW9uIGZvciBjdXJyZW50IHZlcnRpY2FsIHNjYW5vdXQgcG9zaXRpb24uDQo+IC0J ICogaHBvczoNCj4gLQkgKiAgICAgVGFyZ2V0IGxvY2F0aW9uIGZvciBjdXJyZW50IGhvcml6 b250YWwgc2Nhbm91dCBwb3NpdGlvbi4NCj4gLQkgKiBzdGltZToNCj4gLQkgKiAgICAgVGFy Z2V0IGxvY2F0aW9uIGZvciB0aW1lc3RhbXAgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlDQo+ IC0JICogICAgIHNjYW5vdXQgcG9zaXRpb24gcXVlcnkuIENhbiBiZSBOVUxMIHRvIHNraXAg dGltZXN0YW1wLg0KPiAtCSAqIGV0aW1lOg0KPiAtCSAqICAgICBUYXJnZXQgbG9jYXRpb24g Zm9yIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseSBhZnRlcg0KPiAtCSAqICAgICBzY2Fu b3V0IHBvc2l0aW9uIHF1ZXJ5LiBDYW4gYmUgTlVMTCB0byBza2lwIHRpbWVzdGFtcC4NCj4g LQkgKiBtb2RlOg0KPiAtCSAqICAgICBDdXJyZW50IGRpc3BsYXkgdGltaW5ncy4NCj4gLQkg Kg0KPiAtCSAqIFJldHVybnMgdnBvcyBhcyBhIHBvc2l0aXZlIG51bWJlciB3aGlsZSBpbiBh Y3RpdmUgc2Nhbm91dCBhcmVhLg0KPiAtCSAqIFJldHVybnMgdnBvcyBhcyBhIG5lZ2F0aXZl IG51bWJlciBpbnNpZGUgdmJsYW5rLCBjb3VudGluZyB0aGUgbnVtYmVyDQo+IC0JICogb2Yg c2NhbmxpbmVzIHRvIGdvIHVudGlsIGVuZCBvZiB2YmxhbmssIGUuZy4sIC0xIG1lYW5zICJv bmUgc2NhbmxpbmUNCj4gLQkgKiB1bnRpbCBzdGFydCBvZiBhY3RpdmUgc2Nhbm91dCAvIGVu ZCBvZiB2YmxhbmsuIg0KPiAtCSAqDQo+IC0JICogUmV0dXJuczoNCj4gLQkgKg0KPiAtCSAq IFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYSByZWxpYWJsZSBzY2Fub3V0IHBvc2l0aW9u IGNvdW50ZXIgY291bGQNCj4gLQkgKiBub3QgYmUgcmVhZCBvdXQuDQo+IC0JICovDQo+IC0J Ym9vbCAoKmdldF9zY2Fub3V0X3Bvc2l0aW9uKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsDQo+ IC0JCQkJICAgICBib29sIGluX3ZibGFua19pcnEsIGludCAqdnBvcywgaW50ICpocG9zLA0K PiAtCQkJCSAgICAga3RpbWVfdCAqc3RpbWUsIGt0aW1lX3QgKmV0aW1lLA0KPiAtCQkJCSAg ICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOw0KPiAtfTsNCj4gLQ0K PiAtLyoqDQo+IC0gKiBkcm1fY3J0Y19oZWxwZXJfYWRkIC0gc2V0cyB0aGUgaGVscGVyIHZ0 YWJsZSBmb3IgYSBjcnRjDQo+IC0gKiBAY3J0YzogRFJNIENSVEMNCj4gLSAqIEBmdW5jczog aGVscGVyIHZ0YWJsZSB0byBzZXQgZm9yIEBjcnRjDQo+IC0gKi8NCj4gLXN0YXRpYyBpbmxp bmUgdm9pZCBkcm1fY3J0Y19oZWxwZXJfYWRkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywNCj4g LQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqZnVuY3Mp DQo+IC17DQo+IC0JY3J0Yy0+aGVscGVyX3ByaXZhdGUgPSBmdW5jczsNCj4gLX0NCj4gLQ0K PiAtLyoqDQo+IC0gKiBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIC0gaGVscGVy IG9wZXJhdGlvbnMgZm9yIGVuY29kZXJzDQo+IC0gKg0KPiAtICogVGhlc2UgaG9va3MgYXJl IHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRDIGhlbHBlcnMgYW5kIHRoZSBuZXcgYXRvbWljDQo+ IC0gKiBtb2Rlc2V0dGluZyBoZWxwZXJzLg0KPiAtICovDQo+IC1zdHJ1Y3QgZHJtX2VuY29k ZXJfaGVscGVyX2Z1bmNzIHsNCj4gLQkvKioNCj4gLQkgKiBAZHBtczoNCj4gLQkgKg0KPiAt CSAqIENhbGxiYWNrIHRvIGNvbnRyb2wgcG93ZXIgbGV2ZWxzIG9uIHRoZSBlbmNvZGVyLiAg SWYgdGhlIG1vZGUgcGFzc2VkIGluDQo+IC0JICogaXMgdW5zdXBwb3J0ZWQsIHRoZSBwcm92 aWRlciBtdXN0IHVzZSB0aGUgbmV4dCBsb3dlc3QgcG93ZXIgbGV2ZWwuDQo+IC0JICogVGhp cyBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kgZW5jb2RlciBoZWxwZXJzIHRvIGltcGxlbWVudCBE UE1TDQo+IC0JICogZnVuY3Rpb25hbGl0eSBpbiBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1z KCkuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIGFsc28gdXNlZCB0byBkaXNh YmxlIGFuIGVuY29kZXIgYnkgY2FsbGluZyBpdCB3aXRoDQo+IC0JICogRFJNX01PREVfRFBN U19PRkYgaWYgdGhlIEBkaXNhYmxlIGhvb2sgaXNuJ3QgdXNlZC4NCj4gLQkgKg0KPiAtCSAq IFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgbGVnYWN5IENSVEMgaGVscGVycy4gIEF0 b21pYyBoZWxwZXJzDQo+IC0JICogYWxzbyBzdXBwb3J0IHVzaW5nIHRoaXMgaG9vayBmb3Ig ZW5hYmxpbmcgYW5kIGRpc2FibGluZyBhbiBlbmNvZGVyIHRvDQo+IC0JICogZmFjaWxpdGF0 ZSB0cmFuc2l0aW9ucyB0byBhdG9taWMsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFk DQo+IC0JICogQGVuYWJsZSBhbmQgQGRpc2FibGUgc2hvdWxkIGJlIHVzZWQuDQo+IC0JICov DQo+IC0Jdm9pZCAoKmRwbXMpKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1v ZGUpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICogQG1vZGVfdmFsaWQ6DQo+IC0JICoNCj4gLQkg KiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBzcGVjaWZpYyBtb2RlIGlz IHZhbGlkIGluIHRoaXMNCj4gLQkgKiBlbmNvZGVyLiBUaGlzIHNob3VsZCBiZSBpbXBsZW1l bnRlZCBpZiB0aGUgZW5jb2RlciBoYXMgc29tZSBzb3J0DQo+IC0JICogb2YgcmVzdHJpY3Rp b24gaW4gdGhlIG1vZGVzIGl0IGNhbiBkaXNwbGF5LiBGb3IgZXhhbXBsZSwgYSBnaXZlbg0K PiAtCSAqIGVuY29kZXIgbWF5IGJlIHJlc3BvbnNpYmxlIHRvIHNldCBhIGNsb2NrIHZhbHVl LiBJZiB0aGUgY2xvY2sgY2FuDQo+IC0JICogbm90IHByb2R1Y2UgYWxsIHRoZSB2YWx1ZXMg Zm9yIHRoZSBhdmFpbGFibGUgbW9kZXMgdGhlbiB0aGlzIGNhbGxiYWNrDQo+IC0JICogY2Fu IGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIG51bWJlciBvZiBtb2RlcyB0byBvbmx5IHRoZSBv bmVzIHRoYXQNCj4gLQkgKiBjYW4gYmUgZGlzcGxheWVkLg0KPiAtCSAqDQo+IC0JICogVGhp cyBob29rIGlzIHVzZWQgYnkgdGhlIHByb2JlIGhlbHBlcnMgdG8gZmlsdGVyIHRoZSBtb2Rl IGxpc3QgaW4NCj4gLQkgKiBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9k ZXMoKSwgYW5kIGl0IGlzIHVzZWQgYnkgdGhlDQo+IC0JICogYXRvbWljIGhlbHBlcnMgdG8g dmFsaWRhdGUgbW9kZXMgc3VwcGxpZWQgYnkgdXNlcnNwYWNlIGluDQo+IC0JICogZHJtX2F0 b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldCgpLg0KPiAtCSAqDQo+IC0JICogVGhpcyBmdW5j dGlvbiBpcyBvcHRpb25hbC4NCj4gLQkgKg0KPiAtCSAqIE5PVEU6DQo+IC0JICoNCj4gLQkg KiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGJvdGggY2FsbGVkIGZyb20gdGhlIGNoZWNrIHBo YXNlIG9mIGFuIGF0b21pYw0KPiAtCSAqIGNvbW1pdCwgYW5kIHRoZSBtb2RlIHZhbGlkYXRp b24gaW4gdGhlIHByb2JlIHBhdGhzIGl0IGlzIG5vdCBhbGxvd2VkDQo+IC0JICogdG8gbG9v ayBhdCBhbnl0aGluZyBlbHNlIGJ1dCB0aGUgcGFzc2VkLWluIG1vZGUsIGFuZCB2YWxpZGF0 ZSBpdA0KPiAtCSAqIGFnYWluc3QgY29uZmlndXJhdGlvbi1pbnZhcmlhbnQgaGFyZHdhcmUg Y29uc3RyYWludHMuIEFueSBmdXJ0aGVyDQo+IC0JICogbGltaXRzIHdoaWNoIGRlcGVuZCB1 cG9uIHRoZSBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoZWNrZWQgaW4NCj4gLQkgKiBA bW9kZV9maXh1cCBvciBAYXRvbWljX2NoZWNrLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoN Cj4gLQkgKg0KPiAtCSAqIGRybV9tb2RlX3N0YXR1cyBFbnVtDQo+IC0JICovDQo+IC0JZW51 bSBkcm1fbW9kZV9zdGF0dXMgKCptb2RlX3ZhbGlkKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmNy dGMsDQo+IC0JCQkJCSAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsN Cj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBtb2RlX2ZpeHVwOg0KPiAtCSAqDQo+IC0JICogVGhp cyBjYWxsYmFjayBpcyB1c2VkIHRvIHZhbGlkYXRlIGFuZCBhZGp1c3QgYSBtb2RlLiBUaGUg cGFyYW1ldGVyDQo+IC0JICogbW9kZSBpcyB0aGUgZGlzcGxheSBtb2RlIHRoYXQgc2hvdWxk IGJlIGZlZCB0byB0aGUgbmV4dCBlbGVtZW50IGluDQo+IC0JICogdGhlIGRpc3BsYXkgY2hh aW4sIGVpdGhlciB0aGUgZmluYWwgJmRybV9jb25uZWN0b3Igb3IgYSAmZHJtX2JyaWRnZS4N Cj4gLQkgKiBUaGUgcGFyYW1ldGVyIGFkanVzdGVkX21vZGUgaXMgdGhlIGlucHV0IG1vZGUg dGhlIGVuY29kZXIgcmVxdWlyZXMuIEl0DQo+IC0JICogY2FuIGJlIG1vZGlmaWVkIGJ5IHRo aXMgY2FsbGJhY2sgYW5kIGRvZXMgbm90IG5lZWQgdG8gbWF0Y2ggbW9kZS4gU2VlDQo+IC0J ICogYWxzbyAmZHJtX2NydGNfc3RhdGUuYWRqdXN0ZWRfbW9kZSBmb3IgbW9yZSBkZXRhaWxz Lg0KPiAtCSAqDQo+IC0JICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGJvdGggbGVnYWN5 IENSVEMgaGVscGVycyBhbmQgYXRvbWljIGhlbHBlcnMuDQo+IC0JICogVGhpcyBob29rIGlz IG9wdGlvbmFsLg0KPiAtCSAqDQo+IC0JICogTk9URToNCj4gLQkgKg0KPiAtCSAqIFRoaXMg ZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBjaGVjayBwaGFzZSBvZiBhdG9taWMgbW9kZXNl dHMsIHdoaWNoDQo+IC0JICogY2FuIGJlIGFib3J0ZWQgZm9yIGFueSByZWFzb24gKGluY2x1 ZGluZyBvbiB1c2Vyc3BhY2UncyByZXF1ZXN0IHRvDQo+IC0JICoganVzdCBjaGVjayB3aGV0 aGVyIGEgY29uZmlndXJhdGlvbiB3b3VsZCBiZSBwb3NzaWJsZSkuIEF0b21pYyBkcml2ZXJz DQo+IC0JICogTVVTVCBOT1QgdG91Y2ggYW55IHBlcnNpc3RlbnQgc3RhdGUgKGhhcmR3YXJl IG9yIHNvZnR3YXJlKSBvciBkYXRhDQo+IC0JICogc3RydWN0dXJlcyBleGNlcHQgdGhlIHBh c3NlZCBpbiBhZGp1c3RlZF9tb2RlIHBhcmFtZXRlci4NCj4gLQkgKg0KPiAtCSAqIFRoaXMg aXMgaW4gY29udHJhc3QgdG8gdGhlIGxlZ2FjeSBDUlRDIGhlbHBlcnMgd2hlcmUgdGhpcyB3 YXMNCj4gLQkgKiBhbGxvd2VkLg0KPiAtCSAqDQo+IC0JICogQXRvbWljIGRyaXZlcnMgd2hp Y2ggbmVlZCB0byBpbnNwZWN0IGFuZCBhZGp1c3QgbW9yZSBzdGF0ZSBzaG91bGQNCj4gLQkg KiBpbnN0ZWFkIHVzZSB0aGUgQGF0b21pY19jaGVjayBjYWxsYmFjay4gSWYgQGF0b21pY19j aGVjayBpcyB1c2VkLA0KPiAtCSAqIHRoaXMgaG9vayBpc24ndCBjYWxsZWQgc2luY2UgQGF0 b21pY19jaGVjayBhbGxvd3MgYSBzdHJpY3Qgc3VwZXJzZXQNCj4gLQkgKiBvZiB0aGUgZnVu Y3Rpb25hbGl0eSBvZiBAbW9kZV9maXh1cC4NCj4gLQkgKg0KPiAtCSAqIEFsc28gYmV3YXJl IHRoYXQgdXNlcnNwYWNlIGNhbiByZXF1ZXN0IGl0cyBvd24gY3VzdG9tIG1vZGVzLCBuZWl0 aGVyDQo+IC0JICogY29yZSBub3IgaGVscGVycyBmaWx0ZXIgbW9kZXMgdG8gdGhlIGxpc3Qg b2YgcHJvYmUgbW9kZXMgcmVwb3J0ZWQgYnkNCj4gLQkgKiB0aGUgR0VUQ09OTkVDVE9SIElP Q1RMIGFuZCBzdG9yZWQgaW4gJmRybV9jb25uZWN0b3IubW9kZXMuIFRvIGVuc3VyZQ0KPiAt CSAqIHRoYXQgbW9kZXMgYXJlIGZpbHRlcmVkIGNvbnNpc3RlbnRseSBwdXQgYW55IGVuY29k ZXIgY29uc3RyYWludHMgYW5kDQo+IC0JICogbGltaXRzIGNoZWNrcyBpbnRvIEBtb2RlX3Zh bGlkLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAtCSAqIFRydWUgaWYg YW4gYWNjZXB0YWJsZSBjb25maWd1cmF0aW9uIGlzIHBvc3NpYmxlLCBmYWxzZSBpZiB0aGUg bW9kZXNldA0KPiAtCSAqIG9wZXJhdGlvbiBzaG91bGQgYmUgcmVqZWN0ZWQuDQo+IC0JICov DQo+IC0JYm9vbCAoKm1vZGVfZml4dXApKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwN Cj4gLQkJCSAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLA0KPiAtCQkJ ICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOw0KPiAtDQo+IC0J LyoqDQo+IC0JICogQHByZXBhcmU6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIHNo b3VsZCBwcmVwYXJlIHRoZSBlbmNvZGVyIGZvciBhIHN1YnNlcXVlbnQgbW9kZXNldCwNCj4g LQkgKiB3aGljaCBpbiBwcmFjdGljZSBtZWFucyB0aGUgZHJpdmVyIHNob3VsZCBkaXNhYmxl IHRoZSBlbmNvZGVyIGlmIGl0DQo+IC0JICogaXMgcnVubmluZy4gTW9zdCBkcml2ZXJzIGVu ZGVkIHVwIGltcGxlbWVudGluZyB0aGlzIGJ5IGNhbGxpbmcgdGhlaXINCj4gLQkgKiBAZHBt cyBob29rIHdpdGggRFJNX01PREVfRFBNU19PRkYuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNh bGxiYWNrIGlzIHVzZWQgYnkgdGhlIGxlZ2FjeSBDUlRDIGhlbHBlcnMuICBBdG9taWMgaGVs cGVycw0KPiAtCSAqIGFsc28gc3VwcG9ydCB1c2luZyB0aGlzIGhvb2sgZm9yIGRpc2FibGlu ZyBhbiBlbmNvZGVyIHRvIGZhY2lsaXRhdGUNCj4gLQkgKiB0cmFuc2l0aW9ucyB0byBhdG9t aWMsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIEBkaXNhYmxlIHNob3VsZA0KPiAt CSAqIGJlIHVzZWQuDQo+IC0JICovDQo+IC0Jdm9pZCAoKnByZXBhcmUpKHN0cnVjdCBkcm1f ZW5jb2RlciAqZW5jb2Rlcik7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAY29tbWl0Og0KPiAt CSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBzaG91bGQgY29tbWl0IHRoZSBuZXcgbW9kZSBv biB0aGUgZW5jb2RlciBhZnRlciBhIG1vZGVzZXQsDQo+IC0JICogd2hpY2ggaW4gcHJhY3Rp Y2UgbWVhbnMgdGhlIGRyaXZlciBzaG91bGQgZW5hYmxlIHRoZSBlbmNvZGVyLiAgTW9zdA0K PiAtCSAqIGRyaXZlcnMgZW5kZWQgdXAgaW1wbGVtZW50aW5nIHRoaXMgYnkgY2FsbGluZyB0 aGVpciBAZHBtcyBob29rIHdpdGgNCj4gLQkgKiBEUk1fTU9ERV9EUE1TX09OLg0KPiAtCSAq DQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBsZWdhY3kgQ1JUQyBoZWxw ZXJzLiAgQXRvbWljIGhlbHBlcnMNCj4gLQkgKiBhbHNvIHN1cHBvcnQgdXNpbmcgdGhpcyBo b29rIGZvciBlbmFibGluZyBhbiBlbmNvZGVyIHRvIGZhY2lsaXRhdGUNCj4gLQkgKiB0cmFu c2l0aW9ucyB0byBhdG9taWMsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIEBlbmFi bGUgc2hvdWxkDQo+IC0JICogYmUgdXNlZC4NCj4gLQkgKi8NCj4gLQl2b2lkICgqY29tbWl0 KShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICog QG1vZGVfc2V0Og0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIHRvIHVw ZGF0ZSB0aGUgZGlzcGxheSBtb2RlIG9mIGFuIGVuY29kZXIuDQo+IC0JICoNCj4gLQkgKiBO b3RlIHRoYXQgdGhlIGRpc3BsYXkgcGlwZSBpcyBjb21wbGV0ZWx5IG9mZiB3aGVuIHRoaXMg ZnVuY3Rpb24gaXMNCj4gLQkgKiBjYWxsZWQuIERyaXZlcnMgd2hpY2ggbmVlZCBoYXJkd2Fy ZSB0byBiZSBydW5uaW5nIGJlZm9yZSB0aGV5IHByb2dyYW0NCj4gLQkgKiB0aGUgbmV3IGRp c3BsYXkgbW9kZSAoYmVjYXVzZSB0aGV5IGltcGxlbWVudCBydW50aW1lIFBNKSBzaG91bGQg bm90DQo+IC0JICogdXNlIHRoaXMgaG9vaywgYmVjYXVzZSB0aGUgaGVscGVyIGxpYnJhcnkg Y2FsbHMgaXQgb25seSBvbmNlIGFuZCBub3QNCj4gLQkgKiBldmVyeSB0aW1lIHRoZSBkaXNw bGF5IHBpcGVsaW5lIGlzIHN1c3BlbmQgdXNpbmcgZWl0aGVyIERQTVMgb3IgdGhlDQo+IC0J ICogbmV3ICJBQ1RJVkUiIHByb3BlcnR5LiBTdWNoIGRyaXZlcnMgc2hvdWxkIGluc3RlYWQg bW92ZSBhbGwgdGhlaXINCj4gLQkgKiBlbmNvZGVyIHNldHVwIGludG8gdGhlIEBlbmFibGUg Y2FsbGJhY2suDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYm90aCBi eSB0aGUgbGVnYWN5IENSVEMgaGVscGVycyBhbmQgdGhlIGF0b21pYw0KPiAtCSAqIG1vZGVz ZXQgaGVscGVycy4gSXQgaXMgb3B0aW9uYWwgaW4gdGhlIGF0b21pYyBoZWxwZXJzLg0KPiAt CSAqDQo+IC0JICogTk9URToNCj4gLQkgKg0KPiAtCSAqIElmIHRoZSBkcml2ZXIgdXNlcyB0 aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycyBhbmQgbmVlZHMgdG8gaW5zcGVjdA0KPiAtCSAq IHRoZSBjb25uZWN0b3Igc3RhdGUgb3IgY29ubmVjdG9yIGRpc3BsYXkgaW5mbyBkdXJpbmcg bW9kZSBzZXR0aW5nLA0KPiAtCSAqIEBhdG9taWNfbW9kZV9zZXQgY2FuIGJlIHVzZWQgaW5z dGVhZC4NCj4gLQkgKi8NCj4gLQl2b2lkICgqbW9kZV9zZXQpKHN0cnVjdCBkcm1fZW5jb2Rl ciAqZW5jb2RlciwNCj4gLQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwNCj4g LQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7DQo+IC0NCj4g LQkvKioNCj4gLQkgKiBAYXRvbWljX21vZGVfc2V0Og0KPiAtCSAqDQo+IC0JICogVGhpcyBj YWxsYmFjayBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgZGlzcGxheSBtb2RlIG9mIGFuIGVuY29k ZXIuDQo+IC0JICoNCj4gLQkgKiBOb3RlIHRoYXQgdGhlIGRpc3BsYXkgcGlwZSBpcyBjb21w bGV0ZWx5IG9mZiB3aGVuIHRoaXMgZnVuY3Rpb24gaXMNCj4gLQkgKiBjYWxsZWQuIERyaXZl cnMgd2hpY2ggbmVlZCBoYXJkd2FyZSB0byBiZSBydW5uaW5nIGJlZm9yZSB0aGV5IHByb2dy YW0NCj4gLQkgKiB0aGUgbmV3IGRpc3BsYXkgbW9kZSAoYmVjYXVzZSB0aGV5IGltcGxlbWVu dCBydW50aW1lIFBNKSBzaG91bGQgbm90DQo+IC0JICogdXNlIHRoaXMgaG9vaywgYmVjYXVz ZSB0aGUgaGVscGVyIGxpYnJhcnkgY2FsbHMgaXQgb25seSBvbmNlIGFuZCBub3QNCj4gLQkg KiBldmVyeSB0aW1lIHRoZSBkaXNwbGF5IHBpcGVsaW5lIGlzIHN1c3BlbmRlZCB1c2luZyBl aXRoZXIgRFBNUyBvciB0aGUNCj4gLQkgKiBuZXcgIkFDVElWRSIgcHJvcGVydHkuIFN1Y2gg ZHJpdmVycyBzaG91bGQgaW5zdGVhZCBtb3ZlIGFsbCB0aGVpcg0KPiAtCSAqIGVuY29kZXIg c2V0dXAgaW50byB0aGUgQGVuYWJsZSBjYWxsYmFjay4NCj4gLQkgKg0KPiAtCSAqIFRoaXMg Y2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycyBpbiBwbGFj ZSBvZiB0aGUNCj4gLQkgKiBAbW9kZV9zZXQgY2FsbGJhY2ssIGlmIHNldCBieSB0aGUgZHJp dmVyLiBJdCBpcyBvcHRpb25hbCBhbmQgc2hvdWxkDQo+IC0JICogYmUgdXNlZCBpbnN0ZWFk IG9mIEBtb2RlX3NldCBpZiB0aGUgZHJpdmVyIG5lZWRzIHRvIGluc3BlY3QgdGhlDQo+IC0J ICogY29ubmVjdG9yIHN0YXRlIG9yIGRpc3BsYXkgaW5mbywgc2luY2UgdGhlcmUgaXMgbm8g ZGlyZWN0IHdheSB0bw0KPiAtCSAqIGdvIGZyb20gdGhlIGVuY29kZXIgdG8gdGhlIGN1cnJl bnQgY29ubmVjdG9yLg0KPiAtCSAqLw0KPiAtCXZvaWQgKCphdG9taWNfbW9kZV9zZXQpKHN0 cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwNCj4gLQkJCQlzdHJ1Y3QgZHJtX2NydGNfc3Rh dGUgKmNydGNfc3RhdGUsDQo+IC0JCQkJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNv bm5fc3RhdGUpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICogQGRldGVjdDoNCj4gLQkgKg0KPiAt CSAqIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgYnkgZHJpdmVycyB3aG8gd2FudCB0byBk byBkZXRlY3Rpb24gb24gdGhlDQo+IC0JICogZW5jb2RlciBvYmplY3QgaW5zdGVhZCBvZiBp biBjb25uZWN0b3IgZnVuY3Rpb25zLg0KPiAtCSAqDQo+IC0JICogSXQgaXMgbm90IHVzZWQg YnkgYW55IGhlbHBlciBhbmQgdGhlcmVmb3JlIGhhcyBwdXJlbHkgZHJpdmVyLXNwZWNpZmlj DQo+IC0JICogc2VtYW50aWNzLiBOZXcgZHJpdmVycyBzaG91bGRuJ3QgdXNlIHRoaXMgYW5k IGluc3RlYWQganVzdCBpbXBsZW1lbnQNCj4gLQkgKiB0aGVpciBvd24gcHJpdmF0ZSBjYWxs YmFja3MuDQo+IC0JICoNCj4gLQkgKiBGSVhNRToNCj4gLQkgKg0KPiAtCSAqIFRoaXMgc2hv dWxkIGp1c3QgYmUgY29udmVydGVkIGludG8gYSBwaWxlIG9mIGRyaXZlciB2ZnVuY3MuDQo+ IC0JICogQ3VycmVudGx5IHJhZGVvbiwgYW1kZ3B1IGFuZCBub3V2ZWF1IGFyZSB1c2luZyBp dC4NCj4gLQkgKi8NCj4gLQllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzICgqZGV0ZWN0KShz dHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsDQo+IC0JCQkJCSAgICBzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBhdG9taWNfZGlz YWJsZToNCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGJlIHVzZWQgdG8g ZGlzYWJsZSB0aGUgZW5jb2Rlci4gV2l0aCB0aGUgYXRvbWljDQo+IC0JICogZHJpdmVycyBp dCBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgZW5jb2RlcidzIENSVEMgaGFzIGJlZW4gc2h1dCBv ZmYNCj4gLQkgKiB1c2luZyB0aGVpciBvd24gJmRybV9jcnRjX2hlbHBlcl9mdW5jcy5hdG9t aWNfZGlzYWJsZSBob29rLiBJZiB0aGF0DQo+IC0JICogc2VxdWVuY2UgaXMgdG9vIHNpbXBs ZSBkcml2ZXJzIGNhbiBqdXN0IGFkZCB0aGVpciBvd24gZHJpdmVyIHByaXZhdGUNCj4gLQkg KiBlbmNvZGVyIGhvb2tzIGFuZCBjYWxsIHRoZW0gZnJvbSBDUlRDJ3MgY2FsbGJhY2sgYnkg bG9vcGluZyBvdmVyIGFsbA0KPiAtCSAqIGVuY29kZXJzIGNvbm5lY3RlZCB0byBpdCB1c2lu ZyBmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoKS4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2Fs bGJhY2sgaXMgYSB2YXJpYW50IG9mIEBkaXNhYmxlIHRoYXQgcHJvdmlkZXMgdGhlIGF0b21p YyBzdGF0ZQ0KPiAtCSAqIHRvIHRoZSBkcml2ZXIuIElmIEBhdG9taWNfZGlzYWJsZSBpcyBp bXBsZW1lbnRlZCwgQGRpc2FibGUgaXMgbm90DQo+IC0JICogY2FsbGVkIGJ5IHRoZSBoZWxw ZXJzLg0KPiAtCSAqDQo+IC0JICogVGhpcyBob29rIGlzIG9ubHkgdXNlZCBieSBhdG9taWMg aGVscGVycy4gQXRvbWljIGRyaXZlcnMgZG9uJ3QgbmVlZA0KPiAtCSAqIHRvIGltcGxlbWVu dCBpdCBpZiB0aGVyZSdzIG5vIG5lZWQgdG8gZGlzYWJsZSBhbnl0aGluZyBhdCB0aGUgZW5j b2Rlcg0KPiAtCSAqIGxldmVsLiBUbyBlbnN1cmUgdGhhdCBydW50aW1lIFBNIGhhbmRsaW5n ICh1c2luZyBlaXRoZXIgRFBNUyBvciB0aGUNCj4gLQkgKiBuZXcgIkFDVElWRSIgcHJvcGVy dHkpIHdvcmtzIEBhdG9taWNfZGlzYWJsZSBtdXN0IGJlIHRoZSBpbnZlcnNlIG9mDQo+IC0J ICogQGF0b21pY19lbmFibGUuDQo+IC0JICovDQo+IC0Jdm9pZCAoKmF0b21pY19kaXNhYmxl KShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsDQo+IC0JCQkgICAgICAgc3RydWN0IGRy bV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBhdG9taWNf ZW5hYmxlOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBzaG91bGQgYmUgdXNlZCB0 byBlbmFibGUgdGhlIGVuY29kZXIuIEl0IGlzIGNhbGxlZA0KPiAtCSAqIGFmdGVyIHRoaXMg ZW5jb2RlcidzIENSVEMgaGFzIGJlZW4gZW5hYmxlZCB1c2luZyB0aGVpciBvd24NCj4gLQkg KiAmZHJtX2NydGNfaGVscGVyX2Z1bmNzLmF0b21pY19lbmFibGUgaG9vay4gSWYgdGhhdCBz ZXF1ZW5jZSBpcw0KPiAtCSAqIHRvbyBzaW1wbGUgZHJpdmVycyBjYW4ganVzdCBhZGQgdGhl aXIgb3duIGRyaXZlciBwcml2YXRlIGVuY29kZXINCj4gLQkgKiBob29rcyBhbmQgY2FsbCB0 aGVtIGZyb20gQ1JUQydzIGNhbGxiYWNrIGJ5IGxvb3Bpbmcgb3ZlciBhbGwgZW5jb2RlcnMN Cj4gLQkgKiBjb25uZWN0ZWQgdG8gaXQgdXNpbmcgZm9yX2VhY2hfZW5jb2Rlcl9vbl9jcnRj KCkuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIGEgdmFyaWFudCBvZiBAZW5h YmxlIHRoYXQgcHJvdmlkZXMgdGhlIGF0b21pYyBzdGF0ZQ0KPiAtCSAqIHRvIHRoZSBkcml2 ZXIuIElmIEBhdG9taWNfZW5hYmxlIGlzIGltcGxlbWVudGVkLCBAZW5hYmxlIGlzIG5vdA0K PiAtCSAqIGNhbGxlZCBieSB0aGUgaGVscGVycy4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgaG9v ayBpcyBvbmx5IHVzZWQgYnkgYXRvbWljIGhlbHBlcnMsIGl0IGlzIHRoZSBvcHBvc2l0ZSBv Zg0KPiAtCSAqIEBhdG9taWNfZGlzYWJsZS4gQXRvbWljIGRyaXZlcnMgZG9uJ3QgbmVlZCB0 byBpbXBsZW1lbnQgaXQgaWYgdGhlcmUncw0KPiAtCSAqIG5vIG5lZWQgdG8gZW5hYmxlIGFu eXRoaW5nIGF0IHRoZSBlbmNvZGVyIGxldmVsLiBUbyBlbnN1cmUgdGhhdA0KPiAtCSAqIHJ1 bnRpbWUgUE0gaGFuZGxpbmcgd29ya3MgQGF0b21pY19lbmFibGUgbXVzdCBiZSB0aGUgaW52 ZXJzZSBvZg0KPiAtCSAqIEBhdG9taWNfZGlzYWJsZS4NCj4gLQkgKi8NCj4gLQl2b2lkICgq YXRvbWljX2VuYWJsZSkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLA0KPiAtCQkJICAg ICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gLQ0KPiAtCS8qKg0KPiAt CSAqIEBkaXNhYmxlOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBzaG91bGQgYmUg dXNlZCB0byBkaXNhYmxlIHRoZSBlbmNvZGVyLiBXaXRoIHRoZSBhdG9taWMNCj4gLQkgKiBk cml2ZXJzIGl0IGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBlbmNvZGVyJ3MgQ1JUQyBoYXMgYmVl biBzaHV0IG9mZg0KPiAtCSAqIHVzaW5nIHRoZWlyIG93biAmZHJtX2NydGNfaGVscGVyX2Z1 bmNzLmRpc2FibGUgaG9vay4gIElmIHRoYXQNCj4gLQkgKiBzZXF1ZW5jZSBpcyB0b28gc2lt cGxlIGRyaXZlcnMgY2FuIGp1c3QgYWRkIHRoZWlyIG93biBkcml2ZXIgcHJpdmF0ZQ0KPiAt CSAqIGVuY29kZXIgaG9va3MgYW5kIGNhbGwgdGhlbSBmcm9tIENSVEMncyBjYWxsYmFjayBi eSBsb29waW5nIG92ZXIgYWxsDQo+IC0JICogZW5jb2RlcnMgY29ubmVjdGVkIHRvIGl0IHVz aW5nIGZvcl9lYWNoX2VuY29kZXJfb25fY3J0YygpLg0KPiAtCSAqDQo+IC0JICogVGhpcyBo b29rIGlzIHVzZWQgYm90aCBieSBsZWdhY3kgQ1JUQyBoZWxwZXJzIGFuZCBhdG9taWMgaGVs cGVycy4NCj4gLQkgKiBBdG9taWMgZHJpdmVycyBkb24ndCBuZWVkIHRvIGltcGxlbWVudCBp dCBpZiB0aGVyZSdzIG5vIG5lZWQgdG8NCj4gLQkgKiBkaXNhYmxlIGFueXRoaW5nIGF0IHRo ZSBlbmNvZGVyIGxldmVsLiBUbyBlbnN1cmUgdGhhdCBydW50aW1lIFBNDQo+IC0JICogaGFu ZGxpbmcgKHVzaW5nIGVpdGhlciBEUE1TIG9yIHRoZSBuZXcgIkFDVElWRSIgcHJvcGVydHkp IHdvcmtzDQo+IC0JICogQGRpc2FibGUgbXVzdCBiZSB0aGUgaW52ZXJzZSBvZiBAZW5hYmxl IGZvciBhdG9taWMgZHJpdmVycy4NCj4gLQkgKg0KPiAtCSAqIEZvciBhdG9taWMgZHJpdmVy cyBhbHNvIGNvbnNpZGVyIEBhdG9taWNfZGlzYWJsZSBhbmQgc2F2ZSB5b3Vyc2VsZg0KPiAt CSAqIGZyb20gaGF2aW5nIHRvIHJlYWQgdGhlIE5PVEUgYmVsb3chDQo+IC0JICoNCj4gLQkg KiBOT1RFOg0KPiAtCSAqDQo+IC0JICogV2l0aCBsZWdhY3kgQ1JUQyBoZWxwZXJzIHRoZXJl J3MgYSBiaWcgc2VtYW50aWMgZGlmZmVyZW5jZSBiZXR3ZWVuDQo+IC0JICogQGRpc2FibGUg YW5kIG90aGVyIGhvb2tzIChsaWtlIEBwcmVwYXJlIG9yIEBkcG1zKSB1c2VkIHRvIHNodXQg ZG93biBhDQo+IC0JICogZW5jb2RlcjogQGRpc2FibGUgaXMgb25seSBjYWxsZWQgd2hlbiBh bHNvIGxvZ2ljYWxseSBkaXNhYmxpbmcgdGhlDQo+IC0JICogZGlzcGxheSBwaXBlbGluZSBh bmQgbmVlZHMgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGFjcXVpcmVkIGluDQo+IC0JICog QG1vZGVfc2V0IChsaWtlIHNoYXJlZCBQTExzLCBvciBhZ2FpbiByZWxlYXNlIHBpbm5lZCBm cmFtZWJ1ZmZlcnMpLg0KPiAtCSAqDQo+IC0JICogVGhlcmVmb3JlIEBkaXNhYmxlIG11c3Qg YmUgdGhlIGludmVyc2Ugb2YgQG1vZGVfc2V0IHBsdXMgQGNvbW1pdCBmb3INCj4gLQkgKiBk cml2ZXJzIHN0aWxsIHVzaW5nIGxlZ2FjeSBDUlRDIGhlbHBlcnMsIHdoaWNoIGlzIGRpZmZl cmVudCBmcm9tIHRoZQ0KPiAtCSAqIHJ1bGVzIHVuZGVyIGF0b21pYy4NCj4gLQkgKi8NCj4g LQl2b2lkICgqZGlzYWJsZSkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsNCj4gLQ0K PiAtCS8qKg0KPiAtCSAqIEBlbmFibGU6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNr IHNob3VsZCBiZSB1c2VkIHRvIGVuYWJsZSB0aGUgZW5jb2Rlci4gV2l0aCB0aGUgYXRvbWlj DQo+IC0JICogZHJpdmVycyBpdCBpcyBjYWxsZWQgYWZ0ZXIgdGhpcyBlbmNvZGVyJ3MgQ1JU QyBoYXMgYmVlbiBlbmFibGVkIHVzaW5nDQo+IC0JICogdGhlaXIgb3duICZkcm1fY3J0Y19o ZWxwZXJfZnVuY3MuZW5hYmxlIGhvb2suICBJZiB0aGF0IHNlcXVlbmNlIGlzDQo+IC0JICog dG9vIHNpbXBsZSBkcml2ZXJzIGNhbiBqdXN0IGFkZCB0aGVpciBvd24gZHJpdmVyIHByaXZh dGUgZW5jb2Rlcg0KPiAtCSAqIGhvb2tzIGFuZCBjYWxsIHRoZW0gZnJvbSBDUlRDJ3MgY2Fs bGJhY2sgYnkgbG9vcGluZyBvdmVyIGFsbCBlbmNvZGVycw0KPiAtCSAqIGNvbm5lY3RlZCB0 byBpdCB1c2luZyBmb3JfZWFjaF9lbmNvZGVyX29uX2NydGMoKS4NCj4gLQkgKg0KPiAtCSAq IFRoaXMgaG9vayBpcyBvbmx5IHVzZWQgYnkgYXRvbWljIGhlbHBlcnMsIGl0IGlzIHRoZSBv cHBvc2l0ZSBvZg0KPiAtCSAqIEBkaXNhYmxlLiBBdG9taWMgZHJpdmVycyBkb24ndCBuZWVk IHRvIGltcGxlbWVudCBpdCBpZiB0aGVyZSdzIG5vDQo+IC0JICogbmVlZCB0byBlbmFibGUg YW55dGhpbmcgYXQgdGhlIGVuY29kZXIgbGV2ZWwuIFRvIGVuc3VyZSB0aGF0DQo+IC0JICog cnVudGltZSBQTSBoYW5kbGluZyAodXNpbmcgZWl0aGVyIERQTVMgb3IgdGhlIG5ldyAiQUNU SVZFIiBwcm9wZXJ0eSkNCj4gLQkgKiB3b3JrcyBAZW5hYmxlIG11c3QgYmUgdGhlIGludmVy c2Ugb2YgQGRpc2FibGUgZm9yIGF0b21pYyBkcml2ZXJzLg0KPiAtCSAqLw0KPiAtCXZvaWQg KCplbmFibGUpKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7DQo+IC0NCj4gLQkvKioN Cj4gLQkgKiBAYXRvbWljX2NoZWNrOg0KPiAtCSAqDQo+IC0JICogVGhpcyBjYWxsYmFjayBp cyB1c2VkIHRvIHZhbGlkYXRlIGVuY29kZXIgc3RhdGUgZm9yIGF0b21pYyBkcml2ZXJzLg0K PiAtCSAqIFNpbmNlIHRoZSBlbmNvZGVyIGlzIHRoZSBvYmplY3QgY29ubmVjdGluZyB0aGUg Q1JUQyBhbmQgY29ubmVjdG9yIGl0DQo+IC0JICogZ2V0cyBwYXNzZWQgYm90aCBzdGF0ZXMs IHRvIGJlIGFibGUgdG8gdmFsaWRhdGUgaW50ZXJhY3Rpb25zIGFuZA0KPiAtCSAqIHVwZGF0 ZSB0aGUgQ1JUQyB0byBtYXRjaCB3aGF0IHRoZSBlbmNvZGVyIG5lZWRzIGZvciB0aGUgcmVx dWVzdGVkDQo+IC0JICogY29ubmVjdG9yLg0KPiAtCSAqDQo+IC0JICogU2luY2UgdGhpcyBw cm92aWRlcyBhIHN0cmljdCBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBvZg0KPiAt CSAqIEBtb2RlX2ZpeHVwICh0aGUgcmVxdWVzdGVkIGFuZCBhZGp1c3RlZCBtb2RlcyBhcmUg Ym90aCBhdmFpbGFibGUNCj4gLQkgKiB0aHJvdWdoIHRoZSBwYXNzZWQgaW4gJnN0cnVjdCBk cm1fY3J0Y19zdGF0ZSkgQG1vZGVfZml4dXAgaXMgbm90DQo+IC0JICogY2FsbGVkIHdoZW4g QGF0b21pY19jaGVjayBpcyBpbXBsZW1lbnRlZC4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgZnVu Y3Rpb24gaXMgdXNlZCBieSB0aGUgYXRvbWljIGhlbHBlcnMsIGJ1dCBpdCBpcyBvcHRpb25h bC4NCj4gLQkgKg0KPiAtCSAqIE5PVEU6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9u IGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhhc2Ugb2YgYW4gYXRvbWljIHVwZGF0ZS4gVGhl DQo+IC0JICogZHJpdmVyIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBhbnl0aGluZyBvdXRz aWRlIG9mIHRoZSBmcmVlLXN0YW5kaW5nDQo+IC0JICogc3RhdGUgb2JqZWN0cyBwYXNzZWQt aW4gb3IgYXNzZW1ibGVkIGluIHRoZSBvdmVyYWxsICZkcm1fYXRvbWljX3N0YXRlDQo+IC0J ICogdXBkYXRlIHRyYWNraW5nIHN0cnVjdHVyZS4NCj4gLQkgKg0KPiAtCSAqIEFsc28gYmV3 YXJlIHRoYXQgdXNlcnNwYWNlIGNhbiByZXF1ZXN0IGl0cyBvd24gY3VzdG9tIG1vZGVzLCBu ZWl0aGVyDQo+IC0JICogY29yZSBub3IgaGVscGVycyBmaWx0ZXIgbW9kZXMgdG8gdGhlIGxp c3Qgb2YgcHJvYmUgbW9kZXMgcmVwb3J0ZWQgYnkNCj4gLQkgKiB0aGUgR0VUQ09OTkVDVE9S IElPQ1RMIGFuZCBzdG9yZWQgaW4gJmRybV9jb25uZWN0b3IubW9kZXMuIFRvIGVuc3VyZQ0K PiAtCSAqIHRoYXQgbW9kZXMgYXJlIGZpbHRlcmVkIGNvbnNpc3RlbnRseSBwdXQgYW55IGVu Y29kZXIgY29uc3RyYWludHMgYW5kDQo+IC0JICogbGltaXRzIGNoZWNrcyBpbnRvIEBtb2Rl X3ZhbGlkLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAtCSAqIDAgb24g c3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgc3RhdGUgb3IgdGhlIHRyYW5zaXRpb24gY2FuJ3Qg YmUNCj4gLQkgKiBzdXBwb3J0ZWQsIC1FTk9NRU0gb24gbWVtb3J5IGFsbG9jYXRpb24gZmFp bHVyZSBhbmQgLUVERUFETEsgaWYgYW4NCj4gLQkgKiBhdHRlbXB0IHRvIG9idGFpbiBhbm90 aGVyIHN0YXRlIG9iamVjdCByYW4gaW50byBhICZkcm1fbW9kZXNldF9sb2NrDQo+IC0JICog ZGVhZGxvY2suDQo+IC0JICovDQo+IC0JaW50ICgqYXRvbWljX2NoZWNrKShzdHJ1Y3QgZHJt X2VuY29kZXIgKmVuY29kZXIsDQo+IC0JCQkgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpj cnRjX3N0YXRlLA0KPiAtCQkJICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpjb25u X3N0YXRlKTsNCj4gLX07DQo+IC0NCj4gLS8qKg0KPiAtICogZHJtX2VuY29kZXJfaGVscGVy X2FkZCAtIHNldHMgdGhlIGhlbHBlciB2dGFibGUgZm9yIGFuIGVuY29kZXINCj4gLSAqIEBl bmNvZGVyOiBEUk0gZW5jb2Rlcg0KPiAtICogQGZ1bmNzOiBoZWxwZXIgdnRhYmxlIHRvIHNl dCBmb3IgQGVuY29kZXINCj4gLSAqLw0KPiAtc3RhdGljIGlubGluZSB2b2lkIGRybV9lbmNv ZGVyX2hlbHBlcl9hZGQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLA0KPiAtCQkJCQkg IGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmZ1bmNzKQ0KPiAtew0K PiAtCWVuY29kZXItPmhlbHBlcl9wcml2YXRlID0gZnVuY3M7DQo+IC19DQo+IC0NCj4gLS8q Kg0KPiAtICogc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIC0gaGVscGVyIG9w ZXJhdGlvbnMgZm9yIGNvbm5lY3RvcnMNCj4gLSAqDQo+IC0gKiBUaGVzZSBmdW5jdGlvbnMg YXJlIHVzZWQgYnkgdGhlIGF0b21pYyBhbmQgbGVnYWN5IG1vZGVzZXQgaGVscGVycyBhbmQg YnkgdGhlDQo+IC0gKiBwcm9iZSBoZWxwZXJzLg0KPiAtICovDQo+IC1zdHJ1Y3QgZHJtX2Nv bm5lY3Rvcl9oZWxwZXJfZnVuY3Mgew0KPiAtCS8qKg0KPiAtCSAqIEBnZXRfbW9kZXM6DQo+ IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaWxsIGluIGFsbCBtb2RlcyBj dXJyZW50bHkgdmFsaWQgZm9yIHRoZSBzaW5rDQo+IC0JICogaW50byB0aGUgJmRybV9jb25u ZWN0b3IucHJvYmVkX21vZGVzIGxpc3QuIEl0IHNob3VsZCBhbHNvIHVwZGF0ZSB0aGUNCj4g LQkgKiBFRElEIHByb3BlcnR5IGJ5IGNhbGxpbmcgZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRp ZF9wcm9wZXJ0eSgpLg0KPiAtCSAqDQo+IC0JICogVGhlIHVzdWFsIHdheSB0byBpbXBsZW1l bnQgdGhpcyBpcyB0byBjYWNoZSB0aGUgRURJRCByZXRyaWV2ZWQgaW4gdGhlDQo+IC0JICog cHJvYmUgY2FsbGJhY2sgc29tZXdoZXJlIGluIHRoZSBkcml2ZXItcHJpdmF0ZSBjb25uZWN0 b3Igc3RydWN0dXJlLg0KPiAtCSAqIEluIHRoaXMgZnVuY3Rpb24gZHJpdmVycyB0aGVuIHBh cnNlIHRoZSBtb2RlcyBpbiB0aGUgRURJRCBhbmQgYWRkDQo+IC0JICogdGhlbSBieSBjYWxs aW5nIGRybV9hZGRfZWRpZF9tb2RlcygpLiBCdXQgY29ubmVjdG9ycyB0aGF0IGRyaXZlIGEN Cj4gLQkgKiBmaXhlZCBwYW5lbCBjYW4gYWxzbyBtYW51YWxseSBhZGQgc3BlY2lmaWMgbW9k ZXMgdXNpbmcNCj4gLQkgKiBkcm1fbW9kZV9wcm9iZWRfYWRkKCkuIERyaXZlcnMgd2hpY2gg bWFudWFsbHkgYWRkIG1vZGVzIHNob3VsZCBhbHNvDQo+IC0JICogbWFrZSBzdXJlIHRoYXQg dGhlICZkcm1fY29ubmVjdG9yLmRpc3BsYXlfaW5mbywNCj4gLQkgKiAmZHJtX2Nvbm5lY3Rv ci53aWR0aF9tbSBhbmQgJmRybV9jb25uZWN0b3IuaGVpZ2h0X21tIGZpZWxkcyBhcmUNCj4g LQkgKiBmaWxsZWQgaW4uDQo+IC0JICoNCj4gLQkgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciBm dW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIHN0YW5kYXJkIFZFU0ENCj4gLQkgKiBE TVQgbW9kZXMgdXAgdG8gMTAyNHg3NjggaWYgdGhlIC5nZXRfbW9kZXMoKSBoZWxwZXIgb3Bl cmF0aW9uIHJldHVybnMNCj4gLQkgKiBubyBtb2RlIGFuZCBpZiB0aGUgY29ubmVjdG9yIHN0 YXR1cyBpcyBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCBvcg0KPiAtCSAqIGNvbm5lY3Rv cl9zdGF0dXNfdW5rbm93bi4gVGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsDQo+IC0JICogZHJt X2FkZF9tb2Rlc19ub2VkaWQoKSBtYW51YWxseSBpbiB0aGF0IGNhc2UuDQo+IC0JICoNCj4g LQkgKiBWaXJ0dWFsIGRyaXZlcnMgdGhhdCBqdXN0IHdhbnQgc29tZSBzdGFuZGFyZCBWRVNB IG1vZGUgd2l0aCBhIGdpdmVuDQo+IC0JICogcmVzb2x1dGlvbiBjYW4gY2FsbCBkcm1fYWRk X21vZGVzX25vZWRpZCgpLCBhbmQgbWFyayB0aGUgcHJlZmVycmVkDQo+IC0JICogb25lIHVz aW5nIGRybV9zZXRfcHJlZmVycmVkX21vZGUoKS4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgZnVu Y3Rpb24gaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIEBkZXRlY3QgaG9vayBoYXMgaW5kaWNh dGVkDQo+IC0JICogdGhhdCBhIHNpbmsgaXMgY29ubmVjdGVkIGFuZCB3aGVuIHRoZSBFRElE IGlzbid0IG92ZXJyaWRkZW4gdGhyb3VnaA0KPiAtCSAqIHN5c2ZzIG9yIHRoZSBrZXJuZWwg Y29tbWFuZGxpbmUuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkg dGhlIHByb2JlIGhlbHBlcnMgaW4gZS5nLg0KPiAtCSAqIGRybV9oZWxwZXJfcHJvYmVfc2lu Z2xlX2Nvbm5lY3Rvcl9tb2RlcygpLg0KPiAtCSAqDQo+IC0JICogVG8gYXZvaWQgcmFjZXMg d2l0aCBjb25jdXJyZW50IGNvbm5lY3RvciBzdGF0ZSB1cGRhdGVzLCB0aGUgaGVscGVyDQo+ IC0JICogbGlicmFyaWVzIGFsd2F5cyBjYWxsIHRoaXMgd2l0aCB0aGUgJmRybV9tb2RlX2Nv bmZpZy5jb25uZWN0aW9uX211dGV4DQo+IC0JICogaGVsZC4gQmVjYXVzZSBvZiB0aGlzIGl0 J3Mgc2FmZSB0byBpbnNwZWN0ICZkcm1fY29ubmVjdG9yLT5zdGF0ZS4NCj4gLQkgKg0KPiAt CSAqIFJFVFVSTlM6DQo+IC0JICoNCj4gLQkgKiBUaGUgbnVtYmVyIG9mIG1vZGVzIGFkZGVk IGJ5IGNhbGxpbmcgZHJtX21vZGVfcHJvYmVkX2FkZCgpLg0KPiAtCSAqLw0KPiAtCWludCAo KmdldF9tb2Rlcykoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7DQo+IC0NCj4g LQkvKioNCj4gLQkgKiBAZGV0ZWN0X2N0eDoNCj4gLQkgKg0KPiAtCSAqIENoZWNrIHRvIHNl ZSBpZiBhbnl0aGluZyBpcyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdG9yLiBUaGUgcGFyYW1l dGVyDQo+IC0JICogZm9yY2UgaXMgc2V0IHRvIGZhbHNlIHdoaWxzdCBwb2xsaW5nLCB0cnVl IHdoZW4gY2hlY2tpbmcgdGhlDQo+IC0JICogY29ubmVjdG9yIGR1ZSB0byBhIHVzZXIgcmVx dWVzdC4gZm9yY2UgY2FuIGJlIHVzZWQgYnkgdGhlIGRyaXZlciB0bw0KPiAtCSAqIGF2b2lk IGV4cGVuc2l2ZSwgZGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucyBkdXJpbmcgYXV0b21hdGVkIHBy b2JpbmcuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIG9wdGlvbmFsLCBpZiBu b3QgaW1wbGVtZW50ZWQgdGhlIGNvbm5lY3RvciB3aWxsIGJlDQo+IC0JICogY29uc2lkZXJl ZCBhcyBhbHdheXMgYmVpbmcgYXR0YWNoZWQuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGlzIHRo ZSBhdG9taWMgdmVyc2lvbiBvZiAmZHJtX2Nvbm5lY3Rvcl9mdW5jcy5kZXRlY3QuDQo+IC0J ICoNCj4gLQkgKiBUbyBhdm9pZCByYWNlcyBhZ2FpbnN0IGNvbmN1cnJlbnQgY29ubmVjdG9y IHN0YXRlIHVwZGF0ZXMsIHRoZQ0KPiAtCSAqIGhlbHBlciBsaWJyYXJpZXMgYWx3YXlzIGNh bGwgdGhpcyB3aXRoIGN0eCBzZXQgdG8gYSB2YWxpZCBjb250ZXh0LA0KPiAtCSAqIGFuZCAm ZHJtX21vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXggd2lsbCBhbHdheXMgYmUgbG9ja2Vk IHdpdGgNCj4gLQkgKiB0aGUgY3R4IHBhcmFtZXRlciBzZXQgdG8gdGhpcyBjdHguIFRoaXMg YWxsb3dzIHRha2luZyBhZGRpdGlvbmFsDQo+IC0JICogbG9ja3MgYXMgcmVxdWlyZWQuDQo+ IC0JICoNCj4gLQkgKiBSRVRVUk5TOg0KPiAtCSAqDQo+IC0JICogJmRybV9jb25uZWN0b3Jf c3RhdHVzIGluZGljYXRpbmcgdGhlIGNvbm5lY3RvcidzIHN0YXR1cywNCj4gLQkgKiBvciB0 aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSBkcm1fbW9kZXNldF9sb2NrKCksIC1FREVBRExL Lg0KPiAtCSAqLw0KPiAtCWludCAoKmRldGVjdF9jdHgpKHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsDQo+IC0JCQkgIHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAq Y3R4LA0KPiAtCQkJICBib29sIGZvcmNlKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBtb2Rl X3ZhbGlkOg0KPiAtCSAqDQo+IC0JICogQ2FsbGJhY2sgdG8gdmFsaWRhdGUgYSBtb2RlIGZv ciBhIGNvbm5lY3RvciwgaXJyZXNwZWN0aXZlIG9mIHRoZQ0KPiAtCSAqIHNwZWNpZmljIGRp c3BsYXkgY29uZmlndXJhdGlvbi4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sgaXMg dXNlZCBieSB0aGUgcHJvYmUgaGVscGVycyB0byBmaWx0ZXIgdGhlIG1vZGUgbGlzdA0KPiAt CSAqICh3aGljaCBpcyB1c3VhbGx5IGRlcml2ZWQgZnJvbSB0aGUgRURJRCBkYXRhIGJsb2Nr IGZyb20gdGhlIHNpbmspLg0KPiAtCSAqIFNlZSBlLmcuIGRybV9oZWxwZXJfcHJvYmVfc2lu Z2xlX2Nvbm5lY3Rvcl9tb2RlcygpLg0KPiAtCSAqDQo+IC0JICogVGhpcyBmdW5jdGlvbiBp cyBvcHRpb25hbC4NCj4gLQkgKg0KPiAtCSAqIE5PVEU6DQo+IC0JICoNCj4gLQkgKiBUaGlz IG9ubHkgZmlsdGVycyB0aGUgbW9kZSBsaXN0IHN1cHBsaWVkIHRvIHVzZXJzcGFjZSBpbiB0 aGUNCj4gLQkgKiBHRVRDT05ORUNUT1IgSU9DVEwuIENvbXBhcmVkIHRvICZkcm1fZW5jb2Rl cl9oZWxwZXJfZnVuY3MubW9kZV92YWxpZCwNCj4gLQkgKiAmZHJtX2NydGNfaGVscGVyX2Z1 bmNzLm1vZGVfdmFsaWQgYW5kICZkcm1fYnJpZGdlX2Z1bmNzLm1vZGVfdmFsaWQsDQo+IC0J ICogd2hpY2ggYXJlIGFsc28gY2FsbGVkIGJ5IHRoZSBhdG9taWMgaGVscGVycyBmcm9tDQo+ IC0JICogZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldCgpLiBUaGlzIGFsbG93cyB1 c2Vyc3BhY2UgdG8gZm9yY2UgYW5kDQo+IC0JICogaWdub3JlIHNpbmsgY29uc3RyYWludCAo bGlrZSB0aGUgcGl4ZWwgY2xvY2sgbGltaXRzIGluIHRoZSBzY3JlZW4ncw0KPiAtCSAqIEVE SUQpLCB3aGljaCBpcyB1c2VmdWwgZm9yIGUuZy4gdGVzdGluZywgb3Igd29ya2luZyBhcm91 bmQgYSBicm9rZW4NCj4gLQkgKiBFRElELiBBbnkgc291cmNlIGhhcmR3YXJlIGNvbnN0cmFp bnQgKHdoaWNoIGFsd2F5cyBuZWVkIHRvIGJlDQo+IC0JICogZW5mb3JjZWQpIHRoZXJlZm9y ZSBzaG91bGQgYmUgY2hlY2tlZCBpbiBvbmUgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcywNCj4g LQkgKiBhbmQgbm90IHRoaXMgb25lIGhlcmUuDQo+IC0JICoNCj4gLQkgKiBUbyBhdm9pZCBy YWNlcyB3aXRoIGNvbmN1cnJlbnQgY29ubmVjdG9yIHN0YXRlIHVwZGF0ZXMsIHRoZSBoZWxw ZXINCj4gLQkgKiBsaWJyYXJpZXMgYWx3YXlzIGNhbGwgdGhpcyB3aXRoIHRoZSAmZHJtX21v ZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgNCj4gLQkgKiBoZWxkLiBCZWNhdXNlIG9mIHRo aXMgaXQncyBzYWZlIHRvIGluc3BlY3QgJmRybV9jb25uZWN0b3ItPnN0YXRlLg0KPiAtICAg ICAgICAgKg0KPiAtCSAqIFJFVFVSTlM6DQo+IC0JICoNCj4gLQkgKiBFaXRoZXIgJmRybV9t b2RlX3N0YXR1cy5NT0RFX09LIG9yIG9uZSBvZiB0aGUgZmFpbHVyZSByZWFzb25zIGluICZl bnVtDQo+IC0JICogZHJtX21vZGVfc3RhdHVzLg0KPiAtCSAqLw0KPiAtCWVudW0gZHJtX21v ZGVfc3RhdHVzICgqbW9kZV92YWxpZCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rv ciwNCj4gLQkJCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOw0KPiAtDQo+ IC0JLyoqDQo+IC0JICogQG1vZGVfdmFsaWRfY3R4Og0KPiAtCSAqDQo+IC0JICogQ2FsbGJh Y2sgdG8gdmFsaWRhdGUgYSBtb2RlIGZvciBhIGNvbm5lY3RvciwgaXJyZXNwZWN0aXZlIG9m IHRoZQ0KPiAtCSAqIHNwZWNpZmljIGRpc3BsYXkgY29uZmlndXJhdGlvbi4NCj4gLQkgKg0K PiAtCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgcHJvYmUgaGVscGVycyB0byBm aWx0ZXIgdGhlIG1vZGUgbGlzdA0KPiAtCSAqICh3aGljaCBpcyB1c3VhbGx5IGRlcml2ZWQg ZnJvbSB0aGUgRURJRCBkYXRhIGJsb2NrIGZyb20gdGhlIHNpbmspLg0KPiAtCSAqIFNlZSBl LmcuIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcygpLg0KPiAtCSAq DQo+IC0JICogVGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbCwgYW5kIGlzIHRoZSBhdG9taWMg dmVyc2lvbiBvZg0KPiAtCSAqICZkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcy5tb2RlX3Zh bGlkLg0KPiAtCSAqDQo+IC0JICogVG8gYWxsb3cgZm9yIGFjY2Vzc2luZyB0aGUgYXRvbWlj IHN0YXRlIG9mIG1vZGVzZXR0aW5nIG9iamVjdHMsIHRoZQ0KPiAtCSAqIGhlbHBlciBsaWJy YXJpZXMgYWx3YXlzIGNhbGwgdGhpcyB3aXRoIGN0eCBzZXQgdG8gYSB2YWxpZCBjb250ZXh0 LA0KPiAtCSAqIGFuZCAmZHJtX21vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXggd2lsbCBh bHdheXMgYmUgbG9ja2VkIHdpdGgNCj4gLQkgKiB0aGUgY3R4IHBhcmFtZXRlciBzZXQgdG8g QGN0eC4gVGhpcyBhbGxvd3MgZm9yIHRha2luZyBhZGRpdGlvbmFsDQo+IC0JICogbG9ja3Mg YXMgcmVxdWlyZWQuDQo+IC0JICoNCj4gLQkgKiBFdmVuIHRob3VnaCBhZGRpdGlvbmFsIGxv Y2tzIG1heSBiZSBhY3F1aXJlZCwgdGhpcyBjYWxsYmFjayBpcw0KPiAtCSAqIHN0aWxsIGV4 cGVjdGVkIG5vdCB0byB0YWtlIGFueSBjb25zdHJhaW50cyBpbnRvIGFjY291bnQgd2hpY2gg d291bGQNCj4gLQkgKiBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBjdXJyZW50bHkgc2V0IGRpc3Bs YXkgc3RhdGUgLSBzdWNoIGNvbnN0cmFpbnRzDQo+IC0JICogc2hvdWxkIGJlIGhhbmRsZWQg aW4gdGhlIGRyaXZlcidzIGF0b21pYyBjaGVjay4gRm9yIGV4YW1wbGUsIGlmIGENCj4gLQkg KiBjb25uZWN0b3Igc2hhcmVzIGRpc3BsYXkgYmFuZHdpZHRoIHdpdGggb3RoZXIgY29ubmVj dG9ycyB0aGVuIGl0DQo+IC0JICogd291bGQgYmUgb2sgdG8gdmFsaWRhdGUgdGhlIG1pbmlt dW0gYmFuZHdpZHRoIHJlcXVpcmVtZW50IG9mIGEgbW9kZQ0KPiAtCSAqIGFnYWluc3QgdGhl IG1heGltdW0gcG9zc2libGUgYmFuZHdpZHRoIG9mIHRoZSBjb25uZWN0b3IuIEJ1dCBpdA0K PiAtCSAqIHdvdWxkbid0IGJlIG9rIHRvIHRha2UgdGhlIGN1cnJlbnQgYmFuZHdpZHRoIHVz YWdlIG9mIG90aGVyDQo+IC0JICogY29ubmVjdG9ycyBpbnRvIGFjY291bnQsIGFzIHRoaXMg d291bGQgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUNCj4gLQkgKiBkaXNwbGF5IHN0YXRlLg0K PiAtCSAqDQo+IC0JICogUmV0dXJuczoNCj4gLQkgKiAwIGlmICZkcm1fY29ubmVjdG9yX2hl bHBlcl9mdW5jcy5tb2RlX3ZhbGlkX2N0eCBzdWNjZWVkZWQgYW5kIHdyb3RlDQo+IC0JICog dGhlICZlbnVtIGRybV9tb2RlX3N0YXR1cyB2YWx1ZSB0byBAc3RhdHVzLCBvciBhIG5lZ2F0 aXZlIGVycm9yDQo+IC0JICogY29kZSBvdGhlcndpc2UuDQo+IC0JICoNCj4gLQkgKi8NCj4g LQlpbnQgKCptb2RlX3ZhbGlkX2N0eCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rv ciwNCj4gLQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLA0KPiAtCQkJ ICAgICAgc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4ICpjdHgsDQo+IC0JCQkgICAg ICBlbnVtIGRybV9tb2RlX3N0YXR1cyAqc3RhdHVzKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAq IEBiZXN0X2VuY29kZXI6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBz ZWxlY3QgdGhlIGJlc3QgZW5jb2RlciBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rvci4NCj4gLQkg Kg0KPiAtCSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIHRoZSBhdG9taWMgaGVs cGVycyAoaW4gdGhlDQo+IC0JICogZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldCgp IGZ1bmN0aW9uKSBhbmQgaW4gdGhlIGxlZ2FjeSBDUlRDDQo+IC0JICogaGVscGVycy4NCj4g LQkgKg0KPiAtCSAqIE5PVEU6DQo+IC0JICoNCj4gLQkgKiBJbiBhdG9taWMgZHJpdmVycyB0 aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhhc2Ugb2YgYW4NCj4gLQkg KiBhdG9taWMgdXBkYXRlLiBUaGUgZHJpdmVyIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBv ciBpbnNwZWN0DQo+IC0JICogYW55dGhpbmcgb3V0c2lkZSBvZiBhcmd1bWVudHMgcGFzc2Vk LWluLiBBdG9taWMgZHJpdmVycyB3aGljaCBuZWVkIHRvDQo+IC0JICogaW5zcGVjdCBkeW5h bWljIGNvbmZpZ3VyYXRpb24gc3RhdGUgc2hvdWxkIGluc3RlYWQgdXNlDQo+IC0JICogQGF0 b21pY19iZXN0X2VuY29kZXIuDQo+IC0JICoNCj4gLQkgKiBZb3UgY2FuIGxlYXZlIHRoaXMg ZnVuY3Rpb24gdG8gTlVMTCBpZiB0aGUgY29ubmVjdG9yIGlzIG9ubHkNCj4gLQkgKiBhdHRh Y2hlZCB0byBhIHNpbmdsZSBlbmNvZGVyLiBJbiB0aGlzIGNhc2UsIHRoZSBjb3JlIHdpbGwg Y2FsbA0KPiAtCSAqIGRybV9jb25uZWN0b3JfZ2V0X3NpbmdsZV9lbmNvZGVyKCkgZm9yIHlv dS4NCj4gLQkgKg0KPiAtCSAqIFJFVFVSTlM6DQo+IC0JICoNCj4gLQkgKiBFbmNvZGVyIHRo YXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBjb25uZWN0b3IgYW5kIGNvbm5lY3Rv cg0KPiAtCSAqIHN0YXRlLCBvciBOVUxMIGlmIG5vIHN1aXRhYmxlIGVuY29kZXIgZXhpc3Rz LiBOb3RlIHRoYXQgdGhlIGhlbHBlcnMNCj4gLQkgKiB3aWxsIGVuc3VyZSB0aGF0IGVuY29k ZXJzIGFyZW4ndCB1c2VkIHR3aWNlLCBkcml2ZXJzIHNob3VsZCBub3QgY2hlY2sNCj4gLQkg KiBmb3IgdGhpcy4NCj4gLQkgKi8NCj4gLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKigqYmVzdF9l bmNvZGVyKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsNCj4gLQ0KPiAtCS8q Kg0KPiAtCSAqIEBhdG9taWNfYmVzdF9lbmNvZGVyOg0KPiAtCSAqDQo+IC0JICogVGhpcyBp cyB0aGUgYXRvbWljIHZlcnNpb24gb2YgQGJlc3RfZW5jb2RlciBmb3IgYXRvbWljIGRyaXZl cnMgd2hpY2gNCj4gLQkgKiBuZWVkIHRvIHNlbGVjdCB0aGUgYmVzdCBlbmNvZGVyIGRlcGVu ZGluZyB1cG9uIHRoZSBkZXNpcmVkDQo+IC0JICogY29uZmlndXJhdGlvbiBhbmQgY2FuJ3Qg c2VsZWN0IGl0IHN0YXRpY2FsbHkuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIGlz IHVzZWQgYnkgZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldCgpLg0KPiAtCSAqIElm IGl0IGlzIG5vdCBpbXBsZW1lbnRlZCwgdGhlIGNvcmUgd2lsbCBmYWxsYmFjayB0byBAYmVz dF9lbmNvZGVyDQo+IC0JICogKG9yIGRybV9jb25uZWN0b3JfZ2V0X3NpbmdsZV9lbmNvZGVy KCkgaWYgQGJlc3RfZW5jb2RlciBpcyBOVUxMKS4NCj4gLQkgKg0KPiAtCSAqIE5PVEU6DQo+ IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhh c2Ugb2YgYW4gYXRvbWljIHVwZGF0ZS4gVGhlDQo+IC0JICogZHJpdmVyIGlzIG5vdCBhbGxv d2VkIHRvIGNoYW5nZSBhbnl0aGluZyBvdXRzaWRlIG9mIHRoZQ0KPiAtCSAqICZkcm1fYXRv bWljX3N0YXRlIHVwZGF0ZSB0cmFja2luZyBzdHJ1Y3R1cmUgcGFzc2VkIGluLg0KPiAtCSAq DQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAtCSAqIEVuY29kZXIgdGhhdCBzaG91bGQg YmUgdXNlZCBmb3IgdGhlIGdpdmVuIGNvbm5lY3RvciBhbmQgY29ubmVjdG9yDQo+IC0JICog c3RhdGUsIG9yIE5VTEwgaWYgbm8gc3VpdGFibGUgZW5jb2RlciBleGlzdHMuIE5vdGUgdGhh dCB0aGUgaGVscGVycw0KPiAtCSAqIHdpbGwgZW5zdXJlIHRoYXQgZW5jb2RlcnMgYXJlbid0 IHVzZWQgdHdpY2UsIGRyaXZlcnMgc2hvdWxkIG5vdCBjaGVjaw0KPiAtCSAqIGZvciB0aGlz Lg0KPiAtCSAqLw0KPiAtCXN0cnVjdCBkcm1fZW5jb2RlciAqKCphdG9taWNfYmVzdF9lbmNv ZGVyKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLA0KPiAtCQkJCQkJICAgc3Ry dWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBh dG9taWNfY2hlY2s6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGhvb2sgaXMgdXNlZCB0byB2YWxp ZGF0ZSBjb25uZWN0b3Igc3RhdGUuIFRoaXMgZnVuY3Rpb24gaXMNCj4gLQkgKiBjYWxsZWQg ZnJvbSAmZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldCwgYW5kIGlzIGNhbGxlZCB3 aGVuDQo+IC0JICogYSBjb25uZWN0b3IgcHJvcGVydHkgaXMgc2V0LCBvciBhIG1vZGVzZXQg b24gdGhlIGNydGMgaXMgZm9yY2VkLg0KPiAtCSAqDQo+IC0JICogQmVjYXVzZSAmZHJtX2F0 b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVz LA0KPiAtCSAqIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhbmRsZSBiZWluZyBjYWxsZWQgbXVs dGlwbGUgdGltZXMgYXMgd2VsbC4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgZnVuY3Rpb24gaXMg YWxzbyBhbGxvd2VkIHRvIGluc3BlY3QgYW55IG90aGVyIG9iamVjdCdzIHN0YXRlIGFuZA0K PiAtCSAqIGNhbiBhZGQgbW9yZSBzdGF0ZSBvYmplY3RzIHRvIHRoZSBhdG9taWMgY29tbWl0 IGlmIG5lZWRlZC4gQ2FyZSBtdXN0DQo+IC0JICogYmUgdGFrZW4gdGhvdWdoIHRvIGVuc3Vy ZSB0aGF0IHN0YXRlIGNoZWNrIGFuZCBjb21wdXRlIGZ1bmN0aW9ucyBmb3INCj4gLQkgKiB0 aGVzZSBhZGRlZCBzdGF0ZXMgYXJlIGFsbCBjYWxsZWQsIGFuZCBkZXJpdmVkIHN0YXRlIGlu IG90aGVyIG9iamVjdHMNCj4gLQkgKiBhbGwgdXBkYXRlZC4gQWdhaW4gdGhlIHJlY29tbWVu ZGF0aW9uIGlzIHRvIGp1c3QgY2FsbCBjaGVjayBoZWxwZXJzDQo+IC0JICogdW50aWwgYSBt YXhpbWFsIGNvbmZpZ3VyYXRpb24gaXMgcmVhY2hlZC4NCj4gLQkgKg0KPiAtCSAqIE5PVEU6 DQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sg cGhhc2Ugb2YgYW4gYXRvbWljIHVwZGF0ZS4gVGhlDQo+IC0JICogZHJpdmVyIGlzIG5vdCBh bGxvd2VkIHRvIGNoYW5nZSBhbnl0aGluZyBvdXRzaWRlIG9mIHRoZSBmcmVlLXN0YW5kaW5n DQo+IC0JICogc3RhdGUgb2JqZWN0cyBwYXNzZWQtaW4gb3IgYXNzZW1ibGVkIGluIHRoZSBv dmVyYWxsICZkcm1fYXRvbWljX3N0YXRlDQo+IC0JICogdXBkYXRlIHRyYWNraW5nIHN0cnVj dHVyZS4NCj4gLQkgKg0KPiAtCSAqIFJFVFVSTlM6DQo+IC0JICoNCj4gLQkgKiAwIG9uIHN1 Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHN0YXRlIG9yIHRoZSB0cmFuc2l0aW9uIGNhbid0IGJl DQo+IC0JICogc3VwcG9ydGVkLCAtRU5PTUVNIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1 cmUgYW5kIC1FREVBRExLIGlmIGFuDQo+IC0JICogYXR0ZW1wdCB0byBvYnRhaW4gYW5vdGhl ciBzdGF0ZSBvYmplY3QgcmFuIGludG8gYSAmZHJtX21vZGVzZXRfbG9jaw0KPiAtCSAqIGRl YWRsb2NrLg0KPiAtCSAqLw0KPiAtCWludCAoKmF0b21pY19jaGVjaykoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvciwNCj4gLQkJCSAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0 ZSAqc3RhdGUpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICogQGF0b21pY19jb21taXQ6DQo+IC0J ICoNCj4gLQkgKiBUaGlzIGhvb2sgaXMgdG8gYmUgdXNlZCBieSBkcml2ZXJzIGltcGxlbWVu dGluZyB3cml0ZWJhY2sgY29ubmVjdG9ycw0KPiAtCSAqIHRoYXQgbmVlZCBhIHBvaW50IHdo ZW4gdG8gY29tbWl0IHRoZSB3cml0ZWJhY2sgam9iIHRvIHRoZSBoYXJkd2FyZS4NCj4gLQkg KiBUaGUgd3JpdGViYWNrX2pvYiB0byBjb21taXQgaXMgYXZhaWxhYmxlIGluIHRoZSBuZXcg Y29ubmVjdG9yIHN0YXRlLA0KPiAtCSAqIGluICZkcm1fY29ubmVjdG9yX3N0YXRlLndyaXRl YmFja19qb2IuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGhvb2sgaXMgb3B0aW9uYWwuDQo+IC0J ICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0 IGhlbHBlcnMuDQo+IC0JICovDQo+IC0Jdm9pZCAoKmF0b21pY19jb21taXQpKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsDQo+IC0JCQkgICAgICBzdHJ1Y3QgZHJtX2F0b21p Y19zdGF0ZSAqc3RhdGUpOw0KPiAtDQo+IC0JLyoqDQo+IC0JICogQHByZXBhcmVfd3JpdGVi YWNrX2pvYjoNCj4gLQkgKg0KPiAtCSAqIEFzIHdyaXRlYmFjayBqb2JzIGNvbnRhaW4gYSBm cmFtZWJ1ZmZlciwgZHJpdmVycyBtYXkgbmVlZCB0bw0KPiAtCSAqIHByZXBhcmUgYW5kIGNs ZWFuIHRoZW0gdXAgdGhlIHNhbWUgd2F5IHRoZXkgY2FuIHByZXBhcmUgYW5kDQo+IC0JICog Y2xlYW4gdXAgZnJhbWVidWZmZXJzIGZvciBwbGFuZXMuIFRoaXMgb3B0aW9uYWwgY29ubmVj dG9yIG9wZXJhdGlvbg0KPiAtCSAqIGlzIHVzZWQgdG8gc3VwcG9ydCB0aGUgcHJlcGFyYXRp b24gb2Ygd3JpdGViYWNrIGpvYnMuIFRoZSBqb2INCj4gLQkgKiBwcmVwYXJlIG9wZXJhdGlv biBpcyBjYWxsZWQgZnJvbSBkcm1fYXRvbWljX2hlbHBlcl9wcmVwYXJlX3BsYW5lcygpDQo+ IC0JICogZm9yIHN0cnVjdCAmZHJtX3dyaXRlYmFja19jb25uZWN0b3IgY29ubmVjdG9ycyBv bmx5Lg0KPiAtCSAqDQo+IC0JICogVGhpcyBvcGVyYXRpb24gaXMgb3B0aW9uYWwuDQo+IC0J ICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0 IGhlbHBlcnMuDQo+IC0JICovDQo+IC0JaW50ICgqcHJlcGFyZV93cml0ZWJhY2tfam9iKShz dHJ1Y3QgZHJtX3dyaXRlYmFja19jb25uZWN0b3IgKmNvbm5lY3RvciwNCj4gLQkJCQkgICAg IHN0cnVjdCBkcm1fd3JpdGViYWNrX2pvYiAqam9iKTsNCj4gLQkvKioNCj4gLQkgKiBAY2xl YW51cF93cml0ZWJhY2tfam9iOg0KPiAtCSAqDQo+IC0JICogVGhpcyBvcHRpb25hbCBjb25u ZWN0b3Igb3BlcmF0aW9uIGlzIHVzZWQgdG8gc3VwcG9ydCB0aGUNCj4gLQkgKiBjbGVhbnVw IG9mIHdyaXRlYmFjayBqb2JzLiBUaGUgam9iIGNsZWFudXAgb3BlcmF0aW9uIGlzIGNhbGxl ZA0KPiAtCSAqIGZyb20gdGhlIGV4aXN0aW5nIGRybV93cml0ZWJhY2tfY2xlYW51cF9qb2Io KSBmdW5jdGlvbiwgaW52b2tlZA0KPiAtCSAqIGJvdGggd2hlbiBkZXN0cm95aW5nIHRoZSBq b2IgYXMgcGFydCBvZiBhbiBhYm9ydGVkIGNvbW1pdCwgb3Igd2hlbg0KPiAtCSAqIHRoZSBq b2IgY29tcGxldGVzLg0KPiAtCSAqDQo+IC0JICogVGhpcyBvcGVyYXRpb24gaXMgb3B0aW9u YWwuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21p YyBtb2Rlc2V0IGhlbHBlcnMuDQo+IC0JICovDQo+IC0Jdm9pZCAoKmNsZWFudXBfd3JpdGVi YWNrX2pvYikoc3RydWN0IGRybV93cml0ZWJhY2tfY29ubmVjdG9yICpjb25uZWN0b3IsDQo+ IC0JCQkJICAgICAgc3RydWN0IGRybV93cml0ZWJhY2tfam9iICpqb2IpOw0KPiAtDQo+IC0J LyoqDQo+IC0JICogQGVuYWJsZV9ocGQ6DQo+IC0JICoNCj4gLQkgKiBFbmFibGUgaG90LXBs dWcgZGV0ZWN0aW9uIGZvciB0aGUgY29ubmVjdG9yLg0KPiAtCSAqDQo+IC0JICogVGhpcyBv cGVyYXRpb24gaXMgb3B0aW9uYWwuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlz IHVzZWQgYnkgdGhlIGRybV9rbXNfaGVscGVyX3BvbGxfZW5hYmxlKCkgaGVscGVycy4NCj4g LQkgKi8NCj4gLQl2b2lkICgqZW5hYmxlX2hwZCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3Rvcik7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAZGlzYWJsZV9ocGQ6DQo+IC0JICoN Cj4gLQkgKiBEaXNhYmxlIGhvdC1wbHVnIGRldGVjdGlvbiBmb3IgdGhlIGNvbm5lY3Rvci4N Cj4gLQkgKg0KPiAtCSAqIFRoaXMgb3BlcmF0aW9uIGlzIG9wdGlvbmFsLg0KPiAtCSAqDQo+ IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBkcm1fa21zX2hlbHBlcl9wb2xs X2Rpc2FibGUoKSBoZWxwZXJzLg0KPiAtCSAqLw0KPiAtCXZvaWQgKCpkaXNhYmxlX2hwZCko c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7DQo+IC19Ow0KPiAtDQo+IC0vKioN Cj4gLSAqIGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCAtIHNldHMgdGhlIGhlbHBlciB2dGFi bGUgZm9yIGEgY29ubmVjdG9yDQo+IC0gKiBAY29ubmVjdG9yOiBEUk0gY29ubmVjdG9yDQo+ IC0gKiBAZnVuY3M6IGhlbHBlciB2dGFibGUgdG8gc2V0IGZvciBAY29ubmVjdG9yDQo+IC0g Ki8NCj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoc3Ry dWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwNCj4gLQkJCQkJICAgIGNvbnN0IHN0cnVj dCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyAqZnVuY3MpDQo+IC17DQo+IC0JY29ubmVj dG9yLT5oZWxwZXJfcHJpdmF0ZSA9IGZ1bmNzOw0KPiAtfQ0KPiAtDQo+IC0vKioNCj4gLSAq IHN0cnVjdCBkcm1fcGxhbmVfaGVscGVyX2Z1bmNzIC0gaGVscGVyIG9wZXJhdGlvbnMgZm9y IHBsYW5lcw0KPiAtICoNCj4gLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSB0aGUg YXRvbWljIGhlbHBlcnMuDQo+IC0gKi8NCj4gLXN0cnVjdCBkcm1fcGxhbmVfaGVscGVyX2Z1 bmNzIHsNCj4gLQkvKioNCj4gLQkgKiBAcHJlcGFyZV9mYjoNCj4gLQkgKg0KPiAtCSAqIFRo aXMgaG9vayBpcyB0byBwcmVwYXJlIGEgZnJhbWVidWZmZXIgZm9yIHNjYW5vdXQgYnkgZS5n LiBwaW5uaW5nDQo+IC0JICogaXRzIGJhY2tpbmcgc3RvcmFnZSBvciByZWxvY2F0aW5nIGl0 IGludG8gYSBjb250aWd1b3VzIGJsb2NrIG9mDQo+IC0JICogVlJBTS4gT3RoZXIgcG9zc2li bGUgcHJlcGFyYXRvcnkgd29yayBpbmNsdWRlcyBmbHVzaGluZyBjYWNoZXMuDQo+IC0JICoN Cj4gLQkgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJsb2NrIGZvciBvdXRzdGFuZGluZyBy ZW5kZXJpbmcsIHNpbmNlIGl0IGlzDQo+IC0JICogY2FsbGVkIGluIHRoZSBjb250ZXh0IG9m IHRoZSBhdG9taWMgSU9DVEwgZXZlbiBmb3IgYXN5bmMgY29tbWl0cyB0bw0KPiAtCSAqIGJl IGFibGUgdG8gcmV0dXJuIGFueSBlcnJvcnMgdG8gdXNlcnNwYWNlLiBJbnN0ZWFkIHRoZSBy ZWNvbW1lbmRlZA0KPiAtCSAqIHdheSBpcyB0byBmaWxsIG91dCB0aGUgJmRybV9wbGFuZV9z dGF0ZS5mZW5jZSBvZiB0aGUgcGFzc2VkLWluDQo+IC0JICogJmRybV9wbGFuZV9zdGF0ZS4g SWYgdGhlIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlIGZlbmNlcyB0aGVuDQo+IC0J ICogZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0aHJv dWdoIHByaXZhdGUNCj4gLQkgKiBtZW1iZXJzIGluIHRoZSBwbGFuZSBzdHJ1Y3R1cmUuDQo+ IC0JICoNCj4gLQkgKiBGb3IgR0VNIGRyaXZlcnMgd2hvIG5laXRoZXIgaGF2ZSBhIEBwcmVw YXJlX2ZiIG5vciBAY2xlYW51cF9mYiBob29rDQo+IC0JICogc2V0IGRybV9nZW1fcGxhbmVf aGVscGVyX3ByZXBhcmVfZmIoKSBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB0bw0KPiAtCSAq IGltcGxlbWVudCB0aGlzLiBPdGhlciBkcml2ZXJzIHdoaWNoIG5lZWQgYWRkaXRpb25hbCBw bGFuZSBwcm9jZXNzaW5nDQo+IC0JICogY2FuIGNhbGwgZHJtX2dlbV9wbGFuZV9oZWxwZXJf cHJlcGFyZV9mYigpIGZyb20gdGhlaXIgQHByZXBhcmVfZmINCj4gLQkgKiBob29rLg0KPiAt CSAqDQo+IC0JICogVGhlIHJlc291cmNlcyBhY3F1aXJlZCBpbiBAcHJlcGFyZV9mYiBwZXJz aXN0IGFmdGVyIHRoZSBlbmQgb2YNCj4gLQkgKiB0aGUgYXRvbWljIGNvbW1pdC4gUmVzb3Vy Y2VzIHRoYXQgY2FuIGJlIHJlbGVhc2UgYXQgdGhlIGNvbW1pdCdzIGVuZA0KPiAtCSAqIHNo b3VsZCBiZSBhY3F1aXJlZCBpbiBAYmVnaW5fZmJfYWNjZXNzIGFuZCByZWxlYXNlZCBpbiBA ZW5kX2ZiX2FjY2Vzcy4NCj4gLQkgKiBGb3IgZXhhbXBsZSwgYSBHRU0gYnVmZmVyJ3MgcGlu IG9wZXJhdGlvbiBiZWxvbmdzIGludG8gQHByZXBhcmVfZmIgdG8NCj4gLQkgKiBrZWVwIHRo ZSBidWZmZXIgcGlubmVkIGFmdGVyIHRoZSBjb21taXQuIEJ1dCBhIHZtYXAgb3BlcmF0aW9u IGZvcg0KPiAtCSAqIHNoYWRvdy1wbGFuZSBoZWxwZXJzIGJlbG9uZ3MgaW50byBAYmVnaW5f ZmJfYWNjZXNzLCBzbyB0aGF0IGF0b21pYw0KPiAtCSAqIGhlbHBlcnMgcmVtb3ZlIHRoZSBt YXBwaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1pdC4NCj4gLQkgKg0KPiAtCSAqIFRoZSBo ZWxwZXJzIHdpbGwgY2FsbCBAY2xlYW51cF9mYiB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cyBm b3IgZXZlcnkNCj4gLQkgKiBzdWNjZXNzZnVsIGNhbGwgdG8gdGhpcyBob29rLg0KPiAtCSAq DQo+IC0JICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNldCBo ZWxwZXJzLCBidXQgaXQgaXMNCj4gLQkgKiBvcHRpb25hbC4gU2VlIEBiZWdpbl9mYl9hY2Nl c3MgZm9yIHByZXBhcmluZyBwZXItY29tbWl0IHJlc291cmNlcy4NCj4gLQkgKg0KPiAtCSAq IFJFVFVSTlM6DQo+IC0JICoNCj4gLQkgKiAwIG9uIHN1Y2Nlc3Mgb3Igb25lIG9mIHRoZSBm b2xsb3dpbmcgbmVnYXRpdmUgZXJyb3IgY29kZXMgYWxsb3dlZCBieQ0KPiAtCSAqIHRoZSAm ZHJtX21vZGVfY29uZmlnX2Z1bmNzLmF0b21pY19jb21taXQgdmZ1bmMuIFdoZW4gdXNpbmcg aGVscGVycw0KPiAtCSAqIHRoaXMgY2FsbGJhY2sgaXMgdGhlIG9ubHkgb25lIHdoaWNoIGNh biBmYWlsIGFuIGF0b21pYyBjb21taXQsDQo+IC0JICogZXZlcnl0aGluZyBlbHNlIG11c3Qg Y29tcGxldGUgc3VjY2Vzc2Z1bGx5Lg0KPiAtCSAqLw0KPiAtCWludCAoKnByZXBhcmVfZmIp KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLA0KPiAtCQkJICBzdHJ1Y3QgZHJtX3BsYW5lX3N0 YXRlICpuZXdfc3RhdGUpOw0KPiAtCS8qKg0KPiAtCSAqIEBjbGVhbnVwX2ZiOg0KPiAtCSAq DQo+IC0JICogVGhpcyBob29rIGlzIGNhbGxlZCB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2Vz IGFsbG9jYXRlZCBmb3IgdGhlIGdpdmVuDQo+IC0JICogZnJhbWVidWZmZXIgYW5kIHBsYW5l IGNvbmZpZ3VyYXRpb24gaW4gQHByZXBhcmVfZmIuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGNh bGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0IGhlbHBlcnMsIGJ1dCBpdCBp cw0KPiAtCSAqIG9wdGlvbmFsLg0KPiAtCSAqLw0KPiAtCXZvaWQgKCpjbGVhbnVwX2ZiKShz dHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwNCj4gLQkJCSAgIHN0cnVjdCBkcm1fcGxhbmVfc3Rh dGUgKm9sZF9zdGF0ZSk7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAYmVnaW5fZmJfYWNjZXNz Og0KPiAtCSAqDQo+IC0JICogVGhpcyBob29rIHByZXBhcmVzIHRoZSBwbGFuZSBmb3IgYWNj ZXNzIGR1cmluZyBhbiBhdG9taWMgY29tbWl0Lg0KPiAtCSAqIEluIGNvbnRyYXN0IHRvIEBw cmVwYXJlX2ZiLCByZXNvdXJjZXMgYWNxdWlyZWQgaW4gQGJlZ2luX2ZiX2FjY2VzcywNCj4g LQkgKiBhcmUgcmVsZWFzZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXRvbWljIGNvbW1pdCBpbiBA ZW5kX2ZiX2FjY2Vzcy4NCj4gLQkgKg0KPiAtCSAqIEZvciBleGFtcGxlLCB3aXRoIHNoYWRv dy1wbGFuZSBoZWxwZXJzLCB0aGUgR0VNIGJ1ZmZlcidzIHZtYXANCj4gLQkgKiBvcGVyYXRp b24gYmVsb25ncyBpbnRvIEBiZWdpbl9mYl9hY2Nlc3MsIHNvIHRoYXQgdGhlIGJ1ZmZlcidz DQo+IC0JICogbWVtb3J5IHdpbGwgYmUgdW5tYXBwZWQgYXQgdGhlIGVuZCBvZiB0aGUgY29t bWl0IGluIEBlbmRfZmJfYWNjZXNzLg0KPiAtCSAqIEJ1dCBhIEdFTSBidWZmZXIncyBwaW4g b3BlcmF0aW9uIGJlbG9uZ3MgaW50byBAcHJlcGFyZV9mYg0KPiAtCSAqIHRvIGtlZXAgdGhl IGJ1ZmZlciBwaW5uZWQgYWZ0ZXIgdGhlIGNvbW1pdC4NCj4gLQkgKg0KPiAtCSAqIFRoZSBj YWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNldCBoZWxwZXJzLCBidXQgaXQg aXMgb3B0aW9uYWwuDQo+IC0JICogU2VlIEBlbmRfZmJfY2xlYW51cCBmb3IgdW5kb2luZyB0 aGUgZWZmZWN0cyBvZiBAYmVnaW5fZmJfYWNjZXNzIGFuZA0KPiAtCSAqIEBwcmVwYXJlX2Zi IGZvciBhY3F1aXJpbmcgcmVzb3VyY2VzIHVudGlsIHRoZSBuZXh0IHBhZ2VmbGlwLg0KPiAt CSAqDQo+IC0JICogUmV0dXJuczoNCj4gLQkgKiAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRp dmUgZXJybm8gY29kZSBvdGhlcndpc2UuDQo+IC0JICovDQo+IC0JaW50ICgqYmVnaW5fZmJf YWNjZXNzKShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgc3RydWN0IGRybV9wbGFuZV9zdGF0 ZSAqbmV3X3BsYW5lX3N0YXRlKTsNCj4gLQ0KPiAtCS8qKg0KPiAtCSAqIEBlbmRfZmJfYWNj ZXNzOg0KPiAtCSAqDQo+IC0JICogVGhpcyBob29rIGNsZWFucyB1cCByZXNvdXJjZXMgYWxs b2NhdGVkIGJ5IEBiZWdpbl9mYl9hY2Nlc3MuIEl0IGl0IGNhbGxlZA0KPiAtCSAqIGF0IHRo ZSBlbmQgb2YgYSBjb21taXQgZm9yIHRoZSBuZXcgcGxhbmUgc3RhdGUuDQo+IC0JICovDQo+ IC0Jdm9pZCAoKmVuZF9mYl9hY2Nlc3MpKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCBzdHJ1 Y3QgZHJtX3BsYW5lX3N0YXRlICpuZXdfcGxhbmVfc3RhdGUpOw0KPiAtDQo+IC0JLyoqDQo+ IC0JICogQGF0b21pY19jaGVjazoNCj4gLQkgKg0KPiAtCSAqIERyaXZlcnMgc2hvdWxkIGNo ZWNrIHBsYW5lIHNwZWNpZmljIGNvbnN0cmFpbnRzIGluIHRoaXMgaG9vay4NCj4gLQkgKg0K PiAtCSAqIFdoZW4gdXNpbmcgZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfcGxhbmVzKCkgcGxh bmUncyBAYXRvbWljX2NoZWNrDQo+IC0JICogaG9va3MgYXJlIGNhbGxlZCBiZWZvcmUgdGhl IG9uZXMgZm9yIENSVENzLCB3aGljaCBhbGxvd3MgZHJpdmVycyB0bw0KPiAtCSAqIHJlcXVl c3Qgc2hhcmVkIHJlc291cmNlcyB0aGF0IHRoZSBDUlRDIGNvbnRyb2xzIGhlcmUuIEZvciBt b3JlDQo+IC0JICogY29tcGxpY2F0ZWQgZGVwZW5kZW5jaWVzIHRoZSBkcml2ZXIgY2FuIGNh bGwgdGhlIHByb3ZpZGVkIGNoZWNrIGhlbHBlcnMNCj4gLQkgKiBtdWx0aXBsZSB0aW1lcyB1 bnRpbCB0aGUgY29tcHV0ZWQgc3RhdGUgaGFzIGEgZmluYWwgY29uZmlndXJhdGlvbiBhbmQN Cj4gLQkgKiBldmVyeXRoaW5nIGhhcyBiZWVuIGNoZWNrZWQuDQo+IC0JICoNCj4gLQkgKiBU aGlzIGZ1bmN0aW9uIGlzIGFsc28gYWxsb3dlZCB0byBpbnNwZWN0IGFueSBvdGhlciBvYmpl Y3QncyBzdGF0ZSBhbmQNCj4gLQkgKiBjYW4gYWRkIG1vcmUgc3RhdGUgb2JqZWN0cyB0byB0 aGUgYXRvbWljIGNvbW1pdCBpZiBuZWVkZWQuIENhcmUgbXVzdA0KPiAtCSAqIGJlIHRha2Vu IHRob3VnaCB0byBlbnN1cmUgdGhhdCBzdGF0ZSBjaGVjayBhbmQgY29tcHV0ZSBmdW5jdGlv bnMgZm9yDQo+IC0JICogdGhlc2UgYWRkZWQgc3RhdGVzIGFyZSBhbGwgY2FsbGVkLCBhbmQg ZGVyaXZlZCBzdGF0ZSBpbiBvdGhlciBvYmplY3RzDQo+IC0JICogYWxsIHVwZGF0ZWQuIEFn YWluIHRoZSByZWNvbW1lbmRhdGlvbiBpcyB0byBqdXN0IGNhbGwgY2hlY2sgaGVscGVycw0K PiAtCSAqIHVudGlsIGEgbWF4aW1hbCBjb25maWd1cmF0aW9uIGlzIHJlYWNoZWQuDQo+IC0J ICoNCj4gLQkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0 IGhlbHBlcnMsIGJ1dCBpdCBpcw0KPiAtCSAqIG9wdGlvbmFsLg0KPiAtCSAqDQo+IC0JICog Tk9URToNCj4gLQkgKg0KPiAtCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBj aGVjayBwaGFzZSBvZiBhbiBhdG9taWMgdXBkYXRlLiBUaGUNCj4gLQkgKiBkcml2ZXIgaXMg bm90IGFsbG93ZWQgdG8gY2hhbmdlIGFueXRoaW5nIG91dHNpZGUgb2YgdGhlDQo+IC0JICog JmRybV9hdG9taWNfc3RhdGUgdXBkYXRlIHRyYWNraW5nIHN0cnVjdHVyZS4NCj4gLQkgKg0K PiAtCSAqIFJFVFVSTlM6DQo+IC0JICoNCj4gLQkgKiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwg aWYgdGhlIHN0YXRlIG9yIHRoZSB0cmFuc2l0aW9uIGNhbid0IGJlDQo+IC0JICogc3VwcG9y dGVkLCAtRU5PTUVNIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgYW5kIC1FREVBRExL IGlmIGFuDQo+IC0JICogYXR0ZW1wdCB0byBvYnRhaW4gYW5vdGhlciBzdGF0ZSBvYmplY3Qg cmFuIGludG8gYSAmZHJtX21vZGVzZXRfbG9jaw0KPiAtCSAqIGRlYWRsb2NrLg0KPiAtCSAq Lw0KPiAtCWludCAoKmF0b21pY19jaGVjaykoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsDQo+ IC0JCQkgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gLQ0KPiAtCS8q Kg0KPiAtCSAqIEBhdG9taWNfdXBkYXRlOg0KPiAtCSAqDQo+IC0JICogRHJpdmVycyBzaG91 bGQgdXNlIHRoaXMgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBwbGFuZSBzdGF0ZS4gIFRoaXMN Cj4gLQkgKiBob29rIGlzIGNhbGxlZCBpbi1iZXR3ZWVuIHRoZSAmZHJtX2NydGNfaGVscGVy X2Z1bmNzLmF0b21pY19iZWdpbiBhbmQNCj4gLQkgKiBkcm1fY3J0Y19oZWxwZXJfZnVuY3Mu YXRvbWljX2ZsdXNoIGNhbGxiYWNrcy4NCj4gLQkgKg0KPiAtCSAqIE5vdGUgdGhhdCB0aGUg cG93ZXIgc3RhdGUgb2YgdGhlIGRpc3BsYXkgcGlwZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMN Cj4gLQkgKiBjYWxsZWQgZGVwZW5kcyB1cG9uIHRoZSBleGFjdCBoZWxwZXJzIGFuZCBjYWxs aW5nIHNlcXVlbmNlIHRoZSBkcml2ZXINCj4gLQkgKiBoYXMgcGlja2VkLiBTZWUgZHJtX2F0 b21pY19oZWxwZXJfY29tbWl0X3BsYW5lcygpIGZvciBhIGRpc2N1c3Npb24gb2YNCj4gLQkg KiB0aGUgdHJhZGVvZmZzIGFuZCB2YXJpYW50cyBvZiBwbGFuZSBjb21taXQgaGVscGVycy4N Cj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgYXRvbWljIG1v ZGVzZXQgaGVscGVycywgYnV0IGl0IGlzIG9wdGlvbmFsLg0KPiAtCSAqLw0KPiAtCXZvaWQg KCphdG9taWNfdXBkYXRlKShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwNCj4gLQkJCSAgICAg IHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+IC0NCj4gLQkvKioNCj4gLQkg KiBAYXRvbWljX2VuYWJsZToNCj4gLQkgKg0KPiAtCSAqIERyaXZlcnMgc2hvdWxkIHVzZSB0 aGlzIGZ1bmN0aW9uIHRvIHVuY29uZGl0aW9uYWxseSBlbmFibGUgYSBwbGFuZS4NCj4gLQkg KiBUaGlzIGhvb2sgaXMgY2FsbGVkIGluLWJldHdlZW4gdGhlICZkcm1fY3J0Y19oZWxwZXJf ZnVuY3MuYXRvbWljX2JlZ2luDQo+IC0JICogYW5kIGRybV9jcnRjX2hlbHBlcl9mdW5jcy5h dG9taWNfZmx1c2ggY2FsbGJhY2tzLiBJdCBpcyBjYWxsZWQgYWZ0ZXINCj4gLQkgKiBAYXRv bWljX3VwZGF0ZSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGFsbCBlbmFibGVkIHBsYW5l cy4gRHJpdmVycw0KPiAtCSAqIHRoYXQgdXNlIEBhdG9taWNfZW5hYmxlIHNob3VsZCBzZXQg dXAgYSBwbGFuZSBpbiBAYXRvbWljX3VwZGF0ZSBhbmQNCj4gLQkgKiBhZnRlcndhcmRzIGVu YWJsZSB0aGUgcGxhbmUgaW4gQGF0b21pY19lbmFibGUuIElmIGEgcGxhbmUgbmVlZHMgdG8g YmUNCj4gLQkgKiBlbmFibGVkIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBzY2Fub3V0IGJ1ZmZl ciwgZHJpdmVycyBjYW4gc3RpbGwgZG8NCj4gLQkgKiBzbyBpbiBAYXRvbWljX3VwZGF0ZS4N Cj4gLQkgKg0KPiAtCSAqIE5vdGUgdGhhdCB0aGUgcG93ZXIgc3RhdGUgb2YgdGhlIGRpc3Bs YXkgcGlwZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMNCj4gLQkgKiBjYWxsZWQgZGVwZW5kcyB1 cG9uIHRoZSBleGFjdCBoZWxwZXJzIGFuZCBjYWxsaW5nIHNlcXVlbmNlIHRoZSBkcml2ZXIN Cj4gLQkgKiBoYXMgcGlja2VkLiBTZWUgZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X3BsYW5l cygpIGZvciBhIGRpc2N1c3Npb24gb2YNCj4gLQkgKiB0aGUgdHJhZGVvZmZzIGFuZCB2YXJp YW50cyBvZiBwbGFuZSBjb21taXQgaGVscGVycy4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgY2Fs bGJhY2sgaXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycywgYnV0IGl0IGlz DQo+IC0JICogb3B0aW9uYWwuIElmIGltcGxlbWVudGVkLCBAYXRvbWljX2VuYWJsZSBzaG91 bGQgYmUgdGhlIGludmVyc2Ugb2YNCj4gLQkgKiBAYXRvbWljX2Rpc2FibGUuIERyaXZlcnMg dGhhdCBkb24ndCB3YW50IHRvIHVzZSBlaXRoZXIgY2FuIHN0aWxsDQo+IC0JICogaW1wbGVt ZW50IHRoZSBjb21wbGV0ZSBwbGFuZSB1cGRhdGUgaW4gQGF0b21pY191cGRhdGUuDQo+IC0J ICovDQo+IC0Jdm9pZCAoKmF0b21pY19lbmFibGUpKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5l LA0KPiAtCQkJICAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsNCj4gLQ0K PiAtCS8qKg0KPiAtCSAqIEBhdG9taWNfZGlzYWJsZToNCj4gLQkgKg0KPiAtCSAqIERyaXZl cnMgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHVuY29uZGl0aW9uYWxseSBkaXNhYmxl IGEgcGxhbmUuDQo+IC0JICogVGhpcyBob29rIGlzIGNhbGxlZCBpbi1iZXR3ZWVuIHRoZQ0K PiAtCSAqICZkcm1fY3J0Y19oZWxwZXJfZnVuY3MuYXRvbWljX2JlZ2luIGFuZA0KPiAtCSAq IGRybV9jcnRjX2hlbHBlcl9mdW5jcy5hdG9taWNfZmx1c2ggY2FsbGJhY2tzLiBJdCBpcyBh biBhbHRlcm5hdGl2ZSB0bw0KPiAtCSAqIEBhdG9taWNfdXBkYXRlLCB3aGljaCB3aWxsIGJl IGNhbGxlZCBmb3IgZGlzYWJsaW5nIHBsYW5lcywgdG9vLCBpZg0KPiAtCSAqIHRoZSBAYXRv bWljX2Rpc2FibGUgaG9vayBpc24ndCBpbXBsZW1lbnRlZC4NCj4gLQkgKg0KPiAtCSAqIFRo aXMgaG9vayBpcyBhbHNvIHVzZWZ1bCB0byBkaXNhYmxlIHBsYW5lcyBpbiBwcmVwYXJhdGlv biBvZiBhIG1vZGVzZXQsDQo+IC0JICogYnkgY2FsbGluZyBkcm1fYXRvbWljX2hlbHBlcl9k aXNhYmxlX3BsYW5lc19vbl9jcnRjKCkgZnJvbSB0aGUNCj4gLQkgKiAmZHJtX2NydGNfaGVs cGVyX2Z1bmNzLmRpc2FibGUgaG9vay4NCj4gLQkgKg0KPiAtCSAqIE5vdGUgdGhhdCB0aGUg cG93ZXIgc3RhdGUgb2YgdGhlIGRpc3BsYXkgcGlwZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMN Cj4gLQkgKiBjYWxsZWQgZGVwZW5kcyB1cG9uIHRoZSBleGFjdCBoZWxwZXJzIGFuZCBjYWxs aW5nIHNlcXVlbmNlIHRoZSBkcml2ZXINCj4gLQkgKiBoYXMgcGlja2VkLiBTZWUgZHJtX2F0 b21pY19oZWxwZXJfY29tbWl0X3BsYW5lcygpIGZvciBhIGRpc2N1c3Npb24gb2YNCj4gLQkg KiB0aGUgdHJhZGVvZmZzIGFuZCB2YXJpYW50cyBvZiBwbGFuZSBjb21taXQgaGVscGVycy4N Cj4gLQkgKg0KPiAtCSAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgYXRvbWljIG1v ZGVzZXQgaGVscGVycywgYnV0IGl0IGlzDQo+IC0JICogb3B0aW9uYWwuIEl0J3MgaW50ZW5k ZWQgdG8gcmV2ZXJzZSB0aGUgZWZmZWN0cyBvZiBAYXRvbWljX2VuYWJsZS4NCj4gLQkgKi8N Cj4gLQl2b2lkICgqYXRvbWljX2Rpc2FibGUpKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLA0K PiAtCQkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+IC0NCj4g LQkvKioNCj4gLQkgKiBAYXRvbWljX2FzeW5jX2NoZWNrOg0KPiAtCSAqDQo+IC0JICogRHJp dmVycyBzaG91bGQgc2V0IHRoaXMgZnVuY3Rpb24gcG9pbnRlciB0byBjaGVjayBpZiB0aGUg cGxhbmUncw0KPiAtCSAqIGF0b21pYyBzdGF0ZSBjYW4gYmUgdXBkYXRlZCBpbiBhIGFzeW5j IGZhc2hpb24uIEhlcmUgYXN5bmMgbWVhbnMNCj4gLQkgKiAibm90IHZibGFuayBzeW5jaHJv bml6ZWQiLg0KPiAtCSAqDQo+IC0JICogVGhpcyBob29rIGlzIGNhbGxlZCBieSBkcm1fYXRv bWljX2FzeW5jX2NoZWNrKCkgdG8gZXN0YWJsaXNoIGlmIGENCj4gLQkgKiBnaXZlbiB1cGRh dGUgY2FuIGJlIGNvbW1pdHRlZCBhc3luY2hyb25vdXNseSwgdGhhdCBpcywgaWYgaXQgY2Fu DQo+IC0JICoganVtcCBhaGVhZCBvZiB0aGUgc3RhdGUgY3VycmVudGx5IHF1ZXVlZCBmb3Ig dXBkYXRlLg0KPiAtCSAqDQo+IC0JICogUkVUVVJOUzoNCj4gLQkgKg0KPiAtCSAqIFJldHVy biAwIG9uIHN1Y2Nlc3MgYW5kIGFueSBlcnJvciByZXR1cm5lZCBpbmRpY2F0ZXMgdGhhdCB0 aGUgdXBkYXRlDQo+IC0JICogY2FuIG5vdCBiZSBhcHBsaWVkIGluIGFzeW5jaHJvbm91cyBt YW5uZXIuDQo+IC0JICovDQo+IC0JaW50ICgqYXRvbWljX2FzeW5jX2NoZWNrKShzdHJ1Y3Qg ZHJtX3BsYW5lICpwbGFuZSwNCj4gLQkJCQkgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpz dGF0ZSk7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAYXRvbWljX2FzeW5jX3VwZGF0ZToNCj4g LQkgKg0KPiAtCSAqIERyaXZlcnMgc2hvdWxkIHNldCB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIg dG8gcGVyZm9ybSBhc3luY2hyb25vdXMNCj4gLQkgKiB1cGRhdGVzIG9mIHBsYW5lcywgdGhh dCBpcywganVtcCBhaGVhZCBvZiB0aGUgY3VycmVudGx5IHF1ZXVlZA0KPiAtCSAqIHN0YXRl IGFuZCB1cGRhdGUgdGhlIHBsYW5lLiBIZXJlIGFzeW5jIG1lYW5zICJub3QgdmJsYW5rDQo+ IC0JICogc3luY2hyb25pemVkIi4NCj4gLQkgKg0KPiAtCSAqIFRoaXMgaG9vayBpcyBjYWxs ZWQgYnkgZHJtX2F0b21pY19oZWxwZXJfYXN5bmNfY29tbWl0KCkuDQo+IC0JICoNCj4gLQkg KiBBbiBhc3luYyB1cGRhdGUgd2lsbCBoYXBwZW4gb24gbGVnYWN5IGN1cnNvciB1cGRhdGVz LiBBbiBhc3luYw0KPiAtCSAqIHVwZGF0ZSB3b24ndCBoYXBwZW4gaWYgdGhlcmUgaXMgYW4g b3V0c3RhbmRpbmcgY29tbWl0IG1vZGlmeWluZw0KPiAtCSAqIHRoZSBzYW1lIHBsYW5lLg0K PiAtCSAqDQo+IC0JICogV2hlbiBkb2luZyBhc3luY191cGRhdGUgZHJpdmVycyBzaG91bGRu J3QgcmVwbGFjZSB0aGUNCj4gLQkgKiAmZHJtX3BsYW5lX3N0YXRlIGJ1dCB1cGRhdGUgdGhl IGN1cnJlbnQgb25lIHdpdGggdGhlIG5ldyBwbGFuZQ0KPiAtCSAqIGNvbmZpZ3VyYXRpb25z IGluIHRoZSBuZXcgcGxhbmVfc3RhdGUuDQo+IC0JICoNCj4gLQkgKiBEcml2ZXJzIHNob3Vs ZCBhbHNvIHN3YXAgdGhlIGZyYW1lYnVmZmVycyBiZXR3ZWVuIGN1cnJlbnQgcGxhbmUNCj4g LQkgKiBzdGF0ZSAoJmRybV9wbGFuZS5zdGF0ZSkgYW5kIG5ld19zdGF0ZS4NCj4gLQkgKiBU aGlzIGlzIHJlcXVpcmVkIHNpbmNlIGNsZWFudXAgZm9yIGFzeW5jIGNvbW1pdHMgaXMgcGVy Zm9ybWVkIG9uDQo+IC0JICogdGhlIG5ldyBzdGF0ZSwgcmF0aGVyIHRoYW4gb2xkIHN0YXRl IGxpa2UgZm9yIHRyYWRpdGlvbmFsIGNvbW1pdHMuDQo+IC0JICogU2luY2Ugd2Ugd2FudCB0 byBnaXZlIHVwIHRoZSByZWZlcmVuY2Ugb24gdGhlIGN1cnJlbnQgKG9sZCkgZmINCj4gLQkg KiBpbnN0ZWFkIG9mIG91ciBicmFuZCBuZXcgb25lLCBzd2FwIHRoZW0gaW4gdGhlIGRyaXZl ciBkdXJpbmcgdGhlDQo+IC0JICogYXN5bmMgY29tbWl0Lg0KPiAtCSAqDQo+IC0JICogRklY TUU6DQo+IC0JICogIC0gSXQgb25seSB3b3JrcyBmb3Igc2luZ2xlIHBsYW5lIHVwZGF0ZXMN Cj4gLQkgKiAgLSBBc3luYyBQYWdlZmxpcHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0DQo+IC0J ICogIC0gU29tZSBodyBtaWdodCBzdGlsbCBzY2FuIG91dCB0aGUgb2xkIGJ1ZmZlciB1bnRp bCB0aGUgbmV4dA0KPiAtCSAqICAgIHZibGFuaywgaG93ZXZlciB3ZSBsZXQgZ28gb2YgdGhl IGZiIHJlZmVyZW5jZXMgYXMgc29vbiBhcw0KPiAtCSAqICAgIHdlIHJ1biB0aGlzIGhvb2su IEZvciBub3cgZHJpdmVycyBtdXN0IGltcGxlbWVudCB0aGVpciBvd24gd29ya2Vycw0KPiAt CSAqICAgIGZvciBkZWZlcnJpbmcgaWYgbmVlZGVkLCB1bnRpbCBhIGNvbW1vbiBzb2x1dGlv biBpcyBjcmVhdGVkLg0KPiAtCSAqLw0KPiAtCXZvaWQgKCphdG9taWNfYXN5bmNfdXBkYXRl KShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwNCj4gLQkJCQkgICAgc3RydWN0IGRybV9hdG9t aWNfc3RhdGUgKnN0YXRlKTsNCj4gLX07DQo+IC0NCj4gLS8qKg0KPiAtICogZHJtX3BsYW5l X2hlbHBlcl9hZGQgLSBzZXRzIHRoZSBoZWxwZXIgdnRhYmxlIGZvciBhIHBsYW5lDQo+IC0g KiBAcGxhbmU6IERSTSBwbGFuZQ0KPiAtICogQGZ1bmNzOiBoZWxwZXIgdnRhYmxlIHRvIHNl dCBmb3IgQHBsYW5lDQo+IC0gKi8NCj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBkcm1fcGxhbmVf aGVscGVyX2FkZChzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwNCj4gLQkJCQkJY29uc3Qgc3Ry dWN0IGRybV9wbGFuZV9oZWxwZXJfZnVuY3MgKmZ1bmNzKQ0KPiAtew0KPiAtCXBsYW5lLT5o ZWxwZXJfcHJpdmF0ZSA9IGZ1bmNzOw0KPiAtfQ0KPiAtDQo+IC0vKioNCj4gLSAqIHN0cnVj dCBkcm1fbW9kZV9jb25maWdfaGVscGVyX2Z1bmNzIC0gZ2xvYmFsIG1vZGVzZXQgaGVscGVy IG9wZXJhdGlvbnMNCj4gLSAqDQo+IC0gKiBUaGVzZSBoZWxwZXIgZnVuY3Rpb25zIGFyZSB1 c2VkIGJ5IHRoZSBhdG9taWMgaGVscGVycy4NCj4gLSAqLw0KPiAtc3RydWN0IGRybV9tb2Rl X2NvbmZpZ19oZWxwZXJfZnVuY3Mgew0KPiAtCS8qKg0KPiAtCSAqIEBhdG9taWNfY29tbWl0 X3RhaWw6DQo+IC0JICoNCj4gLQkgKiBUaGlzIGhvb2sgaXMgdXNlZCBieSB0aGUgZGVmYXVs dCBhdG9taWNfY29tbWl0KCkgaG9vayBpbXBsZW1lbnRlZCBpbg0KPiAtCSAqIGRybV9hdG9t aWNfaGVscGVyX2NvbW1pdCgpIHRvZ2V0aGVyIHdpdGggdGhlIG5vbmJsb2NraW5nIGNvbW1p dA0KPiAtCSAqIGhlbHBlcnMgKHNlZSBkcm1fYXRvbWljX2hlbHBlcl9zZXR1cF9jb21taXQo KSBmb3IgYSBzdGFydGluZyBwb2ludCkNCj4gLQkgKiB0byBpbXBsZW1lbnQgYmxvY2tpbmcg YW5kIG5vbmJsb2NraW5nIGNvbW1pdHMgZWFzaWx5LiBJdCBpcyBub3QgdXNlZA0KPiAtCSAq IGJ5IHRoZSBhdG9taWMgaGVscGVycw0KPiAtCSAqDQo+IC0JICogVGhpcyBmdW5jdGlvbiBp cyBjYWxsZWQgd2hlbiB0aGUgbmV3IGF0b21pYyBzdGF0ZSBoYXMgYWxyZWFkeSBiZWVuDQo+ IC0JICogc3dhcHBlZCBpbnRvIHRoZSB2YXJpb3VzIHN0YXRlIHBvaW50ZXJzLiBUaGUgcGFz c2VkIGluIHN0YXRlDQo+IC0JICogdGhlcmVmb3JlIGNvbnRhaW5zIGNvcGllcyBvZiB0aGUg b2xkL3ByZXZpb3VzIHN0YXRlLiBUaGlzIGhvb2sgc2hvdWxkDQo+IC0JICogY29tbWl0IHRo ZSBuZXcgc3RhdGUgaW50byBoYXJkd2FyZS4gTm90ZSB0aGF0IHRoZSBoZWxwZXJzIGhhdmUN Cj4gLQkgKiBhbHJlYWR5IHdhaXRlZCBmb3IgcHJlY2VkaW5nIGF0b21pYyBjb21taXRzIGFu ZCBmZW5jZXMsIGJ1dCBkcml2ZXJzDQo+IC0JICogY2FuIGFkZCBtb3JlIHdhaXRpbmcgY2Fs bHMgYXQgdGhlIHN0YXJ0IG9mIHRoZWlyIGltcGxlbWVudGF0aW9uLCBlLmcuDQo+IC0JICog dG8gd2FpdCBmb3IgZHJpdmVyLWludGVybmFsIHJlcXVlc3QgZm9yIGltcGxpY2l0IHN5bmNp bmcsIGJlZm9yZQ0KPiAtCSAqIHN0YXJ0aW5nIHRvIGNvbW1pdCB0aGUgdXBkYXRlIHRvIHRo ZSBoYXJkd2FyZS4NCj4gLQkgKg0KPiAtCSAqIEFmdGVyIHRoZSBhdG9taWMgdXBkYXRlIGlz IGNvbW1pdHRlZCB0byB0aGUgaGFyZHdhcmUgdGhpcyBob29rIG5lZWRzDQo+IC0JICogdG8g Y2FsbCBkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfaHdfZG9uZSgpLiBUaGVuIHdhaXQgZm9y IHRoZSB1cGRhdGUNCj4gLQkgKiB0byBiZSBleGVjdXRlZCBieSB0aGUgaGFyZHdhcmUsIGZv ciBleGFtcGxlIHVzaW5nDQo+IC0JICogZHJtX2F0b21pY19oZWxwZXJfd2FpdF9mb3JfdmJs YW5rcygpIG9yDQo+IC0JICogZHJtX2F0b21pY19oZWxwZXJfd2FpdF9mb3JfZmxpcF9kb25l KCksIGFuZCB0aGVuIGNsZWFuIHVwIHRoZSBvbGQNCj4gLQkgKiBmcmFtZWJ1ZmZlcnMgdXNp bmcgZHJtX2F0b21pY19oZWxwZXJfY2xlYW51cF9wbGFuZXMoKS4NCj4gLQkgKg0KPiAtCSAq IFdoZW4gZGlzYWJsaW5nIGEgQ1JUQyB0aGlzIGhvb2sgX211c3RfIHN0YWxsIGZvciB0aGUg Y29tbWl0IHRvDQo+IC0JICogY29tcGxldGUuIFZibGFuayB3YWl0cyBkb24ndCB3b3JrIG9u IGRpc2FibGVkIENSVEMsIGhlbmNlIHRoZSBjb3JlDQo+IC0JICogY2FuJ3QgdGFrZSBjYXJl IG9mIHRoaXMuIEFuZCBpdCBhbHNvIGNhbid0IHJlbHkgb24gdGhlIHZibGFuayBldmVudCwN Cj4gLQkgKiBzaW5jZSB0aGF0IGNhbiBiZSBzaWduYWxsZWQgYWxyZWFkeSB3aGVuIHRoZSBz Y3JlZW4gc2hvd3MgYmxhY2ssDQo+IC0JICogd2hpY2ggY2FuIGhhcHBlbiBtdWNoIGVhcmxp ZXIgdGhhbiB0aGUgbGFzdCBoYXJkd2FyZSBhY2Nlc3MgbmVlZGVkIHRvDQo+IC0JICogc2h1 dCBvZmYgdGhlIGRpc3BsYXkgcGlwZWxpbmUgY29tcGxldGVseS4NCj4gLQkgKg0KPiAtCSAq IFRoaXMgaG9vayBpcyBvcHRpb25hbCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMN Cj4gLQkgKiBkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfdGFpbCgpLg0KPiAtCSAqLw0KPiAt CXZvaWQgKCphdG9taWNfY29tbWl0X3RhaWwpKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpz dGF0ZSk7DQo+IC0NCj4gLQkvKioNCj4gLQkgKiBAYXRvbWljX2NvbW1pdF9zZXR1cDoNCj4g LQkgKg0KPiAtCSAqIFRoaXMgaG9vayBpcyB1c2VkIGJ5IHRoZSBkZWZhdWx0IGF0b21pY19j b21taXQoKSBob29rIGltcGxlbWVudGVkIGluDQo+IC0JICogZHJtX2F0b21pY19oZWxwZXJf Y29tbWl0KCkgdG9nZXRoZXIgd2l0aCB0aGUgbm9uYmxvY2tpbmcgaGVscGVycyAoc2VlDQo+ IC0JICogZHJtX2F0b21pY19oZWxwZXJfc2V0dXBfY29tbWl0KCkpIHRvIGV4dGVuZCB0aGUg RFJNIGNvbW1pdCBzZXR1cC4gSXQNCj4gLQkgKiBpcyBub3QgdXNlZCBieSB0aGUgYXRvbWlj IGhlbHBlcnMuDQo+IC0JICoNCj4gLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0 aGUgZW5kIG9mDQo+IC0JICogZHJtX2F0b21pY19oZWxwZXJfc2V0dXBfY29tbWl0KCksIHNv IG9uY2UgdGhlIGNvbW1pdCBoYXMgYmVlbg0KPiAtCSAqIHByb3Blcmx5IHNldHVwIGFjcm9z cyB0aGUgZ2VuZXJpYyBEUk0gb2JqZWN0IHN0YXRlcy4gSXQgYWxsb3dzDQo+IC0JICogZHJp dmVycyB0byBkbyBzb21lIGFkZGl0aW9uYWwgY29tbWl0IHRyYWNraW5nIHRoYXQgaXNuJ3Qg cmVsYXRlZCB0byBhDQo+IC0JICogQ1JUQywgcGxhbmUgb3IgY29ubmVjdG9yLCB0cmFja2Vk IGluIGEgJmRybV9wcml2YXRlX29iaiBzdHJ1Y3R1cmUuDQo+IC0JICoNCj4gLQkgKiBOb3Rl IHRoYXQgdGhlIGRvY3VtZW50YXRpb24gb2YgJmRybV9wcml2YXRlX29iaiBoYXMgbW9yZSBk ZXRhaWxzIG9uDQo+IC0JICogaG93IG9uZSBzaG91bGQgaW1wbGVtZW50IHRoaXMuDQo+IC0J ICoNCj4gLQkgKiBUaGlzIGhvb2sgaXMgb3B0aW9uYWwuDQo+IC0JICovDQo+IC0JaW50ICgq YXRvbWljX2NvbW1pdF9zZXR1cCkoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsN Cj4gLX07DQo+ICsjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlcl92dGFibGUuaD4NCj4g KyNpbmNsdWRlIDxkcm0vZHJtX2VuY29kZXJfaGVscGVyX3Z0YWJsZS5oPg0KPiArI2luY2x1 ZGUgPGRybS9kcm1fY29ubmVjdG9yX2hlbHBlcl92dGFibGUuaD4NCj4gKyNpbmNsdWRlIDxk cm0vZHJtX3BsYW5lX2hlbHBlcl92dGFibGUuaD4NCj4gKyNpbmNsdWRlIDxkcm0vZHJtX21v ZGVfY29uZmlnX2hlbHBlcl92dGFibGUuaD4NCj4gICANCj4gICAjZW5kaWYNCj4gZGlmZiAt LWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wbGFuZV9oZWxwZXJfdnRhYmxlLmggYi9pbmNsdWRl L2RybS9kcm1fcGxhbmVfaGVscGVyX3Z0YWJsZS5oDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 DQo+IGluZGV4IDAwMDAwMDAwMDAwMDAwMDAuLmU3MzVhYTk3MzM4NjkzODMNCj4gLS0tIC9k ZXYvbnVsbA0KPiArKysgYi9pbmNsdWRlL2RybS9kcm1fcGxhbmVfaGVscGVyX3Z0YWJsZS5o DQo+IEBAIC0wLDAgKzEsMjk3IEBADQo+ICsvKg0KPiArICogQ29weXJpZ2h0IMKpIDIwMDYg S2VpdGggUGFja2FyZA0KPiArICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBEYXZlIEFpcmxp ZQ0KPiArICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbg0KPiAr ICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+DQo+ICsgKiBDb3B5 cmlnaHQgwqkgMjAxMS0yMDEzIEludGVsIENvcnBvcmF0aW9uDQo+ICsgKiBDb3B5cmlnaHQg wqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbg0KPiArICogICBEYW5pZWwgVmV0dGVyIDxkYW5p ZWwudmV0dGVyQGZmd2xsLmNoPg0KPiArICoNCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhDQo+ ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlv biBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLA0KPiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdh cmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbg0K PiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsDQo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUNCj4gKyAq IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6DQo+ICsgKg0KPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCj4g KyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJl Lg0KPiArICoNCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRI T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQo+ICsgKiBJTVBMSUVELCBJ TkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSwNCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBO T05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTA0KPiArICogVEhFIENPUFlSSUdI VCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1B R0VTIE9SDQo+ICsgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9G IENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwNCj4gKyAqIEFSSVNJTkcgRlJPTSwgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUg0K PiArICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KPiArICovDQo+ICsNCj4g KyNpZm5kZWYgX19EUk1fUExBTkVfSEVMUEVSX1ZUQUJMRV9IX18NCj4gKyNkZWZpbmUgX19E Uk1fUExBTkVfSEVMUEVSX1ZUQUJMRV9IX18NCj4gKw0KPiArLyoqDQo+ICsgKiBzdHJ1Y3Qg ZHJtX3BsYW5lX2hlbHBlcl9mdW5jcyAtIGhlbHBlciBvcGVyYXRpb25zIGZvciBwbGFuZXMN Cj4gKyAqDQo+ICsgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGF0b21pYyBo ZWxwZXJzLg0KPiArICovDQo+ICtzdHJ1Y3QgZHJtX3BsYW5lX2hlbHBlcl9mdW5jcyB7DQo+ ICsJLyoqDQo+ICsJICogQHByZXBhcmVfZmI6DQo+ICsJICoNCj4gKwkgKiBUaGlzIGhvb2sg aXMgdG8gcHJlcGFyZSBhIGZyYW1lYnVmZmVyIGZvciBzY2Fub3V0IGJ5IGUuZy4gcGlubmlu Zw0KPiArCSAqIGl0cyBiYWNraW5nIHN0b3JhZ2Ugb3IgcmVsb2NhdGluZyBpdCBpbnRvIGEg Y29udGlndW91cyBibG9jayBvZg0KPiArCSAqIFZSQU0uIE90aGVyIHBvc3NpYmxlIHByZXBh cmF0b3J5IHdvcmsgaW5jbHVkZXMgZmx1c2hpbmcgY2FjaGVzLg0KPiArCSAqDQo+ICsJICog VGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBibG9jayBmb3Igb3V0c3RhbmRpbmcgcmVuZGVyaW5n LCBzaW5jZSBpdCBpcw0KPiArCSAqIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXRv bWljIElPQ1RMIGV2ZW4gZm9yIGFzeW5jIGNvbW1pdHMgdG8NCj4gKwkgKiBiZSBhYmxlIHRv IHJldHVybiBhbnkgZXJyb3JzIHRvIHVzZXJzcGFjZS4gSW5zdGVhZCB0aGUgcmVjb21tZW5k ZWQNCj4gKwkgKiB3YXkgaXMgdG8gZmlsbCBvdXQgdGhlICZkcm1fcGxhbmVfc3RhdGUuZmVu Y2Ugb2YgdGhlIHBhc3NlZC1pbg0KPiArCSAqICZkcm1fcGxhbmVfc3RhdGUuIElmIHRoZSBk cml2ZXIgZG9lc24ndCBzdXBwb3J0IG5hdGl2ZSBmZW5jZXMgdGhlbg0KPiArCSAqIGVxdWl2 YWxlbnQgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdGhyb3VnaCBwcml2 YXRlDQo+ICsJICogbWVtYmVycyBpbiB0aGUgcGxhbmUgc3RydWN0dXJlLg0KPiArCSAqDQo+ ICsJICogRm9yIEdFTSBkcml2ZXJzIHdobyBuZWl0aGVyIGhhdmUgYSBAcHJlcGFyZV9mYiBu b3IgQGNsZWFudXBfZmIgaG9vaw0KPiArCSAqIHNldCBkcm1fZ2VtX3BsYW5lX2hlbHBlcl9w cmVwYXJlX2ZiKCkgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdG8NCj4gKwkgKiBpbXBsZW1l bnQgdGhpcy4gT3RoZXIgZHJpdmVycyB3aGljaCBuZWVkIGFkZGl0aW9uYWwgcGxhbmUgcHJv Y2Vzc2luZw0KPiArCSAqIGNhbiBjYWxsIGRybV9nZW1fcGxhbmVfaGVscGVyX3ByZXBhcmVf ZmIoKSBmcm9tIHRoZWlyIEBwcmVwYXJlX2ZiDQo+ICsJICogaG9vay4NCj4gKwkgKg0KPiAr CSAqIFRoZSByZXNvdXJjZXMgYWNxdWlyZWQgaW4gQHByZXBhcmVfZmIgcGVyc2lzdCBhZnRl ciB0aGUgZW5kIG9mDQo+ICsJICogdGhlIGF0b21pYyBjb21taXQuIFJlc291cmNlcyB0aGF0 IGNhbiBiZSByZWxlYXNlIGF0IHRoZSBjb21taXQncyBlbmQNCj4gKwkgKiBzaG91bGQgYmUg YWNxdWlyZWQgaW4gQGJlZ2luX2ZiX2FjY2VzcyBhbmQgcmVsZWFzZWQgaW4gQGVuZF9mYl9h Y2Nlc3MuDQo+ICsJICogRm9yIGV4YW1wbGUsIGEgR0VNIGJ1ZmZlcidzIHBpbiBvcGVyYXRp b24gYmVsb25ncyBpbnRvIEBwcmVwYXJlX2ZiIHRvDQo+ICsJICoga2VlcCB0aGUgYnVmZmVy IHBpbm5lZCBhZnRlciB0aGUgY29tbWl0LiBCdXQgYSB2bWFwIG9wZXJhdGlvbiBmb3INCj4g KwkgKiBzaGFkb3ctcGxhbmUgaGVscGVycyBiZWxvbmdzIGludG8gQGJlZ2luX2ZiX2FjY2Vz cywgc28gdGhhdCBhdG9taWMNCj4gKwkgKiBoZWxwZXJzIHJlbW92ZSB0aGUgbWFwcGluZyBh dCB0aGUgZW5kIG9mIHRoZSBjb21taXQuDQo+ICsJICoNCj4gKwkgKiBUaGUgaGVscGVycyB3 aWxsIGNhbGwgQGNsZWFudXBfZmIgd2l0aCBtYXRjaGluZyBhcmd1bWVudHMgZm9yIGV2ZXJ5 DQo+ICsJICogc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoaXMgaG9vay4NCj4gKwkgKg0KPiArCSAq IFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycywg YnV0IGl0IGlzDQo+ICsJICogb3B0aW9uYWwuIFNlZSBAYmVnaW5fZmJfYWNjZXNzIGZvciBw cmVwYXJpbmcgcGVyLWNvbW1pdCByZXNvdXJjZXMuDQo+ICsJICoNCj4gKwkgKiBSRVRVUk5T Og0KPiArCSAqDQo+ICsJICogMCBvbiBzdWNjZXNzIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5n IG5lZ2F0aXZlIGVycm9yIGNvZGVzIGFsbG93ZWQgYnkNCj4gKwkgKiB0aGUgJmRybV9tb2Rl X2NvbmZpZ19mdW5jcy5hdG9taWNfY29tbWl0IHZmdW5jLiBXaGVuIHVzaW5nIGhlbHBlcnMN Cj4gKwkgKiB0aGlzIGNhbGxiYWNrIGlzIHRoZSBvbmx5IG9uZSB3aGljaCBjYW4gZmFpbCBh biBhdG9taWMgY29tbWl0LA0KPiArCSAqIGV2ZXJ5dGhpbmcgZWxzZSBtdXN0IGNvbXBsZXRl IHN1Y2Nlc3NmdWxseS4NCj4gKwkgKi8NCj4gKwlpbnQgKCpwcmVwYXJlX2ZiKShzdHJ1Y3Qg ZHJtX3BsYW5lICpwbGFuZSwNCj4gKwkJCSAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqbmV3 X3N0YXRlKTsNCj4gKwkvKioNCj4gKwkgKiBAY2xlYW51cF9mYjoNCj4gKwkgKg0KPiArCSAq IFRoaXMgaG9vayBpcyBjYWxsZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBhbGxvY2F0 ZWQgZm9yIHRoZSBnaXZlbg0KPiArCSAqIGZyYW1lYnVmZmVyIGFuZCBwbGFuZSBjb25maWd1 cmF0aW9uIGluIEBwcmVwYXJlX2ZiLg0KPiArCSAqDQo+ICsJICogVGhpcyBjYWxsYmFjayBp cyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNldCBoZWxwZXJzLCBidXQgaXQgaXMNCj4gKwkg KiBvcHRpb25hbC4NCj4gKwkgKi8NCj4gKwl2b2lkICgqY2xlYW51cF9mYikoc3RydWN0IGRy bV9wbGFuZSAqcGxhbmUsDQo+ICsJCQkgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRf c3RhdGUpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGJlZ2luX2ZiX2FjY2VzczoNCj4gKwkg Kg0KPiArCSAqIFRoaXMgaG9vayBwcmVwYXJlcyB0aGUgcGxhbmUgZm9yIGFjY2VzcyBkdXJp bmcgYW4gYXRvbWljIGNvbW1pdC4NCj4gKwkgKiBJbiBjb250cmFzdCB0byBAcHJlcGFyZV9m YiwgcmVzb3VyY2VzIGFjcXVpcmVkIGluIEBiZWdpbl9mYl9hY2Nlc3MsDQo+ICsJICogYXJl IHJlbGVhc2VkIGF0IHRoZSBlbmQgb2YgdGhlIGF0b21pYyBjb21taXQgaW4gQGVuZF9mYl9h Y2Nlc3MuDQo+ICsJICoNCj4gKwkgKiBGb3IgZXhhbXBsZSwgd2l0aCBzaGFkb3ctcGxhbmUg aGVscGVycywgdGhlIEdFTSBidWZmZXIncyB2bWFwDQo+ICsJICogb3BlcmF0aW9uIGJlbG9u Z3MgaW50byBAYmVnaW5fZmJfYWNjZXNzLCBzbyB0aGF0IHRoZSBidWZmZXIncw0KPiArCSAq IG1lbW9yeSB3aWxsIGJlIHVubWFwcGVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1pdCBpbiBA ZW5kX2ZiX2FjY2Vzcy4NCj4gKwkgKiBCdXQgYSBHRU0gYnVmZmVyJ3MgcGluIG9wZXJhdGlv biBiZWxvbmdzIGludG8gQHByZXBhcmVfZmINCj4gKwkgKiB0byBrZWVwIHRoZSBidWZmZXIg cGlubmVkIGFmdGVyIHRoZSBjb21taXQuDQo+ICsJICoNCj4gKwkgKiBUaGUgY2FsbGJhY2sg aXMgdXNlZCBieSB0aGUgYXRvbWljIG1vZGVzZXQgaGVscGVycywgYnV0IGl0IGlzIG9wdGlv bmFsLg0KPiArCSAqIFNlZSBAZW5kX2ZiX2NsZWFudXAgZm9yIHVuZG9pbmcgdGhlIGVmZmVj dHMgb2YgQGJlZ2luX2ZiX2FjY2VzcyBhbmQNCj4gKwkgKiBAcHJlcGFyZV9mYiBmb3IgYWNx dWlyaW5nIHJlc291cmNlcyB1bnRpbCB0aGUgbmV4dCBwYWdlZmxpcC4NCj4gKwkgKg0KPiAr CSAqIFJldHVybnM6DQo+ICsJICogMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm5v IGNvZGUgb3RoZXJ3aXNlLg0KPiArCSAqLw0KPiArCWludCAoKmJlZ2luX2ZiX2FjY2Vzcyko c3RydWN0IGRybV9wbGFuZSAqcGxhbmUsIHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKm5ld19w bGFuZV9zdGF0ZSk7DQo+ICsNCj4gKwkvKioNCj4gKwkgKiBAZW5kX2ZiX2FjY2VzczoNCj4g KwkgKg0KPiArCSAqIFRoaXMgaG9vayBjbGVhbnMgdXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBi eSBAYmVnaW5fZmJfYWNjZXNzLiBJdCBpdCBjYWxsZWQNCj4gKwkgKiBhdCB0aGUgZW5kIG9m IGEgY29tbWl0IGZvciB0aGUgbmV3IHBsYW5lIHN0YXRlLg0KPiArCSAqLw0KPiArCXZvaWQg KCplbmRfZmJfYWNjZXNzKShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwgc3RydWN0IGRybV9w bGFuZV9zdGF0ZSAqbmV3X3BsYW5lX3N0YXRlKTsNCj4gKw0KPiArCS8qKg0KPiArCSAqIEBh dG9taWNfY2hlY2s6DQo+ICsJICoNCj4gKwkgKiBEcml2ZXJzIHNob3VsZCBjaGVjayBwbGFu ZSBzcGVjaWZpYyBjb25zdHJhaW50cyBpbiB0aGlzIGhvb2suDQo+ICsJICoNCj4gKwkgKiBX aGVuIHVzaW5nIGRybV9hdG9taWNfaGVscGVyX2NoZWNrX3BsYW5lcygpIHBsYW5lJ3MgQGF0 b21pY19jaGVjaw0KPiArCSAqIGhvb2tzIGFyZSBjYWxsZWQgYmVmb3JlIHRoZSBvbmVzIGZv ciBDUlRDcywgd2hpY2ggYWxsb3dzIGRyaXZlcnMgdG8NCj4gKwkgKiByZXF1ZXN0IHNoYXJl ZCByZXNvdXJjZXMgdGhhdCB0aGUgQ1JUQyBjb250cm9scyBoZXJlLiBGb3IgbW9yZQ0KPiAr CSAqIGNvbXBsaWNhdGVkIGRlcGVuZGVuY2llcyB0aGUgZHJpdmVyIGNhbiBjYWxsIHRoZSBw cm92aWRlZCBjaGVjayBoZWxwZXJzDQo+ICsJICogbXVsdGlwbGUgdGltZXMgdW50aWwgdGhl IGNvbXB1dGVkIHN0YXRlIGhhcyBhIGZpbmFsIGNvbmZpZ3VyYXRpb24gYW5kDQo+ICsJICog ZXZlcnl0aGluZyBoYXMgYmVlbiBjaGVja2VkLg0KPiArCSAqDQo+ICsJICogVGhpcyBmdW5j dGlvbiBpcyBhbHNvIGFsbG93ZWQgdG8gaW5zcGVjdCBhbnkgb3RoZXIgb2JqZWN0J3Mgc3Rh dGUgYW5kDQo+ICsJICogY2FuIGFkZCBtb3JlIHN0YXRlIG9iamVjdHMgdG8gdGhlIGF0b21p YyBjb21taXQgaWYgbmVlZGVkLiBDYXJlIG11c3QNCj4gKwkgKiBiZSB0YWtlbiB0aG91Z2gg dG8gZW5zdXJlIHRoYXQgc3RhdGUgY2hlY2sgYW5kIGNvbXB1dGUgZnVuY3Rpb25zIGZvcg0K PiArCSAqIHRoZXNlIGFkZGVkIHN0YXRlcyBhcmUgYWxsIGNhbGxlZCwgYW5kIGRlcml2ZWQg c3RhdGUgaW4gb3RoZXIgb2JqZWN0cw0KPiArCSAqIGFsbCB1cGRhdGVkLiBBZ2FpbiB0aGUg cmVjb21tZW5kYXRpb24gaXMgdG8ganVzdCBjYWxsIGNoZWNrIGhlbHBlcnMNCj4gKwkgKiB1 bnRpbCBhIG1heGltYWwgY29uZmlndXJhdGlvbiBpcyByZWFjaGVkLg0KPiArCSAqDQo+ICsJ ICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGJ5IHRoZSBhdG9taWMgbW9kZXNldCBoZWxwZXJz LCBidXQgaXQgaXMNCj4gKwkgKiBvcHRpb25hbC4NCj4gKwkgKg0KPiArCSAqIE5PVEU6DQo+ ICsJICoNCj4gKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hlY2sgcGhh c2Ugb2YgYW4gYXRvbWljIHVwZGF0ZS4gVGhlDQo+ICsJICogZHJpdmVyIGlzIG5vdCBhbGxv d2VkIHRvIGNoYW5nZSBhbnl0aGluZyBvdXRzaWRlIG9mIHRoZQ0KPiArCSAqICZkcm1fYXRv bWljX3N0YXRlIHVwZGF0ZSB0cmFja2luZyBzdHJ1Y3R1cmUuDQo+ICsJICoNCj4gKwkgKiBS RVRVUk5TOg0KPiArCSAqDQo+ICsJICogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBz dGF0ZSBvciB0aGUgdHJhbnNpdGlvbiBjYW4ndCBiZQ0KPiArCSAqIHN1cHBvcnRlZCwgLUVO T01FTSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGFuZCAtRURFQURMSyBpZiBhbg0K PiArCSAqIGF0dGVtcHQgdG8gb2J0YWluIGFub3RoZXIgc3RhdGUgb2JqZWN0IHJhbiBpbnRv IGEgJmRybV9tb2Rlc2V0X2xvY2sNCj4gKwkgKiBkZWFkbG9jay4NCj4gKwkgKi8NCj4gKwlp bnQgKCphdG9taWNfY2hlY2spKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLA0KPiArCQkJICAg IHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkvKioNCj4gKwkg KiBAYXRvbWljX3VwZGF0ZToNCj4gKwkgKg0KPiArCSAqIERyaXZlcnMgc2hvdWxkIHVzZSB0 aGlzIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgcGxhbmUgc3RhdGUuICBUaGlzDQo+ICsJICog aG9vayBpcyBjYWxsZWQgaW4tYmV0d2VlbiB0aGUgJmRybV9jcnRjX2hlbHBlcl9mdW5jcy5h dG9taWNfYmVnaW4gYW5kDQo+ICsJICogZHJtX2NydGNfaGVscGVyX2Z1bmNzLmF0b21pY19m bHVzaCBjYWxsYmFja3MuDQo+ICsJICoNCj4gKwkgKiBOb3RlIHRoYXQgdGhlIHBvd2VyIHN0 YXRlIG9mIHRoZSBkaXNwbGF5IHBpcGUgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ICsJICog Y2FsbGVkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaGVscGVycyBhbmQgY2FsbGluZyBzZXF1 ZW5jZSB0aGUgZHJpdmVyDQo+ICsJICogaGFzIHBpY2tlZC4gU2VlIGRybV9hdG9taWNfaGVs cGVyX2NvbW1pdF9wbGFuZXMoKSBmb3IgYSBkaXNjdXNzaW9uIG9mDQo+ICsJICogdGhlIHRy YWRlb2ZmcyBhbmQgdmFyaWFudHMgb2YgcGxhbmUgY29tbWl0IGhlbHBlcnMuDQo+ICsJICoN Cj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0IGhl bHBlcnMsIGJ1dCBpdCBpcyBvcHRpb25hbC4NCj4gKwkgKi8NCj4gKwl2b2lkICgqYXRvbWlj X3VwZGF0ZSkoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsDQo+ICsJCQkgICAgICBzdHJ1Y3Qg ZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOw0KPiArDQo+ICsJLyoqDQo+ICsJICogQGF0b21p Y19lbmFibGU6DQo+ICsJICoNCj4gKwkgKiBEcml2ZXJzIHNob3VsZCB1c2UgdGhpcyBmdW5j dGlvbiB0byB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlIGEgcGxhbmUuDQo+ICsJICogVGhpcyBo b29rIGlzIGNhbGxlZCBpbi1iZXR3ZWVuIHRoZSAmZHJtX2NydGNfaGVscGVyX2Z1bmNzLmF0 b21pY19iZWdpbg0KPiArCSAqIGFuZCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MuYXRvbWljX2Zs dXNoIGNhbGxiYWNrcy4gSXQgaXMgY2FsbGVkIGFmdGVyDQo+ICsJICogQGF0b21pY191cGRh dGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBhbGwgZW5hYmxlZCBwbGFuZXMuIERyaXZl cnMNCj4gKwkgKiB0aGF0IHVzZSBAYXRvbWljX2VuYWJsZSBzaG91bGQgc2V0IHVwIGEgcGxh bmUgaW4gQGF0b21pY191cGRhdGUgYW5kDQo+ICsJICogYWZ0ZXJ3YXJkcyBlbmFibGUgdGhl IHBsYW5lIGluIEBhdG9taWNfZW5hYmxlLiBJZiBhIHBsYW5lIG5lZWRzIHRvIGJlDQo+ICsJ ICogZW5hYmxlZCBiZWZvcmUgaW5zdGFsbGluZyB0aGUgc2Nhbm91dCBidWZmZXIsIGRyaXZl cnMgY2FuIHN0aWxsIGRvDQo+ICsJICogc28gaW4gQGF0b21pY191cGRhdGUuDQo+ICsJICoN Cj4gKwkgKiBOb3RlIHRoYXQgdGhlIHBvd2VyIHN0YXRlIG9mIHRoZSBkaXNwbGF5IHBpcGUg d2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ICsJICogY2FsbGVkIGRlcGVuZHMgdXBvbiB0aGUg ZXhhY3QgaGVscGVycyBhbmQgY2FsbGluZyBzZXF1ZW5jZSB0aGUgZHJpdmVyDQo+ICsJICog aGFzIHBpY2tlZC4gU2VlIGRybV9hdG9taWNfaGVscGVyX2NvbW1pdF9wbGFuZXMoKSBmb3Ig YSBkaXNjdXNzaW9uIG9mDQo+ICsJICogdGhlIHRyYWRlb2ZmcyBhbmQgdmFyaWFudHMgb2Yg cGxhbmUgY29tbWl0IGhlbHBlcnMuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlz IHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0IGhlbHBlcnMsIGJ1dCBpdCBpcw0KPiArCSAq IG9wdGlvbmFsLiBJZiBpbXBsZW1lbnRlZCwgQGF0b21pY19lbmFibGUgc2hvdWxkIGJlIHRo ZSBpbnZlcnNlIG9mDQo+ICsJICogQGF0b21pY19kaXNhYmxlLiBEcml2ZXJzIHRoYXQgZG9u J3Qgd2FudCB0byB1c2UgZWl0aGVyIGNhbiBzdGlsbA0KPiArCSAqIGltcGxlbWVudCB0aGUg Y29tcGxldGUgcGxhbmUgdXBkYXRlIGluIEBhdG9taWNfdXBkYXRlLg0KPiArCSAqLw0KPiAr CXZvaWQgKCphdG9taWNfZW5hYmxlKShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwNCj4gKwkJ CSAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7DQo+ICsNCj4gKwkvKioN Cj4gKwkgKiBAYXRvbWljX2Rpc2FibGU6DQo+ICsJICoNCj4gKwkgKiBEcml2ZXJzIHNob3Vs ZCB1c2UgdGhpcyBmdW5jdGlvbiB0byB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSBhIHBsYW5l Lg0KPiArCSAqIFRoaXMgaG9vayBpcyBjYWxsZWQgaW4tYmV0d2VlbiB0aGUNCj4gKwkgKiAm ZHJtX2NydGNfaGVscGVyX2Z1bmNzLmF0b21pY19iZWdpbiBhbmQNCj4gKwkgKiBkcm1fY3J0 Y19oZWxwZXJfZnVuY3MuYXRvbWljX2ZsdXNoIGNhbGxiYWNrcy4gSXQgaXMgYW4gYWx0ZXJu YXRpdmUgdG8NCj4gKwkgKiBAYXRvbWljX3VwZGF0ZSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQg Zm9yIGRpc2FibGluZyBwbGFuZXMsIHRvbywgaWYNCj4gKwkgKiB0aGUgQGF0b21pY19kaXNh YmxlIGhvb2sgaXNuJ3QgaW1wbGVtZW50ZWQuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGhvb2sg aXMgYWxzbyB1c2VmdWwgdG8gZGlzYWJsZSBwbGFuZXMgaW4gcHJlcGFyYXRpb24gb2YgYSBt b2Rlc2V0LA0KPiArCSAqIGJ5IGNhbGxpbmcgZHJtX2F0b21pY19oZWxwZXJfZGlzYWJsZV9w bGFuZXNfb25fY3J0YygpIGZyb20gdGhlDQo+ICsJICogJmRybV9jcnRjX2hlbHBlcl9mdW5j cy5kaXNhYmxlIGhvb2suDQo+ICsJICoNCj4gKwkgKiBOb3RlIHRoYXQgdGhlIHBvd2VyIHN0 YXRlIG9mIHRoZSBkaXNwbGF5IHBpcGUgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzDQo+ICsJICog Y2FsbGVkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaGVscGVycyBhbmQgY2FsbGluZyBzZXF1 ZW5jZSB0aGUgZHJpdmVyDQo+ICsJICogaGFzIHBpY2tlZC4gU2VlIGRybV9hdG9taWNfaGVs cGVyX2NvbW1pdF9wbGFuZXMoKSBmb3IgYSBkaXNjdXNzaW9uIG9mDQo+ICsJICogdGhlIHRy YWRlb2ZmcyBhbmQgdmFyaWFudHMgb2YgcGxhbmUgY29tbWl0IGhlbHBlcnMuDQo+ICsJICoN Cj4gKwkgKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGF0b21pYyBtb2Rlc2V0IGhl bHBlcnMsIGJ1dCBpdCBpcw0KPiArCSAqIG9wdGlvbmFsLiBJdCdzIGludGVuZGVkIHRvIHJl dmVyc2UgdGhlIGVmZmVjdHMgb2YgQGF0b21pY19lbmFibGUuDQo+ICsJICovDQo+ICsJdm9p ZCAoKmF0b21pY19kaXNhYmxlKShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwNCj4gKwkJCSAg ICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOw0KPiArDQo+ICsJLyoqDQo+ ICsJICogQGF0b21pY19hc3luY19jaGVjazoNCj4gKwkgKg0KPiArCSAqIERyaXZlcnMgc2hv dWxkIHNldCB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIgdG8gY2hlY2sgaWYgdGhlIHBsYW5lJ3MN Cj4gKwkgKiBhdG9taWMgc3RhdGUgY2FuIGJlIHVwZGF0ZWQgaW4gYSBhc3luYyBmYXNoaW9u LiBIZXJlIGFzeW5jIG1lYW5zDQo+ICsJICogIm5vdCB2Ymxhbmsgc3luY2hyb25pemVkIi4N Cj4gKwkgKg0KPiArCSAqIFRoaXMgaG9vayBpcyBjYWxsZWQgYnkgZHJtX2F0b21pY19hc3lu Y19jaGVjaygpIHRvIGVzdGFibGlzaCBpZiBhDQo+ICsJICogZ2l2ZW4gdXBkYXRlIGNhbiBi ZSBjb21taXR0ZWQgYXN5bmNocm9ub3VzbHksIHRoYXQgaXMsIGlmIGl0IGNhbg0KPiArCSAq IGp1bXAgYWhlYWQgb2YgdGhlIHN0YXRlIGN1cnJlbnRseSBxdWV1ZWQgZm9yIHVwZGF0ZS4N Cj4gKwkgKg0KPiArCSAqIFJFVFVSTlM6DQo+ICsJICoNCj4gKwkgKiBSZXR1cm4gMCBvbiBz dWNjZXNzIGFuZCBhbnkgZXJyb3IgcmV0dXJuZWQgaW5kaWNhdGVzIHRoYXQgdGhlIHVwZGF0 ZQ0KPiArCSAqIGNhbiBub3QgYmUgYXBwbGllZCBpbiBhc3luY2hyb25vdXMgbWFubmVyLg0K PiArCSAqLw0KPiArCWludCAoKmF0b21pY19hc3luY19jaGVjaykoc3RydWN0IGRybV9wbGFu ZSAqcGxhbmUsDQo+ICsJCQkJICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOw0K PiArDQo+ICsJLyoqDQo+ICsJICogQGF0b21pY19hc3luY191cGRhdGU6DQo+ICsJICoNCj4g KwkgKiBEcml2ZXJzIHNob3VsZCBzZXQgdGhpcyBmdW5jdGlvbiBwb2ludGVyIHRvIHBlcmZv cm0gYXN5bmNocm9ub3VzDQo+ICsJICogdXBkYXRlcyBvZiBwbGFuZXMsIHRoYXQgaXMsIGp1 bXAgYWhlYWQgb2YgdGhlIGN1cnJlbnRseSBxdWV1ZWQNCj4gKwkgKiBzdGF0ZSBhbmQgdXBk YXRlIHRoZSBwbGFuZS4gSGVyZSBhc3luYyBtZWFucyAibm90IHZibGFuaw0KPiArCSAqIHN5 bmNocm9uaXplZCIuDQo+ICsJICoNCj4gKwkgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIGJ5IGRy bV9hdG9taWNfaGVscGVyX2FzeW5jX2NvbW1pdCgpLg0KPiArCSAqDQo+ICsJICogQW4gYXN5 bmMgdXBkYXRlIHdpbGwgaGFwcGVuIG9uIGxlZ2FjeSBjdXJzb3IgdXBkYXRlcy4gQW4gYXN5 bmMNCj4gKwkgKiB1cGRhdGUgd29uJ3QgaGFwcGVuIGlmIHRoZXJlIGlzIGFuIG91dHN0YW5k aW5nIGNvbW1pdCBtb2RpZnlpbmcNCj4gKwkgKiB0aGUgc2FtZSBwbGFuZS4NCj4gKwkgKg0K PiArCSAqIFdoZW4gZG9pbmcgYXN5bmNfdXBkYXRlIGRyaXZlcnMgc2hvdWxkbid0IHJlcGxh Y2UgdGhlDQo+ICsJICogJmRybV9wbGFuZV9zdGF0ZSBidXQgdXBkYXRlIHRoZSBjdXJyZW50 IG9uZSB3aXRoIHRoZSBuZXcgcGxhbmUNCj4gKwkgKiBjb25maWd1cmF0aW9ucyBpbiB0aGUg bmV3IHBsYW5lX3N0YXRlLg0KPiArCSAqDQo+ICsJICogRHJpdmVycyBzaG91bGQgYWxzbyBz d2FwIHRoZSBmcmFtZWJ1ZmZlcnMgYmV0d2VlbiBjdXJyZW50IHBsYW5lDQo+ICsJICogc3Rh dGUgKCZkcm1fcGxhbmUuc3RhdGUpIGFuZCBuZXdfc3RhdGUuDQo+ICsJICogVGhpcyBpcyBy ZXF1aXJlZCBzaW5jZSBjbGVhbnVwIGZvciBhc3luYyBjb21taXRzIGlzIHBlcmZvcm1lZCBv bg0KPiArCSAqIHRoZSBuZXcgc3RhdGUsIHJhdGhlciB0aGFuIG9sZCBzdGF0ZSBsaWtlIGZv ciB0cmFkaXRpb25hbCBjb21taXRzLg0KPiArCSAqIFNpbmNlIHdlIHdhbnQgdG8gZ2l2ZSB1 cCB0aGUgcmVmZXJlbmNlIG9uIHRoZSBjdXJyZW50IChvbGQpIGZiDQo+ICsJICogaW5zdGVh ZCBvZiBvdXIgYnJhbmQgbmV3IG9uZSwgc3dhcCB0aGVtIGluIHRoZSBkcml2ZXIgZHVyaW5n IHRoZQ0KPiArCSAqIGFzeW5jIGNvbW1pdC4NCj4gKwkgKg0KPiArCSAqIEZJWE1FOg0KPiAr CSAqICAtIEl0IG9ubHkgd29ya3MgZm9yIHNpbmdsZSBwbGFuZSB1cGRhdGVzDQo+ICsJICog IC0gQXN5bmMgUGFnZWZsaXBzIGFyZSBub3Qgc3VwcG9ydGVkIHlldA0KPiArCSAqICAtIFNv bWUgaHcgbWlnaHQgc3RpbGwgc2NhbiBvdXQgdGhlIG9sZCBidWZmZXIgdW50aWwgdGhlIG5l eHQNCj4gKwkgKiAgICB2YmxhbmssIGhvd2V2ZXIgd2UgbGV0IGdvIG9mIHRoZSBmYiByZWZl cmVuY2VzIGFzIHNvb24gYXMNCj4gKwkgKiAgICB3ZSBydW4gdGhpcyBob29rLiBGb3Igbm93 IGRyaXZlcnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHdvcmtlcnMNCj4gKwkgKiAgICBm b3IgZGVmZXJyaW5nIGlmIG5lZWRlZCwgdW50aWwgYSBjb21tb24gc29sdXRpb24gaXMgY3Jl YXRlZC4NCj4gKwkgKi8NCj4gKwl2b2lkICgqYXRvbWljX2FzeW5jX3VwZGF0ZSkoc3RydWN0 IGRybV9wbGFuZSAqcGxhbmUsDQo+ICsJCQkJICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRl ICpzdGF0ZSk7DQo+ICt9Ow0KPiArDQo+ICsvKioNCj4gKyAqIGRybV9wbGFuZV9oZWxwZXJf YWRkIC0gc2V0cyB0aGUgaGVscGVyIHZ0YWJsZSBmb3IgYSBwbGFuZQ0KPiArICogQHBsYW5l OiBEUk0gcGxhbmUNCj4gKyAqIEBmdW5jczogaGVscGVyIHZ0YWJsZSB0byBzZXQgZm9yIEBw bGFuZQ0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQgZHJtX3BsYW5lX2hlbHBlcl9h ZGQoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsDQo+ICsJCQkJCWNvbnN0IHN0cnVjdCBkcm1f cGxhbmVfaGVscGVyX2Z1bmNzICpmdW5jcykNCj4gK3sNCj4gKwlwbGFuZS0+aGVscGVyX3By aXZhdGUgPSBmdW5jczsNCj4gK30NCj4gKw0KPiArI2VuZGlmIC8qIF9fRFJNX1BMQU5FX0hF TFBFUl9WVEFCTEVfSF9fICovDQoNCi0tIA0KVGhvbWFzIFppbW1lcm1hbm4NCkdyYXBoaWNz IERyaXZlciBEZXZlbG9wZXINClNVU0UgU29mdHdhcmUgU29sdXRpb25zIEdlcm1hbnkgR21i SA0KRnJhbmtlbnN0cmFzc2UgMTQ2LCA5MDQ2MSBOdWVybmJlcmcsIEdlcm1hbnkNCkdGOiBJ dm8gVG90ZXYsIEFuZHJldyBNeWVycywgQW5kcmV3IE1jRG9uYWxkLCBCb3VkaWVuIE1vZXJt YW4NCkhSQiAzNjgwOSAoQUcgTnVlcm5iZXJnKQ0K --------------arW370dMVpMMlFvhY44uP4fb-- --------------UBHs4GPgBo1U9sWtFjSS6xYE Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- wsF5BAABCAAjFiEExndm/fpuMUdwYFFolh/E3EQov+AFAmUVhqYFAwAAAAAACgkQlh/E3EQov+Bl FA//WygaSfjWuId2Go7EZZqL1bVyKeWG+maDNUcs6XDAHQ7SEVVoXJSI7EculWYxYT+ETRRP8HDF ELA4IKc5GsKO8VnqsNDrVu/T1PGFO1xIsom3JFJU+hT5nJ8ZK7pZu3KSgaRbUpgIH690s1ebkl1E u4IvpUy6yrQkaDe1f3qHWn6/jlSHBoZJYxeF33jvhQ3X9NEAFUr3odda047D04kUnmYxaAQhhws0 F3E2OCEnQCWxM7bWdKiHPxwW6pQWOBsGQG8N7xolDnX2bHVs06eGKVutG1r3DstgrLUMmvxvsCOK hJZDMT9rbtSZmykVTv0hfMKfuhJrtW3C+l1qP0R3HsLYApI6LNIiNjFxcfMLBTCuyGhGRiVLBNnW z8L1Ty0AQMPv+cPUwvTeG/fX1MrzxURujAJIW1d1UsS/dACnm+zQCA44GpL08fK3LcjM1iMGkc+P 3zUf2Q5XtTqnw6bJCBtuys/9XlUqQ097JGX0iZDIixcoKJZdW8HYcHqm+GfPOg93JUX4HdOpq3aj iYnxrNg9ORlX/b56JcaTZ/Q8JV+lq2tcc0eivjqfRfZDWKTLlyo/91Ys6tXHgO4nN7KBYRqqZwi1 vOuOOuSrrfDR3YiVjy1VGXX1lLB846jhHsvXEa7n4DVXwxNkh+47sN/kBFKxVOHvUMHJ7Xa3hkk7 PCQ= =8Zsa -----END PGP SIGNATURE----- --------------UBHs4GPgBo1U9sWtFjSS6xYE--