From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH] tests/gem_userptr_benchmark: Benchmarking userptr surfaces and impact Date: Wed, 5 Feb 2014 17:33:06 +0000 Message-ID: <1391621586-2412-1-git-send-email-tvrtko.ursulin@linux.intel.com> References: <20140205142517.GN11603@nuc-i3427.alporthouse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by gabe.freedesktop.org (Postfix) with ESMTP id EB98A4612 for ; Wed, 5 Feb 2014 09:33:24 -0800 (PST) In-Reply-To: <20140205142517.GN11603@nuc-i3427.alporthouse.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org To: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KClRoaXMgYWRk cyBhIHNtYWxsIGJlbmNobWFyayBmb3IgdGhlIG5ldyB1c2VycHRyIGZ1bmN0aW9uYWxpdHkuCgpB cGFydCBmcm9tIGJhc2ljIHN1cmZhY2UgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uLCBhbHNvIHRl c3RlZCBpcyB0aGUKaW1wYWN0IG9mIGhhdmluZyB1c2VycHRyIHN1cmZhY2VzIGluIHRoZSBwcm9j ZXNzIGFkZHJlc3Mgc3BhY2UuIFJlYXNvbgpmb3IgdGhhdCBpcyB0aGUgaW1wYWN0IG9mIE1NVSBu b3RpZmllcnMgb24gY29tbW9uIGFkZHJlc3Mgc3BhY2UKb3BlcmF0aW9ucyBsaWtlIG11bm1hcCgp IHdoaWNoIGlzIHBlciBwcm9jZXNzLgoKdjI6CiAgKiBNb3ZlZCB0byBiZW5jaG1hcmtzLgogICog QWRkZWQgcG9pbnRlciByZWFkL3dyaXRlIHRlc3RzLgogICogQ2hhbmdlZCBvdXRwdXQgdG8gc2F5 IGl0ZXJhdGlvbnMgcGVyIHNlY29uZCBpbnN0ZWFkIG9mCiAgICBvcGVyYXRpb25zIHBlciBzZWNv bmQuCiAgKiBNdWx0aXBseSByZXN1bHQgYnkgYmF0Y2ggc2l6ZSBmb3IgbXVsdGktY3JlYXRlKiB0 ZXN0cwogICAgZm9yIGEgbW9yZSBjb21wYXJhYmxlIG51bWJlciB3aXRoIGNyZWF0ZS1kZXN0cm95 IHRlc3QuCgpTaWduZWQtb2ZmLWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50 ZWwuY29tPgpDYzogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Ci0tLQog QW5kcm9pZC5tayAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMyArLQogYmVuY2htYXJrcy8u Z2l0aWdub3JlICAgICAgICAgICAgICB8ICAgMSArCiBiZW5jaG1hcmtzL0FuZHJvaWQubWsgICAg ICAgICAgICAgIHwgIDM2ICsrKwogYmVuY2htYXJrcy9NYWtlZmlsZS5hbSAgICAgICAgICAgICB8 ICAgNyArLQogYmVuY2htYXJrcy9NYWtlZmlsZS5zb3VyY2VzICAgICAgICB8ICAgNiArCiBiZW5j aG1hcmtzL2dlbV91c2VycHRyX2JlbmNobWFyay5jIHwgNTEzICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgNTU4IGluc2VydGlvbnMoKyksIDgg ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgYmVuY2htYXJrcy9BbmRyb2lkLm1rCiBj cmVhdGUgbW9kZSAxMDA2NDQgYmVuY2htYXJrcy9NYWtlZmlsZS5zb3VyY2VzCiBjcmVhdGUgbW9k ZSAxMDA2NDQgYmVuY2htYXJrcy9nZW1fdXNlcnB0cl9iZW5jaG1hcmsuYwoKZGlmZiAtLWdpdCBh L0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDhhZWIyZDQuLjBjOTY5YjggMTAwNjQ0Ci0t LSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSwyICsxIEBACi1pbmNsdWRlICQo Y2FsbCBhbGwtbmFtZWQtc3ViZGlyLW1ha2VmaWxlcywgbGliIHRlc3RzIHRvb2xzKQotCitpbmNs dWRlICQoY2FsbCBhbGwtbmFtZWQtc3ViZGlyLW1ha2VmaWxlcywgbGliIHRlc3RzIHRvb2xzIGJl bmNobWFya3MpCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzLy5naXRpZ25vcmUgYi9iZW5jaG1hcmtz Ly5naXRpZ25vcmUKaW5kZXggZGRlYTZmNy4uMDllNWJkOCAxMDA2NDQKLS0tIGEvYmVuY2htYXJr cy8uZ2l0aWdub3JlCisrKyBiL2JlbmNobWFya3MvLmdpdGlnbm9yZQpAQCAtMSwzICsxLDQgQEAK K2dlbV91c2VycHRyX2JlbmNobWFyawogaW50ZWxfdXBsb2FkX2JsaXRfbGFyZ2UKIGludGVsX3Vw bG9hZF9ibGl0X2xhcmdlX2d0dAogaW50ZWxfdXBsb2FkX2JsaXRfbGFyZ2VfbWFwCmRpZmYgLS1n aXQgYS9iZW5jaG1hcmtzL0FuZHJvaWQubWsgYi9iZW5jaG1hcmtzL0FuZHJvaWQubWsKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiOGVmNQotLS0gL2Rldi9udWxsCisrKyBi L2JlbmNobWFya3MvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM2IEBACitMT0NBTF9QQVRIIDo9ICQo Y2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9NYWtlZmlsZS5zb3VyY2VzCisK KyM9PT09PT09PT09PT09PT09IworCitkZWZpbmUgYWRkX2JlbmNobWFyaworICAgIGluY2x1ZGUg JChDTEVBUl9WQVJTKQorCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9ICQxLmMKKworICAgIExPQ0FM X0NGTEFHUyArPSAtREhBVkVfU1RSVUNUX1NZU0lORk9fVE9UQUxSQU0KKyAgICBMT0NBTF9DRkxB R1MgKz0gLURBTkRST0lEIC1VTkRFQlVHIC1pbmNsdWRlICJjaGVjay1uZGVidWcuaCIKKyAgICBM T0NBTF9DRkxBR1MgKz0gLXN0ZD1jOTkKKyAgICAjIEZJWE1FOiBkcm9wIG9uY2UgQmlvbmljIGNv cnJlY3RseSBhbm5vdGF0ZXMgIm5vcmV0dXJuIiBvbiBwdGhyZWFkX2V4aXQKKyAgICBMT0NBTF9D RkxBR1MgKz0gLVduby1lcnJvcj1yZXR1cm4tdHlwZQorICAgICMgRXhjZXNzaXZlIGNvbXBsYWlu aW5nIGZvciBlc3RhYmxpc2hlZCBjYXNlcy4gUmVseSBvbiB0aGUgTGludXggdmVyc2lvbiB3YXJu aW5ncy4KKyAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUKKworICAgIExPQ0FM X01PRFVMRSA6PSAkMQorICAgIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKKyAgICBM T0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmludGVsX2dwdV90b29scworCisgICAgTE9DQUxf U0hBUkVEX0xJQlJBUklFUyA6PSBsaWJwY2lhY2Nlc3MgIFwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxpYmRybSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bGliZHJtX2ludGVsCisKKyAgICBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKK2VuZGVmCisK KyM9PT09PT09PT09PT09PT09IworCitiZW5jaG1hcmtfbGlzdCA6PSAkKGJpbl9QUk9HUkFNUykK KworJChmb3JlYWNoIGl0ZW0sJChiZW5jaG1hcmtfbGlzdCksJChldmFsICQoY2FsbCBhZGRfYmVu Y2htYXJrLCQoaXRlbSkpKSkKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvTWFrZWZpbGUuYW0gYi9i ZW5jaG1hcmtzL01ha2VmaWxlLmFtCmluZGV4IGUyYWQ3ODQuLmQxNzNiZjQgMTAwNjQ0Ci0tLSBh L2JlbmNobWFya3MvTWFrZWZpbGUuYW0KKysrIGIvYmVuY2htYXJrcy9NYWtlZmlsZS5hbQpAQCAt MSw5ICsxLDQgQEAKLQotYmluX1BST0dSQU1TID0gCQkJCVwKLQlpbnRlbF91cGxvYWRfYmxpdF9s YXJnZQkJXAotCWludGVsX3VwbG9hZF9ibGl0X2xhcmdlX2d0dAlcCi0JaW50ZWxfdXBsb2FkX2Js aXRfbGFyZ2VfbWFwCVwKLQlpbnRlbF91cGxvYWRfYmxpdF9zbWFsbAoraW5jbHVkZSBNYWtlZmls ZS5zb3VyY2VzCiAKIEFNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bfc3JjZGly KS9saWIKIEFNX0NGTEFHUyA9ICQoRFJNX0NGTEFHUykgJChDV0FSTkZMQUdTKSAkKENBSVJPX0NG TEFHUykKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvTWFrZWZpbGUuc291cmNlcyBiL2JlbmNobWFy a3MvTWFrZWZpbGUuc291cmNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5m ZDZjMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy9NYWtlZmlsZS5zb3VyY2VzCkBA IC0wLDAgKzEsNiBAQAorYmluX1BST0dSQU1TID0gICAgICAgICAgICAgICAgICAgICAgICAgIFwK KyAgICAgICAgaW50ZWxfdXBsb2FkX2JsaXRfbGFyZ2UgICAgICAgICBcCisgICAgICAgIGludGVs X3VwbG9hZF9ibGl0X2xhcmdlX2d0dCAgICAgXAorICAgICAgICBpbnRlbF91cGxvYWRfYmxpdF9s YXJnZV9tYXAgICAgIFwKKyAgICAgICAgaW50ZWxfdXBsb2FkX2JsaXRfc21hbGwgICAgICAgICBc CisgICAgICAgIGdlbV91c2VycHRyX2JlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9n ZW1fdXNlcnB0cl9iZW5jaG1hcmsuYyBiL2JlbmNobWFya3MvZ2VtX3VzZXJwdHJfYmVuY2htYXJr LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzNmY1OQotLS0gL2Rldi9u dWxsCisrKyBiL2JlbmNobWFya3MvZ2VtX3VzZXJwdHJfYmVuY2htYXJrLmMKQEAgLTAsMCArMSw1 MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAq IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy c29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQg ZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlv bgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRp c3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3 YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1 cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cisg KgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3Rp Y2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBp biBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUu CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVW RU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElO IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgor ICogICAgVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KKyAqCisgKi8K KworLyoqIEBmaWxlIGdlbV91c2VycHRyX2JlbmNobWFyay5jCisgKgorICogQmVuY2htYXJrIHRo ZSB1c2VycHRyIGNvZGUgYW5kIGltcGFjdCBvZiBoYXZpbmcgdXNlcnB0ciBzdXJmYWNlcworICog aW4gcHJvY2VzcyBhZGRyZXNzIHNwYWNlIG9uIHNvbWUgbm9ybWFsIG9wZXJhdGlvbnMuCisgKgor ICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUg PHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNp bmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3Rp bWUuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUg Imk5MTVfZHJtLmgiCisjaW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUgImludGVsX2J1Zm1n ci5oIgorI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfZ3B1 X3Rvb2xzLmgiCisKKyNkZWZpbmUgV0lEVEggMTI4CisjZGVmaW5lIEhFSUdIVCAxMjgKKyNkZWZp bmUgUEFHRV9TSVpFIDQwOTYKKworI2RlZmluZSBMT0NBTF9JOTE1X0dFTV9VU0VSUFRSICAgICAg IDB4MzQKKyNkZWZpbmUgTE9DQUxfSU9DVExfSTkxNV9HRU1fVVNFUlBUUiBEUk1fSU9XUiAoRFJN X0NPTU1BTkRfQkFTRSArIExPQ0FMX0k5MTVfR0VNX1VTRVJQVFIsIHN0cnVjdCBsb2NhbF9pOTE1 X2dlbV91c2VycHRyKQorc3RydWN0IGxvY2FsX2k5MTVfZ2VtX3VzZXJwdHIgeworCXVpbnQ2NF90 IHVzZXJfcHRyOworCXVpbnQ2NF90IHVzZXJfc2l6ZTsKKwl1aW50MzJfdCBmbGFnczsKKyNkZWZp bmUgSTkxNV9VU0VSUFRSX1JFQURfT05MWSAoMTw8MCkKKyNkZWZpbmUgSTkxNV9VU0VSUFRSX1VO U1lOQ0hST05JWkVEICgxPDwzMSkKKwl1aW50MzJfdCBoYW5kbGU7Cit9OworCitzdGF0aWMgdWlu dDMyX3QgdXNlcnB0cl9mbGFnczsKKworc3RhdGljIHVpbnQzMl90IGxpbmVhcltXSURUSCpIRUlH SFRdOworCitzdGF0aWMgdm9pZCBnZW1fdXNlcnB0cl90ZXN0X3Vuc3luY2hyb25pemVkKHZvaWQp Cit7CisJdXNlcnB0cl9mbGFncyA9IEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9OSVpFRDsKK30KKwor c3RhdGljIHZvaWQgZ2VtX3VzZXJwdHJfdGVzdF9zeW5jaHJvbml6ZWQodm9pZCkKK3sKKwl1c2Vy cHRyX2ZsYWdzID0gMDsKK30KKworc3RhdGljIGludCBnZW1fdXNlcnB0cihpbnQgZmQsIHZvaWQg KnB0ciwgaW50IHNpemUsIGludCByZWFkX29ubHksIHVpbnQzMl90ICpoYW5kbGUpCit7CisJc3Ry dWN0IGxvY2FsX2k5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKKwlpbnQgcmV0OworCisJdXNlcnB0 ci51c2VyX3B0ciA9ICh1aW50cHRyX3QpcHRyOworCXVzZXJwdHIudXNlcl9zaXplID0gc2l6ZTsK Kwl1c2VycHRyLmZsYWdzID0gdXNlcnB0cl9mbGFnczsKKwlpZiAocmVhZF9vbmx5KQorCQl1c2Vy cHRyLmZsYWdzIHw9IEk5MTVfVVNFUlBUUl9SRUFEX09OTFk7CisKKwlyZXQgPSBkcm1Jb2N0bChm ZCwgTE9DQUxfSU9DVExfSTkxNV9HRU1fVVNFUlBUUiwgJnVzZXJwdHIpOworCWlmIChyZXQpCisJ CXJldCA9IGVycm5vOworCWlndF9za2lwX29uX2YocmV0ID09IEVOT0RFViAmJgorCQkgICAgICAo dXNlcnB0cl9mbGFncyAmIEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9OSVpFRCkgPT0gMCwKKwkJICAg ICAgIlNraXBwaW5nLCBzeW5jaHJvbml6ZWQgbWFwcGluZ3Mgd2l0aCBubyBrZXJuZWwgQ09ORklH X01NVV9OT1RJRklFUj8iKTsKKwlpZiAocmV0ID09IDApCisJCSpoYW5kbGUgPSB1c2VycHRyLmhh bmRsZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdAorY3JlYXRlX3VzZXJw dHIoaW50IGZkLCB1aW50MzJfdCB2YWwsIHVpbnQzMl90ICpwdHIpCit7CisJdWludDMyX3QgaGFu ZGxlOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBnZW1fdXNlcnB0cihmZCwgcHRyLCBzaXplb2Yo bGluZWFyKSwgMCwgJmhhbmRsZSk7CisJaWd0X2Fzc2VydChyZXQgPT0gMCk7CisJaWd0X2Fzc2Vy dChoYW5kbGUgIT0gMCk7CisKKwkvKiBGaWxsIHRoZSBCTyB3aXRoIGR3b3JkcyBzdGFydGluZyBh dCB2YWwgKi8KKwlmb3IgKGkgPSAwOyBpIDwgV0lEVEgqSEVJR0hUOyBpKyspCisJCXB0cltpXSA9 IHZhbCsrOworCisJcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdGljIHZvaWQgKipoYW5kbGVfcHRy X21hcDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2hhbmRsZV9wdHJfbWFwOworCitzdGF0aWMg dm9pZCBhZGRfaGFuZGxlX3B0cih1aW50MzJfdCBoYW5kbGUsIHZvaWQgKnB0cikKK3sKKwlpZiAo aGFuZGxlID49IG51bV9oYW5kbGVfcHRyX21hcCkgeworCQloYW5kbGVfcHRyX21hcCA9IHJlYWxs b2MoaGFuZGxlX3B0cl9tYXAsCisJCQkJCSAoaGFuZGxlICsgMTAwMCkgKiBzaXplb2Yodm9pZCop KTsKKwkJbnVtX2hhbmRsZV9wdHJfbWFwID0gaGFuZGxlICsgMTAwMDsKKwl9CisKKwloYW5kbGVf cHRyX21hcFtoYW5kbGVdID0gcHRyOworfQorCitzdGF0aWMgdm9pZCAqZ2V0X2hhbmRsZV9wdHIo dWludDMyX3QgaGFuZGxlKQoreworCXJldHVybiBoYW5kbGVfcHRyX21hcFtoYW5kbGVdOworfQor CitzdGF0aWMgdm9pZCBmcmVlX2hhbmRsZV9wdHIodWludDMyX3QgaGFuZGxlKQoreworCWlndF9h c3NlcnQoaGFuZGxlIDwgbnVtX2hhbmRsZV9wdHJfbWFwKTsKKwlpZ3RfYXNzZXJ0KGhhbmRsZV9w dHJfbWFwW2hhbmRsZV0pOworCisJZnJlZShoYW5kbGVfcHRyX21hcFtoYW5kbGVdKTsKKwloYW5k bGVfcHRyX21hcFtoYW5kbGVdID0gTlVMTDsKK30KKworc3RhdGljIHVpbnQzMl90IGNyZWF0ZV91 c2VycHRyX2JvKGludCBmZCwgaW50IHNpemUpCit7CisJdm9pZCAqcHRyOworCXVpbnQzMl90IGhh bmRsZTsKKwlpbnQgcmV0OworCisJcmV0ID0gcG9zaXhfbWVtYWxpZ24oJnB0ciwgUEFHRV9TSVpF LCBzaXplKTsKKwlpZ3RfYXNzZXJ0KHJldCA9PSAwKTsKKworCXJldCA9IGdlbV91c2VycHRyKGZk LCAodWludDMyX3QgKilwdHIsIHNpemUsIDAsICZoYW5kbGUpOworCWlndF9hc3NlcnQocmV0ID09 IDApOworCWFkZF9oYW5kbGVfcHRyKGhhbmRsZSwgcHRyKTsKKworCXJldHVybiBoYW5kbGU7Cit9 CisKK3N0YXRpYyB2b2lkIGZyZWVfdXNlcnB0cl9ibyhpbnQgZmQsIHVpbnQzMl90IGhhbmRsZSkK K3sKKwlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7CisJZnJlZV9oYW5kbGVfcHRyKGhhbmRsZSk7Cit9 CisKK3N0YXRpYyBpbnQgaGFzX3VzZXJwdHIoaW50IGZkKQoreworCXVpbnQzMl90IGhhbmRsZSA9 IDA7CisJdm9pZCAqcHRyOworCXVpbnQzMl90IG9sZGZsYWdzOworCWludCByZXQ7CisKKwlhc3Nl cnQocG9zaXhfbWVtYWxpZ24oJnB0ciwgUEFHRV9TSVpFLCBQQUdFX1NJWkUpID09IDApOworCW9s ZGZsYWdzID0gdXNlcnB0cl9mbGFnczsKKwlnZW1fdXNlcnB0cl90ZXN0X3Vuc3luY2hyb25pemVk KCk7CisJcmV0ID0gZ2VtX3VzZXJwdHIoZmQsIHB0ciwgUEFHRV9TSVpFLCAwLCAmaGFuZGxlKTsK Kwl1c2VycHRyX2ZsYWdzID0gb2xkZmxhZ3M7CisJaWYgKHJldCAhPSAwKSB7CisJCWZyZWUocHRy KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ2VtX2Nsb3NlKGZkLCBoYW5kbGUpOworCWZyZWUocHRy KTsKKworCXJldHVybiBoYW5kbGUgIT0gMDsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGlu dCBucl9ib3NbXSA9IHswLCAxLCAxMCwgMTAwLCAxMDAwfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25l ZCBpbnQgdGVzdF9kdXJhdGlvbl9zZWMgPSAzOworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQg aW50IHJ1bl90ZXN0OworCitzdGF0aWMgdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWcpCit7CisJ YXNzZXJ0KHJ1bl90ZXN0ID09IDEpOworCXJ1bl90ZXN0ID0gMDsKK30KKworc3RhdGljIHZvaWQg c3RhcnRfdGVzdCh1bnNpZ25lZCBpbnQgZHVyYXRpb24pCit7CisJcnVuX3Rlc3QgPSAxOworCWlm IChkdXJhdGlvbiA9PSAwKQorCQlkdXJhdGlvbiA9IHRlc3RfZHVyYXRpb25fc2VjOworCXNpZ25h bChTSUdBTFJNLCBhbGFybV9oYW5kbGVyKTsKKwlhbGFybShkdXJhdGlvbik7Cit9CisKK3N0YXRp YyB2b2lkIGV4Y2hhbmdlX3B0cih2b2lkICphcnJheSwgdW5zaWduZWQgaSwgdW5zaWduZWQgaikK K3sKKwl2b2lkICoqYXJyLCAqdG1wOworCWFyciA9ICh2b2lkICoqKWFycmF5OworCisJdG1wID0g YXJyW2ldOworCWFycltpXSA9IGFycltqXTsKKwlhcnJbal0gPSB0bXA7Cit9CisKK3N0YXRpYyB2 b2lkIHRlc3RfbWFsbG9jX2ZyZWUoaW50IHJhbmRvbSkKK3sKKwl1bnNpZ25lZCBsb25nIGl0ZXIg PSAwOworCXVuc2lnbmVkIGludCBpLCB0b3QgPSAxMDAwOworCXZvaWQgKnB0clt0b3RdOworCisJ c3RhcnRfdGVzdCh0ZXN0X2R1cmF0aW9uX3NlYyk7CisKKwl3aGlsZSAocnVuX3Rlc3QpIHsKKwkJ Zm9yIChpID0gMDsgaSA8IHRvdDsgaSsrKSB7CisJCQlwdHJbaV0gPSBtYWxsb2MoMTAwMCk7CisJ CQlhc3NlcnQocHRyW2ldKTsKKwkJfQorCQlpZiAocmFuZG9tKQorCQkJaWd0X3Blcm11dGVfYXJy YXkocHRyLCB0b3QsIGV4Y2hhbmdlX3B0cik7CisJCWZvciAoaSA9IDA7IGkgPCB0b3Q7IGkrKykK KwkJCWZyZWUocHRyW2ldKTsKKwkJaXRlcisrOworCX0KKworCXByaW50ZigiJThsdSBpdGVyL3Nc biIsIGl0ZXIgLyB0ZXN0X2R1cmF0aW9uX3NlYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFs bG9jX3JlYWxsb2NfZnJlZShpbnQgcmFuZG9tKQoreworCXVuc2lnbmVkIGxvbmcgaXRlciA9IDA7 CisJdW5zaWduZWQgaW50IGksIHRvdCA9IDEwMDA7CisJdm9pZCAqcHRyW3RvdF07CisKKwlzdGFy dF90ZXN0KHRlc3RfZHVyYXRpb25fc2VjKTsKKworCXdoaWxlIChydW5fdGVzdCkgeworCQlmb3Ig KGkgPSAwOyBpIDwgdG90OyBpKyspIHsKKwkJCXB0cltpXSA9IG1hbGxvYygxMDAwKTsKKwkJCWFz c2VydChwdHJbaV0pOworCQl9CisJCWlmIChyYW5kb20pCisJCQlpZ3RfcGVybXV0ZV9hcnJheShw dHIsIHRvdCwgZXhjaGFuZ2VfcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IHRvdDsgaSsrKSB7CisJ CQlwdHJbaV0gPSByZWFsbG9jKHB0cltpXSwgMjAwMCk7CisJCQlhc3NlcnQocHRyW2ldKTsKKwkJ fQorCQlpZiAocmFuZG9tKQorCQkJaWd0X3Blcm11dGVfYXJyYXkocHRyLCB0b3QsIGV4Y2hhbmdl X3B0cik7CisJCWZvciAoaSA9IDA7IGkgPCB0b3Q7IGkrKykKKwkJCWZyZWUocHRyW2ldKTsKKwkJ aXRlcisrOworCX0KKworCXByaW50ZigiJThsdSBpdGVyL3NcbiIsIGl0ZXIgLyB0ZXN0X2R1cmF0 aW9uX3NlYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbW1hcF91bm1hcChpbnQgcmFuZG9tKQor eworCXVuc2lnbmVkIGxvbmcgaXRlciA9IDA7CisJdW5zaWduZWQgaW50IGksIHRvdCA9IDEwMDA7 CisJdm9pZCAqcHRyW3RvdF07CisKKwlzdGFydF90ZXN0KHRlc3RfZHVyYXRpb25fc2VjKTsKKwor CXdoaWxlIChydW5fdGVzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdG90OyBpKyspIHsKKwkJCXB0 cltpXSA9IG1tYXAoTlVMTCwgMTAwMCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkJTUFQ X0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisJCQlhc3NlcnQocHRyW2ldICE9IE1B UF9GQUlMRUQpOworCQl9CisJCWlmIChyYW5kb20pCisJCQlpZ3RfcGVybXV0ZV9hcnJheShwdHIs IHRvdCwgZXhjaGFuZ2VfcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IHRvdDsgaSsrKQorCQkJbXVu bWFwKHB0cltpXSwgMTAwMCk7CisJCWl0ZXIrKzsKKwl9CisKKwlwcmludGYoIiU4bHUgaXRlci9z XG4iLCBpdGVyIC8gdGVzdF9kdXJhdGlvbl9zZWMpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3B0 cl9yZWFkKHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGl0ZXIgPSAwOworCXZvbGF0aWxl IHVuc2lnbmVkIGxvbmcgKnA7CisJdW5zaWduZWQgbG9uZyBpLCBsb29wczsKKwlyZWdpc3RlciB1 bnNpZ25lZCBsb25nIHY7CisKKwlsb29wcyA9IHNpemVvZihsaW5lYXIpIC8gc2l6ZW9mKHVuc2ln bmVkIGxvbmcpIC8gNDsKKworCXN0YXJ0X3Rlc3QodGVzdF9kdXJhdGlvbl9zZWMpOworCisJd2hp bGUgKHJ1bl90ZXN0KSB7CisJCXAgPSAodW5zaWduZWQgbG9uZyAqKXB0cjsKKwkJZm9yIChpID0g MDsgaSA8IGxvb3BzOyBpKyspIHsKKwkJCXYgPSAqcCsrOworCQkJdiA9ICpwKys7CisJCQl2ID0g KnArKzsKKwkJCXYgPSAqcCsrOworCQl9CisJCWl0ZXIrKzsKKwl9CisKKwlwcmludGYoIiU4bHUg TUIvc1xuIiwgaXRlciAvIHRlc3RfZHVyYXRpb25fc2VjICogc2l6ZW9mKGxpbmVhcikgLyAxMDAw MDAwKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9wdHJfd3JpdGUodm9pZCAqcHRyKQoreworCXVu c2lnbmVkIGxvbmcgaXRlciA9IDA7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcDsKKwlyZWdp c3RlciB1bnNpZ25lZCBsb25nIGksIGxvb3BzOworCisJbG9vcHMgPSBzaXplb2YobGluZWFyKSAv IHNpemVvZih1bnNpZ25lZCBsb25nKSAvIDQ7CisKKwlzdGFydF90ZXN0KHRlc3RfZHVyYXRpb25f c2VjKTsKKworCXdoaWxlIChydW5fdGVzdCkgeworCQlwID0gKHVuc2lnbmVkIGxvbmcgKilwdHI7 CisJCWZvciAoaSA9IDA7IGkgPCBsb29wczsgaSsrKSB7CisJCQkqcCsrID0gaTsKKwkJCSpwKysg PSBpOworCQkJKnArKyA9IGk7CisJCQkqcCsrID0gaTsKKwkJfQorCQlpdGVyKys7CisJfQorCisJ cHJpbnRmKCIlOGx1IE1CL3NcbiIsIGl0ZXIgLyB0ZXN0X2R1cmF0aW9uX3NlYyAqIHNpemVvZihs aW5lYXIpIC8gMTAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfaW1wYWN0KGludCBmZCkK K3sKKwl1bnNpZ25lZCBpbnQgdG90YWwgPSBzaXplb2YobnJfYm9zKSAvIHNpemVvZihucl9ib3Nb MF0pOworCXVuc2lnbmVkIGludCBzdWJ0ZXN0LCBpOworCXVpbnQzMl90IGhhbmRsZXNbbnJfYm9z W3RvdGFsLTFdXTsKKwl2b2lkICpwdHI7CisJY2hhciBidWZmZXJbc2l6ZW9mKGxpbmVhcildOwor CisJZm9yIChzdWJ0ZXN0ID0gMDsgc3VidGVzdCA8IHRvdGFsOyBzdWJ0ZXN0KyspIHsKKwkJZm9y IChpID0gMDsgaSA8IG5yX2Jvc1tzdWJ0ZXN0XTsgaSsrKQorCQkJaGFuZGxlc1tpXSA9IGNyZWF0 ZV91c2VycHRyX2JvKGZkLCBzaXplb2YobGluZWFyKSk7CisKKwkJaWYgKG5yX2Jvc1tzdWJ0ZXN0 XSA+IDApCisJCQlwdHIgPSBnZXRfaGFuZGxlX3B0cihoYW5kbGVzWzBdKTsKKwkJZWxzZQorCQkJ cHRyID0gYnVmZmVyOworCisJCXByaW50ZigicHRyLXJlYWQsICAgICAgICAgICAgICAgICAgICU1 dSBib3MgPSAiLCBucl9ib3Nbc3VidGVzdF0pOworCQl0ZXN0X3B0cl9yZWFkKHB0cik7CisKKwkJ cHJpbnRmKCJwdHItd3JpdGUgICAgICAgICAgICAgICAgICAgJTV1IGJvcyA9ICIsIG5yX2Jvc1tz dWJ0ZXN0XSk7CisJCXRlc3RfcHRyX3dyaXRlKHB0cik7CisKKwkJcHJpbnRmKCJtYWxsb2MtZnJl ZSwgICAgICAgICAgICAgICAgJTV1IGJvcyA9ICIsIG5yX2Jvc1tzdWJ0ZXN0XSk7CisJCXRlc3Rf bWFsbG9jX2ZyZWUoMCk7CisJCXByaW50ZigibWFsbG9jLWZyZWUtcmFuZG9tICAgICAgICAgICU1 dSBib3MgPSAiLCBucl9ib3Nbc3VidGVzdF0pOworCQl0ZXN0X21hbGxvY19mcmVlKDEpOworCisJ CXByaW50ZigibWFsbG9jLXJlYWxsb2MtZnJlZSwgICAgICAgICU1dSBib3MgPSAiLCBucl9ib3Nb c3VidGVzdF0pOworCQl0ZXN0X21hbGxvY19yZWFsbG9jX2ZyZWUoMCk7CisJCXByaW50ZigibWFs bG9jLXJlYWxsb2MtZnJlZS1yYW5kb20sICU1dSBib3MgPSAiLCBucl9ib3Nbc3VidGVzdF0pOwor CQl0ZXN0X21hbGxvY19yZWFsbG9jX2ZyZWUoMSk7CisKKwkJcHJpbnRmKCJtbWFwLXVubWFwLCAg ICAgICAgICAgICAgICAgJTV1IGJvcyA9ICIsIG5yX2Jvc1tzdWJ0ZXN0XSk7CisJCXRlc3RfbW1h cF91bm1hcCgwKTsKKwkJcHJpbnRmKCJtbWFwLXVubWFwLXJhbmRvbSwgICAgICAgICAgJTV1IGJv cyA9ICIsIG5yX2Jvc1tzdWJ0ZXN0XSk7CisJCXRlc3RfbW1hcF91bm1hcCgxKTsKKworCQlmb3Ig KGkgPSAwOyBpIDwgbnJfYm9zW3N1YnRlc3RdOyBpKyspCisJCQlmcmVlX3VzZXJwdHJfYm8oZmQs IGhhbmRsZXNbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW5nbGUoaW50IGZkKQor eworCWNoYXIgKnB0ciwgKmJvX3B0cjsKKwl1aW50MzJfdCBoYW5kbGUgPSAwOworCXVuc2lnbmVk IGxvbmcgaXRlciA9IDA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG1hcF9zaXplID0gc2l6 ZW9mKGxpbmVhcikgKyBQQUdFX1NJWkUgLSAxOworCisJcHRyID0gbW1hcChOVUxMLCBtYXBfc2l6 ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCU1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFU RSwgLTEsIDApOworCWFzc2VydChwdHIgIT0gTUFQX0ZBSUxFRCk7CisKKwlib19wdHIgPSAoY2hh ciAqKSgoKHVuc2lnbmVkIGxvbmcpcHRyICsgKFBBR0VfU0laRSAtIDEpKQorCQkJCQkmIH4oUEFH RV9TSVpFIC0gMSkpOworCisJc3RhcnRfdGVzdCh0ZXN0X2R1cmF0aW9uX3NlYyk7CisKKwl3aGls ZSAocnVuX3Rlc3QpIHsKKwkJcmV0ID0gZ2VtX3VzZXJwdHIoZmQsIGJvX3B0ciwgc2l6ZW9mKGxp bmVhciksIDAsICZoYW5kbGUpOworCQlhc3NlcnQocmV0ID09IDApOworCQlnZW1fY2xvc2UoZmQs IGhhbmRsZSk7CisJCWl0ZXIrKzsKKwl9CisKKwltdW5tYXAocHRyLCBtYXBfc2l6ZSk7CisKKwlw cmludGYoIiU4bHUgaXRlci9zXG4iLCBpdGVyIC8gdGVzdF9kdXJhdGlvbl9zZWMpOworfQorCitz dGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlKGludCBmZCwgdW5zaWduZWQgaW50IGJhdGNoLCBpbnQg cmFuZG9tKQoreworCWNoYXIgKnB0ciwgKmJvX3B0cjsKKwl1aW50MzJfdCBoYW5kbGVzWzEwMDAw XTsKKwlpbnQgbWFwWzEwMDAwXTsKKwl1bnNpZ25lZCBsb25nIGl0ZXIgPSAwOworCWludCByZXQ7 CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSA9IGJhdGNoICogc2l6ZW9mKGxpbmVh cikgKyBQQUdFX1NJWkUgLSAxOworCisJYXNzZXJ0KGJhdGNoIDwgKHNpemVvZihoYW5kbGVzKSAv IHNpemVvZihoYW5kbGVzWzBdKSkpOworCWFzc2VydChiYXRjaCA8IChzaXplb2YobWFwKSAvIHNp emVvZihtYXBbMF0pKSk7CisKKwlwdHIgPSBtbWFwKE5VTEwsIG1hcF9zaXplLCBQUk9UX1JFQUQg fCBQUk9UX1dSSVRFLAorCQkJTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisJ YXNzZXJ0KHB0ciAhPSBNQVBfRkFJTEVEKTsKKworCWJvX3B0ciA9IChjaGFyICopKCgodW5zaWdu ZWQgbG9uZylwdHIgKyAoUEFHRV9TSVpFIC0gMSkpCisJCQkJJiB+KFBBR0VfU0laRSAtIDEpKTsK KworCWZvciAoaSA9IDA7IGkgPCBiYXRjaDsgaSsrKQorCQltYXBbaV0gPSBpOworCisJc3RhcnRf dGVzdCh0ZXN0X2R1cmF0aW9uX3NlYyk7CisKKwl3aGlsZSAocnVuX3Rlc3QpIHsKKwkJaWYgKHJh bmRvbSkKKwkJCWlndF9wZXJtdXRlX2FycmF5KG1hcCwgYmF0Y2gsIGlndF9leGNoYW5nZV9pbnQp OworCQlmb3IgKGkgPSAwOyBpIDwgYmF0Y2g7IGkrKykgeworCQkJcmV0ID0gZ2VtX3VzZXJwdHIo ZmQsIGJvX3B0ciArIG1hcFtpXSAqIHNpemVvZihsaW5lYXIpLAorCQkJCQkJc2l6ZW9mKGxpbmVh ciksCisJCQkJCQkwLCAmaGFuZGxlc1tpXSk7CisJCQlhc3NlcnQocmV0ID09IDApOworCQl9CisJ CWlmIChyYW5kb20pCisJCQlpZ3RfcGVybXV0ZV9hcnJheShtYXAsIGJhdGNoLCBpZ3RfZXhjaGFu Z2VfaW50KTsKKwkJZm9yIChpID0gMDsgaSA8IGJhdGNoOyBpKyspCisJCQlnZW1fY2xvc2UoZmQs IGhhbmRsZXNbbWFwW2ldXSk7CisJCWl0ZXIrKzsKKwl9CisKKwltdW5tYXAocHRyLCBtYXBfc2l6 ZSk7CisKKwlwcmludGYoIiU4bHUgaXRlci9zXG4iLCBpdGVyICogYmF0Y2ggLyB0ZXN0X2R1cmF0 aW9uX3NlYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfdXNlcnB0cihpbnQgZmQpCit7CisJcHJp bnRmKCJjcmVhdGUtZGVzdHJveSAgICAgICAgICAgICAgICA9ICIpOworCXRlc3Rfc2luZ2xlKGZk KTsKKworCXByaW50ZigibXVsdGktY3JlYXRlLWRlc3Ryb3kgICAgICAgICAgPSAiKTsKKwl0ZXN0 X211bHRpcGxlKGZkLCAxMDAsIDApOworCisJcHJpbnRmKCJtdWx0aS1jcmVhdGUtZGVzdHJveS1y YW5kb20gICA9ICIpOworCXRlc3RfbXVsdGlwbGUoZmQsIDEwMCwgMSk7Cit9CisKK2ludCBtYWlu KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQgPSAtMSwgcmV0OworCisJaWd0X3Nr aXBfb25fc2ltdWxhdGlvbigpOworCisJaWd0X3N1YnRlc3RfaW5pdChhcmdjLCBhcmd2KTsKKwor CWZkID0gZHJtX29wZW5fYW55KCk7CisJaWd0X2Fzc2VydChmZCA+PSAwKTsKKworCXJldCA9IGhh c191c2VycHRyKGZkKTsKKwlpZ3Rfc2tpcF9vbl9mKHJldCA9PSAwLCAiTm8gdXNlcnB0ciBzdXBw b3J0IC0gJXMgKCVkKVxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSwgcmV0KTsKKworCisJZ2VtX3Vz ZXJwdHJfdGVzdF91bnN5bmNocm9uaXplZCgpOworCisJaWd0X3N1YnRlc3QoInVzZXJwdHItdW5z eW5jIikKKwkJdGVzdF91c2VycHRyKGZkKTsKKworCWlndF9zdWJ0ZXN0KCJ1c2VycHRyLWltcGFj dC11bnN5bmMiKQorCQl0ZXN0X2ltcGFjdChmZCk7CisKKwlnZW1fdXNlcnB0cl90ZXN0X3N5bmNo cm9uaXplZCgpOworCisJaWd0X3N1YnRlc3QoInVzZXJwdHItc3luYyIpCisJCXRlc3RfdXNlcnB0 cihmZCk7CisKKwlpZ3Rfc3VidGVzdCgidXNlcnB0ci1pbXBhY3Qtc3luYyIpCisJCXRlc3RfaW1w YWN0KGZkKTsKKworCWlndF9leGl0KCk7CisKKwlyZXR1cm4gMDsKK30KLS0gCjEuOC40LjMKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBt YWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==