From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: Re: [PATCH i-g-t] tools: Add intel_dp_compliance for DisplayPort 1.2 compliance automation Date: Wed, 23 Nov 2016 15:59:52 +0200 Message-ID: <871sy2wb3b.fsf@intel.com> References: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id A4AFF6E8E4 for ; Wed, 23 Nov 2016 13:59:56 +0000 (UTC) In-Reply-To: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Manasi Navare , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gVHVlLCAyMiBOb3YgMjAxNiwgTWFuYXNpIE5hdmFyZSA8bWFuYXNpLmQubmF2YXJlQGludGVs LmNvbT4gd3JvdGU6Cj4gKwo+ICtzdGF0aWMgdm9pZCBnZXRfdGVzdF92aWRlb3BhdHRlcm5fZGF0 YSh2b2lkKQo+ICt7Cj4gKwlpbnQgY291bnQgPSAwOwo+ICsJdWludDE2X3QgdmlkZW9fcGF0dGVy bl92YWx1ZVszXTsKPiArCWNoYXIgdmlkZW9fcGF0dGVybl9hdHRyaWJ1dGVbMTVdOwo+ICsKPiAr CWlmICghdGVzdF9kYXRhX2ZwKQo+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBUZXN0IGRh dGEgRmlsZSBwb2ludGVyXHJcbiIpOwo+ICsKPiArCXJld2luZCh0ZXN0X2RhdGFfZnApOwo+ICsJ d2hpbGUgKCFmZW9mKHRlc3RfZGF0YV9mcCkgJiYgY291bnQgPCAzKQo+ICsJCWZzY2FuZih0ZXN0 X2RhdGFfZnAsICIlcyAldVxuIiwgdmlkZW9fcGF0dGVybl9hdHRyaWJ1dGUsCj4gKwkJICAgICAg ICh1bnNpZ25lZCBpbnQgKikmdmlkZW9fcGF0dGVybl92YWx1ZVtjb3VudCsrXSk7Cj4gKwo+ICsJ aGRpc3BsYXkgPSB2aWRlb19wYXR0ZXJuX3ZhbHVlWzBdOwo+ICsJdmRpc3BsYXkgPSB2aWRlb19w YXR0ZXJuX3ZhbHVlWzFdOwo+ICsJYml0ZGVwdGggPSB2aWRlb19wYXR0ZXJuX3ZhbHVlWzJdOwo+ ICsJaWd0X2luZm8oIkhkaXNwbGF5ID0gJWRcclxuIiwgaGRpc3BsYXkpOwo+ICsJaWd0X2luZm8o IlZkaXNwbGF5ID0gJWRcclxuIiwgdmRpc3BsYXkpOwo+ICsJaWd0X2luZm8oIkJpdERlcHRoID0g JXVcclxuIiwgYml0ZGVwdGgpOwo+ICsKPiArfQoKSWYgeW91IGhhdmUgdGhpcyB3b3JraW5nIG5v dywgSSBndWVzcyB3ZSBjYW4gZ28gd2l0aCB3aGF0J3MgaW4gWzFdIHNpbmNlCnRoYXQncyBmYWly bHkgaXNvbGF0ZWQgZm9yIG5vdy4gSXQncyBkZWJ1Z2ZzLCBzbyB3ZSBjYW4gcmVtb3ZlIGl0Cmxh dGVyLiBJbiB0aGUgbG9uZyBydW4sIEkgZG8gd2FudCB0aGlzIHVzaW5nIERQQ0QgZGlyZWN0bHkg dGhvdWdoLgoKQlIsCkphbmkuCgoKClsxXSBodHRwOi8vcGF0Y2h3b3JrLmZyZWVkZXNrdG9wLm9y Zy9wYXRjaC9tc2dpZC8xNDc5ODUwNzY2LTMyNzQ4LTYtZ2l0LXNlbmQtZW1haWwtbWFuYXNpLmQu bmF2YXJlQGludGVsLmNvbQoKCgoKPiArCj4gK3N0YXRpYyBpbnQgcHJvY2Vzc190ZXN0X3JlcXVl c3QoaW50IHRlc3RfdHlwZSkKPiArewo+ICsJaW50IG1vZGU7Cj4gKwl1bnNpZ25lZCBsb25nIHRl c3RfZGF0YV9lZGlkOwo+ICsJaW50IHN0YXR1cyA9IDA7Cj4gKwo+ICsJc3dpdGNoICh0ZXN0X3R5 cGUpIHsKPiArCWNhc2UgRFBfVEVTVF9MSU5LX1ZJREVPX1BBVFRFUk46Cj4gKwkJdmlkZW9fcGF0 dGVybl9mbGFnID0gdHJ1ZTsKPiArCQlnZXRfdGVzdF92aWRlb3BhdHRlcm5fZGF0YSgpOwo+ICsJ CW1vZGUgPSBJTlRFTF9NT0RFX1ZJREVPX1BBVFRFUk5fVEVTVDsKPiArCQlicmVhazsKPiArCWNh c2UgRFBfVEVTVF9MSU5LX0VESURfUkVBRDoKPiArCQl0ZXN0X2RhdGFfZWRpZCA9IGdldF90ZXN0 X2VkaWRfZGF0YSgpOwo+ICsJCW1vZGUgPSAodGVzdF9kYXRhX2VkaWQgJiBEUF9DT01QTElBTkNF X1ZJREVPX01PREVfTUFTSykgPj4KPiArCQkJSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNL Owo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQkvKiBVbmtub3duIHRlc3QgdHlwZSAqLwo+ ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0IHJlcXVlc3QuIElnbm9yZWQuXHJcbiIp Owo+ICsJCWJyZWFrOwo+ICsJfQo+ICsJc3RhdHVzID0gdXBkYXRlX2Rpc3BsYXkobW9kZSwgdHJ1 ZSk7Cj4gKwo+ICsJLyogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZSAqLwo+ ICsJcmV0dXJuIHN0YXR1czsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHVtcF9jb25uZWN0b3Jz X2ZkKGludCBkcm1mZCkKPiArewo+ICsJaW50IGksIGo7Cj4gKwo+ICsJZHJtTW9kZVJlcyAqbW9k ZV9yZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybWZkKTsKPiArCj4gKwlpZiAoIW1v ZGVfcmVzb3VyY2VzKSB7Cj4gKwkJaWd0X3dhcm4oImRybU1vZGVHZXRSZXNvdXJjZXMgZmFpbGVk OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJaWd0 X2luZm8oIkNvbm5lY3RvcnM6XG4iKTsKPiArCWlndF9pbmZvKCJpZFx0ZW5jb2Rlclx0c3RhdHVz XHRcdHR5cGVcdHNpemUgKG1tKVx0bW9kZXNcbiIpOwo+ICsJZm9yIChpID0gMDsgaSA8IG1vZGVf cmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKPiArCQlkcm1Nb2RlQ29ubmVjdG9y ICpjb25uZWN0b3I7Cj4gKwo+ICsJCWNvbm5lY3RvciA9IGRybU1vZGVHZXRDb25uZWN0b3JDdXJy ZW50KGRybWZkLAo+ICsJCQkJCQkgICAgICAgbW9kZV9yZXNvdXJjZXMtPmNvbm5lY3RvcnNbaV0p Owo+ICsJCWlmICghY29ubmVjdG9yKSB7Cj4gKwkJCWlndF93YXJuKCJjb3VsZCBub3QgZ2V0IGNv bm5lY3RvciAlaTogJXNcbiIsIG1vZGVfcmVzb3VyY2VzLT5jb25uZWN0b3JzW2ldLCBzdHJlcnJv cihlcnJubykpOwo+ICsJCQljb250aW51ZTsKPiArCQl9Cj4gKwo+ICsJCWlndF9pbmZvKCIlZFx0 JWRcdCVzXHQlc1x0JWR4JWRcdFx0JWRcbiIsIGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkLCBjb25u ZWN0b3ItPmVuY29kZXJfaWQsIGttc3Rlc3RfY29ubmVjdG9yX3N0YXR1c19zdHIoY29ubmVjdG9y LT5jb25uZWN0aW9uKSwga21zdGVzdF9jb25uZWN0b3JfdHlwZV9zdHIoY29ubmVjdG9yLT5jb25u ZWN0b3JfdHlwZSksIGNvbm5lY3Rvci0+bW1XaWR0aCwgY29ubmVjdG9yLT5tbUhlaWdodCwgY29u bmVjdG9yLT5jb3VudF9tb2Rlcyk7Cj4gKwo+ICsJCWlmICghY29ubmVjdG9yLT5jb3VudF9tb2Rl cykKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCWlndF9pbmZvKCIgIG1vZGVzOlxuIik7Cj4gKwkJ aWd0X2luZm8oIiAgbmFtZSByZWZyZXNoIChIeikgaGRpc3AgaHNzIGhzZSBodG90IHZkaXNwICIi dnNzIHZzZSB2dG90IGZsYWdzIHR5cGUgY2xvY2tcbiIpOwo+ICsJCWZvciAoaiA9IDA7IGogPCBj b25uZWN0b3ItPmNvdW50X21vZGVzOyBqKyspIHsKPiArCQkJaWd0X2luZm8oIlslZF0iLCBqKTsK PiArCQkJa21zdGVzdF9kdW1wX21vZGUoJmNvbm5lY3Rvci0+bW9kZXNbal0pOwo+ICsJCX0KPiAr Cj4gKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKPiArCX0KPiArCWlndF9pbmZv KCJcbiIpOwo+ICsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKG1vZGVfcmVzb3VyY2VzKTsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgZHVtcF9jcnRjc19mZChpbnQgZHJtZmQpCj4gK3sKPiArCWlu dCBpOwo+ICsJZHJtTW9kZVJlcyAqbW9kZV9yZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2Vz KGRybWZkKTsKPiArCj4gKwlpZ3RfaW5mbygiQ1JUQ3M6XG4iKTsKPiArCWlndF9pbmZvKCJpZFx0 ZmJcdHBvc1x0c2l6ZVxuIik7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgbW9kZV9yZXNvdXJjZXMtPmNv dW50X2NydGNzOyBpKyspIHsKPiArCQlkcm1Nb2RlQ3J0YyAqY3J0YzsKPiArCj4gKwkJY3J0YyA9 IGRybU1vZGVHZXRDcnRjKGRybWZkLCBtb2RlX3Jlc291cmNlcy0+Y3J0Y3NbaV0pOwo+ICsJCWlm ICghY3J0Yykgewo+ICsJCQlpZ3Rfd2FybigiY291bGQgbm90IGdldCBjcnRjICVpOiAlc1xuIiwg bW9kZV9yZXNvdXJjZXMtPmNydGNzW2ldLCBzdHJlcnJvcihlcnJubykpOwo+ICsJCQljb250aW51 ZTsKPiArCQl9Cj4gKwkJaWd0X2luZm8oIiVkXHQlZFx0KCVkLCVkKVx0KCVkeCVkKVxuIiwgY3J0 Yy0+Y3J0Y19pZCwgY3J0Yy0+YnVmZmVyX2lkLCBjcnRjLT54LCBjcnRjLT55LCBjcnRjLT53aWR0 aCwgY3J0Yy0+aGVpZ2h0KTsKPiArCQlrbXN0ZXN0X2R1bXBfbW9kZSgmY3J0Yy0+bW9kZSk7Cj4g Kwo+ICsJCWRybU1vZGVGcmVlQ3J0YyhjcnRjKTsKPiArCX0KPiArCWlndF9pbmZvKCJcbiIpOwo+ ICsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKG1vZGVfcmVzb3VyY2VzKTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgZHVtcF9pbmZvKHZvaWQpCj4gK3sKPiArCWR1bXBfY29ubmVjdG9yc19mZChk cm1fZmQpOwo+ICsJZHVtcF9jcnRjc19mZChkcm1fZmQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBjb25uZWN0b3JfZmluZF9wcmVmZXJyZWRfbW9kZSh1aW50MzJfdCBjb25uZWN0b3JfaWQsCj4g KwkJCQkJICB1bnNpZ25lZCBsb25nIGNydGNfaWR4X21hc2ssCj4gKwkJCQkJICBzdHJ1Y3QgY29u bmVjdG9yICpjKQo+ICt7Cj4gKwlzdHJ1Y3Qga21zdGVzdF9jb25uZWN0b3JfY29uZmlnIGNvbmZp ZzsKPiArCWJvb2wgcmV0Owo+ICsKPiArCXJldCA9IGttc3Rlc3RfcHJvYmVfY29ubmVjdG9yX2Nv bmZpZyhkcm1fZmQsIGNvbm5lY3Rvcl9pZCwKPiArCQkJCQkgICAgIGNydGNfaWR4X21hc2ssICZj b25maWcpOwo+ICsJaWYgKCFyZXQpIHsKPiArCQljLT5tb2RlX3ZhbGlkID0gMDsKPiArCQlyZXR1 cm47Cj4gKwl9Cj4gKwo+ICsJYy0+Y29ubmVjdG9yID0gY29uZmlnLmNvbm5lY3RvcjsKPiArCWMt PmVuY29kZXIgPSBjb25maWcuZW5jb2RlcjsKPiArCWMtPmNydGMgPSBjb25maWcuY3J0Yy0+Y3J0 Y19pZDsKPiArCWMtPnBpcGUgPSBjb25maWcucGlwZTsKPiArCj4gKwlpZiAoYy0+Y29ubmVjdG9y LT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQgfHwKPiAr CSAgICBjLT5jb25uZWN0b3ItPmNvbm5lY3Rpb24gIT0gIERSTV9NT0RFX0NPTk5FQ1RFRCkgewo+ ICsJCWMtPm1vZGVfdmFsaWQgPSAwOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwljLT5tb2Rl ID0gY29uZmlnLmRlZmF1bHRfbW9kZTsKPiArCWMtPm1vZGVfdmFsaWQgPSAxOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IHNldHVwX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25u KQo+ICt7Cj4gKwo+ICsJZHBfY29ubi0+ZmIgPSBpZ3RfY3JlYXRlX2ZiKGRybV9mZCwKPiArCQkJ CSAgICBkcF9jb25uLT5mYl93aWR0aCwgZHBfY29ubi0+ZmJfaGVpZ2h0LAo+ICsJCQkJICAgIERS TV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwK PiArCQkJCSAgICAmZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVybik7Cj4gKwlpZ3RfYXNzZXJ0KGRw X2Nvbm4tPmZiKTsKPiArCj4gKwkvKiBNYXAgdGhlIG1hcHBpbmcgb2YgR0VNIG9iamVjdCBpbnRv IHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KPiArCWRwX2Nvbm4tPnBpeG1hcCA9IGdlbV9t bWFwX19ndHQoZHJtX2ZkLAo+ICsJCQkJCWRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4uZ2VtX2hh bmRsZSwKPiArCQkJCQlkcF9jb25uLT5mYl92aWRlb19wYXR0ZXJuLnNpemUsCj4gKwkJCQkJUFJP VF9SRUFEIHwgUFJPVF9XUklURSk7Cj4gKwlnZW1fc2V0X2RvbWFpbihkcm1fZmQsIGRwX2Nvbm4t PmZiX3ZpZGVvX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkgICAgICAgSTkxNV9HRU1fRE9NQUlO X0dUVCwgSTkxNV9HRU1fRE9NQUlOX0dUVCk7Cj4gKwlkcF9jb25uLT5mYl9zaXplID0gZHBfY29u bi0+ZmJfdmlkZW9fcGF0dGVybi5zaXplOwo+ICsKPiArCS8qIEFmdGVyIGZpbGxpbmcgdGhlIGRl dmljZSBtZW1vcnkgd2l0aCAwcyBpdCBuZWVkcyB0byBiZSB1bm1hcHBlZCAqLwo+ICsJbWVtc2V0 KGRwX2Nvbm4tPnBpeG1hcCwgMCwgZHBfY29ubi0+ZmJfc2l6ZSk7Cj4gKwltdW5tYXAoZHBfY29u bi0+cGl4bWFwLCBkcF9jb25uLT5mYl9zaXplKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIGludCBzZXR1cF9mYWlsc2FmZV9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9y ICpkcF9jb25uKQo+ICt7Cj4gKwo+ICsJZHBfY29ubi0+ZmFpbHNhZmVfZmIgPSBpZ3RfY3JlYXRl X2ZiKGRybV9mZCwKPiArCQkJCQkgICAgIGRwX2Nvbm4tPmZhaWxzYWZlX3dpZHRoLAo+ICsJCQkJ CSAgICAgZHBfY29ubi0+ZmFpbHNhZmVfaGVpZ2h0LAo+ICsJCQkJCSAgICAgRFJNX0ZPUk1BVF9Y UkdCODg4OCwKPiArCQkJCQkgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCj4gKwkJCQkJ ICAgICAmZHBfY29ubi0+ZmJfZmFpbHNhZmVfcGF0dGVybik7Cj4gKwlpZ3RfYXNzZXJ0KGRwX2Nv bm4tPmZhaWxzYWZlX2ZiKTsKPiArCj4gKwkvKiBNYXAgdGhlIG1hcHBpbmcgb2YgR0VNIG9iamVj dCBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KPiArCWRwX2Nvbm4tPmZhaWxzYWZl X3BpeG1hcCA9IGdlbV9tbWFwX19ndHQoZHJtX2ZkLAo+ICsJCQkJCQkgZHBfY29ubi0+ZmJfZmFp bHNhZmVfcGF0dGVybi5nZW1faGFuZGxlLAo+ICsJCQkJCQkgZHBfY29ubi0+ZmJfZmFpbHNhZmVf cGF0dGVybi5zaXplLAo+ICsJCQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Cj4gKwlnZW1f c2V0X2RvbWFpbihkcm1fZmQsIGRwX2Nvbm4tPmZiX2ZhaWxzYWZlX3BhdHRlcm4uZ2VtX2hhbmRs ZSwKPiArCQkgICAgICAgSTkxNV9HRU1fRE9NQUlOX0dUVCwgSTkxNV9HRU1fRE9NQUlOX0dUVCk7 Cj4gKwlkcF9jb25uLT5mYWlsc2FmZV9zaXplID0gZHBfY29ubi0+ZmJfZmFpbHNhZmVfcGF0dGVy bi5zaXplOwo+ICsKPiArCS8qIEFmdGVyIGZpbGxpbmcgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB0 aGUgbWFwcGVkIG1lbW9yeSBuZWVkcyB0byBiZSBmcmVlZCAqLwo+ICsJbWVtc2V0KGRwX2Nvbm4t PmZhaWxzYWZlX3BpeG1hcCwgMCwgZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSk7Cj4gKwltdW5tYXAo ZHBfY29ubi0+ZmFpbHNhZmVfcGl4bWFwLCBkcF9jb25uLT5mYWlsc2FmZV9zaXplKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArCj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc2V0dXBfdmlkZW9fcGF0dGVy bl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25uKQo+ICt7Cj4gKwl1aW50MzJf dCAgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodDsKPiArCj4gKwl2aWRlb193aWR0aCA9IGRwX2Nv bm4tPnRlc3RfcGF0dGVybi5oZGlzcGxheTsKPiArCXZpZGVvX2hlaWdodCA9IGRwX2Nvbm4tPnRl c3RfcGF0dGVybi52ZGlzcGxheTsKPiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYiA9IGlndF9j cmVhdGVfZmIoZHJtX2ZkLAo+ICsJCQkJCQkgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodCwKPiAr CQkJCQkJIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkJCSBMT0NBTF9EUk1fRk9STUFUX01P RF9OT05FLAo+ICsJCQkJCQkgJmRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYl9wYXR0ZXJuKTsKPiAr CWlndF9hc3NlcnQoZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiKTsKPiArCj4gKwkvKiBNYXAgdGhl IG1hcHBpbmcgb2YgR0VNIG9iamVjdCBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8K PiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXAgPSBnZW1fbW1hcF9fZ3R0KGRybV9mZCwK PiArCQkJCQkJICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5nZW1faGFuZGxl LAo+ICsJCQkJCQkgICAgIGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYl9wYXR0ZXJuLnNpemUsCj4g KwkJCQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Cj4gKwlnZW1fc2V0X2RvbWFpbihk cm1fZmQsIGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYl9wYXR0ZXJuLmdlbV9oYW5kbGUsCj4gKwkJ ICAgICAgIEk5MTVfR0VNX0RPTUFJTl9HVFQsIEk5MTVfR0VNX0RPTUFJTl9HVFQpOwo+ICsKPiAr CWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiX3Bh dHRlcm4uc2l6ZTsKPiArCj4gKwltZW1zZXQoZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnBpeG1hcCwg MCwgZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnNpemUpOwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGZpbGxfZnJhbWVidWZmZXIoc3RydWN0IGNvbm5lY3RvciAqZHBfY29u bikKPiArewo+ICsJdWludDMyX3QgdGlsZV9oZWlnaHQsIHRpbGVfd2lkdGgsIHZpZGVvX3dpZHRo LCB2aWRlb19oZWlnaHQ7Cj4gKwl1aW50MzJfdCAqcmVkX3B0ciwgKmdyZWVuX3B0ciwgKmJsdWVf cHRyLCAqd2hpdGVfcHRyLCAqc3JjX3B0ciwgKmRzdF9wdHI7Cj4gKwlpbnQgeCwgeTsKPiArCWlu dDMyX3QgcGl4ZWxfdmFsOwo+ICsKPiArCXZpZGVvX3dpZHRoID0gZHBfY29ubi0+dGVzdF9wYXR0 ZXJuLmhkaXNwbGF5Owo+ICsJdmlkZW9faGVpZ2h0ID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnZk aXNwbGF5Owo+ICsKPiArCXRpbGVfaGVpZ2h0ID0gNjQ7Cj4gKwl0aWxlX3dpZHRoID0gMSA8PCAg KGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5iaXRkZXB0aCk7Cj4gKwo+ICsJcmVkX3B0ciA9IGRwX2Nv bm4tPnRlc3RfcGF0dGVybi5waXhtYXA7Cj4gKwlncmVlbl9wdHIgPSByZWRfcHRyICsgKHZpZGVv X3dpZHRoICogdGlsZV9oZWlnaHQpOwo+ICsJYmx1ZV9wdHIgPSBncmVlbl9wdHIgKyAodmlkZW9f d2lkdGggKiB0aWxlX2hlaWdodCk7Cj4gKwl3aGl0ZV9wdHIgPSBibHVlX3B0ciArICh2aWRlb193 aWR0aCAqIHRpbGVfaGVpZ2h0KTsKPiArCXggPSAwOwo+ICsKPiArCS8qIEZpbGwgdGhlIGZyYW1l IGJ1ZmZlciB3aXRoIHZpZGVvIHBhdHRlcm4gZnJvbSBDVFMgMy4xLjUgKi8KPiArCXdoaWxlICh4 IDwgdmlkZW9fd2lkdGgpIHsKPiArCQlmb3IgKHBpeGVsX3ZhbCA9IDA7IHBpeGVsX3ZhbCA8IDI1 NjsKPiArCQkgICAgIHBpeGVsX3ZhbCA9IHBpeGVsX3ZhbCArICgyNTYgLyB0aWxlX3dpZHRoKSkg ewo+ICsJCQlyZWRfcHRyW3hdID0gcGl4ZWxfdmFsIDw8IDE2Owo+ICsJCQlncmVlbl9wdHJbeF0g PSBwaXhlbF92YWwgPDwgODsKPiArCQkJYmx1ZV9wdHJbeF0gPSBwaXhlbF92YWwgPDwgMDsKPiAr CQkJd2hpdGVfcHRyW3hdID0gcmVkX3B0clt4XSB8IGdyZWVuX3B0clt4XSB8IGJsdWVfcHRyW3hd Owo+ICsJCQlpZiAoKyt4ID49IHZpZGVvX3dpZHRoKQo+ICsJCQkJYnJlYWs7Cj4gKwkJfQo+ICsJ fQo+ICsJZm9yICh5ID0gMDsgeSA8IHZpZGVvX2hlaWdodDsgeSsrKSB7Cj4gKwkJaWYgKHkgPT0g MCB8fCB5ID09IDY0IHx8IHkgPT0gMTI4IHx8IHkgPT0gMTkyKQo+ICsJCQljb250aW51ZTsKPiAr CQlzd2l0Y2ggKCh5IC8gdGlsZV9oZWlnaHQpICUgNCkgewo+ICsJCWNhc2UgMDoKPiArCQkJc3Jj X3B0ciA9IHJlZF9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgMToKPiArCQkJc3JjX3B0ciA9 IGdyZWVuX3B0cjsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAyOgo+ICsJCQlzcmNfcHRyID0gYmx1 ZV9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgMzoKPiArCQkJc3JjX3B0ciA9IHdoaXRlX3B0 cjsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJCWRzdF9wdHIgPSBkcF9jb25uLT50ZXN0X3BhdHRl cm4ucGl4bWFwICsgKHkgKiB2aWRlb193aWR0aCk7Cj4gKwkJbWVtY3B5KGRzdF9wdHIsIHNyY19w dHIsICh2aWRlb193aWR0aCAqIDQpKTsKPiArCX0KPiArCW11bm1hcChkcF9jb25uLT50ZXN0X3Bh dHRlcm4ucGl4bWFwLAo+ICsJICAgICAgIGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplKTsKPiAr CXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNldF90ZXN0X21vZGUoc3RydWN0IGNv bm5lY3RvciAqZHBfY29ubikKPiArewo+ICsJaW50IHJldCA9IDA7Cj4gKwlpbnQgaTsKPiArCWJv b2wgZm91bmRfc3RkID0gZmFsc2UsIGZvdW5kX2ZzID0gZmFsc2U7Cj4gKwlkcm1Nb2RlQ29ubmVj dG9yICpjID0gZHBfY29ubi0+Y29ubmVjdG9yOwo+ICsKPiArCS8qIElnbm9yZSBhbnkgZGlzY29u bmVjdGVkIGRldmljZXMgKi8KPiArCWlmIChjLT5jb25uZWN0aW9uICE9IERSTV9NT0RFX0NPTk5F Q1RFRCkgewo+ICsJCWlndF93YXJuKCJDb25uZWN0b3IgJXUgZGlzY29ubmVjdGVkXHJcbiIsIGMt PmNvbm5lY3Rvcl9pZCk7Cj4gKwkJcmV0dXJuIC1FTk9FTlQ7Cj4gKwl9Cj4gKwlpZ3RfaW5mbygi Q29ubmVjdG9yIFNldHVwOlxyXG4iKTsKPiArCS8qIFNldHVwIHByZWZlcnJlZCBtb2RlIC0gc2hv dWxkIGJlIG1vZGVbMF0gaW4gdGhlIGxpc3QgKi8KPiArCWRwX2Nvbm4tPm1vZGVfcHJlZmVycmVk ID0gYy0+bW9kZXNbMF07Cj4gKwlkcF9jb25uLT5mYl93aWR0aCA9IGMtPm1vZGVzWzBdLmhkaXNw bGF5Owo+ICsJZHBfY29ubi0+ZmJfaGVpZ2h0ID0gYy0+bW9kZXNbMF0udmRpc3BsYXk7Cj4gKwo+ ICsJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLm1vZGUgPSBjLT5tb2Rlc1swXTsKPiArCWRwX2Nvbm4t PnRlc3RfcGF0dGVybi5tb2RlLmhkaXNwbGF5ID0gYy0+bW9kZXNbMF0uaGRpc3BsYXk7Cj4gKwlk cF9jb25uLT50ZXN0X3BhdHRlcm4ubW9kZS52ZGlzcGxheSA9IGMtPm1vZGVzWzBdLnZkaXNwbGF5 Owo+ICsKPiArCWlndF9pbmZvKCJQcmVmZXJyZWQgbW9kZSAobW9kZSAwKSBmb3IgY29ubmVjdG9y ICV1IGlzICV1eCV1XHJcbiIsCj4gKwkJIGRwX2Nvbm4tPmlkLCBjLT5tb2Rlc1swXS5oZGlzcGxh eSwgYy0+bW9kZXNbMF0udmRpc3BsYXkpOwo+ICsJZmZsdXNoKHN0ZGluKTsKPiArCj4gKwlmb3Ig KGkgPSAxOyBpIDwgYy0+Y291bnRfbW9kZXM7IGkrKykgewo+ICsJCS8qIFN0YW5kYXJkIG1vZGUg aXMgODAweDYwMEA2MCAqLwo+ICsJCWlmIChjLT5tb2Rlc1tpXS5oZGlzcGxheSA9PSA4MDAgJiYK PiArCQkgICAgYy0+bW9kZXNbaV0udmRpc3BsYXkgPT0gNjAwICYmCj4gKwkJICAgIGMtPm1vZGVz W2ldLnZyZWZyZXNoID09IDYwICYmCj4gKwkJICAgIGZvdW5kX3N0ZCA9PSBmYWxzZSkgewo+ICsJ CQlkcF9jb25uLT5tb2RlX3N0YW5kYXJkID0gYy0+bW9kZXNbaV07Cj4gKwkJCWlndF9pbmZvKCJT dGFuZGFyZCBtb2RlICglZCkgZm9yIGNvbm5lY3RvciAldSBpcyAldXgldVxyXG4iLAo+ICsJCQkJ IGksCj4gKwkJCQkgYy0+Y29ubmVjdG9yX2lkLAo+ICsJCQkJIGMtPm1vZGVzW2ldLmhkaXNwbGF5 LAo+ICsJCQkJIGMtPm1vZGVzW2ldLnZkaXNwbGF5KTsKPiArCQkJZm91bmRfc3RkID0gdHJ1ZTsK PiArCQl9Cj4gKwkJLyogRmFpbHNhZmUgbW9kZSBpcyA2NDB4NDgwQDYwICovCj4gKwkJaWYgKGMt Pm1vZGVzW2ldLmhkaXNwbGF5ID09IDY0MCAmJgo+ICsJCSAgICBjLT5tb2Rlc1tpXS52ZGlzcGxh eSA9PSA0ODAgJiYKPiArCQkgICAgYy0+bW9kZXNbaV0udnJlZnJlc2ggPT0gNjAgJiYKPiArCQkg ICAgZm91bmRfZnMgPT0gZmFsc2UpIHsKPiArCQkJZHBfY29ubi0+bW9kZV9mYWlsc2FmZSA9IGMt Pm1vZGVzW2ldOwo+ICsJCQlkcF9jb25uLT5mYWlsc2FmZV93aWR0aCA9IGMtPm1vZGVzW2ldLmhk aXNwbGF5Owo+ICsJCQlkcF9jb25uLT5mYWlsc2FmZV9oZWlnaHQgPSBjLT5tb2Rlc1tpXS52ZGlz cGxheTsKPiArCQkJaWd0X2luZm8oIkZhaWxzYWZlIG1vZGUgKCVkKSBmb3IgY29ubmVjdG9yICV1 IGlzICV1eCV1XHJcbiIsCj4gKwkJCQkgaSwKPiArCQkJCSBjLT5jb25uZWN0b3JfaWQsCj4gKwkJ CQkgYy0+bW9kZXNbaV0uaGRpc3BsYXksCj4gKwkJCQkgYy0+bW9kZXNbaV0udmRpc3BsYXkpOwo+ ICsJCQlmb3VuZF9mcyA9IHRydWU7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IHNldHVwX2Zy YW1lYnVmZmVycyhkcF9jb25uKTsKPiArCWlmIChyZXQpIHsKPiArCQlpZ3Rfd2FybigiQ3JlYXRl IGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3IgJXUgZmFpbGVkICglZClcclxuIiwKPiArCQkJIGMt PmNvbm5lY3Rvcl9pZCwgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCWlmIChm b3VuZF9mcykgewo+ICsJCXJldCA9IHNldHVwX2ZhaWxzYWZlX2ZyYW1lYnVmZmVyKGRwX2Nvbm4p Owo+ICsJCWlmIChyZXQpIHsKPiArCQkJaWd0X3dhcm4oIkNyZWF0ZSBmYWlsc2FmZSBmcmFtZWJ1 ZmZlciBmb3IgY29ubmVjdG9yICV1Igo+ICsJCQkJICJmYWlsZWQgKCVkKVxyXG4iLAo+ICsJCQkJ IGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKPiArCQkJcmV0dXJuIHJldDsKPiArCQl9Cj4gKwl9Cj4g Kwo+ICsJaWYgKHZpZGVvX3BhdHRlcm5fZmxhZykgewo+ICsJCWRwX2Nvbm4tPnRlc3RfcGF0dGVy bi5oZGlzcGxheSA9IGhkaXNwbGF5Owo+ICsJCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi52ZGlzcGxh eSA9IHZkaXNwbGF5Owo+ICsJCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5iaXRkZXB0aCA9IGJpdGRl cHRoOwo+ICsJCXJldCA9IHNldHVwX3ZpZGVvX3BhdHRlcm5fZnJhbWVidWZmZXIoZHBfY29ubik7 Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlpZ3Rfd2FybigiQ3JlYXRlIGZyYW1lYnVmZmVyIGZvciBj b25uZWN0b3IgJXUgZmFpbGVkICglZClcclxuIiwKPiArCQkJCSBjLT5jb25uZWN0b3JfaWQsIHJl dCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJCXJldCA9IGZpbGxfZnJhbWVidWZmZXIo ZHBfY29ubik7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlpZ3Rfd2FybigiRmlsbCBmcmFtZWJ1ZmZl ciBmb3IgY29ubmVjdG9yICV1IGZhaWxlZCAoJWQpXHJcbiIsCj4gKwkJCQkgYy0+Y29ubmVjdG9y X2lkLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4g cmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNldF92aWRlbyhpbnQgbW9kZSwgc3RydWN0IGNv bm5lY3RvciAqdGVzdF9jb25uZWN0b3IpCj4gK3sKPiArCWRybU1vZGVNb2RlSW5mbyAqcmVxdWVz dGVkX21vZGU7Cj4gKwl1aW50MzJfdCByZXF1aXJlZF9mYl9pZDsKPiArCXN0cnVjdCBpZ3RfZmIg cmVxdWlyZWRfZmI7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4gKwlzd2l0Y2ggKG1vZGUpIHsKPiAr CWNhc2UgSU5URUxfTU9ERV9OT05FOgo+ICsJCWlndF9pbmZvKCJOT05FXHJcbiIpOwo+ICsJCXJl dCA9IGRybU1vZGVTZXRDcnRjKGRybV9mZCwgdGVzdF9jb25uZWN0b3ItPmNydGMsCj4gKwkJCQkg ICAgIC0xLCAwLCAwLCBOVUxMLCAwLCBOVUxMKTsKPiArCQlnb3RvIG91dDsKPiArCWNhc2UgSU5U RUxfTU9ERV9QUkVGRVJSRUQ6Cj4gKwkJaWd0X2luZm8oIlBSRUZFUlJFRFxyXG4iKTsKPiArCQly ZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfcHJlZmVycmVkOwo+ICsJCXJl cXVpcmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3ItPmZiOwo+ICsJCXJlcXVpcmVkX2ZiID0gdGVz dF9jb25uZWN0b3ItPmZiX3ZpZGVvX3BhdHRlcm47Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIElOVEVM X01PREVfU1RBTkRBUkQ6Cj4gKwkJaWd0X2luZm8oIlNUQU5EQVJEXHJcbiIpOwo+ICsJCXJlcXVl c3RlZF9tb2RlID0gICZ0ZXN0X2Nvbm5lY3Rvci0+bW9kZV9zdGFuZGFyZDsKPiArCQlyZXF1aXJl ZF9mYl9pZCA9IHRlc3RfY29ubmVjdG9yLT5mYjsKPiArCQlyZXF1aXJlZF9mYiA9IHRlc3RfY29u bmVjdG9yLT5mYl92aWRlb19wYXR0ZXJuOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBJTlRFTF9NT0RF X0ZBSUxTQUZFOgo+ICsJCWlndF9pbmZvKCJGQUlMU0FGRVxyXG4iKTsKPiArCQlyZXF1ZXN0ZWRf bW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfZmFpbHNhZmU7Cj4gKwkJcmVxdWlyZWRfZmJf aWQgPSB0ZXN0X2Nvbm5lY3Rvci0+ZmFpbHNhZmVfZmI7Cj4gKwkJcmVxdWlyZWRfZmIgPSB0ZXN0 X2Nvbm5lY3Rvci0+ZmJfZmFpbHNhZmVfcGF0dGVybjsKPiArCQlicmVhazsKPiArCWNhc2UgSU5U RUxfTU9ERV9WSURFT19QQVRURVJOX1RFU1Q6Cj4gKwkJaWd0X2luZm8oIlZJREVPIFBBVFRFUk4g VEVTVFxyXG4iKTsKPiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICZ0ZXN0X2Nvbm5lY3Rvci0+dGVzdF9w YXR0ZXJuLm1vZGU7Cj4gKwkJcmVxdWlyZWRfZmJfaWQgPSB0ZXN0X2Nvbm5lY3Rvci0+dGVzdF9w YXR0ZXJuLmZiOwo+ICsJCXJlcXVpcmVkX2ZiID0gdGVzdF9jb25uZWN0b3ItPnRlc3RfcGF0dGVy bi5mYl9wYXR0ZXJuOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBJTlRFTF9NT0RFX0lOVkFMSUQ6Cj4g KwlkZWZhdWx0Ogo+ICsJCWlndF93YXJuKCJJTlZBTElEISAoJTA4eCkgTW9kZSBzZXQgYWJvcnRl ZCFcclxuIiwgbW9kZSk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ICsKPiArCWlndF9pbmZvKCJD UlRDKCV1KToiLCB0ZXN0X2Nvbm5lY3Rvci0+Y3J0Yyk7Cj4gKwlrbXN0ZXN0X2R1bXBfbW9kZShy ZXF1ZXN0ZWRfbW9kZSk7Cj4gKwlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIHRlc3RfY29u bmVjdG9yLT5jcnRjLCByZXF1aXJlZF9mYl9pZCwgMCwgMCwKPiArCQkJICAgICAmdGVzdF9jb25u ZWN0b3ItPmlkLCAxLCByZXF1ZXN0ZWRfbW9kZSk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJaWd0X3dh cm4oImZhaWxlZCB0byBzZXQgbW9kZSAoJWR4JWRAJWRIeik6ICVzXG4iLAo+ICsJCQkgcmVxdWVz dGVkX21vZGUtPmhkaXNwbGF5LCByZXF1ZXN0ZWRfbW9kZS0+dmRpc3BsYXksCj4gKwkJCSByZXF1 ZXN0ZWRfbW9kZS0+dnJlZnJlc2gsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJaWd0X3JlbW92ZV9m Yihkcm1fZmQsICZyZXF1aXJlZF9mYik7Cj4gKwo+ICsJfQo+ICsJLyogS2VlcCB0aGUgcGF0dGVy biBvbiBvdXRwdXQgbGluZXMgZm9yIGF0bGVhc3QgMC41IHNlY3MgZm9yCj4gKwkgKiBEUFItMTIw IHRvIGRldGVjdCBpdC4KPiArCSAqLwo+ICsJdXNsZWVwKDEwMDAwMDApOwo+ICsKPiArb3V0Ogo+ ICsJaWYgKHJldCkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gc2V0IENSVEMgZm9yIGNvbm5l Y3RvciAldVxyXG4iLAo+ICsJCQkgdGVzdF9jb25uZWN0b3ItPmlkKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK3NldF9kZWZhdWx0X21vZGUoc3Ry dWN0IGNvbm5lY3RvciAqYykKPiArewo+ICsJdW5zaWduZWQgaW50IGZiX2lkID0gMDsKPiArCXN0 cnVjdCBpZ3RfZmIgZmJfaW5mbzsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWMtPm1vZGUgPSBj LT5jb25uZWN0b3ItPm1vZGVzWzBdOwo+ICsKPiArCWlmICghYy0+bW9kZV92YWxpZCkKPiArCQly ZXR1cm4gLTE7Cj4gKwo+ICsJd2lkdGggPSBjLT5tb2RlLmhkaXNwbGF5Owo+ICsJaGVpZ2h0ID0g Yy0+bW9kZS52ZGlzcGxheTsKPiArCj4gKwlmYl9pZCA9IGlndF9jcmVhdGVfcGF0dGVybl9mYihk cm1fZmQsIHdpZHRoLCBoZWlnaHQsCj4gKwkJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ ICsJCQkJICAgICAgdGlsaW5nLCAmZmJfaW5mbyk7Cj4gKwo+ICsJaWd0X2luZm8oIkNSVEMoJXUp OlslZF0iLCBjLT5jcnRjLCAwKTsKPiArCWttc3Rlc3RfZHVtcF9tb2RlKCZjLT5tb2RlKTsKPiAr CWRybU1vZGVTZXRDcnRjKGRybV9mZCwgYy0+Y3J0YywgLTEsIDAsIDAsIE5VTEwsIDAsIE5VTEwp Owo+ICsJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBjLT5jcnRjLCBmYl9pZCwgMCwgMCwK PiArCQkJICAgICAmYy0+aWQsIDEsICZjLT5tb2RlKTsKPiArCWlmIChyZXQpIHsKPiArCQlpZ3Rf d2FybigiZmFpbGVkIHRvIHNldCBtb2RlICglZHglZEAlZEh6KTogJXNcbiIsIHdpZHRoLCBoZWln aHQsIGMtPm1vZGUudnJlZnJlc2gsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJaWd0X3JlbW92ZV9m Yihkcm1fZmQsICZmYl9pbmZvKTsKPiArCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ ICsKPiArLyoKPiArICogUmUtcHJvYmUgY29ubmVjdG9ycyBhbmQgZG8gYSBtb2Rlc2V0IGJhc2Vk IG9uIHRlc3QgcmVxdWVzdCBvcgo+ICsgKiBpbiBjYXNlIG9mIGEgaG90cGx1ZyB1ZXZlbnQuCj4g KyAqCj4gKyAqIEBtb2RlOiBWaWRlbyBtb2RlIHJlcXVlc3RlZCBieSB0aGUgdGVzdAo+ICsgKiBA aXNfY29tcGxpYW5jZV90ZXN0OiAxOiBJZiBpdCBpcyBhIGNvbXBsaWFuY2UgdGVzdAo+ICsgKiAg ICAgICAgICAgICAgICAgICAgICAwOiBJZiBpdCBpcyBhIGhvdHBsdWcgZXZlbnQKPiArICoKPiAr ICogUmV0dXJuczoKPiArICogMDogT24gU3VjY2Vzcwo+ICsgKiAtMTogT24gZmFpbHVyZQo+ICsg Ki8KPiAraW50IHVwZGF0ZV9kaXNwbGF5KGludCBtb2RlLCBib29sIGlzX2NvbXBsaWFuY2VfdGVz dCkKPiArewo+ICsJc3RydWN0IGNvbm5lY3RvciAqY29ubmVjdG9yczsKPiArCWludCBjLCByZXQg PSAwOwo+ICsJdW5zaWduZWQgbG9uZyBjcnRjX2lkeF9tYXNrID0gLTFVTDsKPiArCj4gKwlyZXNv dXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybV9mZCk7Cj4gKwlpZiAoIXJlc291cmNlcykg ewo+ICsJCWlndF93YXJuKCJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsIHN0cmVy cm9yKGVycm5vKSk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ICsKPiArCWNvbm5lY3RvcnMgPSBj YWxsb2MocmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzLAo+ICsJCQkgICAgc2l6ZW9mKHN0cnVj dCBjb25uZWN0b3IpKTsKPiArCWlmICghY29ubmVjdG9ycykKPiArCQlyZXR1cm4gLTE7Cj4gKwo+ ICsJLyogRmluZCBhbnkgY29ubmVjdGVkIGRpc3BsYXlzICovCj4gKwlmb3IgKGMgPSAwOyBjIDwg cmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzOyBjKyspIHsKPiArCj4gKwkJc3RydWN0IGNvbm5l Y3RvciAqY29ubmVjdG9yID0gJmNvbm5lY3RvcnNbY107Cj4gKwo+ICsJCWNvbm5lY3Rvci0+aWQg PSByZXNvdXJjZXMtPmNvbm5lY3RvcnNbY107Cj4gKwkJY29ubmVjdG9yX2ZpbmRfcHJlZmVycmVk X21vZGUoY29ubmVjdG9yLT5pZCwKPiArCQkJCQkgICAgICBjcnRjX2lkeF9tYXNrLAo+ICsJCQkJ CSAgICAgIGNvbm5lY3Rvcik7Cj4gKwkJaWYgKCFjb25uZWN0b3ItPm1vZGVfdmFsaWQpCj4gKwkJ CWNvbnRpbnVlOwo+ICsJCWlmIChpc19jb21wbGlhbmNlX3Rlc3QpIHsKPiArCQkJc2V0X3Rlc3Rf bW9kZShjb25uZWN0b3IpOwo+ICsJCQlyZXQgPSBzZXRfdmlkZW8oSU5URUxfTU9ERV9OT05FLCBj b25uZWN0b3IpOwo+ICsJCQlyZXQgPSBzZXRfdmlkZW8obW9kZSwgY29ubmVjdG9yKTsKPiArCj4g KwkJfSBlbHNlCj4gKwkJCXJldCA9IHNldF9kZWZhdWx0X21vZGUoY29ubmVjdG9yKTsKPiArCj4g KwkJY3J0Y19pZHhfbWFzayAmPSB+KDEgPDwgY29ubmVjdG9yLT5waXBlKTsKPiArCj4gKwkJZHJt TW9kZUZyZWVFbmNvZGVyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7Cj4gKwkJZHJtTW9kZUZyZWVDb25u ZWN0b3IoY29ubmVjdG9yLT5jb25uZWN0b3IpOwo+ICsKPiArCX0KPiArCj4gKwkvKiBFcnJvciBj b25kaXRpb24gaWYgbm8gY29ubmVjdGVkIGRpc3BsYXlzICovCj4gKwo+ICsJZnJlZShjb25uZWN0 b3JzKTsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKHJlc291cmNlcyk7Cj4gKwlyZXR1cm4gcmV0 Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3QgY2hhciBvcHRzdHJbXSA9ICJoaSI7Cj4gKwo+ICtz dGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIHVzYWdlKGNoYXIgKm5hbWUsIGNo YXIgb3B0KQo+ICt7Cj4gKwlpZ3RfaW5mbygidXNhZ2U6ICVzIFstaGldXG4iLCBuYW1lKTsKPiAr CWlndF9pbmZvKCJcdC1pXHRkdW1wIGluZm9cbiIpOwo+ICsJaWd0X2luZm8oIlx0RGVmYXVsdCBp cyB0byByZXNwb25kIHRvIERQUi0xMjAgdGVzdHMuXG4iKTsKPiArCWV4aXQoKG9wdCAhPSAnaCcp ID8gLTEgOiAwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgY2xlYW51cF9kZWJ1Z2ZzKHZvaWQp Cj4gK3sKPiArCWZjbG9zZSh0ZXN0X2FjdGl2ZV9mcCk7Cj4gKwlmY2xvc2UodGVzdF9kYXRhX2Zw KTsKPiArCWZjbG9zZSh0ZXN0X3R5cGVfZnApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2F0 dHJpYnV0ZV9fKChub3JldHVybikpIGNsZWFudXBfYW5kX2V4aXQoaW50IHJldCkKPiArewo+ICsJ Y2xlYW51cF9kZWJ1Z2ZzKCk7Cj4gKwljbG9zZShkcm1fZmQpOwo+ICsJaWd0X2luZm8oIkNvbXBs aWFuY2UgdGVzdGluZyBBcHBsaWNhdGlvbiBFeGl0aW5nXG4iKTsKPiArCWV4aXQocmV0KTsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgY2xlYW51cF90ZXN0KHZvaWQpCj4gK3sKPiArCXZpZGVvX3Bh dHRlcm5fZmxhZyA9IGZhbHNlOwo+ICsJaGRpc3BsYXkgPSAwOwo+ICsJdmRpc3BsYXkgPSAwOwo+ ICsJYml0ZGVwdGggPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCByZWFkX3Rlc3RfcmVxdWVz dCh2b2lkKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfdHlwZTsKPiArCj4gKwl0ZXN0X3R5 cGUgPSBnZXRfdGVzdF90eXBlKCk7Cj4gKwlwcm9jZXNzX3Rlc3RfcmVxdWVzdCh0ZXN0X3R5cGUp Owo+ICsJY2xlYW51cF90ZXN0KCk7Cj4gKwljbGVhcl90ZXN0X2FjdGl2ZSgpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgZ2Jvb2xlYW4gdGVzdF9oYW5kbGVyKEdJT0NoYW5uZWwgKnNvdXJjZSwgR0lPQ29u ZGl0aW9uIGNvbmRpdGlvbiwKPiArCQkJICAgICBncG9pbnRlciBkYXRhKQo+ICt7Cj4gKwl1bnNp Z25lZCBsb25nIHRlc3RfYWN0aXZlOwo+ICsKPiArCXJld2luZCh0ZXN0X2FjdGl2ZV9mcCk7Cj4g Kwlmc2NhbmYodGVzdF9hY3RpdmVfZnAsICIlbHgiLCAmdGVzdF9hY3RpdmUpOwo+ICsJaWYgKHRl c3RfYWN0aXZlKQo+ICsJCXJlYWRfdGVzdF9yZXF1ZXN0KCk7Cj4gKwlyZXR1cm4gVFJVRTsKPiAr fQo+ICsKPiArc3RhdGljIGdib29sZWFuIGlucHV0X2V2ZW50KEdJT0NoYW5uZWwgKnNvdXJjZSwg R0lPQ29uZGl0aW9uIGNvbmRpdGlvbiwKPiArCQkJCWdwb2ludGVyIGRhdGEpCj4gK3sKPiArCWdj aGFyIGJ1ZlsyXTsKPiArCWdzaXplIGNvdW50Owo+ICsKPiArCWNvdW50ID0gcmVhZChnX2lvX2No YW5uZWxfdW5peF9nZXRfZmQoc291cmNlKSwgYnVmLCBzaXplb2YoYnVmKSk7Cj4gKwlpZiAoYnVm WzBdID09ICdxJyAmJiAoY291bnQgPT0gMSB8fCBidWZbMV0gPT0gJ1xuJykpIHsKPiArCQljbGVh bnVwX2FuZF9leGl0KDApOwo+ICsJfQo+ICsKPiArCXJldHVybiBUUlVFOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBlbnRlcl9leGVjX3BhdGgoY2hhciAqKmFyZ3YpCj4gK3sKPiArCWNoYXIgKmV4 ZWNfcGF0aCA9IE5VTEw7Cj4gKwljaGFyICpwb3MgPSBOVUxMOwo+ICsJc2hvcnQgbGVuX3BhdGgg PSAwOwo+ICsJaW50IHJldDsKPiArCj4gKwlsZW5fcGF0aCA9IHN0cmxlbihhcmd2WzBdKTsKPiAr CWV4ZWNfcGF0aCA9IChjaGFyICopIG1hbGxvYyhsZW5fcGF0aCk7Cj4gKwo+ICsJbWVtY3B5KGV4 ZWNfcGF0aCwgYXJndlswXSwgbGVuX3BhdGgpOwo+ICsJcG9zID0gc3RycmNocihleGVjX3BhdGgs ICcvJyk7Cj4gKwlpZiAocG9zICE9IE5VTEwpCj4gKwkJKihwb3MrMSkgPSAnXDAnOwo+ICsKPiAr CXJldCA9IGNoZGlyKGV4ZWNfcGF0aCk7Cj4gKwlpZ3RfYXNzZXJ0X2VxKHJldCwgMCk7Cj4gKwlm cmVlKGV4ZWNfcGF0aCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJlc3RvcmVfdGVybWlvX21v ZGUoaW50IHNpZykKPiArewo+ICsJdGNzZXRhdHRyKHRpb19mZCwgVENTQU5PVywgJnNhdmVkX3Rp byk7Cj4gKwljbG9zZSh0aW9fZmQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzZXRfdGVybWlv X21vZGUodm9pZCkKPiArewo+ICsJc3RydWN0IHRlcm1pb3MgdGlvOwo+ICsKPiArCS8qIGRvbid0 IGF0dGVtcHQgdG8gc2V0IHRlcm1pbmFsIGF0dHJpYnV0ZXMgaWYgbm90IGluIHRoZSBmb3JlZ3Jv dW5kCj4gKwkgKiBwcm9jZXNzIGdyb3VwCj4gKwkgKi8KPiArCWlmIChnZXRwZ3JwKCkgIT0gdGNn ZXRwZ3JwKFNURE9VVF9GSUxFTk8pKQo+ICsJCXJldHVybjsKPiArCj4gKwl0aW9fZmQgPSBkdXAo U1RESU5fRklMRU5PKTsKPiArCXRjZ2V0YXR0cih0aW9fZmQsICZzYXZlZF90aW8pOwo+ICsJaWd0 X2luc3RhbGxfZXhpdF9oYW5kbGVyKHJlc3RvcmVfdGVybWlvX21vZGUpOwo+ICsJdGlvID0gc2F2 ZWRfdGlvOwo+ICsJdGlvLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKPiArCXRjc2V0YXR0 cih0aW9fZmQsIFRDU0FOT1csICZ0aW8pOwo+ICt9Cj4gKwo+ICtpbnQgbWFpbihpbnQgYXJnYywg Y2hhciAqKmFyZ3YpCj4gK3sKPiArCWludCBjOwo+ICsJaW50IHJldCA9IDA7Cj4gKwlHSU9DaGFu bmVsICpzdGRpbmNoYW5uZWwsICp0ZXN0YWN0aXZlX2NoYW5uZWw7Cj4gKwlHTWFpbkxvb3AgKm1h aW5sb29wOwo+ICsJYm9vbCBvcHRfZHVtcF9pbmZvID0gZmFsc2U7Cj4gKwlzdHJ1Y3Qgb3B0aW9u IGxvbmdfb3B0c1tdID0gewo+ICsJCXsiaGVscC1kZXNjcmlwdGlvbiIsIDAsIDAsIEhFTFBfREVT Q1JJUFRJT059LAo+ICsJCXsiaGVscCIsIDAsIDAsICdoJ30sCj4gKwl9Owo+ICsKPiArCWlndF9z a2lwX29uX3NpbXVsYXRpb24oKTsKPiArCj4gKwllbnRlcl9leGVjX3BhdGgoYXJndik7Cj4gKwo+ ICsJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgb3B0c3RyLCBsb25nX29wdHMs IE5VTEwpKSAhPSAtMSkgewo+ICsJCXN3aXRjaCAoYykgewo+ICsJCWNhc2UgJ2knOgo+ICsJCQlv cHRfZHVtcF9pbmZvID0gdHJ1ZTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBIRUxQX0RFU0NSSVBU SU9OOgo+ICsJCQlpZ3RfaW5mbygiRFAgQ29tcGxpYW5jZSBUZXN0IFN1aXRlIHVzaW5nIERQUi0x MjBcbiIpOwo+ICsJCQlpZ3RfaW5mbygiRURJRCBUZXN0c1xuIik7Cj4gKwkJCWlndF9pbmZvKCJW aWRlbyBQYXR0ZXJuIEdlbmVyYXRpb24gVGVzdHNcbiIpOwo+ICsJCQlleGl0KDApOwo+ICsJCQli cmVhazsKPiArCQlkZWZhdWx0Ogo+ICsJCQkvKiBmYWxsIHRocm91Z2ggKi8KPiArCQljYXNlICdo JzoKPiArCQkJdXNhZ2UoYXJndlswXSwgYyk7Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCX0KPiAr Cj4gKwlzZXRfdGVybWlvX21vZGUoKTsKPiArCj4gKwlpZ3RfaW5mbygiKioqKioqKioqKioqKkRQ IENvbXBsaWFuY2UgVGVzdGluZyB1c2luZyBEUFItMTIwKioqKioqKioqKioqKlxuIik7Cj4gKwlp Z3RfaW5mbygiV2FpdGluZyBmb3IgVGVzdCBSZXF1ZXN0IElucHV0Li4uLi4uXG4iKTsKPiArCWRy bV9mZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfQU5ZKTsKPiArCj4gKwlpZiAob3B0X2R1bXBf aW5mbykgewo+ICsJCWR1bXBfaW5mbygpOwo+ICsJCWdvdG8gb3V0X2Nsb3NlOwo+ICsJfQo+ICsK PiArCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsKPiArCXNldHVwX2RlYnVnZnNfZmls ZXMoKTsKPiArCWNsZWFudXBfdGVzdCgpOwo+ICsKPiArCW1haW5sb29wID0gZ19tYWluX2xvb3Bf bmV3KE5VTEwsIEZBTFNFKTsKPiArCWlmICghbWFpbmxvb3ApIHsKPiArCQlpZ3Rfd2FybigiZmFp bGVkIHRvIGNyZWF0ZSBnbGliIG1haW5sb29wXG4iKTsKPiArCQlyZXQgPSAtMTsKPiArCQlnb3Rv IG91dF9jbG9zZTsKPiArCX0KPiArCj4gKwlpZiAoIWludGVsX2RwX2NvbXBsaWFuY2Vfc2V0dXBf aG90cGx1ZygpKSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBpbml0aWFsaXplIGhvdHBsdWcg c3VwcG9ydFxuIik7Cj4gKwkJZ290byBvdXRfbWFpbmxvb3A7Cj4gKwl9Cj4gKwo+ICsJdGVzdGFj dGl2ZV9jaGFubmVsID0gZ19pb19jaGFubmVsX3VuaXhfbmV3KGZpbGVubyh0ZXN0X2FjdGl2ZV9m cCkpOwo+ICsJaWYgKCF0ZXN0YWN0aXZlX2NoYW5uZWwpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVk IHRvIGNyZWF0ZSBUZXN0IEFjdGl2ZSBHSU8gY2hhbm5lbFxuIik7Cj4gKwkJZ290byBvdXRfY2xv c2U7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZ19pb19hZGRfd2F0Y2godGVzdGFjdGl2ZV9jaGFubmVs LCBHX0lPX0lOIHwgR19JT19FUlIsIHRlc3RfaGFuZGxlciwKPiArCQkJICAgICBOVUxMKTsKPiAr CWlmIChyZXQgPCAwKSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBhZGQgd2F0Y2ggb24gdWRl diBHSU8gY2hhbm5lbFxuIik7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4gKwo+ICsJc3Rk aW5jaGFubmVsID0gZ19pb19jaGFubmVsX3VuaXhfbmV3KDApOwo+ICsJaWYgKCFzdGRpbmNoYW5u ZWwpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBzdGRpbiBHSU8gY2hhbm5lbFxu Iik7Cj4gKwkJZ290byBvdXRfaG90cGx1ZzsKPiArCX0KPiArCj4gKwlyZXQgPSBnX2lvX2FkZF93 YXRjaChzdGRpbmNoYW5uZWwsIEdfSU9fSU4gfCBHX0lPX0VSUiwgaW5wdXRfZXZlbnQsCj4gKwkJ CSAgICAgTlVMTCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8g YWRkIHdhdGNoIG9uIHN0ZGluIEdJTyBjaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dF9zdGRpbzsK PiArCX0KPiArCj4gKwlyZXQgPSAwOwo+ICsKPiArCWdfbWFpbl9sb29wX3J1bihtYWlubG9vcCk7 Cj4gKwo+ICtvdXRfc3RkaW86Cj4gKwlnX2lvX2NoYW5uZWxfc2h1dGRvd24oc3RkaW5jaGFubmVs LCBUUlVFLCBOVUxMKTsKPiArb3V0X2hvdHBsdWc6Cj4gKwlpbnRlbF9kcF9jb21wbGlhbmNlX2Ns ZWFudXBfaG90cGx1ZygpOwo+ICtvdXRfbWFpbmxvb3A6Cj4gKwlnX21haW5fbG9vcF91bnJlZiht YWlubG9vcCk7Cj4gK291dF9jbG9zZToKPiArCWNsZWFudXBfZGVidWdmcygpOwo+ICsJY2xvc2Uo ZHJtX2ZkKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2VxKHJldCwgMCk7Cj4gKwo+ICsJaWd0X2luZm8o IkNvbXBsaWFuY2UgdGVzdGluZyBhcHBsaWNhdGlvbiBleGl0aW5nLlxuIik7Cj4gKwlpZ3RfZXhp dCgpOwo+ICt9Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaCBiL3Rv b2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXgg MDAwMDAwMC4uYWRlMWUyZgo+IC0tLSAvZGV2L251bGwKPiArKysgYi90b29scy9pbnRlbF9kcF9j b21wbGlhbmNlLmgKPiBAQCAtMCwwICsxLDM1IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAyMDEw IEludGVsIENvcnBvcmF0aW9uCj4gKyAqIE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBp bnRlbC5jb20+Cj4gKyAqCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUg b2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBz b2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJl IiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGlu Y2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHks IG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3Qg dG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBp bgo+ICsgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2Fy ZS4KPiArICoKPiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQg V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiArICogSU1QTElFRCwgSU5DTFVESU5H IEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4g KyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQu IElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJT IEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElU WSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBB UklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRX QVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8c3RyaW5nLmg+Cj4g KyNpbmNsdWRlIDxzdGRsaWIuaD4KPiArI2luY2x1ZGUgPGdsaWIuaD4KPiArCj4gK2V4dGVybiBp bnQgZHJtX2ZkOwo+ICsKPiArZ2Jvb2xlYW4gaW50ZWxfZHBfY29tcGxpYW5jZV9zZXR1cF9ob3Rw bHVnKHZvaWQpOwo+ICt2b2lkIGludGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51cF9ob3RwbHVnKHZv aWQpOwo+ICsKPiArLyogY2FsbGVkIGJ5IHRoZSBob3RwbHVnIGNvZGUgKi8KPiAraW50IHVwZGF0 ZV9kaXNwbGF5KGludCBtb2RlLCBib29sIGlzX2NvbXBsaWFuY2VfdGVzdCk7Cj4gZGlmZiAtLWdp dCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIGIvdG9vbHMvaW50ZWxfZHBf Y29tcGxpYW5jZV9ob3RwbHVnLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAw MDAuLmQ0ODkwMjYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMvaW50ZWxfZHBfY29tcGxp YW5jZV9ob3RwbHVnLmMKPiBAQCAtMCwwICsxLDEyMyBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQg MjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVz QGludGVsLmNvbT4KPiArICoKPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKPiArICogY29weSBvZiB0aGlz IHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdh cmUiKSwKPiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwg aW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPiArICog YW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25z IHRvIHdob20gdGhlCj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVj dCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVk IGluCj4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3 YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9V VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK PiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVO VC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERF UlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElBQklM SVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0Us IEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09G VFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdBUkUu Cj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgImlndC5oIgo+ICsjaW5jbHVkZSA8c3RkaW8uaD4KPiAr I2luY2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4gKwo+ICsjaW5jbHVk ZSA8c3lzL3N0YXQuaD4KPiArCj4gKyNpbmNsdWRlICJpbnRlbF9kcF9jb21wbGlhbmNlLmgiCj4g KyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+Cj4gK3N0YXRpYyBzdHJ1Y3QgdWRldl9tb25pdG9yICp1ZXZl bnRfbW9uaXRvcjsKPiArc3RhdGljIHN0cnVjdCB1ZGV2ICp1ZGV2Owo+ICtzdGF0aWMgR0lPQ2hh bm5lbCAqdWRldmNoYW5uZWw7Cj4gKwo+ICtzdGF0aWMgZ2Jvb2xlYW4gaG90cGx1Z19ldmVudChH SU9DaGFubmVsICpzb3VyY2UsIEdJT0NvbmRpdGlvbiBjb25kaXRpb24sCj4gKwkJCSAgICAgIGdw b2ludGVyIGRhdGEpCj4gK3sKPiArCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2Owo+ICsJZGV2X3Qg dWRldl9kZXZudW07Cj4gKwlzdHJ1Y3Qgc3RhdCBzOwo+ICsJY29uc3QgY2hhciAqaG90cGx1ZzsK PiArCj4gKwlkZXYgPSB1ZGV2X21vbml0b3JfcmVjZWl2ZV9kZXZpY2UodWV2ZW50X21vbml0b3Ip Owo+ICsJaWYgKCFkZXYpCj4gKwkJZ290byBvdXQ7Cj4gKwo+ICsJdWRldl9kZXZudW0gPSB1ZGV2 X2RldmljZV9nZXRfZGV2bnVtKGRldik7Cj4gKwlmc3RhdChkcm1fZmQsICZzKTsKPiArCj4gKwlo b3RwbHVnID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3ZhbHVlKGRldiwgIkhPVFBMVUciKTsK PiArCj4gKwlpZiAobWVtY21wKCZzLnN0X3JkZXYsICZ1ZGV2X2Rldm51bSwgc2l6ZW9mKGRldl90 KSkgPT0gMCAmJgo+ICsJICAgIGhvdHBsdWcgJiYgYXRvaShob3RwbHVnKSA9PSAxKQo+ICsJCXVw ZGF0ZV9kaXNwbGF5KDAsIGZhbHNlKTsKPiArCj4gKwl1ZGV2X2RldmljZV91bnJlZihkZXYpOwo+ ICtvdXQ6Cj4gKwlyZXR1cm4gVFJVRTsKPiArfQo+ICsKPiArCj4gK2dib29sZWFuIGludGVsX2Rw X2NvbXBsaWFuY2Vfc2V0dXBfaG90cGx1Zyh2b2lkKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiAr CXVkZXYgPSB1ZGV2X25ldygpOwo+ICsJaWYgKCF1ZGV2KSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxl ZCB0byBjcmVhdGUgdWRldiBvYmplY3RcbiIpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiAr CXVldmVudF9tb25pdG9yID0gdWRldl9tb25pdG9yX25ld19mcm9tX25ldGxpbmsodWRldiwgInVk ZXYiKTsKPiArCWlmICghdWV2ZW50X21vbml0b3IpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRv IGNyZWF0ZSB1ZGV2IGV2ZW50IG1vbml0b3JcbiIpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsK PiArCXJldCA9IHVkZXZfbW9uaXRvcl9maWx0ZXJfYWRkX21hdGNoX3N1YnN5c3RlbV9kZXZ0eXBl KHVldmVudF9tb25pdG9yLAo+ICsJCQkJCQkJICAgICAgImRybSIsCj4gKwkJCQkJCQkgICAgICAi ZHJtX21pbm9yIik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8g ZmlsdGVyIGZvciBkcm0gZXZlbnRzXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwly ZXQgPSB1ZGV2X21vbml0b3JfZW5hYmxlX3JlY2VpdmluZyh1ZXZlbnRfbW9uaXRvcik7Cj4gKwlp ZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8gZW5hYmxlIHVkZXYgZXZlbnQg cmVjZXB0aW9uXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwl1ZGV2Y2hhbm5lbCA9 Cj4gKwkJZ19pb19jaGFubmVsX3VuaXhfbmV3KHVkZXZfbW9uaXRvcl9nZXRfZmQodWV2ZW50X21v bml0b3IpKTsKPiArCWlmICghdWRldmNoYW5uZWwpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRv IGNyZWF0ZSB1ZGV2IEdJTyBjaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4g KwlyZXQgPSBnX2lvX2FkZF93YXRjaCh1ZGV2Y2hhbm5lbCwgR19JT19JTiB8IEdfSU9fRVJSLCBo b3RwbHVnX2V2ZW50LAo+ICsJCQkgICAgIHVkZXYpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlp Z3Rfd2FybigiZmFpbGVkIHRvIGFkZCB3YXRjaCBvbiB1ZGV2IEdJTyBjaGFubmVsXG4iKTsKPiAr CQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlyZXR1cm4gVFJVRTsKPiArCj4gK291dDoKPiArCWlu dGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51cF9ob3RwbHVnKCk7Cj4gKwlyZXR1cm4gRkFMU0U7Cj4g K30KPiArCj4gK3ZvaWQgaW50ZWxfZHBfY29tcGxpYW5jZV9jbGVhbnVwX2hvdHBsdWcodm9pZCkK PiArewo+ICsJaWYgKHVkZXZjaGFubmVsKQo+ICsJCWdfaW9fY2hhbm5lbF9zaHV0ZG93bih1ZGV2 Y2hhbm5lbCwgVFJVRSwgTlVMTCk7Cj4gKwlpZiAodWV2ZW50X21vbml0b3IpCj4gKwkJdWRldl9t b25pdG9yX3VucmVmKHVldmVudF9tb25pdG9yKTsKPiArCWlmICh1ZGV2KQo+ICsJCXVkZXZfdW5y ZWYodWRldik7Cj4gK30KCi0tIApKYW5pIE5pa3VsYSwgSW50ZWwgT3BlbiBTb3VyY2UgVGVjaG5v bG9neSBDZW50ZXIKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4 Cg==