From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mblankhorst.nl (mblankhorst.nl [141.105.120.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 23F6C6E46B for ; Thu, 28 Mar 2019 18:08:49 +0000 (UTC) From: Maarten Lankhorst Date: Thu, 28 Mar 2019 19:08:45 +0100 Message-Id: <20190328180845.3905-3-maarten.lankhorst@linux.intel.com> In-Reply-To: <20190328180845.3905-1-maarten.lankhorst@linux.intel.com> References: <20190328180845.3905-1-maarten.lankhorst@linux.intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t 3/3] tests/kms_yuv: Add yuv specific tests, v4. List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org List-ID: QWRkIHRlc3RzIGV4Y2VyY2lzaW5nIHN3aXRjaGluZyBiZXR3ZWVuIHZhcmlvdXMgc2NhbGVkL3Vu c2NhbGVkCnRyYW5zaXRpb25zIHRvIGFuZCBmcm9tIHZhcmlvdXMgbnYxMiBmb3JtYXRzLCBzaW5j ZSBzb21lIG9mIHRoZQp3b3JrYXJvdW5kcyBtZW50aW9uIHRoaXMgbWF5IGZhaWwuCgpXZSBhbHNv IGFkZCBOVjEyIHNwZWNpZmljIGNsaXBwaW5nL3NjYWxpbmcgdGVzdHMsIHRvIG1ha2Ugc3VyZQp0 aGF0IFlVViBzcmMgY29vcmRpbmF0ZXMgYXJlIGFsd2F5cyBwcm9ncmFtbWVkIGFzIGEgbXVsdGlw bGUgb2YgMgpjb3JyZWN0bHksIGFuZCB2ZXJpZnkgc2NhbGluZy9jbGlwcGluZyB3b3JrcyB3aXRo IENSQyB0ZXN0cy4KCmNyb3Atc2NhbGUtYnVnIHNob3dzIGEgY29ycnVwdGlvbiB3aGVuIHNjYWxp bmcgYW5kIGNyb3BwaW5nIGF0IHRoZQpzYW1lIHRpbWUuCgpUaGUgc3VicGl4ZWwgY2xpcCB0ZXN0 IHJvdGF0ZXMgYW5kIGNsaXBzIGEgcmVjdGFuZ2xlIG9uIGVhY2ggc2lkZSwKd2hpY2ggc2hvdWxk IHByb2R1Y2UgdGhlIHNhbWUgQ1JDIGFzIHdoZW4gdGhhdCBwYXJ0IG9mIHRoZSByZWN0YW5nbGUK aXMgaGlkZGVuIGJ5IGEgY3Vyc29yIGFuZCBhIHdob2xlIDJ4MiBwaXhlbCBpcyBoaWRkZW4uCgpD aGFuZ2VzIHNpbmNlIHYxOgotIFJlc2V0IHBsYW5lIHBvc2l0aW9uIHRvIDAsMCBhdCB0aGUgc3Rh cnQgb2YgeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKCkuCi0gSGFuZGxlIFN3YXRpJ3MgZmVlZGJhY2su CkNoYW5nZXMgc2luY2UgdjI6Ci0gU2tpcCA5MMKwLzI3MMKwIHJvdGF0aW9uIGluIHRlc3RzIHdo ZW4gZm9ybWF0cyBkb24ndCBzdXBwb3J0IGl0LgotIEFkZCBhbGwgbmV3IEhEUiBmb3JtYXRzIHRv IHRlc3QuCi0gVXNlIGlndF9wbGFuZV9oYXNfZm9ybWF0X21vZC4KLSBTdXBwb3J0IHRlc3RzIG9u ICFpOTE1IGJ5IGNoZWNraW5nIGlmIFgvWSB0aWxpbmcgbW9kaWZpZXJzIGFyZSBzdXBwb3J0ZWQu Ci0gRG8gbm90IGVuYWJsZSB1bnRlc3RlZCBwbGFuZXMgdG8gcHJldmVudCBleGhhdXNpbmcgbWVt b3J5IGJhbmR3aWR0aAogIGFuZCBhdmFpbGFibGUgTlYxMiBZIHBsYW5lcyBpbiB0aGUgcmdiLXN3 aXRjaC1zY2FsZWQgdGVzdC4KQ2hhbmdlcyBzaW5jZSB2MzoKLSBBZGQgYSBzYW5pdHkgdGVzdCB0 byBzYW5pdHkgdGVzdCBZVVYgY29udmVyc2lvbiBwYXRocywgb24gYWxsIHBsYW5lcyBhbmQgcGlw ZXMuCi0gRHluYW1pY2FsbHkgZ2VuZXJhdGUgbGlzdCBvZiBZVVYgdGVzdHMgdGhyb3VnaCBpZ3Rf Zm9ybWF0X2FycmF5X2ZpbGwuCgpTaWduZWQtb2ZmLWJ5OiBNYWFydGVuIExhbmtob3JzdCA8bWFh cnRlbi5sYW5raG9yc3RAbGludXguaW50ZWwuY29tPgotLS0KIHRlc3RzL01ha2VmaWxlLnNvdXJj ZXMgfCAgIDEgKwogdGVzdHMva21zX3l1di5jICAgICAgICB8IDk0MiArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogdGVzdHMvbWVzb24uYnVpbGQgICAgICB8ICAgMSAr CiAzIGZpbGVzIGNoYW5nZWQsIDk0NCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQg dGVzdHMva21zX3l1di5jCgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rl c3RzL01ha2VmaWxlLnNvdXJjZXMKaW5kZXggNzFjY2YwMGFmMjU2Li41ZWI0NjA4N2UzNjIgMTAw NjQ0Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZpbGUuc291 cmNlcwpAQCAtNzQsNiArNzQsNyBAQCBURVNUU19wcm9ncyA9IFwKIAlrbXNfdW5pdmVyc2FsX3Bs YW5lIFwKIAlrbXNfdmJsYW5rIFwKIAlrbXNfdnJyIFwKKwlrbXNfeXV2IFwKIAltZXRhX3Rlc3Qg XAogCXBlcmYgXAogCXBlcmZfcG11IFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2ttc195dXYuYyBiL3Rl c3RzL2ttc195dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjAw NzdhMDdhNzNmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ttc195dXYuYwpAQCAtMCwwICsx LDk0MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE5IEludGVsIENvcnBvcmF0aW9uCisgKgor ICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBw ZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRl ZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRo ZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0 aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwg ZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29m dHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMg ZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoK KyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5v dGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBw b3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVE ICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVS Q0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5P TklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlS SUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisg KiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9U SEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBU SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRX QVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBNYWFydGVuIExhbmtob3JzdCA8bWFhcnRlbi5s YW5raG9yc3RAbGludXguaW50ZWwuY29tPgorICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNp bmNsdWRlICJpZ3QuaCIKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPGVycm5vLmg+Cisj aW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3Rp bWUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWlndF9kaXNwbGF5X3QgZGlzcGxheTsKKworCWln dF9waXBlX2NyY190ICpwaXBlX2NyYzsKKwlzdHJ1Y3QgaWd0X2ZiIGZiWzZdOworfSBkYXRhX3Q7 CisKK3N0YXRpYyB1aW50NjRfdCB4X21vZGlmaWVyID0gTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9O RTsKK3N0YXRpYyB1aW50NjRfdCB5X21vZGlmaWVyID0gTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9O RTsKK3N0YXRpYyB1aW50MzJfdCAqZm9ybWF0cywgY291bnRfZm9ybWF0czsKKworc3RhdGljIGJv b2wgcGlwZV9zdXBwb3J0c19mb3JtYXQoaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSwgZW51bSBwaXBl IHBpcGUsCisJCQkJIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdGlsaW5nKQoreworCWlndF9w bGFuZV90ICpwbGFuZTsKKworCWZvcl9lYWNoX3BsYW5lX29uX3BpcGUoZGlzcGxheSwgcGlwZSwg cGxhbmUpCisJCWlmIChpZ3RfcGxhbmVfaGFzX2Zvcm1hdF9tb2QocGxhbmUsIGZvcm1hdCwgdGls aW5nKSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisKK3N0YXRpYyB2 b2lkIHJlbW92ZV9mYnMoZGF0YV90ICpkYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUoZGF0YS0+ZmIpOyBpKyspCisJCWlndF9yZW1vdmVfZmIoZGF0YS0+ZGlz cGxheS5kcm1fZmQsICZkYXRhLT5mYltpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfY3J0 YyhkYXRhX3QgKmRhdGEsIGVudW0gcGlwZSBwaXBlLCBpZ3Rfb3V0cHV0X3QgKm91dHB1dCkKK3sK KwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisKKwlyZW1vdmVfZmJz KGRhdGEpOworCWlndF9kaXNwbGF5X3Jlc2V0KGRpc3BsYXkpOworCWlndF9vdXRwdXRfc2V0X3Bp cGUob3V0cHV0LCBwaXBlKTsKKwlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9B VE9NSUMpOworCisJaWd0X3BpcGVfY3JjX2ZyZWUoZGF0YS0+cGlwZV9jcmMpOworCWRhdGEtPnBp cGVfY3JjID0gaWd0X3BpcGVfY3JjX25ldyhkaXNwbGF5LT5kcm1fZmQsIHBpcGUsCisJCQkJCSAg SU5URUxfUElQRV9DUkNfU09VUkNFX0FVVE8pOworfQorCitzdGF0aWMgdm9pZCBmdWRnZV9sdXQo ZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSwgdWludDE2X3QgbWFzaykKK3sKKwlpZ3RfcGlw ZV90ICpwaXBlX29iaiA9ICZkYXRhLT5kaXNwbGF5LnBpcGVzW3BpcGVdOworCXVpbnQxNl90ICps dXQ7CisJaW50IGksIGx1dF9zaXplOworCisJaWYgKCFpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocGlw ZV9vYmosIElHVF9DUlRDX0dBTU1BX0xVVF9TSVpFKSkKKwkJcmV0dXJuOworCisJbHV0X3NpemUg PSBpZ3RfcGlwZV9vYmpfZ2V0X3Byb3AocGlwZV9vYmosIElHVF9DUlRDX0dBTU1BX0xVVF9TSVpF KTsKKworCWx1dCA9IG1hbGxvYyhzaXplb2YodWludDE2X3QpICogbHV0X3NpemUpOworCWZvciAo aSA9IDA7IGkgPCBsdXRfc2l6ZTsgaSsrKQorCQlsdXRbaV0gPSAoaSAqIDB4ZmZmZiAvIChsdXRf c2l6ZSAtIDEpKSAmIG1hc2s7CisKKwlpZ3RfcGlwZV9vYmpfcmVwbGFjZV9wcm9wX2Jsb2IocGlw ZV9vYmosIElHVF9DUlRDX0dBTU1BX0xVVCwgbHV0LCBsdXRfc2l6ZSAqIHNpemVvZih1aW50MTZf dCkpOworCWZyZWUobHV0KTsKKworCWlmIChpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocGlwZV9vYmos IElHVF9DUlRDX0RFR0FNTUFfTFVUKSkKKwkJaWd0X3BpcGVfb2JqX3JlcGxhY2VfcHJvcF9ibG9i KHBpcGVfb2JqLCBJR1RfQ1JUQ19ERUdBTU1BX0xVVCwgTlVMTCwgMCk7CisKKwlpZiAoaWd0X3Bp cGVfb2JqX2hhc19wcm9wKHBpcGVfb2JqLCBJR1RfQ1JUQ19DVE0pKQorCQlpZ3RfcGlwZV9vYmpf cmVwbGFjZV9wcm9wX2Jsb2IocGlwZV9vYmosIElHVF9DUlRDX0NUTSwgTlVMTCwgMCk7Cit9CisK K3N0YXRpYyB2b2lkIHVuZnVkZ2VfbHV0KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUpCit7 CisJaWd0X3BpcGVfdCAqcGlwZV9vYmogPSAmZGF0YS0+ZGlzcGxheS5waXBlc1twaXBlXTsKKwor CWlmIChpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocGlwZV9vYmosIElHVF9DUlRDX0dBTU1BX0xVVCkp CisJCWlndF9waXBlX29ial9yZXBsYWNlX3Byb3BfYmxvYihwaXBlX29iaiwgSUdUX0NSVENfR0FN TUFfTFVULCBOVUxMLCAwKTsKK30KKworLyoKKyAqIFRlc3QgdGhhdCB3ZSBpbml0aWFsaXplIGEg WVVWIGZiIGFzIGJsYWNrIGNvcnJlY3RseSwKKyAqIHRoYXQgd2hlbiB3ZSB3cml0ZSBhIGJsYWNr IEZCIGl0IHdpbGwgZ2V0IHRoZSBzYW1lIENSQywgYW5kIHRoYXQKKyAqIGFsbCBjb2xvcnMgd2Ug dGVzdCB3aWxsIGdpdmUgdGhlIHNhbWUgQ1JDIG9uIGFsbCBmb3JtYXRzLgorICovCitzdGF0aWMg dm9pZCB5dXZfc2FuaXR5KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGlndF9vdXRwdXRf dCAqb3V0cHV0KQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsK KwlpZ3RfcGxhbmVfdCAqcGxhbmU7CisJaWd0X2NyY190IGJsYWNrX2NyYywgY29sb3JfY3JjLCBj cmM7CisJYm9vbCBmaXJzdCA9IHRydWU7CisKKwlwcmVwYXJlX2NydGMoZGF0YSwgcGlwZSwgb3V0 cHV0KTsKKworCWZvcl9lYWNoX3BsYW5lX29uX3BpcGUoZGlzcGxheSwgcGlwZSwgcGxhbmUpIHsK KwkJaWd0X2luZm8oIlRlc3RpbmcgcGxhbmUgJWRcbiIsIHBsYW5lLT5pbmRleCk7CisJCWZvciAo aW50IGkgPSAwOyBpIDwgY291bnRfZm9ybWF0czsgaSsrKSB7CisJCQlzdHJ1Y3QgaWd0X2ZiICpm YiA9ICZkYXRhLT5mYlswXTsKKwkJCWNhaXJvX3QgKmNyOworCisJCQlpZiAoIWlndF9mb3JtYXRf aXNfeXV2KGZvcm1hdHNbaV0pIHx8CisJCQkgICAgIWlndF9wbGFuZV9oYXNfZm9ybWF0X21vZChw bGFuZSwgZm9ybWF0c1tpXSwgeF9tb2RpZmllcikpCisJCQkJY29udGludWU7CisKKwkJCWlndF9p bmZvKCJUZXN0aW5nICVzIGZvcm1hdCAlLjRzXG4iLCBmaXJzdCA/ICJmaXJzdCIgOiAib3RoZXIi LCAoY2hhciAqKSZmb3JtYXRzW2ldKTsKKwkJCWlndF9jcmVhdGVfZmIoZGlzcGxheS0+ZHJtX2Zk LCAyNTYsIDI1NiwgZm9ybWF0c1tpXSwKKwkJCQkgICAgICB4X21vZGlmaWVyLCBmYik7CisKKwkJ CWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIGZiKTsKKwkJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlz cGxheSwgQ09NTUlUX0FUT01JQyk7CisJCQlpZiAoIWZpcnN0KSB7CisJCQkJaWd0X3BpcGVfY3Jj X2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjKTsKKwkJCQlpZ3RfYXNzZXJ0X2NyY19l cXVhbCgmYmxhY2tfY3JjLCAmY3JjKTsKKwkJCX0gZWxzZSB7CisJCQkJaWd0X3BpcGVfY3JjX2Nv bGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmYmxhY2tfY3JjKTsKKwkJCX0KKworCQkJLyogQ29t cGFyZSBpbml0aWFsIGJsYWNrIGZiIHdpdGggcmVmZXJlbmNlIHBhaW50ZWQgYmxhY2sgY29sb3Ig Ki8KKwkJCWNyID0gaWd0X2dldF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlp Z3RfcGFpbnRfY29sb3IoY3IsIDAsIDAsIGZiLT53aWR0aCwgZmItPmhlaWdodCwgMC4sIDAuLCAw Lik7CisJCQlpZ3RfcHV0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGZiLCBjcik7CisJCQlp Z3RfZGlydHlfZmIoZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3Rfd2FpdF9mb3JfdmJsYW5r KGRpc3BsYXktPmRybV9mZCwgcGlwZSk7CisJCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0 YS0+cGlwZV9jcmMsICZjcmMpOworCQkJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmJsYWNrX2NyYywg JmNyYyk7CisKKworCQkJLyogV3JpdGUgYSBjb2xvciBmYiAqLworCQkJY3IgPSBpZ3RfZ2V0X2Nh aXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGZiKTsKKwkJCWlndF9wYWludF9jb2xvcihjciwgMCwg MCwgZmItPndpZHRoLCBmYi0+aGVpZ2h0LCAxLiwgMS4sIDAuKTsKKwkJCWlndF9wdXRfY2Fpcm9f Y3R4KGRpc3BsYXktPmRybV9mZCwgZmIsIGNyKTsKKwkJCWZ1ZGdlX2x1dChkYXRhLCBwaXBlLCAw eGZjMDApOworCQkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgZmIpOworCQkJaWd0X2Rpc3BsYXlf Y29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKworCQkJaWYgKCFmaXJzdCkgeworCQkJ CWlndF9waXBlX2NyY19jb2xsZWN0X2NyYyhkYXRhLT5waXBlX2NyYywgJmNyYyk7CisJCQkJaWd0 X2Fzc2VydF9jcmNfZXF1YWwoJmNvbG9yX2NyYywgJmNyYyk7CisJCQl9IGVsc2UgeworCQkJCWln dF9waXBlX2NyY19jb2xsZWN0X2NyYyhkYXRhLT5waXBlX2NyYywgJmNvbG9yX2NyYyk7CisJCQkJ Zmlyc3QgPSBmYWxzZTsKKwkJCX0KKworCQkJLyogQ29udmVydCBmcm9tIFlVViwgYmFjayB0byBZ VVYsIHRvIGV4cG9zZSBidWdzIGluIGNvbnZlcnNpb24gcm91dGluZXMgKi8KKwkJCWNyID0gaWd0 X2dldF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3RfcHV0X2NhaXJvX2N0 eChkaXNwbGF5LT5kcm1fZmQsIGZiLCBjcik7CisJCQlpZ3RfZGlydHlfZmIoZGlzcGxheS0+ZHJt X2ZkLCBmYik7CisJCQlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGRpc3BsYXktPmRybV9mZCwgcGlwZSk7 CisJCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZjcmMpOworCQkJ aWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNvbG9yX2NyYywgJmNyYyk7CisKKwkJCXVuZnVkZ2VfbHV0 KGRhdGEsIHBpcGUpOworCQkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgTlVMTCk7CisJCQlpZ3Rf cmVtb3ZlX2ZiKGRpc3BsYXktPmRybV9mZCwgJmRhdGEtPmZiWzBdKTsKKwkJfQorCX0KK30KKwor c3RhdGljIHZvaWQgc2V0X2ZiKGlndF9wbGFuZV90ICpwbGFuZSwgc3RydWN0IGlndF9mYiAqZmIs CisJCSAgIGJvb2wgc2NhbGVkLCBpZ3Rfcm90YXRpb25fdCByb3QpCit7CisJaWd0X3BsYW5lX3Nl dF9mYihwbGFuZSwgZmIpOworCisJaWYgKHNjYWxlZCAmJiBmYikKKwkJaWd0X2ZiX3NldF9zaXpl KGZiLCBwbGFuZSwgZmItPndpZHRoLCAxNik7CisKKwlpZ3RfcGxhbmVfc2V0X3JvdGF0aW9uKHBs YW5lLCByb3QpOworCWlmIChmYiAmJiAocm90ID09IElHVF9ST1RBVElPTl85MCB8fCByb3QgPT0g SUdUX1JPVEFUSU9OXzI3MCkpCisJCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgZmItPmhlaWdo dCwgZmItPndpZHRoKTsKK30KKworc3RhdGljIHZvaWQgeXV2X3JnYl9zd2l0Y2goZGF0YV90ICpk YXRhLCBlbnVtIHBpcGUgcGlwZSwKKwkJCSAgIGlndF9vdXRwdXRfdCAqb3V0cHV0LCBib29sIHNj YWxlZCwgdW5zaWduZWQgZm9ybWF0KQoreworCWRybU1vZGVNb2RlSW5mbyAqbW9kZSA9IGlndF9v dXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEt PmRpc3BsYXk7CisJaWd0X3BsYW5lX3QgKnBsYW5lOworCWludCBpOworCWlndF9jcmNfdCByZWZf Y3JjWzRdLCBjcmM7CisJYm9vbCB2YWxpZFs0XSA9IHt9OworCisJcHJlcGFyZV9jcnRjKGRhdGEs IHBpcGUsIG91dHB1dCk7CisKKwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2Zk LCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXksCisJCQkgICAgICBmb3JtYXQsIHhfbW9k aWZpZXIsICZkYXRhLT5mYlswXSk7CisKKwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ ZHJtX2ZkLCBtb2RlLT52ZGlzcGxheSwgbW9kZS0+aGRpc3BsYXksCisJCQkgICAgICBmb3JtYXQs IHlfbW9kaWZpZXIsICZkYXRhLT5mYlsxXSk7CisKKwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlz cGxheS0+ZHJtX2ZkLCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXksCisJCQkgICAgICBE Uk1fRk9STUFUX1hSR0I4ODg4LCB4X21vZGlmaWVyLCAmZGF0YS0+ZmJbMl0pOworCisJaWd0X2Ny ZWF0ZV9wYXR0ZXJuX2ZiKGRpc3BsYXktPmRybV9mZCwgbW9kZS0+dmRpc3BsYXksIG1vZGUtPmhk aXNwbGF5LAorCQkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwgeV9tb2RpZmllciwgJmRhdGEt PmZiWzNdKTsKKworCWZvcl9lYWNoX3BsYW5lX29uX3BpcGUoZGlzcGxheSwgcGlwZSwgcGxhbmUp IHsKKwkJY29uc3QgaW50IHNlcVtdID0geworCQkJMiwgMCwgMiwgMSwgMywgMSwgMworCQl9Owor CisJCWlmICghaWd0X3BsYW5lX2hhc19mb3JtYXRfbW9kKHBsYW5lLCBmb3JtYXQsIGRhdGEtPmZi WzBdLm1vZGlmaWVyKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENvbGxlY3QgcmVmZXJlbmNlIGNy YyB3aXRoIHRvZ2dsZSBpbiBiZXR3ZWVuLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShyZWZfY3JjKTsgaSsrKSB7CisJCQlpZ3Rfcm90YXRpb25fdCByb3QgPSAoaSA9PSAxIHx8IGkg PT0gMykgPworCQkJCUlHVF9ST1RBVElPTl85MCA6IElHVF9ST1RBVElPTl8wOworCisJCQlzZXRf ZmIocGxhbmUsICZkYXRhLT5mYltpXSwgc2NhbGVkLCByb3QpOworCisJCQlpZ3RfZGlzcGxheV9j b21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMpOworCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3Rf Y3JjKGRhdGEtPnBpcGVfY3JjLCAmcmVmX2NyY1tpXSk7CisJCQl2YWxpZFtpXSA9IHRydWU7CisK KwkJCXNldF9mYihwbGFuZSwgTlVMTCwgc2NhbGVkLCByb3QpOworCQkJaWd0X2Rpc3BsYXlfY29t bWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKHNlcSk7IGkrKykgeworCQkJaW50IGogPSBzZXFbaV07CisJCQlpZ3Rfcm90YXRp b25fdCByb3QgPSAoaiA9PSAxIHx8IGogPT0gMykgPworCQkJCUlHVF9ST1RBVElPTl85MCA6IElH VF9ST1RBVElPTl8wOworCisJCQlpZiAoIXZhbGlkW2pdKQorCQkJCWNvbnRpbnVlOworCisJCQlz ZXRfZmIocGxhbmUsICZkYXRhLT5mYltqXSwgc2NhbGVkLCByb3QpOworCQkJaWd0X2Rpc3BsYXlf Y29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKworCQkJaWd0X3BpcGVfY3JjX2NvbGxl Y3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjKTsKKwkJCWlndF9hc3NlcnRfY3JjX2VxdWFsKCZy ZWZfY3JjW2pdLCAmY3JjKTsKKwkJfQorCisJCS8qIFdlIG9ubHkgaGF2ZSBmZXcgc2NhbGVycywg ZG9uJ3QgdXNlIDEgZm9yIHVudXNlZCBwbGFuZXMgKi8KKwkJaWd0X3BsYW5lX3NldF9mYihwbGFu ZSwgTlVMTCk7CisJfQorfQorCisjZGVmaW5lIGFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKHBp cGVfY3JjLCBjcmMsIHJlZl9jcmMpIFwKKwlkbyB7IFwKKwkJaWd0X3BpcGVfY3JjX2dldF9jdXJy ZW50KGRpc3BsYXktPmRybV9mZCwgcGlwZV9jcmMsIGNyYyk7CVwKKwkJaWd0X2Fzc2VydF9jcmNf ZXF1YWwocmVmX2NyYywgY3JjKTsJXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHNldF9z cmNfY29vcmRzKGlndF9wbGFuZV90ICpwbGFuZSwgc3RydWN0IGlndF9mYiAqZmIsCisJCQkgICBp Z3Rfcm90YXRpb25fdCByb3QsIGludCB2aXMsIGludCBoaWRkZW4pCit7CisJc3dpdGNoIChyb3Qp IHsKKwljYXNlIElHVF9ST1RBVElPTl8wOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFu ZSwgZmItPndpZHRoIC8gMiAtIHZpcywgZmItPmhlaWdodCAvIDIgLSB2aXMpOworCQlicmVhazsK KwljYXNlIElHVF9ST1RBVElPTl85MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUs IGZiLT53aWR0aCAvIDIgLSBoaWRkZW4sIGZiLT5oZWlnaHQgLyAyIC0gdmlzKTsKKwkJYnJlYWs7 CisJY2FzZSBJR1RfUk9UQVRJT05fMTgwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFu ZSwgZmItPndpZHRoIC8gMiAtIGhpZGRlbiwgZmItPmhlaWdodCAvIDIgLSBoaWRkZW4pOworCQli cmVhazsKKwljYXNlIElHVF9ST1RBVElPTl8yNzA6CisJCWlndF9mYl9zZXRfcG9zaXRpb24oZmIs IHBsYW5lLCBmYi0+d2lkdGggLyAyIC0gdmlzLCBmYi0+aGVpZ2h0IC8gMiAtIGhpZGRlbik7CisJ CWJyZWFrOworCWRlZmF1bHQ6IGlndF9hc3NlcnQoMCk7CisJfQorCWlndF9mYl9zZXRfc2l6ZShm YiwgcGxhbmUsIHZpcyArIGhpZGRlbiwgdmlzICsgaGlkZGVuKTsKK30KKworc3RhdGljIHZvaWQg eXV2X3ZhbGlkX3dpZHRoX3BsYW5lKGRhdGFfdCAqZGF0YSwgZHJtTW9kZU1vZGVJbmZvICptb2Rl LAorCQkJCSAgaWd0X3BsYW5lX3QgKnBsYW5lLCBpZ3Rfcm90YXRpb25fdCByb3QsCisJCQkJICBp Z3RfY3JjX3QgKnJlZl9jcmMpCit7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5k aXNwbGF5OworCWlndF9jcmNfdCBjcmM7CisJc3RydWN0IGlndF9mYiAqY2xpcF9mYiA9ICZkYXRh LT5mYlsyXTsKKwlpbnQgaSwgcmV0OworCisJLyogSnVzdCBjbGlwcGluZy4uICovCisJaWd0X3Bs YW5lX3NldF9mYihwbGFuZSwgY2xpcF9mYik7CisJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFu ZSwgcm90KTsKKwlpZiAocm90ICYgKElHVF9ST1RBVElPTl85MCB8IElHVF9ST1RBVElPTl8yNzAp KQorCQlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPmhlaWdodCwgY2xpcF9mYi0+ d2lkdGgpOworCWlndF9wbGFuZV9zZXRfcG9zaXRpb24ocGxhbmUsIG1vZGUtPmhkaXNwbGF5IC0g Y2xpcF9mYi0+d2lkdGggLyAyLCBtb2RlLT52ZGlzcGxheSAtIGNsaXBfZmItPmhlaWdodCAvIDIp OworCWlmICgocm90ID09IElHVF9ST1RBVElPTl85MCB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3 MCkgJiYKKwkgICAgaWd0X2Rpc3BsYXlfdHJ5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01J QykgPCAwKSB7CisJCWlndF9kZWJ1ZygiVGhpcyByb3RhdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0 aGlzIGZvcm1hdC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWd0X2Rpc3BsYXlfY29tbWl0Mihk aXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKwlhc3NlcnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRh LT5waXBlX2NyYywgJmNyYywgcmVmX2NyYyk7CisKKwkvKiBDbGlwcGluZyBhbmQgc2NhbGluZy4g Ki8KKwlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCBjbGlwX2ZiLT53aWR0aCAv IDIgLSAxNiwgY2xpcF9mYi0+aGVpZ2h0IC8gMiAtIDE2KTsKKwlpZ3RfZmJfc2V0X3NpemUoY2xp cF9mYiwgcGxhbmUsIDMyLCAzMik7CisJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01N SVRfQVRPTUlDKTsKKwlhc3NlcnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywg JmNyYywgcmVmX2NyYyk7CisKKwkvKiBUcnkgbnZhbGlkIDwgOCBzcmMgdmlzaWJsZS4gKi8KKwlz ZXRfc3JjX2Nvb3JkcyhwbGFuZSwgY2xpcF9mYiwgcm90LCA0LCA0KTsKKwlpZ3RfZGlzcGxheV90 cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKworCS8qIFRyeSBkaWZmZXJlbnQg YWxpZ25tZW50cyBmb3IgeC95IHRvIHNlZSBpZiBhbnkgaGl0IHVuZGVycnVucyAqLworCWZvciAo aSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJc2V0X3NyY19jb29yZHMocGxhbmUsIGNsaXBfZmIsIHJv dCwgMTYgKyAyICogaSwgMTYgLSAyICogaSk7CisJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxh eSwgQ09NTUlUX0FUT01JQyk7CisJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBp cGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKworCQkvKiBBbmQgYWxzbyBzaG93IG1vcmUgb2YgdGhl IHNjcmVlbiAqLworCQlzZXRfc3JjX2Nvb3JkcyhwbGFuZSwgY2xpcF9mYiwgcm90LCAxNiArIGks IDE2ICsgaSk7CisJCXJldCA9IGlndF9kaXNwbGF5X3RyeV9jb21taXQyKGRpc3BsYXksIENPTU1J VF9BVE9NSUMpOworCisJCWlmIChyZXQgPT0gLUVJTlZBTCkgeworCQkJaWd0X2Fzc2VydChpICUg MiB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3MCB8fCByb3QgPT0gKElHVF9ST1RBVElPTl85MCB8 IElHVF9SRUZMRUNUX1gpKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWlndF9hc3NlcnRf ZXEocmV0LCAwKTsKKwkJYXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMs ICZjcmMsIHJlZl9jcmMpOworCX0KKworCS8qCisJICogQXMgYSBmaW5hbCB0ZXN0LCB0cnkgd2l0 aCAxNiBzcmMgdmlzaWJsZSwgYW5kIHZhcmlvdXMgaW52aXNpYmxlCisJICogY29tcG9uZW50cyB0 byBjaGVjayBjbGlwcGluZyBkb2Vzbid0IGRyb3AgdGhlIHZpc2libGUgc3JjIGJlbG93IDE2Lgor CSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSA0KSB7CisJCXNldF9zcmNfY29vcmRzKHBs YW5lLCBjbGlwX2ZiLCByb3QsIDE2LCBpKTsKKwkJaWYgKHJvdCAmIChJR1RfUk9UQVRJT05fOTAg fCBJR1RfUk9UQVRJT05fMjcwKSkKKwkJCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgKGNsaXBf ZmItPmhlaWdodCAvIDMyKSAqICgxNiArIGkpLAorCQkJCQkgICAoY2xpcF9mYi0+d2lkdGggLyAz MikgKiAoMTYgKyBpKSk7CisJCWVsc2UKKwkJCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgKGNs aXBfZmItPndpZHRoIC8gMzIpICogKDE2ICsgaSksCisJCQkJCSAgIChjbGlwX2ZiLT5oZWlnaHQg LyAzMikgKiAoMTYgKyBpKSk7CisJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlU X0FUT01JQyk7CisJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAm Y3JjLCByZWZfY3JjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHl1dl92YWxpZF93aWR0aChkYXRh X3QgKmRhdGEsIGVudW0gcGlwZSBwaXBlLCBpZ3Rfb3V0cHV0X3QgKm91dHB1dCwgdW5zaWduZWQg Zm9ybWF0KQoreworCWRybU1vZGVNb2RlSW5mbyAqbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUo b3V0cHV0KTsKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0 X3BsYW5lX3QgKnBsYW5lOworCXN0cnVjdCBpZ3RfZmIgKmNsaXBfZmIgPSAmZGF0YS0+ZmJbMl07 CisJc3RydWN0IGlndF9mYiAqcmVmX2ZiID0gJmRhdGEtPmZiWzNdOworCisJcHJlcGFyZV9jcnRj KGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlpZ3RfY3JlYXRlX2ZiKGRpc3BsYXktPmRybV9mZCwg NjQsIDY0LCBmb3JtYXQsIHlfbW9kaWZpZXIsIHJlZl9mYik7CisKKwlpZ3RfY3JlYXRlX2ZiKGRp c3BsYXktPmRybV9mZCwgMiAqIHJlZl9mYi0+d2lkdGgsCisJCSAgICAgIDIgKiByZWZfZmItPmhl aWdodCwgZm9ybWF0LCB5X21vZGlmaWVyLCBjbGlwX2ZiKTsKKworCWlndF9waXBlX2NyY19zdGFy dChkYXRhLT5waXBlX2NyYyk7CisKKwlmb3JfZWFjaF9wbGFuZV9vbl9waXBlKGRpc3BsYXksIHBp cGUsIHBsYW5lKSB7CisJCWlndF9jcmNfdCByZWZfY3JjWzRdOworCQljYWlyb190ICpjcjsKKwkJ c3RhdGljIGNvbnN0IGRvdWJsZSBjb2xvcnNbNF1bM10gPSB7CisJCQl7IDEuLCAwLiwgMC4gfSwK KwkJCXsgMC4sIDEuLCAwLiB9LAorCQkJeyAwLiwgMC4sIDEuIH0sCisJCQl7IDEuLCAxLiwgMS4g fQorCQl9OworCQlpbnQgaTsKKworCQlpZiAoIWlndF9wbGFuZV9oYXNfZm9ybWF0X21vZChwbGFu ZSwgZm9ybWF0LCBkYXRhLT5mYlswXS5tb2RpZmllcikpCisJCQljb250aW51ZTsKKworCQkvKiBE cmF3IHRoZSBGQiB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgY2xpcHBpbmcgdGVzdHMuICovCisJCWNy ID0gaWd0X2dldF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBjbGlwX2ZiKTsKKwkJaWd0X3Bh aW50X2NvbG9yKGNyLCAwLCAwLCBjbGlwX2ZiLT53aWR0aCAvIDIsIGNsaXBfZmItPmhlaWdodCAv IDIsCisJCQkJY29sb3JzWzBdWzBdLCBjb2xvcnNbMF1bMV0sIGNvbG9yc1swXVsyXSk7CisKKwkJ aWd0X3BhaW50X2NvbG9yKGNyLCBjbGlwX2ZiLT53aWR0aCAvIDIsIDAsCisJCQkJY2xpcF9mYi0+ d2lkdGggLyAyLCBjbGlwX2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNvbG9yc1sxXVswXSwgY29sb3Jz WzFdWzFdLCBjb2xvcnNbMV1bMl0pOworCisJCWlndF9wYWludF9jb2xvcihjciwgY2xpcF9mYi0+ d2lkdGggLyAyLCBjbGlwX2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNsaXBfZmItPndpZHRoIC8gMiwg Y2xpcF9mYi0+aGVpZ2h0IC8gMiwKKwkJCQljb2xvcnNbMl1bMF0sIGNvbG9yc1syXVsxXSwgY29s b3JzWzJdWzJdKTsKKworCQlpZ3RfcGFpbnRfY29sb3IoY3IsIDAsIGNsaXBfZmItPmhlaWdodCAv IDIsCisJCQkJY2xpcF9mYi0+d2lkdGggLyAyLCBjbGlwX2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNv bG9yc1szXVswXSwgY29sb3JzWzNdWzFdLCBjb2xvcnNbM11bMl0pOworCisJCWlndF9wdXRfY2Fp cm9fY3R4KGRpc3BsYXktPmRybV9mZCwgY2xpcF9mYiwgY3IpOworCisJCS8qIERyYXcgYWxsIHJl ZmVyZW5jZSBGQidzIHRvIGNvbGxlY3QgdGhlIENSQy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7 IGkrKykgeworCQkJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIHJlZl9m Yik7CisJCQlpZ3RfcGFpbnRfY29sb3IoY3IsIDAsIDAsIHJlZl9mYi0+d2lkdGgsIHJlZl9mYi0+ aGVpZ2h0LAorCQkJCQljb2xvcnNbaV1bMF0sIGNvbG9yc1tpXVsxXSwgY29sb3JzW2ldWzJdKTsK KwkJCWlndF9wdXRfY2Fpcm9fY3R4KGRpc3BsYXktPmRybV9mZCwgJmRhdGEtPmZiWzNdLCBjcik7 CisKKwkJCWlmICghaSkgeworCQkJCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIHJlZl9mYik7CisJ CQkJaWd0X3BsYW5lX3NldF9wb3NpdGlvbihwbGFuZSwgbW9kZS0+aGRpc3BsYXkgLSByZWZfZmIt PndpZHRoLCBtb2RlLT52ZGlzcGxheSAtIHJlZl9mYi0+aGVpZ2h0KTsKKwkJCQlpZ3RfZGlzcGxh eV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMpOworCQkJfSBlbHNlIHsKKwkJCQlpZ3Rf ZGlydHlfZmIoZGlzcGxheS0+ZHJtX2ZkLCByZWZfZmIpOworCQkJCWlndF93YWl0X2Zvcl92Ymxh bmsoZGlzcGxheS0+ZHJtX2ZkLCBwaXBlKTsKKwkJCX0KKworCQkJaWd0X3BpcGVfY3JjX2RyYWlu KGRhdGEtPnBpcGVfY3JjKTsKKwkJCWlndF9waXBlX2NyY19nZXRfc2luZ2xlKGRhdGEtPnBpcGVf Y3JjLCAmcmVmX2NyY1tpXSk7CisJCX0KKworCQlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBOVUxM KTsKKwkJaWd0X3BsYW5lX3NldF9wb3NpdGlvbihwbGFuZSwgMCwgMCk7CisKKwkJeXV2X3ZhbGlk X3dpZHRoX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBJR1RfUk9UQVRJT05fMCwgJnJlZl9jcmNb MF0pOworCQl5dXZfdmFsaWRfd2lkdGhfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUsIElHVF9ST1RB VElPTl85MCwgJnJlZl9jcmNbMV0pOworCQl5dXZfdmFsaWRfd2lkdGhfcGxhbmUoZGF0YSwgbW9k ZSwgcGxhbmUsIElHVF9ST1RBVElPTl8xODAsICZyZWZfY3JjWzJdKTsKKwkJeXV2X3ZhbGlkX3dp ZHRoX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBJR1RfUk9UQVRJT05fMjcwLCAmcmVmX2NyY1sz XSk7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMg Ym9vbCB5dXZfY29tbWl0X3JvdGF0ZWQoaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSwgaWd0X3JvdGF0 aW9uX3Qgcm90KQoreworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01N SVRfQVRPTUlDKSA8IDApIHsKKwkJaWd0X2RlYnVnKCJTa2lwcGluZyByb3RhdGVkIHRlc3QsIGFs aWdubWVudCBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRy dWU7Cit9CisKK3N0YXRpYyB2b2lkIHl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRhX3QgKmRh dGEsIGRybU1vZGVNb2RlSW5mbyAqbW9kZSwKKwkJCQkgICAgICBpZ3RfcGxhbmVfdCAqcGxhbmUs IHN0cnVjdCBpZ3RfZmIgKmZiLAorCQkJCSAgICAgIGlndF9yb3RhdGlvbl90IHJvdCwgaWd0X2Ny Y190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxh eTsKKwlpZ3RfY3JjX3QgY3JjOworCWludCBvZnNbXSA9IHsgMCwgMSwgLTEsIDIsIC0yIH07CisJ aW50IGksIGo7CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBmYik7CisJaWd0X3BsYW5lX3Nl dF9yb3RhdGlvbihwbGFuZSwgcm90KTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2 NCwgNjQpOworCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgMjU2LCAyNTYpOworCisJaWd0X2Zi X3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDQsIGZiLT5oZWlnaHQgLyA0KTsK KwlpZ3RfZmJfc2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyLCBmYi0+aGVpZ2h0IC8g Mik7CisJaWYgKChyb3QgPT0gSUdUX1JPVEFUSU9OXzkwIHx8IHJvdCA9PSBJR1RfUk9UQVRJT05f MjcwKSAmJgorCSAgICBpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRP TUlDKSA8IDApIHsKKwkJaWd0X2RlYnVnKCJUaGlzIHJvdGF0aW9uIG5vdCBhdmFpbGFibGUgZm9y IHRoaXMgZm9ybWF0LlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZ3RfZGlzcGxheV9jb21taXQy KGRpc3BsYXksIENPTU1JVF9BVE9NSUMpOworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRh dGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKworCS8qIE1ha2Ugc3VyZSBib3VuZGFyaWVz IG1hdGNoICovCisJaWd0X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDQg LSAyLCBmYi0+aGVpZ2h0IC8gNCAtIDIpOworCWlndF9mYl9zZXRfc2l6ZShmYiwgcGxhbmUsIGZi LT53aWR0aCAvIDIgKyA0LCBmYi0+aGVpZ2h0IC8gMiArIDQpOworCWlndF9kaXNwbGF5X2NvbW1p dDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisJYXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwo ZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMpOworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZ X1NJWkUob2ZzKTsgaSsrKSB7CisJCWlndF9kZWJ1ZygiVGVzdGluZyB3aXRoIHJvdCAleCBhbmQg ZXh0cmEgJWkgb24gdGhlIGxlZnQgc2lkZVxuIiwgcm90LCBvZnNbaV0pOworCQlpZ3RfZmJfc2V0 X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gNCArIG9mc1tpXSwgZmItPmhlaWdodCAv IDQgLSAyKTsKKwkJaWd0X2ZiX3NldF9zaXplKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiArIDIg LSBvZnNbaV0sIGZiLT5oZWlnaHQgLyAyICsgNCk7CisJCWlmICh5dXZfY29tbWl0X3JvdGF0ZWQo ZGlzcGxheSwgcm90KSkKKwkJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVf Y3JjLCAmY3JjLCByZWZfY3JjKTsKKworCQlpZ3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXgg YW5kIGV4dHJhICVpIG9uIHRoZSB0b3Agc2lkZVxuIiwgcm90LCBvZnNbaV0pOworCQlpZ3RfZmJf c2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gNCAtIDIsIGZiLT5oZWlnaHQgLyA0 ICsgb2ZzW2ldKTsKKwkJaWd0X2ZiX3NldF9zaXplKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiAr IDQsIGZiLT5oZWlnaHQgLyAyICsgMiAtIG9mc1tpXSk7CisJCWlmICh5dXZfY29tbWl0X3JvdGF0 ZWQoZGlzcGxheSwgcm90KSkKKwkJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBp cGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKworCQlpZ3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3Qg JXggYW5kIGV4dHJhICVpIG9uIHRoZSByaWdodCBzaWRlXG4iLCByb3QsIG9mc1tpXSk7CisJCWln dF9mYl9zZXRfcG9zaXRpb24oZmIsIHBsYW5lLCBmYi0+d2lkdGggLyA0IC0gMiwgZmItPmhlaWdo dCAvIDQpOworCQlpZ3RfZmJfc2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyICsgMiAr IG9mc1tpXSwgZmItPmhlaWdodCAvIDIpOworCQlpZiAoeXV2X2NvbW1pdF9yb3RhdGVkKGRpc3Bs YXksIHJvdCkpCisJCQlhc3NlcnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywg JmNyYywgcmVmX2NyYyk7CisKKwkJaWd0X2RlYnVnKCJUZXN0aW5nIHdpdGggcm90ICV4IGFuZCBl eHRyYSAlaSBvbiB0aGUgYm90dG9tIHNpZGVcbiIsIHJvdCwgb2ZzW2ldKTsKKwkJaWd0X2ZiX3Nl dF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDQgLSAyLCBmYi0+aGVpZ2h0IC8gNCAt IDIpOworCQlpZ3RfZmJfc2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyICsgNCwgZmIt PmhlaWdodCAvIDIgKyAyICsgb2ZzW2ldKTsKKwkJaWYgKHl1dl9jb21taXRfcm90YXRlZChkaXNw bGF5LCByb3QpKQorCQkJYXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMs ICZjcmMsIHJlZl9jcmMpOworCisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2Zz KTsgaSsrKQorCQlmb3IgKGogPSAhaTsgaiA8IEFSUkFZX1NJWkUob2ZzKTsgaisrKSB7CisJCQlp Z3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXggYW5kIGV4dHJhICglaSwgJWkpIGF0IHRoZSBl ZGdlc1xuIiwgcm90LCBvZnNbaV0sIG9mc1tqXSk7CisKKwkJCWlndF9mYl9zZXRfcG9zaXRpb24o ZmIsIHBsYW5lLCBmYi0+d2lkdGggLyA0ICsgb2ZzW2ldLCBmYi0+aGVpZ2h0IC8gNCArIG9mc1tq XSk7CisJCQlpZ3RfZmJfc2V0X3NpemUoZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyIC0gMiAqIG9m c1tpXSwgZmItPmhlaWdodCAvIDIgLSAyICogb2ZzW2pdKTsKKworCQkJaWYgKHl1dl9jb21taXRf cm90YXRlZChkaXNwbGF5LCByb3QpKQorCQkJCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRh dGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBkcmF3 X2NsaXBfZmIoaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSwgc3RydWN0IGlndF9mYiAqY2xpcF9mYikK K3sKKwljYWlyb190ICpjciA9IGlndF9nZXRfY2Fpcm9fY3R4KGRpc3BsYXktPmRybV9mZCwgY2xp cF9mYik7CisKKwlpZ3RfcGFpbnRfY29sb3IoY3IsIDAsIDAsIGNsaXBfZmItPndpZHRoLCBjbGlw X2ZiLT5oZWlnaHQsIC4wLCAuMCwgLjUpOworCWlndF9wYWludF9jb2xvcihjciwgY2xpcF9mYi0+ d2lkdGggLyA0IC0gMiwgY2xpcF9mYi0+aGVpZ2h0IC8gNCAtIDIsCisJCQljbGlwX2ZiLT53aWR0 aCAvIDIgKyA0LCBjbGlwX2ZiLT5oZWlnaHQgLyAyICsgNCwgMS4sIDEuLCAxLik7CisKKwlpZ3Rf cHV0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGNsaXBfZmIsIGNyKTsKK30KKworc3RhdGlj IHZvaWQgeXV2X2Nyb3Bfc2NhbGVfYnVnKGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGln dF9vdXRwdXRfdCAqb3V0cHV0LCB1bnNpZ25lZCBmb3JtYXQpCit7CisJZHJtTW9kZU1vZGVJbmZv ICptb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCWlndF9kaXNwbGF5X3QgKmRp c3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGxhbmVfdCAqcGxhbmUsICpwcmltYXJ5ID0g aWd0X3BpcGVfZ2V0X3BsYW5lX3R5cGUoJmRpc3BsYXktPnBpcGVzW3BpcGVdLCBEUk1fUExBTkVf VFlQRV9QUklNQVJZKTsKKwlzdHJ1Y3QgaWd0X2ZiICpyZWZfZmIgPSAmZGF0YS0+ZmJbMl07CisJ c3RydWN0IGlndF9mYiAqY2xpcF9mYiA9ICZkYXRhLT5mYlszXTsKKwlzdHJ1Y3QgaWd0X2ZiICpj bGlwX2ZiX3h0aWxlZCA9ICZkYXRhLT5mYls0XTsKKwlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiX3l0 aWxlZCA9ICZkYXRhLT5mYls1XTsKKworCXByZXBhcmVfY3J0YyhkYXRhLCBwaXBlLCBvdXRwdXQp OworCisJaWd0X2NyZWF0ZV9jb2xvcl9mYihkaXNwbGF5LT5kcm1fZmQsIG1vZGUtPmhkaXNwbGF5 LCBtb2RlLT52ZGlzcGxheSwKKwkJCSAgICBmb3JtYXQsIHhfbW9kaWZpZXIsIC41LCAuNSwgLjUs ICZkYXRhLT5mYlswXSk7CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwg MjU2LCAyNTYsIGZvcm1hdCwKKwkJCSAgICB4X21vZGlmaWVyLCAxLiwgMS4sIDEuLCByZWZfZmIp OworCisJaWd0X2NyZWF0ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDgwLCAxMjgsIGZvcm1hdCwKKwkJ ICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwgY2xpcF9mYik7CisKKwlpZ3RfY3JlYXRl X2ZiKGRpc3BsYXktPmRybV9mZCwgODAsIDEyOCwgZm9ybWF0LAorCQkgICAgICB4X21vZGlmaWVy LCBjbGlwX2ZiX3h0aWxlZCk7CisJaWd0X2NyZWF0ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDgwLCAx MjgsIGZvcm1hdCwKKwkJICAgICAgeV9tb2RpZmllciwgY2xpcF9mYl95dGlsZWQpOworCisJZHJh d19jbGlwX2ZiKGRpc3BsYXksIGNsaXBfZmIpOworCWRyYXdfY2xpcF9mYihkaXNwbGF5LCBjbGlw X2ZiX3h0aWxlZCk7CisJZHJhd19jbGlwX2ZiKGRpc3BsYXksIGNsaXBfZmJfeXRpbGVkKTsKKwor CWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmRhdGEtPmZiWzBdKTsKKworCWZvcl9lYWNoX3Bs YW5lX29uX3BpcGUoZGlzcGxheSwgcGlwZSwgcGxhbmUpIHsKKwkJaWd0X2NyY190IHJlZl9jcmM7 CisKKwkJaWYgKCFpZ3RfcGxhbmVfaGFzX2Zvcm1hdF9tb2QocGxhbmUsIGZvcm1hdCwgZGF0YS0+ ZmJbMF0ubW9kaWZpZXIpKQorCQkJY29udGludWU7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwbGFu ZSwgcmVmX2ZiKTsKKwkJaWd0X3BsYW5lX3NldF9wb3NpdGlvbihwbGFuZSwgNjQsIDY0KTsKKwkJ aWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKworCQlpZ3RfcGlw ZV9jcmNfc3RhcnQoZGF0YS0+cGlwZV9jcmMpOworCQlpZ3RfcGlwZV9jcmNfZ2V0X3NpbmdsZShk YXRhLT5waXBlX2NyYywgJnJlZl9jcmMpOworCisJCXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShk YXRhLCBtb2RlLCBwbGFuZSwgY2xpcF9mYiwgSUdUX1JPVEFUSU9OXzAsICZyZWZfY3JjKTsKKwkJ eXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3h0aWxl ZCwgSUdUX1JPVEFUSU9OXzAsICZyZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5l KGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3l0aWxlZCwgSUdUX1JPVEFUSU9OXzAsICZyZWZf Y3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlw X2ZiX3l0aWxlZCwgSUdUX1JPVEFUSU9OXzkwLCAmcmVmX2NyYyk7CisJCXl1dl9jcm9wX3NjYWxl X2J1Z19wbGFuZShkYXRhLCBtb2RlLCBwbGFuZSwgY2xpcF9mYiwgSUdUX1JPVEFUSU9OXzE4MCwg JnJlZl9jcmMpOworCQl5dXZfY3JvcF9zY2FsZV9idWdfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUs IGNsaXBfZmJfeHRpbGVkLCBJR1RfUk9UQVRJT05fMTgwLCAmcmVmX2NyYyk7CisJCXl1dl9jcm9w X3NjYWxlX2J1Z19wbGFuZShkYXRhLCBtb2RlLCBwbGFuZSwgY2xpcF9mYl95dGlsZWQsIElHVF9S T1RBVElPTl8xODAsICZyZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEs IG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3l0aWxlZCwgSUdUX1JPVEFUSU9OXzI3MCwgJnJlZl9jcmMp OworCisJCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIHBsYW5lICE9IHByaW1hcnkgPyBOVUxMIDog JmRhdGEtPmZiWzBdKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB5dXZfY2hyb21h X3N1YnBpeGVsX2NsaXBfcGxhbmVfd2l0aF9jdXJzb3IoZGF0YV90ICpkYXRhLAorCQkJCQkJCWln dF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJCQlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiLAorCQkJCQkJ CWlndF9wbGFuZV90ICpjdXJzb3IsCisJCQkJCQkJc3RydWN0IGlndF9mYiAqY3Vyc29yX2ZiLAor CQkJCQkJCWlndF9jcmNfdCAqcmVmX2NyYywKKwkJCQkJCQlpbnQgY3Vyc29yX3gsIGludCBjdXJz b3JfeSkKK3sKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisKKwlp Z3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9u KHBsYW5lLCA2NCwgNjQpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIElHVF9ST1RB VElPTl8wKTsKKworCWlndF9wbGFuZV9zZXRfZmIoY3Vyc29yLCBjdXJzb3JfZmIpOworCWlndF9w bGFuZV9zZXRfcG9zaXRpb24oY3Vyc29yLCBjdXJzb3JfeCwgY3Vyc29yX3kpOworCWlndF9kaXNw bGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisKKwlpZ3RfcGlwZV9jcmNfZHJh aW4oZGF0YS0+cGlwZV9jcmMpOworCWlndF9waXBlX2NyY19nZXRfc2luZ2xlKGRhdGEtPnBpcGVf Y3JjLCByZWZfY3JjKTsKKworCWlndF9wbGFuZV9zZXRfZmIoY3Vyc29yLCBOVUxMKTsKK30KKwor c3RhdGljIGJvb2wgeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX3JpZ2h0KGRhdGFfdCAq ZGF0YSwKKwkJCQkJCSBpZ3Rfcm90YXRpb25fdCByb3RhdGlvbiwKKwkJCQkJCSBpZ3RfcGxhbmVf dCAqcGxhbmUsCisJCQkJCQkgc3RydWN0IGlndF9mYiAqY2xpcF9mYiwKKwkJCQkJCSBpZ3RfY3Jj X3QgKnJlZl9jcmMpCit7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5 OworCWlndF9jcmNfdCBjcmMgPSB7fTsKKworCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIGNsaXBf ZmIpOworCWlndF9wbGFuZV9zZXRfcG9zaXRpb24ocGxhbmUsIDY0LCA2NCk7CisJaWd0X3BsYW5l X3NldF9yb3RhdGlvbihwbGFuZSwgcm90YXRpb24pOworCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFu ZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCisJc3dpdGNoIChyb3Rh dGlvbikgeworCWNhc2UgSUdUX1JPVEFUSU9OXzE4MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihj bGlwX2ZiLCBwbGFuZSwgMSwgMCk7CisJY2FzZSBJR1RfUk9UQVRJT05fMDoKKwkJaWd0X2ZiX3Nl dF9zaXplKGNsaXBfZmIsIHBsYW5lLCBjbGlwX2ZiLT53aWR0aCAtIDEsIGNsaXBfZmItPmhlaWdo dCk7CisJCWJyZWFrOworCisJY2FzZSBJR1RfUk9UQVRJT05fMjcwOgorCQlpZ3RfZmJfc2V0X3Bv c2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAwLCAxKTsKKwljYXNlIElHVF9ST1RBVElPTl85MDoKKwkJ aWd0X2ZiX3NldF9zaXplKGNsaXBfZmIsIHBsYW5lLCBjbGlwX2ZiLT53aWR0aCwgY2xpcF9mYi0+ aGVpZ2h0IC0gMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnRfZigwLCAiVW5o YW5kbGVkIHJvdGF0aW9uICV4XG4iLCByb3RhdGlvbik7CisJfQorCisJaWYgKGlndF9kaXNwbGF5 X3RyeV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMpIDwgMCkKKwkJcmV0dXJuIGZhbHNl OworCisJYXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJl Zl9jcmMpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCB5dXZfY2hyb21hX3N1YnBp eGVsX2NsaXBfcGxhbmVfYm90dG9tKGRhdGFfdCAqZGF0YSwKKwkJCQkJCSAgaWd0X3JvdGF0aW9u X3Qgcm90YXRpb24sCisJCQkJCQkgIGlndF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJCSAgc3RydWN0 IGlndF9mYiAqY2xpcF9mYiwKKwkJCQkJCSAgaWd0X2NyY190ICpyZWZfY3JjKQoreworCWlndF9k aXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3QgY3JjID0ge307 CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bv c2l0aW9uKHBsYW5lLCA2NCwgNjQpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIHJv dGF0aW9uKTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPndpZHRoLCBjbGlw X2ZiLT5oZWlnaHQgLSAxKTsKKworCXN3aXRjaCAocm90YXRpb24pIHsKKwljYXNlIElHVF9ST1RB VElPTl8xODA6CisJCWlndF9mYl9zZXRfcG9zaXRpb24oY2xpcF9mYiwgcGxhbmUsIDAsIDEpOwor CWNhc2UgSUdUX1JPVEFUSU9OXzA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwg Y2xpcF9mYi0+d2lkdGgsIGNsaXBfZmItPmhlaWdodCAtIDEpOworCQlicmVhazsKKworCWNhc2Ug SUdUX1JPVEFUSU9OXzkwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAx LCAwKTsKKwljYXNlIElHVF9ST1RBVElPTl8yNzA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2Zi LCBwbGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsK KwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3RhdGlvbiAleFxuIiwg cm90YXRpb24pOworCX0KKworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBD T01NSVRfQVRPTUlDKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWFzc2VydF9jb2xsZWN0ZWRf Y3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsK K30KKworc3RhdGljIGJvb2wgeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0 YV90ICpkYXRhLAorCQkJCQkJaWd0X3JvdGF0aW9uX3Qgcm90YXRpb24sCisJCQkJCQlpZ3RfcGxh bmVfdCAqcGxhbmUsCisJCQkJCQlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiLAorCQkJCQkJaWd0X2Ny Y190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxh eTsKKwlpZ3RfY3JjX3QgY3JjID0ge307CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlw X2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NSwgNjQpOworCWlndF9wbGFu ZV9zZXRfcm90YXRpb24ocGxhbmUsIHJvdGF0aW9uKTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUocGxh bmUsIGNsaXBfZmItPndpZHRoIC0gMSwgY2xpcF9mYi0+aGVpZ2h0KTsKKworCXN3aXRjaCAocm90 YXRpb24pIHsKKwljYXNlIElHVF9ST1RBVElPTl8wOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNs aXBfZmIsIHBsYW5lLCAxLCAwKTsKKwljYXNlIElHVF9ST1RBVElPTl8xODA6CisJCWlndF9mYl9z ZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWln aHQpOworCQlicmVhazsKKworCWNhc2UgSUdUX1JPVEFUSU9OXzkwOgorCQlpZ3RfZmJfc2V0X3Bv c2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAwLCAxKTsKKwljYXNlIElHVF9ST1RBVElPTl8yNzA6CisJ CWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGgsIGNsaXBfZmIt PmhlaWdodCAtIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwgIlVu aGFuZGxlZCByb3RhdGlvbiAleFxuIiwgcm90YXRpb24pOworCX0KKworCWlmIChpZ3RfZGlzcGxh eV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApCisJCXJldHVybiBmYWxz ZTsKKworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCBy ZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgYm9vbCB5dXZfY2hyb21hX3N1 YnBpeGVsX2NsaXBfcGxhbmVfdG9wKGRhdGFfdCAqZGF0YSwKKwkJCQkJICAgICAgaWd0X3JvdGF0 aW9uX3Qgcm90YXRpb24sCisJCQkJCSAgICAgIGlndF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJICAg ICAgc3RydWN0IGlndF9mYiAqY2xpcF9mYiwKKwkJCQkJICAgICAgaWd0X2NyY190ICpyZWZfY3Jj KQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3Jj X3QgY3JjID0ge307CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3Rf cGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwgNjUpOworCWlndF9wbGFuZV9zZXRfcm90YXRp b24ocGxhbmUsIHJvdGF0aW9uKTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmIt PndpZHRoLCBjbGlwX2ZiLT5oZWlnaHQgLSAxKTsKKworCXN3aXRjaCAocm90YXRpb24pIHsKKwlj YXNlIElHVF9ST1RBVElPTl8wOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5l LCAwLCAxKTsKKwljYXNlIElHVF9ST1RBVElPTl8xODA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlw X2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGgsIGNsaXBfZmItPmhlaWdodCAtIDEpOworCQlicmVh azsKKworCWNhc2UgSUdUX1JPVEFUSU9OXzI3MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihjbGlw X2ZiLCBwbGFuZSwgMSwgMCk7CisJY2FzZSBJR1RfUk9UQVRJT05fOTA6CisJCWlndF9mYl9zZXRf c2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQp OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3Rh dGlvbiAleFxuIiwgcm90YXRpb24pOworCX0KKworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0 MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWFzc2Vy dF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwly ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwKGRh dGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGlndF9vdXRwdXRfdCAqb3V0cHV0LCB1bnNpZ25l ZCBmb3JtYXQpCit7CisJZHJtTW9kZU1vZGVJbmZvICptb2RlID0gaWd0X291dHB1dF9nZXRfbW9k ZShvdXRwdXQpOworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlp Z3RfcGlwZV90ICpwaXBlX29iaiA9ICZkaXNwbGF5LT5waXBlc1twaXBlXTsKKwlzdHJ1Y3QgaWd0 X2ZiICpiZ19mYiA9ICZkYXRhLT5mYlswXTsKKwlzdHJ1Y3QgaWd0X2ZiICpiZ19jdXJzb3JfZmIg PSAmZGF0YS0+ZmJbMV07CisJc3RydWN0IGlndF9mYiAqYmxhY2tfY3Vyc29yX2ZiID0gJmRhdGEt PmZiWzJdOworCXN0cnVjdCBpZ3RfZmIgKmNsaXBfZmIgPSAmZGF0YS0+ZmJbM107CisJaWd0X3Bs YW5lX3QgKnByaW1hcnkgPSBpZ3RfcGlwZV9nZXRfcGxhbmVfdHlwZShwaXBlX29iaiwgRFJNX1BM QU5FX1RZUEVfUFJJTUFSWSk7CisJaWd0X3BsYW5lX3QgKmN1cnNvciA9IGlndF9waXBlX2dldF9w bGFuZV90eXBlKHBpcGVfb2JqLCBEUk1fUExBTkVfVFlQRV9DVVJTT1IpOworCWlndF9wbGFuZV90 ICpwbGFuZTsKKwljYWlyb190ICpjcjsKKwlib29sIHJldCA9IGZhbHNlOworCisJcHJlcGFyZV9j cnRjKGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXkt PmRybV9mZCwgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAorCQkJICAgIERSTV9GT1JN QVRfWFJHQjg4ODgsIHhfbW9kaWZpZXIsCisJCQkgICAgLjAsIC4wLCAxLiwgYmdfZmIpOworCisJ aWd0X2NyZWF0ZV9jb2xvcl9mYihkaXNwbGF5LT5kcm1fZmQsIDI1NiwgMjU2LAorCQkgICAgICAg ICAgICBEUk1fRk9STUFUX0FSR0I4ODg4LCBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJ ICAgIC4wLCAuMCwgMS4sIGJnX2N1cnNvcl9mYik7CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRp c3BsYXktPmRybV9mZCwgMjU2LCAyNTYsCisJCSAgICAgICAgICAgIERSTV9GT1JNQVRfQVJHQjg4 ODgsIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkgICAgLjAsIC4wLCAuMCwgYmxhY2tf Y3Vyc29yX2ZiKTsKKworCWlndF9jcmVhdGVfZmIoZGlzcGxheS0+ZHJtX2ZkLCAyNTYsIDI1NiwK KwkJICAgICAgZm9ybWF0LCB5X21vZGlmaWVyLCBjbGlwX2ZiKTsKKworCS8qIERyYXcgdGhlIEZC IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBjbGlwcGluZyB0aGUgY2hyb21hIHN1YnBpeGVsIHRlc3Qu ICovCisJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGNsaXBfZmIpOwor CisJaWd0X3BhaW50X2NvbG9yKGNyLCAwLCAwLCBjbGlwX2ZiLT53aWR0aCwgY2xpcF9mYi0+aGVp Z2h0LCAxLiwgMC4sIDAuKTsKKwlpZ3RfcGFpbnRfY29sb3IoY3IsIDIsIDIsIGNsaXBfZmItPndp ZHRoIC0gNCwgY2xpcF9mYi0+aGVpZ2h0IC0gNCwgMC4sIDEuLCAxLik7CisJaWd0X3BhaW50X2Nv bG9yKGNyLCA0LCA0LCBjbGlwX2ZiLT53aWR0aCAtIDgsIGNsaXBfZmItPmhlaWdodCAtIDgsIC43 NSwgLjc1LCAxLik7CisKKwkvKiBXaGl0ZSBkb3RzIGluIHRoZSBjb3JuZXJzLiAqLworCWlndF9w YWludF9jb2xvcihjciwgMCwgMCwgNiwgNiwgMS4sIDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9y KGNyLCBjbGlwX2ZiLT53aWR0aCAtIDYsIDAsIDYsIDYsIDEuLCAxLiwgMS4pOworCWlndF9wYWlu dF9jb2xvcihjciwgMCwgY2xpcF9mYi0+aGVpZ2h0IC0gNiwgNiwgNiwgMS4sIDEuLCAxLik7CisJ aWd0X3BhaW50X2NvbG9yKGNyLCBjbGlwX2ZiLT53aWR0aCAtIDYsIGNsaXBfZmItPmhlaWdodCAt IDYsIDYsIDYsIDEuLCAxLiwgMS4pOworCisJaWd0X3B1dF9jYWlyb19jdHgoZGlzcGxheS0+ZHJt X2ZkLCBjbGlwX2ZiLCBjcik7CisKKwlpZ3RfcGlwZV9jcmNfc3RhcnQoZGF0YS0+cGlwZV9jcmMp OworCisJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBiZ19mYik7CisJZm9yX2VhY2hfcGxhbmVf b25fcGlwZShkaXNwbGF5LCBwaXBlLCBwbGFuZSkgeworCQlzdHJ1Y3QgaWd0X2ZiICpjdXJzb3Jf ZmIgPSBwbGFuZSA9PSBwcmltYXJ5ID8gYmxhY2tfY3Vyc29yX2ZiIDogYmdfY3Vyc29yX2ZiOwor CQlpZ3RfY3JjX3QgcmVmX2NyYzsKKworCQlpZiAoIWlndF9wbGFuZV9oYXNfZm9ybWF0X21vZChw bGFuZSwgZm9ybWF0LCBjbGlwX2ZiLT5tb2RpZmllcikgfHwgcGxhbmUgPT0gY3Vyc29yKQorCQkJ Y29udGludWU7CisKKwkJeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX3dpdGhfY3Vyc29y KGRhdGEsIHBsYW5lLCBjbGlwX2ZiLCBjdXJzb3IsIGN1cnNvcl9mYiwgJnJlZl9jcmMsIDYzICsg Y2xpcF9mYi0+d2lkdGgsIDY0KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9w bGFuZV9yaWdodChkYXRhLCBJR1RfUk9UQVRJT05fMCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3Jj KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9yaWdodChkYXRhLCBJ R1RfUk9UQVRJT05fOTAsIHBsYW5lLCBjbGlwX2ZiLCAmcmVmX2NyYyk7CisJCXJldCB8PSB5dXZf Y2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfcmlnaHQoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwg cGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxf Y2xpcF9wbGFuZV9yaWdodChkYXRhLCBJR1RfUk9UQVRJT05fMjcwLCBwbGFuZSwgY2xpcF9mYiwg JnJlZl9jcmMpOworCisJCXl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV93aXRoX2N1cnNv cihkYXRhLCBwbGFuZSwgY2xpcF9mYiwgY3Vyc29yLCBjdXJzb3JfZmIsICZyZWZfY3JjLCA2NCwg NjMgKyBjbGlwX2ZiLT5oZWlnaHQpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlw X3BsYW5lX2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJT05fMCwgcGxhbmUsIGNsaXBfZmIsICZyZWZf Y3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9ib3R0b20oZGF0 YSwgSUdUX1JPVEFUSU9OXzkwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0g eXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJT05f MTgwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJw aXhlbF9jbGlwX3BsYW5lX2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJT05fMjcwLCBwbGFuZSwgY2xp cF9mYiwgJnJlZl9jcmMpOworCisJCXl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV93aXRo X2N1cnNvcihkYXRhLCBwbGFuZSwgY2xpcF9mYiwgY3Vyc29yLCBjdXJzb3JfZmIsICZyZWZfY3Jj LCA2NSAtIGN1cnNvcl9mYi0+d2lkdGgsIDY0KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4 ZWxfY2xpcF9wbGFuZV9sZWZ0KGRhdGEsIElHVF9ST1RBVElPTl8wLCBwbGFuZSwgY2xpcF9mYiwg JnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQo ZGF0YSwgSUdUX1JPVEFUSU9OXzkwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQg fD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0YSwgSUdUX1JPVEFUSU9O XzE4MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3Vi cGl4ZWxfY2xpcF9wbGFuZV9sZWZ0KGRhdGEsIElHVF9ST1RBVElPTl8yNzAsIHBsYW5lLCBjbGlw X2ZiLCAmcmVmX2NyYyk7CisKKwkJeXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX3dpdGhf Y3Vyc29yKGRhdGEsIHBsYW5lLCBjbGlwX2ZiLCBjdXJzb3IsIGN1cnNvcl9mYiwgJnJlZl9jcmMs IDY0LCA2NSAtIGN1cnNvcl9mYi0+aGVpZ2h0KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4 ZWxfY2xpcF9wbGFuZV90b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzAsIHBsYW5lLCBjbGlwX2ZiLCAm cmVmX2NyYyk7CisJCXJldCB8PSB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfdG9wKGRh dGEsIElHVF9ST1RBVElPTl85MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9 IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV90b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzE4 MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4 ZWxfY2xpcF9wbGFuZV90b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzI3MCwgcGxhbmUsIGNsaXBfZmIs ICZyZWZfY3JjKTsKKworCQkvKiBSZXNldCB0byBkZWZhdWx0cyAqLworCQlpZ3RfcGxhbmVfc2V0 X3Bvc2l0aW9uKHBsYW5lLCAwLCAwKTsKKwkJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwg SUdUX1JPVEFUSU9OXzApOworCQlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBwbGFuZSA9PSBwcmlt YXJ5ID8gYmdfZmIgOiBOVUxMKTsKKwl9CisKKwlpZ3RfcmVxdWlyZV9mKHJldCwgIkNvdWxkIG5v dCB0ZXN0IHN1YnBpeGVsIGNsaXBwaW5nIGluIGFueSBjb3JuZXJcbiIpOworfQorCitzdGF0aWMg Y29uc3QgY2hhciAqcHJldHRpZnkodWludDMyX3QgZm91cmNjKQoreworCXN0YXRpYyBjaGFyIHN0 cls1XTsKKworCW1lbWNweShzdHIsICZmb3VyY2MsIDQpOworCXN0cls0XSA9IDA7CisJcmV0dXJu IHN0cjsKK30KKworc3RhdGljIHZvaWQgcnVuX3Rlc3RzX2Zvcl9mb3JtYXQoZGF0YV90ICpkYXRh LCBlbnVtIHBpcGUgcGlwZSwgaWd0X291dHB1dF90ICpvdXRwdXQsIHVuc2lnbmVkIGludCBmb3Jt YXQpCit7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWNvbnN0 IGNoYXIgKmZzdHIgPSBwcmV0dGlmeShmb3JtYXQpOworCisJaWd0X2ZpeHR1cmUKKwkJaWd0X3Jl cXVpcmUocGlwZV9zdXBwb3J0c19mb3JtYXQoZGlzcGxheSwgcGlwZSwgZm9ybWF0LCB4X21vZGlm aWVyKSk7CisKKwlpZ3Rfc3VidGVzdF9mKCJwaXBlLSVzLSVzLXJnYi1zd2l0Y2giLCBrbXN0ZXN0 X3BpcGVfbmFtZShwaXBlKSwgZnN0cikKKwkJeXV2X3JnYl9zd2l0Y2goZGF0YSwgcGlwZSwgb3V0 cHV0LCBmYWxzZSwgZm9ybWF0KTsKKworCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMtJXMtcmdiLXNj YWxlZC1zd2l0Y2giLCBrbXN0ZXN0X3BpcGVfbmFtZShwaXBlKSwgZnN0cikKKwkJeXV2X3JnYl9z d2l0Y2goZGF0YSwgcGlwZSwgb3V0cHV0LCB0cnVlLCBmb3JtYXQpOworCisJaWd0X3N1YnRlc3Rf ZigicGlwZS0lcy0lcy12YWxpZC13aWR0aCIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBmc3Ry KQorCQl5dXZfdmFsaWRfd2lkdGgoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXQpOworCisJaWd0 X3N1YnRlc3RfZigicGlwZS0lcy0lcy1jcm9wLXNjYWxlLWJ1ZyIsIGttc3Rlc3RfcGlwZV9uYW1l KHBpcGUpLCBmc3RyKQorCQl5dXZfY3JvcF9zY2FsZV9idWcoZGF0YSwgcGlwZSwgb3V0cHV0LCBm b3JtYXQpOworCisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy0lcy1jaHJvbWEtc3VicGl4ZWwtY2xp cCIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBmc3RyKQorCQl5dXZfY2hyb21hX3N1YnBpeGVs X2NsaXAoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBydW5f dGVzdHNfZm9yX3BpcGUoZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSkKK3sKKwlpZ3Rfb3V0 cHV0X3QgKm91dHB1dCA9IE5VTEw7CisKKwlpZ3RfZml4dHVyZQorCQlpZ3RfcmVxdWlyZSgob3V0 cHV0ID0gaWd0X2dldF9zaW5nbGVfb3V0cHV0X2Zvcl9waXBlKCZkYXRhLT5kaXNwbGF5LCBwaXBl KSkpOworCisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy15dXYtc2FuaXR5LWNyYyIsIGttc3Rlc3Rf cGlwZV9uYW1lKHBpcGUpKQorCQl5dXZfc2FuaXR5KGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlm b3IgKGludCBpID0gMDsgaSA8IGNvdW50X2Zvcm1hdHM7IGkrKykKKwkJaWYgKGlndF9mb3JtYXRf aXNfeXV2KGZvcm1hdHNbaV0pKQorCQkJcnVuX3Rlc3RzX2Zvcl9mb3JtYXQoZGF0YSwgcGlwZSwg b3V0cHV0LCBmb3JtYXRzW2ldKTsKK30KKworaWd0X21haW4KK3sKKwlkYXRhX3QgZGF0YSA9IHt9 OworCWVudW0gcGlwZSBwaXBlOworCisJaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOworCisJaWd0 X2ZpeHR1cmUgeworCQlkYXRhLmRpc3BsYXkuZHJtX2ZkID0gZHJtX29wZW5fZHJpdmVyX21hc3Rl cihEUklWRVJfQU5ZKTsKKworCQlrbXN0ZXN0X3NldF92dF9ncmFwaGljc19tb2RlKCk7CisJCWln dF9kaXNwbGF5X3JlcXVpcmUoJmRhdGEuZGlzcGxheSwgZGF0YS5kaXNwbGF5LmRybV9mZCk7CisJ CWlndF9yZXF1aXJlKGRhdGEuZGlzcGxheS5pc19hdG9taWMpOworCQlpZ3RfcmVxdWlyZV9waXBl X2NyYyhkYXRhLmRpc3BsYXkuZHJtX2ZkKTsKKworCQlpZiAoaWd0X2Rpc3BsYXlfaGFzX2Zvcm1h dF9tb2QoJmRhdGEuZGlzcGxheSwgRFJNX0ZPUk1BVF9YUkdCODg4OCwgTE9DQUxfSTkxNV9GT1JN QVRfTU9EX1hfVElMRUQpKQorCQkJeF9tb2RpZmllciA9IExPQ0FMX0k5MTVfRk9STUFUX01PRF9Y X1RJTEVEOworCisJCWlmIChpZ3RfZGlzcGxheV9oYXNfZm9ybWF0X21vZCgmZGF0YS5kaXNwbGF5 LCBEUk1fRk9STUFUX1hSR0I4ODg4LCBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWV9USUxFRCkpCisJ CQl5X21vZGlmaWVyID0gTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1lfVElMRUQ7CisJfQorCisJaWd0 X2Zvcm1hdF9hcnJheV9maWxsKCZmb3JtYXRzLCAmY291bnRfZm9ybWF0cywgdHJ1ZSk7CisKKwlm b3JfZWFjaF9waXBlX3N0YXRpYyhwaXBlKQorCQlpZ3Rfc3VidGVzdF9ncm91cAorCQkJcnVuX3Rl c3RzX2Zvcl9waXBlKCZkYXRhLCBwaXBlKTsKKworCWlndF9maXh0dXJlIHsKKwkJaWd0X2Rpc3Bs YXlfZmluaSgmZGF0YS5kaXNwbGF5KTsKKwkJY2xvc2UoZGF0YS5kaXNwbGF5LmRybV9mZCk7CisJ fQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0cy9tZXNvbi5idWlsZApp bmRleCA5MDE1ZjgwOWVkMDUuLjhjYTdmZTVmNDkxNyAxMDA2NDQKLS0tIGEvdGVzdHMvbWVzb24u YnVpbGQKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQKQEAgLTYxLDYgKzYxLDcgQEAgdGVzdF9wcm9n cyA9IFsKIAkna21zX3VuaXZlcnNhbF9wbGFuZScsCiAJJ2ttc192YmxhbmsnLAogCSdrbXNfdnJy JywKKwkna21zX3l1dicsCiAJJ21ldGFfdGVzdCcsCiAJJ3BlcmYnLAogCSdwcmltZV9idXN5JywK LS0gCjIuMjAuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2