From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C3ED6E9907D for ; Fri, 10 Apr 2026 10:30:52 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3938010E930; Fri, 10 Apr 2026 10:30:52 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=linux.dev header.i=@linux.dev header.b="tD7q4aRQ"; dkim-atps=neutral Received: from out-185.mta0.migadu.com (out-185.mta0.migadu.com [91.218.175.185]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5BD9E10E92C for ; Fri, 10 Apr 2026 10:30:50 +0000 (UTC) Message-ID: <163a3faa-639e-409f-942e-68caf37ea7ff@linux.dev> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1775817048; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WzYDFgxHgfQ0+M9BKMvV+GxyoFYNQiZHKFBeMSuy+Lk=; b=tD7q4aRQQILgx/GmWmEgntDr/hzDiddIkKyaOmg5YJTgC7YgK7Eoe+aN38JRPG9if5kPq5 c1mWJ6a0kK2sew5DIqqRJOsh2qKQVJ4ZRlPeHn2Rh9V1/LtB0pOQwAjNRwtNc+z3gh1Fcy Whhx2AGlfN0h2lSzHLclBj5APWytYYs= Date: Fri, 10 Apr 2026 12:30:43 +0200 MIME-Version: 1.0 Subject: Re: [PATCH v2] drm/sched: Add test suite for concurrent job submissions To: Tvrtko Ursulin , Matthew Brost , Danilo Krummrich , Philipp Stanner , =?UTF-8?Q?Christian_K=C3=B6nig?= , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org References: <20260408154947.85204-1-marco.pagani@linux.dev> <6a67c09d-d85e-45a9-90a4-125db30092d8@ursulin.net> Content-Language: en-US X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Marco Pagani In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 X-Migadu-Flow: FLOW_OUT X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" CgpPbiAxMC8wNC8yMDI2IDA5OjQxLCBUdnJ0a28gVXJzdWxpbiB3cm90ZToKPiAKPiBPbiAwOS8w NC8yMDI2IDE2OjM1LCBUdnJ0a28gVXJzdWxpbiB3cm90ZToKPj4KPj4gT24gMDgvMDQvMjAyNiAx Njo0OSwgTWFyY28gUGFnYW5pIHdyb3RlOgo+Pj4gQWRkIGEgbmV3IHRlc3Qgc3VpdGUgdG8gc2lt dWxhdGUgY29uY3VycmVudCBqb2Igc3VibWlzc2lvbnMgdG8gdGhlIERSTQo+Pj4gc2NoZWR1bGVy LCBhcyB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGNvdmVyZWQgYnkgY3VycmVudCB0ZXN0IHN1 aXRlcy4KPj4+Cj4+PiBUaGUgbmV3IHRlc3Qgc3VpdGUgaW5jbHVkZXMgdHdvIGluaXRpYWwgdGVz dCBjYXNlczogKGkpIGEgdGVzdCBjYXNlIGZvcgo+Pj4gcGFyYWxsZWwgam9iIHN1Ym1pc3Npb24g YW5kIChpaSkgYSB0ZXN0IGNhc2UgZm9yIGludGVybGVhdmVkIGpvYgo+Pj4gc3VibWlzc2lvbiBh bmQgY29tcGxldGlvbi4gSW4gdGhlIGZpcnN0IHRlc3QgY2FzZSwgd29ya2VyIHRocmVhZHMKPj4+ IGNvbmN1cnJlbnRseSBzdWJtaXQgam9icyB0byB0aGUgc2NoZWR1bGVyLCBhbmQgdGhlbiB0aGUg dGltZWxpbmUgaXMKPj4+IG1hbnVhbGx5IGFkdmFuY2VkIHRvIGNvbXBsZXRlIHRoZW0gaW4gYnVs ay4gSW4gdGhlIHNlY29uZCB0ZXN0IGNhc2UsCj4+PiB3b3JrZXIgdGhyZWFkcyBjb25jdXJyZW50 bHkgc3VibWl0IHNlcXVlbmNlcyBvZiBqb2JzIG9mIGRpZmZlcmVudAo+Pj4gZHVyYXRpb25zIHRv IHRoZSBtb2NrIHNjaGVkdWxlciB1c2luZyBhIHNsaWRpbmcgd2luZG93IHRvIGJldHRlciBtb2Rl bAo+Pj4gcmVhbC13b3JsZCB3b3JrbG9hZHMuIFRoZSB0aW1lbGluZSBpcyBhZHZhbmNlZCBhdXRv bWF0aWNhbGx5IGJ5IHRoZQo+Pj4gZmluaXNoaW5nIGpvYnMsIGludGVybGVhdmluZyBzdWJtaXNz aW9uIHdpdGggY29tcGxldGlvbi4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBNYXJjbyBQYWdhbmkg PG1hcmNvLnBhZ2FuaUBsaW51eC5kZXY+Cj4+PiAtLS0KPj4+IENoYW5nZXMgaW4gdjI6Cj4+PiAt IEltcHJvdmVkIHRlc3QgZGVzY3JpcHRpb24KPj4+IC0gVXNlIG11bHRpcGxlIGpvYiBkdXJhdGlv bnMgaW5zdGVhZCBvZiBoYXJtb25pYyBwZXJpb2RzL2R1cmF0aW9ucwo+Pj4gLSBJbXByb3ZlZCBz dWJtaXNzaW9uIGZvciBpbnRlcmxlYXZlZCB0ZXN0IHdpdGggYSBzbGlkaW5nIHdpbmRvdwo+Pj4g LSBSZW1vdmVkIHVubmVjZXNzYXJ5IGFzc2VydHMgcGVyIFR2cnRrbydzIGZlZWRiYWNrLCBidXQg a2VwdCAKPj4+IHdhaXRfc2NoZWR1bGVkCj4+PiAtIENoYW5nZWQgcGFyYW1ldGVyIG5hbWVzIGZy b20gcGVyaW9kIHRvIGR1cmF0aW9uIGZvciBjbGFyaXR5Cj4+PiAtIFVzZWQgdGVtcCB2YXJpYWJs ZXMgdG8gcmVkdWNlIGxpbmUgYnJlYWtzCj4+PiAtLS0KPj4+IMKgIGRyaXZlcnMvZ3B1L2RybS9z Y2hlZHVsZXIvdGVzdHMvdGVzdHNfYmFzaWMuYyB8IDM1NiArKysrKysrKysrKysrKysrKysKPj4+ IMKgIDEgZmlsZSBjaGFuZ2VkLCAzNTYgaW5zZXJ0aW9ucygrKQo+Pj4KPj4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vc2NoZWR1bGVyL3Rlc3RzL3Rlc3RzX2Jhc2ljLmMgYi9kcml2ZXJz LyAKPj4+IGdwdS9kcm0vc2NoZWR1bGVyL3Rlc3RzL3Rlc3RzX2Jhc2ljLmMKPj4+IGluZGV4IGE1 YTVhMzVhODdiMC4uMTc5MWIxNTdjZmM4IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L3NjaGVkdWxlci90ZXN0cy90ZXN0c19iYXNpYy5jCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0v c2NoZWR1bGVyL3Rlc3RzL3Rlc3RzX2Jhc2ljLmMKPj4+IEBAIC0xLDcgKzEsMTEgQEAKPj4+IMKg IC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4+PiDCoCAvKiBDb3B5cmlnaHQg KGMpIDIwMjUgVmFsdmUgQ29ycG9yYXRpb24gKi8KPj4+ICsjaW5jbHVkZSA8bGludXgvY29tcGxl dGlvbi5oPgo+Pj4gwqAgI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4+PiArI2luY2x1ZGUgPGxp bnV4L21pbm1heC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+Cj4+PiArI2luY2x1ZGUg PGxpbnV4L3dvcmtxdWV1ZS5oPgo+Pj4gwqAgI2luY2x1ZGUgInNjaGVkX3Rlc3RzLmgiCj4+PiBA QCAtMjM1LDYgKzIzOSwzNTcgQEAgc3RhdGljIHZvaWQgZHJtX3NjaGVkX2Jhc2ljX2NhbmNlbChz dHJ1Y3Qga3VuaXQgCj4+PiAqdGVzdCkKPj4+IMKgwqDCoMKgwqAgS1VOSVRfQVNTRVJUX0VRKHRl c3QsIGpvYi0+aHdfZmVuY2UuZXJyb3IsIC1FQ0FOQ0VMRUQpOwo+Pj4gwqAgfQo+Pj4gK3N0cnVj dCBzY2hlZF9jb25jdXJyZW50X2NvbnRleHQgewo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZHJtX21vY2tf c2NoZWR1bGVyICpzY2hlZDsKPj4+ICvCoMKgwqAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnN1 Yl93cTsKPj4+ICvCoMKgwqAgc3RydWN0IGt1bml0ICp0ZXN0Owo+Pj4gK8KgwqDCoCBzdHJ1Y3Qg Y29tcGxldGlvbiB3YWl0X2dvOwo+Pj4gK307Cj4+PiArCj4+PiArS1VOSVRfREVGSU5FX0FDVElP Tl9XUkFQUEVSKGRybV9tb2NrX3NjaGVkX2Zpbmlfd3JhcCwgCj4+PiBkcm1fbW9ja19zY2hlZF9m aW5pLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgZHJtX21vY2tf c2NoZWR1bGVyICopOwo+Pj4gKwo+Pj4gK0tVTklUX0RFRklORV9BQ1RJT05fV1JBUFBFUihkcm1f bW9ja19zY2hlZF9lbnRpdHlfZnJlZV93cmFwLCAKPj4+IGRybV9tb2NrX3NjaGVkX2VudGl0eV9m cmVlLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgZHJtX21vY2tf c2NoZWRfZW50aXR5ICopOwo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2Rlc3Ryb3lf d29ya3F1ZXVlKHZvaWQgKmNvbnRleHQpCj4+PiArewo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NoZWRf Y29uY3VycmVudF9jb250ZXh0ICpjdHggPSBjb250ZXh0Owo+Pj4gKwo+Pj4gK8KgwqDCoCBjb21w bGV0ZV9hbGwoJmN0eC0+d2FpdF9nbyk7Cj4+PiArCj4+PiArwqDCoMKgIGRlc3Ryb3lfd29ya3F1 ZXVlKGN0eC0+c3ViX3dxKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCBkcm1fc2NoZWRf Y29uY3VycmVudF9pbml0KHN0cnVjdCBrdW5pdCAqdGVzdCkKPj4+ICt7Cj4+PiArwqDCoMKgIHN0 cnVjdCBzY2hlZF9jb25jdXJyZW50X2NvbnRleHQgKmN0eDsKPj4+ICvCoMKgwqAgaW50IHJldDsK Pj4+ICsKPj4+ICvCoMKgwqAgY3R4ID0ga3VuaXRfa3phbGxvYyh0ZXN0LCBzaXplb2YoKmN0eCks IEdGUF9LRVJORUwpOwo+Pj4gK8KgwqDCoCBLVU5JVF9BU1NFUlRfTk9UX05VTEwodGVzdCwgY3R4 KTsKPj4+ICsKPj4+ICvCoMKgwqAgaW5pdF9jb21wbGV0aW9uKCZjdHgtPndhaXRfZ28pOwo+Pj4g Kwo+Pj4gK8KgwqDCoCBjdHgtPnNjaGVkID0gZHJtX21vY2tfc2NoZWRfbmV3KHRlc3QsIE1BWF9T Q0hFRFVMRV9USU1FT1VUKTsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0ID0ga3VuaXRfYWRkX2FjdGlv bl9vcl9yZXNldCh0ZXN0LCBkcm1fbW9ja19zY2hlZF9maW5pX3dyYXAsIAo+Pj4gY3R4LT5zY2hl ZCk7Cj4+PiArwqDCoMKgIEtVTklUX0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+Pj4gKwo+Pj4g K8KgwqDCoCAvKiBVc2UgYW4gdW5ib3VuZGVkIHdvcmtxdWV1ZSB0byBtYXhpbWl6ZSBqb2Igc3Vi bWlzc2lvbiAKPj4+IGNvbmN1cnJlbmN5ICovCj4+PiArwqDCoMKgIGN0eC0+c3ViX3dxID0gYWxs b2Nfd29ya3F1ZXVlKCJkcm0tc2NoZWQtc3VibWl0dGVycy13cSIsIFdRX1VOQk9VTkQsCj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFdRX1VOQk9VTkRfTUFY X0FDVElWRSk7Cj4+PiArwqDCoMKgIEtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCBjdHgtPnN1 Yl93cSk7Cj4+PiArCj4+PiArwqDCoMKgIHJldCA9IGt1bml0X2FkZF9hY3Rpb25fb3JfcmVzZXQo dGVzdCwgY29tcGxldGVfZGVzdHJveV93b3JrcXVldWUsIAo+Pj4gY3R4KTsKPj4+ICvCoMKgwqAg S1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4+PiArCj4+PiArwqDCoMKgIGN0eC0+dGVz dCA9IHRlc3Q7Cj4+PiArwqDCoMKgIHRlc3QtPnByaXYgPSBjdHg7Cj4+PiArCj4+PiArwqDCoMKg IHJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdHJ1Y3QgZHJtX3NjaGVkX3BhcmFsbGVsX3Bh cmFtcyB7Cj4+PiArwqDCoMKgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOwo+Pj4gK8KgwqDCoCB1 bnNpZ25lZCBpbnQgbnVtX2pvYnM7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBudW1fd29ya2Vy czsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3NjaGVkX3BhcmFs bGVsX3BhcmFtcyAKPj4+IGRybV9zY2hlZF9wYXJhbGxlbF9jYXNlc1tdID0gewo+Pj4gK8KgwqDC oCB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgLmRlc2NyaXB0aW9uID0gIlBhcmFsbGVsIHN1Ym1pc3Np b24gb2YgbXVsdGlwbGUgam9icyBwZXIgCj4+PiB3b3JrZXIiLAo+Pj4gK8KgwqDCoMKgwqDCoMKg IC5udW1fam9icyA9IDgsCj4+PiArwqDCoMKgwqDCoMKgwqAgLm51bV93b3JrZXJzID0gMTYsCj4+ PiArwqDCoMKgIH0sCj4+PiArfTsKPj4+ICsKPj4+ICtzdGF0aWMgdm9pZAo+Pj4gK2RybV9zY2hl ZF9wYXJhbGxlbF9kZXNjKGNvbnN0IHN0cnVjdCBkcm1fc2NoZWRfcGFyYWxsZWxfcGFyYW1zIAo+ Pj4gKnBhcmFtcywgY2hhciAqZGVzYykKPj4+ICt7Cj4+PiArwqDCoMKgIHN0cnNjcHkoZGVzYywg cGFyYW1zLT5kZXNjcmlwdGlvbiwgS1VOSVRfUEFSQU1fREVTQ19TSVpFKTsKPj4+ICt9Cj4+PiAr Cj4+PiArS1VOSVRfQVJSQVlfUEFSQU0oZHJtX3NjaGVkX3BhcmFsbGVsLCBkcm1fc2NoZWRfcGFy YWxsZWxfY2FzZXMsIAo+Pj4gZHJtX3NjaGVkX3BhcmFsbGVsX2Rlc2MpOwo+Pgo+PiBBcyBsb25n IGFzIHlvdSBkb24ndCBwbGFuIHRvIGFkZCBtb3JlIHRlc3QgY2FzZXMgYW55IHRpbWUgc29vbiB0 aGUgCj4+IGJvaWxlciBwbGF0ZSBjb3VsZCBiZSByZWR1Y2VkIGJ5IHVub3QgdXNpbmcgS1VOSVRf QVJSQVlfUEFSQU0gYnV0IGl0IGlzIAo+PiB1cCB0byB5b3UuIChTYW1lIGZvciB0aGUgb3RoZXIg dGVzdCBiZWxvdy4pCj4+Cj4+PiArCj4+PiArc3RydWN0IHBhcmFsbGVsX3dvcmtlciB7Cj4+PiAr wqDCoMKgIHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgc2NoZWRf Y29uY3VycmVudF9jb250ZXh0ICpjdHg7Cj4+PiArwqDCoMKgIHN0cnVjdCBkcm1fbW9ja19zY2hl ZF9lbnRpdHkgKmVudGl0eTsKPj4+ICvCoMKgwqAgc3RydWN0IGRybV9tb2NrX3NjaGVkX2pvYiAq KmpvYnM7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBpZDsKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0 YXRpYyB2b2lkIGRybV9zY2hlZF9wYXJhbGxlbF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3 b3JrKQo+Pj4gK3sKPj4+ICvCoMKgwqAgY29uc3Qgc3RydWN0IGRybV9zY2hlZF9wYXJhbGxlbF9w YXJhbXMgKnBhcmFtczsKPj4+ICvCoMKgwqAgc3RydWN0IHNjaGVkX2NvbmN1cnJlbnRfY29udGV4 dCAqdGVzdF9jdHg7Cj4+PiArwqDCoMKgIHN0cnVjdCBwYXJhbGxlbF93b3JrZXIgKndvcmtlcjsK Pj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGk7Cj4+PiArCj4+PiArwqDCoMKgIHdvcmtlciA9IGNv bnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGFyYWxsZWxfd29ya2VyLCB3b3JrKTsKPj4+ICvCoMKg wqAgdGVzdF9jdHggPSB3b3JrZXItPmN0eDsKPj4+ICvCoMKgwqAgcGFyYW1zID0gdGVzdF9jdHgt PnRlc3QtPnBhcmFtX3ZhbHVlOwo+Pj4gKwo+Pj4gK8KgwqDCoCB3YWl0X2Zvcl9jb21wbGV0aW9u KCZ0ZXN0X2N0eC0+d2FpdF9nbyk7Cj4+PiArCj4+PiArwqDCoMKgIGt1bml0X2luZm8odGVzdF9j dHgtPnRlc3QsICJQYXJhbGxlbCB3b3JrZXIgJXUgc3VibWl0dGluZyAldSBqb2JzIAo+Pj4gc3Rh cnRlZFxuIiwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmlkLCBwYXJhbXMtPm51 bV9qb2JzKTsKPj4+ICsKPj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX2pv YnM7IGkrKykKPj4+ICvCoMKgwqDCoMKgwqDCoCBkcm1fbW9ja19zY2hlZF9qb2Jfc3VibWl0KHdv cmtlci0+am9ic1tpXSk7Cj4+PiArfQo+Pj4gKwo+Pj4gKy8qCj4+PiArICogU3Bhd25zIHdvcmtl cnMgdGhhdCBzdWJtaXQgYSBzZXF1ZW5jZSBvZiBqb2JzIHRvIHRoZSBtb2NrIHNjaGVkdWxlci4K Pj4+ICsgKiBPbmNlIGFsbCBqb2JzIGFyZSBzdWJtaXR0ZWQsIHRoZSB0aW1lbGluZSBpcyBtYW51 YWxseSBhZHZhbmNlZC4KPj4+ICsgKi8KPj4+ICtzdGF0aWMgdm9pZCBkcm1fc2NoZWRfcGFyYWxs ZWxfc3VibWl0X3Rlc3Qoc3RydWN0IGt1bml0ICp0ZXN0KQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3Ry dWN0IHNjaGVkX2NvbmN1cnJlbnRfY29udGV4dCAqY3R4ID0gdGVzdC0+cHJpdjsKPj4+ICvCoMKg wqAgY29uc3Qgc3RydWN0IGRybV9zY2hlZF9wYXJhbGxlbF9wYXJhbXMgKnBhcmFtcyA9IHRlc3Qt PnBhcmFtX3ZhbHVlOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgcGFyYWxsZWxfd29ya2VyICp3b3JrZXJz LCAqd29ya2VyOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZHJtX21vY2tfc2NoZWRfam9iICpqb2I7Cj4+ PiArwqDCoMKgIHVuc2lnbmVkIGludCBpLCBqLCBjb21wbGV0ZWRfam9icywgdG90YWxfam9iczsK Pj4+ICvCoMKgwqAgYm9vbCBkb25lOwo+Pj4gK8KgwqDCoCBpbnQgcmV0Owo+Pj4gKwo+Pj4gK8Kg wqDCoCBLVU5JVF9BU1NFUlRfR1QodGVzdCwgcGFyYW1zLT5udW1fd29ya2VycywgMCk7Cj4+PiAr wqDCoMKgIEtVTklUX0FTU0VSVF9HVCh0ZXN0LCBwYXJhbXMtPm51bV9qb2JzLCAwKTsKPj4+ICsK Pj4+ICvCoMKgwqAgd29ya2VycyA9IGt1bml0X2tjYWxsb2ModGVzdCwgcGFyYW1zLT5udW1fd29y a2Vycywgc2l6ZW9mKCp3b3JrZXJzKSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgIEtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCB3 b3JrZXJzKTsKPj4+ICsKPj4+ICvCoMKgwqAgLyoKPj4+ICvCoMKgwqDCoCAqIEluaXQgd29ya2Vy cyBvbmx5IGFmdGVyIGFsbCBqb2JzIGFuZCBlbnRpdGllcyBoYXZlIGJlZW4gCj4+PiBzdWNjZXNz ZnVsbHkKPj4+ICvCoMKgwqDCoCAqIGFsbG9jYXRlZC4gSW4gdGhpcyB3YXksIHRoZSBjbGVhbnVw IGxvZ2ljIGZvciB3aGVuIGFuIAo+Pj4gYXNzZXJ0aW9uIGZhaWwKPj4+ICvCoMKgwqDCoCAqIGNh biBiZSBzaW1wbGlmaWVkLgo+Pj4gK8KgwqDCoMKgICovCj4+PiArwqDCoMKgIGZvciAoaSA9IDA7 IGkgPCBwYXJhbXMtPm51bV93b3JrZXJzOyBpKyspIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCB3b3Jr ZXIgPSAmd29ya2Vyc1tpXTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmlkID0gaTsKPj4+ ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmN0eCA9IGN0eDsKPj4+ICvCoMKgwqDCoMKgwqDCoCB3 b3JrZXItPmVudGl0eSA9IGRybV9tb2NrX3NjaGVkX2VudGl0eV9uZXcodGVzdCwKPj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg RFJNX1NDSEVEX1BSSU9SSVRZX05PUk1BTCwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY3R4LT5zY2hlZCk7Cj4+PiArCj4+ PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0ga3VuaXRfYWRkX2FjdGlvbl9vcl9yZXNldCh0ZXN0LCAK Pj4+IGRybV9tb2NrX3NjaGVkX2VudGl0eV9mcmVlX3dyYXAsCj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmVudGl0eSk7Cj4+PiArwqDC oMKgwqDCoMKgwqAgS1VOSVRfQVNTRVJUX0VRKHRlc3QsIHJldCwgMCk7Cj4+PiArCj4+PiArwqDC oMKgwqDCoMKgwqAgd29ya2VyLT5qb2JzID0ga3VuaXRfa2NhbGxvYyh0ZXN0LCBwYXJhbXMtPm51 bV9qb2JzLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBzaXplb2YoKndvcmtlci0+am9icyksIEdGUF9LRVJORUwpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIEtVTklUX0FTU0VSVF9OT1RfTlVMTCh0ZXN0LCB3b3JrZXItPmpvYnMpOwo+Pj4gKwo+Pj4g K8KgwqDCoMKgwqDCoMKgIGZvciAoaiA9IDA7IGogPCBwYXJhbXMtPm51bV9qb2JzOyBqKyspIHsK Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGpvYiA9IGRybV9tb2NrX3NjaGVkX2pvYl9uZXco dGVzdCwgd29ya2VyLT5lbnRpdHkpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd29ya2Vy LT5qb2JzW2pdID0gam9iOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4+ICvCoMKgwqAgfQo+Pj4g Kwo+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5udW1fd29ya2VyczsgaSsrKSB7 Cj4+PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyID0gJndvcmtlcnNbaV07Cj4+PiArwqDCoMKgwqDC oMKgwqAgSU5JVF9XT1JLKCZ3b3JrZXItPndvcmssIGRybV9zY2hlZF9wYXJhbGxlbF93b3JrZXIp Owo+Pj4gK8KgwqDCoMKgwqDCoMKgIHF1ZXVlX3dvcmsoY3R4LT5zdWJfd3EsICZ3b3JrZXItPndv cmspOwo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKgIGNvbXBsZXRlX2FsbCgmY3R4LT53 YWl0X2dvKTsKPj4+ICvCoMKgwqAgZmx1c2hfd29ya3F1ZXVlKGN0eC0+c3ViX3dxKTsKPj4+ICsK Pj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX3dvcmtlcnM7IGkrKykgewo+ Pj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtlciA9ICZ3b3JrZXJzW2ldOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIGZvciAoaiA9IDA7IGogPCBwYXJhbXMtPm51bV9qb2JzOyBqKyspIHsKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGpvYiA9IHdvcmtlci0+am9ic1tqXTsKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGRvbmUgPSBkcm1fbW9ja19zY2hlZF9qb2Jfd2FpdF9zY2hlZHVsZWQoam9iLCBI Wik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBLVU5JVF9FWFBFQ1RfVFJVRSh0ZXN0LCBk b25lKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKg wqAgdG90YWxfam9icyA9IHBhcmFtcy0+bnVtX3dvcmtlcnMgKiBwYXJhbXMtPm51bV9qb2JzOwo+ Pj4gK8KgwqDCoCBjb21wbGV0ZWRfam9icyA9IGRybV9tb2NrX3NjaGVkX2FkdmFuY2UoY3R4LT5z Y2hlZCwgdG90YWxfam9icyk7Cj4+PiArwqDCoMKgIEtVTklUX0VYUEVDVF9FUSh0ZXN0LCBjb21w bGV0ZWRfam9icywgdG90YWxfam9icyk7Cj4+PiArCj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkg PCBwYXJhbXMtPm51bV93b3JrZXJzOyBpKyspIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCB3b3JrZXIg PSAmd29ya2Vyc1tpXTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgcGFyYW1z LT5udW1fam9iczsgaisrKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBqb2IgPSB3b3Jr ZXItPmpvYnNbal07Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkb25lID0gZHJtX21vY2tf c2NoZWRfam9iX3dhaXRfZmluaXNoZWQoam9iLCBIWik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBLVU5JVF9FWFBFQ1RfVFJVRSh0ZXN0LCBkb25lKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9 Cj4+PiArwqDCoMKgIH0KPj4+ICt9Cj4+PiArCj4+PiArc3RydWN0IGRybV9zY2hlZF9pbnRlcmxl YXZlZF9wYXJhbXMgewo+Pj4gK8KgwqDCoCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKPj4+ICvC oMKgwqAgdW5zaWduZWQgaW50IHRlc3RfZHVyYXRpb25fbXM7Cj4+PiArwqDCoMKgIHVuc2lnbmVk IGludCBqb2JfYmFzZV9kdXJhdGlvbl91czsKPj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IG51bV93 b3JrZXJzOwo+Pj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgbnVtX2luX2ZsaWdodF9qb2JzOwo+Pj4g K307Cj4+PiArCj4+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRf cGFyYW1zIAo+Pj4gZHJtX3NjaGVkX2ludGVybGVhdmVkX2Nhc2VzW10gPSB7Cj4+PiArwqDCoMKg IHsKPj4+ICvCoMKgwqDCoMKgwqDCoCAuZGVzY3JpcHRpb24gPSAiSW50ZXJsZWF2ZWQgc3VibWlz c2lvbiBvZiBtdWx0aXBsZSBqb2JzIHBlciAKPj4+IHdvcmtlciIsCj4+PiArwqDCoMKgwqDCoMKg wqAgLnRlc3RfZHVyYXRpb25fbXMgPSAxMDAwLAo+Pj4gK8KgwqDCoMKgwqDCoMKgIC5qb2JfYmFz ZV9kdXJhdGlvbl91cyA9IDEwMCwKPj4+ICvCoMKgwqDCoMKgwqDCoCAubnVtX3dvcmtlcnMgPSAx NiwKPj4+ICvCoMKgwqDCoMKgwqDCoCAubnVtX2luX2ZsaWdodF9qb2JzID0gOCwKPj4+ICvCoMKg wqAgfSwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkCj4+PiArZHJtX3NjaGVkX2ludGVy bGVhdmVkX2Rlc2MoY29uc3Qgc3RydWN0IGRybV9zY2hlZF9pbnRlcmxlYXZlZF9wYXJhbXMgCj4+ PiAqcGFyYW1zLCBjaGFyICpkZXNjKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3Ryc2NweShkZXNjLCBw YXJhbXMtPmRlc2NyaXB0aW9uLCBLVU5JVF9QQVJBTV9ERVNDX1NJWkUpOwo+Pj4gK30KPj4+ICsK Pj4+ICtLVU5JVF9BUlJBWV9QQVJBTShkcm1fc2NoZWRfaW50ZXJsZWF2ZWQsIGRybV9zY2hlZF9p bnRlcmxlYXZlZF9jYXNlcywKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqAgZHJtX3NjaGVkX2ludGVy bGVhdmVkX2Rlc2MpOwo+Pj4gKwo+Pj4gK3N0cnVjdCBpbnRlcmxlYXZlZF93b3JrZXIgewo+Pj4g K8KgwqDCoCBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKPj4+ICvCoMKgwqAgc3RydWN0IHNjaGVk X2NvbmN1cnJlbnRfY29udGV4dCAqY3R4Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZHJtX21vY2tfc2No ZWRfZW50aXR5ICplbnRpdHk7Cj4+PiArwqDCoMKgIHN0cnVjdCBkcm1fbW9ja19zY2hlZF9qb2Ig Kipqb2JzOwo+Pj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgaWQ7Cj4+PiArwqDCoMKgIHVuc2lnbmVk IGludCBqb2JfY291bnQ7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBqb2JfZHVyYXRpb25fdXM7 Cj4+PiArfTsKPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRfd29y a2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPj4+ICt7Cj4+PiArwqDCoMKgIHN0cnVjdCBz Y2hlZF9jb25jdXJyZW50X2NvbnRleHQgKnRlc3RfY3R4Owo+Pj4gK8KgwqDCoCBjb25zdCBzdHJ1 Y3QgZHJtX3NjaGVkX2ludGVybGVhdmVkX3BhcmFtcyAqcGFyYW1zOwo+Pj4gK8KgwqDCoCBzdHJ1 Y3QgaW50ZXJsZWF2ZWRfd29ya2VyICp3b3JrZXI7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBp LCBqLCBtYXhfaW5fZmxpZ2h0X2pvYjsKPj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyB0aW1lb3V0 Owo+Pj4gK8KgwqDCoCBib29sIGRvbmU7Cj4+PiArCj4+PiArwqDCoMKgIHdvcmtlciA9IGNvbnRh aW5lcl9vZih3b3JrLCBzdHJ1Y3QgaW50ZXJsZWF2ZWRfd29ya2VyLCB3b3JrKTsKPj4+ICvCoMKg wqAgdGVzdF9jdHggPSB3b3JrZXItPmN0eDsKPj4+ICvCoMKgwqAgcGFyYW1zID0gdGVzdF9jdHgt PnRlc3QtPnBhcmFtX3ZhbHVlOwo+Pj4gKwo+Pj4gK8KgwqDCoCB3YWl0X2Zvcl9jb21wbGV0aW9u KCZ0ZXN0X2N0eC0+d2FpdF9nbyk7Cj4+PiArCj4+PiArwqDCoMKgIGt1bml0X2luZm8odGVzdF9j dHgtPnRlc3QsICJXb3JrZXIgJXUgc3VibWl0dGluZyAldSBqb2JzIG9mICV1IHVzIAo+Pj4gc3Rh cnRlZFxuIiwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCB3b3JrZXItPmlkLCB3b3JrZXItPmpv Yl9jb3VudCwgd29ya2VyLT5qb2JfZHVyYXRpb25fdXMpOwo+Pj4gKwo+Pj4gK8KgwqDCoCB0aW1l b3V0ID0gbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnRlc3RfZHVyYXRpb25fbXMgKiAyKTsKPj4+ ICsKPj4+ICvCoMKgwqAgLyogRmlsbCB0aGUgc3VibWlzc2lvbiB3aW5kb3cgKi8KPj4+ICvCoMKg wqAgbWF4X2luX2ZsaWdodF9qb2IgPSBtaW4od29ya2VyLT5qb2JfY291bnQsIHBhcmFtcy0gCj4+ Pj4gbnVtX2luX2ZsaWdodF9qb2JzKTsKPj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IG1heF9p bl9mbGlnaHRfam9iOyBpKyspCj4+PiArwqDCoMKgwqDCoMKgwqAgZHJtX21vY2tfc2NoZWRfam9i X3N1Ym1pdCh3b3JrZXItPmpvYnNbaV0pOwo+Pj4gKwo+Pj4gK8KgwqDCoCAvKiBLZWVwIHRoZSB3 aW5kb3cgZnVsbCBieSBzdWJtaXR0aW5nIGEgbmV3IGpvYiBhdCBvbmNlIHVudGlsIAo+Pj4gZG9u ZSAqLwo+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgd29ya2VyLT5qb2JfY291bnQ7IGkrKykg ewo+Pj4gK8KgwqDCoMKgwqDCoMKgIGRvbmUgPSBkcm1fbW9ja19zY2hlZF9qb2Jfd2FpdF9maW5p c2hlZCh3b3JrZXItPmpvYnNbaV0sIAo+Pj4gdGltZW91dCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAg aWYgKCFkb25lKQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAga3VuaXRfaW5mbyh0ZXN0X2N0 eC0+dGVzdCwgIkpvYiAldSBvZiB3b3JrZXIgJXUgdGltZWQgCj4+PiBvdXRcbiIsCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGksIHdvcmtlci0+aWQpOwo+Pj4gKwo+ Pj4gK8KgwqDCoMKgwqDCoMKgIGogPSBpICsgbWF4X2luX2ZsaWdodF9qb2I7Cj4+PiArwqDCoMKg wqDCoMKgwqAgaWYgKGogPCB3b3JrZXItPmpvYl9jb3VudCkKPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGRybV9tb2NrX3NjaGVkX2pvYl9zdWJtaXQod29ya2VyLT5qb2JzW2pdKTsKPj4+ICvC oMKgwqAgfQo+Pgo+PiBUaGUgbG9vcCBtYXliZSBpc24ndCB0aGUgbW9zdCBzdHJhaWdodC1mb3J3 YXJkIGJ1dCBldmVudHVhbGx5IGxvb2tlZCB0byAKPj4gbWUgbGlrZSBpdCB3aWxsIGRvIHdoYXQg aXQgd2FudHMuCj4gCj4gT25lIGlkZWEgdG8gcmVwbGFjZSB0d28gbG9vcHMgd2l0aCBhIHNpbmds ZSBob3BlZnVsbHkgY2xlYXJlciBvbmU6Cj4gCj4gZm9yIChpID0gMDsgaSA8IHdvcmtlci0+am9i X2NvdW50OyBpKyspIHsKPiAJaWYgKGkgPj0gbWF4X2luX2ZsaWdodF9qb2IpCj4gCQlkcm1fbW9j a19zY2hlZF9qb2Jfd2FpdF9maW5pc2hlZCh3b3JrZXItPmpvYnNbaSAtIG1heF9pbl9mbGlnaHRf am9iXSwgCj4gdGltZW91dCk7Cj4gCWRybV9tb2NrX3NjaGVkX2pvYl9zdWJtaXQod29ya2VyLT5q b2JzW2ldKTsKPiB9Cj4gCgpJdCBzZWVtcyB0byBtZSB0aGF0IHRoaXMgcGFydGljdWxhciBsb29w IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgc2luY2UKaXQgd2lsbCBub3Qgd2FpdCBmb3IgdGhl IGxhc3Qgam9icy4KCkNvbnNpZGVyaW5nIHRoZSBmZWVkYmFjayBJIHJlY2VpdmVkIGZvciB2MSwg bXkgaW50ZW50aW9uIHdhcyB0byBhdm9pZAp1c2luZyBuZWdhdGl2ZSBvZmZzZXQgaW5kZXhpbmcg KGkgLSBzb21ldGhpbmcpIGluIGxvb3BzIHRvIGtlZXAgdGhlIGNvZGUKc2ltcGxlIGFuZCBzYWZl IHdpdGggcmVzcGVjdCB0byBmdXR1cmUgZXh0ZW5zaW9ucyBieSBhdm9pZGluZyBhY2NpZGVudGFs CmluZGV4IHdyYXBzLgoKSG93ZXZlciwgaXQgc2VlbXMgdGhhdCBJIGFjaGlldmVkIHRoZSBvcHBv c2l0ZSBlZmZlY3QuIFNvLCBJJ20gb3BlbiB0bwpjaGFuZ2luZyBpdCBpbiB3aGF0ZXZlciB3YXkg eW91IGFuZCBQaGlsaXBwIHRoaW5rIGlzIGJlc3QuCgpUaGFua3MsCk1hcmNvCgo+PiBudW1faW5f ZmxpZ2h0X2pvYnMgYXMgYSB0ZXN0IHBhcmFtZXRlciBpcyBwZXJoYXBzIGFyYml0cmFyeT8gSSBh bSBub3QgCj4+IHN1cmUgd2hhdCBpdCBhaW1zIHRvIGFjaGlldmUgdmVyc3VzIGlmIHdvcmtlcnMg d291bGQganVzdCBiZSBzdWJtaXR0aW5nIAo+PiBvbmUgYnkgb25lLCBvciBwZXJoYXBzIHR3byBi eSB0d28sIGluIGJvdGggY2FzZXMgbG9vcHMgd291bGQgYmUgc2ltcGxlci4gCj4+IE9yIGV2ZW4g aWYgbnVtX2luX2ZsaWdodF9qb2JzIHdvdWxkIHBlcmhhcHMgYmUgYXV0b21hdGljYWxseSBkZXJp dmVkIAo+PiBmcm9tIHRoZSB3b3JrZXItPmlkPyBJZiB0aGUgZ29hbCBpcyB0byBzaW11bGF0ZSBx dWV1ZSBkZXB0aCBpdCBzb3VuZHMgCj4+IGdvb2QgdG8gdmFyeSBpdC4KPj4KPj4gQnV0IHRoZXNl IGFyZSBtaW5vciBwb2ludHMgYW5kIHVwIHRvIHlvdS4gVGhlIHRlc3Qgbm93IGxvb2tzIHBhc3Nh Ymx5IAo+PiB0aWR5IGFzIGl0IGlzLgo+Pgo+PiBBaCB3YWl0LCBwbGVhc2UgYWxzbyBjaGVjayBp ZiB0aGlzIG9uZSBuZWVkcyB0byBiZSBtYXJrZWQgYXMgInNsb3ciIAo+PiBrdW5pdCB0ZXN0LiBB RkFJUiBhbGwgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gdGFrZSBtb3JlIHRoYW4gMXMgbmVlZCB0aGF0 Lgo+Pgo+PiBSZWdhcmRzLAo+Pgo+PiBUdnJ0a28KPj4KPj4+ICt9Cj4+PiArCj4+PiArLyoKPj4+ ICsgKiBTcGF3bnMgd29ya2VycyB0aGF0IHN1Ym1pdCBhIHNlcXVlbmNlIG9mIGpvYnMgdG8gdGhl IG1vY2sgCj4+PiBzY2hlZHVsZXIuIEpvYgo+Pj4gKyAqIGR1cmF0aW9ucyBhcmUgY2hvc2VuIGFz IG11bHRpcGxlcyBvZiBhIGJhc2UgZHVyYXRpb24gdmFsdWUgCj4+PiBzcGVjaWZpZWQgYXMKPj4+ ICsgKiBhIHRlc3QgcGFyYW1ldGVyLiBTaW5jZSB0aGUgc2NoZWR1bGVyIHNlcmlhbGl6ZXMgam9i cyBmcm9tIGFsbCAKPj4+IHdvcmtlcnMsCj4+PiArICogdGhlIHRvdGFsIHRlc3QgZHVyYXRpb24g YnVkZ2V0IGlzIGRpdmlkZWQgaW50byBlcXVhbCBzaGFyZXMgYW1vbmcgCj4+PiB3b3JrZXJzLgo+ Pj4gKyAqIFRoZXNlIHNoYXJlcyBhcmUgdGhlbiB1c2VkIHRvIGNvbXB1dGUgdGhlIG51bWJlciBv ZiBqb2JzIHRoYXQgZWFjaCAKPj4+IHdvcmtlcgo+Pj4gKyAqIGNhbiBzdWJtaXQKPj4+ICsgKi8K Pj4+ICtzdGF0aWMgdm9pZCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRfc3VibWl0X3Rlc3Qoc3RydWN0 IGt1bml0ICp0ZXN0KQo+Pj4gK3sKPj4+ICvCoMKgwqAgY29uc3Qgc3RydWN0IGRybV9zY2hlZF9p bnRlcmxlYXZlZF9wYXJhbXMgKnBhcmFtcyA9IHRlc3QtIAo+Pj4+IHBhcmFtX3ZhbHVlOwo+Pj4g K8KgwqDCoCBzdHJ1Y3Qgc2NoZWRfY29uY3VycmVudF9jb250ZXh0ICpjdHggPSB0ZXN0LT5wcml2 Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgaW50ZXJsZWF2ZWRfd29ya2VyICp3b3JrZXJzLCAqd29ya2Vy Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZHJtX21vY2tfc2NoZWRfam9iICpqb2I7Cj4+PiArwqDCoMKg IHVuc2lnbmVkIGludCB3b3JrZXJfc2hhcmVfdXM7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGludCBp LCBqOwo+Pj4gK8KgwqDCoCBib29sIGRvbmU7Cj4+PiArwqDCoMKgIGludCByZXQ7Cj4+PiArCj4+ PiArwqDCoMKgIEtVTklUX0FTU0VSVF9HVCh0ZXN0LCBwYXJhbXMtPm51bV93b3JrZXJzLCAwKTsK Pj4+ICvCoMKgwqAgS1VOSVRfQVNTRVJUX0dUKHRlc3QsIHBhcmFtcy0+am9iX2Jhc2VfZHVyYXRp b25fdXMsIDApOwo+Pj4gKwo+Pj4gK8KgwqDCoCB3b3JrZXJzID0ga3VuaXRfa2NhbGxvYyh0ZXN0 LCBwYXJhbXMtPm51bV93b3JrZXJzLCBzaXplb2YoKndvcmtlcnMpLAo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBHRlBfS0VSTkVMKTsKPj4+ICvCoMKgwqAgS1VOSVRfQVNTRVJU X05PVF9OVUxMKHRlc3QsIHdvcmtlcnMpOwo+Pj4gKwo+Pj4gK8KgwqDCoCAvKiBEaXZpZGUgdGhl IGF2YWlsYWJsZSB0ZXN0IHRpbWUgaW50byBlcXVhbCBzaGFyZXMgYW1vbmcgdGhlIAo+Pj4gd29y a2VycyAqLwo+Pj4gK8KgwqDCoCB3b3JrZXJfc2hhcmVfdXMgPSAocGFyYW1zLT50ZXN0X2R1cmF0 aW9uX21zICogVVNFQ19QRVJfTVNFQykgLwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHBhcmFtcy0+bnVtX3dvcmtlcnM7Cj4+PiArCj4+PiArwqDCoMKgIC8qCj4+PiArwqDCoMKgwqAg KiBJbml0IHdvcmtlcnMgb25seSBhZnRlciBhbGwgam9icyBhbmQgZW50aXRpZXMgaGF2ZSBiZWVu IAo+Pj4gc3VjY2Vzc2Z1bGx5Cj4+PiArwqDCoMKgwqAgKiBhbGxvY2F0ZWQuIEluIHRoaXMgd2F5 LCB0aGUgY2xlYW51cCBsb2dpYyBmb3Igd2hlbiBhbiAKPj4+IGFzc2VydGlvbiBmYWlscwo+Pj4g K8KgwqDCoMKgICogY2FuIGJlIHNpbXBsaWZpZWQuCj4+PiArwqDCoMKgwqAgKi8KPj4+ICvCoMKg wqAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX3dvcmtlcnM7IGkrKykgewo+Pj4gK8KgwqDC oMKgwqDCoMKgIHdvcmtlciA9ICZ3b3JrZXJzW2ldOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtl ci0+aWQgPSBpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtlci0+Y3R4ID0gY3R4Owo+Pj4gKwo+ Pj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9iX2R1cmF0aW9uX3VzID0gcGFyYW1zLT5qb2Jf YmFzZV9kdXJhdGlvbl91cyAqIChpICsgCj4+PiAxKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB3b3Jr ZXItPmpvYl9jb3VudCA9IHdvcmtlcl9zaGFyZV91cyAvIHdvcmtlci0+am9iX2R1cmF0aW9uX3Vz Owo+Pj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9iX2NvdW50ID0gbWF4KDFVLCB3b3JrZXIt PmpvYl9jb3VudCk7Cj4+PiArCj4+PiArwqDCoMKgwqDCoMKgwqAgd29ya2VyLT5lbnRpdHkgPSBk cm1fbW9ja19zY2hlZF9lbnRpdHlfbmV3KHRlc3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERSTV9TQ0hFRF9QUklPUklU WV9OT1JNQUwsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGN0eC0+c2NoZWQpOwo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKg IHJldCA9IGt1bml0X2FkZF9hY3Rpb25fb3JfcmVzZXQodGVzdCwgCj4+PiBkcm1fbW9ja19zY2hl ZF9lbnRpdHlfZnJlZV93cmFwLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgd29ya2VyLT5lbnRpdHkpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIEtVTklU X0FTU0VSVF9FUSh0ZXN0LCByZXQsIDApOwo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKgIHdvcmtl ci0+am9icyA9IGt1bml0X2tjYWxsb2ModGVzdCwgd29ya2VyLT5qb2JfY291bnQsCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZigqd29y a2VyLT5qb2JzKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgS1VOSVRfQVNTRVJU X05PVF9OVUxMKHRlc3QsIHdvcmtlci0+am9icyk7Cj4+PiArCj4+PiArwqDCoMKgwqDCoMKgwqAg Zm9yIChqID0gMDsgaiA8IHdvcmtlci0+am9iX2NvdW50OyBqKyspIHsKPj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGpvYiA9IGRybV9tb2NrX3NjaGVkX2pvYl9uZXcodGVzdCwgd29ya2VyLT5l bnRpdHkpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZHJtX21vY2tfc2NoZWRfam9iX3Nl dF9kdXJhdGlvbl91cyhqb2IsIHdvcmtlci0gCj4+Pj4gam9iX2R1cmF0aW9uX3VzKTsKPj4+ICsK Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHdvcmtlci0+am9ic1tqXSA9IGpvYjsKPj4+ICvC oMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKgwqAgZm9yIChpID0g MDsgaSA8IHBhcmFtcy0+bnVtX3dvcmtlcnM7IGkrKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHdv cmtlciA9ICZ3b3JrZXJzW2ldOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIElOSVRfV09SSygmd29ya2Vy LT53b3JrLCBkcm1fc2NoZWRfaW50ZXJsZWF2ZWRfd29ya2VyKTsKPj4+ICvCoMKgwqDCoMKgwqDC oCBxdWV1ZV93b3JrKGN0eC0+c3ViX3dxLCAmd29ya2VyLT53b3JrKTsKPj4+ICvCoMKgwqAgfQo+ Pj4gKwo+Pj4gK8KgwqDCoCBjb21wbGV0ZV9hbGwoJmN0eC0+d2FpdF9nbyk7Cj4+PiArwqDCoMKg IGZsdXNoX3dvcmtxdWV1ZShjdHgtPnN1Yl93cSk7Cj4+PiArCj4+PiArwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBwYXJhbXMtPm51bV93b3JrZXJzOyBpKyspIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCB3 b3JrZXIgPSAmd29ya2Vyc1tpXTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwg d29ya2VyLT5qb2JfY291bnQ7IGorKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgam9i ID0gd29ya2VyLT5qb2JzW2pdOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZG9uZSA9IGRy bV9tb2NrX3NjaGVkX2pvYl9pc19maW5pc2hlZChqb2IpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgS1VOSVRfRVhQRUNUX1RSVUUodGVzdCwgZG9uZSk7Cj4+PiArwqDCoMKgwqDCoMKgwqAg fQo+Pj4gK8KgwqDCoCB9Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3Qga3VuaXRfY2Fz ZSBkcm1fc2NoZWRfY29uY3VycmVudF90ZXN0c1tdID0gewo+Pj4gK8KgwqDCoCBLVU5JVF9DQVNF X1BBUkFNKGRybV9zY2hlZF9wYXJhbGxlbF9zdWJtaXRfdGVzdCwgCj4+PiBkcm1fc2NoZWRfcGFy YWxsZWxfZ2VuX3BhcmFtcyksCj4+PiArwqDCoMKgIEtVTklUX0NBU0VfUEFSQU0oZHJtX3NjaGVk X2ludGVybGVhdmVkX3N1Ym1pdF90ZXN0LCAKPj4+IGRybV9zY2hlZF9pbnRlcmxlYXZlZF9nZW5f cGFyYW1zKSwKPj4+ICvCoMKgwqAge30KPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3Qg a3VuaXRfc3VpdGUgZHJtX3NjaGVkX2NvbmN1cnJlbnQgPSB7Cj4+PiArwqDCoMKgIC5uYW1lID0g ImRybV9zY2hlZF9jb25jdXJyZW50X3Rlc3RzIiwKPj4+ICvCoMKgwqAgLmluaXQgPSBkcm1fc2No ZWRfY29uY3VycmVudF9pbml0LAo+Pj4gK8KgwqDCoCAudGVzdF9jYXNlcyA9IGRybV9zY2hlZF9j b25jdXJyZW50X3Rlc3RzLAo+Pj4gK307Cj4+PiArCj4+PiDCoCBzdGF0aWMgc3RydWN0IGt1bml0 X2Nhc2UgZHJtX3NjaGVkX2NhbmNlbF90ZXN0c1tdID0gewo+Pj4gwqDCoMKgwqDCoCBLVU5JVF9D QVNFKGRybV9zY2hlZF9iYXNpY19jYW5jZWwpLAo+Pj4gwqDCoMKgwqDCoCB7fQo+Pj4gQEAgLTU1 Niw2ICs5MTEsNyBAQCBzdGF0aWMgc3RydWN0IGt1bml0X3N1aXRlIGRybV9zY2hlZF9jcmVkaXRz ID0gewo+Pj4gwqAgfTsKPj4+IMKgIGt1bml0X3Rlc3Rfc3VpdGVzKCZkcm1fc2NoZWRfYmFzaWMs Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgICZkcm1fc2NoZWRfY29uY3VycmVudCwKPj4+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJmRybV9zY2hlZF90aW1lb3V0LAo+Pj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAmZHJtX3NjaGVkX2NhbmNlbCwKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJmRy bV9zY2hlZF9wcmlvcml0eSwKPj4KPiAKCg==