From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: References: <20180628213532.22008-1-chris@chris-wilson.co.uk> <20180629074438.18464-1-chris@chris-wilson.co.uk> From: Tvrtko Ursulin Message-ID: <74b3b316-ddcf-e07d-97b4-56938b6d73f1@linux.intel.com> Date: Fri, 29 Jun 2018 10:31:23 +0100 MIME-Version: 1.0 In-Reply-To: <20180629074438.18464-1-chris@chris-wilson.co.uk> Content-Language: en-GB Subject: Re: [igt-dev] [Intel-gfx] [PATCH i-g-t v2] igt/gem_userptr: Check read-only mappings List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Chris Wilson , intel-gfx@lists.freedesktop.org Cc: igt-dev@lists.freedesktop.org List-ID: Ck9uIDI5LzA2LzIwMTggMDg6NDQsIENocmlzIFdpbHNvbiB3cm90ZToKPiBTZXR1cCBhIHVzZXJw dHIgb2JqZWN0IHRoYXQgb25seSBoYXMgYSByZWFkLW9ubHkgbWFwcGluZyBiYWNrIHRvIGEgZmls ZQo+IHN0b3JlIChtZW1mZCkuIFRoZW4gYXR0ZW1wdCB0byB3cml0ZSBpbnRvIHRoYXQgbWFwcGlu ZyB1c2luZyB0aGUgR1BVIGFuZAo+IGFzc2VydCB0aGF0IHRob3NlIHdyaXRlcyBkbyBub3QgbGFu ZCAod2hpbGUgYWxzbyB3cml0aW5nIHZpYSBhIHdyaXRhYmxlCj4gdXNlcnB0ciBtYXBwaW5nIGlu dG8gdGhlIHNhbWUgbWVtZmQgdG8gdmVyaWZ5IHRoYXQgdGhlIEdQVSBpcyB3b3JraW5nISkKPiAK PiBTaWduZWQtb2ZmLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4K PiBDYzogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KPiBDYzogSm9v bmFzIExhaHRpbmVuIDxqb29uYXMubGFodGluZW5AbGludXguaW50ZWwuY29tPgo+IC0tLQo+IE1p bm9yIGNvbW1lbnRhcnkgYWRkaXRpb25zCj4gLS0tCj4gICBjb25maWd1cmUuYWMgICAgICAgICAg ICAgIHwgICAxICsKPiAgIGxpYi9pb2N0bF93cmFwcGVycy5jICAgICAgfCAgIDQgKy0KPiAgIGxp Yi9pb2N0bF93cmFwcGVycy5oICAgICAgfCAgIDQgKy0KPiAgIGxpYi9tZXNvbi5idWlsZCAgICAg ICAgICAgfCAgIDEgKwo+ICAgbWVzb24uYnVpbGQgICAgICAgICAgICAgICB8ICAgMSArCj4gICB0 ZXN0cy9NYWtlZmlsZS5hbSAgICAgICAgIHwgICA0ICstCj4gICB0ZXN0cy9nZW1fdXNlcnB0cl9i bGl0cy5jIHwgMzcyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCj4gICA3 IGZpbGVzIGNoYW5nZWQsIDM3NyBpbnNlcnRpb25zKCspLCAxMCBkZWxldGlvbnMoLSkKPiAKPiBk aWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCj4gaW5kZXggMWVlNGU5MGU5 Li4xOTU5NjNkNGYgMTAwNjQ0Cj4gLS0tIGEvY29uZmlndXJlLmFjCj4gKysrIGIvY29uZmlndXJl LmFjCj4gQEAgLTEyNSw2ICsxMjUsNyBAQCBQS0dfQ0hFQ0tfTU9EVUxFUyhQQ0lBQ0NFU1MsIFtw Y2lhY2Nlc3MgPj0gMC4xMF0pCj4gICBQS0dfQ0hFQ0tfTU9EVUxFUyhLTU9ELCBbbGlia21vZF0p Cj4gICBQS0dfQ0hFQ0tfTU9EVUxFUyhQUk9DUFMsIFtsaWJwcm9jcHNdKQo+ICAgUEtHX0NIRUNL X01PRFVMRVMoTElCVU5XSU5ELCBbbGlidW53aW5kXSkKPiArUEtHX0NIRUNLX01PRFVMRVMoU1NM LCBbb3BlbnNzbF0pCj4gICBQS0dfQ0hFQ0tfTU9EVUxFUyhWQUxHUklORCwgW3ZhbGdyaW5kXSwg W2hhdmVfdmFsZ3JpbmQ9eWVzXSwgW2hhdmVfdmFsZ3JpbmQ9bm9dKQo+ICAgCj4gICBpZiB0ZXN0 IHgkaGF2ZV92YWxncmluZCA9IHh5ZXM7IHRoZW4KPiBkaWZmIC0tZ2l0IGEvbGliL2lvY3RsX3dy YXBwZXJzLmMgYi9saWIvaW9jdGxfd3JhcHBlcnMuYwo+IGluZGV4IDc5ZGI0NGE4Yy4uZDVkMmE0 ZTRjIDEwMDY0NAo+IC0tLSBhL2xpYi9pb2N0bF93cmFwcGVycy5jCj4gKysrIGIvbGliL2lvY3Rs X3dyYXBwZXJzLmMKPiBAQCAtODY5LDcgKzg2OSw3IEBAIGludCBnZW1fbWFkdmlzZShpbnQgZmQs IHVpbnQzMl90IGhhbmRsZSwgaW50IHN0YXRlKQo+ICAgCXJldHVybiBtYWR2LnJldGFpbmVkOwo+ ICAgfQo+ICAgCj4gLWludCBfX2dlbV91c2VycHRyKGludCBmZCwgdm9pZCAqcHRyLCBpbnQgc2l6 ZSwgaW50IHJlYWRfb25seSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpoYW5kbGUpCj4gK2lu dCBfX2dlbV91c2VycHRyKGludCBmZCwgdm9pZCAqcHRyLCB1aW50NjRfdCBzaXplLCBpbnQgcmVh ZF9vbmx5LCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgKmhhbmRsZSkKPiAgIHsKPiAgIAlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKPiAgIAo+IEBAIC04OTgsNyArODk4LDcg QEAgaW50IF9fZ2VtX3VzZXJwdHIoaW50IGZkLCB2b2lkICpwdHIsIGludCBzaXplLCBpbnQgcmVh ZF9vbmx5LCB1aW50MzJfdCBmbGFncywgdWkKPiAgICAqCj4gICAgKiBSZXR1cm5zIHVzZXJwdHIg aGFuZGxlIGZvciB0aGUgR0VNIG9iamVjdC4KPiAgICAqLwo+IC12b2lkIGdlbV91c2VycHRyKGlu dCBmZCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgaW50IHJlYWRfb25seSwgdWludDMyX3QgZmxhZ3Ms IHVpbnQzMl90ICpoYW5kbGUpCj4gK3ZvaWQgZ2VtX3VzZXJwdHIoaW50IGZkLCB2b2lkICpwdHIs IHVpbnQ2NF90IHNpemUsIGludCByZWFkX29ubHksIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCAq aGFuZGxlKQo+ICAgewo+ICAgCWlndF9hc3NlcnRfZXEoX19nZW1fdXNlcnB0cihmZCwgcHRyLCBz aXplLCByZWFkX29ubHksIGZsYWdzLCBoYW5kbGUpLCAwKTsKPiAgIH0KPiBkaWZmIC0tZ2l0IGEv bGliL2lvY3RsX3dyYXBwZXJzLmggYi9saWIvaW9jdGxfd3JhcHBlcnMuaAo+IGluZGV4IGI5NjZm NzJjOS4uOGUyY2QzODBiIDEwMDY0NAo+IC0tLSBhL2xpYi9pb2N0bF93cmFwcGVycy5oCj4gKysr IGIvbGliL2lvY3RsX3dyYXBwZXJzLmgKPiBAQCAtMTMzLDggKzEzMyw4IEBAIHN0cnVjdCBsb2Nh bF9pOTE1X2dlbV91c2VycHRyIHsKPiAgICNkZWZpbmUgTE9DQUxfSTkxNV9VU0VSUFRSX1VOU1lO Q0hST05JWkVEICgxPDwzMSkKPiAgIAl1aW50MzJfdCBoYW5kbGU7Cj4gICB9Owo+IC12b2lkIGdl bV91c2VycHRyKGludCBmZCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSwgaW50IHJlYWRfb25seSwgdWlu dDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpoYW5kbGUpOwo+IC1pbnQgX19nZW1fdXNlcnB0cihpbnQg ZmQsIHZvaWQgKnB0ciwgaW50IHNpemUsIGludCByZWFkX29ubHksIHVpbnQzMl90IGZsYWdzLCB1 aW50MzJfdCAqaGFuZGxlKTsKPiArdm9pZCBnZW1fdXNlcnB0cihpbnQgZmQsIHZvaWQgKnB0ciwg dWludDY0X3Qgc2l6ZSwgaW50IHJlYWRfb25seSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpo YW5kbGUpOwo+ICtpbnQgX19nZW1fdXNlcnB0cihpbnQgZmQsIHZvaWQgKnB0ciwgdWludDY0X3Qg c2l6ZSwgaW50IHJlYWRfb25seSwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90ICpoYW5kbGUpOwo+ ICAgCj4gICB2b2lkIGdlbV9zd19maW5pc2goaW50IGZkLCB1aW50MzJfdCBoYW5kbGUpOwo+ICAg Cj4gZGlmZiAtLWdpdCBhL2xpYi9tZXNvbi5idWlsZCBiL2xpYi9tZXNvbi5idWlsZAo+IGluZGV4 IDFhMzU1NDE0ZS4uOTM5MTY3ZjkxIDEwMDY0NAo+IC0tLSBhL2xpYi9tZXNvbi5idWlsZAo+ICsr KyBiL2xpYi9tZXNvbi5idWlsZAo+IEBAIC02Miw2ICs2Miw3IEBAIGxpYl9kZXBzID0gWwo+ICAg CXB0aHJlYWRzLAo+ICAgCW1hdGgsCj4gICAJcmVhbHRpbWUsCj4gKwlzc2wsCj4gICBdCj4gICAK PiAgIGlmIGxpYmRybV9pbnRlbC5mb3VuZCgpCj4gZGlmZiAtLWdpdCBhL21lc29uLmJ1aWxkIGIv bWVzb24uYnVpbGQKPiBpbmRleCA0ZDE1ZDYyMzguLjYzOGMwMTA2NiAxMDA2NDQKPiAtLS0gYS9t ZXNvbi5idWlsZAo+ICsrKyBiL21lc29uLmJ1aWxkCj4gQEAgLTk4LDYgKzk4LDcgQEAgcGNpYWNj ZXNzID0gZGVwZW5kZW5jeSgncGNpYWNjZXNzJywgdmVyc2lvbiA6ICc+PTAuMTAnKQo+ICAgbGli a21vZCA9IGRlcGVuZGVuY3koJ2xpYmttb2QnKQo+ICAgbGlicHJvY3BzID0gZGVwZW5kZW5jeSgn bGlicHJvY3BzJywgcmVxdWlyZWQgOiB0cnVlKQo+ICAgbGlidW53aW5kID0gZGVwZW5kZW5jeSgn bGlidW53aW5kJywgcmVxdWlyZWQgOiB0cnVlKQo+ICtzc2wgPSBkZXBlbmRlbmN5KCdvcGVuc3Ns JywgcmVxdWlyZWQgOiB0cnVlKQo+ICAgCj4gICB2YWxncmluZCA9IG51bGxfZGVwCj4gICB2YWxn cmluZGluZm8gPSAnTm8nCj4gZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvdGVzdHMv TWFrZWZpbGUuYW0KPiBpbmRleCBmNDFhZDUwOTYuLmJhMzA3YjIyMCAxMDA2NDQKPiAtLS0gYS90 ZXN0cy9NYWtlZmlsZS5hbQo+ICsrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCj4gQEAgLTEyNiw4ICsx MjYsOCBAQCBnZW1fdGlsZWRfc3dhcHBpbmdfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoVEhSRUFE X0NGTEFHUykKPiAgIGdlbV90aWxlZF9zd2FwcGluZ19MREFERCA9ICQoTERBREQpIC1scHRocmVh ZAo+ICAgcHJpbWVfc2VsZl9pbXBvcnRfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoVEhSRUFEX0NG TEFHUykKPiAgIHByaW1lX3NlbGZfaW1wb3J0X0xEQUREID0gJChMREFERCkgLWxwdGhyZWFkCj4g LWdlbV91c2VycHRyX2JsaXRzX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxBR1Mp Cj4gLWdlbV91c2VycHRyX2JsaXRzX0xEQUREID0gJChMREFERCkgLWxwdGhyZWFkCj4gK2dlbV91 c2VycHRyX2JsaXRzX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxBR1MpICQoU1NM X0NGTEFHUykKPiArZ2VtX3VzZXJwdHJfYmxpdHNfTERBREQgPSAkKExEQUREKSAkKFNTTF9MSUJT KSAtbHB0aHJlYWQKPiAgIHBlcmZfcG11X0xEQUREID0gJChMREFERCkgJCh0b3BfYnVpbGRkaXIp L2xpYi9saWJpZ3RfcGVyZi5sYQo+ICAgCj4gICBnZW1fZWlvX0xEQUREID0gJChMREFERCkgLWxy dAo+IGRpZmYgLS1naXQgYS90ZXN0cy9nZW1fdXNlcnB0cl9ibGl0cy5jIGIvdGVzdHMvZ2VtX3Vz ZXJwdHJfYmxpdHMuYwo+IGluZGV4IDdlM2I2ZWYzOC4uMGZiN2ViYTA0IDEwMDY0NAo+IC0tLSBh L3Rlc3RzL2dlbV91c2VycHRyX2JsaXRzLmMKPiArKysgYi90ZXN0cy9nZW1fdXNlcnB0cl9ibGl0 cy5jCj4gQEAgLTQzLDEzICs0MywxNyBAQAo+ICAgI2luY2x1ZGUgPGZjbnRsLmg+Cj4gICAjaW5j bHVkZSA8aW50dHlwZXMuaD4KPiAgICNpbmNsdWRlIDxlcnJuby5oPgo+ICsjaW5jbHVkZSA8c2V0 am1wLmg+Cj4gICAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KPiAgICNpbmNsdWRlIDxzeXMvdGltZS5o Pgo+ICAgI2luY2x1ZGUgPHN5cy9tbWFuLmg+Cj4gKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgo+ ICAgI2luY2x1ZGUgPHNpZ25hbC5oPgo+ICAgI2luY2x1ZGUgPHB0aHJlYWQuaD4KPiAgICNpbmNs dWRlIDx0aW1lLmg+Cj4gICAKPiArI2luY2x1ZGUgPGxpbnV4L21lbWZkLmg+Cj4gKwo+ICAgI2lu Y2x1ZGUgImRybS5oIgo+ICAgI2luY2x1ZGUgImk5MTVfZHJtLmgiCj4gICAKPiBAQCAtMjM4LDYg KzI0Miw1NyBAQCBibGl0KGludCBmZCwgdWludDMyX3QgZHN0LCB1aW50MzJfdCBzcmMsIHVpbnQz Ml90ICphbGxfYm8sIGludCBuX2JvKQo+ICAgCXJldHVybiByZXQ7Cj4gICB9Cj4gICAKPiArc3Rh dGljIHZvaWQgc3RvcmVfZHdvcmQoaW50IGZkLCB1aW50MzJfdCB0YXJnZXQsCj4gKwkJCXVpbnQz Ml90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpCj4gK3sKPiArCWNvbnN0IGludCBnZW4gPSBpbnRl bF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpOwo+ICsJc3RydWN0IGRybV9pOTE1X2dlbV9l eGVjX29iamVjdDIgb2JqWzJdOwo+ICsJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2Vu dHJ5IHJlbG9jOwo+ICsJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOwo+ ICsJdWludDMyX3QgYmF0Y2hbMTZdOwo+ICsJaW50IGk7Cj4gKwo+ICsJbWVtc2V0KCZleGVjYnVm LCAwLCBzaXplb2YoZXhlY2J1ZikpOwo+ICsJZXhlY2J1Zi5idWZmZXJzX3B0ciA9IHRvX3VzZXJf cG9pbnRlcihvYmopOwo+ICsJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBBUlJBWV9TSVpFKG9iaik7 Cj4gKwlleGVjYnVmLmZsYWdzID0gMDsKPiArCWlmIChnZW4gPCA2KQo+ICsJCWV4ZWNidWYuZmxh Z3MgfD0gSTkxNV9FWEVDX1NFQ1VSRTsKPiArCj4gKwltZW1zZXQob2JqLCAwLCBzaXplb2Yob2Jq KSk7Cj4gKwlvYmpbMF0uaGFuZGxlID0gdGFyZ2V0Owo+ICsJb2JqWzFdLmhhbmRsZSA9IGdlbV9j cmVhdGUoZmQsIDQwOTYpOwo+ICsKPiArCW1lbXNldCgmcmVsb2MsIDAsIHNpemVvZihyZWxvYykp Owo+ICsJcmVsb2MudGFyZ2V0X2hhbmRsZSA9IG9ialswXS5oYW5kbGU7Cj4gKwlyZWxvYy5wcmVz dW1lZF9vZmZzZXQgPSAwOwo+ICsJcmVsb2Mub2Zmc2V0ID0gc2l6ZW9mKHVpbnQzMl90KTsKPiAr CXJlbG9jLmRlbHRhID0gb2Zmc2V0Owo+ICsJcmVsb2MucmVhZF9kb21haW5zID0gSTkxNV9HRU1f RE9NQUlOX1JFTkRFUjsKPiArCXJlbG9jLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9S RU5ERVI7Cj4gKwlvYmpbMV0ucmVsb2NzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcigmcmVsb2MpOwo+ ICsJb2JqWzFdLnJlbG9jYXRpb25fY291bnQgPSAxOwo+ICsKPiArCWkgPSAwOwo+ICsJYmF0Y2hb aV0gPSBNSV9TVE9SRV9EV09SRF9JTU0gfCAoZ2VuIDwgNiA/IDEgPDwgMjIgOiAwKTsKPiArCWlm IChnZW4gPj0gOCkgewo+ICsJCWJhdGNoWysraV0gPSBvZmZzZXQ7Cj4gKwkJYmF0Y2hbKytpXSA9 IDA7Cj4gKwl9IGVsc2UgaWYgKGdlbiA+PSA0KSB7Cj4gKwkJYmF0Y2hbKytpXSA9IDA7Cj4gKwkJ YmF0Y2hbKytpXSA9IG9mZnNldDsKPiArCQlyZWxvYy5vZmZzZXQgKz0gc2l6ZW9mKHVpbnQzMl90 KTsKPiArCX0gZWxzZSB7Cj4gKwkJYmF0Y2hbaV0tLTsKPiArCQliYXRjaFsrK2ldID0gb2Zmc2V0 Owo+ICsJfSA+ICsJYmF0Y2hbKytpXSA9IHZhbHVlOwoKSSBzdGlsbCB0aGluayB0byBhdm9pZCB0 b28gbXVjaCBjb2RlIGR1cGxpY2F0aW9uOgoKYmF0Y2ggPSBfX2VtaXRfc3RvcmVfZHdvcmQoYmF0 Y2gsIGdlbiwgb2Zmc2V0LCB2YWx1ZSwgJnJlbG9jLm9mZnNldCkKClRoZW4gZnJvbSB0aGVyZSBz ZWUgaWYgc29tZXRoaW5nIG1vcmUgY291bGQgYmUgZXh0cmFjdGVkIGZvcm0gdGhlIHRocmVlIApj YWxsIHNpdGVzLgoKPiArCWJhdGNoWysraV0gPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwo+ICsJZ2Vt X3dyaXRlKGZkLCBvYmpbMV0uaGFuZGxlLCAwLCBiYXRjaCwgc2l6ZW9mKGJhdGNoKSk7Cj4gKwln ZW1fZXhlY2J1ZihmZCwgJmV4ZWNidWYpOwo+ICsJZ2VtX2Nsb3NlKGZkLCBvYmpbMV0uaGFuZGxl KTsKPiArfQo+ICsKPiAgIHN0YXRpYyB1aW50MzJfdAo+ICAgY3JlYXRlX3VzZXJwdHIoaW50IGZk LCB1aW50MzJfdCB2YWwsIHVpbnQzMl90ICpwdHIpCj4gICB7Cj4gQEAgLTk0MSw2ICs5OTYsMzEw IEBAIHN0YXRpYyBpbnQgdGVzdF9kbWFidWYodm9pZCkKPiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAg IAo+ICtzdGF0aWMgdm9pZCB0ZXN0X3JlYWRvbmx5KGludCBpOTE1KQo+ICt7Cj4gKwl1bnNpZ25l ZCBjaGFyIG9yaWdbU0hBX0RJR0VTVF9MRU5HVEhdOwo+ICsJdWludDY0X3QgYXBlcnR1cmVfc2l6 ZTsKPiArCXVpbnQzMl90IHdoYW5kbGUsIHJoYW5kbGU7Cj4gKwlzaXplX3Qgc3osIHRvdGFsOwo+ ICsJdm9pZCAqcGFnZXMsICpzcGFjZTsKPiArCWludCBtZW1mZDsKPiArCj4gKwkvKgo+ICsJICog QSBzbWFsbCBiYXRjaCBvZiBwYWdlczsgc21hbGwgZW5vdWdoIHRvIGNoZWFwbHkgY2hlY2sgZm9y IHN0cmF5Cj4gKwkgKiB3cml0ZXMgYnV0IGxhcmdlIGVub3VnaCB0aGF0IHdlIGRvbid0IGNyZWF0 ZSB0b28gbWFueSBWTUEgcG9pbnRpbmcKPiArCSAqIGJhY2sgdG8gdGhpcyBzZXQgZnJvbSB0aGUg bGFyZ2UgYXJlbmEuIFRoZSBsaW1pdCBvbiB0b3RhbCBudW1iZXIKPiArCSAqIG9mIFZNQSBmb3Ig YSBwcm9jZXNzIGlzIDY1LDUzNiAoYXQgbGVhc3Qgb24gdGhpcyBrZXJuZWwpLgo+ICsJICoKPiAr CSAqIFdlIHRoZW4gd3JpdGUgZnJvbSB0aGUgR1BVIHRocm91Z2ggdGhlIGxhcmdlIGFyZW5hIGlu dG8gdGhlIHNtYWxsZXIKPiArCSAqIGJhY2tpbmcgc3RvcmFnZSwgd2hpY2ggd2UgY2FuIGNoZWFw bHkgY2hlY2sgdG8gc2VlIGlmIHRob3NlIHdyaXRlcwo+ICsJICogaGF2ZSBsYW5kZWQgKHVzaW5n IGEgU0hBMXN1bSkuIFJlcGVhdGluZyB0aGUgc2FtZSByYW5kb20gR1BVIHdyaXRlcwo+ICsJICog dGhvdWdoIGEgcmVhZC1vbmx5IGhhbmRsZSB0byBjb25maXJtIHRoYXQgdGhpcyB0aW1lIHRoZSB3 cml0ZXMgYXJlCgp0aHJvdWdoCgo+ICsJICogZGlzY2FyZGVkIGFuZCB0aGUgYmFja2luZyBzdG9y ZSB1bmNoYW5nZWQuCj4gKwkgKi8KPiArCXN6ID0gMTYgPDwgMTI7CgpIZXJlIHlvdSBhaW0gbm90 IHRvIGV4Y2VlZCB0aGUgYWJvdmUgbWVudGlvbmVkIHBlci1wcm9jZXNzIFZNQSBsaW1pdCBidXQg CnBsZWFzZSBqdXN0IGV4cHJlc3MgdGhhdCBpbiB0aGUgY29kZS4gTWF5YmUgcmUtb3JkZXIgdGhl IGNvZGUgYSBiaXQ6Cgp0b3RhbCA9IDJHaWIKc3ogPSAyR2liIC8gbWF4X3ZtYXNfcGVyX3Byb2Nl c3MgKiAyCmFwZXJ0dXJlX3NpemUgPSAuLi4KdG90YWwgPSByb3VuZF9kb3duCgpUaGVuIHByb2Nl ZWQgd2l0aCBhbGxvY2F0aW9uIGV0Yy4KCj4gKwltZW1mZCA9IG1lbWZkX2NyZWF0ZSgicGFnZXMi LCAwKTsKPiArCWlndF9yZXF1aXJlKG1lbWZkICE9IC0xKTsKPiArCWlndF9yZXF1aXJlKGZ0cnVu Y2F0ZShtZW1mZCwgc3opID09IDApOwo+ICsKPiArCXBhZ2VzID0gbW1hcChOVUxMLCBzeiwgUFJP VF9XUklURSwgTUFQX1NIQVJFRCwgbWVtZmQsIDApOwo+ICsJaWd0X2Fzc2VydChwYWdlcyAhPSBN QVBfRkFJTEVEKTsKPiArCj4gKwlpZ3RfcmVxdWlyZShfX2dlbV91c2VycHRyKGk5MTUsIHBhZ2Vz LCBzeiwgdHJ1ZSwgdXNlcnB0cl9mbGFncywgJnJoYW5kbGUpID09IDApOwo+ICsJZ2VtX2Nsb3Nl KGk5MTUsIHJoYW5kbGUpOwo+ICsKPiArCWdlbV91c2VycHRyKGk5MTUsIHBhZ2VzLCBzeiwgZmFs c2UsIHVzZXJwdHJfZmxhZ3MsICZ3aGFuZGxlKTsKPiArCgovKgogRnJvbSB5b3VyIHJlcGx5Ogoi IiIKdGhlIGxhcmdlc3Qgb2Zmc2V0IHdlIGNhbiB1c2UgaXMgNEcsIGFuZCB3ZSBjYW4ndCB1c2Ug dGhlIGZ1bGwgcmFuZ2UKYXMgd2UgbmVlZCBzb21lIGV4dHJhIHJvb20gZm9yIGJhdGNoZXMsIGFu ZCB3ZSBjYW4ndCB1c2UgdGhlIGZ1bGwgVk1BCmxpbWl0IHdpdGhvdXQgc2VyaW91cyBzbG93IGRv d24gYW5kIHJpc2sgb2YgZXhoYXVzdGlvbi4KVGhlbiBzdGlja2luZyB0byBhIHBvdC4KIiIiCiov Cgo+ICsJdG90YWwgPSAyMDQ4dWxsIDw8IDIwOwo+ICsJYXBlcnR1cmVfc2l6ZSA9IGdlbV9hcGVy dHVyZV9zaXplKGk5MTUpIC8gMjsKPiArCWlmIChhcGVydHVyZV9zaXplIDwgdG90YWwpCj4gKwkJ dG90YWwgPSBhcGVydHVyZV9zaXplOwo+ICsJdG90YWwgPSB0b3RhbCAvIHN6ICogc3o7Cj4gKwlp Z3RfaW5mbygiVXNpbmcgYSAlJ3p1QiAoJSd6dSBwYWdlcykgYXJlbmEgb250byAlenUgcGFnZXNc biIsCj4gKwkJIHRvdGFsLCB0b3RhbCA+PiAxMiwgc3ogPj4gMTIpOwo+ICsKPiArCS8qIENyZWF0 ZSBhbiBhcmVuYSBhbGwgcG9pbnRpbmcgdG8gdGhlIHNhbWUgc2V0IG9mIHBhZ2VzICovCj4gKwlz cGFjZSA9IG1tYXAoTlVMTCwgdG90YWwsIFBST1RfUkVBRCwgTUFQX0FOT04gfCBNQVBfU0hBUkVE LCAtMSwgMCk7CgpXaHkgTUFQX1NIQVJFRD8KCj4gKwlpZ3RfcmVxdWlyZShzcGFjZSAhPSBNQVBf RkFJTEVEKTsKPiArCWZvciAoc2l6ZV90IG9mZnNldCA9IDA7IG9mZnNldCA8IHRvdGFsOyBvZmZz ZXQgKz0gc3opIHsKPiArCQlpZ3RfYXNzZXJ0KG1tYXAoc3BhY2UgKyBvZmZzZXQsIHN6LAo+ICsJ CQkJUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKPiArCQkJCW1lbWZkLCAwKSAh PSBNQVBfRkFJTEVEKTsKPiArCQkqKHVpbnQzMl90ICopKHNwYWNlICsgb2Zmc2V0KSA9IG9mZnNl dDsKCkFGQUlVOgoKRmlyc3Qgd3JpdGUgaW5zdGFudGlhdGVzIHRoZSBiYWNraW5nIHN0b3JlLCB3 ZWxsLCBvbmUgcGFnZSBvZiBpdCBJIApndWVzcy4gRGVwZW5kaW5nIGhvdyBtZW1mZCB3b3JrcyBJ IGd1ZXNzLiBCdXQgbWxvY2sgbGF0ZXIgd2lsbCBkbyBhbGwgb2YgaXQuCgo+ICsJfQo+ICsJaWd0 X2Fzc2VydF9lcV91MzIoKih1aW50MzJfdCAqKXBhZ2VzLCAodWludDMyX3QpKHRvdGFsIC0gc3op KTsKCi4uLiBhbmQgdGhpcyBjaGVja3MgdGhhdCB0aGUgYXJlbmEgaXMgbWFkZSB1cCBmcm9tIHJl cGVhdGluZyBjaHVua3MuIAooQ2hlY2tpbmcgdGhhdCB0aGUgc2lnbmF0dXJlIHdyaXR0ZW4gaW50 byB0aGUgbGFzdCBjaHVuayBpcyBtaXJyb3JlZCBpbiAKdGhlIGZpcnN0IG9uZS4pCgo+ICsJaWd0 X2Fzc2VydChtbG9jayhzcGFjZSwgdG90YWwpID09IDApOwoKU28gdGhpcyBhbGxvY2F0ZXMgYWxs IDY0S2lCIGRlZmluaXRlbHkuCgo+ICsJY2xvc2UobWVtZmQpOwo+ICsKPiArCS8qIENoZWNrIHdl IGNhbiBjcmVhdGUgYSBub3JtYWwgdXNlcnB0ciBibyB3cmFwcGluZyB0aGUgd3JhcHBlciAqLwo+ ICsJZ2VtX3VzZXJwdHIoaTkxNSwgc3BhY2UsIHRvdGFsLCBmYWxzZSwgdXNlcnB0cl9mbGFncywg JnJoYW5kbGUpOwoKVGhpcyBpcyBub3QgcmVhZC1vbmx5IHNvIHJoYW5kbGUgaXMgYSBiaXQgbWlz bGVhZGluZy4gV2h5IGRvIHlvdSBidHcgCmNyZWF0ZSB0aGUgd2hhbmRsZSBzbyBlYXJseSBvbiBh bmQgbm90IGp1c3QgaGVyZT8gSG1tLi4uIHdoYW5kbGUgaXMgCmNodW5rIHNpemUsIHJoYW5kbGUg aXMgYXJlbmEgc2l6ZS4uIHNvIHRoZSB0d28gbG9vcHMgYmVsb3cgYXJlIGRpZmZlcmVudCAKaW4g dGhhdCByZXNwZWN0LiBXaHkgaXMgdGhhdD8KCj4gKwlnZW1fc2V0X2RvbWFpbihpOTE1LCByaGFu ZGxlLCBJOTE1X0dFTV9ET01BSU5fQ1BVLCAwKTsKPiArCWZvciAoc2l6ZV90IG9mZnNldCA9IDA7 IG9mZnNldCA8IHRvdGFsOyBvZmZzZXQgKz0gc3opCj4gKwkJc3RvcmVfZHdvcmQoaTkxNSwgcmhh bmRsZSwgb2Zmc2V0ICsgNCwgb2Zmc2V0IC8gc3opOwo+ICsJZ2VtX3N5bmMoaTkxNSwgcmhhbmRs ZSk7CgpJIGRpZCBub3QgZ2V0IHlvdXIgbGFzdCByZXBseSBoZXJlIC0gb25jZSBzdG9yZSBkd29y ZHMgaGF2ZSBjb21wbGV0ZWQgCmFuZCB5b3UgcHJvY2VlZCB0byBjaGVjayB0aGUgbWVtb3J5IHZp YSBDUFUgUFRFcyAtIGRvIHlvdSBuZWVkIHRvIG1vdmUgCnRoZSB1c2VycHRyIGJvIGJhY2sgdG8g dGhlIENQVSBkb21haW4gc28gYW55IGZsdXNoZXMgd291bGQgaGFwcGVuPwoKPiArCWlndF9hc3Nl cnRfZXFfdTMyKCoodWludDMyX3QgKikocGFnZXMgKyAwKSwgKHVpbnQzMl90KSh0b3RhbCAtIHN6 KSk7Cj4gKwlpZ3RfYXNzZXJ0X2VxX3UzMigqKHVpbnQzMl90ICopKHBhZ2VzICsgNCksICh1aW50 MzJfdCkodG90YWwgLyBzeiAtIDEpKTsKCkkgcmVhbGx5IHRoaW5rIGNvbW1lbnQgZXhwbGFpbmlu ZyB0aGUgbGF5b3V0IGFuZCB3aGljaCBzaWRlIHdyaXRlcyBhdCAKd2hpY2ggb2Zmc2V0IHdvdWxk IGJlIGJlbmVmaWNpYWwuCgo+ICsJZ2VtX2Nsb3NlKGk5MTUsIHJoYW5kbGUpOwo+ICsKPiArCS8q IE5vdyBlbmZvcmNlIHJlYWQtb25seSBoZW5jZWZvcnRoICovCj4gKwlpZ3RfYXNzZXJ0KG1wcm90 ZWN0KHNwYWNlLCB0b3RhbCwgUFJPVF9SRUFEKSA9PSAwKTsKPiArCj4gKwlTSEExKHBhZ2VzLCBz eiwgb3JpZyk7Cj4gKwlpZ3RfZm9yayhjaGlsZCwgMSkgewo+ICsJCWNvbnN0IGludCBnZW4gPSBp bnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChpOTE1KSk7Cj4gKwkJY29uc3QgaW50IG5yZWxv YyA9IDEwMjQ7Cj4gKwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxv YzsKPiArCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmpbMl07Cj4gKwkJc3Ry dWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjOwo+ICsJCXVuc2lnbmVkIGNoYXIgcmVm W1NIQV9ESUdFU1RfTEVOR1RIXSwgcmVzdWx0W1NIQV9ESUdFU1RfTEVOR1RIXTsKPiArCQl1aW50 MzJfdCAqYmF0Y2g7Cj4gKwkJaW50IGk7Cj4gKwo+ICsJCXJlbG9jID0gY2FsbG9jKHNpemVvZigq cmVsb2MpLCBucmVsb2MpOwo+ICsJCWdlbV91c2VycHRyKGk5MTUsIHNwYWNlLCB0b3RhbCwgdHJ1 ZSwgdXNlcnB0cl9mbGFncywgJnJoYW5kbGUpOwo+ICsKPiArCQltZW1zZXQob2JqLCAwLCBzaXpl b2Yob2JqKSk7Cj4gKwkJb2JqWzBdLmZsYWdzID0gTE9DQUxfRVhFQ19PQkpFQ1RfU1VQUE9SVFNf NDhCOwo+ICsJCW9ialsxXS5oYW5kbGUgPSBnZW1fY3JlYXRlKGk5MTUsIHN6KTsKCkkgZGlkbid0 IGdldCB5b3VyIHByZXZpb3VzIHJlcGx5LiBUaGlzIGlzIHRoZSBiYXRjaCBidWZmZXIgcmlnaHQ/ IFNvIHRoZSAKc2l6ZSBuZWVkZWQgaXMgcmVsYXRpbmcgdG8gdGhlIG51bWJlciBvZiBzdG9yZSBk d29yZCArIGJiZW5kIHlvdSBuZWVkIHRvIAplbWl0LCByYXRoZXIgdGhhbiBzeiwgbm8/IEFuZCBu cmVsb2MgaXMgYXJiaXRyYXJ5IHN1YnNldCBvZiBzeiAvIApzaXplb2YodWludDMyX3QpLCByaWdo dD8KClNvIG1heWJlOgoKY29uc3QgaW50IG5yZWxvYyA9IHN6IC8gc2l6ZW9mKHVpbnQzMl90KSAv IDE2OyAvKiBhcmJpdHJhcnkgc3ViLXNpemUgKi8KLi4uCm9ialsxXS5oYW5kbGUgPSBnZW1fY3Jl YXRlKGk5MTUsIHNpemVvZih1aW50MzJfdCkgKyBucmVsb2MgKiAKc2l6ZW9mKG9uZV9zdG9yZV9k d29yZF9zeikpOwoKT3IgSSBhbSBtaXNzaW5nIHNvbWV0aGluZz8KCj4gKwkJb2JqWzFdLnJlbG9j YXRpb25fY291bnQgPSBucmVsb2M7Cj4gKwkJb2JqWzFdLnJlbG9jc19wdHIgPSB0b191c2VyX3Bv aW50ZXIocmVsb2MpOwo+ICsKPiArCQliYXRjaCA9IGdlbV9tbWFwX193YyhpOTE1LCBvYmpbMV0u aGFuZGxlLCAwLCBzeiwgUFJPVF9XUklURSk7Cj4gKwo+ICsJCW1lbXNldCgmZXhlYywgMCwgc2l6 ZW9mKGV4ZWMpKTsKPiArCQlleGVjLmJ1ZmZlcl9jb3VudCA9IDI7Cj4gKwkJZXhlYy5idWZmZXJz X3B0ciA9IHRvX3VzZXJfcG9pbnRlcihvYmopOwo+ICsJCWlmIChnZW4gPCA2KQo+ICsJCQlleGVj LmZsYWdzIHw9IEk5MTVfRVhFQ19TRUNVUkU7Cj4gKwo+ICsJCWZvcl9lYWNoX2VuZ2luZShpOTE1 LCBleGVjLmZsYWdzKSB7Cj4gKwkJCS8qIEZpcnN0IHR3ZWFrIHRoZSBiYWNraW5nIHN0b3JlIHRo cm91Z2ggdGhlIHdyaXRlICovCj4gKwkJCWkgPSAwOwo+ICsJCQlvYmpbMF0uaGFuZGxlID0gd2hh bmRsZTsKPiArCQkJZm9yIChpbnQgbiA9IDA7IG4gPCBucmVsb2M7IG4rKykgewo+ICsJCQkJdWlu dDY0X3Qgb2Zmc2V0Owo+ICsKPiArCQkJCXJlbG9jW25dLnRhcmdldF9oYW5kbGUgPSBvYmpbMF0u aGFuZGxlOwo+ICsJCQkJcmVsb2Nbbl0uZGVsdGEgPSByYW5kKCkgJSAoc3ogLyA0KSAqIDQ7Cj4g KwkJCQlyZWxvY1tuXS5vZmZzZXQgPSAoaSArIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKPiArCQkJ CXJlbG9jW25dLnByZXN1bWVkX29mZnNldCA9IG9ialswXS5vZmZzZXQ7Cj4gKwkJCQlyZWxvY1tu XS5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwo+ICsJCQkJcmVsb2Nbbl0u d3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCkhvdyBhYm91dDoKCl9fZmls bF9yZWxvYygmcmVsb2MsICZvYmpbMF0sIGRlbHRhLCBvZmZzZXQpID8KCj4gKwo+ICsJCQkJb2Zm c2V0ID0gcmVsb2Nbbl0ucHJlc3VtZWRfb2Zmc2V0ICsgcmVsb2Nbbl0uZGVsdGE7Cj4gKwo+ICsJ CQkJYmF0Y2hbaV0gPSBNSV9TVE9SRV9EV09SRF9JTU0gfCAoZ2VuIDwgNiA/IDEgPDwgMjIgOiAw KTsKPiArCQkJCWlmIChnZW4gPj0gOCkgewo+ICsJCQkJCWJhdGNoWysraV0gPSBvZmZzZXQ7Cj4g KwkJCQkJYmF0Y2hbKytpXSA9IG9mZnNldCA+PiAzMjsKPiArCQkJCX0gZWxzZSBpZiAoZ2VuID49 IDQpIHsKPiArCQkJCQliYXRjaFsrK2ldID0gMDsKPiArCQkJCQliYXRjaFsrK2ldID0gb2Zmc2V0 Owo+ICsJCQkJCXJlbG9jW25dLm9mZnNldCArPSBzaXplb2YodWludDMyX3QpOwo+ICsJCQkJfSBl bHNlIHsKPiArCQkJCQliYXRjaFtpXS0tOwo+ICsJCQkJCWJhdGNoWysraV0gPSBvZmZzZXQ7Cj4g KwkJCQl9Cj4gKwkJCQliYXRjaFsrK2ldID0gcmFuZCgpOwo+ICsJCQkJaSsrOwo+ICsJCQl9Cj4g KwkJCWJhdGNoW2ldID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKPiArCQkJaWd0X2Fzc2VydChpICog c2l6ZW9mKHVpbnQzMl90KSA8IHN6KTsKPiArCj4gKwkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVj KTsKPiArCQkJZ2VtX3N5bmMoaTkxNSwgb2JqWzBdLmhhbmRsZSk7Cj4gKwkJCVNIQTEocGFnZXMs IHN6LCByZWYpOwo+ICsKPiArCQkJaWd0X2Fzc2VydChtZW1jbXAocmVmLCBvcmlnLCBzaXplb2Yo cmVmKSkpOwo+ICsJCQltZW1jcHkob3JpZywgcmVmLCBzaXplb2Yob3JpZykpOwo+ICsKPiArCQkJ LyogTm93IHRyeSB0aGUgc2FtZSB0aHJvdWdoIHRoZSByZWFkLW9ubHkgaGFuZGxlICovCj4gKwkJ CWkgPSAwOwo+ICsJCQlvYmpbMF0uaGFuZGxlID0gcmhhbmRsZTsKPiArCQkJZm9yIChpbnQgbiA9 IDA7IG4gPCBucmVsb2M7IG4rKykgewo+ICsJCQkJdWludDY0X3Qgb2Zmc2V0Owo+ICsKPiArCQkJ CXJlbG9jW25dLnRhcmdldF9oYW5kbGUgPSBvYmpbMF0uaGFuZGxlOwo+ICsJCQkJcmVsb2Nbbl0u ZGVsdGEgPSByYW5kKCkgJSAodG90YWwgLyA0KSAqIDQ7Cj4gKwkJCQlyZWxvY1tuXS5vZmZzZXQg PSAoaSArIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKPiArCQkJCXJlbG9jW25dLnByZXN1bWVkX29m ZnNldCA9IG9ialswXS5vZmZzZXQ7Cj4gKwkJCQlyZWxvY1tuXS5yZWFkX2RvbWFpbnMgPSBJOTE1 X0dFTV9ET01BSU5fUkVOREVSOwo+ICsJCQkJcmVsb2Nbbl0ud3JpdGVfZG9tYWluID0gSTkxNV9H RU1fRE9NQUlOX1JFTkRFUjsKPiArCj4gKwkJCQlvZmZzZXQgPSByZWxvY1tuXS5wcmVzdW1lZF9v ZmZzZXQgKyByZWxvY1tuXS5kZWx0YTsKPiArCj4gKwkJCQliYXRjaFtpXSA9IE1JX1NUT1JFX0RX T1JEX0lNTSB8IChnZW4gPCA2ID8gMSA8PCAyMiA6IDApOwo+ICsJCQkJaWYgKGdlbiA+PSA4KSB7 Cj4gKwkJCQkJYmF0Y2hbKytpXSA9IG9mZnNldDsKPiArCQkJCQliYXRjaFsrK2ldID0gb2Zmc2V0 ID4+IDMyOwo+ICsJCQkJfSBlbHNlIGlmIChnZW4gPj0gNCkgewo+ICsJCQkJCWJhdGNoWysraV0g PSAwOwo+ICsJCQkJCWJhdGNoWysraV0gPSBvZmZzZXQ7Cj4gKwkJCQkJcmVsb2Nbbl0ub2Zmc2V0 ICs9IHNpemVvZih1aW50MzJfdCk7Cj4gKwkJCQl9IGVsc2Ugewo+ICsJCQkJCWJhdGNoW2ldLS07 Cj4gKwkJCQkJYmF0Y2hbKytpXSA9IG9mZnNldDsKPiArCQkJCX0KPiArCQkJCWJhdGNoWysraV0g PSByYW5kKCk7Cj4gKwkJCQlpKys7Cj4gKwkJCX0KPiArCQkJYmF0Y2hbaV0gPSBNSV9CQVRDSF9C VUZGRVJfRU5EOwo+ICsKPiArCQkJZ2VtX2V4ZWNidWYoaTkxNSwgJmV4ZWMpOwo+ICsJCQlnZW1f c3luYyhpOTE1LCBvYmpbMF0uaGFuZGxlKTsKPiArCQkJU0hBMShwYWdlcywgc3osIHJlc3VsdCk7 Cj4gKwo+ICsJCQkvKgo+ICsJCQkgKiBBcyB0aGUgd3JpdGVzIGludG8gdGhlIHJlYWQtb25seSBH UFUgYm8gc2hvdWxkIGZhaWwsCj4gKwkJCSAqIHRoZSBTSEExIGhhc2ggb2YgdGhlIGJhY2tpbmcg c3RvcmUgc2hvdWxkIGJlCj4gKwkJCSAqIHVuYWZmZWN0ZWQuCj4gKwkJCSAqLwo+ICsJCQlpZ3Rf YXNzZXJ0KG1lbWNtcChyZWYsIHJlc3VsdCwgU0hBX0RJR0VTVF9MRU5HVEgpID09IDApOwo+ICsJ CX0KPiArCj4gKwkJbXVubWFwKGJhdGNoLCBzeik7Cj4gKwkJZ2VtX2Nsb3NlKGk5MTUsIG9ialsx XS5oYW5kbGUpOwo+ICsJCWdlbV9jbG9zZShpOTE1LCByaGFuZGxlKTsKPiArCX0KPiArCWlndF93 YWl0Y2hpbGRyZW4oKTsKPiArCj4gKwltdW5tYXAoc3BhY2UsIHRvdGFsKTsKPiArCW11bm1hcChw YWdlcywgc3opOwo+ICt9Cj4gKwo+ICtzdGF0aWMgam1wX2J1ZiBzaWdqbXA7Cj4gK3N0YXRpYyB2 b2lkIHNpZ2ptcF9oYW5kbGVyKGludCBzaWcpCj4gK3sKPiArCXNpZ2xvbmdqbXAoc2lnam1wLCBz aWcpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZXN0X3JlYWRvbmx5X21tYXAoaW50IGk5MTUp Cj4gK3sKPiArCXVuc2lnbmVkIGNoYXIgb3JpZ2luYWxbU0hBX0RJR0VTVF9MRU5HVEhdOwo+ICsJ dW5zaWduZWQgY2hhciByZXN1bHRbU0hBX0RJR0VTVF9MRU5HVEhdOwo+ICsJdWludDMyX3QgaGFu ZGxlOwo+ICsJdWludDMyX3Qgc3o7Cj4gKwl2b2lkICpwYWdlczsKPiArCXZvaWQgKnB0cjsKPiAr CWludCBzaWc7Cj4gKwo+ICsJLyoKPiArCSAqIEEgcXVpY2sgY2hlY2sgdG8gZW5zdXJlIHRoYXQg d2UgY2Fubm90IGNpcmN1bXZlbnQgdGhlCj4gKwkgKiByZWFkLW9ubHkgbmF0dXJlIG9mIG91ciBt ZW1vcnkgYnkgY3JlYXRpbmcgYSBHVFQgbW1hcCBpbnRvCj4gKwkgKiB0aGUgcGFnZXMuIEltYWdp bmUgcmVjZWl2aW5nIGEgcmVhZG9ubHkgU0hNIHNlZ21lbnQgZnJvbQo+ICsJICogYW5vdGhlciBw cm9jZXNzLCBvciBhIHJlYWRvbmx5IGZpbGUgbW1hcCwgaXQgbXVzdCByZW1haW4gcmVhZG9ubHkK PiArCSAqIG9uIHRoZSBHUFUgYXMgd2VsbC4KPiArCSAqLwo+ICsKPiArCWlndF9yZXF1aXJlKGln dF9zZXR1cF9jbGZsdXNoKCkpOwo+ICsKPiArCXN6ID0gMTYgPDwgMTI7Cj4gKwlwYWdlcyA9IG1t YXAoTlVMTCwgc3osIFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsK PiArCWlndF9hc3NlcnQocGFnZXMgIT0gTUFQX0ZBSUxFRCk7Cj4gKwo+ICsJaWd0X3JlcXVpcmUo X19nZW1fdXNlcnB0cihpOTE1LCBwYWdlcywgc3osIHRydWUsIHVzZXJwdHJfZmxhZ3MsICZoYW5k bGUpID09IDApOwo+ICsJZ2VtX3NldF9jYWNoaW5nKGk5MTUsIGhhbmRsZSwgMCk7Cj4gKwo+ICsJ bWVtc2V0KHBhZ2VzLCAweGE1LCBzeik7Cj4gKwlpZ3RfY2xmbHVzaF9yYW5nZShwYWdlcywgc3op OwoKUGxlYXNlIGFkZCBjb21tZW50IHNheWluZyB3aHkgaXQgaXMgbmVlZGVkLgoKPiArCVNIQTEo cGFnZXMsIHN6LCBvcmlnaW5hbCk7Cj4gKwo+ICsJcHRyID0gX19nZW1fbW1hcF9fZ3R0KGk5MTUs IGhhbmRsZSwgc3osIFBST1RfV1JJVEUpOwo+ICsJaWd0X2Fzc2VydChwdHIgPT0gTlVMTCk7Cj4g Kwo+ICsJcHRyID0gZ2VtX21tYXBfX2d0dChpOTE1LCBoYW5kbGUsIHN6LCBQUk9UX1JFQUQpOwo+ ICsJZ2VtX2Nsb3NlKGk5MTUsIGhhbmRsZSk7Cj4gKwo+ICsJLyogQ2hlY2sgdGhhdCBhIHdyaXRl IGludG8gdGhlIEdUVCByZWFkb25seSBtYXAgZmFpbHMgKi8KPiArCWlmICghKHNpZyA9IHNpZ3Nl dGptcChzaWdqbXAsIDEpKSkgewo+ICsJCXNpZ25hbChTSUdCVVMsIHNpZ2ptcF9oYW5kbGVyKTsK PiArCQlzaWduYWwoU0lHU0VHViwgc2lnam1wX2hhbmRsZXIpOwo+ICsJCW1lbXNldChwdHIsIDB4 NWEsIHN6KTsKPiArCQlpZ3RfYXNzZXJ0KDApOwo+ICsJfQo+ICsJaWd0X2Fzc2VydF9lcShzaWcs IFNJR1NFR1YpOwo+ICsKPiArCS8qIENoZWNrIHRoYXQgd2UgZGlzYWxsb3cgcmVtb3ZpbmcgdGhl IHJlYWRvbmx5IHByb3RlY3Rpb24gKi8KPiArCWlndF9hc3NlcnQobXByb3RlY3QocHRyLCBzeiwg UFJPVF9XUklURSkpOwo+ICsJaWYgKCEoc2lnID0gc2lnc2V0am1wKHNpZ2ptcCwgMSkpKSB7CgpD b250aW51aW5nIGZyb20gcHJldmlvdXMgcmVwbHkgLSB0aGVyZSBpcyBubyBsb25nam1wIHNvIEkg ZG9uJ3Qga25vdyB3aG8gCndpbGwganVtcCBoZXJlLiBNYXliZSBpdCBpcyBqdXN0IG1lIHNpbmNl IEkgYW0gbm90IGZhbWlsaWFyIHdpdGggdGhlIApmYWNpbGl0eSBidXQgSSBzdGlsbCBoYXZlIGEg ZmVlbGluZyBjb21tZW50IG9uIGhpZ2ggbGV2ZWwgc2V0dXAgaGVyZSBpcyAKd2FycmFudGVkLgoK UmVnYXJkcywKClR2cnRrbwoKPiArCQlzaWduYWwoU0lHQlVTLCBzaWdqbXBfaGFuZGxlcik7Cj4g KwkJc2lnbmFsKFNJR1NFR1YsIHNpZ2ptcF9oYW5kbGVyKTsKPiArCQltZW1zZXQocHRyLCAweDVh LCBzeik7Cj4gKwkJaWd0X2Fzc2VydCgwKTsKPiArCX0KPiArCWlndF9hc3NlcnRfZXEoc2lnLCBT SUdTRUdWKTsKPiArCj4gKwkvKiBBIHNpbmdsZSByZWFkIGZyb20gdGhlIEdUVCBwb2ludGVyIHRv IHByb3ZlIHRoYXQgd29ya3MgKi8KPiArCWlndF9hc3NlcnRfZXFfdTMyKCoodWludDhfdCAqKXB0 ciwgMHhhNSk7Cj4gKwltdW5tYXAocHRyLCBzeik7Cj4gKwo+ICsJLyogRG91YmxlIGNoZWNrIHRo YXQgdGhlIGtlcm5lbCBkaWQgaW5kZWVkIG5vdCBsZXQgYW55IHdyaXRlcyB0aHJvdWdoICovCj4g KwlpZ3RfY2xmbHVzaF9yYW5nZShwYWdlcywgc3opOwo+ICsJU0hBMShwYWdlcywgc3osIHJlc3Vs dCk7Cj4gKwlpZ3RfYXNzZXJ0KCFtZW1jbXAob3JpZ2luYWwsIHJlc3VsdCwgc2l6ZW9mKG9yaWdp bmFsKSkpOwo+ICsKPiArCW11bm1hcChwYWdlcywgc3opOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCB0ZXN0X3JlYWRvbmx5X3B3cml0ZShpbnQgaTkxNSkKPiArewo+ICsJdW5zaWduZWQgY2hhciBv cmlnaW5hbFtTSEFfRElHRVNUX0xFTkdUSF07Cj4gKwl1bnNpZ25lZCBjaGFyIHJlc3VsdFtTSEFf RElHRVNUX0xFTkdUSF07Cj4gKwl1aW50MzJfdCBoYW5kbGU7Cj4gKwl1aW50MzJfdCBzejsKPiAr CXZvaWQgKnBhZ2VzOwo+ICsKPiArCS8qCj4gKwkgKiBTYW1lIGFzIGZvciBHVFQgbW1hcGluZ3Ms IHdlIGNhbm5vdCBhbG9uZSBvdXJzZWx2ZXMgdG8KPiArCSAqIGNpcmN1bXZlbnQgcmVhZG9ubHkg cHJvdGVjdGlvbiBvbiBhIHBpZWNlIG9mIG1lbW9yeSB2aWEgdGhlCj4gKwkgKiBwd3JpdGUgaW9j dGwuCj4gKwkgKi8KPiArCj4gKwlpZ3RfcmVxdWlyZShpZ3Rfc2V0dXBfY2xmbHVzaCgpKTsKPiAr Cj4gKwlzeiA9IDE2IDw8IDEyOwo+ICsJcGFnZXMgPSBtbWFwKE5VTEwsIHN6LCBQUk9UX1dSSVRF LCBNQVBfQU5PTiB8IE1BUF9QUklWQVRFLCAtMSwgMCk7Cj4gKwlpZ3RfYXNzZXJ0KHBhZ2VzICE9 IE1BUF9GQUlMRUQpOwo+ICsKPiArCWlndF9yZXF1aXJlKF9fZ2VtX3VzZXJwdHIoaTkxNSwgcGFn ZXMsIHN6LCB0cnVlLCB1c2VycHRyX2ZsYWdzLCAmaGFuZGxlKSA9PSAwKTsKPiArCW1lbXNldChw YWdlcywgMHhhNSwgc3opOwo+ICsJU0hBMShwYWdlcywgc3osIG9yaWdpbmFsKTsKPiArCj4gKwlm b3IgKGludCBwYWdlID0gMDsgcGFnZSA8IDE2OyBwYWdlKyspIHsKPiArCQljaGFyIGRhdGFbNDA5 Nl07Cj4gKwo+ICsJCW1lbXNldChkYXRhLCBwYWdlLCBzaXplb2YoZGF0YSkpOwo+ICsJCWlndF9h c3NlcnRfZXEoX19nZW1fd3JpdGUoaTkxNSwgaGFuZGxlLCBwYWdlIDw8IDEyLCBkYXRhLCBzaXpl b2YoZGF0YSkpLCAtRUlOVkFMKTsKPiArCX0KPiArCj4gKwlnZW1fY2xvc2UoaTkxNSwgaGFuZGxl KTsKPiArCj4gKwlTSEExKHBhZ2VzLCBzeiwgcmVzdWx0KTsKPiArCWlndF9hc3NlcnQoIW1lbWNt cChvcmlnaW5hbCwgcmVzdWx0LCBzaXplb2Yob3JpZ2luYWwpKSk7Cj4gKwo+ICsJbXVubWFwKHBh Z2VzLCBzeik7Cj4gK30KPiArCj4gICBzdGF0aWMgaW50IHRlc3RfdXNhZ2VfcmVzdHJpY3Rpb25z KGludCBmZCkKPiAgIHsKPiAgIAl2b2lkICpwdHI7Cj4gQEAgLTk2MSwxMCArMTMyMCw2IEBAIHN0 YXRpYyBpbnQgdGVzdF91c2FnZV9yZXN0cmljdGlvbnMoaW50IGZkKQo+ICAgCXJldCA9IF9fZ2Vt X3VzZXJwdHIoZmQsIChjaGFyICopcHRyICsgMSwgUEFHRV9TSVpFIC0gMSwgMCwgdXNlcnB0cl9m bGFncywgJmhhbmRsZSk7Cj4gICAJaWd0X2Fzc2VydF9uZXEocmV0LCAwKTsKPiAgIAo+IC0JLyog UmVhZC1vbmx5IG5vdCBzdXBwb3J0ZWQuICovCj4gLQlyZXQgPSBfX2dlbV91c2VycHRyKGZkLCAo Y2hhciAqKXB0ciwgUEFHRV9TSVpFLCAxLCB1c2VycHRyX2ZsYWdzLCAmaGFuZGxlKTsKPiAtCWln dF9hc3NlcnRfbmVxKHJldCwgMCk7Cj4gLQo+ICAgCWZyZWUocHRyKTsKPiAgIAo+ICAgCXJldHVy biAwOwo+IEBAIC0xNTAyLDYgKzE4NTcsMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiph cmd2KQo+ICAgCQlpZ3Rfc3VidGVzdCgiZG1hYnVmLXVuc3luYyIpCj4gICAJCQl0ZXN0X2RtYWJ1 ZigpOwo+ICAgCj4gKwkJaWd0X3N1YnRlc3QoInJlYWRvbmx5LXVuc3luYyIpCj4gKwkJCXRlc3Rf cmVhZG9ubHkoZmQpOwo+ICsKPiArCQlpZ3Rfc3VidGVzdCgicmVhZG9ubHktbW1hcC11bnN5bmMi KQo+ICsJCQl0ZXN0X3JlYWRvbmx5X21tYXAoZmQpOwo+ICsKPiArCQlpZ3Rfc3VidGVzdCgicmVh ZG9ubHktcHdyaXRlLXVuc3luYyIpCj4gKwkJCXRlc3RfcmVhZG9ubHlfcHdyaXRlKGZkKTsKPiAr Cj4gICAJCWZvciAodW5zaWduZWQgZmxhZ3MgPSAwOyBmbGFncyA8IEFMTF9GT1JLSU5HX0VWSUNU SU9OUyArIDE7IGZsYWdzKyspIHsKPiAgIAkJCWlndF9zdWJ0ZXN0X2YoImZvcmtlZC11bnN5bmMl cyVzJXMtJXMiLAo+ICAgCQkJCQlmbGFncyAmIEZPUktJTkdfRVZJQ1RJT05TX1NXQVBQSU5HID8g Ii1zd2FwcGluZyIgOiAiIiwKPiAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3Qt ZGV2Cg==