From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jon Smirl Subject: [PATCH] First attempt at a driver for the internal codec on the Allwinner A20. Date: Tue, 01 Jul 2014 11:36:28 -0400 Message-ID: <20140701153627.17679.17922.stgit@studio> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-oa0-f49.google.com (mail-oa0-f49.google.com [209.85.219.49]) by alsa0.perex.cz (Postfix) with ESMTP id 8CC902656DD for ; Tue, 1 Jul 2014 17:36:33 +0200 (CEST) Received: by mail-oa0-f49.google.com with SMTP id i7so10633289oag.22 for ; Tue, 01 Jul 2014 08:36:32 -0700 (PDT) Received: from jonsmirl@gmail.com (162-205-8-191.lightspeed.wepbfl.sbcglobal.net. [162.205.8.191]) by mx.google.com with ESMTPSA id oi6sm84556772oeb.6.2014.07.01.08.36.29 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 01 Jul 2014 08:36:31 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org Rmlyc3QgYXR0ZW1wdCBhdCBhIGRyaXZlciBmb3IgdGhlIGludGVybmFsIGNvZGVjIG9uIHRoZSBB bGx3aW5uZXIgQTIwLiBUaGlzIGNvZGVjIGlzIGEgY29tYmluYXRpb24gY29kZWMgYW5kIERBSSwK aXQgaXMgYWxsIG9uLWNoaXAuCgpTbyB3aHkgZG9uJ3QgSSBoYXZlIGEgRE1BIGJ1ZmZlcj8KQW55 IG90aGVyIGhpbnRzIHRvIGdldCB0aGlzIHdvcmtpbmcgd291bGQgYmUgYXBwcmVjaWF0ZWQuCgpb ICAgMzEuOTEwMzk0XSBwY21fc2FuaXR5X2NoZWNrICAgKG51bGwpICAgKG51bGwpClsgICAzMS45 MTA0MTVdIC0tLS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLQpbICAgMzEuOTEwNDQw XSBXQVJOSU5HOiBDUFU6IDEgUElEOiA3MzggYXQgc291bmQvY29yZS9wY21fbGliLmM6MjA5MCBw Y21fc2FuaXR5X2NoZWNrKzB4NzAvMHg5OCgpClsgICAzMS45MTA0NDhdIE1vZHVsZXMgbGlua2Vk IGluOiBicmNtZm1hYyBicmNtdXRpbApbICAgMzEuOTEwNDcwXSBDUFU6IDEgUElEOiA3MzggQ29t bTogYXBsYXkgTm90IHRhaW50ZWQgMy4xNS4wKyAjMTYxClsgICAzMS45MTA1MDhdIFs8YzAwMTUx M2M+XSAodW53aW5kX2JhY2t0cmFjZSkgZnJvbSBbPGMwMDExZDA4Pl0gKHNob3dfc3RhY2srMHgx OC8weDFjKQpbICAgMzEuOTEwNTI4XSBbPGMwMDExZDA4Pl0gKHNob3dfc3RhY2spIGZyb20gWzxj MDU2NjkzND5dIChkdW1wX3N0YWNrKzB4NzgvMHg5NCkKWyAgIDMxLjkxMDU0OV0gWzxjMDU2Njkz ND5dIChkdW1wX3N0YWNrKSBmcm9tIFs8YzAwMjM3YzQ+XSAod2Fybl9zbG93cGF0aF9jb21tb24r MHg2Yy8weDkwKQpbICAgMzEuOTEwNTY3XSBbPGMwMDIzN2M0Pl0gKHdhcm5fc2xvd3BhdGhfY29t bW9uKSBmcm9tIFs8YzAwMjM4OTA+XSAod2Fybl9zbG93cGF0aF9udWxsKzB4MjAvMHgyOCkKWyAg IDMxLjkxMDU4NV0gWzxjMDAyMzg5MD5dICh3YXJuX3Nsb3dwYXRoX251bGwpIGZyb20gWzxjMDNm N2U2ND5dIChwY21fc2FuaXR5X2NoZWNrKzB4NzAvMHg5OCkKWyAgIDMxLjkxMDYwMl0gWzxjMDNm N2U2ND5dIChwY21fc2FuaXR5X2NoZWNrKSBmcm9tIFs8YzAzZmFhMDg+XSAoc25kX3BjbV9saWJf d3JpdGUrMHgxYy8weDc0KQpbICAgMzEuOTEwNjE5XSBbPGMwM2ZhYTA4Pl0gKHNuZF9wY21fbGli X3dyaXRlKSBmcm9tIFs8YzAzZjY0MDA+XSAoc25kX3BjbV9wbGF5YmFja19pb2N0bDErMHgzYzgv MHg0YTgpClsgICAzMS45MTA2MzddIFs8YzAzZjY0MDA+XSAoc25kX3BjbV9wbGF5YmFja19pb2N0 bDEpIGZyb20gWzxjMDEzNzYyYz5dIChkb192ZnNfaW9jdGwrMHg0ZDQvMHg1OTQpClsgICAzMS45 MTA2NTNdIFs8YzAxMzc2MmM+XSAoZG9fdmZzX2lvY3RsKSBmcm9tIFs8YzAxMzc3NDA+XSAoU3lT X2lvY3RsKzB4NTQvMHg3YykKWyAgIDMxLjkxMDY2OF0gWzxjMDEzNzc0MD5dIChTeVNfaW9jdGwp IGZyb20gWzxjMDAwZTQyMD5dIChyZXRfZmFzdF9zeXNjYWxsKzB4MC8weDMwKQpbICAgMzEuOTEw Njc3XSAtLS1bIGVuZCB0cmFjZSA4NmZjZDgzMDEwYjViNWI1IF0tLS0KLS0tCiBzb3VuZC9zb2Mv c3VueGkvc3VueGlfY29kZWNfbWFpbi5jIHwgIDY4NyArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA2ODcgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNvdW5kL3NvYy9zdW54aS9zdW54aV9jb2RlY19tYWluLmMKCmRpZmYgLS1naXQg YS9zb3VuZC9zb2Mvc3VueGkvc3VueGlfY29kZWNfbWFpbi5jIGIvc291bmQvc29jL3N1bnhpL3N1 bnhpX2NvZGVjX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDcw YmZlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3N1bnhpL3N1bnhpX2NvZGVjX21haW4u YwpAQCAtMCwwICsxLDY4NyBAQAorLyoKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIu CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwu aD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9k ZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5o PgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisj aW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUg PHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxz b3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorCisvL0Nv ZGVjIFJlZ2lzdGVyCisjZGVmaW5lIFNVTlhJX0RBQ19EUEMgICAgICAgICAgICAgICAgKDB4MDAp CisjZGVmaW5lIFNVTlhJX0RBQ19GSUZPQyAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIFNV TlhJX0RBQ19GSUZPUyAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIFNVTlhJX0RBQ19UWERB VEEgICAgICAgICAgICAgKDB4MGMpCisjZGVmaW5lIFNVTlhJX0RBQ19BQ1RMICAgICAgICAgICAg ICAgKDB4MTApCisjZGVmaW5lIFNVTlhJX0RBQ19UVU5FICAgICAgICAgICAgICAgKDB4MTQpCisj ZGVmaW5lIFNVTlhJX0RBQ19ERUJVRyAgICAgICAgICAgICAgKDB4MTgpCisjZGVmaW5lIFNVTlhJ X0FEQ19GSUZPQyAgICAgICAgICAgICAgKDB4MWMpCisjZGVmaW5lIFNVTlhJX0FEQ19GSUZPUyAg ICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIFNVTlhJX0FEQ19SWERBVEEgICAgICAgICAgICAg KDB4MjQpCisjZGVmaW5lIFNVTlhJX0FEQ19BQ1RMICAgICAgICAgICAgICAgKDB4MjgpCisjZGVm aW5lIFNVTlhJX0FEQ19ERUJVRyAgICAgICAgICAgICAgKDB4MmMpCisjZGVmaW5lIFNVTlhJX0RB Q19UWENOVCAgICAgICAgICAgICAgKDB4MzApCisjZGVmaW5lIFNVTlhJX0FEQ19SWENOVCAgICAg ICAgICAgICAgKDB4MzQpCisjZGVmaW5lIFNVTlhJX0JJQVNfQ1JUICAgICAgICAgICAgICAgKDB4 MzgpCisjZGVmaW5lIFNVTlhJX01JQ19DUlQgICAgICAgICAgICAgICAgKDB4M2MpCisjZGVmaW5l IFNVTlhJX0NPREVDX1JFR1NfTlVNICAgICAgICAgKDEzKQorCisjZGVmaW5lIERBSUZNVF8xNkJJ VFMgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBEQUlGTVRfMjBCSVRTICAgICAgICAgICAgICgy MCkKKworI2RlZmluZSBEQUlGTVRfQlNfTUFTSyAgICAgICAgICAgICh+KDE8PDE2KSkgIAkvL0ZJ Rk8gYmlnIHNtYWxsIG1vZGUgbWFzaworI2RlZmluZSBEQUlGTVRfQklUU19NQVNLICAgICAgICAg ICh+KDE8PDUpKQkJLy9GSUZPIEJpdHMgc2VsZWN0IG1hc2ssbm90IHVzZWQgeWV0LgorI2RlZmlu ZSBTQU1QTEVfUkFURV9NQVNLICAgICAgICAgICh+KDc8PDI5KSkgIAkvL1NhbXBsZSBSYXRlIHNs ZWN0IG1hc2sKKworI2RlZmluZSBEQUNfRU4gICAgICAgICAgICAgICAgICAgICgzMSkKKyNkZWZp bmUgRElHSVRBTF9WT0wgICAgICAgICAgICAgICAoMTIpCisvL0ZvciBDT0RFQyBPTEQgVkVSU0lP TgorI2RlZmluZSBEQUNfVkVSU0lPTiAgICAgICAgICAgICAgICgyMykKKworI2RlZmluZSBEQUNf Q0hBTk5FTAkJICAoNikKKyNkZWZpbmUgTEFTVF9TRSAgICAgICAgICAgICAgICAgICAoMjYpCisj ZGVmaW5lIFRYX0ZJRk9fTU9ERSAgICAgICAgICAgICAgKDI0KQorI2RlZmluZSBEUkFfTEVWRUwg ICAgICAgICAgICAgICAgICgyMSkKKyNkZWZpbmUgVFhfVFJJX0xFVkVMICAgICAgICAgICAgICAo OCkKKyNkZWZpbmUgREFDX01PREUgICAgICAgICAgICAgICAgICAoNikJCQkvL25vdCB1c2VkIHll dAorI2RlZmluZSBUQVNSICAgICAgICAgICAgICAgICAgICAgICg1KQkJCS8vbm90IHVzZWQgeWV0 CisjZGVmaW5lIERBQ19EUlEgICAgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIERBQ19GSUZP X0ZMVVNIICAgICAgICAgICAgKDApCisKKyNkZWZpbmUgVk9MVU1FICAgICAgICAgICAgICAgICAg ICAoMCkKKyNkZWZpbmUgUEFfTVVURSAgICAgICAgICAgICAgICAgICAoNikKKyNkZWZpbmUgTUlY UEFTICAgICAgICAgICAgICAgICAgICAoNykKKyNkZWZpbmUgREFDUEFTICAgICAgICAgICAgICAg ICAgICAoOCkKKyNkZWZpbmUgTUlYRU4gICAgICAgICAgICAgICAgICAgICAoMjkpCisjZGVmaW5l IERBQ0FFTl9MICAgICAgICAgICAgICAgICAgKDMwKQorI2RlZmluZSBEQUNBRU5fUiAgICAgICAg ICAgICAgICAgICgzMSkKKworI2RlZmluZSBBRENfRElHX0VOICAgICAgICAgICAgICAgICgyOCkK KyNkZWZpbmUgUlhfRklGT19NT0RFICAgICAgICAgICAgICAoMjQpCisjZGVmaW5lIFJYX1RSSV9M RVZFTCAgICAgICAgICAgICAgKDgpCisjZGVmaW5lIEFEQ19NT0RFICAgICAgICAgICAgICAgICAg KDcpCisjZGVmaW5lIFJBU1IgICAgICAgICAgICAgICAgICAgICAgKDYpCisjZGVmaW5lIEFEQ19E UlEgICAgICAgICAgICAgICAgICAgKDQpCisjZGVmaW5lIEFEQ19GSUZPX0ZMVVNIICAgICAgICAg ICAgKDApCisKKyNkZWZpbmUgIEFEQ19MRl9FTiAgICAgICAgICAgICAgICAoMzEpCisjZGVmaW5l ICBBRENfUklfRU4gICAgICAgICAgICAgICAgKDMwKQorI2RlZmluZSAgQURDX0VOICAgICAgICAg ICAgICAgICAgICgzMCkKKyNkZWZpbmUgIE1JQzFfRU4gICAgICAgICAgICAgICAgICAoMjkpCisj ZGVmaW5lICBNSUMyX0VOICAgICAgICAgICAgICAgICAgKDI4KQorI2RlZmluZSAgVk1JQ19FTiAg ICAgICAgICAgICAgICAgICgyNykKKyNkZWZpbmUgIE1JQ19HQUlOICAgICAgICAgICAgICAgICAo MjUpCisjZGVmaW5lICBBRENfU0VMRUNUICAgICAgICAgICAgICAgKDE3KQorI2RlZmluZSAgUEFf RU5BQkxFICAgICAgICAgICAgICAgICg0KQorI2RlZmluZSAgSFBfRElSRUNUICAgICAgICAgICAg ICAgICgzKQorCisKK2VudW0gc3VueGlfZGV2aWNlX2lkIHtTVU40QSwgU1VONEksIFNVTjVJLCBT VU43SX07IAorCitzdHJ1Y3Qgc3VueGlfcHJpdiB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwor CWludCBpcnE7CisJc3RydWN0IGNsayAqY2xrX2FwYiwgKmNsa19wbGwyLCAqY2xrX21vZHVsZTsK KworCWVudW0gc3VueGlfZGV2aWNlX2lkIGlkOworCisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFp X2RtYV9kYXRhIHBsYXliYWNrX2RtYV9kYXRhOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9k bWFfZGF0YSBjYXB0dXJlX2RtYV9kYXRhOworfTsKKworc3RhdGljIGludCBjb2RlY19wbGF5X3N0 YXJ0KHN0cnVjdCBzdW54aV9wcml2ICpwcml2KQoreworI2lmZGVmIEpEUworCWlmIChncGlvX3Bh X3NodXRkb3duKQorCQlncGlvX3dyaXRlX29uZV9waW5fdmFsdWUoZ3Bpb19wYV9zaHV0ZG93biwg MSwgImF1ZGlvX3BhX2N0cmwiKTsKKyNlbmRpZgorCS8vZmx1c2ggVFggRklGTworCXJlZ21hcF91 cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0RBQ19GSUZPQywgMHgxIDw8IERBQ19GSUZP X0ZMVVNILCAweDEgPDwgREFDX0ZJRk9fRkxVU0gpOworCS8vZW5hYmxlIGRhYyBkcnEKKwlyZWdt YXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9EQUNfRklGT0MsIDB4MSA8PCBEQUNf RFJRLCAweDEgPDwgREFDX0RSUSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kZWNf cGxheV9zdG9wKHN0cnVjdCBzdW54aV9wcml2ICpwcml2KQoreworCS8vcGEgbXV0ZQorI2lmZGVm IEpEUworCWlmIChncGlvX3BhX3NodXRkb3duKQorCQlncGlvX3dyaXRlX29uZV9waW5fdmFsdWUo Z3Bpb19wYV9zaHV0ZG93biwgMCwgImF1ZGlvX3BhX2N0cmwiKTsKKyNlbmRpZgorCXJlZ21hcF91 cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0RBQ19BQ1RMLCAweDEgPDwgUEFfTVVURSwg MHgwIDw8IFBBX01VVEUpOworCW1kZWxheSg1KTsKKwkvL2Rpc2FibGUgZGFjIGRycQorCXJlZ21h cF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0RBQ19GSUZPQywgMHgxIDw8IERBQ19E UlEsIDB4MCA8PCBEQUNfRFJRKTsKKwkvL3BhIG11dGUKKwlyZWdtYXBfdXBkYXRlX2JpdHMocHJp di0+cmVnbWFwLCBTVU5YSV9EQUNfQUNUTCwgMHgxIDw8IFBBX01VVEUsIDB4MCA8PCBQQV9NVVRF KTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9EQUNfQUNUTCwgMHgx IDw8IERBQ0FFTl9MLCAweDAgPDwgREFDQUVOX0wpOworCXJlZ21hcF91cGRhdGVfYml0cyhwcml2 LT5yZWdtYXAsIFNVTlhJX0RBQ19BQ1RMLCAweDEgPDwgREFDQUVOX1IsIDB4MCA8PCBEQUNBRU5f Uik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kZWNfY2FwdHVyZV9zdGFydChzdHJ1 Y3Qgc3VueGlfcHJpdiAqcHJpdikKK3sKKwkvL2VuYWJsZSBhZGMgZHJxCisjaWZkZWYgSkRTCisJ aWYgKGdwaW9fcGFfc2h1dGRvd24pCisJCWdwaW9fd3JpdGVfb25lX3Bpbl92YWx1ZShncGlvX3Bh X3NodXRkb3duLCAxLCAiYXVkaW9fcGFfY3RybCIpOworI2VuZGlmCisJcmVnbWFwX3VwZGF0ZV9i aXRzKHByaXYtPnJlZ21hcCwgU1VOWElfQURDX0ZJRk9DLCAweDEgPDwgQURDX0RSUSwgMHgxIDw8 IEFEQ19EUlEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvZGVjX2NhcHR1cmVfc3Rv cChzdHJ1Y3Qgc3VueGlfcHJpdiAqcHJpdikKK3sKKwkvL2Rpc2FibGUgYWRjIGRycQorCXJlZ21h cF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0FEQ19GSUZPQywgMHgxIDw8IEFEQ19E UlEsIDB4MCA8PCBBRENfRFJRKTsKKwkvL2VuYWJsZSBtaWMxIHBhCisJcmVnbWFwX3VwZGF0ZV9i aXRzKHByaXYtPnJlZ21hcCwgU1VOWElfQURDX0FDVEwsIDB4MSA8PCBNSUMxX0VOLCAweDAgPDwg TUlDMV9FTik7CisJLy9lbmFibGUgVk1JQworCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdt YXAsIFNVTlhJX0FEQ19BQ1RMLCAweDEgPDwgVk1JQ19FTiwgMHgwIDw8IFZNSUNfRU4pOworCWlm IChwcml2LT5pZCA9PSBTVU43SSkgeworCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFw LCBTVU5YSV9EQUNfVFVORSwgMHgzIDw8IDgsIDB4MCA8PCA4KTsKKwl9CisJLy9lbmFibGUgYWRj IGRpZ2l0YWwKKwlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9BRENfRklG T0MsIDB4MSA8PCBBRENfRElHX0VOLCAweDAgPDwgQURDX0RJR19FTik7CisJLy9zZXQgUlggRklG TyBtb2RlCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VOWElfQURDX0ZJRk9D LCAweDEgPDwgUlhfRklGT19NT0RFLCAweDAgPDwgUlhfRklGT19NT0RFKTsKKwkvL2ZsdXNoIFJY IEZJRk8KKwlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9BRENfRklGT0Ms IDB4MSA8PCBBRENfRklGT19GTFVTSCwgMHgwIDw8IEFEQ19GSUZPX0ZMVVNIKTsKKwkvL2VuYWJs ZSBhZGMxIGFuYWxvZworCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0FE Q19BQ1RMLCAweDMgPDwgQURDX0VOLCAweDAgPDwgQURDX0VOKTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBzdW54aV9jb2RlY190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAq c3Vic3RyZWFtLCBpbnQgY21kLAorCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVj dCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlz dHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBz bmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2Nf Y2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkOworCXN0cnVjdCBzdW54aV9wcml2ICpwcml2ID0gc25k X3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCisJcHJpbnRrKCJKRFMgLSBzdW54aV9jb2Rl Y190cmlnZ2VyIGNtZCAlZFxuIiwgY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZf UENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJY2Fz ZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlpZiAoc3Vic3RyZWFtLT5zdHJl YW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQkJY29kZWNfY2FwdHVyZV9zdGFydChw cml2KTsKKwkJZWxzZQorCQkJY29kZWNfcGxheV9zdGFydChwcml2KTsKKwkJYnJlYWs7CQlicmVh azsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dF Ul9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJaWYgKHN1 YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJCWNvZGVjX2Nh cHR1cmVfc3RvcChwcml2KTsKKwkJZWxzZQorCQkJY29kZWNfcGxheV9zdG9wKHByaXYpOworCQli cmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgc3VueGlfY29kZWNfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2Nf cGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRf c29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY29k ZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJk ID0gY29kZWMtPmNhcmQ7CisJc3RydWN0IHN1bnhpX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRf Z2V0X2RydmRhdGEoY2FyZCk7CisKKwlwcmludGsoIkpEUyAtIHN1bnhpX2NvZGVjX3ByZXBhcmVc biIpOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNL KXsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VOWElfREFDX0RQQywgMHgx IDw8IERBQ19FTiwgMHgxIDw8IERBQ19FTik7CisJCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5y ZWdtYXAsIFNVTlhJX0RBQ19GSUZPQywgMHgxIDw8IERBQ19GSUZPX0ZMVVNILCAweDEgPDwgREFD X0ZJRk9fRkxVU0gpOworCQkvL3NldCBUWCBGSUZPIHNlbmQgZHJxIGxldmVsCisJCXJlZ21hcF91 cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0RBQ19GSUZPQywgMHhmIDw8IFRYX1RSSV9M RVZFTCwgMHhmIDw8IFRYX1RSSV9MRVZFTCk7CisJCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnJh dGUgPiAzMjAwMCkgeworCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VOWElf REFDX0ZJRk9DLCAweDEgPDwgMjgsIDB4MCA8PCAyOCk7CisJCX0gZWxzZSB7CisJCQlyZWdtYXBf dXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9EQUNfRklGT0MsIDB4MSA8PCAyOCwgMHgx IDw8IDI4KTsKKwkJfQorCQkvL3NldCBUWCBGSUZPIE1PREUKKwkJcmVnbWFwX3VwZGF0ZV9iaXRz KHByaXYtPnJlZ21hcCwgU1VOWElfREFDX0ZJRk9DLCAweDEgPDwgVFhfRklGT19NT0RFLCAweDEg PDwgVFhfRklGT19NT0RFKTsKKwkJLy9zZW5kIGxhc3Qgc2FtcGxlIHdoZW4gZGFjIGZpZm8gdW5k ZXIgcnVuCisJCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0RBQ19GSUZP QywgMHgxIDw8IExBU1RfU0UsIDB4MCA8PCBMQVNUX1NFKTsKKwkJLy9lbmFibGUgZGFjIGFuYWxv ZworCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9EQUNfQUNUTCwgMHgx IDw8IERBQ0FFTl9MLCAweDEgPDwgREFDQUVOX0wpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJp di0+cmVnbWFwLCBTVU5YSV9EQUNfQUNUTCwgMHgxIDw8IERBQ0FFTl9SLCAweDEgPDwgREFDQUVO X1IpOworCQkvL2VuYWJsZSBkYWMgdG8gcGEKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJl Z21hcCwgU1VOWElfREFDX0FDVEwsIDB4MSA8PCBEQUNQQVMsIDB4MSA8PCBEQUNQQVMpOworCX0g ZWxzZSB7CisJCS8vZW5hYmxlIG1pYzEgcGEKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJl Z21hcCwgU1VOWElfQURDX0FDVEwsIDB4MSA8PCBNSUMxX0VOLCAweDEgPDwgTUlDMV9FTik7CisJ CS8vbWljMSBnYWluIDMyZEIKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VO WElfQURDX0FDVEwsIDB4MyA8PCAyNSwgMHgxIDw8IDI1KTsKKwkJLy9lbmFibGUgVk1JQworCQly ZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9BRENfQUNUTCwgMHgxIDw8IFZN SUNfRU4sIDB4MSA8PCBWTUlDX0VOKTsKKworCQlpZiAocHJpdi0+aWQgPT0gU1VON0kpIHsKKwkJ CS8qIGJvb3N0IHVwIHJlY29yZCBlZmZlY3QgKi8KKwkJCXJlZ21hcF91cGRhdGVfYml0cyhwcml2 LT5yZWdtYXAsIFNVTlhJX0RBQ19UVU5FLCAweDMgPDwgOCwgMHgxIDw8IDgpOworCQl9CisKKwkJ Ly9lbmFibGUgYWRjIGRpZ2l0YWwKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwg U1VOWElfQURDX0ZJRk9DLCAweDEgPDwgQURDX0RJR19FTiwgMHgxIDw8IEFEQ19ESUdfRU4pOwor CQkvL3NldCBSWCBGSUZPIG1vZGUKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwg U1VOWElfQURDX0ZJRk9DLCAweDEgPDwgUlhfRklGT19NT0RFLCAweDEgPDwgUlhfRklGT19NT0RF KTsKKwkJLy9mbHVzaCBSWCBGSUZPCisJCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAs IFNVTlhJX0FEQ19GSUZPQywgMHgxIDw8IEFEQ19GSUZPX0ZMVVNILCAweDEgPDwgQURDX0ZJRk9f RkxVU0gpOworCQkvL3NldCBSWCBGSUZPIHJlYyBkcnEgbGV2ZWwKKwkJcmVnbWFwX3VwZGF0ZV9i aXRzKHByaXYtPnJlZ21hcCwgU1VOWElfQURDX0ZJRk9DLCAweGYgPDwgUlhfVFJJX0xFVkVMLCAw eDcgPDwgUlhfVFJJX0xFVkVMKTsKKwkJLy9lbmFibGUgYWRjMSBhbmFsb2cKKwkJcmVnbWFwX3Vw ZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VOWElfQURDX0FDVEwsIDB4MyA8PCBBRENfRU4sIDB4 MyA8PCBBRENfRU4pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW54aV9jb2Rl Y19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0 IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQorewor CXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0 YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0 cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHNu ZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jYXJkOworCXN0cnVjdCBzdW54aV9wcml2ICpwcml2 ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCXVuc2lnbmVkIGludCByYXRlID0g cGFyYW1zX3JhdGUocGFyYW1zKTsKKworCXByaW50aygiQ0xLIC0gc3VueGlfY29kZWNfaHdfcGFy YW1zIHN1YnN0cmVhbSAlcCBydW50aW1lICVwXG4iLCBzdWJzdHJlYW0sIHJ0ZCk7CisJc3dpdGNo IChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSA0NDEwMDoKKwljYXNlIDIyMDUwOgorCWNh c2UgMTEwMjU6CisJZGVmYXVsdDoKKwkJY2xrX3NldF9yYXRlKHByaXYtPmNsa19wbGwyLCAyMjU3 OTIwMCk7CisJCWNsa19zZXRfcmF0ZShwcml2LT5jbGtfbW9kdWxlLCAyMjU3OTIwMCk7CisJCWJy ZWFrOworCWNhc2UgMTkyMDAwOgorCWNhc2UgOTYwMDA6CisJY2FzZSA0ODAwMDoKKwljYXNlIDMy MDAwOgorCWNhc2UgMjQwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDEyMDAwOgorCWNhc2UgODAw MDoKKwkJY2xrX3NldF9yYXRlKHByaXYtPmNsa19wbGwyLCAyNDU3NjAwMCk7CisJCWNsa19zZXRf cmF0ZShwcml2LT5jbGtfbW9kdWxlLCAyNDU3NjAwMCk7CisJCWJyZWFrOworCX0KKworCXN3aXRj aCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWRlZmF1bHQ6CisJY2FzZSA0NDEwMDoKKwkJcmF0 ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMjIwNTA6CisJCXJhdGUgPSAyOworCQlicmVhazsKKwlj YXNlIDExMDI1OgorCQlyYXRlID0gNDsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDA6CisJCXJhdGUg PSA2OworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQlyYXRlID0gNzsKKwkJYnJlYWs7CisJY2Fz ZSA0ODAwMDoKKwkJcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMzIwMDA6CisJCXJhdGUgPSAx OworCQlicmVhazsKKwljYXNlIDI0MDAwOgorCQlyYXRlID0gMjsKKwkJYnJlYWs7CisJY2FzZSAx NjAwMDoKKwkJcmF0ZSA9IDM7CisJCWJyZWFrOworCWNhc2UgMTIwMDA6CisJCXJhdGUgPSA0Owor CQlicmVhazsKKwljYXNlIDgwMDA6CisJCXJhdGUgPSA1OworCQlicmVhazsKKwl9CisJaWYgKHN1 YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcmVnbWFw X3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VOWElfREFDX0ZJRk9DLCA3IDw8IDI5LCByYXRl IDw8IDI5KTsKKwkJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMgPT0gMSkKKwkJCXJl Z21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0RBQ19GSUZPQywgMSA8PCA2LCAx IDw8IDYpOworCQllbHNlCisJCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5Y SV9EQUNfRklGT0MsIDEgPDwgNiwgMCA8PCA2KTsKKwl9IGVsc2UgIHsKKwkJcmVnbWFwX3VwZGF0 ZV9iaXRzKHByaXYtPnJlZ21hcCwgU1VOWElfQURDX0ZJRk9DLCA3IDw8IDI5LCByYXRlIDw8IDI5 KTsKKwkJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHMgPT0gMSkKKwkJCXJlZ21hcF91 cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIFNVTlhJX0FEQ19GSUZPQywgMSA8PCA3LCAxIDw8IDcp OworCQllbHNlCisJCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBTVU5YSV9BRENf RklGT0MsIDEgPDwgNywgMCA8PCA3KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdW43aV9kYWNfY3Rsc1tdID0geworCS8qU1VOWElf REFDX0FDVEwgPSAweDEwLFBBVk9MKi8KKwlTT0NfU0lOR0xFKCJNYXN0ZXIgUGxheWJhY2sgVm9s dW1lIiwgU1VOWElfREFDX0FDVEwsIDAsIDB4M2YsIDApLCAKKwlTT0NfU0lOR0xFKCJQbGF5YmFj ayBTd2l0Y2giLCBTVU5YSV9EQUNfQUNUTCwgNiwgMSwgMCksIC8v5YWo5bGA6L6T5Ye65byA5YWz CisJU09DX1NJTkdMRSgiRm1MIFN3aXRjaCIsIFNVTlhJX0RBQ19BQ1RMLCAxNywgMSwgMCksIC8v Rm3lt6blvIDlhbMKKwlTT0NfU0lOR0xFKCJGbVIgU3dpdGNoIiwgU1VOWElfREFDX0FDVEwsIDE2 LCAxLCAwKSwgLy9GbeWPs+W8gOWFsworCVNPQ19TSU5HTEUoIkxpbmVMIFN3aXRjaCIsIFNVTlhJ X0RBQ19BQ1RMLCAxOSwgMSwgMCksIC8vTGluZeW3puW8gOWFsworCVNPQ19TSU5HTEUoIkxpbmVS IFN3aXRjaCIsIFNVTlhJX0RBQ19BQ1RMLCAxOCwgMSwgMCksIC8vTGluZeWPs+W8gOWFsworCVNP Q19TSU5HTEUoIkxkYWMgTGVmdCBNaXhlciIsIFNVTlhJX0RBQ19BQ1RMLCAxNSwgMSwgMCksIAor CVNPQ19TSU5HTEUoIlJkYWMgUmlnaHQgTWl4ZXIiLCBTVU5YSV9EQUNfQUNUTCwgMTQsIDEsIDAp LCAKKwlTT0NfU0lOR0xFKCJMZGFjIFJpZ2h0IE1peGVyIiwgU1VOWElfREFDX0FDVEwsIDEzLCAx LCAwKSwgCisJU09DX1NJTkdMRSgiTWljIElucHV0IE11eCIsIFNVTlhJX0RBQ19BQ1RMLCA5LCAx NSwgMCksIC8vZnJvbSBiaXQgOSB0byBiaXQgMTIuTWlj77yI6bqm5YWL6aOO77yJ6L6T5YWl6Z2Z 6Z+zCisJU09DX1NJTkdMRSgiTUlDIG91dHB1dCB2b2x1bWUiLCBTVU5YSV9EQUNfQUNUTCwgMjAs IDcsIDApLAorCS8qCUZNIElucHV0IHRvIG91dHB1dCBtaXhlciBHYWluIENvbnRyb2wKKwkqIAlG cm9tIC00LjVkYiB0byA2ZGIsMS41ZGIvc3RlcCxkZWZhdWx0IGlzIDBkYgorCSoJLTQuNWRiOjB4 MCwtMy4wZGI6MHgxLC0xLjVkYjoweDIsMGRiOjB4MworCSoJMS41ZGI6MHg0LDMuMGRiOjB4NSw0 LjVkYjoweDYsNmRiOjB4NworCSovCisJU09DX1NJTkdMRSgiRm0gb3V0cHV0IFZvbHVtZSIsIFNV TlhJX0RBQ19BQ1RMLCAyMywgNywgMCksCisJLyoJTGluZS1pbiBnYWluIHN0YWdlIHRvIG91dHB1 dCBtaXhlciBHYWluIENvbnRyb2wKKwkqCTA6LTEuNWRiLDE6MGRiCisJKi8KKwlTT0NfU0lOR0xF KCJMaW5lIG91dHB1dCBWb2x1bWUiLCBTVU5YSV9EQUNfQUNUTCwgMjYsIDEsIDApLAorCisJU09D X1NJTkdMRSgiTWFzdGVyIENhcHR1cmUgTXV0ZSIsIFNVTlhJX0FEQ19BQ1RMLCA0LCAxLCAwKSwg CisJU09DX1NJTkdMRSgiUmlnaHQgQ2FwdHVyZSBNdXRlIiwgU1VOWElfQURDX0FDVEwsIDMxLCAx LCAwKSwgCisJU09DX1NJTkdMRSgiTGVmdCBDYXB0dXJlIE11dGUiLCBTVU5YSV9BRENfQUNUTCwg MzAsIDEsIDApLCAKKwlTT0NfU0lOR0xFKCJMaW5laW4gUHJlLUFNUCIsIFNVTlhJX0FEQ19BQ1RM LCAxMywgNywgMCksIAorCVNPQ19TSU5HTEUoIkxJTkVJTiBBUE0gVm9sdW1lIiwgU1VOWElfTUlD X0NSVCwgMTMsIDB4NywgMCksCisJLyogQURDIElucHV0IEdhaW4gQ29udHJvbCwgY2FwdHVyZSB2 b2x1bWUKKwkqIDAwMDotNC41ZGIsMDAxOi0zZGIsMDEwOi0xLjVkYiwwMTE6MGRiLDEwMDoxLjVk YiwxMDE6M2RiLDExMDo0LjVkYiwxMTE6NmRiCisJKi8KKwlTT0NfU0lOR0xFKCJDYXB0dXJlIFZv bHVtZSIsIFNVTlhJX0FEQ19BQ1RMLCAyMCwgNywgMCksCisJLyoKKwkqCU1JQzIgcHJlLWFtcGxp ZmllciBHYWluIENvbnRyb2wKKwkqCTAwOjBkYiwwMTozNWRiLDEwOjM4ZGIsMTE6NDFkYgorCSov CisJU09DX1NJTkdMRSgiTWljTCBWb2x1bWUiLCBTVU5YSV9BRENfQUNUTCwgMjUsIDMsIDApLCAv L21pY+W3pumfs+mHjworCVNPQ19TSU5HTEUoIk1pY1IgVm9sdW1lIiwgU1VOWElfQURDX0FDVEws IDIzLCAzLCAwKSwgLy9taWPlj7Ppn7Pph48KKwlTT0NfU0lOR0xFKCJNaWMyIEJvb3N0IiwgU1VO WElfQURDX0FDVEwsIDI5LCAxLCAwKSwgCisJU09DX1NJTkdMRSgiTWljMSBCb29zdCIsIFNVTlhJ X0FEQ19BQ1RMLCAyOCwgMSwgMCksIAorCVNPQ19TSU5HTEUoIk1pYyBQb3dlciIsIFNVTlhJX0FE Q19BQ1RMLCAyNywgMSwgMCksIAorCVNPQ19TSU5HTEUoIkFEQyBJbnB1dCBNdXgiLCBTVU5YSV9B RENfQUNUTCwgMTcsIDcsIDApLCAvL0FEQ+i+k+WFpemdmemfsworCVNPQ19TSU5HTEUoIk1pYzIg Z2FpbiBWb2x1bWUiLCBTVU5YSV9NSUNfQ1JULCAyNiwgNywgMCksCisJLyoKKwkqCU1JQzEgcHJl LWFtcGxpZmllciBHYWluIENvbnRyb2wKKwkqCTAwOjBkYiwwMTozNWRiLDEwOjM4ZGIsMTE6NDFk YgorCSovCisJU09DX1NJTkdMRSgiTWljMSBnYWluIFZvbHVtZSIsIFNVTlhJX01JQ19DUlQsIDI5 LCAzLCAwKSwgCit9OworCisKK3N0YXRpYyBpbnQgc3VueGlfY29kZWNfZGFpX3Byb2JlKHN0cnVj dCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBzbmRf c29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXN0cnVjdCBzdW54aV9wcml2ICpwcml2ID0gc25k X3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCisJcHJpbnRrKCJDTEsgLSBzdW54aV9jb2Rl Y19kYWlfcHJvYmUgJXBcbiIsIHByaXYpOworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFp LCAmcHJpdi0+cGxheWJhY2tfZG1hX2RhdGEsICZwcml2LT5jYXB0dXJlX2RtYV9kYXRhKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1bnhpX2NvZGVjX3N0YXJ0dXAoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7 CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9k YXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJ c3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qg c25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7CisJc3RydWN0IHN1bnhpX3ByaXYgKnBy aXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisKKwlpbnQgcmV0OworCXByaW50 aygiSkRTIC0gQ0xLIHN1bnhpX2NvZGVjX3N0YXJ0dXAgJXAgJXBcbiIsIGNvZGVjLCBwcml2LT5j bGtfbW9kdWxlKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+Y2xrX21vZHVsZSk7 CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXByaW50aygiSkRTIC0gc3VueGlfY29kZWNf c3RhcnR1cCAtIG9rXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3VueGlfY29k ZWNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0 IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9 IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFp ID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNf ZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7CisJ c3RydWN0IHN1bnhpX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7 CisKKwlwcmludGsoIkpEUyAtIHN1bnhpX2NvZGVjX3NodXRkb3duXG4iKTsKKwljbGtfZGlzYWJs ZV91bnByZXBhcmUocHJpdi0+Y2xrX21vZHVsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg c25kX3NvY19kYWlfb3BzIHN1bnhpX2NvZGVjX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBzdW54 aV9jb2RlY19zdGFydHVwLAorCS5zaHV0ZG93biA9IHN1bnhpX2NvZGVjX3NodXRkb3duLAorCS50 cmlnZ2VyID0gc3VueGlfY29kZWNfdHJpZ2dlciwKKwkuaHdfcGFyYW1zID0gc3VueGlfY29kZWNf aHdfcGFyYW1zLAorCS5wcmVwYXJlID0gc3VueGlfY29kZWNfcHJlcGFyZSwKK307CisKK3N0YXRp YyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHN1bnhpX2NvZGVjX2RhaSA9IHsKKwkucHJvYmUg PSBzdW54aV9jb2RlY19kYWlfcHJvYmUsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWlu ID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJ VF9TMTZfTEUsCisKKwkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01f UkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCQkgU05EUlZfUENNX1JBVEVf MjIwNTB8IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfFwKKwkJ CSBTTkRSVl9QQ01fUkFURV80ODAwMCB8U05EUlZfUENNX1JBVEVfOTYwMDAgfCBTTkRSVl9QQ01f UkFURV8xOTIwMDAgfFwKKwkJCSBTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJLnJhdGVfbWluID0g ODAwMCwKKwkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCX0sCisJLm9wcyA9ICZzdW54aV9jb2RlY19k YWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2 ZXIgc3VueGlfY29kZWNfY29tcG9uZW50ID0geworCS5uYW1lID0gInN1bnhpLWNvZGVjIiwKK307 CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdW54aV9jb2RlY19yZWdtYXBf Y29uZmlnID0geworCS5yZWdfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkudmFsX2Jp dHMgPSAzMiwKKwkubWF4X3JlZ2lzdGVyID0gU1VOWElfTUlDX0NSVCwKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBjb2RlY19kYXBtX3dpZGdldHNbXSA9IHsK KwlTTkRfU09DX0RBUE1fT1VUUFVUKCJNaWMgQmlhcyIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQo IkhQX09VVCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDX0lOIiksCisJU05EX1NPQ19EQVBN X0lOUFVUKCJMSU5FX0lOIiksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsg Y2RjX2RhaSA9IHsKKwkubmFtZSA9ICJjZGMiLAorCS5zdHJlYW1fbmFtZSA9ICJDREMgUENNIiwK KwkuY29kZWNfZGFpX25hbWUgPSAic3VueGktY29kZWMtZGFpIiwKKwkuY3B1X2RhaV9uYW1lID0g IjFjMjJjMDAuY29kZWMiLAorCS5jb2RlY19uYW1lID0gIjFjMjJjMDAuY29kZWMiLAorCS8vLmlu aXQgPSB0ZWdyYV93bTg5MDNfaW5pdCwKKwkvLy5vcHMgPSAmdGVncmFfd204OTAzX29wcywKKwku ZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3Nv Y19jYXJkIHNuZF9zb2Nfc3VueGlfY29kZWMgPSB7CisJLm5hbWUgPSAic3VueGktY29kZWMiLAor CS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9ICZjZGNfZGFpLAorCS5udW1fbGlu a3MgPSAxLAorCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHNu ZF9zb2NfY29kZWNfZHJpdmVyIGR1bW15X2NvZGVjID0geworCS5jb250cm9scyA9IHN1bjdpX2Rh Y19jdGxzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHN1bjdpX2RhY19jdGxzKSwKKwku ZGFwbV93aWRnZXRzID0gY29kZWNfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0g QVJSQVlfU0laRShjb2RlY19kYXBtX3dpZGdldHMpLAorfTsKKworI2RlZmluZSBTVFVCX1JBVEVT CVNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisjZGVmaW5lIFNUVUJfRk9STUFUUwkoU05EUlZf UENNX0ZNVEJJVF9TOCB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfVTggfCBcCisJCQlTTkRSVl9Q Q01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfVTE2X0xFIHwgXAorCQkJ U05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCisJCQlTTkRSVl9QQ01fRk1UQklUX1UyNF9MRSB8 IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9V MzJfTEUgfCBcCisJCQlTTkRSVl9QQ01fRk1UQklUX0lFQzk1OF9TVUJGUkFNRV9MRSkKK3N0YXRp YyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGR1bW15X2RhaSA9IHsKKwkubmFtZSA9ICJzdW54 aS1jb2RlYy1kYWkiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lCT0gIlBsYXliYWNr IiwKKwkJLmNoYW5uZWxzX21pbgk9IDEsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCQkucmF0ZXMJ CT0gU1RVQl9SQVRFUywKKwkJLmZvcm1hdHMJPSBTVFVCX0ZPUk1BVFMsCisJfSwKKwkuY2FwdHVy ZSA9IHsKKwkJLnN0cmVhbV9uYW1lCT0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluCT0gMSwK KwkJLmNoYW5uZWxzX21heAk9IDIsCisJCS5yYXRlcyA9IFNUVUJfUkFURVMsCisJCS5mb3JtYXRz ID0gU1RVQl9GT1JNQVRTLAorCSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZp Y2VfaWQgc3VueGlfY29kZWNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFsbHdp bm5lcixzdW40aS1hMTBhLWNvZGVjIiwgLmRhdGEgPSAodm9pZCAqKVNVTjRBfSwKKwl7IC5jb21w YXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtY29kZWMiLCAuZGF0YSA9ICh2b2lkICopU1VO NEl9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1jb2RlYyIsIC5kYXRh ID0gKHZvaWQgKilTVU41SX0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIw LWNvZGVjIiwgLmRhdGEgPSAodm9pZCAqKVNVTjdJfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0Vf VEFCTEUob2YsIHN1bnhpX2NvZGVjX29mX21hdGNoKTsKKworc3RhdGljIGludCBzdW54aV9jb2Rl Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vf bm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJk ID0gJnNuZF9zb2Nfc3VueGlfY29kZWM7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2Zf aWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgc3VueGlfcHJp diAqcHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJ aW50IHJldDsKKworCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShucCkpCisJCXJldHVybiAt RU5PREVWOworCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uoc3VueGlfY29kZWNfb2ZfbWF0Y2gs IGRldik7CisJaWYgKCFvZl9pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2ID0gZGV2bV9r emFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJp dikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRm b3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YShj YXJkLCBwcml2KTsKKworCXByaXYtPmlkID0gKGludClvZl9pZC0+ZGF0YTsKKworCXJlcyA9IHBs YXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYmFzZSA9IGRl dm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoYmFzZSkp CisJCXJldHVybiBQVFJfRVJSKGJhc2UpOworCisJcHJpdi0+cmVnbWFwID0gZGV2bV9yZWdtYXBf aW5pdF9tbWlvKCZwZGV2LT5kZXYsIGJhc2UsCisJCQkJCSAgICAmc3VueGlfY29kZWNfcmVnbWFw X2NvbmZpZyk7CisJaWYgKElTX0VSUihwcml2LT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihw cml2LT5yZWdtYXApOworCisJcHJpdi0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDAp OworCWlmICghcHJpdi0+aXJxKSB7CisJCWRldl9lcnIoZGV2LCAibm8gaXJxIGZvciBub2RlICVz XG4iLCBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBDbG9jayAq LworCXByaXYtPmNsa19hcGIgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYXBiIik7CisJaWYgKElTX0VS Uihwcml2LT5jbGtfYXBiKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgYXBiIGNs b2NrLlxuIik7CisJCXJldHVybiBQVFJfRVJSKHByaXYtPmNsa19hcGIpOworCX0KKwlwcml2LT5j bGtfcGxsMiA9IGRldm1fY2xrX2dldChkZXYsICJwbGwyIik7CisJaWYgKElTX0VSUihwcml2LT5j bGtfcGxsMikpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBsbDIgY2xvY2suXG4i KTsKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+Y2xrX3BsbDIpOworCX0KKwlwcml2LT5jbGtfbW9k dWxlID0gZGV2bV9jbGtfZ2V0KGRldiwgImNvZGVjIik7CisJaWYgKElTX0VSUihwcml2LT5jbGtf bW9kdWxlKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY29kZWMgY2xvY2suXG4i KTsKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+Y2xrX21vZHVsZSk7CisJfQorCXByaW50aygiQ0xL ID0gY2FyZCAlcCBwcml2ICVwIHByaXYtPmNsa19tb2R1bGUgJXBcbiIsIGNhcmQsIHByaXYsIHBy aXYtPmNsa19tb2R1bGUpOworCisJcmV0ID0gY2xrX3NldF9yYXRlKHByaXYtPmNsa19wbGwyLCAy NDU3NjAwMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInNldCBjb2RlYyBiYXNlIGNs b2NrIHJhdGUgZmFpbGVkIVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChjbGtfcHJlcGFy ZV9lbmFibGUocHJpdi0+Y2xrX3BsbDIpKSB7CisJCWRldl9lcnIoZGV2LCAidHJ5IHRvIGVuYWJs ZSBjbGtfcGxsMiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNsa19w cmVwYXJlX2VuYWJsZShwcml2LT5jbGtfYXBiKSkgeworCQlkZXZfZXJyKGRldiwgInRyeSB0byBl bmFibGUgY2xrX2FwYiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2 LT5wbGF5YmFja19kbWFfZGF0YS5hZGRyID0gcmVzLT5zdGFydCArIFNVTlhJX0RBQ19UWERBVEE7 CisJcHJpdi0+cGxheWJhY2tfZG1hX2RhdGEubWF4YnVyc3QgPSA0OworCXByaXYtPnBsYXliYWNr X2RtYV9kYXRhLmFkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKKworCXBy aXYtPmNhcHR1cmVfZG1hX2RhdGEuYWRkciA9IHJlcy0+c3RhcnQgKyBTVU5YSV9BRENfUlhEQVRB OworCXByaXYtPmNhcHR1cmVfZG1hX2RhdGEubWF4YnVyc3QgPSA0OworCXByaXYtPmNhcHR1cmVf ZG1hX2RhdGEuYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOworCisJcmV0 ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmZHVtbXlfY29kZWMsICZkdW1t eV9kYWksIDEpOworCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRl di0+ZGV2LCAmc3VueGlfY29kZWNfY29tcG9uZW50LCAmc3VueGlfY29kZWNfZGFpLCAxKTsKKwlp ZiAocmV0KQorCQlnb3RvIGVycl9jbGtfZGlzYWJsZTsKKworCXJldCA9IGRldm1fc25kX2RtYWVu Z2luZV9wY21fcmVnaXN0ZXIoJnBkZXYtPmRldiwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZ290 byBlcnJfY2xrX2Rpc2FibGU7CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRp bmcoY2FyZCwgInJvdXRpbmciKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IHNu ZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYt PmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJZ290 byBlcnJfZmluaV91dGlsczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZpbmlfdXRpbHM6Citl cnI6CitlcnJfY2xrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsa19t b2R1bGUpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGtfYXBiKTsKKwljbGtfZGlz YWJsZV91bnByZXBhcmUocHJpdi0+Y2xrX3BsbDIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBpbnQgc3VueGlfY29kZWNfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQoreworCXN0cnVjdCBzdW54aV9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRl dik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrX21vZHVsZSk7CisJY2xrX2Rp c2FibGVfdW5wcmVwYXJlKHByaXYtPmNsa19hcGIpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShw cml2LT5jbGtfcGxsMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgc3VueGlfY29kZWNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0g InN1bnhpLWNvZGVjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJs ZSA9IHN1bnhpX2NvZGVjX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gc3VueGlfY29kZWNfcHJv YmUsCisJLnJlbW92ZSA9IHN1bnhpX2NvZGVjX2Rldl9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRm b3JtX2RyaXZlcihzdW54aV9jb2RlY19kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3Jt OnN1bnhpLWNvZGVjIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInN1bnhpIENPREVDIEFMU0EgY29k ZWMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJzb2Z0d2FyZSIpOworTU9EVUxFX0xJQ0VOU0Uo IkdQTCB2MiIpOworCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpBbHNhLWRldmVsIG1haWxpbmcgbGlzdApBbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcK aHR0cDovL21haWxtYW4uYWxzYS1wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Fsc2EtZGV2 ZWwK