From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Stone Subject: [PATCH igt v7 4/4] kms_atomic: Add basic atomic modesetting tests Date: Thu, 29 Oct 2015 10:35:24 +0000 Message-ID: <1446114924-7192-3-git-send-email-daniels@collabora.com> References: <1446114679-6844-1-git-send-email-daniels@collabora.com> <1446114924-7192-1-git-send-email-daniels@collabora.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wi0-f178.google.com (mail-wi0-f178.google.com [209.85.212.178]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6B4786E63E for ; Thu, 29 Oct 2015 03:35:46 -0700 (PDT) Received: by wicll6 with SMTP id ll6so38157955wic.1 for ; Thu, 29 Oct 2015 03:35:45 -0700 (PDT) Received: from fxhe.lan (93-97-222-139.zone5.bethere.co.uk. [93.97.222.139]) by smtp.gmail.com with ESMTPSA id iw8sm1109771wjb.5.2015.10.29.03.35.33 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 29 Oct 2015 03:35:44 -0700 (PDT) In-Reply-To: <1446114924-7192-1-git-send-email-daniels@collabora.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org QWRkIHRlc3RzIGZvciBLTVMgYXRvbWljIG1vZGVzZXR0aW5nLCB0byBleGVyY2lzZSB0aGUgYmFz aWMgaW50ZXJmYWNlCmFuZCB0ZXN0IGZhaWx1cmUvY29ybmVyIGNhc2VzLiBTaG91bGQgZW5zdXJl IGNvaGVyZW5jeSBiZXR3ZWVuIHRoZQpsZWdhY3kgYW5kIGF0b21pYyBpbnRlcmZhY2VzLgoKdjI6 IE5ldyBwYXRjaC4KdjM6IERpc2FibGUgY29ubmVjdG9yIGNoZWNraW5nIGZvciBub3csIGFzIGl0 IHdhcyBjYXVzaW5nIEdQVSBoYW5ncyBvbgogICAgbmV3ZXIga2VybmVscy4KdjQ6IFJlYmFzZS4K djU6IFVzZSBkb19pb2N0bCBvciBkb19pb2N0bF9lcnIgY29uc2lzdGVudGx5LiBVc2UgaWd0X2Fz c2VydF8qKCkKICAgIGhlbHBlciBtYWNyb3MgcmF0aGVyIHRoYW4gaWd0X2Fzc2VydCgpIGRpcmVj dGx5LgogICAgTW92ZSBhc3NlcnRpb25zIGludG8gaGVscGVyL2NoZWNrIGZ1bmN0aW9ucy4gRGVm aW5lIGF0b21pYyBjb21taXQKICAgIGhlbHBlci4KdjY6IFVzZSBkb19pb2N0bF9lcnIsIGFuZCBk ZWZpbmUgbWFjcm9zIHRvIG1vdmUgZXJyb3JzIHRvCiAgICBhY3R1YWwgY2FsbHNpdGUsIHJhdGhl ciB0aGFuIGhlbHBlciBmdW5jdGlvbnMuCnY3OiBGaXggUkVMQVhfTU9ERSB0aGlua28gYW5kIHJl ZnJlc2ggQ1JUQyBzdGF0ZSBpbiBmaW5kX2NydGMuCgpDby1hdXRob3JlZC1ieTogTWljYWggRmVk a2UgPG1pY2FoLmZlZGtlQGNvbGxhYm9yYS5jb20+ClNpZ25lZC1vZmYtYnk6IERhbmllbCBTdG9u ZSA8ZGFuaWVsc0Bjb2xsYWJvcmEuY29tPgotLS0KIGNvbmZpZ3VyZS5hYyAgICAgICAgICAgfCAg ICAyICstCiB0ZXN0cy8uZ2l0aWdub3JlICAgICAgIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5z b3VyY2VzIHwgICAgMSArCiB0ZXN0cy9rbXNfYXRvbWljLmMgICAgIHwgMTM0NSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwg MTM0OCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVz dHMva21zX2F0b21pYy5jCgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFj CmluZGV4IDVmOTc0NjYuLjk3ZGU1OGEgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9j b25maWd1cmUuYWMKQEAgLTg1LDcgKzg1LDcgQEAgaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0 aGVuCiBmaQogQUNfU1VCU1QoQVNTRU1CTEVSX1dBUk5fQ0ZMQUdTKQogCi1QS0dfQ0hFQ0tfTU9E VUxFUyhEUk0sIFtsaWJkcm1faW50ZWwgPj0gMi40LjU1IGxpYmRybV0pCitQS0dfQ0hFQ0tfTU9E VUxFUyhEUk0sIFtsaWJkcm1faW50ZWwgPj0gMi40LjY0IGxpYmRybV0pCiBQS0dfQ0hFQ0tfTU9E VUxFUyhQQ0lBQ0NFU1MsIFtwY2lhY2Nlc3MgPj0gMC4xMF0pCiBQS0dfQ0hFQ0tfTU9EVUxFUyhP VkVSTEFZX1hWTElCLCBbeHYgeDExIHhleHQgZHJpMnByb3RvID49IDIuNl0sIGVuYWJsZV9vdmVy bGF5X3h2bGliPXllcywgZW5hYmxlX292ZXJsYXlfeHZsaWI9bm8pCiBQS0dfQ0hFQ0tfTU9EVUxF UyhPVkVSTEFZX1hMSUIsIFtjYWlyby14bGliIGRyaTJwcm90byA+PSAyLjZdLCBlbmFibGVfb3Zl cmxheV94bGliPXllcywgZW5hYmxlX292ZXJsYXlfeGxpYj1ubykKZGlmZiAtLWdpdCBhL3Rlc3Rz Ly5naXRpZ25vcmUgYi90ZXN0cy8uZ2l0aWdub3JlCmluZGV4IGJlZGE1MTEuLjgwYWY5YTcgMTAw NjQ0Ci0tLSBhL3Rlc3RzLy5naXRpZ25vcmUKKysrIGIvdGVzdHMvLmdpdGlnbm9yZQpAQCAtMTI2 LDYgKzEyNiw3IEBAIGdlbjNfcmVuZGVyX3RpbGVkeV9ibGl0cwogZ2VuN19mb3JjZXdha2VfbXQK IGttc18zZAoga21zX2FkZGZiX2Jhc2ljCitrbXNfYXRvbWljCiBrbXNfY3J0Y19iYWNrZ3JvdW5k X2NvbG9yCiBrbXNfY3Vyc29yX2NyYwoga21zX2RyYXdfY3JjCmRpZmYgLS1naXQgYS90ZXN0cy9N YWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCBhYzczMWY5Li44 ZmIyZGU4IDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01h a2VmaWxlLnNvdXJjZXMKQEAgLTYzLDYgKzYzLDcgQEAgVEVTVFNfcHJvZ3NfTSA9IFwKIAlnZW1f dXNlcnB0cl9ibGl0cyBcCiAJZ2VtX3dyaXRlX3JlYWRfcmluZ19zd2l0Y2ggXAogCWttc19hZGRm Yl9iYXNpYyBcCisJa21zX2F0b21pYyBcCiAJa21zX2N1cnNvcl9jcmMgXAogCWttc19kcmF3X2Ny YyBcCiAJa21zX2ZiY19jcmMgXApkaWZmIC0tZ2l0IGEvdGVzdHMva21zX2F0b21pYy5jIGIvdGVz dHMva21zX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2I4 OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXNfYXRvbWljLmMKQEAgLTAsMCArMSwxMzQ1 IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHly aWdodCDCqSAyMDE0LTIwMTUgQ29sbGFib3JhLCBMdGQuCisgKgorICogUGVybWlzc2lvbiBpcyBo ZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK KyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZp bGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0 IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRz IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGlj ZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNv LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUg Y29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRo ZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Ig c3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwg RVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUg V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRI RSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBE QU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENP TlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElO IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5H UworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBNaWNhaCBGZWRr ZSA8bWljYWguZmVka2VAY29sbGFib3JhLmNvLnVrPgorICogICAgRGFuaWVsIFN0b25lIDxkYW5p ZWxzQGNvbGxhYm9yYS5jb20+CisgKiAgICBQZWtrYSBQYWFsYW5lbiA8cGVra2EucGFhbGFuZW5A Y29sbGFib3JhLmNvLnVrPgorICovCisKKy8qCisgKiBUZXN0Y2FzZTogdGVzdGluZyBhdG9taWMg bW9kZXNldHRpbmcgQVBJCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0 ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVk ZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx4Zjg2ZHJtTW9kZS5o PgorI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaW9jdGxf d3JhcHBlcnMuaCIKKyNpbmNsdWRlICJkcm10ZXN0LmgiCisjaW5jbHVkZSAiaWd0LmgiCisjaW5j bHVkZSAiaWd0X2F1eC5oIgorCisjaWZuZGVmIERSTV9DTElFTlRfQ0FQX0FUT01JQworI2RlZmlu ZSBEUk1fQ0xJRU5UX0NBUF9BVE9NSUMgMworI2VuZGlmCisKKyNpZm5kZWYgRFJNX0NBUF9DVVJT T1JfV0lEVEgKKyNkZWZpbmUgRFJNX0NBUF9DVVJTT1JfV0lEVEggMHg4CisjZW5kaWYKKworI2lm bmRlZiBEUk1fQ0FQX0NVUlNPUl9IRUlHSFQKKyNkZWZpbmUgRFJNX0NBUF9DVVJTT1JfSEVJR0hU IDB4OQorI2VuZGlmCisKKyNpZm5kZWYgRFJNX01PREVfQVRPTUlDX1RFU1RfT05MWQorI2RlZmlu ZSBEUk1fTU9ERV9BVE9NSUNfVEVTVF9PTkxZIDB4MDEwMAorI2RlZmluZSBEUk1fTU9ERV9BVE9N SUNfTk9OQkxPQ0sgMHgwMjAwCisjZGVmaW5lIERSTV9NT0RFX0FUT01JQ19BTExPV19NT0RFU0VU IDB4MDQwMAorCitzdHJ1Y3QgZHJtX21vZGVfYXRvbWljIHsKKwlfX3UzMiBmbGFnczsKKwlfX3Uz MiBjb3VudF9vYmpzOworCV9fdTY0IG9ianNfcHRyOworCV9fdTY0IGNvdW50X3Byb3BzX3B0cjsK KwlfX3U2NCBwcm9wc19wdHI7CisJX191NjQgcHJvcF92YWx1ZXNfcHRyOworCV9fdTY0IHJlc2Vy dmVkOworCV9fdTY0IHVzZXJfZGF0YTsKK307CisjZW5kaWYKKworSUdUX1RFU1RfREVTQ1JJUFRJ T04oIlRlc3QgYXRvbWljIG1vZGVzZXR0aW5nIEFQSSIpOworCitlbnVtIGttc19hdG9taWNfY2hl Y2tfcmVsYXggeworCUFUT01JQ19SRUxBWF9OT05FID0gMCwKKwlDUlRDX1JFTEFYX01PREUgPSAo MSA8PCAwKSwKKwlQTEFORV9SRUxBWF9GQiA9ICgxIDw8IDEpCit9OworCisvKioKKyAqIEtNUyBw bGFuZSB0eXBlIGVudW0KKyAqCisgKiBLTVMgcGxhbmUgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5 IGVudW1zLCB3aGljaCBkbyBub3QgaGF2ZSBzdGFibGUgbnVtZXJpYworICogdmFsdWVzLCBidXQg bXVzdCBiZSBsb29rZWQgdXAgYnkgdGhlaXIgc3RyaW5nIHZhbHVlIGVhY2ggdGltZS4KKyAqCisg KiBUbyBtYWtlIHRoZSBjb2RlIG1vcmUgc2ltcGxlLCB3ZSBkZWZpbmUgYSBwbGFuZV90eXBlIGVu dW0gd2hpY2ggbWFwcyB0bworICogZWFjaCBLTVMgZW51bSB2YWx1ZS4gVGhlc2UgdmFsdWVzIG11 c3QgYmUgbG9va2VkIHVwIHRocm91Z2ggdGhlIG1hcCwgYW5kCisgKiBjYW5ub3QgYmUgcGFzc2Vk IGRpcmVjdGx5IHRvIEtNUyBmdW5jdGlvbnMuCisgKi8KK2VudW0gcGxhbmVfdHlwZSB7CisJUExB TkVfVFlQRV9QUklNQVJZID0gMCwKKwlQTEFORV9UWVBFX09WRVJMQVksCisJUExBTkVfVFlQRV9D VVJTT1IsCisJTlVNX1BMQU5FX1RZUEVfUFJPUFMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpw bGFuZV90eXBlX3Byb3BfbmFtZXNbTlVNX1BMQU5FX1RZUEVfUFJPUFNdID0geworCSJQcmltYXJ5 IiwKKwkiT3ZlcmxheSIsCisJIkN1cnNvciIKK307CisKK2VudW0gcGxhbmVfcHJvcGVydGllcyB7 CisJUExBTkVfU1JDX1ggPSAwLAorCVBMQU5FX1NSQ19ZLAorCVBMQU5FX1NSQ19XLAorCVBMQU5F X1NSQ19ILAorCVBMQU5FX0NSVENfWCwKKwlQTEFORV9DUlRDX1ksCisJUExBTkVfQ1JUQ19XLAor CVBMQU5FX0NSVENfSCwKKwlQTEFORV9GQl9JRCwKKwlQTEFORV9DUlRDX0lELAorCVBMQU5FX1RZ UEUsCisJTlVNX1BMQU5FX1BST1BTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcGxhbmVfcHJv cF9uYW1lc1tOVU1fUExBTkVfUFJPUFNdID0geworCSJTUkNfWCIsCisJIlNSQ19ZIiwKKwkiU1JD X1ciLAorCSJTUkNfSCIsCisJIkNSVENfWCIsCisJIkNSVENfWSIsCisJIkNSVENfVyIsCisJIkNS VENfSCIsCisJIkZCX0lEIiwKKwkiQ1JUQ19JRCIsCisJInR5cGUiCit9OworCitlbnVtIGNydGNf cHJvcGVydGllcyB7CisJQ1JUQ19NT0RFX0lEID0gMCwKKwlDUlRDX0FDVElWRSwKKwlOVU1fQ1JU Q19QUk9QUworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNydGNfcHJvcF9uYW1lc1tOVU1fQ1JU Q19QUk9QU10gPSB7CisJIk1PREVfSUQiLAorCSJBQ1RJVkUiCit9OworCitlbnVtIGNvbm5lY3Rv cl9wcm9wZXJ0aWVzIHsKKwlDT05ORUNUT1JfQ1JUQ19JRCA9IDAsCisJTlVNX0NPTk5FQ1RPUl9Q Uk9QUworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbm5lY3Rvcl9wcm9wX25hbWVzW05VTV9D T05ORUNUT1JfUFJPUFNdID0geworCSJDUlRDX0lEIgorfTsKKworI2RlZmluZSBNQVhfUExBTkVT IDE1CisjZGVmaW5lIE1BWF9DUlRDUyAzCisjZGVmaW5lIE1BWF9DT05ORUNUT1JTIDgKKworc3Ry dWN0IGttc19hdG9taWNfYmxvYiB7CisJdWludDMyX3QgaWQ7IC8qIDAgaWYgbm90IGFscmVhZHkg YWxsb2NhdGVkICovCisJc2l6ZV90IGxlbjsKKwl2b2lkICpkYXRhOworfTsKKworc3RydWN0IGtt c19hdG9taWNfY29ubmVjdG9yX3N0YXRlIHsKKwlzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSAqc3Rh dGU7CisJdWludDMyX3Qgb2JqOworCXVpbnQzMl90IGNydGNfaWQ7Cit9OworCitzdHJ1Y3Qga21z X2F0b21pY19wbGFuZV9zdGF0ZSB7CisJc3RydWN0IGttc19hdG9taWNfc3RhdGUgKnN0YXRlOwor CXVpbnQzMl90IG9iajsKKwllbnVtIHBsYW5lX3R5cGUgdHlwZTsKKwl1aW50MzJfdCBjcnRjX21h c2s7CisJdWludDMyX3QgY3J0Y19pZDsgLyogMCB0byBkaXNhYmxlICovCisJdWludDMyX3QgZmJf aWQ7IC8qIDAgdG8gZGlzYWJsZSAqLworCXVpbnQzMl90IHNyY194LCBzcmNfeSwgc3JjX3csIHNy Y19oOyAvKiAxNi4xNiBmaXhlZC1wb2ludCAqLworCXVpbnQzMl90IGNydGNfeCwgY3J0Y195LCBj cnRjX3csIGNydGNfaDsgLyogbm9ybWFsIGludGVnZXJzICovCit9OworCitzdHJ1Y3Qga21zX2F0 b21pY19jcnRjX3N0YXRlIHsKKwlzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSAqc3RhdGU7CisJdWlu dDMyX3Qgb2JqOworCWludCBpZHg7CisJYm9vbCBhY3RpdmU7CisJc3RydWN0IGttc19hdG9taWNf YmxvYiBtb2RlOworfTsKKworc3RydWN0IGttc19hdG9taWNfc3RhdGUgeworCXN0cnVjdCBrbXNf YXRvbWljX2Nvbm5lY3Rvcl9zdGF0ZSBjb25uZWN0b3JzW01BWF9DT05ORUNUT1JTXTsKKwlzdHJ1 Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlIGNydGNzW01BWF9DUlRDU107CisJc3RydWN0IGttc19h dG9taWNfcGxhbmVfc3RhdGUgcGxhbmVzW01BWF9QTEFORVNdOworCXN0cnVjdCBrbXNfYXRvbWlj X2Rlc2MgKmRlc2M7Cit9OworCitzdHJ1Y3Qga21zX2F0b21pY19kZXNjIHsKKwlpbnQgZmQ7CisJ dWludDMyX3QgcHJvcHNfY29ubmVjdG9yW05VTV9DT05ORUNUT1JfUFJPUFNdOworCXVpbnQzMl90 IHByb3BzX2NydGNbTlVNX0NSVENfUFJPUFNdOworCXVpbnQzMl90IHByb3BzX3BsYW5lW05VTV9Q TEFORV9QUk9QU107CisJdWludDY0X3QgcHJvcHNfcGxhbmVfdHlwZVtOVU1fUExBTkVfVFlQRV9Q Uk9QU107Cit9OworCitzdGF0aWMgdWludDMyX3QgYmxvYl9kdXBsaWNhdGUoaW50IGZkLCB1aW50 MzJfdCBpZF9vcmlnKQoreworCWRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgb3JpZyA9IGRybU1vZGVH ZXRQcm9wZXJ0eUJsb2IoZmQsIGlkX29yaWcpOworCXVpbnQzMl90IGlkX25ldzsKKworCWlndF9h c3NlcnQob3JpZyk7CisJZG9fb3JfZGllKGRybU1vZGVDcmVhdGVQcm9wZXJ0eUJsb2IoZmQsIG9y aWctPmRhdGEsIG9yaWctPmxlbmd0aCwKKwkJCQkJICAgICZpZF9uZXcpKTsKKwlkcm1Nb2RlRnJl ZVByb3BlcnR5QmxvYihvcmlnKTsKKworCXJldHVybiBpZF9uZXc7Cit9CisKKyNkZWZpbmUgY3J0 Y19zZXRfcHJvcChyZXEsIGNydGMsIHByb3AsIHZhbHVlKSBcCisJaWd0X2Fzc2VydF9sdCgwLCBk cm1Nb2RlQXRvbWljQWRkUHJvcGVydHkocmVxLCBjcnRjLT5vYmosIFwKKwkJCQkJCSAgY3J0Yy0+ c3RhdGUtPmRlc2MtPnByb3BzX2NydGNbcHJvcF0sIFwKKwkJCQkJCSAgdmFsdWUpKTsKKworI2Rl ZmluZSBwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBwcm9wLCB2YWx1ZSkgXAorCWlndF9hc3Nl cnRfbHQoMCwgZHJtTW9kZUF0b21pY0FkZFByb3BlcnR5KHJlcSwgcGxhbmUtPm9iaiwgXAorCQkJ CQkJICBwbGFuZS0+c3RhdGUtPmRlc2MtPnByb3BzX3BsYW5lW3Byb3BdLCBcCisJCQkJCQkgIHZh bHVlKSk7CisKKyNkZWZpbmUgZG9fYXRvbWljX2NvbW1pdChmZCwgcmVxLCBmbGFncykgXAorCWRv X29yX2RpZShkcm1Nb2RlQXRvbWljQ29tbWl0KGZkLCByZXEsIGZsYWdzLCBOVUxMKSk7CisKKyNk ZWZpbmUgZG9fYXRvbWljX2NvbW1pdF9lcnIoZmQsIHJlcSwgZmxhZ3MsIGVycikgeyBcCisJaWd0 X2Fzc2VydF9uZXEoZHJtTW9kZUF0b21pY0NvbW1pdChmZCwgcmVxLCBmbGFncywgTlVMTCksIDAp OyBcCisJaWd0X2Fzc2VydF9lcShlcnJubywgZXJyKTsgXAorfQorCisjZGVmaW5lIGNydGNfY29t bWl0X2F0b21pYyhjcnRjLCBwbGFuZSwgcmVxLCByZWxheCkgeyBcCisJZHJtTW9kZUF0b21pY1Nl dEN1cnNvcihyZXEsIDApOyBcCisJY3J0Y19wb3B1bGF0ZV9yZXEoY3J0YywgcmVxKTsgXAorCXBs YW5lX3BvcHVsYXRlX3JlcShwbGFuZSwgcmVxKTsgXAorCWRvX2F0b21pY19jb21taXQoKGNydGMp LT5zdGF0ZS0+ZGVzYy0+ZmQsIHJlcSwgMCk7IFwKKwljcnRjX2NoZWNrX2N1cnJlbnRfc3RhdGUo Y3J0YywgcGxhbmUsIHJlbGF4KTsgXAorCXBsYW5lX2NoZWNrX2N1cnJlbnRfc3RhdGUocGxhbmUs IHJlbGF4KTsgXAorfQorCisjZGVmaW5lIGNydGNfY29tbWl0X2F0b21pY19lcnIoY3J0YywgcGxh bmUsIGNydGNfb2xkLCBwbGFuZV9vbGQsIHJlcSwgcmVsYXgsIGUpIHsgXAorCWRybU1vZGVBdG9t aWNTZXRDdXJzb3IocmVxLCAwKTsgXAorCWNydGNfcG9wdWxhdGVfcmVxKGNydGMsIHJlcSk7IFwK KwlwbGFuZV9wb3B1bGF0ZV9yZXEocGxhbmUsIHJlcSk7IFwKKwlkb19hdG9taWNfY29tbWl0X2Vy cigoY3J0YyktPnN0YXRlLT5kZXNjLT5mZCwgcmVxLCAwLCBlKTsgXAorCWNydGNfY2hlY2tfY3Vy cmVudF9zdGF0ZShjcnRjX29sZCwgcGxhbmVfb2xkLCByZWxheCk7IFwKKwlwbGFuZV9jaGVja19j dXJyZW50X3N0YXRlKHBsYW5lX29sZCwgcmVsYXgpOyBcCit9CisKKyNkZWZpbmUgcGxhbmVfY29t bWl0X2F0b21pYyhwbGFuZSwgcmVxLCByZWxheCkgeyBcCisJZHJtTW9kZUF0b21pY1NldEN1cnNv cihyZXEsIDApOyBcCisJcGxhbmVfcG9wdWxhdGVfcmVxKHBsYW5lLCByZXEpOyBcCisJZG9fYXRv bWljX2NvbW1pdCgocGxhbmUpLT5zdGF0ZS0+ZGVzYy0+ZmQsIHJlcSwgMCk7IFwKKwlwbGFuZV9j aGVja19jdXJyZW50X3N0YXRlKHBsYW5lLCByZWxheCk7IFwKK30KKworI2RlZmluZSBwbGFuZV9j b21taXRfYXRvbWljX2VycihwbGFuZSwgcGxhbmVfb2xkLCByZXEsIHJlbGF4LCBlKSB7IFwKKwlk cm1Nb2RlQXRvbWljU2V0Q3Vyc29yKHJlcSwgMCk7IFwKKwlwbGFuZV9wb3B1bGF0ZV9yZXEocGxh bmUsIHJlcSk7IFwKKwlkb19hdG9taWNfY29tbWl0X2VycigocGxhbmUpLT5zdGF0ZS0+ZGVzYy0+ ZmQsIHJlcSwgMCwgZSk7IFwKKwlwbGFuZV9jaGVja19jdXJyZW50X3N0YXRlKHBsYW5lX29sZCwg cmVsYXgpOyBcCit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0b3JfZ2V0X2N1cnJlbnRfc3RhdGUo c3RydWN0IGttc19hdG9taWNfY29ubmVjdG9yX3N0YXRlICpjb25uZWN0b3IpCit7CisJZHJtTW9k ZU9iamVjdFByb3BlcnRpZXNQdHIgcHJvcHM7CisJaW50IGk7CisKKwlwcm9wcyA9IGRybU1vZGVP YmplY3RHZXRQcm9wZXJ0aWVzKGNvbm5lY3Rvci0+c3RhdGUtPmRlc2MtPmZkLAorCQkJCQkgICBj b25uZWN0b3ItPm9iaiwKKwkJCQkJICAgRFJNX01PREVfT0JKRUNUX0NPTk5FQ1RPUik7CisJaWd0 X2Fzc2VydChwcm9wcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHMtPmNvdW50X3Byb3BzOyBp KyspIHsKKwkJdWludDMyX3QgKnByb3BfaWRzID0gY29ubmVjdG9yLT5zdGF0ZS0+ZGVzYy0+cHJv cHNfY29ubmVjdG9yOworCisJCWlmIChwcm9wcy0+cHJvcHNbaV0gPT0gcHJvcF9pZHNbQ09OTkVD VE9SX0NSVENfSURdKQorCQkJY29ubmVjdG9yLT5jcnRjX2lkID0gcHJvcHMtPnByb3BfdmFsdWVz W2ldOworCX0KKwlkcm1Nb2RlRnJlZU9iamVjdFByb3BlcnRpZXMocHJvcHMpOworfQorCisjaWYg MAorLyogWFhYOiBDaGVja2luZyB0aGlzIHJlcGVhdGVkbHkgYWN0dWFsbHkgaGFuZ3MgdGhlIEdQ VS4gSSBoYXZlIGxpdGVyYWxseSBubworICogICAgICBpZGVhIHdoeS4gKi8KK3N0YXRpYyB2b2lk Citjb25uZWN0b3JfY2hlY2tfY3VycmVudF9zdGF0ZShzdHJ1Y3Qga21zX2F0b21pY19jb25uZWN0 b3Jfc3RhdGUgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qga21zX2F0b21pY19jb25uZWN0b3Jfc3Rh dGUgY29ubmVjdG9yX2tlcm5lbDsKKwlkcm1Nb2RlQ29ubmVjdG9yUHRyIGxlZ2FjeTsKKwl1aW50 MzJfdCBjcnRjX2lkOworCisJbGVnYWN5ID0gZHJtTW9kZUdldENvbm5lY3RvckN1cnJlbnQoY29u bmVjdG9yLT5zdGF0ZS0+ZGVzYy0+ZmQsCisJCQkJCSAgICBjb25uZWN0b3ItPm9iaik7CisJaWd0 X2Fzc2VydChsZWdhY3kpOworCisJaWYgKGxlZ2FjeS0+ZW5jb2Rlcl9pZCkgeworCQlkcm1Nb2Rl RW5jb2RlclB0ciBsZWdhY3lfZW5jOworCisJCWxlZ2FjeV9lbmMgPSBkcm1Nb2RlR2V0RW5jb2Rl cihjb25uZWN0b3ItPnN0YXRlLT5kZXNjLT5mZCwKKwkJCQkJICAgICAgIGxlZ2FjeS0+ZW5jb2Rl cl9pZCk7CisJCWlndF9hc3NlcnQobGVnYWN5X2VuYyk7CisKKwkJY3J0Y19pZCA9IGxlZ2FjeV9l bmMtPmNydGNfaWQ7CisJCWRybU1vZGVGcmVlRW5jb2RlcihsZWdhY3lfZW5jKTsKKwl9IGVsc2Ug eworCQljcnRjX2lkID0gMDsKKwl9CisKKwlpZ3RfYXNzZXJ0X2VxX3UzMihjcnRjX2lkLCBjb25u ZWN0b3ItPmNydGNfaWQpOworCisJbWVtY3B5KCZjb25uZWN0b3Jfa2VybmVsLCBjb25uZWN0b3Is IHNpemVvZihjb25uZWN0b3Jfa2VybmVsKSk7CisJY29ubmVjdG9yX2dldF9jdXJyZW50X3N0YXRl KCZjb25uZWN0b3Jfa2VybmVsKTsKKwlkb19vcl9kaWUobWVtY21wKCZjb25uZWN0b3Jfa2VybmVs LCBjb25uZWN0b3IsCisJCQkgc2l6ZW9mKGNvbm5lY3Rvcl9rZXJuZWwpKSk7CisKKwlkcm1Nb2Rl RnJlZUNvbm5lY3RvcihsZWdhY3kpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qga21zX2F0 b21pY19jb25uZWN0b3Jfc3RhdGUgKgorZmluZF9jb25uZWN0b3Ioc3RydWN0IGttc19hdG9taWNf c3RhdGUgKnN0YXRlLAorCSAgICAgICBzdHJ1Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlICpjcnRj KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdGUtPmNvbm5l Y3RvcnMpOyBpKyspIHsKKwkJc3RydWN0IGttc19hdG9taWNfY29ubmVjdG9yX3N0YXRlICpjb25u ZWN0b3IgPQorCQkJJnN0YXRlLT5jb25uZWN0b3JzW2ldOworCisJCWlmICghY29ubmVjdG9yLT5v YmopCisJCQljb250aW51ZTsKKwkJaWYgKGNydGMgJiYgY29ubmVjdG9yLT5jcnRjX2lkICE9IGNy dGMtPm9iaikKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiBjb25uZWN0b3I7CisJfQorCisJcmV0 dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5lX3BvcHVsYXRlX3JlcShzdHJ1Y3Qga21z X2F0b21pY19wbGFuZV9zdGF0ZSAqcGxhbmUsCisJCQkgICAgICAgZHJtTW9kZUF0b21pY1JlcSAq cmVxKQoreworCXBsYW5lX3NldF9wcm9wKHJlcSwgcGxhbmUsIFBMQU5FX0NSVENfSUQsIHBsYW5l LT5jcnRjX2lkKTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9GQl9JRCwgcGxh bmUtPmZiX2lkKTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9TUkNfWCwgcGxh bmUtPnNyY194KTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9TUkNfWSwgcGxh bmUtPnNyY195KTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9TUkNfVywgcGxh bmUtPnNyY193KTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9TUkNfSCwgcGxh bmUtPnNyY19oKTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9DUlRDX1gsIHBs YW5lLT5jcnRjX3gpOworCXBsYW5lX3NldF9wcm9wKHJlcSwgcGxhbmUsIFBMQU5FX0NSVENfWSwg cGxhbmUtPmNydGNfeSk7CisJcGxhbmVfc2V0X3Byb3AocmVxLCBwbGFuZSwgUExBTkVfQ1JUQ19X LCBwbGFuZS0+Y3J0Y193KTsKKwlwbGFuZV9zZXRfcHJvcChyZXEsIHBsYW5lLCBQTEFORV9DUlRD X0gsIHBsYW5lLT5jcnRjX2gpOworfQorCitzdGF0aWMgdm9pZCBwbGFuZV9nZXRfY3VycmVudF9z dGF0ZShzdHJ1Y3Qga21zX2F0b21pY19wbGFuZV9zdGF0ZSAqcGxhbmUpCit7CisJc3RydWN0IGtt c19hdG9taWNfZGVzYyAqZGVzYyA9IHBsYW5lLT5zdGF0ZS0+ZGVzYzsKKwlkcm1Nb2RlT2JqZWN0 UHJvcGVydGllc1B0ciBwcm9wczsKKwlpbnQgaTsKKworCXByb3BzID0gZHJtTW9kZU9iamVjdEdl dFByb3BlcnRpZXMoZGVzYy0+ZmQsIHBsYW5lLT5vYmosCisJCQkJCSAgIERSTV9NT0RFX09CSkVD VF9QTEFORSk7CisJaWd0X2Fzc2VydChwcm9wcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHMt PmNvdW50X3Byb3BzOyBpKyspIHsKKwkJdWludDMyX3QgKnByb3BfaWRzID0gZGVzYy0+cHJvcHNf cGxhbmU7CisKKwkJaWYgKHByb3BzLT5wcm9wc1tpXSA9PSBwcm9wX2lkc1tQTEFORV9DUlRDX0lE XSkKKwkJCXBsYW5lLT5jcnRjX2lkID0gcHJvcHMtPnByb3BfdmFsdWVzW2ldOworCQllbHNlIGlm IChwcm9wcy0+cHJvcHNbaV0gPT0gcHJvcF9pZHNbUExBTkVfRkJfSURdKQorCQkJcGxhbmUtPmZi X2lkID0gcHJvcHMtPnByb3BfdmFsdWVzW2ldOworCQllbHNlIGlmIChwcm9wcy0+cHJvcHNbaV0g PT0gcHJvcF9pZHNbUExBTkVfQ1JUQ19YXSkKKwkJCXBsYW5lLT5jcnRjX3ggPSBwcm9wcy0+cHJv cF92YWx1ZXNbaV07CisJCWVsc2UgaWYgKHByb3BzLT5wcm9wc1tpXSA9PSBwcm9wX2lkc1tQTEFO RV9DUlRDX1ldKQorCQkJcGxhbmUtPmNydGNfeSA9IHByb3BzLT5wcm9wX3ZhbHVlc1tpXTsKKwkJ ZWxzZSBpZiAocHJvcHMtPnByb3BzW2ldID09IHByb3BfaWRzW1BMQU5FX0NSVENfV10pCisJCQlw bGFuZS0+Y3J0Y193ID0gcHJvcHMtPnByb3BfdmFsdWVzW2ldOworCQllbHNlIGlmIChwcm9wcy0+ cHJvcHNbaV0gPT0gcHJvcF9pZHNbUExBTkVfQ1JUQ19IXSkKKwkJCXBsYW5lLT5jcnRjX2ggPSBw cm9wcy0+cHJvcF92YWx1ZXNbaV07CisJCWVsc2UgaWYgKHByb3BzLT5wcm9wc1tpXSA9PSBwcm9w X2lkc1tQTEFORV9TUkNfWF0pCisJCQlwbGFuZS0+c3JjX3ggPSBwcm9wcy0+cHJvcF92YWx1ZXNb aV07CisJCWVsc2UgaWYgKHByb3BzLT5wcm9wc1tpXSA9PSBwcm9wX2lkc1tQTEFORV9TUkNfWV0p CisJCQlwbGFuZS0+c3JjX3kgPSBwcm9wcy0+cHJvcF92YWx1ZXNbaV07CisJCWVsc2UgaWYgKHBy b3BzLT5wcm9wc1tpXSA9PSBwcm9wX2lkc1tQTEFORV9TUkNfV10pCisJCQlwbGFuZS0+c3JjX3cg PSBwcm9wcy0+cHJvcF92YWx1ZXNbaV07CisJCWVsc2UgaWYgKHByb3BzLT5wcm9wc1tpXSA9PSBw cm9wX2lkc1tQTEFORV9TUkNfSF0pCisJCQlwbGFuZS0+c3JjX2ggPSBwcm9wcy0+cHJvcF92YWx1 ZXNbaV07CisJCWVsc2UgaWYgKHByb3BzLT5wcm9wc1tpXSA9PSBwcm9wX2lkc1tQTEFORV9UWVBF XSkgeworCQkJaW50IGo7CisKKwkJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGRlc2MtPnBy b3BzX3BsYW5lX3R5cGUpOyBqKyspIHsKKwkJCQlpZiAocHJvcHMtPnByb3BfdmFsdWVzW2ldID09 IGRlc2MtPnByb3BzX3BsYW5lX3R5cGVbal0pIHsKKwkJCQkJcGxhbmUtPnR5cGUgPSBqOworCQkJ CQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlkcm1Nb2RlRnJlZU9iamVjdFByb3Bl cnRpZXMocHJvcHMpOworfQorCitzdGF0aWMgdm9pZCBwbGFuZV9jaGVja19jdXJyZW50X3N0YXRl KHN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSwKKwkJCQkgICAgICBlbnVtIGtt c19hdG9taWNfY2hlY2tfcmVsYXggcmVsYXgpCit7CisJZHJtTW9kZVBsYW5lUHRyIGxlZ2FjeTsK KwlzdHJ1Y3Qga21zX2F0b21pY19wbGFuZV9zdGF0ZSBwbGFuZV9rZXJuZWw7CisKKwlsZWdhY3kg PSBkcm1Nb2RlR2V0UGxhbmUocGxhbmUtPnN0YXRlLT5kZXNjLT5mZCwgcGxhbmUtPm9iaik7CisJ aWd0X2Fzc2VydChsZWdhY3kpOworCisJaWd0X2Fzc2VydF9lcV91MzIobGVnYWN5LT5jcnRjX2lk LCBwbGFuZS0+Y3J0Y19pZCk7CisKKwlpZiAoIShyZWxheCAmIFBMQU5FX1JFTEFYX0ZCKSkKKwkJ aWd0X2Fzc2VydF9lcV91MzIobGVnYWN5LT5mYl9pZCwgcGxhbmUtPmZiX2lkKTsKKworCW1lbWNw eSgmcGxhbmVfa2VybmVsLCBwbGFuZSwgc2l6ZW9mKHBsYW5lX2tlcm5lbCkpOworCXBsYW5lX2dl dF9jdXJyZW50X3N0YXRlKCZwbGFuZV9rZXJuZWwpOworCisJLyogTGVnYWN5IGN1cnNvciBpb2N0 bHMgY3JlYXRlIHRoZWlyIG93biwgdW5rbm93YWJsZSwgaW50ZXJuYWwKKwkgKiBmcmFtZWJ1ZmZl ciB3aGljaCB3ZSBjYW4ndCByZWFzb24gYWJvdXQuICovCisJaWYgKHJlbGF4ICYgUExBTkVfUkVM QVhfRkIpCisJCXBsYW5lX2tlcm5lbC5mYl9pZCA9IHBsYW5lLT5mYl9pZDsKKwlkb19vcl9kaWUo bWVtY21wKCZwbGFuZV9rZXJuZWwsIHBsYW5lLCBzaXplb2YocGxhbmVfa2VybmVsKSkpOworCisJ ZHJtTW9kZUZyZWVQbGFuZShsZWdhY3kpOworfQorCitzdGF0aWMgdm9pZCBwbGFuZV9jb21taXRf bGVnYWN5KHN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZW51bSBrbXNfYXRvbWljX2NoZWNrX3JlbGF4IHJlbGF4KQor eworCWRvX29yX2RpZShkcm1Nb2RlU2V0UGxhbmUocGxhbmUtPnN0YXRlLT5kZXNjLT5mZCwgcGxh bmUtPm9iaiwKKwkJCQkgIHBsYW5lLT5jcnRjX2lkLAorCQkJCSAgcGxhbmUtPmZiX2lkLCAwLAor CQkJCSAgcGxhbmUtPmNydGNfeCwgcGxhbmUtPmNydGNfeSwKKwkJCQkgIHBsYW5lLT5jcnRjX3cs IHBsYW5lLT5jcnRjX2gsCisJCQkJICBwbGFuZS0+c3JjX3gsIHBsYW5lLT5zcmNfeSwKKwkJCQkg IHBsYW5lLT5zcmNfdywgcGxhbmUtPnNyY19oKSk7CisJcGxhbmVfY2hlY2tfY3VycmVudF9zdGF0 ZShwbGFuZSwgcmVsYXgpOworfQorCitzdGF0aWMgc3RydWN0IGttc19hdG9taWNfcGxhbmVfc3Rh dGUgKgorZmluZF9wbGFuZShzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSAqc3RhdGUsIGVudW0gcGxh bmVfdHlwZSB0eXBlLAorCSAgIHN0cnVjdCBrbXNfYXRvbWljX2NydGNfc3RhdGUgKmNydGMpCit7 CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0ZS0+cGxhbmVzKTsg aSsrKSB7CisJCXN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSA9ICZzdGF0ZS0+ cGxhbmVzW2ldOworCisJCWlmICghcGxhbmUtPm9iaikKKwkJCWNvbnRpbnVlOworCQlpZiAodHlw ZSAhPSBOVU1fUExBTkVfVFlQRV9QUk9QUyAmJiBwbGFuZS0+dHlwZSAhPSB0eXBlKQorCQkJY29u dGludWU7CisJCWlmIChjcnRjICYmICEocGxhbmUtPmNydGNfbWFzayAmICgxIDw8IGNydGMtPmlk eCkpKQorCQkJY29udGludWU7CisKKwkJcGxhbmVfZ2V0X2N1cnJlbnRfc3RhdGUocGxhbmUpOwor CQlyZXR1cm4gcGxhbmU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNy dGNfcG9wdWxhdGVfcmVxKHN0cnVjdCBrbXNfYXRvbWljX2NydGNfc3RhdGUgKmNydGMsCisJCQkg ICAgICBkcm1Nb2RlQXRvbWljUmVxICpyZXEpCit7CisJY3J0Y19zZXRfcHJvcChyZXEsIGNydGMs IENSVENfTU9ERV9JRCwgY3J0Yy0+bW9kZS5pZCk7CisJY3J0Y19zZXRfcHJvcChyZXEsIGNydGMs IENSVENfQUNUSVZFLCBjcnRjLT5hY3RpdmUpOworfQorCitzdGF0aWMgdm9pZCBjcnRjX2dldF9j dXJyZW50X3N0YXRlKHN0cnVjdCBrbXNfYXRvbWljX2NydGNfc3RhdGUgKmNydGMpCit7CisJZHJt TW9kZU9iamVjdFByb3BlcnRpZXNQdHIgcHJvcHM7CisJaW50IGk7CisKKwlwcm9wcyA9IGRybU1v ZGVPYmplY3RHZXRQcm9wZXJ0aWVzKGNydGMtPnN0YXRlLT5kZXNjLT5mZCwgY3J0Yy0+b2JqLAor CQkJCQkgICBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7CisJaWd0X2Fzc2VydChwcm9wcyk7CisKKwlm b3IgKGkgPSAwOyBpIDwgcHJvcHMtPmNvdW50X3Byb3BzOyBpKyspIHsKKwkJdWludDMyX3QgKnBy b3BfaWRzID0gY3J0Yy0+c3RhdGUtPmRlc2MtPnByb3BzX2NydGM7CisKKwkJaWYgKHByb3BzLT5w cm9wc1tpXSA9PSBwcm9wX2lkc1tDUlRDX01PREVfSURdKSB7CisJCQlkcm1Nb2RlUHJvcGVydHlC bG9iUHRyIGJsb2I7CisKKwkJCWNydGMtPm1vZGUuaWQgPSBwcm9wcy0+cHJvcF92YWx1ZXNbaV07 CisJCQlpZiAoIWNydGMtPm1vZGUuaWQpIHsKKwkJCQljcnRjLT5tb2RlLmxlbiA9IDA7CisJCQkJ Y29udGludWU7CisJCQl9CisKKwkJCWJsb2IgPSBkcm1Nb2RlR2V0UHJvcGVydHlCbG9iKGNydGMt PnN0YXRlLT5kZXNjLT5mZCwKKwkJCQkJCSAgICAgIGNydGMtPm1vZGUuaWQpOworCQkJaWd0X2Fz c2VydChibG9iKTsKKwkJCWlndF9hc3NlcnRfZXFfdTMyKGJsb2ItPmxlbmd0aCwKKwkJCQkJICBz aXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisKKwkJCWlmICghY3J0Yy0+bW9kZS5k YXRhIHx8CisJCQkgICAgbWVtY21wKGNydGMtPm1vZGUuZGF0YSwgYmxvYi0+ZGF0YSwgYmxvYi0+ bGVuZ3RoKSAhPSAwKQorCQkJCWNydGMtPm1vZGUuZGF0YSA9IGJsb2ItPmRhdGE7CisJCQljcnRj LT5tb2RlLmxlbiA9IGJsb2ItPmxlbmd0aDsKKwkJfQorCQllbHNlIGlmIChwcm9wcy0+cHJvcHNb aV0gPT0gcHJvcF9pZHNbQ1JUQ19BQ1RJVkVdKSB7CisJCQljcnRjLT5hY3RpdmUgPSBwcm9wcy0+ cHJvcF92YWx1ZXNbaV07CisJCX0KKwl9CisKKwlkcm1Nb2RlRnJlZU9iamVjdFByb3BlcnRpZXMo cHJvcHMpOworfQorCitzdGF0aWMgdm9pZCBjcnRjX2NoZWNrX2N1cnJlbnRfc3RhdGUoc3RydWN0 IGttc19hdG9taWNfY3J0Y19zdGF0ZSAqY3J0YywKKwkJCQkgICAgIHN0cnVjdCBrbXNfYXRvbWlj X3BsYW5lX3N0YXRlICpwcmltYXJ5LAorCQkJCSAgICAgZW51bSBrbXNfYXRvbWljX2NoZWNrX3Jl bGF4IHJlbGF4KQoreworCXN0cnVjdCBrbXNfYXRvbWljX2NydGNfc3RhdGUgY3J0Y19rZXJuZWw7 CisJZHJtTW9kZUNydGNQdHIgbGVnYWN5OworCisJbGVnYWN5ID0gZHJtTW9kZUdldENydGMoY3J0 Yy0+c3RhdGUtPmRlc2MtPmZkLCBjcnRjLT5vYmopOworCWlndF9hc3NlcnQobGVnYWN5KTsKKwor CWlndF9hc3NlcnRfZXFfdTMyKGxlZ2FjeS0+Y3J0Y19pZCwgY3J0Yy0+b2JqKTsKKwlpZ3RfYXNz ZXJ0X2VxX3UzMihsZWdhY3ktPngsIHByaW1hcnktPnNyY194ID4+IDE2KTsKKwlpZ3RfYXNzZXJ0 X2VxX3UzMihsZWdhY3ktPnksIHByaW1hcnktPnNyY195ID4+IDE2KTsKKworCWlmIChjcnRjLT5h Y3RpdmUpCisJCWlndF9hc3NlcnRfZXFfdTMyKGxlZ2FjeS0+YnVmZmVyX2lkLCBwcmltYXJ5LT5m Yl9pZCk7CisJZWxzZQorCQlpZ3RfYXNzZXJ0X2VxX3UzMihsZWdhY3ktPmJ1ZmZlcl9pZCwgMCk7 CisKKwlpZiAobGVnYWN5LT5tb2RlX3ZhbGlkKSB7CisJCWlndF9hc3NlcnRfbmVxKGxlZ2FjeS0+ bW9kZV92YWxpZCwgMCk7CisJCWlndF9hc3NlcnRfZXEoY3J0Yy0+bW9kZS5sZW4sCisJCSAgICAg ICAgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbykpOworCQlkb19vcl9kaWUo bWVtY21wKCZsZWdhY3ktPm1vZGUsIGNydGMtPm1vZGUuZGF0YSwKKwkJICAgICAgICAgICAgICAg ICBjcnRjLT5tb2RlLmxlbikpOworCQlpZ3RfYXNzZXJ0X2VxKGxlZ2FjeS0+d2lkdGgsIGxlZ2Fj eS0+bW9kZS5oZGlzcGxheSk7CisJCWlndF9hc3NlcnRfZXEobGVnYWN5LT5oZWlnaHQsIGxlZ2Fj eS0+bW9kZS52ZGlzcGxheSk7CisJfSBlbHNlIHsKKwkJaWd0X2Fzc2VydF9lcShsZWdhY3ktPm1v ZGVfdmFsaWQsIDApOworCX0KKworCW1lbWNweSgmY3J0Y19rZXJuZWwsIGNydGMsIHNpemVvZihj cnRjX2tlcm5lbCkpOworCWNydGNfZ2V0X2N1cnJlbnRfc3RhdGUoJmNydGNfa2VybmVsKTsKKwor CWlmIChjcnRjX2tlcm5lbC5tb2RlLmlkICE9IDApCisJCWlndF9hc3NlcnRfZXEoY3J0Y19rZXJu ZWwubW9kZS5sZW4sCisJCSAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9tb2Rl aW5mbykpOworCisJLyogT3B0aW9uYWxseSByZWxheCB0aGUgY2hlY2sgZm9yIE1PREVfSUQ6IHVz aW5nIHRoZSBsZWdhY3kgU2V0Q3J0YworCSAqIEFQSSBjYW4gcG90ZW50aWFsbHkgY2hhbmdlIE1P REVfSUQgZXZlbiBpZiB0aGUgbW9kZSBpdHNlbGYgcmVtYWlucworCSAqIHVuY2hhbmdlZC4gKi8K KwlpZiAoKChyZWxheCAmIENSVENfUkVMQVhfTU9ERSkgJiYKKwkgICAgKGNydGNfa2VybmVsLm1v ZGUuaWQgIT0gY3J0Yy0+bW9kZS5pZCAmJgorCSAgICAgY3J0Y19rZXJuZWwubW9kZS5pZCAhPSAw ICYmIGNydGMtPm1vZGUuaWQgIT0gMCkpICYmCisJICAgIG1lbWNtcChjcnRjX2tlcm5lbC5tb2Rl LmRhdGEsIGNydGMtPm1vZGUuZGF0YSwKKwkJICAgc2l6ZW9mKHN0cnVjdCBkcm1fbW9kZV9tb2Rl aW5mbykpID09IDApIHsKKwkJY3J0Y19rZXJuZWwubW9kZS5pZCA9IGNydGMtPm1vZGUuaWQ7CisJ CWNydGNfa2VybmVsLm1vZGUuZGF0YSA9IGNydGMtPm1vZGUuZGF0YTsKKwl9CisKKwlkb19vcl9k aWUobWVtY21wKCZjcnRjX2tlcm5lbCwgY3J0Yywgc2l6ZW9mKGNydGNfa2VybmVsKSkpOworCisJ ZHJtTW9kZUZyZWVDcnRjKGxlZ2FjeSk7Cit9CisKK3N0YXRpYyB2b2lkIGNydGNfY29tbWl0X2xl Z2FjeShzdHJ1Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlICpjcnRjLAorCQkJICAgICAgIHN0cnVj dCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSwKKwkJCSAgICAgICBlbnVtIGttc19hdG9t aWNfY2hlY2tfcmVsYXggcmVsYXgpCit7CisJZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHIgcHJv cHM7CisJdWludDMyX3QgY29ubmVjdG9yc1tNQVhfQ09OTkVDVE9SU107CisJaW50IG51bV9jb25u ZWN0b3JzID0gMDsKKwlpbnQgaTsKKworCWlmICghY3J0Yy0+YWN0aXZlKSB7CisJCWRvX29yX2Rp ZShkcm1Nb2RlU2V0Q3J0YyhjcnRjLT5zdGF0ZS0+ZGVzYy0+ZmQsCisJCQkJCSBjcnRjLT5vYmos IDAsIDAsIDAsIE5VTEwsIDAsIE5VTEwpKTsKKwkJcmV0dXJuOworCX0KKworCWlndF9hc3NlcnRf bmVxX3UzMihjcnRjLT5tb2RlLmlkLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09OTkVD VE9SUzsgaSsrKSB7CisJCXN0cnVjdCBrbXNfYXRvbWljX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubmVj dG9yID0KKwkJCSZjcnRjLT5zdGF0ZS0+Y29ubmVjdG9yc1tpXTsKKworCQlpZiAoY29ubmVjdG9y LT5jcnRjX2lkICE9IGNydGMtPm9iaikKKwkJCWNvbnRpbnVlOworCisJCWNvbm5lY3RvcnNbbnVt X2Nvbm5lY3RvcnMrK10gPSBjb25uZWN0b3ItPm9iajsKKwl9CisKKwlkb19vcl9kaWUoZHJtTW9k ZVNldENydGMoY3J0Yy0+c3RhdGUtPmRlc2MtPmZkLCBjcnRjLT5vYmosCisJICAgICAgICAgICAg ICAgICAgICAgICAgIHBsYW5lLT5mYl9pZCwKKwkJCQkgcGxhbmUtPnNyY194ID4+IDE2LCBwbGFu ZS0+c3JjX3kgPj4gMTYsCisJCQkJIChudW1fY29ubmVjdG9ycykgPyBjb25uZWN0b3JzIDogTlVM TCwKKwkJCQkgbnVtX2Nvbm5lY3RvcnMsCisJCQkJIGNydGMtPm1vZGUuZGF0YSkpOworCS8qIFdo ZW4gZG9pbmcgYSBsZWdhY3kgY29tbWl0LCB0aGUgY29yZSBtYXkgdXBkYXRlIE1PREVfSUQgdG8g YmUgYSBuZXcKKwkgKiBibG9iIGltcGxpY2l0bHkgY3JlYXRlZCBieSB0aGUgbGVnYWN5IHJlcXVl c3QuIEhlbmNlIHdlIGJhY2tmaWxsCisJICogdGhlIHZhbHVlIGluIHRoZSBzdGF0ZSBvYmplY3Qg dG8gZW5zdXJlIHRoZXkgbWF0Y2guICovCisJcHJvcHMgPSBkcm1Nb2RlT2JqZWN0R2V0UHJvcGVy dGllcyhjcnRjLT5zdGF0ZS0+ZGVzYy0+ZmQsIGNydGMtPm9iaiwKKwkJCQkJICAgRFJNX01PREVf T0JKRUNUX0NSVEMpOworCWlndF9hc3NlcnQocHJvcHMpOworCisJZm9yIChpID0gMDsgaSA8IHBy b3BzLT5jb3VudF9wcm9wczsgaSsrKSB7CisJCWlmIChwcm9wcy0+cHJvcHNbaV0gIT0KKwkJICAg IGNydGMtPnN0YXRlLT5kZXNjLT5wcm9wc19jcnRjW0NSVENfTU9ERV9JRF0pCisJCQljb250aW51 ZTsKKwkJY3J0Yy0+bW9kZS5pZCA9IHByb3BzLT5wcm9wX3ZhbHVlc1tpXTsKKwkJYnJlYWs7CisJ fQorCisJZHJtTW9kZUZyZWVPYmplY3RQcm9wZXJ0aWVzKHByb3BzKTsKKworCWNydGNfY2hlY2tf Y3VycmVudF9zdGF0ZShjcnRjLCBwbGFuZSwgcmVsYXgpOworCXBsYW5lX2NoZWNrX2N1cnJlbnRf c3RhdGUocGxhbmUsIHJlbGF4KTsKK30KKworc3RhdGljIHN0cnVjdCBrbXNfYXRvbWljX2NydGNf c3RhdGUgKmZpbmRfY3J0YyhzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSAqc3RhdGUsCisJCQkJCSAg ICAgICBib29sIG11c3RfYmVfZW5hYmxlZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkg PCBBUlJBWV9TSVpFKHN0YXRlLT5jcnRjcyk7IGkrKykgeworCQlzdHJ1Y3Qga21zX2F0b21pY19j cnRjX3N0YXRlICpjcnRjID0gJnN0YXRlLT5jcnRjc1tpXTsKKworCQlpZiAoIWNydGMtPm9iaikK KwkJCWNvbnRpbnVlOworCQlpZiAobXVzdF9iZV9lbmFibGVkICYmICFjcnRjLT5hY3RpdmUpCisJ CQljb250aW51ZTsKKworCQljcnRjX2dldF9jdXJyZW50X3N0YXRlKGNydGMpOworCQlyZXR1cm4g Y3J0YzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZmlsbF9vYmpfcHJv cHMoaW50IGZkLCB1aW50MzJfdCBpZCwgaW50IHR5cGUsIGludCBudW1fcHJvcHMsCisJCQkgICBj b25zdCBjaGFyICoqcHJvcF9uYW1lcywgdWludDMyX3QgKnByb3BfaWRzKQoreworCWRybU1vZGVP YmplY3RQcm9wZXJ0aWVzUHRyIHByb3BzOworCWludCBpLCBqOworCisJcHJvcHMgPSBkcm1Nb2Rl T2JqZWN0R2V0UHJvcGVydGllcyhmZCwgaWQsIHR5cGUpOworCWlndF9hc3NlcnQocHJvcHMpOwor CisJZm9yIChpID0gMDsgaSA8IHByb3BzLT5jb3VudF9wcm9wczsgaSsrKSB7CisJCWRybU1vZGVQ cm9wZXJ0eVB0ciBwcm9wID0KKwkJCWRybU1vZGVHZXRQcm9wZXJ0eShmZCwgcHJvcHMtPnByb3Bz W2ldKTsKKworCQlmb3IgKGogPSAwOyBqIDwgbnVtX3Byb3BzOyBqKyspIHsKKwkJCWlmIChzdHJj bXAocHJvcC0+bmFtZSwgcHJvcF9uYW1lc1tqXSkgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXBy b3BfaWRzW2pdID0gcHJvcHMtPnByb3BzW2ldOworCQkJYnJlYWs7CisJCX0KKworCQlkcm1Nb2Rl RnJlZVByb3BlcnR5KHByb3ApOworCX0KKworCWRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhw cm9wcyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfb2JqX3Byb3BfbWFwKGludCBmZCwgdWludDMy X3QgaWQsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgaW50IG51bV9lbnVt cywgY29uc3QgY2hhciAqKmVudW1fbmFtZXMsCisJCQkgICAgICB1aW50NjRfdCAqZW51bV9pZHMp Cit7CisJZHJtTW9kZU9iamVjdFByb3BlcnRpZXNQdHIgcHJvcHM7CisJaW50IGksIGosIGs7CisK Kwlwcm9wcyA9IGRybU1vZGVPYmplY3RHZXRQcm9wZXJ0aWVzKGZkLCBpZCwgdHlwZSk7CisJaWd0 X2Fzc2VydChwcm9wcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHMtPmNvdW50X3Byb3BzOyBp KyspIHsKKwkJZHJtTW9kZVByb3BlcnR5UHRyIHByb3AgPQorCQkJZHJtTW9kZUdldFByb3BlcnR5 KGZkLCBwcm9wcy0+cHJvcHNbaV0pOworCisJCWlndF9hc3NlcnQocHJvcCk7CisKKwkJaWYgKHN0 cmNtcChwcm9wLT5uYW1lLCBuYW1lKSAhPSAwKSB7CisJCQlkcm1Nb2RlRnJlZVByb3BlcnR5KHBy b3ApOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgcHJvcC0+Y291bnRf ZW51bXM7IGorKykgeworCQkJc3RydWN0IGRybV9tb2RlX3Byb3BlcnR5X2VudW0gKmUgPSAmcHJv cC0+ZW51bXNbal07CisKKwkJCWZvciAoayA9IDA7IGsgPCBudW1fZW51bXM7IGsrKykgeworCQkJ CWlmIChzdHJjbXAoZS0+bmFtZSwgZW51bV9uYW1lc1trXSkgIT0gMCkKKwkJCQkJY29udGludWU7 CisKKwkJCQllbnVtX2lkc1trXSA9IGUtPnZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisK KwkJZHJtTW9kZUZyZWVQcm9wZXJ0eShwcm9wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0b21p Y19zZXR1cChzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGttc19h dG9taWNfZGVzYyAqZGVzYyA9IHN0YXRlLT5kZXNjOworCWRybU1vZGVSZXNQdHIgcmVzOworCWRy bU1vZGVQbGFuZVJlc1B0ciByZXNfcGxhbmU7CisJaW50IGk7CisKKwlkZXNjLT5mZCA9IGRybV9v cGVuX2RyaXZlcl9tYXN0ZXIoRFJJVkVSX0lOVEVMKTsKKwlpZ3RfYXNzZXJ0X2ZkKGRlc2MtPmZk KTsKKworCWRvX29yX2RpZShkcm1TZXRDbGllbnRDYXAoZGVzYy0+ZmQsIERSTV9DTElFTlRfQ0FQ X0FUT01JQywgMSkpOworCisJcmVzID0gZHJtTW9kZUdldFJlc291cmNlcyhkZXNjLT5mZCk7CisJ cmVzX3BsYW5lID0gZHJtTW9kZUdldFBsYW5lUmVzb3VyY2VzKGRlc2MtPmZkKTsKKwlpZ3RfYXNz ZXJ0KHJlcyk7CisJaWd0X2Fzc2VydChyZXNfcGxhbmUpOworCisJaWd0X2Fzc2VydF9sdCgwLCBy ZXMtPmNvdW50X2NydGNzKTsKKwlpZ3RfYXNzZXJ0X2x0KDAsIHJlc19wbGFuZS0+Y291bnRfcGxh bmVzKTsKKwlpZ3RfYXNzZXJ0X2x0KDAsIHJlcy0+Y291bnRfY29ubmVjdG9ycyk7CisKKworCWZp bGxfb2JqX3Byb3BzKGRlc2MtPmZkLCByZXMtPmNydGNzWzBdLAorCQkgICAgICAgRFJNX01PREVf T0JKRUNUX0NSVEMsIE5VTV9DUlRDX1BST1BTLAorCQkgICAgICAgY3J0Y19wcm9wX25hbWVzLCBk ZXNjLT5wcm9wc19jcnRjKTsKKworCWZpbGxfb2JqX3Byb3BzKGRlc2MtPmZkLCByZXNfcGxhbmUt PnBsYW5lc1swXSwKKwkJICAgICAgIERSTV9NT0RFX09CSkVDVF9QTEFORSwgTlVNX1BMQU5FX1BS T1BTLAorCQkgICAgICAgcGxhbmVfcHJvcF9uYW1lcywgZGVzYy0+cHJvcHNfcGxhbmUpOworCWZp bGxfb2JqX3Byb3BfbWFwKGRlc2MtPmZkLCByZXNfcGxhbmUtPnBsYW5lc1swXSwKKwkJCSAgRFJN X01PREVfT0JKRUNUX1BMQU5FLCAidHlwZSIsCisJCQkgIE5VTV9QTEFORV9UWVBFX1BST1BTLCBw bGFuZV90eXBlX3Byb3BfbmFtZXMsCisJCQkgIGRlc2MtPnByb3BzX3BsYW5lX3R5cGUpOworCisJ ZmlsbF9vYmpfcHJvcHMoZGVzYy0+ZmQsIHJlcy0+Y29ubmVjdG9yc1swXSwKKwkJICAgICAgIERS TV9NT0RFX09CSkVDVF9DT05ORUNUT1IsIE5VTV9DT05ORUNUT1JfUFJPUFMsCisJCSAgICAgICBj b25uZWN0b3JfcHJvcF9uYW1lcywgZGVzYy0+cHJvcHNfY29ubmVjdG9yKTsKKworCWZvciAoaSA9 IDA7IGkgPCByZXMtPmNvdW50X2NydGNzOyBpKyspIHsKKwkJc3RydWN0IGttc19hdG9taWNfY3J0 Y19zdGF0ZSAqY3J0YyA9ICZzdGF0ZS0+Y3J0Y3NbaV07CisKKwkJY3J0Yy0+c3RhdGUgPSBzdGF0 ZTsKKwkJY3J0Yy0+b2JqID0gcmVzLT5jcnRjc1tpXTsKKwkJY3J0Yy0+aWR4ID0gaTsKKwkJY3J0 Y19nZXRfY3VycmVudF9zdGF0ZShjcnRjKTsKKworCQkvKiBUaGUgYmxvYiBwb2ludGVkIHRvIGJ5 IE1PREVfSUQgY291bGQgd2VsbCBiZSB0cmFuc2llbnQsCisJCSAqIGFuZCBsb3NlIGl0cyBsYXN0 IHJlZmVyZW5jZSBhcyB3ZSBzd2l0Y2ggYXdheSBmcm9tIGl0LgorCQkgKiBEdXBsaWNhdGUgdGhl IGJsb2IgaGVyZSBzbyB3ZSBoYXZlIGEgcmVmZXJlbmNlIHdlIGtub3cgd2UKKwkJICogb3duLiAq LworCQlpZiAoY3J0Yy0+bW9kZS5pZCAhPSAwKQorCQkgICAgY3J0Yy0+bW9kZS5pZCA9IGJsb2Jf ZHVwbGljYXRlKGRlc2MtPmZkLCBjcnRjLT5tb2RlLmlkKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBp IDwgcmVzX3BsYW5lLT5jb3VudF9wbGFuZXM7IGkrKykgeworCQlkcm1Nb2RlUGxhbmVQdHIgcGxh bmUgPQorCQkJZHJtTW9kZUdldFBsYW5lKGRlc2MtPmZkLCByZXNfcGxhbmUtPnBsYW5lc1tpXSk7 CisJCWlndF9hc3NlcnQocGxhbmUpOworCisJCXN0YXRlLT5wbGFuZXNbaV0uc3RhdGUgPSBzdGF0 ZTsKKwkJc3RhdGUtPnBsYW5lc1tpXS5vYmogPSByZXNfcGxhbmUtPnBsYW5lc1tpXTsKKwkJc3Rh dGUtPnBsYW5lc1tpXS5jcnRjX21hc2sgPSBwbGFuZS0+cG9zc2libGVfY3J0Y3M7CisJCXBsYW5l X2dldF9jdXJyZW50X3N0YXRlKCZzdGF0ZS0+cGxhbmVzW2ldKTsKKwl9CisKKwlmb3IgKGkgPSAw OyBpIDwgcmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJc3RhdGUtPmNvbm5lY3RvcnNb aV0uc3RhdGUgPSBzdGF0ZTsKKwkJc3RhdGUtPmNvbm5lY3RvcnNbaV0ub2JqID0gcmVzLT5jb25u ZWN0b3JzW2ldOworCQljb25uZWN0b3JfZ2V0X2N1cnJlbnRfc3RhdGUoJnN0YXRlLT5jb25uZWN0 b3JzW2ldKTsKKwl9CisKKwlkcm1Nb2RlRnJlZVBsYW5lUmVzb3VyY2VzKHJlc19wbGFuZSk7CisJ ZHJtTW9kZUZyZWVSZXNvdXJjZXMocmVzKTsKK30KKworc3RhdGljIHVpbnQzMl90IHBsYW5lX2dl dF9pZ3RfZm9ybWF0KHN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSkKK3sKKwlk cm1Nb2RlUGxhbmVQdHIgcGxhbmVfa21zOworCWNvbnN0IHVpbnQzMl90ICppZ3RfZm9ybWF0czsK Kwl1aW50MzJfdCByZXQgPSAwOworCWludCBudW1faWd0X2Zvcm1hdHM7CisJaW50IGk7CisKKwlw bGFuZV9rbXMgPSBkcm1Nb2RlR2V0UGxhbmUocGxhbmUtPnN0YXRlLT5kZXNjLT5mZCwgcGxhbmUt Pm9iaik7CisJaWd0X2Fzc2VydChwbGFuZV9rbXMpOworCisJaWd0X2dldF9hbGxfZm9ybWF0cygm aWd0X2Zvcm1hdHMsICZudW1faWd0X2Zvcm1hdHMpOworCWZvciAoaSA9IDA7IGkgPCBudW1faWd0 X2Zvcm1hdHM7IGkrKykgeworCQlpbnQgajsKKworCQlmb3IgKGogPSAwOyBqIDwgcGxhbmVfa21z LT5jb3VudF9mb3JtYXRzOyBqKyspIHsKKwkJCWlmIChwbGFuZV9rbXMtPmZvcm1hdHNbal0gPT0g aWd0X2Zvcm1hdHNbaV0pIHsKKwkJCQlyZXQgPSBwbGFuZV9rbXMtPmZvcm1hdHNbal07CisJCQkJ YnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlkcm1Nb2RlRnJlZVBsYW5lKHBsYW5lX2ttcyk7CisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcGxhbmVfb3ZlcmxheShzdHJ1Y3Qga21zX2F0 b21pY19jcnRjX3N0YXRlICpjcnRjLAorCQkJICBzdHJ1Y3Qga21zX2F0b21pY19wbGFuZV9zdGF0 ZSAqcGxhbmVfb2xkKQoreworCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyAqbW9kZSA9IGNydGMt Pm1vZGUuZGF0YTsKKwlzdHJ1Y3Qga21zX2F0b21pY19wbGFuZV9zdGF0ZSBwbGFuZSA9ICpwbGFu ZV9vbGQ7CisJdWludDMyX3QgZm9ybWF0ID0gcGxhbmVfZ2V0X2lndF9mb3JtYXQoJnBsYW5lKTsK Kwlkcm1Nb2RlQXRvbWljUmVxICpyZXEgPSBkcm1Nb2RlQXRvbWljQWxsb2MoKTsKKwlzdHJ1Y3Qg aWd0X2ZiIGZiOworCWNhaXJvX3QgKmNyOworCisJaWd0X3JlcXVpcmUocmVxKTsKKwlpZ3RfcmVx dWlyZShmb3JtYXQgIT0gMCk7CisKKwlwbGFuZS5zcmNfeCA9IDA7CisJcGxhbmUuc3JjX3kgPSAw OworCXBsYW5lLnNyY193ID0gKG1vZGUtPmhkaXNwbGF5IC8gMikgPDwgMTY7CisJcGxhbmUuc3Jj X2ggPSAobW9kZS0+dmRpc3BsYXkgLyAyKSA8PCAxNjsKKwlwbGFuZS5jcnRjX3ggPSBtb2RlLT5o ZGlzcGxheSAvIDQ7CisJcGxhbmUuY3J0Y195ID0gbW9kZS0+dmRpc3BsYXkgLyA0OworCXBsYW5l LmNydGNfdyA9IG1vZGUtPmhkaXNwbGF5IC8gMjsKKwlwbGFuZS5jcnRjX2ggPSBtb2RlLT52ZGlz cGxheSAvIDI7CisJcGxhbmUuY3J0Y19pZCA9IGNydGMtPm9iajsKKwlwbGFuZS5mYl9pZCA9IGln dF9jcmVhdGVfZmIocGxhbmUuc3RhdGUtPmRlc2MtPmZkLAorCQkJCSAgICBwbGFuZS5jcnRjX3cs IHBsYW5lLmNydGNfaCwKKwkJCQkgICAgZm9ybWF0LCBJOTE1X1RJTElOR19OT05FLCAmZmIpOwor CisJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChwbGFuZS5zdGF0ZS0+ZGVzYy0+ZmQsICZmYik7CisJ aWd0X3BhaW50X3Rlc3RfcGF0dGVybihjciwgcGxhbmUuY3J0Y193LCBwbGFuZS5jcnRjX2gpOwor CisJLyogRW5hYmxlIHRoZSBvdmVybGF5IHBsYW5lIHVzaW5nIHRoZSBhdG9taWMgQVBJLCBhbmQg ZG91YmxlLWNoZWNrCisJICogc3RhdGUgaXMgd2hhdCB3ZSB0aGluayBpdCBzaG91bGQgYmUuICov CisJcGxhbmVfY29tbWl0X2F0b21pYygmcGxhbmUsIHJlcSwgQVRPTUlDX1JFTEFYX05PTkUpOwor CisJLyogRGlzYWJsZSB0aGUgcGxhbmUgYW5kIGNoZWNrIHRoZSBzdGF0ZSBtYXRjaGVzIHRoZSBv bGQuICovCisJcGxhbmVfY29tbWl0X2F0b21pYyhwbGFuZV9vbGQsIHJlcSwgQVRPTUlDX1JFTEFY X05PTkUpOworCisJLyogUmUtZW5hYmxlIHRoZSBwbGFuZSB0aHJvdWdoIHRoZSBsZWdhY3kgcGxh bmUgQVBJLCBhbmQgdmVyaWZ5IHRocm91Z2gKKwkgKiBhdG9taWMuICovCisJcGxhbmVfY29tbWl0 X2xlZ2FjeSgmcGxhbmUsIEFUT01JQ19SRUxBWF9OT05FKTsKKworCS8qIFJlc3RvcmUgdGhlIHBs YW5lIHRvIGl0cyBvcmlnaW5hbCBzZXR0aW5ncyB0aHJvdWdoIHRoZSBsZWdhY3kgcGxhbmUKKwkg KiBBUEksIGFuZCB2ZXJpZnkgdGhyb3VnaCBhdG9taWMuICovCisJcGxhbmVfY29tbWl0X2xlZ2Fj eShwbGFuZV9vbGQsIEFUT01JQ19SRUxBWF9OT05FKTsKKworCWRybU1vZGVBdG9taWNGcmVlKHJl cSk7Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5lX3ByaW1hcnkoc3RydWN0IGttc19hdG9taWNfY3J0 Y19zdGF0ZSAqY3J0YywKKwkJCSAgc3RydWN0IGttc19hdG9taWNfcGxhbmVfc3RhdGUgKnBsYW5l X29sZCkKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gKm1vZGUgPSBjcnRjLT5tb2RlLmRh dGE7CisJc3RydWN0IGttc19hdG9taWNfcGxhbmVfc3RhdGUgcGxhbmUgPSAqcGxhbmVfb2xkOwor CXVpbnQzMl90IGZvcm1hdCA9IHBsYW5lX2dldF9pZ3RfZm9ybWF0KCZwbGFuZSk7CisJZHJtTW9k ZUF0b21pY1JlcSAqcmVxID0gZHJtTW9kZUF0b21pY0FsbG9jKCk7CisJdWludDMyX3QgY29ubmVj dG9yc1tNQVhfQ09OTkVDVE9SU10gPSB7IDAsIH07CisJaW50IG51bV9jb25uZWN0b3JzOworCXN0 cnVjdCBpZ3RfZmIgZmI7CisJY2Fpcm9fdCAqY3I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShjb25uZWN0b3JzKTsgaSsrKSB7CisJCWlmIChjcnRjLT5zdGF0ZS0+Y29u bmVjdG9yc1tpXS5jcnRjX2lkID09IGNydGMtPm9iaikKKwkJCWNvbm5lY3RvcnNbbnVtX2Nvbm5l Y3RvcnMrK10gPQorCQkJCWNydGMtPnN0YXRlLT5jb25uZWN0b3JzW2ldLm9iajsKKwl9CisKKwlp Z3RfcmVxdWlyZShmb3JtYXQgIT0gMCk7CisKKwlwbGFuZS5zcmNfeCA9IDA7CisJcGxhbmUuc3Jj X3kgPSAwOworCXBsYW5lLnNyY193ID0gbW9kZS0+aGRpc3BsYXkgPDwgMTY7CisJcGxhbmUuc3Jj X2ggPSBtb2RlLT52ZGlzcGxheSA8PCAxNjsKKwlwbGFuZS5jcnRjX3ggPSAwOworCXBsYW5lLmNy dGNfeSA9IDA7CisJcGxhbmUuY3J0Y193ID0gbW9kZS0+aGRpc3BsYXk7CisJcGxhbmUuY3J0Y19o ID0gbW9kZS0+dmRpc3BsYXk7CisJcGxhbmUuY3J0Y19pZCA9IGNydGMtPm9iajsKKwlwbGFuZS5m Yl9pZCA9IGlndF9jcmVhdGVfZmIocGxhbmUuc3RhdGUtPmRlc2MtPmZkLAorCQkJCSAgICBwbGFu ZS5jcnRjX3csIHBsYW5lLmNydGNfaCwKKwkJCQkgICAgZm9ybWF0LCBJOTE1X1RJTElOR19OT05F LCAmZmIpOworCisJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChwbGFuZS5zdGF0ZS0+ZGVzYy0+ZmQs ICZmYik7CisJaWd0X3BhaW50X3Rlc3RfcGF0dGVybihjciwgcGxhbmUuY3J0Y193LCBwbGFuZS5j cnRjX2gpOworCisJLyogRmxpcCB0aGUgcHJpbWFyeSBwbGFuZSB1c2luZyB0aGUgYXRvbWljIEFQ SSwgYW5kIGRvdWJsZS1jaGVjaworCSAqIHN0YXRlIGlzIHdoYXQgd2UgdGhpbmsgaXQgc2hvdWxk IGJlLiAqLworCWNydGNfY29tbWl0X2F0b21pYyhjcnRjLCAmcGxhbmUsIHJlcSwgQVRPTUlDX1JF TEFYX05PTkUpOworCisJLyogUmVzdG9yZSB0aGUgcHJpbWFyeSBwbGFuZSBhbmQgY2hlY2sgdGhl IHN0YXRlIG1hdGNoZXMgdGhlIG9sZC4gKi8KKwljcnRjX2NvbW1pdF9hdG9taWMoY3J0YywgcGxh bmVfb2xkLCByZXEsIEFUT01JQ19SRUxBWF9OT05FKTsKKworCS8qIFJlLWVuYWJsZSB0aGUgcGxh bmUgdGhyb3VnaCB0aGUgbGVnYWN5IENSVEMvcHJpbWFyeS1wbGFuZSBBUEksIGFuZAorCSAqIHZl cmlmeSB0aHJvdWdoIGF0b21pYy4gKi8KKwljcnRjX2NvbW1pdF9sZWdhY3koY3J0YywgJnBsYW5l LCBDUlRDX1JFTEFYX01PREUpOworCisJLyogUmVzdG9yZSB0aGUgcGxhbmUgdG8gaXRzIG9yaWdp bmFsIHNldHRpbmdzIHRocm91Z2ggdGhlIGxlZ2FjeSBDUlRDCisJICogQVBJLCBhbmQgdmVyaWZ5 IHRocm91Z2ggYXRvbWljLiAqLworCWNydGNfY29tbWl0X2xlZ2FjeShjcnRjLCBwbGFuZV9vbGQs IENSVENfUkVMQVhfTU9ERSk7CisKKwkvKiBGaW5hbGx5LCByZXN0b3JlIHRvIHRoZSBvcmlnaW5h bCBzdGF0ZS4gKi8KKwljcnRjX2NvbW1pdF9hdG9taWMoY3J0YywgcGxhbmVfb2xkLCByZXEsIEFU T01JQ19SRUxBWF9OT05FKTsKKworCWRybU1vZGVBdG9taWNGcmVlKHJlcSk7Cit9CisKK3N0YXRp YyB2b2lkIHBsYW5lX2N1cnNvcihzdHJ1Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlICpjcnRjLAor CQkJIHN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZV9vbGQpCit7CisJc3RydWN0 IGRybV9tb2RlX21vZGVpbmZvICptb2RlID0gY3J0Yy0+bW9kZS5kYXRhOworCXN0cnVjdCBrbXNf YXRvbWljX3BsYW5lX3N0YXRlIHBsYW5lID0gKnBsYW5lX29sZDsKKwlkcm1Nb2RlQXRvbWljUmVx ICpyZXEgPSBkcm1Nb2RlQXRvbWljQWxsb2MoKTsKKwlzdHJ1Y3QgaWd0X2ZiIGZiOworCXVpbnQ2 NF90IHdpZHRoLCBoZWlnaHQ7CisKKwlpZ3RfYXNzZXJ0KHJlcSk7CisKKwkvKiBBbnkga2VybmVs IG5ldyBlbm91Z2ggZm9yIGF0b21pYywgYWxzbyBoYXMgdGhlIGN1cnNvciBzaXplIGNhcHMuICov CisJZG9fb3JfZGllKGRybUdldENhcChwbGFuZS5zdGF0ZS0+ZGVzYy0+ZmQsCisJICAgICAgICAg ICAgICAgICAgICBEUk1fQ0FQX0NVUlNPUl9XSURUSCwgJndpZHRoKSk7CisJZG9fb3JfZGllKGRy bUdldENhcChwbGFuZS5zdGF0ZS0+ZGVzYy0+ZmQsCisJICAgICAgICAgICAgICAgICAgICBEUk1f Q0FQX0NVUlNPUl9IRUlHSFQsICZoZWlnaHQpKTsKKworCXBsYW5lLnNyY194ID0gMDsKKwlwbGFu ZS5zcmNfeSA9IDA7CisJcGxhbmUuc3JjX3cgPSB3aWR0aCA8PCAxNjsKKwlwbGFuZS5zcmNfaCA9 IGhlaWdodCA8PCAxNjsKKwlwbGFuZS5jcnRjX3ggPSBtb2RlLT5oZGlzcGxheSAvIDI7CisJcGxh bmUuY3J0Y195ID0gbW9kZS0+dmRpc3BsYXkgLyAyOworCXBsYW5lLmNydGNfdyA9IHdpZHRoOwor CXBsYW5lLmNydGNfaCA9IGhlaWdodDsKKwlwbGFuZS5jcnRjX2lkID0gY3J0Yy0+b2JqOworCXBs YW5lLmZiX2lkID0gaWd0X2NyZWF0ZV9jb2xvcl9mYihwbGFuZS5zdGF0ZS0+ZGVzYy0+ZmQsCisJ CQkJCSAgd2lkdGgsIGhlaWdodCwKKwkJCQkJICBEUk1fRk9STUFUX0FSR0I4ODg4LAorCQkJCQkg IExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkJCSAgMC4wLCAwLjAsIDAuMCwKKwkJCQkJ ICAmZmIpOworCWlndF9hc3NlcnRfbmVxX3UzMihwbGFuZS5mYl9pZCwgMCk7CisKKwkvKiBGbGlw IHRoZSBjdXJzb3IgcGxhbmUgdXNpbmcgdGhlIGF0b21pYyBBUEksIGFuZCBkb3VibGUtY2hlY2sK KwkgKiBzdGF0ZSBpcyB3aGF0IHdlIHRoaW5rIGl0IHNob3VsZCBiZS4gKi8KKwlwbGFuZV9jb21t aXRfYXRvbWljKCZwbGFuZSwgcmVxLCBBVE9NSUNfUkVMQVhfTk9ORSk7CisKKwkvKiBSZXN0b3Jl IHRoZSBjdXJzb3IgcGxhbmUgYW5kIGNoZWNrIHRoZSBzdGF0ZSBtYXRjaGVzIHRoZSBvbGQuICov CisJcGxhbmVfY29tbWl0X2F0b21pYyhwbGFuZV9vbGQsIHJlcSwgQVRPTUlDX1JFTEFYX05PTkUp OworCisJLyogUmUtZW5hYmxlIHRoZSBwbGFuZSB0aHJvdWdoIHRoZSBsZWdhY3kgY3Vyc29yIEFQ SSwgYW5kIHZlcmlmeQorCSAqIHRocm91Z2ggYXRvbWljLiAqLworCWRvX29yX2RpZShkcm1Nb2Rl TW92ZUN1cnNvcihwbGFuZS5zdGF0ZS0+ZGVzYy0+ZmQsIHBsYW5lLmNydGNfaWQsCisJCQkJICAg IHBsYW5lLmNydGNfeCwgcGxhbmUuY3J0Y195KSk7CisJZG9fb3JfZGllKGRybU1vZGVTZXRDdXJz b3IocGxhbmUuc3RhdGUtPmRlc2MtPmZkLCBwbGFuZS5jcnRjX2lkLAorCQkJCSAgIGZiLmdlbV9o YW5kbGUsIHdpZHRoLCBoZWlnaHQpKTsKKwlwbGFuZV9jaGVja19jdXJyZW50X3N0YXRlKCZwbGFu ZSwgUExBTkVfUkVMQVhfRkIpOworCisJLyogV2lnZ2xlLiAqLworCXBsYW5lLmNydGNfeCAtPSAx NjsKKwlwbGFuZS5jcnRjX3kgLT0gMTY7CisJZG9fb3JfZGllKGRybU1vZGVNb3ZlQ3Vyc29yKHBs YW5lLnN0YXRlLT5kZXNjLT5mZCwgcGxhbmUuY3J0Y19pZCwKKwkJCQkgICAgcGxhbmUuY3J0Y194 LCBwbGFuZS5jcnRjX3kpKTsKKwlwbGFuZV9jaGVja19jdXJyZW50X3N0YXRlKCZwbGFuZSwgUExB TkVfUkVMQVhfRkIpOworCisJLyogUmVzdG9yZSB0aGUgcGxhbmUgdG8gaXRzIG9yaWdpbmFsIHNl dHRpbmdzIHRocm91Z2ggdGhlIGxlZ2FjeSBjdXJzb3IKKwkgKiBBUEksIGFuZCB2ZXJpZnkgdGhy b3VnaCBhdG9taWMuICovCisJZG9fb3JfZGllKGRybU1vZGVTZXRDdXJzb3IyKHBsYW5lLnN0YXRl LT5kZXNjLT5mZCwgcGxhbmUuY3J0Y19pZCwKKwkJCQkgICAgMCwgMCwgMCwgMCwgMCkpOworCXBs YW5lX2NoZWNrX2N1cnJlbnRfc3RhdGUocGxhbmVfb2xkLCBBVE9NSUNfUkVMQVhfTk9ORSk7CisK KwkvKiBGaW5hbGx5LCByZXN0b3JlIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZS4gKi8KKwlwbGFuZV9j b21taXRfYXRvbWljKHBsYW5lX29sZCwgcmVxLCBBVE9NSUNfUkVMQVhfTk9ORSk7CisKKwlkcm1N b2RlQXRvbWljRnJlZShyZXEpOworfQorCitzdGF0aWMgdm9pZCBwbGFuZV9pbnZhbGlkX3BhcmFt cyhzdHJ1Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlICpjcnRjLAorCQkJCSBzdHJ1Y3Qga21zX2F0 b21pY19wbGFuZV9zdGF0ZSAqcGxhbmVfb2xkLAorCQkJCSBzdHJ1Y3Qga21zX2F0b21pY19jb25u ZWN0b3Jfc3RhdGUgKmNvbm4pCit7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvICptb2RlID0g Y3J0Yy0+bW9kZS5kYXRhOworCXN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlIHBsYW5lID0g KnBsYW5lX29sZDsKKwl1aW50MzJfdCBmb3JtYXQgPSBwbGFuZV9nZXRfaWd0X2Zvcm1hdCgmcGxh bmUpOworCWRybU1vZGVBdG9taWNSZXEgKnJlcSA9IGRybU1vZGVBdG9taWNBbGxvYygpOworCXN0 cnVjdCBpZ3RfZmIgZmI7CisJY2Fpcm9fdCAqY3I7CisKKwkvKiBQYXNzIGEgc2VyaWVzIG9mIGlu dmFsaWQgb2JqZWN0IElEcyBmb3IgdGhlIEZCIElELiAqLworCXBsYW5lLmZiX2lkID0gcGxhbmUu b2JqOworCXBsYW5lX2NvbW1pdF9hdG9taWNfZXJyKCZwbGFuZSwgcGxhbmVfb2xkLCByZXEsCisJ ICAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDX1JFTEFYX05PTkUsIEVJTlZBTCk7CisKKwlw bGFuZS5mYl9pZCA9IGNydGMtPm9iajsKKwlwbGFuZV9jb21taXRfYXRvbWljX2VycigmcGxhbmUs IHBsYW5lX29sZCwgcmVxLAorCSAgICAgICAgICAgICAgICAgICAgICAgIEFUT01JQ19SRUxBWF9O T05FLCBFSU5WQUwpOworCisJcGxhbmUuZmJfaWQgPSBjb25uLT5vYmo7CisJcGxhbmVfY29tbWl0 X2F0b21pY19lcnIoJnBsYW5lLCBwbGFuZV9vbGQsIHJlcSwKKwkgICAgICAgICAgICAgICAgICAg ICAgICBBVE9NSUNfUkVMQVhfTk9ORSwgRUlOVkFMKTsKKworCXBsYW5lLmZiX2lkID0gY3J0Yy0+ bW9kZS5pZDsKKwlwbGFuZV9jb21taXRfYXRvbWljX2VycigmcGxhbmUsIHBsYW5lX29sZCwgcmVx LAorCSAgICAgICAgICAgICAgICAgICAgICAgIEFUT01JQ19SRUxBWF9OT05FLCBFSU5WQUwpOwor CisJcGxhbmUuZmJfaWQgPSBwbGFuZV9vbGQtPmZiX2lkOworCXBsYW5lX2NvbW1pdF9hdG9taWMo JnBsYW5lLCByZXEsIEFUT01JQ19SRUxBWF9OT05FKTsKKworCS8qIFBhc3MgYSBzZXJpZXMgb2Yg aW52YWxpZCBvYmplY3QgSURzIGZvciB0aGUgQ1JUQyBJRC4gKi8KKwlwbGFuZS5jcnRjX2lkID0g cGxhbmUub2JqOworCXBsYW5lX2NvbW1pdF9hdG9taWNfZXJyKCZwbGFuZSwgcGxhbmVfb2xkLCBy ZXEsCisJICAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDX1JFTEFYX05PTkUsIEVJTlZBTCk7 CisKKwlwbGFuZS5jcnRjX2lkID0gcGxhbmUuZmJfaWQ7CisJcGxhbmVfY29tbWl0X2F0b21pY19l cnIoJnBsYW5lLCBwbGFuZV9vbGQsIHJlcSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBBVE9N SUNfUkVMQVhfTk9ORSwgRUlOVkFMKTsKKworCXBsYW5lLmNydGNfaWQgPSBjb25uLT5vYmo7CisJ cGxhbmVfY29tbWl0X2F0b21pY19lcnIoJnBsYW5lLCBwbGFuZV9vbGQsIHJlcSwKKwkgICAgICAg ICAgICAgICAgICAgICAgICBBVE9NSUNfUkVMQVhfTk9ORSwgRUlOVkFMKTsKKworCXBsYW5lLmNy dGNfaWQgPSBjcnRjLT5tb2RlLmlkOworCXBsYW5lX2NvbW1pdF9hdG9taWNfZXJyKCZwbGFuZSwg cGxhbmVfb2xkLCByZXEsCisJICAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDX1JFTEFYX05P TkUsIEVJTlZBTCk7CisKKwlwbGFuZS5jcnRjX2lkID0gcGxhbmVfb2xkLT5jcnRjX2lkOworCXBs YW5lX2NvbW1pdF9hdG9taWMoJnBsYW5lLCByZXEsIEFUT01JQ19SRUxBWF9OT05FKTsKKworCS8q IENyZWF0ZSBhIGZyYW1lYnVmZmVyIHRvbyBzbWFsbCBmb3IgdGhlIHBsYW5lIGNvbmZpZ3VyYXRp b24uICovCisJaWd0X3JlcXVpcmUoZm9ybWF0ICE9IDApOworCisJcGxhbmUuc3JjX3ggPSAwOwor CXBsYW5lLnNyY195ID0gMDsKKwlwbGFuZS5zcmNfdyA9IG1vZGUtPmhkaXNwbGF5IDw8IDE2Owor CXBsYW5lLnNyY19oID0gbW9kZS0+dmRpc3BsYXkgPDwgMTY7CisJcGxhbmUuY3J0Y194ID0gMDsK KwlwbGFuZS5jcnRjX3kgPSAwOworCXBsYW5lLmNydGNfdyA9IG1vZGUtPmhkaXNwbGF5OworCXBs YW5lLmNydGNfaCA9IG1vZGUtPnZkaXNwbGF5OworCXBsYW5lLmNydGNfaWQgPSBjcnRjLT5vYmo7 CisJcGxhbmUuZmJfaWQgPSBpZ3RfY3JlYXRlX2ZiKHBsYW5lLnN0YXRlLT5kZXNjLT5mZCwKKwkJ CQkgICAgcGxhbmUuY3J0Y193IC0gMSwgcGxhbmUuY3J0Y19oIC0gMSwKKwkJCQkgICAgZm9ybWF0 LCBJOTE1X1RJTElOR19OT05FLCAmZmIpOworCisJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChwbGFu ZS5zdGF0ZS0+ZGVzYy0+ZmQsICZmYik7CisJaWd0X3BhaW50X3Rlc3RfcGF0dGVybihjciwgcGxh bmUuY3J0Y193IC0gMSwgcGxhbmUuY3J0Y19oIC0gMSk7CisKKwlwbGFuZV9jb21taXRfYXRvbWlj X2VycigmcGxhbmUsIHBsYW5lX29sZCwgcmVxLAorCSAgICAgICAgICAgICAgICAgICAgICAgIEFU T01JQ19SRUxBWF9OT05FLCBFTk9TUEMpOworCisJLyogUmVzdG9yZSB0aGUgcHJpbWFyeSBwbGFu ZSBhbmQgY2hlY2sgdGhlIHN0YXRlIG1hdGNoZXMgdGhlIG9sZC4gKi8KKwlwbGFuZV9jb21taXRf YXRvbWljKHBsYW5lX29sZCwgcmVxLCBBVE9NSUNfUkVMQVhfTk9ORSk7CisKKwlkcm1Nb2RlQXRv bWljRnJlZShyZXEpOworfQorCitzdGF0aWMgdm9pZCBjcnRjX2ludmFsaWRfcGFyYW1zKHN0cnVj dCBrbXNfYXRvbWljX2NydGNfc3RhdGUgKmNydGNfb2xkLAorCQkJCXN0cnVjdCBrbXNfYXRvbWlj X3BsYW5lX3N0YXRlICpwbGFuZSwKKwkJCQlzdHJ1Y3Qga21zX2F0b21pY19jb25uZWN0b3Jfc3Rh dGUgKmNvbm4pCit7CisJc3RydWN0IGttc19hdG9taWNfY3J0Y19zdGF0ZSBjcnRjID0gKmNydGNf b2xkOworCWRybU1vZGVBdG9taWNSZXEgKnJlcSA9IGRybU1vZGVBdG9taWNBbGxvYygpOworCisJ aWd0X2Fzc2VydChyZXEpOworCisJLyogUGFzcyBhIHNlcmllcyBvZiBpbnZhbGlkIG9iamVjdCBJ RHMgZm9yIHRoZSBtb2RlIElELiAqLworCWNydGMubW9kZS5pZCA9IHBsYW5lLT5vYmo7CisJY3J0 Y19jb21taXRfYXRvbWljX2VycigmY3J0YywgcGxhbmUsIGNydGNfb2xkLCBwbGFuZSwgcmVxLAor CSAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDX1JFTEFYX05PTkUsIEVJTlZBTCk7CisKKwlj cnRjLm1vZGUuaWQgPSBjcnRjLm9iajsKKwljcnRjX2NvbW1pdF9hdG9taWNfZXJyKCZjcnRjLCBw bGFuZSwgY3J0Y19vbGQsIHBsYW5lLCByZXEsCisJICAgICAgICAgICAgICAgICAgICAgICBBVE9N SUNfUkVMQVhfTk9ORSwgRUlOVkFMKTsKKworCWNydGMubW9kZS5pZCA9IGNvbm4tPm9iajsKKwlj cnRjX2NvbW1pdF9hdG9taWNfZXJyKCZjcnRjLCBwbGFuZSwgY3J0Y19vbGQsIHBsYW5lLCByZXEs CisJICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfUkVMQVhfTk9ORSwgRUlOVkFMKTsKKwor CWNydGMubW9kZS5pZCA9IHBsYW5lLT5mYl9pZDsKKwljcnRjX2NvbW1pdF9hdG9taWNfZXJyKCZj cnRjLCBwbGFuZSwgY3J0Y19vbGQsIHBsYW5lLCByZXEsCisJICAgICAgICAgICAgICAgICAgICAg ICBBVE9NSUNfUkVMQVhfTk9ORSwgRUlOVkFMKTsKKworCWNydGMubW9kZS5pZCA9IGNydGNfb2xk LT5tb2RlLmlkOworCWNydGNfY29tbWl0X2F0b21pYygmY3J0YywgcGxhbmUsIHJlcSwgQVRPTUlD X1JFTEFYX05PTkUpOworCisJLyogQ3JlYXRlIGEgYmxvYiB3aGljaCBpcyB0aGUgd3Jvbmcgc2l6 ZSB0byBiZSBhIHZhbGlkIG1vZGUuICovCisJZG9fb3JfZGllKGRybU1vZGVDcmVhdGVQcm9wZXJ0 eUJsb2IoY3J0Yy5zdGF0ZS0+ZGVzYy0+ZmQsCisJCQkJCSAgICBjcnRjLm1vZGUuZGF0YSwKKwkJ CQkJICAgIHNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pIC0gMSwKKwkJCQkJICAgICZj cnRjLm1vZGUuaWQpKTsKKwljcnRjX2NvbW1pdF9hdG9taWNfZXJyKCZjcnRjLCBwbGFuZSwgY3J0 Y19vbGQsIHBsYW5lLCByZXEsCisJICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfUkVMQVhf Tk9ORSwgRUlOVkFMKTsKKworCisJZG9fb3JfZGllKGRybU1vZGVDcmVhdGVQcm9wZXJ0eUJsb2Io Y3J0Yy5zdGF0ZS0+ZGVzYy0+ZmQsCisJCQkJCSAgICBjcnRjLm1vZGUuZGF0YSwKKwkJCQkJICAg IHNpemVvZihzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8pICsgMSwKKwkJCQkJICAgICZjcnRjLm1v ZGUuaWQpKTsKKwljcnRjX2NvbW1pdF9hdG9taWNfZXJyKCZjcnRjLCBwbGFuZSwgY3J0Y19vbGQs IHBsYW5lLCByZXEsCisJICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfUkVMQVhfTk9ORSwg RUlOVkFMKTsKKworCS8qIFJlc3RvcmUgdGhlIENSVEMgYW5kIGNoZWNrIHRoZSBzdGF0ZSBtYXRj aGVzIHRoZSBvbGQuICovCisJY3J0Y19jb21taXRfYXRvbWljKGNydGNfb2xkLCBwbGFuZSwgcmVx LCBBVE9NSUNfUkVMQVhfTk9ORSk7CisKKwlkcm1Nb2RlQXRvbWljRnJlZShyZXEpOworfQorCisv KiBBYnVzZSB0aGUgYXRvbWljIGlvY3RsIGRpcmVjdGx5IGluIG9yZGVyIHRvIHRlc3QgdmFyaW91 cyBpbnZhbGlkIGNvbmRpdGlvbnMsCisgKiB3aGljaCB0aGUgbGliZHJtIHdyYXBwZXIgd29uJ3Qg YWxsb3cgdXMgdG8gY3JlYXRlLiAqLworc3RhdGljIHZvaWQgYXRvbWljX2ludmFsaWRfcGFyYW1z KHN0cnVjdCBrbXNfYXRvbWljX2NydGNfc3RhdGUgKmNydGMsCisJCQkJICBzdHJ1Y3Qga21zX2F0 b21pY19wbGFuZV9zdGF0ZSAqcGxhbmUsCisJCQkJICBzdHJ1Y3Qga21zX2F0b21pY19jb25uZWN0 b3Jfc3RhdGUgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qga21zX2F0b21pY19kZXNjICpkZXNjID0g Y3J0Yy0+c3RhdGUtPmRlc2M7CisJc3RydWN0IGRybV9tb2RlX2F0b21pYyBpb2M7CisJdWludDMy X3Qgb2JqX3Jhd1sxNl07IC8qIGFycmF5IG9mIG9iamVjdHMgKHNpemVkIGJ5IGNvdW50X29ianMp ICovCisJdWludDMyX3QgbnVtX3Byb3BzX3Jhd1sxNl07IC8qIGFycmF5IG9mIG51bSBwcm9wcyBw ZXIgb2JqIChkaXR0bykgKi8KKwl1aW50MzJfdCBwcm9wc19yYXdbMjU2XTsgLyogYXJyYXkgb2Yg cHJvcHMgKHN1bSBvZiBjb3VudF9wcm9wcykgKi8KKwl1aW50NjRfdCB2YWx1ZXNfcmF3WzI1Nl07 IC8qIGFycmF5IG9mIHZhbHVlcyBmb3IgcHJvcGVydGllcyAoZGl0dG8pICovCisJaW50IGk7CisK KwltZW1zZXQoJmlvYywgMCwgc2l6ZW9mKGlvYykpOworCisJLyogQW4gZW1wdHkgcmVxdWVzdCBz aG91bGQgZG8gbm90aGluZy4gKi8KKwlkb19pb2N0bChkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVf QVRPTUlDLCAmaW9jKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9ial9yYXcpOyBp KyspCisJCW9ial9yYXdbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG51bV9w cm9wc19yYXcpOyBpKyspCisJCW51bV9wcm9wc19yYXdbaV0gPSAwOworCWZvciAoaSA9IDA7IGkg PCBBUlJBWV9TSVpFKHByb3BzX3Jhdyk7IGkrKykKKwkJcHJvcHNfcmF3W2ldID0gMDsKKwlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWx1ZXNfcmF3KTsgaSsrKQorCQl2YWx1ZXNfcmF3W2ld ID0gMDsKKworCWlvYy5vYmpzX3B0ciA9ICh1aW50cHRyX3QpIG9ial9yYXc7CisJaW9jLmNvdW50 X3Byb3BzX3B0ciA9ICh1aW50cHRyX3QpIG51bV9wcm9wc19yYXc7CisJaW9jLnByb3BzX3B0ciA9 ICh1aW50cHRyX3QpIHByb3BzX3JhdzsKKwlpb2MucHJvcF92YWx1ZXNfcHRyID0gKHVpbnRwdHJf dCkgdmFsdWVzX3JhdzsKKworCS8qIFZhbGlkIHBvaW50ZXJzLCBidXQgc3RpbGwgc2hvdWxkIGNv cHkgbm90aGluZy4gKi8KKwlkb19pb2N0bChkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlD LCAmaW9jKTsKKworCS8qIE5vbnNlbnNlIGZsYWdzLiAqLworCWlvYy5mbGFncyA9IDB4ZGVhZGJl ZWY7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2Ms IEVJTlZBTCk7CisKKwkvKiBTcGVjaWZpY2FsbHkgZm9yYmlkZGVuIGNvbWJpbmF0aW9uLiAqLwor CWlvYy5mbGFncyA9IERSTV9NT0RFX0FUT01JQ19URVNUX09OTFkgfCBEUk1fTU9ERV9QQUdFX0ZM SVBfRVZFTlQ7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMs ICZpb2MsIEVJTlZBTCk7CisKKwlpb2MuZmxhZ3MgPSAwOworCS8qIFNhZmV0eSBjaGVjayB0aGF0 IGZsYWdzIGlzIHJlc2V0IHByb3Blcmx5LiAqLworCWRvX2lvY3RsKGRlc2MtPmZkLCBEUk1fSU9D VExfTU9ERV9BVE9NSUMsICZpb2MpOworCisJLyogUmVzZXJ2ZWQvTUJaLiAqLworCWlvYy5yZXNl cnZlZCA9IDE7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMs ICZpb2MsIEVJTlZBTCk7CisJaW9jLnJlc2VydmVkID0gMDsKKwlkb19pb2N0bChkZXNjLT5mZCwg RFJNX0lPQ1RMX01PREVfQVRPTUlDLCAmaW9jKTsKKworCS8qIFplcm8gaXMgbm90IGEgdmFsaWQg b2JqZWN0IElELiAqLworCWlvYy5jb3VudF9vYmpzID0gQVJSQVlfU0laRShvYmpfcmF3KTsKKwlk b19pb2N0bF9lcnIoZGVzYy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYywgRU5PRU5U KTsKKworCS8qIEludmFsaWQgb2JqZWN0IHR5cGUgKG5vdCBhIHRoaW5nIHdlIGNhbiBzZXQgcHJv cGVydGllcyBvbikuICovCisJaW9jLmNvdW50X29ianMgPSAxOworCW9ial9yYXdbMF0gPSBjcnRj LT5tb2RlLmlkOworCWRvX2lvY3RsX2VycihkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlD LCAmaW9jLCBFTk9FTlQpOworCW9ial9yYXdbMF0gPSBwbGFuZS0+ZmJfaWQ7CisJZG9faW9jdGxf ZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVOT0VOVCk7CisKKwkv KiBGaWxsZWQgb2JqZWN0IGJ1dCB3aXRoIG5vIHByb3BlcnRpZXM7IG5vLW9wLiAqLworCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9ial9yYXcpOyBpKyspCisJCW9ial9yYXdbaV0gPSBjcnRj LT5vYmo7CisJZG9faW9jdGwoZGVzYy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYyk7 CisKKwkvKiBQYXNzIGluIGFsbCBzb3J0cyBvZiB0aGluZ3Mgb3RoZXIgdGhhbiB0aGUgcHJvcGVy dHkgSUQuICovCisJbnVtX3Byb3BzX3Jhd1swXSA9IDE7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZk LCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVOT0VOVCk7CisJcHJvcHNfcmF3WzBdID0g Y3J0Yy0+b2JqOworCWRvX2lvY3RsX2VycihkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlD LCAmaW9jLCBFTk9FTlQpOworCXByb3BzX3Jhd1swXSA9IHBsYW5lLT5vYmo7CisJZG9faW9jdGxf ZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVOT0VOVCk7CisJcHJv cHNfcmF3WzBdID0gY29ubmVjdG9yLT5vYmo7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZkLCBEUk1f SU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVOT0VOVCk7CisJcHJvcHNfcmF3WzBdID0gY3J0Yy0+ bW9kZS5pZDsKKwlkb19pb2N0bF9lcnIoZGVzYy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywg JmlvYywgRU5PRU5UKTsKKworCS8qIFZhbGlkIHByb3BlcnR5LCB2YWxpZCB2YWx1ZS4gKi8KKwlm b3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9wc19yYXcpOyBpKyspIHsKKwkJcHJvcHNfcmF3 W2ldID0gZGVzYy0+cHJvcHNfY3J0Y1tDUlRDX01PREVfSURdOworCQl2YWx1ZXNfcmF3W2ldID0g Y3J0Yy0+bW9kZS5pZDsKKwl9CisJZG9faW9jdGwoZGVzYy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FU T01JQywgJmlvYyk7CisKKwkvKiBTZXR0aW5nIHRoZSBzYW1lIHRoaW5nIG11bHRpcGxlIHRpbWVz IGlzIE9LLiAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9ial9yYXcpOyBpKyspCisJ CW51bV9wcm9wc19yYXdbaV0gPSBBUlJBWV9TSVpFKHByb3BzX3JhdykgLyBBUlJBWV9TSVpFKG9i al9yYXcpOworCWRvX2lvY3RsKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2Mp OworCWlvYy5jb3VudF9vYmpzID0gQVJSQVlfU0laRShvYmpfcmF3KTsKKwlkb19pb2N0bChkZXNj LT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlDLCAmaW9jKTsKKworCS8qIFBhc3MgYSBzZXJpZXMg b2Ygb3V0bGFuZGlzaCBhZGRyZXNzZXMuICovCisJaW9jLm9ianNfcHRyID0gMDsKKwlkb19pb2N0 bF9lcnIoZGVzYy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYywgRUZBVUxUKTsKKwor CWlvYy5vYmpzX3B0ciA9ICh1aW50cHRyX3QpIG9ial9yYXc7CisJaW9jLmNvdW50X3Byb3BzX3B0 ciA9IDA7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZp b2MsIEVGQVVMVCk7CisKKwlpb2MuY291bnRfcHJvcHNfcHRyID0gKHVpbnRwdHJfdCkgbnVtX3By b3BzX3JhdzsKKwlpb2MucHJvcHNfcHRyID0gMDsKKwlkb19pb2N0bF9lcnIoZGVzYy0+ZmQsIERS TV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYywgRUZBVUxUKTsKKworCWlvYy5wcm9wc19wdHIgPSAo dWludHB0cl90KSBwcm9wc19yYXc7CisJaW9jLnByb3BfdmFsdWVzX3B0ciA9IDA7CisJZG9faW9j dGxfZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVGQVVMVCk7CisK Kwlpb2MucHJvcF92YWx1ZXNfcHRyID0gKHVpbnRwdHJfdCkgdmFsdWVzX3JhdzsKKwlkb19pb2N0 bChkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlDLCAmaW9jKTsKKworCS8qIEF0dGVtcHQg dG8gb3ZlcmZsb3cgYW5kL29yIHRyaXAgdmFyaW91cyBib3VuZGFyeSBjb25kaXRpb25zLiAqLwor CWlvYy5jb3VudF9vYmpzID0gVUlOVDMyX01BWCAvIHNpemVvZih1aW50MzJfdCk7CisJZG9faW9j dGxfZXJyKGRlc2MtPmZkLCBEUk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVOT0VOVCk7CisK Kwlpb2MuY291bnRfb2JqcyA9IEFSUkFZX1NJWkUob2JqX3Jhdyk7CisJaW9jLm9ianNfcHRyID0g VUlOVDY0X01BWCAtIHNpemVvZih1aW50MzJfdCk7CisJZG9faW9jdGxfZXJyKGRlc2MtPmZkLCBE Uk1fSU9DVExfTU9ERV9BVE9NSUMsICZpb2MsIEVGQVVMVCk7CisJaW9jLmNvdW50X29ianMgPSAx OworCWlvYy5vYmpzX3B0ciA9IFVJTlQ2NF9NQVggLSBzaXplb2YodWludDMyX3QpOworCWRvX2lv Y3RsX2VycihkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlDLCAmaW9jLCBFRkFVTFQpOwor CisJbnVtX3Byb3BzX3Jhd1swXSA9IFVJTlQzMl9NQVggLyBzaXplb2YodWludDMyX3QpOworCWRv X2lvY3RsX2VycihkZXNjLT5mZCwgRFJNX0lPQ1RMX01PREVfQVRPTUlDLCAmaW9jLCBFRkFVTFQp OworCW51bV9wcm9wc19yYXdbMF0gPSBVSU5UMzJfTUFYIC0gMTsKKwlkb19pb2N0bF9lcnIoZGVz Yy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYywgRUZBVUxUKTsKKworCWZvciAoaSA9 IDA7IGkgPCBBUlJBWV9TSVpFKG9ial9yYXcpOyBpKyspCisJCW51bV9wcm9wc19yYXdbaV0gPSAo VUlOVDMyX01BWCAvIEFSUkFZX1NJWkUob2JqX3JhdykpICsgMTsKKwlkb19pb2N0bF9lcnIoZGVz Yy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYywgRUZBVUxUKTsKKwlmb3IgKGkgPSAw OyBpIDwgQVJSQVlfU0laRShvYmpfcmF3KTsgaSsrKQorCQludW1fcHJvcHNfcmF3W2ldID0gQVJS QVlfU0laRShwcm9wc19yYXcpIC8gQVJSQVlfU0laRShvYmpfcmF3KTsKKwlkb19pb2N0bF9lcnIo ZGVzYy0+ZmQsIERSTV9JT0NUTF9NT0RFX0FUT01JQywgJmlvYywgRUZBVUxUKTsKK30KKworaWd0 X21haW4KK3sKKwlzdHJ1Y3Qga21zX2F0b21pY19kZXNjIGRlc2M7CisJc3RydWN0IGttc19hdG9t aWNfc3RhdGUgY3VycmVudDsKKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKwlt ZW1zZXQoJmN1cnJlbnQsIDAsIHNpemVvZihjdXJyZW50KSk7CisKKwljdXJyZW50LmRlc2MgPSAm ZGVzYzsKKworCWlndF9maXh0dXJlCisJCWF0b21pY19zZXR1cCgmY3VycmVudCk7CisKKwlpZ3Rf c3VidGVzdCgicGxhbmVfb3ZlcmxheV9sZWdhY3kiKSB7CisJCXN0cnVjdCBrbXNfYXRvbWljX3N0 YXRlIHNjcmF0Y2ggPSBjdXJyZW50OworCQlzdHJ1Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlICpj cnRjID0gZmluZF9jcnRjKCZzY3JhdGNoLCB0cnVlKTsKKwkJc3RydWN0IGttc19hdG9taWNfcGxh bmVfc3RhdGUgKnBsYW5lID0KKwkJCWZpbmRfcGxhbmUoJnNjcmF0Y2gsIFBMQU5FX1RZUEVfT1ZF UkxBWSwgY3J0Yyk7CisKKwkJaWd0X3JlcXVpcmUoY3J0Yyk7CisJCWlndF9yZXF1aXJlKHBsYW5l KTsKKwkJcGxhbmVfb3ZlcmxheShjcnRjLCBwbGFuZSk7CisJfQorCisJaWd0X3N1YnRlc3QoInBs YW5lX3ByaW1hcnlfbGVnYWN5IikgeworCQlzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSBzY3JhdGNo ID0gY3VycmVudDsKKwkJc3RydWN0IGttc19hdG9taWNfY3J0Y19zdGF0ZSAqY3J0YyA9IGZpbmRf Y3J0Yygmc2NyYXRjaCwgdHJ1ZSk7CisJCXN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpw bGFuZSA9CisJCQlmaW5kX3BsYW5lKCZzY3JhdGNoLCBQTEFORV9UWVBFX1BSSU1BUlksIGNydGMp OworCisJCWlndF9yZXF1aXJlKGNydGMpOworCQlpZ3RfcmVxdWlyZShwbGFuZSk7CisJCXBsYW5l X3ByaW1hcnkoY3J0YywgcGxhbmUpOworCX0KKworCWlndF9zdWJ0ZXN0KCJwbGFuZV9jdXJzb3Jf bGVnYWN5IikgeworCQlzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSBzY3JhdGNoID0gY3VycmVudDsK KwkJc3RydWN0IGttc19hdG9taWNfY3J0Y19zdGF0ZSAqY3J0YyA9IGZpbmRfY3J0Yygmc2NyYXRj aCwgdHJ1ZSk7CisJCXN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSA9CisJCQlm aW5kX3BsYW5lKCZzY3JhdGNoLCBQTEFORV9UWVBFX0NVUlNPUiwgY3J0Yyk7CisKKwkJaWd0X3Jl cXVpcmUoY3J0Yyk7CisJCWlndF9yZXF1aXJlKHBsYW5lKTsKKwkJcGxhbmVfY3Vyc29yKGNydGMs IHBsYW5lKTsKKwl9CisKKwlpZ3Rfc3VidGVzdCgicGxhbmVfaW52YWxpZF9wYXJhbXMiKSB7CisJ CXN0cnVjdCBrbXNfYXRvbWljX3N0YXRlIHNjcmF0Y2ggPSBjdXJyZW50OworCQlzdHJ1Y3Qga21z X2F0b21pY19jcnRjX3N0YXRlICpjcnRjID0gZmluZF9jcnRjKCZzY3JhdGNoLCB0cnVlKTsKKwkJ c3RydWN0IGttc19hdG9taWNfcGxhbmVfc3RhdGUgKnBsYW5lID0KKwkJCWZpbmRfcGxhbmUoJmN1 cnJlbnQsIFBMQU5FX1RZUEVfUFJJTUFSWSwgY3J0Yyk7CisJCXN0cnVjdCBrbXNfYXRvbWljX2Nv bm5lY3Rvcl9zdGF0ZSAqY29ubiA9CisJCQlmaW5kX2Nvbm5lY3Rvcigmc2NyYXRjaCwgY3J0Yyk7 CisKKwkJaWd0X3JlcXVpcmUoY3J0Yyk7CisJCWlndF9yZXF1aXJlKHBsYW5lKTsKKwkJcGxhbmVf aW52YWxpZF9wYXJhbXMoY3J0YywgcGxhbmUsIGNvbm4pOworCX0KKworCWlndF9zdWJ0ZXN0KCJj cnRjX2ludmFsaWRfcGFyYW1zIikgeworCQlzdHJ1Y3Qga21zX2F0b21pY19zdGF0ZSBzY3JhdGNo ID0gY3VycmVudDsKKwkJc3RydWN0IGttc19hdG9taWNfY3J0Y19zdGF0ZSAqY3J0YyA9IGZpbmRf Y3J0Yygmc2NyYXRjaCwgdHJ1ZSk7CisJCXN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpw bGFuZSA9CisJCQlmaW5kX3BsYW5lKCZzY3JhdGNoLCBOVU1fUExBTkVfVFlQRV9QUk9QUywgY3J0 Yyk7CisJCXN0cnVjdCBrbXNfYXRvbWljX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubiA9CisJCQlmaW5k X2Nvbm5lY3Rvcigmc2NyYXRjaCwgY3J0Yyk7CisKKwkJaWd0X3JlcXVpcmUoY3J0Yyk7CisJCWln dF9yZXF1aXJlKHBsYW5lKTsKKwkJaWd0X3JlcXVpcmUoY29ubik7CisJCWNydGNfaW52YWxpZF9w YXJhbXMoY3J0YywgcGxhbmUsIGNvbm4pOworCX0KKworCWlndF9zdWJ0ZXN0KCJhdG9taWNfaW52 YWxpZF9wYXJhbXMiKSB7CisJCXN0cnVjdCBrbXNfYXRvbWljX3N0YXRlIHNjcmF0Y2ggPSBjdXJy ZW50OworCQlzdHJ1Y3Qga21zX2F0b21pY19jcnRjX3N0YXRlICpjcnRjID0gJnNjcmF0Y2guY3J0 Y3NbMF07CisJCXN0cnVjdCBrbXNfYXRvbWljX3BsYW5lX3N0YXRlICpwbGFuZSA9CisJCQlmaW5k X3BsYW5lKCZzY3JhdGNoLCBOVU1fUExBTkVfVFlQRV9QUk9QUywgY3J0Yyk7CisJCXN0cnVjdCBr bXNfYXRvbWljX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubiA9CisJCQlmaW5kX2Nvbm5lY3Rvcigmc2Ny YXRjaCwgY3J0Yyk7CisKKwkJaWd0X3JlcXVpcmUocGxhbmUpOworCQlpZ3RfcmVxdWlyZShjb25u KTsKKwkJYXRvbWljX2ludmFsaWRfcGFyYW1zKGNydGMsIHBsYW5lLCBjb25uKTsKKwl9CisKKwlp Z3RfZml4dHVyZQorCQljbG9zZShkZXNjLmZkKTsKK30KLS0gCjIuNS4wCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0 CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=